Learning Plan Generator
Create personalized, structured learning plans for any topic and store them in Obsidian for interactive tutoring sessions.
Quick Reference
| File |
Content |
When to Read |
| PEDAGOGY.md |
Learning methodology, exercise taxonomy, spaced repetition |
Designing module structure (Phase 3) |
| ASSESSMENT.md |
Knowledge assessment rubrics, calibration questions |
Running assessment (Phase 1) |
| PLAN-FORMAT.md |
Obsidian templates for plan, modules, progress tracker |
Writing output files (Phase 4) |
Variables
- TOPIC: $ARGUMENTS
- SKILL_DIR: directory containing this SKILL.md
- ENV_FILE: SKILL_DIR/.env
- CWD: the current working directory (where Claude was launched)
- COURSE_ROOT: where this course lives — resolved per the rule below (defaults to CWD)
- LEARNING_PATH: optional central fallback root, loaded from ENV_FILE (see Bootstrap below)
Course location (COURSE_ROOT)
COURSE_ROOT is the folder holding the course's 00-Plan.md, 00-Progress.md and Modules/.
- Default —
COURSE_ROOT = CWD. The course is created in the folder where Claude was launched.
- Non-code subjects → only the markdown tree is written there (run it from your notes vault
and it lands in your notes vault, so you can revisit it anytime).
- Code subjects (a programming language with runnable exercises: TS, JS, Rust, Go, Python,
C, C++, Java, …) → the markdown tree plus a scaffolded language project (config +
Workspace/ + git) right next to it, so the course and its code are self-contained.
Recommended flow: create a dedicated folder, cd into it, then run /learning <language>.
- Fallback —
LEARNING_PATH/Learning - {TOPIC}. Used only when the user prefers central
storage, or when resuming a course that already lives there.
Bootstrap: Load Configuration
COURSE_ROOT defaults to CWD (see "Course location" above) — no configuration is required to
create a course in the current folder. LEARNING_PATH is only the optional central fallback
used for the Phase 0 listing and for users who want a single shared location.
Resolve LEARNING_PATH (non-blocking):
- Read
ENV_FILE (i.e., SKILL_DIR/.env)
- If it contains a non-empty
LEARNING_PATH= value → set LEARNING_PATH (strip quotes).
- If absent/empty → leave
LEARNING_PATH unset. Do not prompt for it here; only ask
(and offer to persist it to ENV_FILE) if the user explicitly chooses central storage over
the current folder in Phase 1.
.env format example:
LEARNING_PATH=~/Documents/obsidian-vault/Projects
Argument Routing
| Argument |
Action |
| (empty / no argument) |
List active learning plans and let the user pick one to resume |
self-update |
Read cookbook/self-update.md and execute |
| any topic |
Run the full learning plan workflow below |
If $ARGUMENTS is empty or not provided: Jump to Phase 0: List & Resume below. Skip all other phases.
If $ARGUMENTS is "self-update", read cookbook/self-update.md and follow its instructions. Stop here.
Instructions
- CRITICAL: Always run the assessment phase first — never skip it
- CRITICAL: All output files must be Obsidian-compatible markdown with YAML frontmatter
- CRITICAL: Present the plan and wait for user confirmation before writing to Obsidian
- NEVER: Generate more than 15 modules (completion drops significantly above 15)
- NEVER: Write full module content — modules contain outlines only (the tutor agent delivers content interactively)
- ALWAYS: Include estimated time per module
- ALWAYS: Use progressive difficulty (Foundation → Development → Mastery)
- ALWAYS: Detect tech vs non-tech automatically (try context7 first)
Workflow
Execute phases top to bottom. Pause for user confirmation at Phase 3.
Phase 0: List & Resume (when no argument provided)
Scan for existing learning plans and let the user choose one to continue.
Local course first: if CWD/00-Plan.md exists, this folder is a course → set
COURSE_ROOT = CWD and start tutoring directly (read SKILL_DIR/TUTOR.md, read
CWD/00-Progress.md to find the next uncompleted module, teach it). Stop here — skip the
central scan below.
Scan for all Learning - * directories in LEARNING_PATH/ (only if LEARNING_PATH is set):
# Primary: find plans with 00-Plan.md
Glob pattern: LEARNING_PATH/Learning - */00-Plan.md
# Fallback: also find directories matching the naming pattern (may lack 00-Plan.md)
Bash: ls -d LEARNING_PATH/Learning\ -\ */
Use the union of both results to catch incomplete plans too.
For each plan found, read its 00-Progress.md to extract:
- Topic name (from frontmatter or folder name)
- Status (Not Started / In Progress / Completed)
- Completion count (e.g., "3/10 modules")
- Last session date
- If
00-Progress.md does not exist, mark as Not Started with 0 modules completed
Filter: Only show plans with Status != "Completed" (unless there are no active plans, then show all)
Present the list via AskUserQuestion:
- Each option shows:
{Topic} — {completion} modules — last session: {date}
- Add a final option: "Créer un nouveau plan" / "Create a new plan"
Based on user choice:
- If they pick an existing plan → start tutoring directly:
- Set
COURSE_ROOT to the selected plan's directory
- Read
SKILL_DIR/TUTOR.md for tutor instructions
- Read the selected plan's
00-Progress.md to find the next uncompleted module
- Read the module outline from
Modules/{NN}-{slug}.md
- Follow the tutor instructions to teach the module interactively
- Stop here — do NOT continue to Phase 1
- If they pick "Create a new plan" → ask for a topic via
AskUserQuestion, set TOPIC, then continue to Phase 1
Phase 1: Assessment (Interactive)
Read ASSESSMENT.md for rubric templates and calibration questions.
- Determine the domain type of TOPIC:
- Try context7
resolve-library-id for TOPIC
- If found → tech domain (language, framework, tool, library)
- If not found → non-tech domain (creative, theoretical, practical)
- Store as DOMAIN_TYPE
1b. Classify course type and confirm location:
- Code course? If DOMAIN_TYPE is tech AND TOPIC is a programming language / runtime whose
exercises produce runnable code (TS, JS, Rust, Go, Python, C, C++, Java, Kotlin, Swift, …)
→
CODE_COURSE = true; otherwise CODE_COURSE = false.
- Confirm
COURSE_ROOT via AskUserQuestion:
- If
CODE_COURSE: "Set up this course as a self-contained project in the current folder
{CWD}? (recommended) — or store it centrally?" If CWD already contains unrelated files,
warn and offer a subfolder (e.g. {CWD}/learn-{slug}).
- If not a code course: default
COURSE_ROOT = CWD silently (markdown lands where Claude was
launched); only ask if the current folder seems wrong.
- If the user picks central storage and
LEARNING_PATH is unset, ask for it now, persist it to
ENV_FILE as LEARNING_PATH=<answer>, and set COURSE_ROOT = LEARNING_PATH/Learning - {TOPIC}.
- For code courses, set
LANGUAGE (the topic) and WORKSPACE (default src). The concrete
toolchain — init command, config files, idiomatic layout, run command, type-check/build
command, .gitignore essentials — is not assumed here; it is gathered in Phase 2 research
and applied in Phase 4. The skill stays language-agnostic.
Ask the user 3-5 calibration questions via AskUserQuestion:
- Q1: Self-assessment on a 0-10 scale (with level descriptions from ASSESSMENT.md)
- Q2-Q3: 2 targeted knowledge-check questions specific to the topic and domain type (from ASSESSMENT.md domain templates)
- Q4: Learning goal — "What do you want to be able to DO with this knowledge?"
- Q5: Time commitment — "How many hours per week can you dedicate?"
Score responses against the rubric in ASSESSMENT.md:
- Normalize to 0-10 scale
- Classify: Novice (0-2), Beginner (3-4), Intermediate (5-6), Advanced (7-8), Expert (9-10)
- Store: LEVEL, GOALS, WEEKLY_HOURS
Categorize the goal:
- "Get a job" → Portfolio projects, interview prep, breadth
- "Build a project" → Depth in relevant areas, skip unnecessary theory
- "Understand deeply" → Theory-heavy, papers, internals
- "Quick start" → Minimal theory, maximum practice
- "Fill gaps" → Targeted modules only, skip known areas
Phase 2: Research (3 Parallel Subagents)
Launch 3 parallel Task subagents to research TOPIC. Each receives: TOPIC, LEVEL, GOALS, DOMAIN_TYPE.
Agent 1 — Official Documentation (read prompts/research-docs.md):
- If tech: use context7 MCP to query documentation (getting-started, core concepts, API reference)
- If non-tech: WebFetch the most authoritative reference site for the topic
- Fallback: WebSearch for "{TOPIC} official documentation"
Agent 2 — Web Resources (read prompts/research-web.md):
- WebSearch for best learning resources, tutorials, courses, videos, books
- Filter by recency (2025-2026 preferred) and authority
- Collect free and paid options
Agent 3 — Learning Paths & Practice (read prompts/research-roadmap.md):
- WebFetch learn-anything.xyz for curated learning paths
- WebSearch for exercises, project ideas, common mistakes, best practices
- Collect practice resources ranked by difficulty
For code courses, also gather project-setup facts (add to Agent 1's brief, or ask context7 /
WebSearch directly): the standard way to initialise a project in this language, its config
file(s), the idiomatic source layout, the command to run a single source file, the command to
type-check or build, the source file extension, and .gitignore essentials. These feed the
Phase 4 scaffolding so no language details are hard-coded in the skill.
Collect all results. Merge and deduplicate resources.
Phase 3: Plan Design (User Confirmation Gate)
Read PEDAGOGY.md for methodology reference.
Based on LEVEL and GOALS, determine:
- Starting point — skip what user already knows
- Module count — 6 to 15, adjusted by topic scope and WEEKLY_HOURS
- Phase breakdown:
- Foundation (~30%): Core concepts, mental models, vocabulary
- Development (~50%): Applied skills, guided practice
- Mastery (~20%): Projects, teaching others (Feynman)
For each module, define:
- Title and SMART objective
- Phase (Foundation / Development / Mastery)
- Estimated hours
- Exercise type (from PEDAGOGY.md taxonomy)
- Key resources (from Phase 2 research)
- Theory points to cover (bullet list)
- Interactive exercise description (what the tutor will do, not the full exercise content)
Present the plan to the user as a formatted table:
## Proposed Learning Plan: {TOPIC}
**Level**: {LEVEL} | **Goal**: {GOALS} | **Pace**: {WEEKLY_HOURS}h/week
**Estimated duration**: {total_hours}h over {weeks} weeks
| # | Phase | Module | Objective | Hours | Exercise Type |
|---|-------|--------|-----------|-------|---------------|
| 1 | Foundation | ... | ... | 2h | Recall Quiz |
| 2 | Foundation | ... | ... | 3h | Concept Map |
| ... | | | | | |
GATE: Ask user for confirmation or adjustments via AskUserQuestion:
- "Does this plan look good? Any modules to add, remove, or reorder?"
- Apply requested changes
Phase 4: Save the Course
Read PLAN-FORMAT.md for file templates.
Create the markdown tree at COURSE_ROOT:
{COURSE_ROOT}/
├── 00-Plan.md
├── 00-Progress.md
├── Resources.md
└── Modules/
├── 01-{slug}.md
├── 02-{slug}.md
└── ...
(For central storage, COURSE_ROOT = LEARNING_PATH/Learning - {TOPIC}.)
Write 00-Plan.md — full plan with metadata (topic, level, goals, hours, module list).
For code courses, also set the frontmatter fields: Code-Course: true, Language,
Workspace, Run-Command, Check-Command.
Write 00-Progress.md — progress tracker with checkboxes for each module and spaced repetition dates.
Write Resources.md — curated links organized by type (docs, tutorials, courses, exercises).
Write module outlines — one file per module with: objective, theory points, exercise
description, resources. For code courses, include the "Exercise Workspace" section
(see PLAN-FORMAT.md) pointing at {WORKSPACE}/{NN}-{slug}/.
Code courses only — scaffold the project in COURSE_ROOT (this runs here, on the skill's
Opus session — the tutor never has to do the heavy setup). Use only the project-setup facts
gathered in Phase 2 for this language — the skill itself stays language-agnostic:
- Initialise the project with the language's standard tooling/init command and write its config
file(s), as discovered in research. Prefer the user's package managers when relevant
(their global preferences may favour one toolchain over another).
- Create
{WORKSPACE}/ (default src) with one folder per module: {WORKSPACE}/{NN}-{slug}/,
each containing a placeholder exercise.{ext} (a stub comment — the tutor fills the real
exercise content when that module's exercise begins). Use the file extension from research.
git init if COURSE_ROOT is not already a git repo; add a .gitignore with the language's
standard ignores (from research).
- Write
README.md: course title, how to resume (cd {COURSE_ROOT} && claude, then
@learning-tutor), and the run/check commands.
- Record the resolved
Language, Workspace, Run-Command, Check-Command in 00-Plan.md
frontmatter so the tutor can compile/run the learner's work without re-researching.
Phase 5: Launch Tutor
Report what was created:
## Learning Plan Created
**Topic**: {TOPIC} | **Level**: {LEVEL}
**Modules**: {N} across 3 phases | **Est. Duration**: {hours}h over {weeks} weeks
**Files**: {COURSE_ROOT}/
| Phase | Modules | Hours |
|-------|---------|-------|
| Foundation | N | Xh |
| Development | N | Xh |
| Mastery | N | Xh |
Ask the user: "Do you want to start learning now?"
- If yes → start tutoring directly in the current conversation (do NOT spawn a subagent):
- Read the tutor instructions from
SKILL_DIR/TUTOR.md
- Read
COURSE_ROOT/00-Progress.md to find the next uncompleted module
- Read the module outline from
COURSE_ROOT/Modules/{NN}-{slug}.md
- Follow the tutor instructions to teach the module interactively
- Use
AskUserQuestion for comprehension checks and exercises
- Update progress files after each module
- If no → tell user: "To resume later, use:
@learning-tutor {TOPIC}"
1---2name: learning3description: Generates a personalized learning plan for a topic the USER wants to study (tech or non-tech): assesses current knowledge, researches resources, builds a structured curriculum with theory and practice modules, stored in Obsidian. Use for explicit study requests: "study plan", "learning path", "curriculum", "teach me <topic>", "plan pour apprendre". Do NOT trigger for one-off how-to questions or for installing agent skills (that is the `learn` skill). Note: the interactive follow-up agent (learning-tutor) is archived — restore it from archive/dot-claude/agents/ before a tutoring session.4---56# Learning Plan Generator78Create personalized, structured learning plans for any topic and store them in Obsidian for interactive tutoring sessions.910## Quick Reference1112| File | Content | When to Read |13|------|---------|--------------|14| PEDAGOGY.md | Learning methodology, exercise taxonomy, spaced repetition | Designing module structure (Phase 3) |15| ASSESSMENT.md | Knowledge assessment rubrics, calibration questions | Running assessment (Phase 1) |16| PLAN-FORMAT.md | Obsidian templates for plan, modules, progress tracker | Writing output files (Phase 4) |1718## Variables1920- **TOPIC**: $ARGUMENTS21- **SKILL_DIR**: directory containing this SKILL.md22- **ENV_FILE**: SKILL_DIR/.env23- **CWD**: the current working directory (where Claude was launched)24- **COURSE_ROOT**: where this course lives — resolved per the rule below (defaults to CWD)25- **LEARNING_PATH**: optional central fallback root, loaded from ENV_FILE (see Bootstrap below)2627### Course location (COURSE_ROOT)2829`COURSE_ROOT` is the folder holding the course's `00-Plan.md`, `00-Progress.md` and `Modules/`.3031- **Default — `COURSE_ROOT = CWD`.** The course is created in the folder where Claude was launched.32 - **Non-code subjects** → only the markdown tree is written there (run it from your notes vault33 and it lands in your notes vault, so you can revisit it anytime).34 - **Code subjects** (a programming language with runnable exercises: TS, JS, Rust, Go, Python,35 C, C++, Java, …) → the markdown tree **plus** a scaffolded language project (config +36 `Workspace/` + git) right next to it, so the course and its code are self-contained.37 Recommended flow: create a dedicated folder, `cd` into it, then run `/learning <language>`.38- **Fallback — `LEARNING_PATH/Learning - {TOPIC}`.** Used only when the user prefers central39 storage, or when resuming a course that already lives there.4041## Bootstrap: Load Configuration4243`COURSE_ROOT` defaults to `CWD` (see "Course location" above) — no configuration is required to44create a course in the current folder. `LEARNING_PATH` is only the **optional central fallback**45used for the Phase 0 listing and for users who want a single shared location.4647Resolve `LEARNING_PATH` (non-blocking):48491. **Read** `ENV_FILE` (i.e., `SKILL_DIR/.env`)502. **If** it contains a non-empty `LEARNING_PATH=` value → set `LEARNING_PATH` (strip quotes).513. **If absent/empty** → leave `LEARNING_PATH` unset. Do **not** prompt for it here; only ask52 (and offer to persist it to `ENV_FILE`) if the user explicitly chooses central storage over53 the current folder in Phase 1.5455**`.env` format example:**56```57LEARNING_PATH=~/Documents/obsidian-vault/Projects58```5960## Argument Routing6162| Argument | Action |63|----------|--------|64| *(empty / no argument)* | List active learning plans and let the user pick one to resume |65| `self-update` | Read cookbook/self-update.md and execute |66| *any topic* | Run the full learning plan workflow below |6768**If $ARGUMENTS is empty or not provided**: Jump to **Phase 0: List & Resume** below. Skip all other phases.6970If $ARGUMENTS is "self-update", read **cookbook/self-update.md** and follow its instructions. Stop here.7172## Instructions7374- **CRITICAL**: Always run the assessment phase first — never skip it75- **CRITICAL**: All output files must be Obsidian-compatible markdown with YAML frontmatter76- **CRITICAL**: Present the plan and wait for user confirmation before writing to Obsidian77- **NEVER**: Generate more than 15 modules (completion drops significantly above 15)78- **NEVER**: Write full module content — modules contain outlines only (the tutor agent delivers content interactively)79- **ALWAYS**: Include estimated time per module80- **ALWAYS**: Use progressive difficulty (Foundation → Development → Mastery)81- **ALWAYS**: Detect tech vs non-tech automatically (try context7 first)8283## Workflow8485> Execute phases top to bottom. Pause for user confirmation at Phase 3.8687---8889### Phase 0: List & Resume (when no argument provided)9091Scan for existing learning plans and let the user choose one to continue.92930. **Local course first**: if `CWD/00-Plan.md` exists, this folder *is* a course → set94 `COURSE_ROOT = CWD` and **start tutoring directly** (read `SKILL_DIR/TUTOR.md`, read95 `CWD/00-Progress.md` to find the next uncompleted module, teach it). **Stop here** — skip the96 central scan below.97981. **Scan** for all `Learning - *` directories in LEARNING_PATH/ (only if `LEARNING_PATH` is set):99 ```100 # Primary: find plans with 00-Plan.md101 Glob pattern: LEARNING_PATH/Learning - */00-Plan.md102 # Fallback: also find directories matching the naming pattern (may lack 00-Plan.md)103 Bash: ls -d LEARNING_PATH/Learning\ -\ */104 ```105 Use the union of both results to catch incomplete plans too.1061072. **For each plan found**, read its `00-Progress.md` to extract:108 - Topic name (from frontmatter or folder name)109 - Status (Not Started / In Progress / Completed)110 - Completion count (e.g., "3/10 modules")111 - Last session date112 - If `00-Progress.md` does not exist, mark as **Not Started** with 0 modules completed1131143. **Filter**: Only show plans with Status != "Completed" (unless there are no active plans, then show all)1151164. **Present** the list via `AskUserQuestion`:117 - Each option shows: `{Topic} — {completion} modules — last session: {date}`118 - Add a final option: "Créer un nouveau plan" / "Create a new plan"1191205. **Based on user choice**:121 - If they pick an existing plan → **start tutoring directly**:122 1. Set `COURSE_ROOT` to the selected plan's directory123 2. Read `SKILL_DIR/TUTOR.md` for tutor instructions124 3. Read the selected plan's `00-Progress.md` to find the next uncompleted module125 4. Read the module outline from `Modules/{NN}-{slug}.md`126 5. Follow the tutor instructions to teach the module interactively127 6. **Stop here** — do NOT continue to Phase 1128 - If they pick "Create a new plan" → ask for a topic via `AskUserQuestion`, set TOPIC, then continue to Phase 1129130---131132### Phase 1: Assessment (Interactive)133134Read `ASSESSMENT.md` for rubric templates and calibration questions.1351361. Determine the **domain type** of TOPIC:137 - Try context7 `resolve-library-id` for TOPIC138 - If found → **tech** domain (language, framework, tool, library)139 - If not found → **non-tech** domain (creative, theoretical, practical)140 - Store as DOMAIN_TYPE1411421b. **Classify course type and confirm location**:143 - **Code course?** If DOMAIN_TYPE is tech AND TOPIC is a programming language / runtime whose144 exercises produce runnable code (TS, JS, Rust, Go, Python, C, C++, Java, Kotlin, Swift, …)145 → `CODE_COURSE = true`; otherwise `CODE_COURSE = false`.146 - **Confirm `COURSE_ROOT`** via `AskUserQuestion`:147 - If `CODE_COURSE`: "Set up this course as a self-contained project in the current folder148 `{CWD}`? (recommended) — or store it centrally?" If `CWD` already contains unrelated files,149 warn and offer a subfolder (e.g. `{CWD}/learn-{slug}`).150 - If not a code course: default `COURSE_ROOT = CWD` silently (markdown lands where Claude was151 launched); only ask if the current folder seems wrong.152 - If the user picks central storage and `LEARNING_PATH` is unset, ask for it now, persist it to153 `ENV_FILE` as `LEARNING_PATH=<answer>`, and set `COURSE_ROOT = LEARNING_PATH/Learning - {TOPIC}`.154 - For code courses, set `LANGUAGE` (the topic) and `WORKSPACE` (default `src`). The concrete155 toolchain — init command, config files, idiomatic layout, run command, type-check/build156 command, `.gitignore` essentials — is **not assumed here**; it is gathered in Phase 2 research157 and applied in Phase 4. The skill stays language-agnostic.1581592. Ask the user 3-5 calibration questions via `AskUserQuestion`:160 - **Q1**: Self-assessment on a 0-10 scale (with level descriptions from ASSESSMENT.md)161 - **Q2-Q3**: 2 targeted knowledge-check questions specific to the topic and domain type (from ASSESSMENT.md domain templates)162 - **Q4**: Learning goal — "What do you want to be able to DO with this knowledge?"163 - **Q5**: Time commitment — "How many hours per week can you dedicate?"1641653. Score responses against the rubric in ASSESSMENT.md:166 - Normalize to 0-10 scale167 - Classify: Novice (0-2), Beginner (3-4), Intermediate (5-6), Advanced (7-8), Expert (9-10)168 - Store: LEVEL, GOALS, WEEKLY_HOURS1691704. Categorize the goal:171 - "Get a job" → Portfolio projects, interview prep, breadth172 - "Build a project" → Depth in relevant areas, skip unnecessary theory173 - "Understand deeply" → Theory-heavy, papers, internals174 - "Quick start" → Minimal theory, maximum practice175 - "Fill gaps" → Targeted modules only, skip known areas176177---178179### Phase 2: Research (3 Parallel Subagents)180181Launch 3 parallel Task subagents to research TOPIC. Each receives: TOPIC, LEVEL, GOALS, DOMAIN_TYPE.182183**Agent 1 — Official Documentation** (read `prompts/research-docs.md`):184- If tech: use context7 MCP to query documentation (getting-started, core concepts, API reference)185- If non-tech: WebFetch the most authoritative reference site for the topic186- Fallback: WebSearch for "{TOPIC} official documentation"187188**Agent 2 — Web Resources** (read `prompts/research-web.md`):189- WebSearch for best learning resources, tutorials, courses, videos, books190- Filter by recency (2025-2026 preferred) and authority191- Collect free and paid options192193**Agent 3 — Learning Paths & Practice** (read `prompts/research-roadmap.md`):194- WebFetch learn-anything.xyz for curated learning paths195- WebSearch for exercises, project ideas, common mistakes, best practices196- Collect practice resources ranked by difficulty197198**For code courses, also gather project-setup facts** (add to Agent 1's brief, or ask context7 /199WebSearch directly): the standard way to initialise a project in this language, its config200file(s), the idiomatic source layout, the command to run a single source file, the command to201type-check or build, the source file extension, and `.gitignore` essentials. These feed the202Phase 4 scaffolding so no language details are hard-coded in the skill.203204Collect all results. Merge and deduplicate resources.205206---207208### Phase 3: Plan Design (User Confirmation Gate)209210Read `PEDAGOGY.md` for methodology reference.2112121. Based on LEVEL and GOALS, determine:213 - **Starting point** — skip what user already knows214 - **Module count** — 6 to 15, adjusted by topic scope and WEEKLY_HOURS215 - **Phase breakdown**:216 - **Foundation** (~30%): Core concepts, mental models, vocabulary217 - **Development** (~50%): Applied skills, guided practice218 - **Mastery** (~20%): Projects, teaching others (Feynman)2192202. For each module, define:221 - Title and SMART objective222 - Phase (Foundation / Development / Mastery)223 - Estimated hours224 - Exercise type (from PEDAGOGY.md taxonomy)225 - Key resources (from Phase 2 research)226 - Theory points to cover (bullet list)227 - Interactive exercise description (what the tutor will do, not the full exercise content)2282293. Present the plan to the user as a formatted table:230231 ```232 ## Proposed Learning Plan: {TOPIC}233234 **Level**: {LEVEL} | **Goal**: {GOALS} | **Pace**: {WEEKLY_HOURS}h/week235 **Estimated duration**: {total_hours}h over {weeks} weeks236237 | # | Phase | Module | Objective | Hours | Exercise Type |238 |---|-------|--------|-----------|-------|---------------|239 | 1 | Foundation | ... | ... | 2h | Recall Quiz |240 | 2 | Foundation | ... | ... | 3h | Concept Map |241 | ... | | | | | |242 ```2432444. **GATE**: Ask user for confirmation or adjustments via `AskUserQuestion`:245 - "Does this plan look good? Any modules to add, remove, or reorder?"246 - Apply requested changes247248---249250### Phase 4: Save the Course251252Read `PLAN-FORMAT.md` for file templates.2532541. Create the markdown tree at `COURSE_ROOT`:255 ```256 {COURSE_ROOT}/257 ├── 00-Plan.md258 ├── 00-Progress.md259 ├── Resources.md260 └── Modules/261 ├── 01-{slug}.md262 ├── 02-{slug}.md263 └── ...264 ```265 (For central storage, `COURSE_ROOT = LEARNING_PATH/Learning - {TOPIC}`.)2662672. Write `00-Plan.md` — full plan with metadata (topic, level, goals, hours, module list).268 **For code courses**, also set the frontmatter fields: `Code-Course: true`, `Language`,269 `Workspace`, `Run-Command`, `Check-Command`.2703. Write `00-Progress.md` — progress tracker with checkboxes for each module and spaced repetition dates.2714. Write `Resources.md` — curated links organized by type (docs, tutorials, courses, exercises).2725. Write module outlines — one file per module with: objective, theory points, exercise273 description, resources. **For code courses**, include the "Exercise Workspace" section274 (see PLAN-FORMAT.md) pointing at `{WORKSPACE}/{NN}-{slug}/`.2752766. **Code courses only — scaffold the project** in `COURSE_ROOT` (this runs here, on the skill's277 Opus session — the tutor never has to do the heavy setup). Use **only** the project-setup facts278 gathered in Phase 2 for this language — the skill itself stays language-agnostic:279 - Initialise the project with the language's standard tooling/init command and write its config280 file(s), as discovered in research. Prefer the user's package managers when relevant281 (their global preferences may favour one toolchain over another).282 - Create `{WORKSPACE}/` (default `src`) with one folder per module: `{WORKSPACE}/{NN}-{slug}/`,283 each containing a placeholder `exercise.{ext}` (a stub comment — the tutor fills the real284 exercise content when that module's exercise begins). Use the file extension from research.285 - `git init` if `COURSE_ROOT` is not already a git repo; add a `.gitignore` with the language's286 standard ignores (from research).287 - Write `README.md`: course title, how to resume (`cd {COURSE_ROOT} && claude`, then288 `@learning-tutor`), and the run/check commands.289 - Record the resolved `Language`, `Workspace`, `Run-Command`, `Check-Command` in `00-Plan.md`290 frontmatter so the tutor can compile/run the learner's work without re-researching.291292---293294### Phase 5: Launch Tutor2952961. Report what was created:297 ```298 ## Learning Plan Created299300 **Topic**: {TOPIC} | **Level**: {LEVEL}301 **Modules**: {N} across 3 phases | **Est. Duration**: {hours}h over {weeks} weeks302 **Files**: {COURSE_ROOT}/303304 | Phase | Modules | Hours |305 |-------|---------|-------|306 | Foundation | N | Xh |307 | Development | N | Xh |308 | Mastery | N | Xh |309 ```3103112. Ask the user: "Do you want to start learning now?"312 - If yes → **start tutoring directly in the current conversation** (do NOT spawn a subagent):313 1. Read the tutor instructions from `SKILL_DIR/TUTOR.md`314 2. Read `COURSE_ROOT/00-Progress.md` to find the next uncompleted module315 3. Read the module outline from `COURSE_ROOT/Modules/{NN}-{slug}.md`316 4. Follow the tutor instructions to teach the module interactively317 5. Use `AskUserQuestion` for comprehension checks and exercises318 6. Update progress files after each module319 - If no → tell user: "To resume later, use: `@learning-tutor {TOPIC}`"