@skill-map/cli 0.24.5 → 0.26.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.
@@ -30,27 +30,38 @@ optional second phase (~20-30 min) covering the rest of the CLI.
30
30
  > "short path", "long path", "route", "phase 1" / "phase 2", or
31
31
  > "let's start the short one" in messages to the tester. The internal
32
32
  > split exists so YOU know what comes next; for the tester you only
33
- > talk about the current step and, at the end of step 4, offer
34
- > "if you want, we can keep going deeper" without labelling it.
33
+ > talk about the current step and, at the end of step 7 (wrap-up),
34
+ > offer "if you want, we can keep going deeper" without labelling it.
35
35
 
36
36
  ## Tone
37
37
 
38
+ ### Language and register
39
+
38
40
  - Spanish (when the tester's language is Spanish): casual, neutral,
39
41
  NOT rioplatense. Short sentences. No unnecessary jargon. Use
40
42
  `tú` form, not `vos` — `puedes`, `mira`, `prueba`, `crea`, NOT
41
43
  `podés`, `mirá`, `probá`, `creá`. Avoid Argentine fillers
42
- (`dale`, `bueno`, `che`, `re-`, `genial`).
44
+ (`dale`, `bueno`, `che`, `re-`, `genial`). Also avoid overly
45
+ colloquial imperatives even when they're grammatical: prefer
46
+ `espera` / `aguarda` over `aguanta`, `revisa` over `chequea`,
47
+ `observa` / `fíjate en` over `fijate`. Casual is OK; slangy is
48
+ not.
43
49
  - Address the tester by name if they introduced themselves; if not,
44
50
  the implicit second person from the verb is enough. No need to
45
51
  invent a stand-in pronoun.
46
52
  - Don't be condescending. If they ask for something that will
47
53
  break, say so directly.
54
+ ### Vocabulary translation (Spanish)
55
+
48
56
  - **Translate product vocabulary into Spanish, do NOT leave English
49
57
  loanwords embedded in Spanish prose.** When rendering tester-facing
50
58
  copy in Spanish, use these equivalences:
51
59
  - `kind` → `tipo` (skill-map talks about node "kinds"; in
52
60
  Spanish output the word is `tipo` / `tipos`, NOT "kinds").
53
- - `connector` → `conector`.
61
+ - `connector` / `edge` → `conector` (**NEVER** `arista`, even
62
+ though it's the common Spanish translation for graph edge;
63
+ skill-map's house word is `conector` everywhere — UI, docs,
64
+ CLI, conversation).
54
65
  - `watcher` → `observador` (or rephrase: "skill-map sigue tus
55
66
  cambios" instead of "el watcher detecta...").
56
67
  - `scan` (verb) → `escanear`; `scan` (noun) → `escaneo`.
@@ -60,10 +71,12 @@ optional second phase (~20-30 min) covering the rest of the CLI.
60
71
  - File paths, frontmatter keys (`name`, `description`, `event`,
61
72
  etc.), CLI verbs (`sm init`, `sm watch`), and code identifiers
62
73
  stay English — that's the public surface, not jargon.
63
- Anti-pattern (do NOT emit): "aparecen los otros cuatro kinds",
74
+ Anti-pattern (do NOT emit): "aparecen los otros tres kinds",
64
75
  "el watcher detectó el cambio", "vamos a hacer un scan ahora".
65
- Correct: "aparecen los otros cuatro tipos", "skill-map detectó
76
+ Correct: "aparecen los otros tres tipos", "skill-map detectó
66
77
  el cambio", "vamos a escanear ahora".
78
+ ### Silence during backstage work
79
+
67
80
  - **Stay silent during backstage work.** Do NOT narrate operational
68
81
  steps you're about to take or internal checks. Forbidden patterns
69
82
  include "Voy a verificar primero que el directorio esté listo",
@@ -76,6 +89,8 @@ optional second phase (~20-30 min) covering the rest of the CLI.
76
89
  do something, (b) a sub-step landed and you want a confirm, or
77
90
  (c) something failed and they need to know. Between those
78
91
  moments, work without commentary.
92
+ ### Glossing technical terms
93
+
79
94
  - **Explain technical terms in parentheses the first time you
80
95
  mention them in a tester-facing blockquote.** Assume the tester
81
96
  is non-technical; many will not know what `frontmatter`,
@@ -87,6 +102,8 @@ optional second phase (~20-30 min) covering the rest of the CLI.
87
102
  Internal narration in this SKILL.md does not need the gloss;
88
103
  this rule is purely about what the agent says to the tester.
89
104
  After the first mention in a session, the bare term is fine.
105
+ ### Tester-facing Markdown (blockquotes vs code blocks)
106
+
90
107
  - **Messages addressed to the tester are rendered as Markdown
91
108
  blockquotes** (lines prefixed with `> `): instructions, narrative
92
109
  context, numbered choice menus, prompts, confirmations. The
@@ -96,6 +113,8 @@ optional second phase (~20-30 min) covering the rest of the CLI.
96
113
  plain code blocks so the copy works cleanly. If a step has both
97
114
  narrative and a command, write the narrative in a blockquote
98
115
  *above* the bare code block (not inside it).
116
+ ### Language mirroring + fixture content
117
+
99
118
  - **Mirror the tester's language**: if the first message they wrote
100
119
  was in Spanish, run the conversation in neutral Spanish (per
101
120
  the Tone bullets above — `tú` form, no rioplatense); if in
@@ -129,48 +148,98 @@ optional second phase (~20-30 min) covering the rest of the CLI.
129
148
  demo needs this so the watcher has something to react to).
130
149
  - Read files to verify what the tester modified.
131
150
  - Everything else is run by the tester.
132
- - **Configuration files have two-mode access**: backstage setup
133
- vs teach moment.
134
- - **Backstage setup (you DO edit)**: right after `sm init` in
135
- Step 1, you append the tutorial's internal entries
136
- (`sm-tutorial.md`, `findings.md`, `tutorial-state.yml`,
137
- `sm-tutorial-report.md`, etc.) to the freshly created
138
- `.skillmapignore` with `Edit`. That is plumbing — the
139
- tester does not need to learn that the tutorial hides its
140
- own scaffolding from the scan. Do it silently and move on.
141
- - **Teach moment (you DO NOT edit)**: any time the SKILL
142
- calls for a change to `.skillmapignore`,
143
- `.skill-map/settings.json`,
144
- `.skill-map/settings.local.json`, or `.gitignore` AS PART
145
- OF A LESSON (e.g. Step 2.5 hides a
146
- private node by appending a pattern), you describe the
147
- edit in a blockquote and the tester applies it in their
148
- own editor. The pedagogical point is that those files
149
- belong to the user they need to internalise where they
150
- live and how to change them. Doing it for them in a
151
- teach moment defeats the lesson.
152
- 2. **After every command block, stop and wait.** The tester pastes
151
+ 2. **Configuration files have two-mode access**: backstage setup
152
+ vs teach moment.
153
+ - **Backstage setup (you DO edit)**: right after `sm init` in
154
+ Step 1, you append the tutorial's internal entries
155
+ (`sm-tutorial.md`, `findings.md`, `tutorial-state.yml`,
156
+ `sm-tutorial-report.md`, etc.) to the freshly created
157
+ `.skillmapignore` with `Edit`. That is plumbing — the
158
+ tester does not need to learn that the tutorial hides its
159
+ own scaffolding from the scan. Do it silently and move on.
160
+ - **Teach moment (you DO NOT edit)**: any time the SKILL
161
+ calls for a change to `.skillmapignore`,
162
+ `.skill-map/settings.json`,
163
+ `.skill-map/settings.local.json`, or `.gitignore` AS PART
164
+ OF A LESSON (e.g. Step 6 hides a private node by appending
165
+ a pattern), you describe the edit in a blockquote and the
166
+ tester applies it in their own editor. The pedagogical point
167
+ is that those files belong to the user — they need to
168
+ internalise where they live and how to change them. Doing it
169
+ for them in a teach moment defeats the lesson.
170
+ 3. **After every command block, stop and wait.** The tester pastes
153
171
  the output or replies "OK" / "done". Only then do you advance.
154
- 3. **Persist progress after every step.** Update
172
+ 4. **Persist progress after every step.** Update
155
173
  `tutorial-state.yml` with `done` / `failed` / `skipped` and a
156
174
  timestamp.
157
- 4. **If the tester reports anything weird**, offer to record it in
175
+ 5. **If the tester reports anything weird**, offer to record it in
158
176
  `findings.md` (in the cwd). Those are the bugs the team will read.
159
- 5. **One step at a time.** Finish, ask if they want to continue, do
177
+ 6. **One step at a time.** Finish, ask if they want to continue, do
160
178
  the next one.
161
- 6. **If `tutorial-state.yml` already exists in the cwd** when invoked,
179
+ 7. **If `tutorial-state.yml` already exists in the cwd** when invoked,
162
180
  do not overwrite anything. Read it, show progress, offer to
163
181
  *continue* or *start over* (the latter requires explicit
164
182
  confirmation and wipes the tutorial content).
165
- 7. **Mirror the tester's language**: see §Tone for the language rules
166
- (neutral Spanish `tú` form, NOT rioplatense — when the tester
167
- writes in Spanish; plain English otherwise). Fixture human prose
168
- also follows the tester's language, per the Tone bullet on fixture
169
- content. Internal instructions in this SKILL.md stay in English
170
- so any maintainer can read them. Blockquote literals in this
171
- document are the messages you actually say to the tester —
172
- translate them on the fly. Code blocks below them stay as bare
173
- ` ```bash ` fences (no `> ` prefix) so the tester can copy cleanly.
183
+ 8. **Mirror the tester's language** per §Tone. Internal narration
184
+ and code-block fences stay English regardless.
185
+ 9. **Never modify files outside the tutorial cwd.** Stay scoped to
186
+ the directory verified in pre-flight.
187
+ 10. **Never ask the tester to `cd` outside the tutorial cwd.** All
188
+ command blocks assume the second terminal is anchored to the
189
+ tutorial folder.
190
+ 11. **Never skip the level question when entering the deep-dive.**
191
+ The level drives modulation of every Step 8+ instruction.
192
+
193
+ ## Provider detection
194
+
195
+ Skill-map ships with three built-in providers, each one walks its
196
+ own on-disk convention:
197
+
198
+ | Provider | Base dir | Kinds it claims | Detect via env var(s) |
199
+ |----------------|-----------------------|--------------------------------|------------------------------------------------|
200
+ | `claude` | `.claude/` | `agent`, `command`, `skill` | `CLAUDECODE=1` OR `AI_AGENT` starts with `claude-code` |
201
+ | `gemini` | `.gemini/` | `agent`, `skill` | `GEMINI_CLI=1` OR `AI_AGENT` starts with `gemini` (any equivalent vendor var) |
202
+ | `agent-skills` | `.agents/skills/` | `skill` only (vendor-neutral) | no formal env yet; treat as opt-in if the tester says so |
203
+
204
+ **Decision logic, applied silently during pre-flight**:
205
+
206
+ 1. Inspect the agent's environment (`process.env` in your runtime).
207
+ 2. If a Claude-flavoured var is present → `provider = claude`,
208
+ `<provider_dir> = .claude`, supported kinds = `{agent, command,
209
+ skill}`.
210
+ 3. Else if a Gemini-flavoured var is present → `provider = gemini`,
211
+ `<provider_dir> = .gemini`, supported kinds = `{agent, skill}`.
212
+ 4. Else → **fallback to claude** AND surface one short blockquote
213
+ to the tester so they can correct course:
214
+
215
+ > Heads up: I couldn't detect which agent runtime is hosting
216
+ > me, so I'll demo skill-map's Claude provider (`.claude/`).
217
+ > If you actually use Gemini or agent-skills, tell me and I
218
+ > swap the fixture to `.gemini/` or `.agents/skills/`.
219
+
220
+ **Reality check (do not mention to the tester unless asked)**:
221
+ this SKILL.md lives at `.claude/skills/sm-tutorial/SKILL.md`, so
222
+ in practice only Claude Code loads it today. The detection logic
223
+ is wired so that the day mirrored skills land at
224
+ `.gemini/skills/sm-tutorial/` and `.agents/skills/sm-tutorial/`,
225
+ they reuse this same body and the fixture follows automatically.
226
+
227
+ ### Global substitution rule
228
+
229
+ The rest of this file says `.claude/<…>` as the canonical example
230
+ because that is the 100% case today. **Wherever you see
231
+ `.claude/`, swap it for the detected `<provider_dir>` when writing
232
+ the fixture, when showing the tester commands, when computing the
233
+ expected node count, and when listing files for the start-over
234
+ wipe.** Also: **skip any sub-step whose kind is not in the
235
+ provider's supported set** (e.g. on `gemini`, skip the
236
+ `demo-command` file in Step 3 and the `demo-command → demo-skill`
237
+ connector in Step 5; on `agent-skills`, skip both `demo-agent`
238
+ and `demo-command` and demo only the skill + the markdown note).
239
+
240
+ Persist `provider` into `tutorial-state.yml` (top-level
241
+ `provider: <id>` field) so a resumed session does not have to
242
+ re-detect.
174
243
 
175
244
  ## Pre-flight
176
245
 
@@ -192,6 +261,9 @@ ls -A
192
261
  user content — they're internal infrastructure of the skill itself):
193
262
 
194
263
  - `.claude` — skills/agents infrastructure.
264
+ - `.tmp` — Claude Code scratch directory; created automatically
265
+ when the harness starts, has nothing to do with the tester.
266
+ Ignore whether it exists or not.
195
267
  - `SKILL.md` — a loose copy of the skill.
196
268
  - `sm-tutorial.md` — the skill copy materialised by `sm tutorial`.
197
269
  - `tutorial-state.yml` — resume mode (see §Resume / restart).
@@ -301,17 +373,17 @@ later when they're relevant. Keep it to a single short sentence:
301
373
 
302
374
  > Quick heads-up before we start: I'm about to set up the
303
375
  > tutorial scenario in this directory — that means creating a
304
- > handful of files. Hold on while I finish.
376
+ > handful of files. Please wait a moment while I finish.
305
377
 
306
378
  Then proceed straight to the writes below — no pause, no "ready?"
307
379
  prompt.
308
380
 
309
- The tutorial builds the graph **progressively** in five sub-steps during
310
- Step 2 (Live UI). Right now, in pre-flight, you only create **one
311
- file** — a single agent — so the tester's first look at the UI
312
- shows exactly one node. The other four kinds (skill, command, hook,
313
- note) and the connectors between all five are added later, one
314
- sub-step at a time.
381
+ The tutorial builds the graph **progressively** across Steps 2-6
382
+ (the live UI block). Right now, in pre-flight, you only create
383
+ **one file** — a single agent — so the tester's first look at the
384
+ UI shows exactly one node. The other three nodes (skill, command,
385
+ note) and the connectors between all four are added later, one
386
+ step at a time.
315
387
 
316
388
  ```
317
389
  <cwd>/
@@ -323,7 +395,7 @@ sub-step at a time.
323
395
  ```
324
396
 
325
397
  `.claude/agents/demo-agent.md` (no cross-fixture links yet — those
326
- arrive in Step 2.4):
398
+ arrive in Step 5):
327
399
  ```markdown
328
400
  ---
329
401
  name: demo-agent
@@ -333,8 +405,6 @@ description: |
333
405
  Live UI step.
334
406
  tools: [Read, Bash]
335
407
  model: sonnet
336
- metadata:
337
- version: "1.0.0"
338
408
  ---
339
409
 
340
410
  # demo-agent
@@ -369,6 +439,7 @@ tutorial:
369
439
  started_at: "<ISO-8601 now>"
370
440
  cwd: "<output of pwd>"
371
441
  sm_version: "<output of sm version>"
442
+ provider: "<claude | gemini | agent-skills>" # filled from §Provider detection
372
443
  tester:
373
444
  level: 2 # default; only asked if they advance into the deep-dive
374
445
  route:
@@ -384,36 +455,48 @@ short_steps:
384
455
  - id: "1-init"
385
456
  title: "sm init"
386
457
  status: "pending"
387
- - id: "2-ui-live"
388
- title: "⭐ Live UI: bare sm + live edits by the agent"
458
+ - id: "2-live-boot"
459
+ title: "⭐ Live UI: the lone agent"
460
+ status: "pending"
461
+ - id: "3-live-kinds"
462
+ title: "⭐ Live UI: the other three kinds appear"
389
463
  status: "pending"
390
- - id: "3-handoff"
464
+ - id: "4-live-edit"
465
+ title: "⭐ Live UI: your first edit"
466
+ status: "pending"
467
+ - id: "5-live-connectors"
468
+ title: "⭐ Live UI: the connectors light up"
469
+ status: "pending"
470
+ - id: "6-live-ignore"
471
+ title: "⭐ Live UI: silence via .skillmapignore"
472
+ status: "pending"
473
+ - id: "7-handoff"
391
474
  title: "Wrap-up of the demo and offer to keep going"
392
475
  status: "pending"
393
476
  long_steps:
394
- - id: "4-tester-edits"
477
+ - id: "8-tester-edits"
395
478
  title: "Tester edits live (extends the UI demo)"
396
479
  status: "pending"
397
- - id: "5-cli-browse"
480
+ - id: "9-cli-browse"
398
481
  title: "Browse CLI: list / show / check"
399
482
  status: "pending"
400
483
  verbs: ["sm list", "sm show", "sm check"]
401
- - id: "6-ascii"
484
+ - id: "10-ascii"
402
485
  title: "ASCII: graph + export"
403
486
  status: "pending"
404
487
  verbs: ["sm graph", "sm export"]
405
- - id: "7-issues"
488
+ - id: "11-issues"
406
489
  title: "Issues: broken refs"
407
490
  status: "pending"
408
491
  verbs: ["sm check", "sm check --analyzers broken-ref",
409
492
  "sm check --json"]
410
- - id: "8-plugins"
493
+ - id: "12-plugins"
411
494
  title: "Plugins"
412
495
  status: "pending"
413
496
  verbs: ["sm plugins list", "sm plugins show",
414
497
  "sm plugins doctor", "sm plugins enable",
415
498
  "sm plugins disable"]
416
- - id: "9-annotations"
499
+ - id: "13-annotations"
417
500
  title: "Annotations and the .sm consent prompt"
418
501
  status: "pending"
419
502
  verbs: ["sm sidecar annotate"]
@@ -422,6 +505,14 @@ findings_file: "./findings.md"
422
505
 
423
506
  ## Per-step cycle
424
507
 
508
+ Before Step 1's announcement, call `TaskCreate` once with one task
509
+ per entry in `tutorial-state.yml` (`short_steps`, plus `long_steps`
510
+ if the deep-dive is accepted later). Update each task to
511
+ `in_progress` when its block begins and `completed` when it ends —
512
+ the harness task list gives the tester a live "where am I" view
513
+ during the session, while `tutorial-state.yml` remains the
514
+ cross-session source of truth for pause/resume.
515
+
425
516
  For every step in the tutorial:
426
517
 
427
518
  1. **Announcement**: "Step N: `<title>`. ~M minutes." One sentence
@@ -478,32 +569,14 @@ dump.sql
478
569
 
479
570
  Mark `1-init: done`.
480
571
 
481
- ### Step 2 — ⭐ Live UI (4-5 min)
572
+ ### Step 2 — ⭐ Live UI: the lone agent (~1 min)
482
573
 
483
574
  **Context**: typing `sm` alone (no arguments) in an initialised dir
484
575
  starts the UI server with the watcher built in. One process, one
485
576
  terminal: it boots the server, scans the `.md` files, detects
486
- changes, and pushes events over WebSocket to the live UI.
487
-
488
- This step has **five sub-steps** (2.1 through 2.5), each one driven
489
- by you editing files while the server stays up — except Step 2.3,
490
- where the tester takes the keyboard for the first time.
491
-
492
- 1. **Step 2.1 (boot)** — one node alone (the agent).
493
- 2. **Step 2.2 (kinds)** — the four other kinds appear as new nodes,
494
- still unconnected.
495
- 3. **Step 2.3 (your first edit)** — the **tester** edits the
496
- `description` of the agent's `.md` and watches the card
497
- refresh in the graph.
498
- 4. **Step 2.4 (connectors)** — the connectors light up between all
499
- five nodes.
500
- 5. **Step 2.5 (ignore)** — a private file appears, then disappears
501
- the moment a pattern is added to `.skillmapignore`.
502
-
503
- The pedagogical arc: a single dot → a constellation of dots →
504
- your own edit lands → graph → a graph that respects the user's
505
- ignore list. Each sub-step stops at a confirm prompt before you do
506
- the next.
577
+ changes, and pushes events over WebSocket to the live UI. The next
578
+ five steps (2-6) all run against the same `sm` session — you boot
579
+ it here and keep it alive through Step 6.
507
580
 
508
581
  **Command** (one terminal):
509
582
 
@@ -511,8 +584,8 @@ the next.
511
584
  sm
512
585
  ```
513
586
 
514
- Before Step 2.1, ask the tester to set up a **side-by-side view** so
515
- they can watch the magic happen without alt-tabbing every sub-step.
587
+ Before launching, ask the tester to set up a **side-by-side view** so
588
+ they can watch the magic happen without alt-tabbing every step.
516
589
  Tell the tester:
517
590
 
518
591
  > Now arrange your screen so the **browser** (where the graph will
@@ -534,11 +607,7 @@ truth (it logs the bound `http://host:port` after listen):
534
607
  > UI is listening — copy that link and open it in the browser you
535
608
  > just arranged. Tell me when you see the page load.
536
609
 
537
- Wait for confirmation that the page loaded.
538
-
539
- #### Step 2.1 — the lone agent
540
-
541
- Tell the tester:
610
+ Wait for confirmation that the page loaded. Then tell the tester:
542
611
 
543
612
  > You'll see exactly **one node** in the graph: `demo-agent` (kind
544
613
  > `agent`). That's our starting point.
@@ -552,16 +621,22 @@ Tell the tester:
552
621
  >
553
622
  > Did the node show up?
554
623
 
555
- Wait for confirmation.
624
+ Wait for confirmation. Mark `2-live-boot: done`.
556
625
 
557
- #### Step 2.2 — the other four kinds appear (the magic)
626
+ ### Step 3Live UI: the other three kinds appear (~1 min)
558
627
 
559
628
  Leave the browser open and the terminal with `sm` running. You
560
- create the four missing kinds **without any cross-fixture links**
561
- yet — pure standalone nodes — so the tester sees four new dots pop
629
+ create three more nodes **without any cross-fixture links**
630
+ yet — pure standalone nodes — so the tester sees three new dots pop
562
631
  in.
563
632
 
564
- Create these four files (with `Write`), exactly in this order:
633
+ Create these three files (with `Write`), exactly in this order.
634
+ Per §Provider detection, **substitute `.claude/` with the
635
+ detected `<provider_dir>` and skip files whose kind is not in the
636
+ provider's supported set** (`gemini`: skip `demo-command`;
637
+ `agent-skills`: skip both `demo-agent` and `demo-command`, only
638
+ the skill + the markdown note remain). Adjust the node count and
639
+ the "three new nodes" message in the blockquote below accordingly:
565
640
 
566
641
  1. `.claude/skills/demo-skill/SKILL.md` (kind: skill):
567
642
  ```markdown
@@ -579,8 +654,6 @@ Create these four files (with `Write`), exactly in this order:
579
654
  - name: report
580
655
  type: string
581
656
  description: Markdown summary.
582
- metadata:
583
- version: "1.0.0"
584
657
  ---
585
658
 
586
659
  # demo-skill
@@ -607,8 +680,6 @@ Create these four files (with `Write`), exactly in this order:
607
680
  type: path
608
681
  description: File the command will hand off to the skill.
609
682
  required: true
610
- metadata:
611
- version: "1.0.0"
612
683
  ---
613
684
 
614
685
  # demo-command
@@ -617,44 +688,16 @@ Create these four files (with `Write`), exactly in this order:
617
688
  target file. Connectors land in the next sub-step.
618
689
  ```
619
690
 
620
- 3. `.claude/hooks/demo-hook.md` — **don't skip this one**, the
621
- fields differ on purpose so the body reads like a real hook
622
- manifest. The CLI classifies it as `kind: markdown` today
623
- (the catch-all kind for `.md` files outside the
624
- skill / agent / command folders); a dedicated `hook` kind
625
- is on the roadmap:
626
- ```markdown
627
- ---
628
- name: demo-hook
629
- description: |
630
- Example hook that fires when a subagent stops. Showcases the
631
- `hook` kind in the demo graph.
632
- event: SubagentStop
633
- blocking: false
634
- idempotent: true
635
- metadata:
636
- version: "1.0.0"
637
- ---
638
-
639
- # demo-hook
640
-
641
- Fires when a subagent terminates. Records the closure. Will get
642
- wired into the rest of the fixture next.
643
- ```
644
-
645
- 4. `notes/todo.md` — also classified as `kind: markdown` today
646
- (same catch-all as the hook above; a dedicated `note` kind
647
- is on the roadmap):
691
+ 3. `notes/todo.md` — classified as `kind: markdown` today
692
+ (the catch-all for `.md` files outside the
693
+ skill / agent / command folders):
648
694
  ```markdown
649
695
  ---
650
696
  name: Demo TODO list
651
697
  description: |
652
698
  Live list of things to review in the demo. Will become the
653
- hub between skill / agent / command / hook in the next
654
- sub-step.
699
+ hub between skill / agent / command in the next sub-step.
655
700
  tags: [notes, demo]
656
- metadata:
657
- version: "1.0.0"
658
701
  ---
659
702
 
660
703
  # Pending
@@ -662,23 +705,23 @@ Create these four files (with `Write`), exactly in this order:
662
705
 
663
706
  Tell the tester:
664
707
 
665
- > Look at the browser. Four new nodes should have popped in:
666
- > `demo-skill`, `demo-command`, `demo-hook`, and
667
- > `notes/todo`. Five total now, **still unconnected** — they're
668
- > floating dots. The viewport auto-fits whenever a node is added or
669
- > removed, so all five should be visible without panning.
708
+ > Look at the browser. Three new nodes should have popped in:
709
+ > `demo-skill`, `demo-command`, and `notes/todo`. Four total now,
710
+ > **still unconnected** — they're floating dots. The viewport
711
+ > auto-fits whenever a node is added or removed, so all four
712
+ > should be visible without panning.
670
713
  >
671
- > Did the four appear? Confirm so we can wire them up.
714
+ > Did the three appear? Confirm so we can wire them up.
672
715
 
673
- Wait for confirmation.
716
+ Wait for confirmation. Mark `3-live-kinds: done`.
674
717
 
675
- #### Step 2.3 — your first edit
718
+ ### Step 4Live UI: your first edit (~1 min)
676
719
 
677
720
  Up to here you've been watching the agent write files. Now hand
678
721
  the keyboard over: the lesson is that the watcher reacts to
679
722
  **any** `.md` edit under the cwd, not just to files the agent
680
723
  authors. After this beat, the tester has the muscle memory for
681
- "save → graph updates", which Step 2.5 (`.skillmapignore`) reuses
724
+ "save → graph updates", which Step 6 (`.skillmapignore`) reuses
682
725
  verbatim.
683
726
 
684
727
  Tell the tester:
@@ -697,85 +740,74 @@ Tell the tester:
697
740
  >
698
741
  > Watch the browser. The `demo-agent` card should refresh its
699
742
  > description in real time, no reload, no Ctrl+C — same watcher
700
- > that picked up the four new nodes a moment ago, this time
743
+ > that picked up the three new nodes a moment ago, this time
701
744
  > reacting to YOUR edit.
702
745
  >
703
- > Confirm so we wire the five up.
746
+ > Confirm so we wire the four up.
704
747
 
705
748
  Wait for confirmation. You MAY use `Read` on the file afterwards
706
749
  to verify the change landed (read-only, allowed under Inviolable
707
- rule #1) before moving on.
750
+ rule #1) before moving on. Mark `4-live-edit: done`.
708
751
 
709
- #### Step 2.4 — the connectors light up
752
+ ### Step 5Live UI: the connectors light up (~1 min)
710
753
 
711
754
  Now you edit the existing files to add the cross-fixture links —
712
755
  each one becomes a connector in the graph. Apply with `Edit` (do
713
- not rewrite the files):
714
-
715
- 1. **Edit `.claude/agents/demo-agent.md`** — append before the
716
- `Rules:` line (or at the end):
717
- ```markdown
718
- When the session closes, fires the
719
- [demo-hook](../hooks/demo-hook.md).
720
- ```
721
- 2. **Edit `.claude/skills/demo-skill/SKILL.md`** — append at the
756
+ not rewrite the files). Per §Provider detection, **swap `.claude/`
757
+ for the detected `<provider_dir>` and skip any sub-step whose
758
+ target node was not created in Step 3** (no `demo-command` on
759
+ gemini skip sub-step #2 and the `demo-command → demo-skill`
760
+ connector; on agent-skills there is no agent and no command →
761
+ keep only `notes/todo demo-skill`):
762
+
763
+ 1. **Edit `.claude/skills/demo-skill/SKILL.md`** — append at the
722
764
  very end:
723
765
  ```markdown
724
766
  When it needs to delegate heavier work it leans on the
725
767
  [demo-agent](../../agents/demo-agent.md).
726
768
  ```
727
- 3. **Edit `.claude/commands/demo-command.md`** — append at the
769
+ 2. **Edit `.claude/commands/demo-command.md`** — append at the
728
770
  very end:
729
771
  ```markdown
730
772
  Triggers the [demo-skill](../skills/demo-skill/SKILL.md) on the
731
773
  given target.
732
774
  ```
733
- 4. **Edit `.claude/hooks/demo-hook.md`** — append at the very end:
734
- ```markdown
735
- See [pending items](../../notes/todo.md) for operational
736
- context.
737
- ```
738
- 5. **Edit `notes/todo.md`** — append these two bullets after the
775
+ 3. **Edit `notes/todo.md`** — append this bullet after the
739
776
  `# Pending` heading:
740
777
  ```markdown
741
778
  - [ ] Polish the
742
779
  [demo-skill](../.claude/skills/demo-skill/SKILL.md)
743
780
  prompt.
744
- - [ ] Confirm the `event` of the
745
- [demo-hook](../.claude/hooks/demo-hook.md).
746
781
  ```
747
782
 
748
783
  Tell the tester:
749
784
 
750
- > Look at the magic again. The five floating nodes should now be
785
+ > Look at the magic again. The four floating nodes should now be
751
786
  > wired together — connectors light
752
787
  > up between them as the watcher picks up each edit:
753
788
  >
754
789
  > - `demo-skill → demo-agent`
755
- > - `demo-agent → demo-hook`
756
790
  > - `demo-command → demo-skill`
757
- > - `demo-hooknotes/todo`
758
- > - `notes/todo → demo-skill`, `notes/todo → demo-hook`
791
+ > - `notes/tododemo-skill`
759
792
  >
760
793
  > Confirm. If a connector is missing, refresh the browser and tell
761
794
  > me.
762
795
 
763
- Wait for confirmation. **Do NOT move on to Step 2.5** until the
764
- connectors are confirmed visible — Step 2.5 reuses the same live UI
765
- session.
796
+ Wait for confirmation. **Do NOT move on to Step 6** until the
797
+ connectors are confirmed visible — Step 6 reuses the same live UI
798
+ session. Mark `5-live-connectors: done`.
766
799
 
767
- #### Step 2.5 — silence a private file via `.skillmapignore`
800
+ ### Step 6Live UI: silence a private file via `.skillmapignore` (~2 min)
768
801
 
769
- The first four sub-steps showed the watcher picking up new files and
770
- edits (yours and theirs). Step 2.5 flips the direction: a file the
771
- tester DOES NOT want
772
- in the graph (a draft, a scratch file, a secret) gets hidden by a
773
- single line in `.skillmapignore`. Same live mechanism — no restart.
802
+ Steps 2-5 showed the watcher picking up new files and edits (yours
803
+ and theirs). Step 6 flips the direction: a file the tester DOES NOT
804
+ want in the graph (a draft, a scratch file, a secret) gets hidden by
805
+ a single line in `.skillmapignore`. Same live mechanism no restart.
774
806
 
775
807
  `sm init` already wrote a starter `.skillmapignore` at the scope
776
- root. The flow has three sub-steps:
808
+ root. The flow has three beats:
777
809
 
778
- **Step 2.5.1 — you create one new fixture file (the agent does this).**
810
+ **Beat 1 — you create one new fixture file (the agent does this).**
779
811
 
780
812
  `Write` `notes/private-credentials.md` — kind `note`, simulates a
781
813
  file the tester would never want surfacing publicly:
@@ -787,8 +819,6 @@ description: |
787
819
  Personal API tokens — exists in the repo but should not show
788
820
  up in the skill-map graph. Demonstrates the .skillmapignore
789
821
  flow.
790
- metadata:
791
- version: "0.0.1"
792
822
  ---
793
823
 
794
824
  # Private
@@ -800,7 +830,7 @@ Confirm the file appears in the graph as a sixth node
800
830
  (`notes/private-credentials`). The watcher sees it like any
801
831
  other `.md` — that's the point of the demo.
802
832
 
803
- **Step 2.5.2 — you show the project structure (the agent does this).**
833
+ **Beat 2 — you show the project structure (the agent does this).**
804
834
 
805
835
  Before asking the tester to touch `.skillmapignore`, give them a
806
836
  mental map of the folder so they know where the file lives and
@@ -815,7 +845,6 @@ the tester sees what their cwd holds:
815
845
  > ├── .claude/
816
846
  > │ ├── agents/demo-agent.md
817
847
  > │ ├── commands/demo-command.md
818
- > │ ├── hooks/demo-hook.md
819
848
  > │ └── skills/demo-skill/SKILL.md
820
849
  > ├── .skill-map/ ← project DB + settings (managed)
821
850
  > ├── .skillmapignore ← the file we're about to edit
@@ -833,9 +862,9 @@ Adjust the actual tree shown to whatever `ls -la` returns — the
833
862
  goal is "tester recognises their own filesystem", not a copy of
834
863
  the snippet above.
835
864
 
836
- **Step 2.5.3 — the tester edits `.skillmapignore` (NOT the agent).**
865
+ **Beat 3 — the tester edits `.skillmapignore` (NOT the agent).**
837
866
 
838
- Per Inviolable rule #1, you DO NOT touch `.skillmapignore` with
867
+ Per Inviolable rule #2, the agent does NOT touch `.skillmapignore` with
839
868
  your `Edit` tool. Tell the tester to do it from their editor:
840
869
 
841
870
  > Last step. Open `.skillmapignore` (it's at the cwd root) in
@@ -854,8 +883,8 @@ your `Edit` tool. Tell the tester to do it from their editor:
854
883
  >
855
884
  > Watch the browser when you save. The
856
885
  > `notes/private-credentials` node should disappear from the
857
- > graph in real time, without restarting anything. Six nodes
858
- > back to five.
886
+ > graph in real time, without restarting anything. Five nodes
887
+ > back to four.
859
888
  >
860
889
  > Did the node vanish?
861
890
 
@@ -865,20 +894,32 @@ verify the appended pattern landed correctly (in case
865
894
  allowed. Once confirmed, ask them to stop the server with
866
895
  **Ctrl+C** in the terminal before continuing.
867
896
 
868
- Mark `2-ui-live: done`.
897
+ Mark `6-live-ignore: done`.
869
898
 
870
- ### Step 3 — Wrap-up of the demo and offer to keep going (30 s)
899
+ ### Step 7 — Wrap-up of the demo and offer to keep going (30 s)
871
900
 
872
901
  > All set! That's the heart of skill-map: you edit a `.md` and the
873
902
  > UI sees it instantly. In **~10 minutes** you've already seen the
874
903
  > full flow.
875
904
  >
876
- > ⚠️ **`.sm` files (heads-up for later)** — when skill-map needs to
877
- > record metadata on a node, it doesn't modify the `.md` directly;
878
- > it creates a sibling file with `.sm` extension (e.g. `demo-agent.sm`
879
- > next to `demo-agent.md`). You won't see any during this demo — they
880
- > only appear after `sm bump` or `sm sidecar annotate`. Commit them
881
- > to git like any other source file.
905
+ > ⚠️ **`.sm` files (heads-up for later)** — every `.md` skill-map
906
+ > tracks has a sibling `.sm` file (e.g. `demo-agent.sm` next to
907
+ > `demo-agent.md`) that carries **all of the tool's metadata
908
+ > about that markdown, so your `.md` stays clean and uncluttered**.
909
+ > Version, history, tags, annotations, anything that does not
910
+ > belong in the human-authored body lives in the `.sm`. You write
911
+ > the `.md` for Claude or for humans, the tool writes the `.sm`.
912
+ > Each `sm bump` and each `sm sidecar annotate` creates or
913
+ > refreshes one, so you'll see them often as you use skill-map
914
+ > day to day. Commit them to git like any other source file.
915
+ >
916
+ > 🔀 **Multi-provider** — this demo ran with the
917
+ > `<provider>` provider (base dir `<provider_dir>`). Skill-map
918
+ > walks two other built-in conventions with identical mechanics:
919
+ > Gemini lives under `.gemini/` (kinds: agent + skill), and the
920
+ > open agent-skills standard lives under `.agents/skills/` (kind:
921
+ > skill). Drop a `.md` in any of those and the same watcher
922
+ > picks it up, the same connectors light up, the same rules run.
882
923
  >
883
924
  > If you want, **we can keep going deeper**: I'll walk you through
884
925
  > the CLI verbs and flags (`list`, `graph`, `export`, `orphans`,
@@ -923,10 +964,12 @@ Save into `tester.level` and modulate:
923
964
  - **Level 3**: dense blocks, flags included, no explanations of
924
965
  basic concepts.
925
966
 
926
- ### Step 4 — Tester edits live (~3 min)
967
+ ### Step 8 — Tester edits live (~3 min)
927
968
 
928
- **Context**: in the demo you edited. Now it's their turn to confirm
929
- they can do it from their editor.
969
+ **Context**: Step 4 had the tester edit a scalar (`description`)
970
+ and watch the inspector card refresh. Step 8 raises the bar: edit
971
+ a Markdown link and watch the GRAPH TOPOLOGY change (a connector
972
+ disappears). Same watcher, different surface.
930
973
 
931
974
  This step needs the server running. **Check first** before asking
932
975
  them to launch it: many testers leave it running from Step 2 and
@@ -947,7 +990,7 @@ You verify by reading `.claude/skills/demo-skill/SKILL.md` to confirm
947
990
  the change was applied. Once they confirm, ask them to **Ctrl+C**
948
991
  the server.
949
992
 
950
- ### Step 5 — Browse CLI: list / show / check (~3 min)
993
+ ### Step 9 — Browse CLI: list / show / check (~3 min)
951
994
 
952
995
  ```bash
953
996
  sm list
@@ -958,17 +1001,16 @@ sm show .claude/skills/demo-skill/SKILL.md
958
1001
  sm check
959
1002
  ```
960
1003
 
961
- Expected: you see the 5 fixture nodes listed with their kind:
1004
+ Expected: you see the 4 fixture nodes listed with their kind:
962
1005
  `demo-skill` (skill), `demo-agent` (agent), `demo-command`
963
- (command), and `demo-hook` + `notes/todo` (both `markdown`
964
- the catch-all per Step 2.2). `check` reads the persisted
1006
+ (command), and `notes/todo` (`markdown`, the catch-all per
1007
+ Step 3). `check` reads the persisted
965
1008
  `scan_issues` table — it does NOT re-walk the filesystem. The
966
- fixture is clean (the watcher in Step 2 captured the latest
967
- state before Ctrl+C), so the verb prints `✓ No issues`. We will
968
- plant one in Step 7 and watch the rule catch it after a fresh
969
- `sm scan`.
1009
+ fixture is clean (Steps 2-6 captured the latest state before
1010
+ Ctrl+C), so the verb prints `✓ No issues`. We will plant one in
1011
+ Step 11 and watch the rule catch it after a fresh `sm scan`.
970
1012
 
971
- ### Step 6 — ASCII: graph + export (~3 min)
1013
+ ### Step 10 — ASCII: graph + export (~3 min)
972
1014
 
973
1015
  ```bash
974
1016
  sm graph
@@ -986,7 +1028,7 @@ within a key, AND across keys) and a `--format` of `md` or
986
1028
  segment, `**` spans segments) so `path=notes/**` cleanly
987
1029
  captures the notes folder regardless of the catch-all kind.
988
1030
 
989
- ### Step 7 — Issues: broken refs (~3 min)
1031
+ ### Step 11 — Issues: broken refs (~3 min)
990
1032
 
991
1033
  `broken-ref` is one of the deterministic rules `sm check` runs.
992
1034
  We'll plant one and watch it surface — that's the easiest way to
@@ -999,13 +1041,9 @@ Ask the tester to **append one bullet** to `notes/todo.md`:
999
1041
  - [ ] Document the [flow diagram](./missing-page.md).
1000
1042
  ```
1001
1043
 
1002
- `./missing-page.md` deliberately doesn't exist. Save the file.
1003
-
1004
- The watcher was stopped at the end of Step 4, so the persisted
1005
- `scan_issues` table still reflects the pre-edit state. `sm check`
1006
- reads from that table without re-walking, so a bare `sm check`
1007
- right now would still print `✓ No issues`. Run `sm scan` first
1008
- to refresh the snapshot:
1044
+ `./missing-page.md` deliberately doesn't exist. Save the file,
1045
+ then run `sm scan` first to refresh the snapshot before
1046
+ checking:
1009
1047
 
1010
1048
  ```bash
1011
1049
  sm scan
@@ -1021,70 +1059,70 @@ emits the structured payload (useful for CI / scripting). When
1021
1059
  done, the tester can leave the bullet in place or delete it — the
1022
1060
  rest of the deep-dive doesn't depend on it.
1023
1061
 
1024
- > **Heads up about scope** (mention only if the tester asks):
1062
+ If the tester asks about `sm orphans` vs `sm check`, see
1063
+ §Scope clarifications.
1064
+
1065
+ ### Step 12 — Plugins (~3 min)
1066
+
1067
+ **Context — present plugins to the tester before any command runs.**
1068
+ This is the official welcome to the plugin world; many testers will
1069
+ not have considered that skill-map is extensible at all. Frame it
1070
+ like this in a blockquote (translate to the tester's language per
1071
+ the standard rules):
1072
+
1073
+ > Plugins are how skill-map gets extended. The kernel ships with a
1074
+ > small set of built-in plugins out of the box, but anyone can
1075
+ > write their own and drop them into the project — `sm plugins
1076
+ > create` scaffolds a manifest and the stubs, so there is no
1077
+ > handwritten boilerplate to start from.
1025
1078
  >
1026
- > - `sm check` reports broken-refs and other rule-driven issues
1027
- > (the deterministic catalog).
1028
- > - `sm orphans` is a **different scope**: auto-rename / orphan-node
1029
- > detection (a node whose file disappeared, or a candidate rename
1030
- > the kernel is still unsure about). Our fixture doesn't produce
1031
- > orphans of that kind, so `sm orphans` will print "No orphan /
1032
- > auto-rename issues" — that's expected, not a bug.
1079
+ > The kernel exposes **six** plugin types you can implement:
1080
+ >
1081
+ > - **extractors** find links and references inside markdown.
1082
+ > - **analyzers** rules that surface issues on a node.
1083
+ > - **actions** — verbs the user can run on a node (e.g. `bump`).
1084
+ > - **hooks** fire on lifecycle events (scan started, finished,
1085
+ > …).
1086
+ > - **formatters** — render outputs in different shapes (text,
1087
+ > JSON, custom).
1088
+ > - **providers** — declare new node kinds and where to look for
1089
+ > them.
1090
+ >
1091
+ > Let's look at what's installed right now.
1033
1092
 
1034
- ### Step 8 — Plugins (~3 min)
1093
+ Then run the commands:
1035
1094
 
1036
1095
  ```bash
1037
1096
  sm plugins list
1038
1097
  sm plugins doctor
1039
- sm plugins show core/external-url-counter
1098
+ sm plugins show core
1040
1099
  sm plugins disable core/external-url-counter
1041
1100
  sm plugins list # confirm it shows as disabled
1042
1101
  sm plugins enable core/external-url-counter
1043
1102
  ```
1044
1103
 
1045
- > **About `plugins doctor` warnings on a clean fixture**: `doctor` may
1046
- > emit 1-2 informational warnings about `explorationDir` not existing
1047
- > for `gemini/gemini` (`~/.gemini`) or `agent-skills/agent-skills`
1048
- > (`.agents`). These are normal on a machine that has not installed
1049
- > those tools — the providers declare optional discovery paths and
1050
- > warn when the path is absent. Nothing is broken; the providers just
1051
- > have nothing to scan.
1052
-
1053
- > **About `sm plugins show <qualified-id>`**: the verb is
1054
- > informational — passing `core/external-url-counter` validates the
1055
- > extension exists and then renders the **parent bundle's** detail
1056
- > (i.e. the full `core` listing). The extension you named lives in
1057
- > that list. This is deliberate: forcing the user to type the bundle
1058
- > id just to read a single extension's manifest would be hostile, so
1059
- > `show` accepts the qualified shape and resolves up. Use
1060
- > `sm plugins doctor` or scroll the bundle's extension table to spot
1061
- > the one you queried.
1062
-
1063
- > **About IDs for `disable` / `enable`**: those verbs accept either a
1064
- > **bundle id** (e.g. `claude`, which toggles every Claude extension
1065
- > at once) or a **qualified extension id** `<bundle>/<ext-id>` (e.g.
1066
- > `core/external-url-counter`). The display format you see in
1067
- > `plugins list` (`extractor:core/external-url-counter@1.0.0`)
1068
- > includes the kind prefix and the version for readability — strip
1069
- > both when passing the id to `disable` / `enable`. Per-extension
1070
- > toggles only work on extension-granularity bundles like `core`;
1071
- > the `claude` bundle is bundle-granularity and only accepts the
1072
- > bundle id.
1073
-
1074
- We pick `core/external-url-counter` because disabling it has the
1075
- smallest blast radius (one extractor that doesn't run, easily
1076
- re-enabled). Avoid disabling `claude` for this demo — it would kill
1077
- all Claude-kind extraction during the window.
1104
+ If the tester asks about `plugins doctor` warnings, `plugins show`
1105
+ behavior, or which id format `disable` / `enable` accept, see
1106
+ §Scope clarifications.
1078
1107
 
1079
1108
  If `plugins list` shows zero entries (depends on the build), tell
1080
1109
  the tester no plugins are installed yet and offer to skip.
1081
1110
 
1082
- ### Step 9 — Annotations and the `.sm` consent prompt (~3 min)
1083
-
1084
- **Context**: skill-map keeps a small **companion file** (extension
1085
- `.sm`) next to each `.md` to track its version, history, and tags.
1086
- The first time skill-map wants to write one in a new project it asks
1087
- for your consent it never touches your filesystem without
1111
+ ### Step 13 — Annotations and the `.sm` consent prompt (~3 min)
1112
+
1113
+ **Context**: every `.md` skill-map tracks gets a sibling
1114
+ **companion file** with extension `.sm` that carries **all of
1115
+ the tool's metadata about that markdown, so your `.md` stays
1116
+ clean and uncluttered**. Version, history, tags, annotations,
1117
+ anything that does not belong in the human-authored body lives
1118
+ in the `.sm`. The `.md` is content you write for Claude or
1119
+ humans; the `.sm` is bookkeeping the tool writes. They are
1120
+ ordinary source files, committed to git like everything else,
1121
+ and you'll encounter them often once you start working with
1122
+ the project.
1123
+
1124
+ The first time skill-map wants to write one in a new project it
1125
+ asks for your consent — it never touches your filesystem without
1088
1126
  permission. After you say yes, the choice persists per-checkout
1089
1127
  (gitignored) and the prompt never appears again.
1090
1128
 
@@ -1109,26 +1147,74 @@ cat .skill-map/settings.local.json
1109
1147
 
1110
1148
  **Why the prompt?** The choice is **per-user, per-project** — stored
1111
1149
  in the gitignored `settings.local.json` so each contributor consents
1112
- independently and nothing about the choice travels via the repo. On a
1113
- CI / non-interactive session, pass `--yes` to grant up-front.
1150
+ independently and nothing about the choice travels via the repo.
1151
+ Once accepted, the flag stays set and skill-map will never ask
1152
+ again on this checkout (the next `sm sidecar annotate` or `sm bump`
1153
+ goes through silently). On a CI / non-interactive session, pass
1154
+ `--yes` to grant up-front.
1114
1155
 
1115
- **Try this**: delete `notes/todo.sm` and re-run the command — this
1116
- time it goes through silently because the flag is already set:
1156
+ If the tester asks about `sm bump` vs `sm sidecar annotate` vs
1157
+ `sm sidecar refresh`, see §Scope clarifications.
1117
1158
 
1118
- ```bash
1119
- rm notes/todo.sm
1120
- sm sidecar annotate notes/todo.md
1121
- ```
1122
-
1123
- Expected: same scaffold reappears, no prompt.
1159
+ ---
1124
1160
 
1125
- > **Heads up about scope** (mention only if the tester asks):
1126
- >
1127
- > - `sm sidecar annotate` is the scaffold verb (creates a fresh `.sm`).
1128
- > - `sm bump <node>` is the day-to-day verb that increments the
1129
- > sidecar's version and refreshes its hashes same consent gate.
1130
- > - `sm sidecar refresh <node>` is the hash-only update (no version
1131
- > bump).
1161
+ ## Scope clarifications (on demand)
1162
+
1163
+ Reference material for the "mention only if the tester asks"
1164
+ beats in Steps 7, 8 and 9. Do NOT volunteer these unprompted —
1165
+ they exist so the agent has a precise answer ready when the
1166
+ tester pulls on the thread.
1167
+
1168
+ ### `sm check` vs `sm orphans`
1169
+
1170
+ - `sm check` reports broken-refs and other rule-driven issues
1171
+ (the deterministic catalog).
1172
+ - `sm orphans` is a **different scope**: auto-rename / orphan-node
1173
+ detection (a node whose file disappeared, or a candidate rename
1174
+ the kernel is still unsure about). Our fixture doesn't produce
1175
+ orphans of that kind, so `sm orphans` will print "No orphan /
1176
+ auto-rename issues" — that's expected, not a bug.
1177
+
1178
+ ### `plugins doctor` warnings on a clean fixture
1179
+
1180
+ `doctor` may emit 1-2 informational warnings about `explorationDir`
1181
+ not existing for `gemini/gemini` (`~/.gemini`) or
1182
+ `agent-skills/agent-skills` (`.agents`). These are normal on a
1183
+ machine that has not installed those tools — the providers declare
1184
+ optional discovery paths and warn when the path is absent. Nothing
1185
+ is broken; the providers just have nothing to scan.
1186
+
1187
+ ### `sm plugins show <qualified-id>`
1188
+
1189
+ The verb is informational — passing `core/external-url-counter`
1190
+ validates the extension exists and then renders the **parent
1191
+ bundle's** detail (i.e. the full `core` listing). The extension
1192
+ you named lives in that list. This is deliberate: forcing the user
1193
+ to type the bundle id just to read a single extension's manifest
1194
+ would be hostile, so `show` accepts the qualified shape and
1195
+ resolves up. Use `sm plugins doctor` or scroll the bundle's
1196
+ extension table to spot the one you queried.
1197
+
1198
+ ### IDs for `plugins disable` / `plugins enable`
1199
+
1200
+ Those verbs accept either a **bundle id** (e.g. `claude`, which
1201
+ toggles every Claude extension at once) or a **qualified extension
1202
+ id** `<bundle>/<ext-id>` (e.g. `core/external-url-counter`). The
1203
+ display format you see in `plugins list`
1204
+ (`extractor:core/external-url-counter@1.0.0`) includes the kind
1205
+ prefix and the version for readability — strip both when passing
1206
+ the id to `disable` / `enable`. Per-extension toggles only work on
1207
+ extension-granularity bundles like `core`; the `claude` bundle is
1208
+ bundle-granularity and only accepts the bundle id.
1209
+
1210
+ ### `sm sidecar annotate` vs `sm bump` vs `sm sidecar refresh`
1211
+
1212
+ - `sm sidecar annotate` is the scaffold verb (creates a fresh
1213
+ `.sm`).
1214
+ - `sm bump <node>` is the day-to-day verb that increments the
1215
+ sidecar's version and refreshes its hashes — same consent gate.
1216
+ - `sm sidecar refresh <node>` is the hash-only update (no version
1217
+ bump).
1132
1218
 
1133
1219
  ---
1134
1220
 
@@ -1157,7 +1243,7 @@ template:
1157
1243
  - **Depth reached**: <basic | full>
1158
1244
  - **Tester**: level <N> (if applicable)
1159
1245
  - **Tutorial directory**: <cwd>
1160
- - **Steps completed**: N / 3 demo + X / 6 deep-dive (if applicable)
1246
+ - **Steps completed**: N / 7 demo + X / 6 deep-dive (if applicable)
1161
1247
  - **Steps skipped**: Y (if applicable)
1162
1248
  - **Total time**: ~<computed from timestamps>
1163
1249
 
@@ -1180,14 +1266,32 @@ Then show:
1180
1266
  > <cwd>/sm-tutorial-report.md
1181
1267
  >
1182
1268
  > Send it to Pusher whenever you're ready (over the agreed channel).
1269
+
1270
+ If they say **2**, skip the report path and go straight to the
1271
+ closing block below.
1272
+
1273
+ **Always show this closing block** (regardless of the report
1274
+ choice — both branches converge here):
1275
+
1276
+ > One more thing before you go: there's a companion skill called
1277
+ > **sm-master** that picks up where this tutorial leaves off. It's
1278
+ > a modular deep-dive — you choose which areas to explore from a
1279
+ > menu — and it covers a guided tour of the built-in plugins
1280
+ > (extractors, analyzers, actions, hooks, formatters, providers),
1281
+ > plugin authoring via `sm plugins create` / `sm plugins upgrade`,
1282
+ > and settings + view-slots at depth. Same external-tester
1283
+ > audience, same pause/resume style, but a lot more ground covered.
1183
1284
  >
1184
- > To delete everything the tutorial left behind, if the cwd was a
1285
+ > When you're ready, **invoke it from a fresh empty directory**
1286
+ > (same setup as this tutorial), and just say `sm-master` or
1287
+ > `advanced tutorial` to start.
1288
+ >
1289
+ > To delete everything THIS tutorial left behind, if the cwd was a
1185
1290
  > dedicated dir:
1186
1291
  >
1187
1292
  > cd ~ && rm -rf <cwd>
1188
-
1189
- If they say **2**, just show the deletion instructions and say
1190
- thanks.
1293
+ >
1294
+ > Thanks for testing skill-map!
1191
1295
 
1192
1296
  ## Resume / restart
1193
1297
 
@@ -1196,9 +1300,9 @@ the cwd, start like this (do NOT repeat pre-flight from scratch):
1196
1300
 
1197
1301
  > I see you already started the tutorial.
1198
1302
  >
1199
- > You're at step <N> of 3 (or "you've already completed the demo
1200
- > (steps 1-3) and you're on step <M> of 6 of the deep-dive (steps
1201
- > 4-9)", depending on the yaml state).
1303
+ > You're at step <N> of 7 (or "you've already completed the demo
1304
+ > (steps 1-7) and you're on step <M> of 6 of the deep-dive (steps
1305
+ > 8-13)", depending on the yaml state).
1202
1306
  >
1203
1307
  > 1. **Continue** from where you left off
1204
1308
  > 2. **Start over** — wipes all the tutorial content in this dir
@@ -1218,8 +1322,11 @@ anything**:
1218
1322
  > re-invoke me from there, or delete `tutorial-state.yml` by
1219
1323
  > hand if you really want to start fresh here.
1220
1324
 
1221
- 2. If the cwd matches, show the tester the exact list of paths
1222
- you'll delete and ask for an explicit typed confirmation:
1325
+ 2. If the cwd matches, read `tutorial.provider` from the yaml and
1326
+ use it to compute `<provider_dir>` (and the subset of files
1327
+ actually present, since gemini and agent-skills skip some). Then
1328
+ show the tester the exact list of paths you'll delete and ask
1329
+ for an explicit typed confirmation:
1223
1330
 
1224
1331
  > Start over will delete these paths from `<cwd>`:
1225
1332
  >
@@ -1228,10 +1335,9 @@ anything**:
1228
1335
  > findings.md
1229
1336
  > .skillmapignore
1230
1337
  > .skill-map/
1231
- > .claude/agents/demo-agent.md
1232
- > .claude/commands/demo-command.md
1233
- > .claude/hooks/demo-hook.md
1234
- > .claude/skills/demo-skill/
1338
+ > <provider_dir>/agents/demo-agent.md (claude, gemini)
1339
+ > <provider_dir>/commands/demo-command.md (claude only)
1340
+ > <provider_dir>/skills/demo-skill/ (all three)
1235
1341
  > notes/todo.md
1236
1342
  > notes/private-credentials.md
1237
1343
  > sm-tutorial-report.md (if present)
@@ -1242,14 +1348,19 @@ anything**:
1242
1348
  > Type **`yes, wipe`** (exact text) to confirm. Anything else
1243
1349
  > cancels.
1244
1350
 
1351
+ Render the ACTUAL list (substituting `<provider_dir>` and
1352
+ dropping the rows the saved provider didn't create) so the
1353
+ tester sees the real paths, not the abstract placeholders.
1354
+
1245
1355
  3. Only on the literal `yes, wipe` reply, delete those exact paths.
1246
- Do NOT recursively `rm -rf` `.claude/` or `notes/` as
1356
+ Do NOT recursively `rm -rf` `<provider_dir>/` or `notes/` as
1247
1357
  directories — only the specific tutorial-owned files inside, in
1248
1358
  case the tester has unrelated files there. After deletion, also
1249
- `rmdir` `.claude/agents`, `.claude/commands`, `.claude/hooks`,
1250
- `.claude/skills`, `notes/`, and `.claude/` if and only if they
1251
- are empty (silent failure if not). Then start everything from
1252
- pre-flight.
1359
+ `rmdir` the per-provider subdirs that actually exist
1360
+ (`<provider_dir>/agents`, `<provider_dir>/commands`,
1361
+ `<provider_dir>/skills`), then `notes/` and `<provider_dir>/`,
1362
+ each one only if empty (silent failure if not). Then start
1363
+ everything from pre-flight.
1253
1364
 
1254
1365
  ## Edge cases
1255
1366
 
@@ -1270,13 +1381,3 @@ anything**:
1270
1381
  `curl http://127.0.0.1:4242` from another terminal.
1271
1382
  - **Tester gets lost** → "no worries, tell me where you are and
1272
1383
  we'll pick up from there". State is in `tutorial-state.yml`.
1273
-
1274
- ## Things you NEVER do
1275
-
1276
- - Run `sm` verbs for the tester (except `sm version` ONCE in
1277
- pre-flight).
1278
- - Advance to the next step without confirmation.
1279
- - Modify files outside the tutorial cwd.
1280
- - Ask them to `cd` outside the tutorial cwd.
1281
- - Skip the level question when entering the deep-dive.
1282
- - Ignore findings — always offer to log them.