Update learner working-dir path to ~/ai-workflow-course after rename (#73)
Sync course wiki / sync-wiki (push) Has been cancelled

Co-authored-by: claude <claude@jpaul.io>
Co-committed-by: claude <claude@jpaul.io>
This commit was merged in pull request #73.
This commit is contained in:
2026-06-22 18:54:23 -04:00
committed by Claude (agent)
parent 3c1c94fb1a
commit a3ff56e570
20 changed files with 52 additions and 52 deletions
+1 -1
View File
@@ -149,7 +149,7 @@ account, and a working Docker install.
2. Branch off `main`, named for the issue: 2. Branch off `main`, named for the issue:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git switch main && git pull git switch main && git pull
git switch -c 47-due-dates # use your real issue number git switch -c 47-due-dates # use your real issue number
``` ```
+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 1. Open the course's home page — **`https://git.jpaul.io/justin/ai-workflow-course`** — and use its
**Download ZIP** (archive) link. **Download ZIP** (archive) link.
2. Unzip it under your home directory so the course's `modules/` folder lands at 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.) named it something else.)
You now have every module's files locally, including this one's under 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: 1. Make a working directory and copy in the starter app from this module's `lab/starter/` folder:
```bash ```bash
mkdir -p ~/workflow-course/tasks-app mkdir -p ~/ai-workflow-course/tasks-app
cd ~/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: # copy the three files from modules/01-the-copy-paste-problem/lab/starter/ into here:
# tasks.py cli.py README.md # 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: 1. In your project folder, initialize the repo and make the first commit:
```bash ```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 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 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: 1. Confirm you're starting clean, then create a branch for the ADR:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git status # want: "working tree clean" git status # want: "working tree clean"
git switch -c docs/adr-storage # new branch, named for what it's for 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 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**: whole point. The convention is **the current working directory is the project**:
```bash ```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 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"). 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. there, **or** open that folder in your editor and open the assistant's agent panel.
3. **Confirm read access** (step 4). Ask: 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.) (If your tool reads several names, copy it to each, or symlink them.)
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
# replace <YOUR_TOOL_FILE> with the name your tool actually reads: # 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> 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: 1. Confirm you're on `main` and clean, then create an experiment branch and switch to it:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git switch main git switch main
git status # must be clean git status # must be clean
git switch -c experiment/priorities 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. repository, each with its own checked-out branch.** One repo, many checkouts.
```bash ```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 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, 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 still on its own branch. You now have two real directories you can `cd` into, edit, and run
independently: independently:
``` ```
~/workflow-course/ ~/ai-workflow-course/
tasks-app/ ← the "main" worktree, on (say) main tasks-app/ ← the "main" worktree, on (say) main
tasks-app-remaining/ ← a "linked" worktree, on feature/remaining tasks-app-remaining/ ← a "linked" worktree, on feature/remaining
``` ```
@@ -150,9 +150,9 @@ git worktree prune # forget worktrees whose folders were
```bash ```bash
$ git worktree list $ git worktree list
/home/you/workflow-course/tasks-app a1b2c3d [main] /home/you/ai-workflow-course/tasks-app a1b2c3d [main]
/home/you/workflow-course/tasks-app-remaining d4e5f6a [feature/remaining] /home/you/ai-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-wipe 7g8h9i0 [feature/wipe]
``` ```
Three folders, one repo, three branches checked out simultaneously. No stashing, no switching, no 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`: the edit an agent would make.) In your `tasks-app`:
```bash ```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. # Agent A's branch: add `wipe` to the usage line and commit it.
git switch -c feature/wipe 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. 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.* `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.* 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 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 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: writing them.) Give each worktree its own task and list it:
```bash ```bash
cd ~/workflow-course/tasks-app-wipe && python cli.py add "from worktree A" && python cli.py list cd ~/ai-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-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 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: 4. In each worktree, commit the agent's work on its own branch:
```bash ```bash
cd ~/workflow-course/tasks-app-wipe && git add . && git commit -m "Add wipe command" cd ~/ai-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-remaining && git add . && git commit -m "Add remaining command"
``` ```
Two agents, two commits, two branches — neither ever saw the other's files. 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: 5. *Now* the new commands exist — run each in its own worktree to watch it work:
```bash ```bash
cd ~/workflow-course/tasks-app-wipe && python cli.py wipe # agent A's new command cd ~/ai-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-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 `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: Bring both features home to `main` in your original worktree:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git switch main git switch main
git merge feature/wipe git merge feature/wipe
git merge feature/remaining 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: 3. Point your local repo at it and push:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git remote add origin <URL-you-copied> git remote add origin <URL-you-copied>
git push -u origin main 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: 2. Point your repo at the remote and push:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git remote -v # probably empty — no remote yet git remote -v # probably empty — no remote yet
git remote add origin <URL> # paste the URL you copied git remote add origin <URL> # paste the URL you copied
git remote -v # now origin shows, for fetch and push 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: 5. Now clone the remote into a *separate* directory, as if you were a teammate on a fresh machine:
```bash ```bash
cd ~/workflow-course cd ~/ai-workflow-course
git clone <URL> tasks-app-teammate git clone <URL> tasks-app-teammate
cd tasks-app-teammate cd tasks-app-teammate
git log --oneline # the ENTIRE history is here — every commit, not just the latest 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 ```bash
# from your original repo: # 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 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: 7. Edit the README in your *teammate* clone, commit, and push from there:
```bash ```bash
cd ~/workflow-course/tasks-app-teammate cd ~/ai-workflow-course/tasks-app-teammate
# edit README.md, then: # edit README.md, then:
git add . && git commit -m "Note the remote in the README" git add . && git commit -m "Note the remote in the README"
git push git push
@@ -388,7 +388,7 @@ independent* copy, history and all — not a snapshot.
8. Back in your *original* repo, pull it down: 8. Back in your *original* repo, pull it down:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git fetch # download the new commit, but don't merge yet 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 log main..origin/main # SEE exactly what's incoming before you take it
git pull # now merge it into your local main 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.) place of `/path/to/`, the same copy-it-in move from Module 5.)
```bash ```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 . 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) 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 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`: 1. Make sure you're on a clean `main`:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git switch main git switch main
git status # should be clean git status # should be clean
``` ```
+1 -1
View File
@@ -225,7 +225,7 @@ your machine first.
run both checks exactly as CI will: run both checks exactly as CI will:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
pip install ruff pip install ruff
python -m unittest # should report all tests passing python -m unittest # should report all tests passing
ruff check . # should report no issues (or fix what it flags) 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: Dockerfile top to bottom — every line is commented. Then build:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
docker build -t tasks-app . docker build -t tasks-app .
``` ```
@@ -295,7 +295,7 @@ config per environment.
the before-picture: the before-picture:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
python sync.py 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: > global `pip install` is refused on purpose. The clean fix is a virtual environment per project:
> >
> ```bash > ```bash
> cd ~/workflow-course/tasks-app > cd ~/ai-workflow-course/tasks-app
> python3 -m venv .venv # one-time > python3 -m venv .venv # one-time
> source .venv/bin/activate # Windows: .venv\Scripts\activate > source .venv/bin/activate # Windows: .venv\Scripts\activate
> python3 -m pip install "mcp[cli]" > 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 > - **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 > 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 > 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` > `...\.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 > and your tool just says "not connected" with no obvious reason — the exact failure this lab is
> about avoiding. > 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: > Before wiring anything, verify with the *same* interpreter the config will launch:
> >
> ```bash > ```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) ### 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 ```json
"tasks": { "tasks": {
"command": "/ABSOLUTE/PATH/TO/workflow-course/tasks-app/.venv/bin/python", "command": "/ABSOLUTE/PATH/TO/ai-workflow-course/tasks-app/.venv/bin/python",
"args": ["/ABSOLUTE/PATH/TO/workflow-course/tasks-app/tasks_mcp_server.py"] "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.", "_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": { "mcpServers": {
"tasks": { "tasks": {
"command": "/ABSOLUTE/PATH/TO/workflow-course/tasks-app/.venv/bin/python", "command": "/ABSOLUTE/PATH/TO/ai-workflow-course/tasks-app/.venv/bin/python",
"args": ["/ABSOLUTE/PATH/TO/workflow-course/tasks-app/tasks_mcp_server.py"] "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. (e.g. `add-command.md`). If it doesn't, just drop it at the repo root — you'll invoke it by name.
```bash ```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 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: a real-looking task with an injection underneath:
```bash ```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 add "$(cat /path/to/lab/poisoned-task.txt)"
python cli.py list 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: branch:
```bash ```bash
cd ~/workflow-course/tasks-app cd ~/ai-workflow-course/tasks-app
git checkout -b agent/delete-command git checkout -b agent/delete-command
# Simulate an agent that produces a BROKEN change, then run the gate on it: # 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: keeps a fleet legible:
``` ```
~/workflow-course/ ~/ai-workflow-course/
tasks-app/ ← main worktree, on main (the integration point — no agent works here) 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-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 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: 5. In each worktree, commit the agent's work on its own branch and push it:
```bash ```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 ~/ai-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 ~/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 ~/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-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 ### Part C — Fan in through the funnel
@@ -355,7 +355,7 @@ thing you're waiting on.
```bash ```bash
# via the forge UI, or locally: # 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/42-count # clean
git merge feature/43-docs # clean — different files entirely git merge feature/43-docs # clean — different files entirely
``` ```