You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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>
Copy file name to clipboardExpand all lines: .github/agents/core.agent.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,8 +7,8 @@ Switch back to the core track. Do the following steps in order:
7
7
8
8
1. Read the file `tutorial/state.json`
9
9
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
11
11
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-")
13
13
6. Read that lesson file
14
14
7. Present its contents to the user. Mention that they've switched back to the core track.
Copy file name to clipboardExpand all lines: .github/agents/next.agent.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,7 +9,7 @@ Advance the tutorial to the next lesson. Do the following steps in order:
9
9
2. Get the current lesson number from the `currentLesson` field
10
10
3. Add the current lesson number to the `completedLessons` array if it is not already there
11
11
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.)
13
13
6. Write the updated JSON back to `tutorial/state.json`
14
14
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-")
Copy file name to clipboardExpand all lines: .github/agents/previous.agent.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,7 +9,7 @@ Go back to the previous lesson. Do the following steps in order:
9
9
2. Get the current lesson number from the `currentLesson` field
10
10
3. Remove the current lesson number from the `completedLessons` array if it is present
11
11
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.)
13
13
6. Write the updated JSON back to `tutorial/state.json`
14
14
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-")
Copy file name to clipboardExpand all lines: .github/agents/qa.agent.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,12 +3,12 @@ description: "Switch to the QA track"
3
3
tools: ["read", "edit"]
4
4
---
5
5
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:
7
7
8
8
1. Read the file `tutorial/state.json`
9
9
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)
11
11
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-")
13
13
6. Read that lesson file
14
14
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.
Copy file name to clipboardExpand all lines: .github/agents/skip.agent.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@ Skip the current exercise and move to the next lesson. Do the following steps:
7
7
8
8
1. Read `tutorial/state.json`
9
9
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"`.
11
11
4. Write the updated state back to `tutorial/state.json`
12
12
5. Read the next lesson file from `tutorial/lessons/` (zero-padded prefix)
13
13
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.
Copy file name to clipboardExpand all lines: .github/copilot-instructions.md
+10-10Lines changed: 10 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -19,7 +19,7 @@ You are running as an interactive tutorial guide for GitHub Copilot CLI. Your jo
19
19
|`hint`| Get a hint for the current exercise |
20
20
|`skip`| Skip the current exercise |
21
21
|`progress`| See tutorial progress |
22
-
|`qa`| Switch to the QA track (lessons 20-24) |
22
+
|`qa`| Switch to the QA track (lessons 19-23) |
23
23
|`core`| Switch back to the core track |
24
24
25
25
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
81
81
| "QA track", "switch to QA" |`.github/agents/qa.agent.md`|
82
82
| "core track", "switch to core" |`.github/agents/core.agent.md`|
83
83
84
-
## QA Track (Lessons 20-24)
84
+
## QA Track (Lessons 19-23)
85
85
86
86
The tutorial includes an optional QA track for QA engineers. It is controlled by the `track` field in `tutorial/state.json`:
87
87
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
90
90
91
91
### QA Track Navigation
92
92
93
93
| Say this | Or type this | What it does |
94
94
|----------|-------------|-------------|
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) |
96
96
| "switch to core track" |`/agent core`| Switch back to the core track |
97
97
98
98
### QA Lessons
99
99
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
105
105
106
106
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.
Copy file name to clipboardExpand all lines: README.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,12 +31,12 @@ You can navigate the tutorial using natural language or the `/agent` command:
31
31
| "hint" or "give me a hint" |`/agent hint`| Get a hint for the current exercise |
32
32
| "skip" or "skip this" |`/agent skip`| Skip the current exercise |
33
33
| "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) |
35
35
| "switch to core track" |`/agent core`| Switch back to the core track |
36
36
37
37
## QA Track
38
38
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.
40
40
41
41
To start the QA track, say "switch to QA track" or type `/agent qa`.
42
42
@@ -52,4 +52,4 @@ The tutorial is built using three Copilot CLI features:
52
52
-**Custom Agents** (`.github/agents/*.agent.md`) — Navigation between lessons
53
53
-**Hooks** (`.github/hooks/`) — State persistence, context injection, and exercise validation
54
54
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.
Copy file name to clipboardExpand all lines: tutorial/lessons/00-welcome.md
+8-9Lines changed: 8 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,14 +27,13 @@ You can also use `/agent` and select from the list of tutorial agents.
27
27
9.**Custom Agents** — Create your own custom agents
28
28
10.**Agent Skills** — Create reusable skill packages for on-demand capabilities
29
29
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
38
37
39
38
## Coming from IDE Copilots?
40
39
@@ -45,7 +44,7 @@ If you've used GitHub Copilot in VS Code, JetBrains, or other editors, here's ho
45
44
-**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.
46
45
-**Persistent memory** — `.github/copilot-instructions.md` files store your conventions, architecture decisions, and rules. Copilot reads them every session — no re-explaining.
47
46
-**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).
49
48
-**Multiple models** — Choose between Claude Sonnet 4.5, Claude Sonnet 4, and GPT-5 with the `/model` command mid-session.
50
49
51
50
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