fix(labs): update learner working-dir path to ~/ai-workflow-course after repo rename

The repo was renamed to ai-workflow-course, so the course's working-directory
convention should match. Replace ~/workflow-course (and /home/you/...,
/ABSOLUTE/PATH/TO/...) with ~/ai-workflow-course throughout modules/ and capstone/
(20 files, incl. the MCP config example). Safe replacement — already-correct
ai-workflow-course references are untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TfzV5QvtPDz8LJS3Pu5VLT
This commit is contained in:
2026-06-22 18:54:08 -04:00
parent 3c1c94fb1a
commit a7907c1ff8
20 changed files with 52 additions and 52 deletions
+3 -3
View File
@@ -151,7 +151,7 @@ beyond a web browser:
1. Open the course's home page — **`https://git.jpaul.io/justin/ai-workflow-course`** — and use its
**Download ZIP** (archive) link.
2. Unzip it under your home directory so the course's `modules/` folder lands at
`~/workflow-course/modules/`. (Rename the unzipped folder to `workflow-course` if your download
`~/ai-workflow-course/modules/`. (Rename the unzipped folder to `ai-workflow-course` if your download
named it something else.)
You now have every module's files locally, including this one's under
@@ -168,8 +168,8 @@ You now have every module's files locally, including this one's under
1. Make a working directory and copy in the starter app from this module's `lab/starter/` folder:
```bash
mkdir -p ~/workflow-course/tasks-app
cd ~/workflow-course/tasks-app
mkdir -p ~/ai-workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
# copy the three files from modules/01-the-copy-paste-problem/lab/starter/ into here:
# tasks.py cli.py README.md
```
@@ -153,7 +153,7 @@ and your AI assistant.
1. In your project folder, initialize the repo and make the first commit:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git init -b main # start the repo with its first branch named "main" (Git 2.28+)
git status # everything shows as "untracked" — Git sees the files but isn't saving them yet
```
@@ -212,7 +212,7 @@ zero.
1. Confirm you're starting clean, then create a branch for the ADR:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git status # want: "working tree clean"
git switch -c docs/adr-storage # new branch, named for what it's for
git branch # the * shows you're on docs/adr-storage now
@@ -131,7 +131,7 @@ a model/provider here, this is where the BYO-model choice from above gets made.
whole point. The convention is **the current working directory is the project**:
```bash
cd ~/workflow-course/tasks-app # the repo from Modules 12
cd ~/ai-workflow-course/tasks-app # the repo from Modules 12
your-agent # launch it from inside the project
```
@@ -279,7 +279,7 @@ copy-paste loop back in Module 1, now done right.
1. Install the tool and authenticate it (steps 12 in "Wiring it up").
2. Point it at the repo (step 3): `cd ~/workflow-course/tasks-app` and launch the agentic CLI from
2. Point it at the repo (step 3): `cd ~/ai-workflow-course/tasks-app` and launch the agentic CLI from
there, **or** open that folder in your editor and open the assistant's agent panel.
3. **Confirm read access** (step 4). Ask:
+1 -1
View File
@@ -186,7 +186,7 @@ editor-integrated AI (Module 4) for the part where the AI obeys the file.
(If your tool reads several names, copy it to each, or symlink them.)
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
# replace <YOUR_TOOL_FILE> with the name your tool actually reads:
cp /path/to/modules/05-commit-the-ai-config/lab/instructions-file-starter.md <YOUR_TOOL_FILE>
```
@@ -263,7 +263,7 @@ deliberately create and resolve a merge conflict — using the AI to help resolv
1. Confirm you're on `main` and clean, then create an experiment branch and switch to it:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git switch main
git status # must be clean
git switch -c experiment/priorities
@@ -94,17 +94,17 @@ The branch was never the problem. The single working directory is. You need two
repository, each with its own checked-out branch.** One repo, many checkouts.
```bash
cd ~/workflow-course/tasks-app # your existing repo from Module 2
cd ~/ai-workflow-course/tasks-app # your existing repo from Module 2
git worktree add ../tasks-app-remaining -b feature/remaining
```
That command creates a brand-new folder, `~/workflow-course/tasks-app-remaining`, containing a full
That command creates a brand-new folder, `~/ai-workflow-course/tasks-app-remaining`, containing a full
checkout of your project on a new branch `feature/remaining`. Your original folder is untouched,
still on its own branch. You now have two real directories you can `cd` into, edit, and run
independently:
```
~/workflow-course/
~/ai-workflow-course/
tasks-app/ ← the "main" worktree, on (say) main
tasks-app-remaining/ ← a "linked" worktree, on feature/remaining
```
@@ -150,9 +150,9 @@ git worktree prune # forget worktrees whose folders were
```bash
$ git worktree list
/home/you/workflow-course/tasks-app a1b2c3d [main]
/home/you/workflow-course/tasks-app-remaining d4e5f6a [feature/remaining]
/home/you/workflow-course/tasks-app-wipe 7g8h9i0 [feature/wipe]
/home/you/ai-workflow-course/tasks-app a1b2c3d [main]
/home/you/ai-workflow-course/tasks-app-remaining d4e5f6a [feature/remaining]
/home/you/ai-workflow-course/tasks-app-wipe 7g8h9i0 [feature/wipe]
```
Three folders, one repo, three branches checked out simultaneously. No stashing, no switching, no
@@ -241,7 +241,7 @@ branch edit the usage line. (The `sed … > tmp && mv` is just a portable, copy-
the edit an agent would make.) In your `tasks-app`:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
# Agent A's branch: add `wipe` to the usage line and commit it.
git switch -c feature/wipe
@@ -301,17 +301,17 @@ git worktree list # should show main + feature/wipe + feature/remaining
This is the part to actually *do simultaneously*, not one then the other.
1. Open `~/workflow-course/tasks-app-wipe` in one editor/AI session. Give it the prompt in
1. Open `~/ai-workflow-course/tasks-app-wipe` in one editor/AI session. Give it the prompt in
`lab/agent-a-prompt.md`*add a `wipe` command that removes all tasks.*
2. Open `~/workflow-course/tasks-app-remaining` in a **second** editor/AI session. Give it the prompt
2. Open `~/ai-workflow-course/tasks-app-remaining` in a **second** editor/AI session. Give it the prompt
in `lab/agent-b-prompt.md`*add a `remaining` command that prints the number of pending tasks.*
3. Let both work at the same time. While they run, prove the isolation from a third terminal — but
use commands that **already exist**. (`wipe` and `remaining` don't yet; the agents are still
writing them.) Give each worktree its own task and list it:
```bash
cd ~/workflow-course/tasks-app-wipe && python cli.py add "from worktree A" && python cli.py list
cd ~/workflow-course/tasks-app-remaining && python cli.py add "from worktree B" && python cli.py list
cd ~/ai-workflow-course/tasks-app-wipe && python cli.py add "from worktree A" && python cli.py list
cd ~/ai-workflow-course/tasks-app-remaining && python cli.py add "from worktree B" && python cli.py list
```
Each `list` shows only its own task — worktree A never sees "from worktree B" and vice versa. Each
@@ -322,8 +322,8 @@ This is the part to actually *do simultaneously*, not one then the other.
4. In each worktree, commit the agent's work on its own branch:
```bash
cd ~/workflow-course/tasks-app-wipe && git add . && git commit -m "Add wipe command"
cd ~/workflow-course/tasks-app-remaining && git add . && git commit -m "Add remaining command"
cd ~/ai-workflow-course/tasks-app-wipe && git add . && git commit -m "Add wipe command"
cd ~/ai-workflow-course/tasks-app-remaining && git add . && git commit -m "Add remaining command"
```
Two agents, two commits, two branches — neither ever saw the other's files.
@@ -331,8 +331,8 @@ This is the part to actually *do simultaneously*, not one then the other.
5. *Now* the new commands exist — run each in its own worktree to watch it work:
```bash
cd ~/workflow-course/tasks-app-wipe && python cli.py wipe # agent A's new command
cd ~/workflow-course/tasks-app-remaining && python cli.py remaining # agent B's new command
cd ~/ai-workflow-course/tasks-app-wipe && python cli.py wipe # agent A's new command
cd ~/ai-workflow-course/tasks-app-remaining && python cli.py remaining # agent B's new command
```
`remaining` counts a single pending task — the one you added to worktree B in step 3 — because B's
@@ -343,7 +343,7 @@ This is the part to actually *do simultaneously*, not one then the other.
Bring both features home to `main` in your original worktree:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git switch main
git merge feature/wipe
git merge feature/remaining
+6 -6
View File
@@ -88,7 +88,7 @@ the shape is the same:
3. Point your local repo at it and push:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git remote add origin <URL-you-copied>
git push -u origin main
```
@@ -313,7 +313,7 @@ WSL, or Git Bash on Windows. Continues the `tasks-app` repo from Module 2.
2. Point your repo at the remote and push:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git remote -v # probably empty — no remote yet
git remote add origin <URL> # paste the URL you copied
git remote -v # now origin shows, for fetch and push
@@ -346,7 +346,7 @@ independent* copy, history and all — not a snapshot.
5. Now clone the remote into a *separate* directory, as if you were a teammate on a fresh machine:
```bash
cd ~/workflow-course
cd ~/ai-workflow-course
git clone <URL> tasks-app-teammate
cd tasks-app-teammate
git log --oneline # the ENTIRE history is here — every commit, not just the latest
@@ -360,7 +360,7 @@ independent* copy, history and all — not a snapshot.
```bash
# from your original repo:
bash ~/workflow-course/tasks-app/verify-backup.sh # (copied from lab/verify-backup.sh)
bash ~/ai-workflow-course/tasks-app/verify-backup.sh # (copied from lab/verify-backup.sh)
```
The script confirms (a) you have a remote configured, (b) your local branch is fully pushed
@@ -379,7 +379,7 @@ independent* copy, history and all — not a snapshot.
7. Edit the README in your *teammate* clone, commit, and push from there:
```bash
cd ~/workflow-course/tasks-app-teammate
cd ~/ai-workflow-course/tasks-app-teammate
# edit README.md, then:
git add . && git commit -m "Note the remote in the README"
git push
@@ -388,7 +388,7 @@ independent* copy, history and all — not a snapshot.
8. Back in your *original* repo, pull it down:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git fetch # download the new commit, but don't merge yet
git log main..origin/main # SEE exactly what's incoming before you take it
git pull # now merge it into your local main
@@ -207,7 +207,7 @@ real change, then review a diff the "AI" produced and catch the trap planted in
place of `/path/to/`, the same copy-it-in move from Module 5.)
```bash
mkdir -p ~/workflow-course/review-lab && cd ~/workflow-course/review-lab
mkdir -p ~/ai-workflow-course/review-lab && cd ~/ai-workflow-course/review-lab
cp /path/to/modules/10-reviewing-code-you-didnt-write/lab/tasks-app/*.py .
printf 'tasks.json\n__pycache__/\n' > .gitignore # keep generated runtime state out of your review diffs (Module 2)
git init -qb main && git add . && git commit -qm "base: tasks-app" # -b main so the git switch main / git diff main.. steps below resolve
@@ -244,7 +244,7 @@ do them once on purpose now.
1. Make sure you're on a clean `main`:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git switch main
git status # should be clean
```
+1 -1
View File
@@ -225,7 +225,7 @@ your machine first.
run both checks exactly as CI will:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
pip install ruff
python -m unittest # should report all tests passing
ruff check . # should report no issues (or fix what it flags)
@@ -188,7 +188,7 @@ containerize and run the app you already have.
Dockerfile top to bottom — every line is commented. Then build:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
docker build -t tasks-app .
```
@@ -295,7 +295,7 @@ config per environment.
the before-picture:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
python sync.py
```
@@ -255,7 +255,7 @@ is the one that lands the concept.
> global `pip install` is refused on purpose. The clean fix is a virtual environment per project:
>
> ```bash
> cd ~/workflow-course/tasks-app
> cd ~/ai-workflow-course/tasks-app
> python3 -m venv .venv # one-time
> source .venv/bin/activate # Windows: .venv\Scripts\activate
> python3 -m pip install "mcp[cli]"
@@ -266,7 +266,7 @@ is the one that lands the concept.
> - **The install interpreter must match the config's launch command.** Your MCP client starts the
> server by running the `"command"` in its config — *not* your activated shell — so activating a
> venv does nothing to help the client find the SDK. You must point `"command"` at the venv's
> **absolute** python path (e.g. `~/workflow-course/tasks-app/.venv/bin/python`, or
> **absolute** python path (e.g. `~/ai-workflow-course/tasks-app/.venv/bin/python`, or
> `...\.venv\Scripts\python.exe` on Windows). If they don't match, the server dies on `import mcp`
> and your tool just says "not connected" with no obvious reason — the exact failure this lab is
> about avoiding.
@@ -274,7 +274,7 @@ is the one that lands the concept.
> Before wiring anything, verify with the *same* interpreter the config will launch:
>
> ```bash
> ~/workflow-course/tasks-app/.venv/bin/python -c "import mcp; print('mcp ok')"
> ~/ai-workflow-course/tasks-app/.venv/bin/python -c "import mcp; print('mcp ok')"
> ```
### Part A — Connect an existing server (optional warm-up, ~10 min)
@@ -348,8 +348,8 @@ That's the entire client/server loop, end to end, with zero code you wrote. Now
```json
"tasks": {
"command": "/ABSOLUTE/PATH/TO/workflow-course/tasks-app/.venv/bin/python",
"args": ["/ABSOLUTE/PATH/TO/workflow-course/tasks-app/tasks_mcp_server.py"]
"command": "/ABSOLUTE/PATH/TO/ai-workflow-course/tasks-app/.venv/bin/python",
"args": ["/ABSOLUTE/PATH/TO/ai-workflow-course/tasks-app/tasks_mcp_server.py"]
}
```
@@ -2,8 +2,8 @@
"_comment": "Common shape of an MCP server entry for a local (stdio) server. Many agentic tools accept this 'mcpServers' map; yours may use a different key or location (check its docs). IMPORTANT: 'command' must be the ABSOLUTE path to the python interpreter that has the MCP SDK installed (e.g. your venv's python) -- a bare 'python' makes the client launch whatever is on its PATH, which usually does NOT have the SDK, and the server then reports 'not connected'. On Windows the venv python is ...\\.venv\\Scripts\\python.exe. Set 'args' to the ABSOLUTE path to tasks_mcp_server.py in your tasks-app.",
"mcpServers": {
"tasks": {
"command": "/ABSOLUTE/PATH/TO/workflow-course/tasks-app/.venv/bin/python",
"args": ["/ABSOLUTE/PATH/TO/workflow-course/tasks-app/tasks_mcp_server.py"]
"command": "/ABSOLUTE/PATH/TO/ai-workflow-course/tasks-app/.venv/bin/python",
"args": ["/ABSOLUTE/PATH/TO/ai-workflow-course/tasks-app/tasks_mcp_server.py"]
}
}
}
@@ -182,7 +182,7 @@ seen, producing all four parts without you listing the steps.
(e.g. `add-command.md`). If it doesn't, just drop it at the repo root — you'll invoke it by name.
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
cp /path/to/modules/21-skills-teaching-the-ai-your-playbook/lab/add-command-skill.md add-command.md
```
@@ -252,7 +252,7 @@ normal question) and the attacker (you plant content the agent reads).
a real-looking task with an injection underneath:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
python cli.py add "$(cat /path/to/lab/poisoned-task.txt)"
python cli.py list
```
+1 -1
View File
@@ -245,7 +245,7 @@ out of the agent's `git add -A`, so the change you review in Part B is clean. Th
branch:
```bash
cd ~/workflow-course/tasks-app
cd ~/ai-workflow-course/tasks-app
git checkout -b agent/delete-command
# Simulate an agent that produces a BROKEN change, then run the gate on it:
@@ -115,7 +115,7 @@ Each agent gets **its own worktree on its own branch tied to its own issue.** Th
keeps a fleet legible:
```
~/workflow-course/
~/ai-workflow-course/
tasks-app/ ← main worktree, on main (the integration point — no agent works here)
tasks-app-42-count/ ← worktree for issue #42, branch feature/42-count, agent A
tasks-app-43-docs/ ← worktree for issue #43, branch feature/43-docs, agent B
@@ -336,9 +336,9 @@ thing you're waiting on.
5. In each worktree, commit the agent's work on its own branch and push it:
```bash
cd ~/workflow-course/tasks-app-42-count && git add . && git commit -m "Add count command (#42)" && git push -u origin feature/42-count
cd ~/workflow-course/tasks-app-43-docs && git add . && git commit -m "Document commands, add changelog (#43)" && git push -u origin feature/43-docs
cd ~/workflow-course/tasks-app-44-clear && git add . && git commit -m "Add clear command (#44)" && git push -u origin feature/44-clear
cd ~/ai-workflow-course/tasks-app-42-count && git add . && git commit -m "Add count command (#42)" && git push -u origin feature/42-count
cd ~/ai-workflow-course/tasks-app-43-docs && git add . && git commit -m "Document commands, add changelog (#43)" && git push -u origin feature/43-docs
cd ~/ai-workflow-course/tasks-app-44-clear && git add . && git commit -m "Add clear command (#44)" && git push -u origin feature/44-clear
```
### Part C — Fan in through the funnel
@@ -355,7 +355,7 @@ thing you're waiting on.
```bash
# via the forge UI, or locally:
cd ~/workflow-course/tasks-app && git switch main
cd ~/ai-workflow-course/tasks-app && git switch main
git merge feature/42-count # clean
git merge feature/43-docs # clean — different files entirely
```