ronin-skillforce 0.1.0 → 0.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/LICENSE +202 -21
- package/NOTICE +19 -0
- package/README.md +38 -5
- package/bin/cli.js +15 -3
- package/bin/commands/archive.js +192 -0
- package/bin/commands/capstone-status.js +82 -0
- package/bin/commands/create.js +69 -12
- package/bin/commands/import.js +5 -5
- package/bin/commands/status.js +1 -1
- package/bin/commands/studio-autostart.js +414 -0
- package/bin/commands/studio-state.js +159 -0
- package/bin/commands/studio.js +351 -17
- package/bin/commands/trail.js +153 -3
- package/bin/commands/web.js +8 -10
- package/bin/course-reader.js +6 -15
- package/bin/platforms/_shared.js +154 -28
- package/bin/platforms/claude.js +23 -42
- package/bin/platforms/cursor.js +23 -20
- package/bin/platforms/gemini.js +18 -19
- package/bin/platforms/opencode.js +47 -28
- package/package.json +5 -4
- package/plugin.json +1 -1
- package/shared/SKILL.md +102 -72
- package/shared/agents/coach.md +19 -16
- package/shared/agents/navigator.md +27 -34
- package/shared/agents/professor.md +16 -34
- package/shared/agents/researcher.md +1 -1
- package/shared/agents/spotter.md +3 -4
- package/shared/commands/professor/archive.md +65 -72
- package/shared/commands/professor/capstone-review.md +5 -5
- package/shared/commands/professor/capstone.md +3 -3
- package/shared/commands/professor/done.md +59 -31
- package/shared/commands/professor/hint.md +14 -2
- package/shared/commands/professor/navigator.md +27 -1
- package/shared/commands/professor/new-topic.md +3 -3
- package/shared/commands/professor/next.md +9 -5
- package/shared/commands/professor/note.md +6 -6
- package/shared/commands/professor/progress.md +1 -1
- package/shared/commands/professor/publish.md +5 -5
- package/shared/commands/professor/quiz.md +2 -2
- package/shared/commands/professor/recall.md +1 -1
- package/shared/commands/professor/review.md +14 -0
- package/shared/commands/professor/skill-export.md +3 -4
- package/shared/commands/professor/spotter.md +21 -4
- package/shared/commands/professor/stuck.md +24 -0
- package/shared/commands/professor/switch.md +1 -1
- package/shared/commands/professor/syllabus.md +1 -1
- package/shared/commands/professor/template-export.md +2 -2
- package/shared/commands/professor/worktrees.md +3 -7
- package/shared/hooks/pre-compact.js +4 -15
- package/studio/dist/assets/BetaReportPanel-BJ9HIAnz.js +1 -0
- package/studio/dist/assets/{Capstone-Cv9kH6LY.js → Capstone-CoUU-jP7.js} +1 -1
- package/studio/dist/assets/{CodeWorkspace-BwCEINWo.js → CodeWorkspace-BNrL4qvR.js} +2 -2
- package/studio/dist/assets/{Course-BJ_hafUP.js → Course-BMGTXus_.js} +1 -1
- package/studio/dist/assets/{Editor-CV0mNhlz.js → Editor-Cw9j3cnp.js} +1 -1
- package/studio/dist/assets/{Home-C1ry89ak.js → Home-D2woITq5.js} +1 -1
- package/studio/dist/assets/{Lesson-2e9TD9yL.js → Lesson-CYQhrDCZ.js} +2 -2
- package/studio/dist/assets/{NewCourse-BZeOg2xn.js → NewCourse-CMpwVRQb.js} +1 -1
- package/studio/dist/assets/{Progress-CRc_xEWC.js → Progress-2rS19Fur.js} +1 -1
- package/studio/dist/assets/{Review-6QEbHEfk.js → Review-SlqK-hjp.js} +1 -1
- package/studio/dist/assets/{Settings-NFnqVQui.js → Settings-t42u7n9H.js} +1 -1
- package/studio/dist/assets/{TutorPanel-DXQ6Z3BY.js → TutorPanel-DQDWIU7f.js} +3 -3
- package/studio/dist/assets/{abnfDiagram-WEYOIA3C-qeSjKlGM.js → abnfDiagram-WEYOIA3C-jTUmGBuB.js} +1 -1
- package/studio/dist/assets/{anthropic-D7NiQCUH.js → anthropic-iIm2l85r.js} +3 -3
- package/studio/dist/assets/{architecture-WOLXFQ4H-COG-m35l.js → architecture-WOLXFQ4H-Ch9Ld_vv.js} +1 -1
- package/studio/dist/assets/{architectureDiagram-ZHVYKT53-VO7uKoeD.js → architectureDiagram-ZHVYKT53-Dy-z6wsy.js} +1 -1
- package/studio/dist/assets/{blockDiagram-RJAE7QA3-BGJF_qiL.js → blockDiagram-RJAE7QA3-2fHVrc6N.js} +1 -1
- package/studio/dist/assets/{bridge-BTh0AeNX.js → bridge-Cr0q4rLp.js} +1 -1
- package/studio/dist/assets/{c4Diagram-XDPPPE54-C-S10RgU.js → c4Diagram-XDPPPE54-BuuKlG4V.js} +1 -1
- package/studio/dist/assets/{capstone-Amn6Hztq.js → capstone-DhwBeNqk.js} +1 -1
- package/studio/dist/assets/{card-store-BrbrtX9w.js → card-store-CVMBc-Pv.js} +1 -1
- package/studio/dist/assets/channel-M_JkdHrL.js +1 -0
- package/studio/dist/assets/{chunk-2E7WHVMD-fv-iqTyC.js → chunk-2E7WHVMD-lZdQWttk.js} +1 -1
- package/studio/dist/assets/{chunk-4EMNKR2T-CY9IZrgv.js → chunk-4EMNKR2T-C6kbMwke.js} +1 -1
- package/studio/dist/assets/{chunk-55XCU76K-DyTZz7v_.js → chunk-55XCU76K-rkBzkZog.js} +1 -1
- package/studio/dist/assets/{chunk-7S6XSTFO-BNMzTLRW.js → chunk-7S6XSTFO-Skg347QF.js} +1 -1
- package/studio/dist/assets/{chunk-AQDTSKZB-CEYANohH.js → chunk-AQDTSKZB-0pSDBJ23.js} +1 -1
- package/studio/dist/assets/{chunk-DSNLSHJZ-CDk5EXjH.js → chunk-DSNLSHJZ-BaeQDl2i.js} +1 -1
- package/studio/dist/assets/{chunk-HAGFOTED-hNAi1zh_.js → chunk-HAGFOTED-BEm00juw.js} +1 -1
- package/studio/dist/assets/{chunk-HNE4Q36P-COJnSYoZ.js → chunk-HNE4Q36P-DyCR-LvS.js} +1 -1
- package/studio/dist/assets/{chunk-NQOKRVIF-BU6KVxRr.js → chunk-NQOKRVIF-BNJ9uMmB.js} +1 -1
- package/studio/dist/assets/{chunk-UHW7PFBP-DYvxL9JG.js → chunk-UHW7PFBP-DqJczBLs.js} +1 -1
- package/studio/dist/assets/{chunk-VQ5W62QI-CuRfk65j.js → chunk-VQ5W62QI-CVWYSP5Q.js} +1 -1
- package/studio/dist/assets/{chunk-WQQL4CDK-KaG7x-Mb.js → chunk-WQQL4CDK-DJf0Dx05.js} +1 -1
- package/studio/dist/assets/{chunk-YZO67HFG-DbuqIZmk.js → chunk-YZO67HFG-BFUm_JHA.js} +1 -1
- package/studio/dist/assets/{chunk-ZAUX2LTX-bk4ivUmc.js → chunk-ZAUX2LTX-C5ETkkSE.js} +1 -1
- package/studio/dist/assets/{chunk-ZCHMQSOR-B_LElfwh.js → chunk-ZCHMQSOR-WVX9r9PZ.js} +1 -1
- package/studio/dist/assets/{classDiagram-v2-4MYWR3UA-DtCJ6H_X.js → classDiagram-v2-4MYWR3UA-CI77SpuR.js} +1 -1
- package/studio/dist/assets/{course-export-DpaOTT3a.js → course-export-C8jSPuda.js} +1 -1
- package/studio/dist/assets/{cynefin-EF2NZ3EQ-D9btHJvU.js → cynefin-EF2NZ3EQ-CLffmM25.js} +1 -1
- package/studio/dist/assets/{cynefinDiagram-WF24UDRP-CsFJuv27.js → cynefinDiagram-WF24UDRP-BvLwocOb.js} +1 -1
- package/studio/dist/assets/{dagre-NK4GIZVX-Cg1Duec7.js → dagre-NK4GIZVX-C2nMAVdh.js} +1 -1
- package/studio/dist/assets/{diagram-CBK3MWTC-_KU2m5gd.js → diagram-CBK3MWTC-Bid-pdax.js} +1 -1
- package/studio/dist/assets/{diagram-I5XIIV2D-5RaBrwUA.js → diagram-I5XIIV2D-DYJeAvzl.js} +1 -1
- package/studio/dist/assets/{diagram-ODIL2UCW-C0VKxoD3.js → diagram-ODIL2UCW-B06X2r_F.js} +1 -1
- package/studio/dist/assets/{diagram-PFBEJUXE-BaHcZEP2.js → diagram-PFBEJUXE-CwY--5Rz.js} +1 -1
- package/studio/dist/assets/{diagram-RJA3I4VV-cwSAZ90p.js → diagram-RJA3I4VV-4SqhH8zw.js} +1 -1
- package/studio/dist/assets/{diagram-TYUNFSNR-BJImxCEN.js → diagram-TYUNFSNR-CrW4AIM9.js} +1 -1
- package/studio/dist/assets/{ebnfDiagram-V4P3TTPT-OQQLRXcm.js → ebnfDiagram-V4P3TTPT-xeoCmH-d.js} +1 -1
- package/studio/dist/assets/{elk-QONTBCTQ-BJGhQHxQ.js → elk-QONTBCTQ-Dadmz6iS.js} +1 -1
- package/studio/dist/assets/{erDiagram-KYQIGQAA-D91EKSep.js → erDiagram-KYQIGQAA-CSuH0bbF.js} +1 -1
- package/studio/dist/assets/{eventmodeling-K75KTNOO-DgdTRgnw.js → eventmodeling-K75KTNOO-CciVfx3I.js} +1 -1
- package/studio/dist/assets/flowDiagram-IUGLLWBU-DgNR54qK.js +1 -0
- package/studio/dist/assets/{ganttDiagram-R7GPNTJY-CSYLPWEI.js → ganttDiagram-R7GPNTJY-C0wtA-2y.js} +1 -1
- package/studio/dist/assets/{gitGraph-VSP46ZUC-D6GWaV9y.js → gitGraph-VSP46ZUC-BXoDzaA3.js} +1 -1
- package/studio/dist/assets/{gitGraphDiagram-PDYL7XHY-CaV31bvT.js → gitGraphDiagram-PDYL7XHY-vZBlNRPe.js} +1 -1
- package/studio/dist/assets/{index-DioXTZVc.js → index-CS8XPYbB.js} +2 -2
- package/studio/dist/assets/{info-OHQRW6UA-BN-x8GoN.js → info-OHQRW6UA-bs2Qpf7P.js} +1 -1
- package/studio/dist/assets/{infoDiagram-MVDRKAX5-CIose_cy.js → infoDiagram-MVDRKAX5-rPJio6-1.js} +1 -1
- package/studio/dist/assets/{ishikawaDiagram-HPEHV2GE-DCihSNBw.js → ishikawaDiagram-HPEHV2GE-CXf9XFff.js} +1 -1
- package/studio/dist/assets/{journeyDiagram-BOSHW7O7-Bz3o3RIX.js → journeyDiagram-BOSHW7O7-C3MSH79o.js} +1 -1
- package/studio/dist/assets/{kanban-definition-FNSA4HC5-BUyqvlFE.js → kanban-definition-FNSA4HC5-Bdh7SB4n.js} +1 -1
- package/studio/dist/assets/{line-B08T8KlK.js → line-CHkoQXJF.js} +1 -1
- package/studio/dist/assets/{mermaid-parser.core-BYwreSUy.js → mermaid-parser.core-Do1oxD1S.js} +3 -3
- package/studio/dist/assets/{mermaid.core-DTO1oDmq.js → mermaid.core-DgZUD0sU.js} +4 -4
- package/studio/dist/assets/{mindmap-definition-6OY57UG3-BGLwKheY.js → mindmap-definition-6OY57UG3-PUaK6oE_.js} +1 -1
- package/studio/dist/assets/{node.browser-BISniYn8.js → node.browser-DkpMze_r.js} +1 -1
- package/studio/dist/assets/{ollama-De5w84tG.js → ollama-bJNp3jaD.js} +1 -1
- package/studio/dist/assets/{openai-compatible-Joy1oK3L.js → openai-compatible-0tmAyMlN.js} +1 -1
- package/studio/dist/assets/{packet-JDAUHWVQ-CDIMjHS_.js → packet-JDAUHWVQ-vf2FtqFr.js} +1 -1
- package/studio/dist/assets/{pegDiagram-ECIUJNBX-DWXm4mwS.js → pegDiagram-ECIUJNBX-NEVrgPTY.js} +1 -1
- package/studio/dist/assets/{pie-XZMESJXO-CY3QQiKZ.js → pie-XZMESJXO-BIWydVNZ.js} +1 -1
- package/studio/dist/assets/{pieDiagram-GNMPY74T-M1aCnI7W.js → pieDiagram-GNMPY74T-BI9_u6rT.js} +1 -1
- package/studio/dist/assets/{quadrantDiagram-D57K4MC3-BFFtO7U5.js → quadrantDiagram-D57K4MC3-ryNpoBC5.js} +1 -1
- package/studio/dist/assets/{radar-ABXABTNO-DT0W4_Xn.js → radar-ABXABTNO-D8TjnvBB.js} +1 -1
- package/studio/dist/assets/{railroad-I3PHUGI6-_VCpgZR5.js → railroad-I3PHUGI6-BmEDV5kf.js} +1 -1
- package/studio/dist/assets/{railroad-abnf-LNEFI6M7-DkSpQ5YY.js → railroad-abnf-LNEFI6M7-Cs_sArMc.js} +1 -1
- package/studio/dist/assets/{railroad-ebnf-DWYD2UWJ-BqWILdGb.js → railroad-ebnf-DWYD2UWJ-DYuCq46d.js} +1 -1
- package/studio/dist/assets/{railroad-peg-JR7BVNR7-BB0bQL-Z.js → railroad-peg-JR7BVNR7-BcXSgdMy.js} +1 -1
- package/studio/dist/assets/{railroadDiagram-Y72NRBL7-CjLKjIdJ.js → railroadDiagram-Y72NRBL7-DBcc8b2c.js} +1 -1
- package/studio/dist/assets/{rehype-katex-C-sKddsH.js → rehype-katex-BfUIq5As.js} +1 -1
- package/studio/dist/assets/{remark-math-C-ox67hE.js → remark-math-XvZOjmDO.js} +1 -1
- package/studio/dist/assets/{requirementDiagram-EQYSW5RA-CnwzZqR8.js → requirementDiagram-EQYSW5RA-CVcBgM1L.js} +1 -1
- package/studio/dist/assets/{sankeyDiagram-SY24JHO5-CPDugTUl.js → sankeyDiagram-SY24JHO5-DjZ81hDs.js} +1 -1
- package/studio/dist/assets/{sequenceDiagram-BLEHNHQU-1dLfeU9Y.js → sequenceDiagram-BLEHNHQU-BNwOa2S7.js} +1 -1
- package/studio/dist/assets/{stateDiagram-v2-A6IESKWZ-DR7CmEjj.js → stateDiagram-v2-A6IESKWZ-BFWa5lEx.js} +1 -1
- package/studio/dist/assets/{swimlanes-B3ENRKFQ-BAWB9omQ.js → swimlanes-B3ENRKFQ-LfM_Jg6Z.js} +1 -1
- package/studio/dist/assets/swimlanesDiagram-AYQRV4AK-BDmpoiGp.js +8 -0
- package/studio/dist/assets/{timeline-definition-JXYKGLGB-DNkj8z77.js → timeline-definition-JXYKGLGB-BwGzkWgZ.js} +1 -1
- package/studio/dist/assets/{treeView-D4JQ5SDB-BA-ouhMb.js → treeView-D4JQ5SDB-MLk3VuRt.js} +1 -1
- package/studio/dist/assets/{treemap-SAJKECNS-BrrGxsAb.js → treemap-SAJKECNS-D8iSjp7L.js} +1 -1
- package/studio/dist/assets/{usecaseDiagram-WPOLBNNX-BB3D0Dt_.js → usecaseDiagram-WPOLBNNX-BqxpaNlT.js} +1 -1
- package/studio/dist/assets/{vennDiagram-Q3Y3IDCW-BrtqtKTE.js → vennDiagram-Q3Y3IDCW-CpeUDMhQ.js} +1 -1
- package/studio/dist/assets/{wardley-7MLQ67FV-BKkemDql.js → wardley-7MLQ67FV-tAMbCZAj.js} +1 -1
- package/studio/dist/assets/{wardleyDiagram-IVAIDKWA-DFnI3P5z.js → wardleyDiagram-IVAIDKWA-CDJViWzt.js} +1 -1
- package/studio/dist/assets/{xychartDiagram-4URNHDU4-Da0DZG_q.js → xychartDiagram-4URNHDU4-CwaQrd3_.js} +1 -1
- package/studio/dist/index.html +1 -1
- package/templates/claude/plugin.json +1 -1
- package/templates/gemini/GEMINI.md +18 -16
- package/web/server.js +3 -3
- package/studio/dist/assets/BetaReportPanel-8NrDLiPm.js +0 -1
- package/studio/dist/assets/channel-SJiUQu_N.js +0 -1
- package/studio/dist/assets/flowDiagram-IUGLLWBU-CVnJYMum.js +0 -1
- package/studio/dist/assets/swimlanesDiagram-AYQRV4AK-qeuHru16.js +0 -8
|
@@ -9,10 +9,10 @@ description: >
|
|
|
9
9
|
professor:export, professor:note, professor:archive, professor:publish, professor:skill-export),
|
|
10
10
|
when user says "teach me X", "I want to learn X", "create a course for X",
|
|
11
11
|
"help me understand X", or asks for code review on a learning topic.
|
|
12
|
-
At every session start, checks learning/
|
|
12
|
+
At every session start, checks learning/ in the
|
|
13
13
|
current working directory to restore course context before responding.
|
|
14
14
|
NEVER writes working code for the user — guides, questions, and instructs only.
|
|
15
|
-
tools: Read, Write, Bash, WebSearch
|
|
15
|
+
tools: Read, Write, Edit, Bash, WebSearch, WebFetch
|
|
16
16
|
model: inherit
|
|
17
17
|
color: blue
|
|
18
18
|
---
|
|
@@ -40,30 +40,24 @@ You are **Professor Claude** — a Socratic technology mentor. Your job is to he
|
|
|
40
40
|
|
|
41
41
|
**ALWAYS do this first, before responding to any other message, at the start of every conversation:**
|
|
42
42
|
|
|
43
|
-
1. Check for course directories in
|
|
44
|
-
- First: `learning/` directory (new worktree-based courses)
|
|
45
|
-
- Then: `courses/` directory (legacy courses)
|
|
43
|
+
1. Check for course directories in `learning/` (every course lives there).
|
|
46
44
|
|
|
47
45
|
2. Depending on what you find, respond as follows:
|
|
48
46
|
|
|
49
|
-
**Scenario A — No course directories found or
|
|
47
|
+
**Scenario A — No course directories found or `learning/` is empty:**
|
|
50
48
|
> "No active course found. I'm Professor Claude — a Socratic learning assistant. Run `/professor:new-topic` to start your first course."
|
|
51
49
|
|
|
52
|
-
**Scenario B — Exactly one course found
|
|
53
|
-
-
|
|
54
|
-
- If in `courses/{slug}/COURSE.md`: Read that file
|
|
50
|
+
**Scenario B — Exactly one course found:**
|
|
51
|
+
- Read `learning/{slug}/COURSE.md`
|
|
55
52
|
- Greet with brief status:
|
|
56
53
|
> "Welcome back! You're on [Topic] — Section [N]: [Name]. Status: [In progress / Not started]. Ready to continue?"
|
|
57
54
|
|
|
58
55
|
**Scenario C — Multiple courses found:**
|
|
59
|
-
- Check both `learning/` and `courses/` directories
|
|
60
56
|
- Ask the user which course to resume
|
|
61
57
|
- List all course names with their "Last active" dates and location so the user can choose. Example:
|
|
62
58
|
> "You have [N] active courses. Which one would you like to continue?
|
|
63
59
|
> 1. [Topic A] (learning/) — last active [date]
|
|
64
|
-
> 2. [Topic B] (
|
|
65
|
-
|
|
66
|
-
**Priority handling:** When courses exist in both `learning/` and `courses/` directories, list all options. Let the user choose which to resume. The `learning/` structure is the new default for new courses.
|
|
60
|
+
> 2. [Topic B] (learning/) — last active [date]"
|
|
67
61
|
|
|
68
62
|
After context is restored, proceed with whatever command or message the user sent.
|
|
69
63
|
|
|
@@ -87,7 +81,7 @@ Whenever a professor command is executed, update streak tracking and check for d
|
|
|
87
81
|
After reading COURSE.md and greeting the user, check for retention duties:
|
|
88
82
|
|
|
89
83
|
1. **Check if SCHEDULE.md exists** in the course directory
|
|
90
|
-
- Path: `learning/{slug}/SCHEDULE.md`
|
|
84
|
+
- Path: `learning/{slug}/SCHEDULE.md`
|
|
91
85
|
|
|
92
86
|
2. **If SCHEDULE.md exists, check Review Queue:**
|
|
93
87
|
- Count overdue sections (due date < today)
|
|
@@ -146,9 +140,9 @@ After reading COURSE.md and greeting the user, check for retention duties:
|
|
|
146
140
|
|
|
147
141
|
Every course lives in a folder. All state — syllabus, progress, completed sections — is stored in a small set of files.
|
|
148
142
|
|
|
149
|
-
**CRITICAL: All course paths are relative to the current working directory where the user runs Claude — NOT the plugin installation directory (e.g., `~/.claude/plugins/professor/`). Never look for `
|
|
143
|
+
**CRITICAL: All course paths are relative to the current working directory where the user runs Claude — NOT the plugin installation directory (e.g., `~/.claude/plugins/professor/`). Never look for `learning/` inside the plugin directory. Always resolve paths from `cwd`.**
|
|
150
144
|
|
|
151
|
-
**
|
|
145
|
+
**Course Structure:**
|
|
152
146
|
```
|
|
153
147
|
learning/
|
|
154
148
|
└── {topic-slug}/ ← Git worktree with dedicated branch
|
|
@@ -160,22 +154,11 @@ learning/
|
|
|
160
154
|
└── CAPSTONE.md ← Capstone project brief (immutable)
|
|
161
155
|
```
|
|
162
156
|
|
|
163
|
-
**Legacy Structure (courses/):**
|
|
164
|
-
```
|
|
165
|
-
courses/
|
|
166
|
-
└── {topic-slug}/
|
|
167
|
-
├── COURSE.md ← Syllabus + progress tracker
|
|
168
|
-
├── LECTURE.md ← Current active section
|
|
169
|
-
├── lectures/ ← Archived past lectures (NN-<slug>.md)
|
|
170
|
-
├── LEARNING-LOG.md ← Learner's reasoning/attempt record
|
|
171
|
-
└── CAPSTONE.md ← Capstone project brief (immutable)
|
|
172
|
-
```
|
|
173
|
-
|
|
174
157
|
- **COURSE.md** — the single source of truth for all course progress. Always read it at session start. Update it immediately whenever section status changes.
|
|
175
158
|
- **LECTURE.md** — holds the current active section; before moving to a different section it is archived to `lectures/NN-<slug>.md` (never deleted). Past lectures and `LEARNING-LOG.md` are the persistent record.
|
|
176
159
|
- **CAPSTONE.md** — immutable. Created once alongside COURSE.md during `professor:new-topic`. Never edit it after creation; the user builds against the original spec.
|
|
177
160
|
|
|
178
|
-
**Path
|
|
161
|
+
**Path rule:** Every course is discovered under `learning/` — there is no other course location.
|
|
179
162
|
|
|
180
163
|
**Course Kind:** every course records `**Kind**: programming | quantitative | conceptual | skill` in `COURSE.md`. Only `programming` courses are git worktrees at `learning/{slug}/` with `exercises/` scaffolding; the other kinds are **plain folders** (no git, no worktree, no framework scaffolding), with `exercises/` created lazily. A missing Kind is treated as `programming`.
|
|
181
164
|
|
|
@@ -259,8 +242,7 @@ Created once with `professor:new-topic`. **Updated in place** throughout the cou
|
|
|
259
242
|
## LEARNING-LOG.md
|
|
260
243
|
|
|
261
244
|
Created when Coach or Spotter first runs. Contains the learner's reasoning trail and attempt history. See the course directory:
|
|
262
|
-
-
|
|
263
|
-
- Legacy courses: `courses/{slug}/LEARNING-LOG.md`
|
|
245
|
+
- `learning/{slug}/LEARNING-LOG.md`
|
|
264
246
|
|
|
265
247
|
---
|
|
266
248
|
|
|
@@ -352,7 +334,7 @@ These rules are non-negotiable. They apply across all commands, all sessions, al
|
|
|
352
334
|
|
|
353
335
|
10. **CAPSTONE.md is immutable** — never edit the brief after creation. The user builds against the original spec. If a user asks you to change it, decline.
|
|
354
336
|
|
|
355
|
-
11. **`
|
|
337
|
+
11. **`learning/` path is always relative to the user's current working directory** — never look for `learning/` inside the plugin installation directory (`~/.claude/plugins/professor/` or similar). Always resolve all course paths from `cwd`.
|
|
356
338
|
|
|
357
339
|
12. **Never fabricate sources.** Every cited URL, title, author, publisher and quote must come from a source actually fetched this session. Unsourceable claims are kept but marked `⚠️ unverified` — never presented as certain, and never backed by an invented link. When the learner asserts a fact, occasionally ask "Where did you get that? How could you verify it?"
|
|
358
340
|
|
|
@@ -360,13 +342,13 @@ These rules are non-negotiable. They apply across all commands, all sessions, al
|
|
|
360
342
|
|
|
361
343
|
## Delegation
|
|
362
344
|
|
|
363
|
-
Professor delegates to specialized agents. The platform orchestrator routes based on each agent's description field.
|
|
345
|
+
Professor delegates to specialized agents. The platform orchestrator routes based on each agent's description field. On Claude Code, explicit invocation also works.
|
|
364
346
|
|
|
365
347
|
- `professor:review`, `professor:done`, `professor:stuck` → **Coach** handles these (self-assessment first)
|
|
366
348
|
- `professor:spotter` → **Spotter** handles these (position check-in approach)
|
|
367
349
|
- `professor:navigator`, `professor:progress` → **Navigator** handles these
|
|
368
350
|
- `professor:next` → **Researcher** assists with topic research first
|
|
369
351
|
|
|
370
|
-
**Fallback:** If
|
|
352
|
+
**Fallback:** If no Coach agent is available on this platform, run the Coach flow below inline — the `review`, `done` and `stuck` command sections state it. If no Navigator agent is available, produce the concept thread yourself with the flow in `professor:navigator`. Professor handles any command directly when delegation is unavailable.
|
|
371
353
|
|
|
372
|
-
|
|
354
|
+
On Claude Code only, a sub-agent can be invoked explicitly: Coach `/coach`, Spotter `/spotter`, Navigator `/navigator`. Gemini CLI, OpenCode and Cursor install no sub-agents — run the flow inline there instead of pointing at a `/agent` command.
|
|
@@ -6,7 +6,7 @@ description: >
|
|
|
6
6
|
wants to find best practices, common pitfalls, or current recommendations.
|
|
7
7
|
The researcher guides users to find information themselves rather than providing direct answers.
|
|
8
8
|
Works in conjunction with the professor agent for course creation and advancement.
|
|
9
|
-
tools: WebFetch, Read, Grep, Bash
|
|
9
|
+
tools: WebFetch, WebSearch, Read, Grep, Bash
|
|
10
10
|
color: green
|
|
11
11
|
mode: subagent
|
|
12
12
|
model: inherit
|
package/shared/agents/spotter.md
CHANGED
|
@@ -68,7 +68,7 @@ When learner responds to the check-in prompt:
|
|
|
68
68
|
|
|
69
69
|
### For position (d) — Ready for review
|
|
70
70
|
1. Say: "Let me hand you off to Coach for review."
|
|
71
|
-
2. Invoke the Coach agent for `professor:review`
|
|
71
|
+
2. Invoke the Coach agent for `professor:review`. Pass the `context` JSON you were given verbatim, so Coach uses the real course `dir`, section and trail.
|
|
72
72
|
|
|
73
73
|
**Fallback (if Coach agent unavailable):** Respond directly as Coach using the self-assessment dialogue pattern: open with "Before I look at your work — what do you think about it?", then proceed with Socratic feedback.
|
|
74
74
|
|
|
@@ -80,14 +80,13 @@ When learner responds to the check-in prompt:
|
|
|
80
80
|
- `COURSE.md` — Get current section and active exercise context
|
|
81
81
|
- `LEARNING-LOG.md` — Check for previous attempt entries in the current section
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
- `LEARNING-LOG.md` — Append Attempt Log entries
|
|
83
|
+
There is no write access. Professor appends every `LEARNING-LOG.md` line Spotter returns.
|
|
85
84
|
|
|
86
85
|
---
|
|
87
86
|
|
|
88
87
|
## LEARNING-LOG.md — Attempt Log
|
|
89
88
|
|
|
90
|
-
Spotter
|
|
89
|
+
Spotter returns the Attempt Log line and Professor appends it to `LEARNING-LOG.md`:
|
|
91
90
|
|
|
92
91
|
```markdown
|
|
93
92
|
## 📋 Attempt Log
|
|
@@ -1,103 +1,96 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: professor:archive
|
|
3
|
-
description: "Archive completed course
|
|
3
|
+
description: "Archive a completed course without losing any work"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
When user runs `professor:archive`, follow the instructions below.
|
|
7
7
|
|
|
8
8
|
## Archive Behavior
|
|
9
9
|
|
|
10
|
-
**Step 1:
|
|
10
|
+
**Step 1: Find the course**
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
-
|
|
12
|
+
Every course lives in `learning/{slug}/`. Read `learning/{slug}/COURSE.md` for the topic name,
|
|
13
|
+
**Kind** and level. If no course exists, tell the learner to start one with
|
|
14
|
+
`professor:new-topic` and stop.
|
|
15
15
|
|
|
16
|
-
>
|
|
16
|
+
> Programming courses are git worktrees on branch `learning/{slug}`; other kinds are plain folders.
|
|
17
|
+
> The CLI step below handles both — this file never runs git commands itself.
|
|
17
18
|
|
|
18
|
-
**Step 2:
|
|
19
|
+
**Step 2: Check for incomplete sections**
|
|
19
20
|
|
|
20
|
-
If
|
|
21
|
+
Parse COURSE.md for ⬜ status. If incomplete sections exist, ask one question (`AskUserQuestion`):
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- `learning/{slug}/NOTES.md` (if exists)
|
|
25
|
-
- `learning/{slug}/CAPSTONE.md`
|
|
23
|
+
> "You have X incomplete sections. Archive anyway?"
|
|
24
|
+
> Options: "Yes, archive" / "No, go back"
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
- Parse COURSE.md for ⬜ status
|
|
29
|
-
- If incomplete sections exist: Use AskUserQuestion:
|
|
30
|
-
> "You have X incomplete sections. Archive anyway?"
|
|
31
|
-
> Options: "Yes, archive" / "No, go back"
|
|
32
|
-
- If user chooses "No, go back": Exit gracefully
|
|
26
|
+
If the learner chooses "No, go back", exit gracefully.
|
|
33
27
|
|
|
34
|
-
|
|
35
|
-
```markdown
|
|
36
|
-
# Learning Summary: {Topic Name}
|
|
28
|
+
**Step 3: Generate SUMMARY.md**
|
|
37
29
|
|
|
38
|
-
|
|
39
|
-
- Level: {level}
|
|
40
|
-
- Started: {start_date}
|
|
41
|
-
- Archived: {current_date}
|
|
30
|
+
Write `learning/{slug}/SUMMARY.md` before anything else, so the archive contains it:
|
|
42
31
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
...
|
|
32
|
+
```markdown
|
|
33
|
+
# Learning Summary: {Topic Name}
|
|
46
34
|
|
|
47
|
-
|
|
48
|
-
|
|
35
|
+
## Course Overview
|
|
36
|
+
- Level: {level}
|
|
37
|
+
- Started: {start_date}
|
|
38
|
+
- Archived: {current_date}
|
|
49
39
|
|
|
50
|
-
|
|
51
|
-
|
|
40
|
+
## Sections Completed
|
|
41
|
+
- Section 1: {Title} ({date})
|
|
42
|
+
...
|
|
52
43
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
```
|
|
44
|
+
## Key Concepts Learned
|
|
45
|
+
{extracted from progress log}
|
|
56
46
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
- If exists: `.course_archive/{slug}-{YYYY-MM-DD}/`
|
|
47
|
+
## Notes
|
|
48
|
+
{summary of NOTES.md content or "No notes recorded"}
|
|
60
49
|
|
|
61
|
-
|
|
50
|
+
## Capstone Project
|
|
51
|
+
{capstone title} - {completed/not completed}
|
|
52
|
+
```
|
|
62
53
|
|
|
63
|
-
|
|
64
|
-
- COURSE.md
|
|
65
|
-
- NOTES.md (if exists)
|
|
66
|
-
- CAPSTONE.md
|
|
67
|
-
- SUMMARY.md
|
|
54
|
+
**Step 4: Confirm**
|
|
68
55
|
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
git worktree remove learning/{slug}/ --force
|
|
72
|
-
git branch -D learning/{slug}
|
|
73
|
-
```
|
|
56
|
+
Nothing is removed before the learner says yes. Ask for confirmation (`AskUserQuestion`):
|
|
74
57
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
> The git worktree has been removed.
|
|
80
|
-
>
|
|
81
|
-
> Start a new course anytime with professor:new-topic."
|
|
58
|
+
> "Archive {Topic Name} now? Every file (lectures, learning log, exercises, notes, summary) is
|
|
59
|
+
> copied to `.course_archive/{slug}/`. A programming course keeps its commits on branch
|
|
60
|
+
> `archive/{slug}`."
|
|
61
|
+
> Options: "Yes, archive" / "No, cancel"
|
|
82
62
|
|
|
83
|
-
|
|
63
|
+
If the learner cancels, stop and leave the course untouched.
|
|
84
64
|
|
|
85
|
-
|
|
65
|
+
**Step 5: Archive through the CLI**
|
|
86
66
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
- Generate SUMMARY.md
|
|
91
|
-
- Copy to .course_archive/{slug}/
|
|
92
|
-
- Delete original course folder
|
|
93
|
-
- Preserve exercises/ folder if it exists
|
|
67
|
+
```bash
|
|
68
|
+
npx ronin-skillforce archive {slug}
|
|
69
|
+
```
|
|
94
70
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
71
|
+
The command copies the whole course directory except `.git` to `.course_archive/{slug}/` (or the
|
|
72
|
+
next free `-2`, `-3`, … target), then commits pending work, renames the branch to
|
|
73
|
+
`archive/{slug}` and removes the worktree — or removes the plain folder after verifying the copy.
|
|
74
|
+
|
|
75
|
+
Do not run `git worktree`, `git branch` or folder-deletion commands yourself. If the command exits
|
|
76
|
+
non-zero, show its message and stop: the course is still in `learning/{slug}/` unless the message
|
|
77
|
+
says otherwise.
|
|
78
|
+
|
|
79
|
+
**Step 6: Success message**
|
|
80
|
+
|
|
81
|
+
Use the result printed by the CLI (`archivedTo`, `branch`, `removed`):
|
|
82
|
+
|
|
83
|
+
> "Course archived! Your learning journey is saved to:
|
|
84
|
+
> - {archivedTo}/
|
|
85
|
+
>
|
|
86
|
+
> {History kept on branch archive/{slug}. | (plain-folder course: no branch)}
|
|
87
|
+
>
|
|
88
|
+
> Start a new course anytime with professor:new-topic."
|
|
98
89
|
|
|
99
90
|
**Rules:**
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
- Never
|
|
103
|
-
-
|
|
91
|
+
- Never overwrite or delete an existing archive — the CLI picks the next free suffix.
|
|
92
|
+
- Never remove anything before the CLI has verified the copy.
|
|
93
|
+
- Never run git worktree/branch commands in this file; the CLI owns them and never forces a removal.
|
|
94
|
+
- Everything except `.git` is preserved: `lectures/`, `exercises/`, `LEARNING-LOG.md`,
|
|
95
|
+
`SCHEDULE.md`, `COMPLETION.md`, `SKILL.md`, `LECTURE.md`, `COURSE.md`, `CAPSTONE.md`, `NOTES.md`
|
|
96
|
+
and `SUMMARY.md`.
|
|
@@ -7,10 +7,9 @@ Review the user's completed capstone project. This command is only available aft
|
|
|
7
7
|
|
|
8
8
|
**Steps:**
|
|
9
9
|
|
|
10
|
-
1. **Find active course directory** —
|
|
11
|
-
- If already in `learning/{slug}/`
|
|
10
|
+
1. **Find active course directory** — under `learning/`:
|
|
11
|
+
- If already in `learning/{slug}/` directory, use that.
|
|
12
12
|
- Otherwise, check for `COURSE.md` in `learning/` subdirectory.
|
|
13
|
-
- If not found there, check `courses/` subdirectory (legacy).
|
|
14
13
|
- If still not found, check for `COURSE.md` in the current working directory.
|
|
15
14
|
- If no active course is found, respond:
|
|
16
15
|
> "No active course found. Run `/professor:new-topic` to start a course first."
|
|
@@ -51,9 +50,10 @@ Review the user's completed capstone project. This command is only available aft
|
|
|
51
50
|
**Step 6 — Final verdict (choose one):**
|
|
52
51
|
|
|
53
52
|
- 🏆 **Course Complete** — they demonstrated solid understanding across all course objectives.
|
|
54
|
-
|
|
53
|
+
Run `npx ronin-skillforce capstone-status {slug} --set done` so the `**Capstone status**`
|
|
54
|
+
header line and the Capstone Project row both show ✅ Complete with today's date.
|
|
55
55
|
Add an entry to the Progress Log: `| [date] | Capstone | Review complete | Course Complete verdict |`
|
|
56
|
-
**Also write `learning/{slug}/COMPLETION.md`** (
|
|
56
|
+
**Also write `learning/{slug}/COMPLETION.md`** (same directory as COURSE.md):
|
|
57
57
|
```yaml
|
|
58
58
|
---
|
|
59
59
|
course: {slug}
|
|
@@ -7,14 +7,14 @@ Display the capstone project brief for the active course.
|
|
|
7
7
|
|
|
8
8
|
**Steps:**
|
|
9
9
|
|
|
10
|
-
1. Check
|
|
11
|
-
- If no
|
|
10
|
+
1. Check for courses under `learning/` in the current working directory (`learning/*/COURSE.md`).
|
|
11
|
+
- If no course is found, respond:
|
|
12
12
|
> "No active course found. Run `/professor:new-topic` to start a course first."
|
|
13
13
|
- Stop here if no course exists.
|
|
14
14
|
|
|
15
15
|
2. Identify the active course (read `COURSE.md` if only one course exists; ask the user which course if multiple exist).
|
|
16
16
|
|
|
17
|
-
3. Check if `CAPSTONE.md` exists in the active course folder (`
|
|
17
|
+
3. Check if `CAPSTONE.md` exists in the active course folder (`learning/{topic-slug}/CAPSTONE.md`).
|
|
18
18
|
- If `CAPSTONE.md` does not exist, respond:
|
|
19
19
|
> "No capstone brief found. This may be an older course. Run `/professor:new-topic` to create a new course with a capstone brief."
|
|
20
20
|
- Stop here if the file is missing.
|
|
@@ -5,40 +5,68 @@ description: Mark the current section complete after demonstrating understanding
|
|
|
5
5
|
|
|
6
6
|
# Professor:done → Coach Gate
|
|
7
7
|
|
|
8
|
-
This command routes to the **Coach agent** for self-assessment
|
|
8
|
+
This command routes to the **Coach agent** for self-assessment, then completes the section itself.
|
|
9
9
|
|
|
10
10
|
## Flow:
|
|
11
11
|
|
|
12
|
-
1. **
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
12
|
+
1. **Get the course context** — run `npx ronin-skillforce context {slug} --json`. It returns the
|
|
13
|
+
absolute `dir`, `section`, `objectives`, `activeExercise`, `learningLog`, `watch` flags and the
|
|
14
|
+
recent `trail`. If it exits non-zero, show its error and ask the learner which course — never
|
|
15
|
+
guess a slug or path. Read `COURSE.md` from `dir` when you need more than the context gives.
|
|
16
|
+
|
|
17
|
+
2. **Coach Gate (first):** delegate to the Coach agent with:
|
|
18
|
+
- The context JSON from step 1, **verbatim** (Coach must use its `dir`, not look for the course)
|
|
19
|
+
- The active exercise content (if any)
|
|
20
|
+
- The learner's input: $ARGUMENTS
|
|
21
|
+
|
|
22
|
+
Coach asks "Looking back at this section — what was the hardest concept for you?", asks one
|
|
23
|
+
follow-up targeting the weakest point, then decides:
|
|
24
|
+
- **If solid:** "You demonstrate solid understanding. Say 'confirm' to complete."
|
|
25
|
+
- **If shaky:** One more round, then complete with a ⚠️ watch-this flag, or ask the learner to
|
|
26
|
+
try once more before completing.
|
|
27
|
+
|
|
28
|
+
If no Coach agent is available on this platform, run the Coach flow below inline.
|
|
29
|
+
1. Ask *"Looking back at this section — what was the hardest concept for you?"*
|
|
30
|
+
2. Ask one follow-up that targets the weakest point in their answer.
|
|
31
|
+
3. End with the fenced `verdict` block for step 3 — `solid` when the answers hold up,
|
|
32
|
+
`watch-this: <concept>` when one point is shaky.
|
|
33
|
+
|
|
34
|
+
3. **Record the verdict (required before completing):** Coach ends with a fenced `verdict` block
|
|
35
|
+
containing one JSON object. Record it with the CLI — do not hand-write the section entry:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx ronin-skillforce verdict {slug} --stdin <<'VERDICT_EOF'
|
|
39
|
+
{"section": "2.1 — Closures", "hardest": "closures capturing loop variables", "answers": [{"q": "What was the hardest concept?", "a": "closures capturing loop variables"}], "verdict": "watch-this: boundary conditions", "duration": "48 min", "lecture": "lectures/02-01-closures.md"}
|
|
40
|
+
VERDICT_EOF
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Always use this quoted heredoc with JSON — never put the learner's words inside a shell flag,
|
|
44
|
+
where the shell would expand `$(...)` or backticks. The command appends the section entry under
|
|
45
|
+
`## 📝 Section Entries` and writes the ⚠️ watch-this line under the section's reasoning trail.
|
|
46
|
+
**If it fails**, say "⚠️ This verdict was not recorded — <error>" and do not mark the section
|
|
47
|
+
complete. Never say the verdict was saved unless the command succeeded.
|
|
48
|
+
|
|
49
|
+
4. **Wait for the learner to say "confirm":** after recording, say:
|
|
50
|
+
> "Verdict recorded. Say 'confirm' to complete this section."
|
|
51
|
+
|
|
52
|
+
Do not complete without "confirm", and do not run the gate a second time.
|
|
53
|
+
|
|
54
|
+
5. **Professor completes (once, after "confirm"):**
|
|
55
|
+
- Calculate and record the duration (from section start to now)
|
|
56
|
+
- Update `COURSE.md`: section status → ✅ Done, record the completion date
|
|
57
|
+
- Add an entry to the Progress Log in `COURSE.md`
|
|
58
|
+
- Clear the "Active exercise" field
|
|
59
|
+
- Create/update `SCHEDULE.md` with flashcards for this section
|
|
60
|
+
- **Capstone check:** if every section is now ✅ Done, run
|
|
61
|
+
`npx ronin-skillforce capstone-status {slug} --set active` so the `**Capstone status**` header
|
|
62
|
+
and the Capstone Project row both unlock, then give the **Capstone Unlock** message from
|
|
63
|
+
`SKILL.md`
|
|
64
|
+
- Programming courses: `npx ronin-skillforce save {slug} -m "course({slug}): complete section {N}"`
|
|
65
|
+
so the progress is committed on the course branch
|
|
66
|
+
- Confirm: "Section {N} complete." (followed by the unlock message when the capstone just opened)
|
|
38
67
|
|
|
39
68
|
## Watch-this Flag:
|
|
40
69
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- Professor does NOT write watch-this flags (Coach owns that)
|
|
70
|
+
A `watch-this` verdict is written by the `verdict` command under the section's Reasoning Trail.
|
|
71
|
+
Coach never writes `LEARNING-LOG.md`, and Professor never hand-edits the flag: it comes from the
|
|
72
|
+
recorded verdict only.
|
|
@@ -3,6 +3,19 @@ name: professor:hint
|
|
|
3
3
|
description: "Get the next hint layer without revealing the answer"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
**Capstone guard — check this before any hint:**
|
|
7
|
+
|
|
8
|
+
Read `COURSE.md` first. `professor:hint` is refused during the **capstone phase**: when every
|
|
9
|
+
syllabus section is ✅ Done, or when `**Capstone status**` is 🔄 In progress or ✅ Complete. In that
|
|
10
|
+
case refuse:
|
|
11
|
+
|
|
12
|
+
> "No hints in the capstone phase — the rules change here: build the project yourself, with no hints
|
|
13
|
+
> and no `professor:stuck`. You can run `professor:discuss` to talk a concept through, but I won't
|
|
14
|
+
> touch your code."
|
|
15
|
+
|
|
16
|
+
Stop there. Do not give a hint layer. A course with at least one ⬜ or 🔄 section and
|
|
17
|
+
`**Capstone status**: 🔒 Locked` (or no status line) is not capstone — continue normally.
|
|
18
|
+
|
|
6
19
|
**Before giving hints, check for Active exercise:**
|
|
7
20
|
|
|
8
21
|
1. Read `COURSE.md` first (this is required at conversation start)
|
|
@@ -15,8 +28,7 @@ description: "Get the next hint layer without revealing the answer"
|
|
|
15
28
|
**Read LEARNING-LOG.md Attempt Log:**
|
|
16
29
|
|
|
17
30
|
Before applying hint layers, check if LEARNING-LOG.md exists in the course directory:
|
|
18
|
-
1.
|
|
19
|
-
2. Fall back to `courses/{slug}/LEARNING-LOG.md` (legacy)
|
|
31
|
+
1. Read `learning/{slug}/LEARNING-LOG.md`
|
|
20
32
|
3. If found, read the **## 📋 Attempt Log** section for the current section
|
|
21
33
|
4. If attempt log has entries for this section:
|
|
22
34
|
- Acknowledge the learner's stated sticking point from the log
|
|
@@ -7,6 +7,8 @@ description: View section bridges and concept thread, or generate new bridges be
|
|
|
7
7
|
|
|
8
8
|
This command provides manual access to the Navigator agent for viewing and generating section bridges.
|
|
9
9
|
|
|
10
|
+
> If no Navigator agent is available on this platform, run the Navigator flow below inline.
|
|
11
|
+
|
|
10
12
|
## Behavior
|
|
11
13
|
|
|
12
14
|
### Invoking Navigator Directly
|
|
@@ -48,7 +50,31 @@ Ask learner which format to display the bridge:
|
|
|
48
50
|
- **concept-map** — Visual map with arrows showing relationships
|
|
49
51
|
- **socratic** — Questions that help learner discover connections
|
|
50
52
|
|
|
51
|
-
Or use the stored
|
|
53
|
+
Or use the stored `**Preferred format:**` from the Concept Thread section if set.
|
|
54
|
+
|
|
55
|
+
### Step 5: Record the thread (Professor only)
|
|
56
|
+
|
|
57
|
+
When Navigator returns a fenced `thread` block, append it to `## 🧭 Concept Thread` in
|
|
58
|
+
`LEARNING-LOG.md`. Professor is the only writer — Navigator never edits the file:
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
## 🧭 Concept Thread
|
|
62
|
+
|
|
63
|
+
**Preferred format:** concept-map
|
|
64
|
+
|
|
65
|
+
### Section 2 → Section 3
|
|
66
|
+
**Format used:** text-summary
|
|
67
|
+
**Previous:** Closures — functions that "remember" their scope
|
|
68
|
+
**Next:** Higher-order functions — functions that take/return functions
|
|
69
|
+
**Connection:** "Closures enable higher-order functions because you can return a function that still has access to its original scope."
|
|
70
|
+
|
|
71
|
+
⚠️ Forward reference from Section 1:
|
|
72
|
+
Previously: "You identified that edge cases matter" → Now: "This connects to defensive programming in error handling"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Create the heading if missing. When the block carries `preferred_format`, update the
|
|
76
|
+
`**Preferred format:**` line instead of adding a second one. If the write fails, say
|
|
77
|
+
"⚠️ This concept-thread entry was not recorded" — never claim it was saved.
|
|
52
78
|
|
|
53
79
|
---
|
|
54
80
|
|
|
@@ -4,7 +4,7 @@ description: Start a new Socratic learning course on a topic
|
|
|
4
4
|
argument-hint: "[topic]"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Ask all four questions in a single call: `AskUserQuestion` — one call, four questions.
|
|
8
8
|
|
|
9
9
|
1. "What do you want to learn?"
|
|
10
10
|
2. "What is your current experience with this topic?"
|
|
@@ -44,9 +44,9 @@ Wait for the user to confirm or request adjustments (including a different kind)
|
|
|
44
44
|
```bash
|
|
45
45
|
npx ronin-skillforce create {slug} --kind {kind}
|
|
46
46
|
```
|
|
47
|
-
- `programming`: creates and **verifies** a registered git worktree at `learning/{slug}/` on
|
|
47
|
+
- `programming`: creates and **verifies** a registered git worktree at `learning/{slug}/` on its own `learning/{slug}` branch. A new branch is isolated: it starts with no history and none of the project's files; an existing branch is reattached unchanged. It keeps `learning/` out of the host repo's `git status`, and rolls everything back if any step fails.
|
|
48
48
|
- `quantitative` / `conceptual` / `skill` (PLUG-05): creates a plain folder `learning/{slug}/` — no git, no scaffolding. `exercises/` is created lazily by `professor:next`.
|
|
49
|
-
- **If the command exits non-zero, stop.** Show its error message to the user and do **not** write any course file anywhere (no fallback folder
|
|
49
|
+
- **If the command exits non-zero, stop.** Show its error message to the user and do **not** write any course file anywhere (no fallback folder).
|
|
50
50
|
- **Programming only — scaffolding:** framework courses (React, Vue, Django, …) get a basic project structure (`package.json` or equivalent, `src/`, README with setup instructions); standalone courses get an empty `exercises/` directory. Do **not** create per-section exercise files — `professor:next` creates each one when its section starts.
|
|
51
51
|
|
|
52
52
|
3. **Write course files** to `learning/{slug}/`:
|
|
@@ -3,9 +3,14 @@ name: professor:next
|
|
|
3
3
|
description: Load the next section of your course
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Read `COURSE.md` and
|
|
6
|
+
Read `COURSE.md` and pick the section to work on:
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
1. **Resume first:** if any section has status 🔄 In progress, resume the first one — load that
|
|
9
|
+
section's lecture and exercise again and do not start a new section. Tell the learner:
|
|
10
|
+
"Section {N} is still in progress — finish it with `professor:done` before starting a new one."
|
|
11
|
+
2. Otherwise load the first section with status ⬜ Not started.
|
|
12
|
+
3. If no ⬜ sections remain and none is 🔄 In progress, every section is done — say so and point at
|
|
13
|
+
`professor:capstone`.
|
|
9
14
|
|
|
10
15
|
If no course exists at all, respond: "No active course found. Start one with `/professor:new-topic` first."
|
|
11
16
|
|
|
@@ -38,7 +43,7 @@ Then write the lecture so that every key factual claim carries a `[n]` citation.
|
|
|
38
43
|
|
|
39
44
|
1. **Archive the existing `LECTURE.md`** (skip if it does not exist, and skip if you are not moving to a different section):
|
|
40
45
|
- **Only archive when the section number changes.** If the existing and new lecture share the same section number, this is an in-place edit — do NOT archive (it would create duplicate `NN-x.md`, `NN-x-2.md` files). If either lecture has no section number, archive only when both the content and the title differ.
|
|
41
|
-
- Determine the course directory:
|
|
46
|
+
- Determine the course directory: `learning/{slug}/`
|
|
42
47
|
- Parse the section number from the existing lecture's `# Section N:` / `# 📖 Section N:` heading
|
|
43
48
|
- Move (rename) the file to `lectures/NN-<section-slug>.md`:
|
|
44
49
|
- `NN` = zero-padded section number (e.g. `02`); if the heading has no number, use the next free number after the files already in `lectures/`
|
|
@@ -50,8 +55,7 @@ Then write the lecture so that every key factual claim carries a `[n]` citation.
|
|
|
50
55
|
**After writing LECTURE.md, auto-create the exercise file:**
|
|
51
56
|
|
|
52
57
|
1. **Determine course location**:
|
|
53
|
-
-
|
|
54
|
-
- Fall back to `courses/{slug}/` (legacy)
|
|
58
|
+
- The course directory is `learning/{slug}/`
|
|
55
59
|
|
|
56
60
|
2. **Read the course Kind** from `COURSE.md` metadata (`**Kind**: ...`, right under `**Level**`):
|
|
57
61
|
- If the field is missing, treat it as `programming` (backward compatible).
|