Skip to content

Commit ab4f129

Browse files
matthewwilsonclaude
andcommitted
Remove Lesson 12 (Hooks in Action) from GitHub Copilot tutorial
This concept-only lesson explained how the tutorial's own hooks work. Removing it simplifies the curriculum. All subsequent lessons are renumbered (13→12 through 24→23), and every hardcoded lesson number reference across agents, validators, hooks, docs, and cross-references is updated to match. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7ea7bfa commit ab4f129

31 files changed

Lines changed: 165 additions & 209 deletions

.github/agents/core.agent.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ Switch back to the core track. Do the following steps in order:
77

88
1. Read the file `tutorial/state.json`
99
2. Set the `track` field to `"core"`
10-
3. If `currentLesson` is greater than 19, set `currentLesson` to 19
10+
3. If `currentLesson` is greater than 18, set `currentLesson` to 18
1111
4. Write the updated JSON back to `tutorial/state.json`
12-
5. Determine the lesson filename: look in `tutorial/lessons/` for the file whose name starts with the zero-padded lesson number (e.g., lesson 19 becomes "19-")
12+
5. Determine the lesson filename: look in `tutorial/lessons/` for the file whose name starts with the zero-padded lesson number (e.g., lesson 18 becomes "18-")
1313
6. Read that lesson file
1414
7. Present its contents to the user. Mention that they've switched back to the core track.

.github/agents/next.agent.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Advance the tutorial to the next lesson. Do the following steps in order:
99
2. Get the current lesson number from the `currentLesson` field
1010
3. Add the current lesson number to the `completedLessons` array if it is not already there
1111
4. Increment `currentLesson` by 1
12-
5. Read the `track` field from state (default `"core"` if missing). If `track` is `"qa"`, cap `currentLesson` at 24. If `track` is `"core"`, cap at 19. (Set it back to the cap value if it exceeds it.)
12+
5. Read the `track` field from state (default `"core"` if missing). If `track` is `"qa"`, cap `currentLesson` at 23. If `track` is `"core"`, cap at 18. (Set it back to the cap value if it exceeds it.)
1313
6. Write the updated JSON back to `tutorial/state.json`
1414
7. Determine the next lesson filename: look in `tutorial/lessons/` for the file whose name starts with the zero-padded lesson number (e.g., lesson 3 becomes "03-", lesson 7 becomes "07-")
1515
8. Read that lesson file

.github/agents/previous.agent.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Go back to the previous lesson. Do the following steps in order:
99
2. Get the current lesson number from the `currentLesson` field
1010
3. Remove the current lesson number from the `completedLessons` array if it is present
1111
4. Decrement `currentLesson` by 1
12-
5. Read the `track` field from state (default `"core"` if missing). If `track` is `"qa"`, cap `currentLesson` at a minimum of 20. If `track` is `"core"`, cap at a minimum of 0. (Set it back to the cap value if it goes below it.)
12+
5. Read the `track` field from state (default `"core"` if missing). If `track` is `"qa"`, cap `currentLesson` at a minimum of 19. If `track` is `"core"`, cap at a minimum of 0. (Set it back to the cap value if it goes below it.)
1313
6. Write the updated JSON back to `tutorial/state.json`
1414
7. Determine the previous lesson filename: look in `tutorial/lessons/` for the file whose name starts with the zero-padded lesson number (e.g., lesson 3 becomes "03-", lesson 7 becomes "07-")
1515
8. Read that lesson file

.github/agents/progress.agent.md

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,25 @@ Show the user their tutorial progress. Do the following:
1919
- 9: Custom Agents
2020
- 10: Agent Skills
2121
- 11: Agent Delegation & Collaboration
22-
- 12: Hooks in Action
23-
- 14: Session Management
24-
- 16: Model Selection & Configuration
25-
- 17: CLI Tools & MCP Servers
26-
- 18: Working with Images
27-
- 19: Graduation + Bonus
22+
- 13: Session Management
23+
- 15: Model Selection & Configuration
24+
- 16: CLI Tools & MCP Servers
25+
- 17: Working with Images
26+
- 18: Graduation + Bonus
2827

2928
**Developer:**
3029
- 5: Code Modification
3130
- 6: Bug Investigation
3231
- 8: Writing & Running Tests
33-
- 13: Git Workflow — Commits & PRs
34-
- 15: Programmatic Mode & Automation
32+
- 12: Git Workflow — Commits & PRs
33+
- 14: Programmatic Mode & Automation
3534

3635
4. If `track` is `"qa"`, also show a **QA Track:** section:
37-
- 20: Test Planning from Requirements
38-
- 21: Test Case Design & Coverage Analysis
39-
- 22: Automated Test Generation
40-
- 23: E2E Testing with Playwright
41-
- 24: QA Track Graduation
36+
- 19: Test Planning from Requirements
37+
- 20: Test Case Design & Coverage Analysis
38+
- 21: Automated Test Generation
39+
- 22: E2E Testing with Playwright
40+
- 23: QA Track Graduation
4241

4342
If `track` is NOT `"qa"`, show a note instead: "Type /agent qa to start the QA track"
4443

@@ -47,4 +46,4 @@ Show the user their tutorial progress. Do the following:
4746
- `[>]` if it is the `currentLesson` (the one they're on right now)
4847
- `[~]` if it is in the `skippedLessons` array
4948
- `[ ]` if it hasn't been reached yet
50-
6. Show a summary line. If on the core track: "Progress: N of 19 lessons completed". If on the QA track: "Progress: N of 24 lessons completed".
49+
6. Show a summary line. If on the core track: "Progress: N of 18 lessons completed". If on the QA track: "Progress: N of 23 lessons completed".

.github/agents/qa.agent.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ description: "Switch to the QA track"
33
tools: ["read", "edit"]
44
---
55

6-
Switch to the QA track (lessons 20-24). Do the following steps in order:
6+
Switch to the QA track (lessons 19-23). Do the following steps in order:
77

88
1. Read the file `tutorial/state.json`
99
2. Set the `track` field to `"qa"`
10-
3. If `currentLesson` is less than 20, set `currentLesson` to 20 (otherwise keep it as-is)
10+
3. If `currentLesson` is less than 19, set `currentLesson` to 19 (otherwise keep it as-is)
1111
4. Write the updated JSON back to `tutorial/state.json`
12-
5. Determine the lesson filename: look in `tutorial/lessons/` for the file whose name starts with the zero-padded lesson number (e.g., lesson 20 becomes "20-")
12+
5. Determine the lesson filename: look in `tutorial/lessons/` for the file whose name starts with the zero-padded lesson number (e.g., lesson 19 becomes "19-")
1313
6. Read that lesson file
1414
7. Present its contents to the user. Mention that they've switched to the QA track. If the lesson has an Exercise section, make it visually distinct so the user knows exactly what to do next.

.github/agents/skip.agent.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Skip the current exercise and move to the next lesson. Do the following steps:
77

88
1. Read `tutorial/state.json`
99
2. Add the current lesson number to the `skippedLessons` array if not already there
10-
3. Increment `currentLesson` by 1. Read the `track` field (default `"core"` if missing). Cap at 24 if `track` is `"qa"`, or at 19 if `track` is `"core"`.
10+
3. Increment `currentLesson` by 1. Read the `track` field (default `"core"` if missing). Cap at 23 if `track` is `"qa"`, or at 18 if `track` is `"core"`.
1111
4. Write the updated state back to `tutorial/state.json`
1212
5. Read the next lesson file from `tutorial/lessons/` (zero-padded prefix)
1313
6. Present it to the user. Briefly acknowledge the skip in a neutral way — something like "Moving on!" — without making the user feel bad. Everyone learns at their own pace.

.github/copilot-instructions.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ You are running as an interactive tutorial guide for GitHub Copilot CLI. Your jo
1919
| `hint` | Get a hint for the current exercise |
2020
| `skip` | Skip the current exercise |
2121
| `progress` | See tutorial progress |
22-
| `qa` | Switch to the QA track (lessons 20-24) |
22+
| `qa` | Switch to the QA track (lessons 19-23) |
2323
| `core` | Switch back to the core track |
2424

2525
When suggesting navigation to the user, tell them to type `/agent` and select from the list, or say "next" / "next lesson" / "give me a hint" etc. — you should infer which agent to use from natural language.
@@ -81,26 +81,26 @@ The tutorial frequently edits `tutorial/state.json` for navigation. If the user
8181
| "QA track", "switch to QA" | `.github/agents/qa.agent.md` |
8282
| "core track", "switch to core" | `.github/agents/core.agent.md` |
8383

84-
## QA Track (Lessons 20-24)
84+
## QA Track (Lessons 19-23)
8585

8686
The tutorial includes an optional QA track for QA engineers. It is controlled by the `track` field in `tutorial/state.json`:
8787

88-
- `"core"` (default) — Lessons 0-19, the standard developer-focused track
89-
- `"qa"` — Lessons 20-24, focused on QA workflows
88+
- `"core"` (default) — Lessons 0-18, the standard developer-focused track
89+
- `"qa"` — Lessons 19-23, focused on QA workflows
9090

9191
### QA Track Navigation
9292

9393
| Say this | Or type this | What it does |
9494
|----------|-------------|-------------|
95-
| "switch to QA track" | `/agent qa` | Switch to the QA track (starts at lesson 20) |
95+
| "switch to QA track" | `/agent qa` | Switch to the QA track (starts at lesson 19) |
9696
| "switch to core track" | `/agent core` | Switch back to the core track |
9797

9898
### QA Lessons
9999

100-
- **20: Test Planning from Requirements** — Analyse a feature request and create a structured test plan
101-
- **21: Test Case Design & Coverage** — Identify coverage gaps and design test cases using QA techniques
102-
- **22: Automated Test Generation** — Turn test cases into running Vitest tests
103-
- **23: E2E Testing with Playwright** — Write Playwright tests for the web UI
104-
- **24: QA Track Graduation** — Recap and bonus challenges
100+
- **19: Test Planning from Requirements** — Analyse a feature request and create a structured test plan
101+
- **20: Test Case Design & Coverage** — Identify coverage gaps and design test cases using QA techniques
102+
- **21: Automated Test Generation** — Turn test cases into running Vitest tests
103+
- **22: E2E Testing with Playwright** — Write Playwright tests for the web UI
104+
- **23: QA Track Graduation** — Recap and bonus challenges
105105

106106
The `next`, `skip`, and `progress` agents are track-aware — they respect the active track's lesson range. The hooks work with any lesson number automatically.

.github/hooks/validate-exercise.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ if [ -f "$VALIDATOR" ]; then
3838
fi
3939

4040
# Also run any bonus validators when on the graduation lesson (18)
41-
if [ "$CURRENT" -eq 19 ]; then
41+
if [ "$CURRENT" -eq 18 ]; then
4242
for bonus_validator in "$VALIDATORS_DIR"/validate-bonus-*.sh; do
4343
[ -f "$bonus_validator" ] || continue
4444
BONUS_RESULT=$(bash "$bonus_validator" 2>&1) || true

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ You can navigate the tutorial using natural language or the `/agent` command:
3131
| "hint" or "give me a hint" | `/agent hint` | Get a hint for the current exercise |
3232
| "skip" or "skip this" | `/agent skip` | Skip the current exercise |
3333
| "progress" or "show progress" | `/agent progress` | See your tutorial progress |
34-
| "switch to QA track" | `/agent qa` | Switch to the QA track (lessons 20-24) |
34+
| "switch to QA track" | `/agent qa` | Switch to the QA track (lessons 19-23) |
3535
| "switch to core track" | `/agent core` | Switch back to the core track |
3636

3737
## QA Track
3838

39-
The tutorial includes an optional QA track (lessons 20-24) for QA engineers. It covers test planning, test case design, automated test generation, and E2E testing with Playwright.
39+
The tutorial includes an optional QA track (lessons 19-23) for QA engineers. It covers test planning, test case design, automated test generation, and E2E testing with Playwright.
4040

4141
To start the QA track, say "switch to QA track" or type `/agent qa`.
4242

@@ -52,4 +52,4 @@ The tutorial is built using three Copilot CLI features:
5252
- **Custom Agents** (`.github/agents/*.agent.md`) — Navigation between lessons
5353
- **Hooks** (`.github/hooks/`) — State persistence, context injection, and exercise validation
5454

55-
Lesson 12 of the tutorial walks through exactly how these pieces compose together.
55+
The tutorial itself is built using these three features working together.

tutorial/lessons/00-welcome.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@ You can also use `/agent` and select from the list of tutorial agents.
2727
9. **Custom Agents** — Create your own custom agents
2828
10. **Agent Skills** — Create reusable skill packages for on-demand capabilities
2929
11. **Agent Delegation** — Push work to coding agents and built-in specialists
30-
12. **Hooks in Action** — The automation that powers this tutorial itself
31-
13. **Git Workflow** — Commits, PRs, and code review with Copilot
32-
14. **Session Management** — Resume, compress, and organise your work
33-
15. **Programmatic Mode** — Run Copilot from scripts and CI/CD
34-
16. **Model Selection** — Choose the right model for each task
35-
17. **CLI Tools & MCP Servers** — Use any CLI tool and structured tool access
36-
18. **Working with Images** — Debug from screenshots and mockups
37-
19. **Graduation** — Bonus challenges and where to go next
30+
12. **Git Workflow** — Commits, PRs, and code review with Copilot
31+
13. **Session Management** — Resume, compress, and organise your work
32+
14. **Programmatic Mode** — Run Copilot from scripts and CI/CD
33+
15. **Model Selection** — Choose the right model for each task
34+
16. **CLI Tools & MCP Servers** — Use any CLI tool and structured tool access
35+
17. **Working with Images** — Debug from screenshots and mockups
36+
18. **Graduation** — Bonus challenges and where to go next
3837

3938
## Coming from IDE Copilots?
4039

@@ -45,7 +44,7 @@ If you've used GitHub Copilot in VS Code, JetBrains, or other editors, here's ho
4544
- **Runs commands** — Copilot executes tests, builds, type-checkers, and git commands, then reads the output and reacts. It's not just suggesting code — it's verifying it works.
4645
- **Persistent memory**`.github/copilot-instructions.md` files store your conventions, architecture decisions, and rules. Copilot reads them every session — no re-explaining.
4746
- **Plans before acting** — Plan mode (Shift+Tab) lets Copilot explore and design an approach before writing a single line of code. You review and approve the plan first.
48-
- **Works with images** — drag-and-drop screenshots, mockups, or error dialogs directly into the conversation (details in Lesson 18).
47+
- **Works with images** — drag-and-drop screenshots, mockups, or error dialogs directly into the conversation (details in Lesson 17).
4948
- **Multiple models** — Choose between Claude Sonnet 4.5, Claude Sonnet 4, and GPT-5 with the `/model` command mid-session.
5049

5150
None of this replaces what you already know — it builds on it. If you've been using Copilot for inline completions, chat, or code explanations, Copilot CLI handles all of those and more. This tutorial shows you what's different.

0 commit comments

Comments
 (0)