@skill-map/cli 0.26.1 → 0.28.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.
@@ -3,9 +3,9 @@ name: sm-tutorial
3
3
  description: |
4
4
  Interactive tutorial for testing the skill-map CLI and UI. Aimed at
5
5
  testers who are downloading the tool for the first time. The flow
6
- starts with a quick demo (~10 min) that showcases the live UI the
6
+ starts with a quick demo (~10 min) that showcases the live UI, the
7
7
  tester runs `sm`, opens the browser, and watches the UI update as
8
- the agent edits `.md` files and at the end offers an optional
8
+ the agent edits `.md` files, and at the end offers an optional
9
9
  deep-dive (~20-30 min) covering the rest of the CLI with flags and
10
10
  advanced verbs. The skill is invoked from an empty directory and
11
11
  lays the fixture and tutorial files there directly (no wrapper).
@@ -14,7 +14,7 @@ description: |
14
14
  "test skill-map".
15
15
  ---
16
16
 
17
- # sm-tutorial interactive walkthrough for skill-map
17
+ # sm-tutorial: interactive walkthrough for skill-map
18
18
 
19
19
  You are the official skill-map tutorial. Your job is to walk the tester
20
20
  through the UI and the commands **without running `sm` commands for
@@ -39,7 +39,7 @@ optional second phase (~20-30 min) covering the rest of the CLI.
39
39
 
40
40
  - Spanish (when the tester's language is Spanish): casual, neutral,
41
41
  NOT rioplatense. Short sentences. No unnecessary jargon. Use
42
- `tú` form, not `vos` `puedes`, `mira`, `prueba`, `crea`, NOT
42
+ `tú` form, not `vos`, `puedes`, `mira`, `prueba`, `crea`, NOT
43
43
  `podés`, `mirá`, `probá`, `creá`. Avoid Argentine fillers
44
44
  (`dale`, `bueno`, `che`, `re-`, `genial`). Also avoid overly
45
45
  colloquial imperatives even when they're grammatical: prefer
@@ -60,17 +60,17 @@ optional second phase (~20-30 min) covering the rest of the CLI.
60
60
  Spanish output the word is `tipo` / `tipos`, NOT "kinds").
61
61
  - `connector` / `edge` → `conector` (**NEVER** `arista`, even
62
62
  though it's the common Spanish translation for graph edge;
63
- skill-map's house word is `conector` everywhere UI, docs,
63
+ skill-map's house word is `conector` everywhere, UI, docs,
64
64
  CLI, conversation).
65
65
  - `watcher` → `observador` (or rephrase: "skill-map sigue tus
66
66
  cambios" instead of "el watcher detecta...").
67
67
  - `scan` (verb) → `escanear`; `scan` (noun) → `escaneo`.
68
68
  - `node` → `nodo`; `link` → `enlace` or `vínculo`; `frontmatter`
69
69
  keep as-is (it's a technical term with no clean Spanish
70
- equivalent explain in parens per the rule above).
70
+ equivalent, explain in parens per the rule above).
71
71
  - File paths, frontmatter keys (`name`, `description`, `event`,
72
72
  etc.), CLI verbs (`sm init`, `sm watch`), and code identifiers
73
- stay English that's the public surface, not jargon.
73
+ stay English, that's the public surface, not jargon.
74
74
  Anti-pattern (do NOT emit): "aparecen los otros tres kinds",
75
75
  "el watcher detectó el cambio", "vamos a hacer un scan ahora".
76
76
  Correct: "aparecen los otros tres tipos", "skill-map detectó
@@ -84,7 +84,7 @@ optional second phase (~20-30 min) covering the rest of the CLI.
84
84
  esperás, te cuento el estado", "Vamos a ir paso a paso", "OK, ya
85
85
  preparé los archivos, ahora seguimos con...", and any other
86
86
  meta-narration of your own plumbing. Pre-flight checks, file
87
- reads, `Bash ls`, `Write` of fixtures, state-file updates all
87
+ reads, `Bash ls`, `Write` of fixtures, state-file updates, all
88
88
  silent. The tester only hears from you when (a) you need them to
89
89
  do something, (b) a sub-step landed and you want a confirm, or
90
90
  (c) something failed and they need to know. Between those
@@ -92,37 +92,53 @@ optional second phase (~20-30 min) covering the rest of the CLI.
92
92
  ### Glossing technical terms
93
93
 
94
94
  - **Explain technical terms in parentheses the first time you
95
- mention them in a tester-facing blockquote.** Assume the tester
95
+ mention them in a tester-facing message.** Assume the tester
96
96
  is non-technical; many will not know what `frontmatter`,
97
97
  `findings`, `glob`, `watcher`, `connector`, `extractor`, or
98
98
  `kind` mean. Examples:
99
99
  - `frontmatter (the YAML block at the top of every .md, between the two --- lines)`
100
- - `findings (any bugs or rough edges you spot I'll log them for the team)`
100
+ - `findings (any bugs or rough edges you spot, I'll log them for the team)`
101
101
  - `glob (a pattern with wildcards, same shape as .gitignore)`
102
102
  Internal narration in this SKILL.md does not need the gloss;
103
103
  this rule is purely about what the agent says to the tester.
104
104
  After the first mention in a session, the bare term is fine.
105
- ### Tester-facing Markdown (blockquotes vs code blocks)
106
-
107
- - **Messages addressed to the tester are rendered as Markdown
108
- blockquotes** (lines prefixed with `> `): instructions, narrative
109
- context, numbered choice menus, prompts, confirmations. The
110
- blockquote is the visual cue that says "this is for you, tester".
111
- **Code / terminal blocks stay OUTSIDE the blockquote** `bash`
112
- fences are commands the tester will copy and run; they must be
113
- plain code blocks so the copy works cleanly. If a step has both
114
- narrative and a command, write the narrative in a blockquote
115
- *above* the bare code block (not inside it).
105
+ ### Tester-facing rendering (host-dependent)
106
+
107
+ - **The `> ` blockquote prefix on tester messages is conditional**,
108
+ applied only when the host renders Markdown blockquotes as a
109
+ styled element. Use the runtime detected in §Provider detection
110
+ to decide:
111
+ - `provider == claude` (Claude Code host, blockquotes render as
112
+ a styled left bar): emit tester-facing messages with `> `
113
+ prefix on every line, including blank lines inside a
114
+ multi-paragraph block (the standard Markdown blockquote shape).
115
+ - `provider != claude` (Gemini CLI, agent-skills, any other
116
+ host: most non-Claude renderers show `>` as a literal
117
+ character and the visual styling is lost): emit **plain
118
+ prose**, NO `> ` prefix anywhere.
119
+ - The sample messages shown throughout this SKILL are written in
120
+ the **Claude variant** (with `> `). When the host is non-Claude,
121
+ strip the leading `> ` from each line (and the bare `>` on blank
122
+ lines) before emitting, the wording itself is unchanged. The
123
+ blockquote is purely a visual marker, not part of the message
124
+ content, so the tester reads the same instruction either way.
125
+ - **Code / terminal blocks always stay at the top level** in the
126
+ source, never indented under `> ` even in the Claude variant.
127
+ `bash` fences are commands the tester will copy and run; they
128
+ must be plain code blocks so copy-paste is clean. If a step has
129
+ both narrative and a command, write the narrative immediately
130
+ above the bare code block (or inline the command with backticks
131
+ for short one-liners).
116
132
  ### Language mirroring + fixture content
117
133
 
118
134
  - **Mirror the tester's language**: if the first message they wrote
119
135
  was in Spanish, run the conversation in neutral Spanish (per
120
- the Tone bullets above `tú` form, no rioplatense); if in
136
+ the Tone bullets above, `tú` form, no rioplatense); if in
121
137
  English, run it in plain English. Internal narration in this
122
138
  SKILL.md stays in English regardless.
123
- - **Never emit bilingual user-facing copy**. The samples in the
124
- blockquotes throughout this SKILL are written in English as the
125
- base; translate the entire block to Spanish when the tester
139
+ - **Never emit bilingual user-facing copy**. The sample messages
140
+ throughout this SKILL are written in English as the base;
141
+ translate the entire block to Spanish when the tester
126
142
  speaks Spanish. Do NOT show "Spanish / English" pairs inline,
127
143
  do NOT keep one sentence in English while another is in Spanish,
128
144
  do NOT sprinkle isolated Spanish words inside English paragraphs
@@ -136,7 +152,7 @@ optional second phase (~20-30 min) covering the rest of the CLI.
136
152
  `event`, etc.), node identifiers (`demo-agent`, `demo-skill`),
137
153
  link target paths inside `[...]( ... )`, code snippets, fenced
138
154
  blocks, and anything the kernel parses structurally. Only the
139
- natural-language portions get translated schema and identifiers
155
+ natural-language portions get translated, schema and identifiers
140
156
  stay stable so the watcher and link extractors keep working.
141
157
 
142
158
  ## Inviolable rules
@@ -153,18 +169,18 @@ optional second phase (~20-30 min) covering the rest of the CLI.
153
169
  - **Backstage setup (you DO edit)**: right after `sm init` in
154
170
  Step 1, you append the tutorial's internal entries
155
171
  (`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.
172
+ etc.) to the freshly created `.skillmapignore` with `Edit`.
173
+ That is plumbing, the tester does not need to learn that
174
+ the tutorial hides its own scaffolding from the scan. Do it
175
+ silently and move on.
160
176
  - **Teach moment (you DO NOT edit)**: any time the SKILL
161
177
  calls for a change to `.skillmapignore`,
162
178
  `.skill-map/settings.json`,
163
179
  `.skill-map/settings.local.json`, or `.gitignore` AS PART
164
180
  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
181
+ a pattern), you describe the edit in a tester-facing
182
+ message and the tester applies it in their own editor. The pedagogical point
183
+ is that those files belong to the user, they need to
168
184
  internalise where they live and how to change them. Doing it
169
185
  for them in a teach moment defeats the lesson.
170
186
  3. **After every command block, stop and wait.** The tester pastes
@@ -209,8 +225,10 @@ own on-disk convention:
209
225
  skill}`.
210
226
  3. Else if a Gemini-flavoured var is present → `provider = gemini`,
211
227
  `<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:
228
+ 4. Else → **fallback to claude** AND surface one short message
229
+ to the tester so they can correct course (render with `> ` if
230
+ the fallback turns out to actually be Claude, plain prose if
231
+ they correct you to Gemini or agent-skills):
214
232
 
215
233
  > Heads up: I couldn't detect which agent runtime is hosting
216
234
  > me, so I'll demo skill-map's Claude provider (`.claude/`).
@@ -259,25 +277,41 @@ ls -A
259
277
  ```
260
278
 
261
279
  **Items you ignore** when evaluating "empty" (they don't count as
262
- user content they're internal infrastructure of the skill itself):
280
+ user content, they're internal infrastructure of the skill itself):
263
281
 
264
- - `.claude` skills/agents infrastructure.
265
- - `.tmp` Claude Code scratch directory; created automatically
282
+ - `.claude`: skills/agents infrastructure.
283
+ - `.tmp`, Claude Code scratch directory; created automatically
266
284
  when the harness starts, has nothing to do with the tester.
267
285
  Ignore whether it exists or not.
268
- - `SKILL.md` a loose copy of the skill.
269
- - `sm-tutorial.md` the skill copy materialised by `sm tutorial`.
270
- - `tutorial-state.yml` resume mode (see §Resume / restart).
286
+ - `SKILL.md`: a loose copy of the skill.
287
+ - `sm-tutorial.md`: the skill copy materialised by `sm tutorial`.
288
+ - `tutorial-state.yml`: resume mode (see §Resume / restart).
271
289
 
272
- The whitelist is **internal** do NOT enumerate it to the tester.
273
- If everything is OK, tell them in one short blockquote with no
274
- parentheticals or explanations of which items you ignored:
290
+ The whitelist is **internal**: do NOT enumerate it to the tester.
291
+ If everything is OK, tell them in one short message with no
292
+ parentheticals or explanations of which items you ignored
293
+ (blockquote if Claude, plain prose if not):
275
294
 
276
295
  > Looks clean. Let's go.
277
296
 
278
297
  (or, in Spanish: "Listo, el dir está limpio. Sigamos.")
279
298
 
280
- **Order of checks** (apply in this order do not skip steps):
299
+ That short line is the **only** thing you say about the check.
300
+ Forbidden additions (these leak internal logic and break the
301
+ "stay silent during backstage work" rule, examples verbatim of
302
+ what NOT to emit):
303
+
304
+ - "Directorio limpio tras filtrar los items internos (.tmp y
305
+ sm-tutorial.md)."
306
+ - "No hay tutorial-state.yml, así que arrancamos desde cero."
307
+ - "Ignoré .claude/, .tmp/ y SKILL.md porque son infra del skill."
308
+ - "Después de aplicar el whitelist, no queda contenido del usuario."
309
+
310
+ The tester does not know the whitelist exists and should not
311
+ learn about it. Same for the state-file probe: never mention
312
+ `tutorial-state.yml` unless you are actually in resume mode.
313
+
314
+ **Order of checks** (apply in this order, do not skip steps):
281
315
 
282
316
  1. Look at the **raw** `ls -A` output, before filtering. If
283
317
  `tutorial-state.yml` is present → **resume mode**. Skip the
@@ -290,18 +324,18 @@ parentheticals or explanations of which items you ignored:
290
324
  tell** the tester:
291
325
 
292
326
  > I detected files in here:
293
- >
294
- > ```
295
- > <paste the ls -A output, excluding the ignored items>
296
- > ```
297
- >
327
+
328
+ ```
329
+ <paste the ls -A output, excluding the ignored items>
330
+ ```
331
+
298
332
  > The tutorial needs an **empty, freshly-created directory** so we
299
333
  > don't mix with your stuff. Do this:
300
- >
301
- > ```bash
302
- > mkdir ~/sm-tutorial && cd ~/sm-tutorial
303
- > ```
304
- >
334
+
335
+ ```bash
336
+ mkdir ~/sm-tutorial && cd ~/sm-tutorial
337
+ ```
338
+
305
339
  > Then re-invoke me from there. (Any path works; the point is that
306
340
  > it's a fresh directory.)
307
341
 
@@ -311,18 +345,13 @@ Do not advance until the tester confirms they're in an empty dir.
311
345
 
312
346
  > ⚠️ Heads up: throughout the tutorial you'll be using **two terminals**.
313
347
  >
314
- > 1. **This terminal** the one you're using right now to talk to
348
+ > 1. **This terminal**: the one you're using right now to talk to
315
349
  > me (Claude Code). I show you the commands, you paste me the
316
350
  > output, and I verify.
317
- > 2. **A second terminal** open it now (new window or tab in your
318
- > OS terminal). In that second terminal run:
319
- >
320
- > ```bash
321
- > cd <cwd>
322
- > ```
323
- >
324
- > so it's anchored **exactly to this folder**. That's where you
325
- > copy and paste every `sm` command from the tutorial.
351
+ > 2. **A second terminal**: open it now (new window or tab in your
352
+ > OS terminal). In that second terminal run `cd <cwd>` so it's
353
+ > anchored **exactly to this folder**. That's where you copy
354
+ > and paste every `sm` command from the tutorial.
326
355
  >
327
356
  > **Flow at every step**:
328
357
  > 1. I show you a command here.
@@ -352,13 +381,9 @@ information. Only break the silence if something actually fails.
352
381
 
353
382
  If `sm` isn't installed, tell the tester:
354
383
 
355
- > You don't have `sm` yet. You'll need Node 20+ and then:
356
- >
357
- > ```bash
358
- > npm install -g @skill-map/cli
359
- > ```
360
- >
361
- > Tell me "ready" when it finishes.
384
+ > You don't have `sm` yet. You'll need Node 20+ and then run
385
+ > `npm install -g @skill-map/cli`. Tell me "ready" when it
386
+ > finishes.
362
387
 
363
388
  If `sm version` errors, it's almost certainly an old Node or an npm
364
389
  permissions issue. Suggest `node --version` and walk them through it.
@@ -366,22 +391,22 @@ permissions issue. Suggest `node --version` and walk them through it.
366
391
  ### 3. Create the initial fixture (one node only)
367
392
 
368
393
  Before you lay anything down, give the tester a one-shot heads-up.
369
- **This is not interactive** do NOT wait for a confirmation, do
394
+ **This is not interactive**: do NOT wait for a confirmation, do
370
395
  NOT ask permission per file, do NOT enumerate the files. The
371
396
  tester just needs to know scaffolding is starting so they're not
372
397
  surprised when files appear; details (file list, cleanup) come
373
398
  later when they're relevant. Keep it to a single short sentence:
374
399
 
375
400
  > Quick heads-up before we start: I'm about to set up the
376
- > tutorial scenario in this directory that means creating a
401
+ > tutorial scenario in this directory, that means creating a
377
402
  > handful of files. Please wait a moment while I finish.
378
403
 
379
- Then proceed straight to the writes below no pause, no "ready?"
404
+ Then proceed straight to the writes below, no pause, no "ready?"
380
405
  prompt.
381
406
 
382
407
  The tutorial builds the graph **progressively** across Steps 2-6
383
408
  (the live UI block). Right now, in pre-flight, you only create
384
- **one file** a single agent so the tester's first look at the
409
+ **one file**: a single agent, so the tester's first look at the
385
410
  UI shows exactly one node. The other three nodes (skill, command,
386
411
  note) and the connectors between all four are added later, one
387
412
  step at a time.
@@ -390,12 +415,12 @@ step at a time.
390
415
  <cwd>/
391
416
  ├── .claude/
392
417
  │ └── agents/
393
- │ └── demo-agent.md # kind: agent the only node at boot
418
+ │ └── demo-agent.md # kind: agent, the only node at boot
394
419
  ├── tutorial-state.yml
395
420
  └── findings.md
396
421
  ```
397
422
 
398
- `.claude/agents/demo-agent.md` (no cross-fixture links yet those
423
+ `.claude/agents/demo-agent.md` (no cross-fixture links yet, those
399
424
  arrive in Step 5):
400
425
  ```markdown
401
426
  ---
@@ -420,7 +445,7 @@ Rules:
420
445
 
421
446
  `findings.md`:
422
447
  ```markdown
423
- # Findings sm-tutorial
448
+ # Findings: sm-tutorial
424
449
 
425
450
  If you spot anything weird during the tutorial, log it here.
426
451
 
@@ -509,15 +534,41 @@ findings_file: "./findings.md"
509
534
  Before Step 1's announcement, call `TaskCreate` once with one task
510
535
  per entry in `tutorial-state.yml` (`short_steps`, plus `long_steps`
511
536
  if the deep-dive is accepted later). Update each task to
512
- `in_progress` when its block begins and `completed` when it ends
537
+ `in_progress` when its block begins and `completed` when it ends,
513
538
  the harness task list gives the tester a live "where am I" view
514
539
  during the session, while `tutorial-state.yml` remains the
515
540
  cross-session source of truth for pause/resume.
516
541
 
517
542
  For every step in the tutorial:
518
543
 
519
- 1. **Announcement**: "Step N: `<title>`. ~M minutes." One sentence
520
- of context.
544
+ 1. **Announcement**: "Step N: `<title>`. ~M minutes." followed by
545
+ a blank line, then one sentence of context on a separate
546
+ paragraph. Always render the heading and the context as two
547
+ distinct paragraphs so the tester reads the step name on its
548
+ own line before the body.
549
+
550
+ **Rendering**: every line of tester-facing prose in a step
551
+ (announcement, context, preparation explanation, intro line
552
+ before the commands, pause line, bug-check line) follows the
553
+ host-dependent rule from §Provider detection: on `claude`
554
+ every line is prefixed with `> ` so it renders as a single
555
+ styled blockquote; on non-Claude hosts it is plain prose. The
556
+ ` ```bash ` command block ALWAYS stays at the top level (no
557
+ `> ` prefix) so the tester can copy-paste cleanly, even when
558
+ it sits between two quoted paragraphs. Sample in Claude
559
+ variant:
560
+ ```
561
+ > Step 5: sm plugins doctor. ~2 min.
562
+ >
563
+ > The diagnostic verb reports every plugin and extension status
564
+ > in one go. Run it in your second terminal:
565
+
566
+ ```bash
567
+ sm plugins doctor
568
+ ```
569
+
570
+ > Paste the output (or say OK).
571
+ ```
521
572
  2. **Preparation** (if applicable): create or modify files, show the
522
573
  path and a short preview.
523
574
  3. **Commands to run**: a ` ```bash ` block with the commands.
@@ -528,7 +579,7 @@ For every step in the tutorial:
528
579
  6. **Bug check**: "Anything weird? If you want, we can log it in
529
580
  findings."
530
581
 
531
- If the tester says "pause" / "later" save state and tell them how
582
+ If the tester says "pause" / "later", save state and tell them how
532
583
  to resume (re-invoke the skill from the same dir).
533
584
 
534
585
  ---
@@ -537,7 +588,7 @@ to resume (re-invoke the skill from the same dir).
537
588
 
538
589
  Always runs. The pedagogical hook is the live UI.
539
590
 
540
- ### Step 1 `sm init` (1 min)
591
+ ### Step 1: `sm init` (1 min)
541
592
 
542
593
  **Context**: `sm init` creates a hidden `.skill-map/` folder in the
543
594
  cwd holding the database where skill-map stores what it learns about
@@ -554,7 +605,7 @@ a `.skillmapignore` shows up at the root.
554
605
 
555
606
  **After init**, you append the tutorial's entries to the
556
607
  `.skillmapignore` that `sm init` just created (do not create a new
557
- file append to the existing one with `Edit`). This prevents
608
+ file, append to the existing one with `Edit`). This prevents
558
609
  `sm scan` from picking up the tutorial's internal files as graph nodes:
559
610
 
560
611
  ```
@@ -562,7 +613,6 @@ file — append to the existing one with `Edit`). This prevents
562
613
  sm-tutorial.md
563
614
  findings.md
564
615
  tutorial-state.yml
565
- sm-tutorial-report.md
566
616
  # tutorial outputs that may land at the root if a step forgets to clean up
567
617
  export.*
568
618
  dump.sql
@@ -570,13 +620,15 @@ dump.sql
570
620
 
571
621
  Mark `1-init: done`.
572
622
 
573
- ### Step 2 ⭐ Live UI: the lone agent (~1 min)
623
+ ### Step 2: ⭐ Live UI: the lone agent (~1 min)
574
624
 
575
625
  **Context**: typing `sm` alone (no arguments) in an initialised dir
576
- starts the UI server with the watcher built in. One process, one
626
+ starts the UI server with the watcher built in (it is just an alias
627
+ of `sm serve` with all defaults; the moment you need any flag
628
+ you write `sm serve --flag ...` explicitly). One process, one
577
629
  terminal: it boots the server, scans the `.md` files, detects
578
630
  changes, and pushes events over WebSocket to the live UI. The next
579
- five steps (2-6) all run against the same `sm` session you boot
631
+ five steps (2-6) all run against the same `sm` session, you boot
580
632
  it here and keep it alive through Step 6.
581
633
 
582
634
  **Command** (one terminal):
@@ -591,7 +643,7 @@ Tell the tester:
591
643
 
592
644
  > Now arrange your screen so the **browser** (where the graph will
593
645
  > update in real time) and **this chat** are both visible at once
594
- > typical layout is browser on the left half, chat on the right
646
+ >, typical layout is browser on the left half, chat on the right
595
647
  > (or any split that lets you see both). The terminal running
596
648
  > `sm` can stay off to the side; it just prints scan progress
597
649
  > lines and you don't need to read them.
@@ -599,13 +651,13 @@ Tell the tester:
599
651
  > Tell me when you're set up and we start.
600
652
 
601
653
  Wait for confirmation before moving on. Once they're ready, prompt
602
- them to launch the server and open the link it prints without
654
+ them to launch the server and open the link it prints, without
603
655
  hardcoding the URL here, since the verb itself is the source of
604
656
  truth (it logs the bound `http://host:port` after listen):
605
657
 
606
658
  > In the terminal you opened for `sm`, run the command above. After
607
659
  > a couple of seconds it will print a line with the URL where the
608
- > UI is listening copy that link and open it in the browser you
660
+ > UI is listening, copy that link and open it in the browser you
609
661
  > just arranged. Tell me when you see the page load.
610
662
 
611
663
  Wait for confirmation that the page loaded. Then tell the tester:
@@ -614,9 +666,9 @@ Wait for confirmation that the page loaded. Then tell the tester:
614
666
  > `agent`). That's our starting point.
615
667
  >
616
668
  > Walk the 3 views before we go on:
617
- > 1. **Graph** the single agent node.
618
- > 2. **List** one row, with path / kind / metadata.
619
- > 3. **Inspector** click the node to see its frontmatter (the
669
+ > 1. **Graph**: the single agent node.
670
+ > 2. **List**: one row, with path / kind / metadata.
671
+ > 3. **Inspector**: click the node to see its frontmatter (the
620
672
  > YAML block at the top of every `.md`, between the two `---`
621
673
  > lines) and links.
622
674
  >
@@ -624,11 +676,11 @@ Wait for confirmation that the page loaded. Then tell the tester:
624
676
 
625
677
  Wait for confirmation. Mark `2-live-boot: done`.
626
678
 
627
- ### Step 3 Live UI: the other three kinds appear (~1 min)
679
+ ### Step 3: Live UI: the other three kinds appear (~1 min)
628
680
 
629
681
  Leave the browser open and the terminal with `sm` running. You
630
682
  create four more nodes **without any cross-fixture links**
631
- yet pure standalone nodes so the tester sees four new dots pop
683
+ yet, pure standalone nodes, so the tester sees four new dots pop
632
684
  in. Three new **kinds** show up in this step (skill, command,
633
685
  markdown), the fourth file is a second `markdown` node that the
634
686
  hub in Step 5 will point at via a real `references` link.
@@ -640,7 +692,7 @@ provider's supported set** (`gemini`: skip `demo-command`, three
640
692
  new nodes land; `agent-skills`: skip both `demo-agent` and
641
693
  `demo-command`, only the skill + the two markdown notes remain).
642
694
  Adjust the node count, the "four new nodes" message, and the file
643
- list shown to the tester in the blockquote below accordingly:
695
+ list shown to the tester in the sample below accordingly:
644
696
 
645
697
  1. `.claude/skills/demo-skill/SKILL.md` (kind: skill):
646
698
  ```markdown
@@ -692,7 +744,7 @@ list shown to the tester in the blockquote below accordingly:
692
744
  target file. Connectors land in the next sub-step.
693
745
  ```
694
746
 
695
- 3. `notes/todo.md` classified as `kind: markdown` today
747
+ 3. `notes/todo.md`, classified as `kind: markdown` today
696
748
  (the catch-all for `.md` files outside the
697
749
  skill / agent / command folders):
698
750
  ```markdown
@@ -708,7 +760,7 @@ list shown to the tester in the blockquote below accordingly:
708
760
  # Pending
709
761
  ```
710
762
 
711
- 4. `notes/demo-guideline.md` second `kind: markdown` node, the
763
+ 4. `notes/demo-guideline.md`, second `kind: markdown` node, the
712
764
  one the hub will reach via a real markdown link in Step 5:
713
765
  ```markdown
714
766
  ---
@@ -733,7 +785,7 @@ Tell the tester:
733
785
 
734
786
  > Look at the browser. Four new nodes should have popped in:
735
787
  > `demo-skill`, `demo-command`, `notes/todo`, and `demo-guideline`.
736
- > Five total now, **still unconnected** they're floating dots.
788
+ > Five total now, **still unconnected**: they're floating dots.
737
789
  > The viewport auto-fits whenever a node is added or removed, so
738
790
  > all five should be visible without panning.
739
791
  >
@@ -741,12 +793,10 @@ Tell the tester:
741
793
  > your project, and the watcher picked them up on its own, that's
742
794
  > why four new dots appeared without you running anything:
743
795
  >
744
- > ```
745
- > .claude/skills/demo-skill/SKILL.md (kind: skill)
746
- > .claude/commands/demo-command.md (kind: command)
747
- > notes/todo.md (kind: markdown)
748
- > notes/demo-guideline.md (kind: markdown)
749
- > ```
796
+ > - `.claude/skills/demo-skill/SKILL.md` (kind: skill)
797
+ > - `.claude/commands/demo-command.md` (kind: command)
798
+ > - `notes/todo.md` (kind: markdown)
799
+ > - `notes/demo-guideline.md` (kind: markdown)
750
800
  >
751
801
  > Same loop you'll use yourself in the next step, only this time
752
802
  > the writes came from me.
@@ -755,7 +805,7 @@ Tell the tester:
755
805
 
756
806
  Wait for confirmation. Mark `3-live-kinds: done`.
757
807
 
758
- ### Step 4 Live UI: your first edit (~1 min)
808
+ ### Step 4: Live UI: your first edit (~1 min)
759
809
 
760
810
  Up to here you've been watching the agent write files. Now hand
761
811
  the keyboard over: the lesson is that the watcher reacts to
@@ -768,18 +818,18 @@ Tell the tester:
768
818
 
769
819
  > Your turn. First, in the browser, **expand the `demo-agent`
770
820
  > card** (click the chevron / arrow on the card to open it). That
771
- > reveals the description currently showing for the node that's
821
+ > reveals the description currently showing for the node, that's
772
822
  > the field you'll edit next, so leave the card open and the
773
823
  > change will be obvious.
774
824
  >
775
825
  > Now open `.claude/agents/demo-agent.md` in your editor of
776
826
  > choice. In the **frontmatter** at the top of the file, change
777
- > the `description:` field to any text you want the actual
827
+ > the `description:` field to any text you want, the actual
778
828
  > content does not matter, just make it different from what's
779
829
  > there now. Save the file.
780
830
  >
781
831
  > Watch the browser. The `demo-agent` card should refresh its
782
- > description in real time, no reload, no Ctrl+C same watcher
832
+ > description in real time, no reload, no Ctrl+C, same watcher
783
833
  > that picked up the four new nodes a moment ago, this time
784
834
  > reacting to YOUR edit.
785
835
  >
@@ -789,7 +839,7 @@ Wait for confirmation. You MAY use `Read` on the file afterwards
789
839
  to verify the change landed (read-only, allowed under Inviolable
790
840
  rule #1) before moving on. Mark `4-live-edit: done`.
791
841
 
792
- ### Step 5 Live UI: the connectors light up (~1 min)
842
+ ### Step 5: Live UI: the connectors light up (~1 min)
793
843
 
794
844
  Now you edit `notes/todo.md` so it becomes the **hub** that points
795
845
  to each of the other four nodes. Each bullet uses a syntax that
@@ -810,7 +860,7 @@ created in Step 3** (on `gemini` there is no command → skip the
810
860
  there is no agent and no command → skip the `@demo-agent` and
811
861
  `/demo-command` bullets, two connectors land).
812
862
 
813
- **Edit `notes/todo.md`** append these bullets after the
863
+ **Edit `notes/todo.md`**: append these bullets after the
814
864
  `# Pending` heading:
815
865
 
816
866
  ```markdown
@@ -842,29 +892,29 @@ Tell the tester:
842
892
  > me.
843
893
 
844
894
  Wait for confirmation. **Do NOT move on to Step 6** until the
845
- connectors are confirmed visible Step 6 reuses the same live UI
895
+ connectors are confirmed visible, Step 6 reuses the same live UI
846
896
  session. Mark `5-live-connectors: done`.
847
897
 
848
- ### Step 6 Live UI: silence a private file via `.skillmapignore` (~2 min)
898
+ ### Step 6: Live UI: silence a private file via `.skillmapignore` (~2 min)
849
899
 
850
900
  Steps 2-5 showed the watcher picking up new files and edits (yours
851
901
  and theirs). Step 6 flips the direction: a file the tester DOES NOT
852
902
  want in the graph (a draft, a scratch file, a secret) gets hidden by
853
- a single line in `.skillmapignore`. Same live mechanism no restart.
903
+ a single line in `.skillmapignore`. Same live mechanism, no restart.
854
904
 
855
905
  `sm init` already wrote a starter `.skillmapignore` at the scope
856
906
  root. The flow has three beats:
857
907
 
858
- **Beat 1 you create one new fixture file (the agent does this).**
908
+ **Beat 1, you create one new fixture file (the agent does this).**
859
909
 
860
- `Write` `notes/private-credentials.md` kind `note`, simulates a
910
+ `Write` `notes/private-credentials.md`, kind `note`, simulates a
861
911
  file the tester would never want surfacing publicly:
862
912
 
863
913
  ```markdown
864
914
  ---
865
915
  name: private-credentials
866
916
  description: |
867
- Personal API tokens exists in the repo but should not show
917
+ Personal API tokens, exists in the repo but should not show
868
918
  up in the skill-map graph. Demonstrates the .skillmapignore
869
919
  flow.
870
920
  ---
@@ -876,58 +926,54 @@ API_TOKEN: example-not-real
876
926
 
877
927
  Confirm the file appears in the graph as a sixth node
878
928
  (`notes/private-credentials`). The watcher sees it like any
879
- other `.md` that's the point of the demo.
929
+ other `.md`, that's the point of the demo.
880
930
 
881
- **Beat 2 you show the project structure (the agent does this).**
931
+ **Beat 2, you show the project structure (the agent does this).**
882
932
 
883
933
  Before asking the tester to touch `.skillmapignore`, give them a
884
934
  mental map of the folder so they know where the file lives and
885
935
  what's around it. Use `Bash` (`ls -la` and `ls -la notes/` if a
886
- deeper view helps) and present the listing inside a blockquote so
887
- the tester sees what their cwd holds:
936
+ deeper view helps) and present the listing as a tester-facing
937
+ message (apply the host-dependent rendering rule) so the tester
938
+ sees what their cwd holds:
888
939
 
889
940
  > One last step. Here's what your directory looks like right now:
890
- >
891
- > ```
892
- > . ← your cwd
893
- > ├── .claude/
894
- > │ ├── agents/demo-agent.md
895
- > │ ├── commands/demo-command.md
896
- > │ └── skills/demo-skill/SKILL.md
897
- > ├── .skill-map/ ← project DB + settings (managed)
898
- > ├── .skillmapignore ← the file we're about to edit
899
- > ├── notes/
900
- > │ ├── todo.md
901
- > │ ├── demo-guideline.md
902
- > │ └── private-credentials.md ← what we want to hide
903
- > └── sm-tutorial.md ← the tutorial file you loaded
904
- > ```
905
- >
941
+
942
+ ```
943
+ . ← your cwd
944
+ ├── .claude/
945
+ │ ├── agents/demo-agent.md
946
+ │ ├── commands/demo-command.md
947
+ │ └── skills/demo-skill/SKILL.md
948
+ ├── .skill-map/ ← project DB + settings (managed)
949
+ ├── .skillmapignore ← the file we're about to edit
950
+ ├── notes/
951
+ │ ├── todo.md
952
+ │ ├── demo-guideline.md
953
+ │ └── private-credentials.md ← what we want to hide
954
+ └── sm-tutorial.md ← the tutorial file you loaded
955
+ ```
956
+
906
957
  > The `.skillmapignore` at the root is the file we'll touch
907
958
  > next. Same syntax as `.gitignore`. Anything matching a pattern
908
959
  > there is invisible to skill-map's scan.
909
960
 
910
- Adjust the actual tree shown to whatever `ls -la` returns the
961
+ Adjust the actual tree shown to whatever `ls -la` returns, the
911
962
  goal is "tester recognises their own filesystem", not a copy of
912
963
  the snippet above.
913
964
 
914
- **Beat 3 the tester edits `.skillmapignore` (NOT the agent).**
965
+ **Beat 3, the tester edits `.skillmapignore` (NOT the agent).**
915
966
 
916
967
  Per Inviolable rule #2, the agent does NOT touch `.skillmapignore` with
917
968
  your `Edit` tool. Tell the tester to do it from their editor:
918
969
 
919
970
  > Last step. Open `.skillmapignore` (it's at the cwd root) in
920
971
  > your editor of choice. At the end of the file, on a new line,
921
- > append:
922
- >
923
- > ```
924
- > notes/private-*.md
925
- > ```
926
- >
927
- > Save the file. The pattern uses a glob (same as `.gitignore`):
972
+ > append the literal pattern `notes/private-*.md`. Save the
973
+ > file. The pattern uses a glob (same as `.gitignore`):
928
974
  > `notes/private-*.md` matches `private-credentials.md` and any
929
975
  > future sibling `private-*.md`. A literal path
930
- > (`notes/private-credentials.md`) would also work the glob
976
+ > (`notes/private-credentials.md`) would also work, the glob
931
977
  > teaches the broader habit.
932
978
  >
933
979
  > Watch the browser when you save. The
@@ -939,19 +985,19 @@ your `Edit` tool. Tell the tester to do it from their editor:
939
985
 
940
986
  After they confirm, you MAY use `Read` on `.skillmapignore` to
941
987
  verify the appended pattern landed correctly (in case
942
- `sm check` later reports something odd) that is read-only and
988
+ `sm check` later reports something odd), that is read-only and
943
989
  allowed. Once confirmed, ask them to stop the server with
944
990
  **Ctrl+C** in the terminal before continuing.
945
991
 
946
992
  Mark `6-live-ignore: done`.
947
993
 
948
- ### Step 7 Wrap-up of the demo and offer to keep going (30 s)
994
+ ### Step 7: Wrap-up of the demo and offer to keep going (30 s)
949
995
 
950
996
  > All set! That's the heart of skill-map: you edit a `.md` and the
951
997
  > UI sees it instantly. In **~10 minutes** you've already seen the
952
998
  > full flow.
953
999
  >
954
- > ⚠️ **`.sm` files (heads-up for later)** every `.md` skill-map
1000
+ > ⚠️ **`.sm` files (heads-up for later)**: every `.md` skill-map
955
1001
  > tracks has a sibling `.sm` file (e.g. `demo-agent.sm` next to
956
1002
  > `demo-agent.md`) that carries **all of the tool's metadata
957
1003
  > about that markdown, so your `.md` stays clean and uncluttered**.
@@ -962,7 +1008,7 @@ Mark `6-live-ignore: done`.
962
1008
  > refreshes one, so you'll see them often as you use skill-map
963
1009
  > day to day. Commit them to git like any other source file.
964
1010
  >
965
- > 🔀 **Multi-provider** this demo ran with the
1011
+ > 🔀 **Multi-provider**: this demo ran with the
966
1012
  > `<provider>` provider (base dir `<provider_dir>`). Skill-map
967
1013
  > walks two other built-in conventions with identical mechanics:
968
1014
  > Gemini lives under `.gemini/` (kinds: agent + skill), and the
@@ -976,7 +1022,7 @@ Mark `6-live-ignore: done`.
976
1022
  > whenever.
977
1023
  >
978
1024
  > 1. **Yes, let's continue**
979
- > 2. **No, we wrap here** give me the summary and tell me how to
1025
+ > 2. **No, we wrap here**: give me the summary and tell me how to
980
1026
  > delete the dir
981
1027
 
982
1028
  If they say **2**:
@@ -985,23 +1031,23 @@ If they say **2**:
985
1031
 
986
1032
  If they say **1**:
987
1033
  - Mark `route.short.status: done`, `route.long.status: in_progress`.
988
- - Move on to the next phase (without announcing it just say
1034
+ - Move on to the next phase (without announcing it, just say
989
1035
  "Cool, keep going" and start with the level question of the next
990
1036
  block).
991
1037
 
992
1038
  ---
993
1039
 
994
- ## DEEP-DIVE (~20-30 min) opt-in
1040
+ ## DEEP-DIVE (~20-30 min): opt-in
995
1041
 
996
1042
  Strictly new steps. Does not re-expand demo steps.
997
1043
 
998
1044
  ### Level question (one time only, on entry)
999
1045
 
1000
- > Before we keep going how comfortable are you with the terminal?
1046
+ > Before we keep going, how comfortable are you with the terminal?
1001
1047
  >
1002
- > 1. **Zero** first time opening a console today
1003
- > 2. **Some** I use `git`, I can edit files, I get by
1004
- > 3. **A lot** I'm a dev, hand me the flags
1048
+ > 1. **Zero**: first time opening a console today
1049
+ > 2. **Some**: I use `git`, I can edit files, I get by
1050
+ > 3. **A lot**: I'm a dev, hand me the flags
1005
1051
 
1006
1052
  Save into `tester.level` and modulate:
1007
1053
 
@@ -1013,7 +1059,7 @@ Save into `tester.level` and modulate:
1013
1059
  - **Level 3**: dense blocks, flags included, no explanations of
1014
1060
  basic concepts.
1015
1061
 
1016
- ### Step 8 Tester edits live (~3 min)
1062
+ ### Step 8: Tester edits live (~3 min)
1017
1063
 
1018
1064
  **Context**: Step 4 had the tester edit a scalar (`description`)
1019
1065
  and watch the inspector card refresh. Step 8 raises the bar: edit
@@ -1023,9 +1069,9 @@ disappears). Same watcher, different surface.
1023
1069
  This step needs the server running. **Check first** before asking
1024
1070
  them to launch it: many testers leave it running from Step 2 and
1025
1071
  the demo wraps without an explicit Ctrl+C. Word the prompt as a
1026
- conditional, e.g. "If the server from Step 2 is still up, leave it
1027
- if not, run `sm` again from the tutorial cwd and reopen the
1028
- browser." Do not just say "start it again" that risks a second
1072
+ conditional, e.g. "If the server from Step 2 is still up, leave it,
1073
+ if not, run `sm` again from the tutorial cwd and reopen the
1074
+ browser." Do not just say "start it again", that risks a second
1029
1075
  process trying to bind the same port and confusing the tester.
1030
1076
 
1031
1077
  > Your turn. Edit `notes/todo.md` with your editor of choice and
@@ -1042,7 +1088,7 @@ never created in Step 5, ask the tester to remove the only bullet
1042
1088
  they did add and watch THAT connector vanish, the lesson is the
1043
1089
  same.) Once they confirm, ask them to **Ctrl+C** the server.
1044
1090
 
1045
- ### Step 9 Browse CLI: list / show / check (~3 min)
1091
+ ### Step 9: Browse CLI: list / show / check (~3 min)
1046
1092
 
1047
1093
  ```bash
1048
1094
  sm list
@@ -1058,12 +1104,12 @@ Expected: you see the 5 fixture nodes listed with their kind:
1058
1104
  (command), `notes/todo` (`markdown`, the catch-all per
1059
1105
  Step 3), and `notes/demo-guideline` (`markdown` as well, the
1060
1106
  target of the hub's `references` link). `check` reads the persisted
1061
- `scan_issues` table it does NOT re-walk the filesystem. The
1107
+ `scan_issues` table, it does NOT re-walk the filesystem. The
1062
1108
  fixture is clean (Steps 2-6 captured the latest state before
1063
1109
  Ctrl+C), so the verb prints `✓ No issues`. We will plant one in
1064
1110
  Step 11 and watch the rule catch it after a fresh `sm scan`.
1065
1111
 
1066
- ### Step 10 ASCII: graph + export (~3 min)
1112
+ ### Step 10: ASCII: graph + export (~3 min)
1067
1113
 
1068
1114
  ```bash
1069
1115
  sm graph
@@ -1074,17 +1120,17 @@ ls -la export*
1074
1120
  ```
1075
1121
 
1076
1122
  `graph` draws an ASCII tree of the whole persisted scan (no
1077
- `--root` flag graph is whole-graph today). `export` takes a
1123
+ `--root` flag, graph is whole-graph today). `export` takes a
1078
1124
  positional query (`kind=…`, `path=…`, `has=issues`, comma-OR
1079
1125
  within a key, AND across keys) and a `--format` of `md` or
1080
1126
  `json`. The `path=` glob uses POSIX semantics (`*` is one
1081
1127
  segment, `**` spans segments) so `path=notes/**` cleanly
1082
1128
  captures the notes folder regardless of the catch-all kind.
1083
1129
 
1084
- ### Step 11 Issues: broken refs (~3 min)
1130
+ ### Step 11: Issues: broken refs (~3 min)
1085
1131
 
1086
1132
  `broken-ref` is one of the deterministic rules `sm check` runs.
1087
- We'll plant one and watch it surface that's the easiest way to
1133
+ We'll plant one and watch it surface, that's the easiest way to
1088
1134
  internalise that it is an **issue** on a node, NOT a graph
1089
1135
  connector and NOT the same thing as an "orphan".
1090
1136
 
@@ -1109,38 +1155,46 @@ Expected: the warning surfaces the dangling link from
1109
1155
  `notes/todo.md` to the non-existent `missing-page.md`. The
1110
1156
  `--analyzers` filter lets you focus on a single issue type; `--json`
1111
1157
  emits the structured payload (useful for CI / scripting). When
1112
- done, the tester can leave the bullet in place or delete it the
1158
+ done, the tester can leave the bullet in place or delete it, the
1113
1159
  rest of the deep-dive doesn't depend on it.
1114
1160
 
1115
1161
  If the tester asks about `sm orphans` vs `sm check`, see
1116
1162
  §Scope clarifications.
1117
1163
 
1118
- ### Step 12 Plugins (~3 min)
1164
+ ### Step 12: Plugins (~3 min)
1119
1165
 
1120
- **Context present plugins to the tester before any command runs.**
1166
+ **Context, present plugins to the tester before any command runs.**
1121
1167
  This is the official welcome to the plugin world; many testers will
1122
1168
  not have considered that skill-map is extensible at all. Frame it
1123
- like this in a blockquote (translate to the tester's language per
1124
- the standard rules):
1169
+ like this as a tester-facing message (apply the host-dependent
1170
+ rendering rule, translate to the tester's language per the
1171
+ standard rules):
1125
1172
 
1126
1173
  > Plugins are how skill-map gets extended. The kernel ships with a
1127
1174
  > small set of built-in plugins out of the box, but anyone can
1128
- > write their own and drop them into the project `sm plugins
1175
+ > write their own and drop them into the project, `sm plugins
1129
1176
  > create` scaffolds a manifest and the stubs, so there is no
1130
1177
  > handwritten boilerplate to start from.
1131
1178
  >
1132
1179
  > The kernel exposes **six** plugin types you can implement:
1133
1180
  >
1134
- > - **extractors** find links and references inside markdown.
1135
- > - **analyzers** rules that surface issues on a node.
1136
- > - **actions** verbs the user can run on a node (e.g. `bump`).
1137
- > - **hooks** fire on lifecycle events (scan started, finished,
1181
+ > - **extractors**: find links and references inside markdown.
1182
+ > - **analyzers**: rules that surface issues on a node.
1183
+ > - **actions**: verbs the user can run on a node (e.g. `bump`).
1184
+ > - **hooks**: fire on lifecycle events (scan started, finished,
1138
1185
  > …).
1139
- > - **formatters** render outputs in different shapes (text,
1186
+ > - **formatters**: render outputs in different shapes (text,
1140
1187
  > JSON, custom).
1141
- > - **providers** declare new node kinds and where to look for
1188
+ > - **providers**: declare new node kinds and where to look for
1142
1189
  > them.
1143
1190
  >
1191
+ > Heads up: the same plugin management is in the UI too. From any
1192
+ > `sm serve` session, open the **gear icon → Plugins** tab to
1193
+ > browse and toggle plugins, CLI and UI hit the same store so a
1194
+ > change in one is reflected in the other. We'll use the CLI here
1195
+ > because it shows the full surface in a few lines, but knowing
1196
+ > the UI panel exists is useful for day-to-day work.
1197
+ >
1144
1198
  > Let's look at what's installed right now.
1145
1199
 
1146
1200
  Then run the commands:
@@ -1161,7 +1215,7 @@ behavior, or which id format `disable` / `enable` accept, see
1161
1215
  If `plugins list` shows zero entries (depends on the build), tell
1162
1216
  the tester no plugins are installed yet and offer to skip.
1163
1217
 
1164
- ### Step 13 Annotations and the `.sm` consent prompt (~3 min)
1218
+ ### Step 13: Annotations and the `.sm` consent prompt (~3 min)
1165
1219
 
1166
1220
  **Context**: every `.md` skill-map tracks gets a sibling
1167
1221
  **companion file** with extension `.sm` that carries **all of
@@ -1175,7 +1229,7 @@ and you'll encounter them often once you start working with
1175
1229
  the project.
1176
1230
 
1177
1231
  The first time skill-map wants to write one in a new project it
1178
- asks for your consent it never touches your filesystem without
1232
+ asks for your consent, it never touches your filesystem without
1179
1233
  permission. After you say yes, the choice persists per-checkout
1180
1234
  (gitignored) and the prompt never appears again.
1181
1235
 
@@ -1187,7 +1241,7 @@ sm sidecar annotate notes/todo.md
1187
1241
  ```
1188
1242
 
1189
1243
  Expected: a short explanation paragraph appears in the terminal,
1190
- followed by a `[Y/n]` prompt (capital Y = default Yes you can just
1244
+ followed by a `[Y/n]` prompt (capital Y = default Yes, you can just
1191
1245
  hit Enter). After accepting, `notes/todo.sm` appears next to
1192
1246
  `notes/todo.md` carrying an `identity:` block plus an empty
1193
1247
  `annotations: {}` block, and `.skill-map/settings.local.json` now
@@ -1198,7 +1252,7 @@ cat notes/todo.sm
1198
1252
  cat .skill-map/settings.local.json
1199
1253
  ```
1200
1254
 
1201
- **Why the prompt?** The choice is **per-user, per-project** stored
1255
+ **Why the prompt?** The choice is **per-user, per-project**: stored
1202
1256
  in the gitignored `settings.local.json` so each contributor consents
1203
1257
  independently and nothing about the choice travels via the repo.
1204
1258
  Once accepted, the flag stays set and skill-map will never ask
@@ -1214,7 +1268,7 @@ If the tester asks about `sm bump` vs `sm sidecar annotate` vs
1214
1268
  ## Scope clarifications (on demand)
1215
1269
 
1216
1270
  Reference material for the "mention only if the tester asks"
1217
- beats in Steps 7, 8 and 9. Do NOT volunteer these unprompted
1271
+ beats in Steps 7, 8 and 9. Do NOT volunteer these unprompted,
1218
1272
  they exist so the agent has a precise answer ready when the
1219
1273
  tester pulls on the thread.
1220
1274
 
@@ -1226,20 +1280,11 @@ tester pulls on the thread.
1226
1280
  detection (a node whose file disappeared, or a candidate rename
1227
1281
  the kernel is still unsure about). Our fixture doesn't produce
1228
1282
  orphans of that kind, so `sm orphans` will print "No orphan /
1229
- auto-rename issues" that's expected, not a bug.
1230
-
1231
- ### `plugins doctor` warnings on a clean fixture
1232
-
1233
- `doctor` may emit 1-2 informational warnings about `explorationDir`
1234
- not existing for `gemini/gemini` (`~/.gemini`) or
1235
- `agent-skills/agent-skills` (`.agents`). These are normal on a
1236
- machine that has not installed those tools — the providers declare
1237
- optional discovery paths and warn when the path is absent. Nothing
1238
- is broken; the providers just have nothing to scan.
1283
+ auto-rename issues", that's expected, not a bug.
1239
1284
 
1240
1285
  ### `sm plugins show <qualified-id>`
1241
1286
 
1242
- The verb is informational passing `core/external-url-counter`
1287
+ The verb is informational, passing `core/external-url-counter`
1243
1288
  validates the extension exists and then renders the **parent
1244
1289
  bundle's** detail (i.e. the full `core` listing). The extension
1245
1290
  you named lives in that list. This is deliberate: forcing the user
@@ -1255,7 +1300,7 @@ toggles every Claude extension at once) or a **qualified extension
1255
1300
  id** `<bundle>/<ext-id>` (e.g. `core/external-url-counter`). The
1256
1301
  display format you see in `plugins list`
1257
1302
  (`extractor:core/external-url-counter@1.0.0`) includes the kind
1258
- prefix and the version for readability strip both when passing
1303
+ prefix and the version for readability, strip both when passing
1259
1304
  the id to `disable` / `enable`. Per-extension toggles only work on
1260
1305
  extension-granularity bundles like `core`; the `claude` bundle is
1261
1306
  bundle-granularity and only accepts the bundle id.
@@ -1265,7 +1310,7 @@ bundle-granularity and only accepts the bundle id.
1265
1310
  - `sm sidecar annotate` is the scaffold verb (creates a fresh
1266
1311
  `.sm`).
1267
1312
  - `sm bump <node>` is the day-to-day verb that increments the
1268
- sidecar's version and refreshes its hashes same consent gate.
1313
+ sidecar's version and refreshes its hashes, same consent gate.
1269
1314
  - `sm sidecar refresh <node>` is the hash-only update (no version
1270
1315
  bump).
1271
1316
 
@@ -1273,77 +1318,27 @@ bundle-granularity and only accepts the bundle id.
1273
1318
 
1274
1319
  ## Final wrap-up
1275
1320
 
1276
- <!-- TODO(arquitecto): remove the "send findings to Pusher" flow from
1277
- this tutorial. It is not part of the roadmap v1 surface and the
1278
- Pusher hand-off should not appear in the public tester experience.
1279
- Strip the report-to-Pusher offer, the `sm-tutorial-report.md`
1280
- template, and any closing copy that names Pusher. -->
1281
-
1282
- When everything is done (demo only, or demo + deep-dive), **offer to
1283
- generate a report file to send to Pusher**:
1321
+ When everything is done (demo only, or demo + deep-dive), show the
1322
+ closing block (open with a "thanks, that's a wrap" line, then the
1323
+ sm-master pointer + cleanup):
1284
1324
 
1285
- > Thanks! That's a wrap. Before closing:
1325
+ > Thanks! That's a wrap.
1286
1326
  >
1287
- > Want me to generate a consolidated **report file** (a recap of
1288
- > the walkthrough + findings the bugs or rough edges you spotted
1289
- > along the way + environment info) ready to send to **Pusher**?
1290
- > I'll save it as `<cwd>/sm-tutorial-report.md`.
1327
+ > One more thing before you go: there's a companion skill called
1328
+ > **sm-master** that picks up where this tutorial leaves off. It's
1329
+ > a modular deep-dive, you choose which areas to explore from a
1330
+ > menu, and it covers a guided tour of the built-in plugins
1331
+ > (extractors, analyzers, actions, hooks, formatters, providers).
1291
1332
  >
1292
- > 1. **Yes, generate it**
1293
- > 2. **No, I'm good**
1294
-
1295
- If they say **1**, write `<cwd>/sm-tutorial-report.md` with this
1296
- template:
1333
+ > When you're ready, open a fresh empty directory and run:
1297
1334
 
1298
- ```markdown
1299
- # sm-tutorial — report for Pusher
1300
-
1301
- - **Date**: <ISO-8601>
1302
- - **Depth reached**: <basic | full>
1303
- - **Tester**: level <N> (if applicable)
1304
- - **Tutorial directory**: <cwd>
1305
- - **Steps completed**: N / 7 demo + X / 6 deep-dive (if applicable)
1306
- - **Steps skipped**: Y (if applicable)
1307
- - **Total time**: ~<computed from timestamps>
1308
-
1309
- ## Environment
1310
- - `sm version`: <version>
1311
- - Node: <version>
1312
- - OS: <platform>
1313
-
1314
- ## Findings logged
1315
- <dump the relevant content of findings.md, without the generic header>
1316
-
1317
- ## Additional tester notes
1318
- <if they left free-form comments>
1335
+ ```bash
1336
+ sm tutorial master
1319
1337
  ```
1320
1338
 
1321
- Then show:
1322
-
1323
- > Done. The report is at:
1324
- >
1325
- > <cwd>/sm-tutorial-report.md
1326
- >
1327
- > Send it to Pusher whenever you're ready (over the agreed channel).
1328
-
1329
- If they say **2**, skip the report path and go straight to the
1330
- closing block below.
1331
-
1332
- **Always show this closing block** (regardless of the report
1333
- choice — both branches converge here):
1334
-
1335
- > One more thing before you go: there's a companion skill called
1336
- > **sm-master** that picks up where this tutorial leaves off. It's
1337
- > a modular deep-dive — you choose which areas to explore from a
1338
- > menu — and it covers a guided tour of the built-in plugins
1339
- > (extractors, analyzers, actions, hooks, formatters, providers),
1340
- > plugin authoring via `sm plugins create` / `sm plugins upgrade`,
1341
- > and settings + view-slots at depth. Same external-tester
1342
- > audience, same pause/resume style, but a lot more ground covered.
1343
- >
1344
- > When you're ready, **invoke it from a fresh empty directory**
1345
- > (same setup as this tutorial), and just say `sm-master` or
1346
- > `advanced tutorial` to start.
1339
+ > That drops `sm-master.md` in the cwd. Then load it from your
1340
+ > agent (e.g. `ejecutá @sm-master.md` in Claude Code, or the
1341
+ > equivalent `@`-mention in Gemini CLI) and the deep-dive starts.
1347
1342
  >
1348
1343
  > To delete everything THIS tutorial left behind, if the cwd was a
1349
1344
  > dedicated dir:
@@ -1364,7 +1359,7 @@ the cwd, start like this (do NOT repeat pre-flight from scratch):
1364
1359
  > 8-13)", depending on the yaml state).
1365
1360
  >
1366
1361
  > 1. **Continue** from where you left off
1367
- > 2. **Start over** wipes all the tutorial content in this dir
1362
+ > 2. **Start over**: wipes all the tutorial content in this dir
1368
1363
  > (asks for confirmation)
1369
1364
  > 3. **Exit** without touching anything
1370
1365
 
@@ -1376,7 +1371,7 @@ anything**:
1376
1371
 
1377
1372
  > This `tutorial-state.yml` was generated for a different
1378
1373
  > directory (`<saved cwd>`). The current dir is `<pwd>`. I'm
1379
- > refusing to wipe your `.claude/`, `notes/`, etc. here are
1374
+ > refusing to wipe, your `.claude/`, `notes/`, etc. here are
1380
1375
  > probably yours, not the tutorial's. Move to `<saved cwd>` and
1381
1376
  > re-invoke me from there, or delete `tutorial-state.yml` by
1382
1377
  > hand if you really want to start fresh here.
@@ -1400,7 +1395,6 @@ anything**:
1400
1395
  > notes/todo.md
1401
1396
  > notes/demo-guideline.md
1402
1397
  > notes/private-credentials.md
1403
- > sm-tutorial-report.md (if present)
1404
1398
  > export.* (if present)
1405
1399
  > dump.sql (if present)
1406
1400
  > ```
@@ -1414,7 +1408,7 @@ anything**:
1414
1408
 
1415
1409
  3. Only on the literal `yes, wipe` reply, delete those exact paths.
1416
1410
  Do NOT recursively `rm -rf` `<provider_dir>/` or `notes/` as
1417
- directories only the specific tutorial-owned files inside, in
1411
+ directories, only the specific tutorial-owned files inside, in
1418
1412
  case the tester has unrelated files there. After deletion, also
1419
1413
  `rmdir` the per-provider subdirs that actually exist
1420
1414
  (`<provider_dir>/agents`, `<provider_dir>/commands`,
@@ -1430,7 +1424,7 @@ anything**:
1430
1424
  shorthand for `sm serve` with defaults). Tell the tester to
1431
1425
  switch verbs: stop the failed `sm`, then run
1432
1426
  `sm serve --port 4243`. The browser link printed by the server
1433
- changes accordingly they should open the new URL, not the
1427
+ changes accordingly, they should open the new URL, not the
1434
1428
  default 4242.
1435
1429
  - **`sm` doesn't pick up changes on WSL** → known on WSL2 with
1436
1430
  files under `/mnt/c/`. Suggest exiting, running `mkdir