@skill-map/cli 0.16.1 → 0.16.3

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,7 +3,7 @@ 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 (~7 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
8
  the agent edits `.md` files — and at the end offers an optional
9
9
  deep-dive (~30-40 min) covering the rest of the CLI with flags and
@@ -23,7 +23,7 @@ validated in pre-flight), narrate what you did, show the commands to
23
23
  type, and wait for the tester to run them and confirm.
24
24
 
25
25
  **Internal structure (do NOT mention this to the tester)**: the tutorial
26
- has a short first phase (~7 min) that demonstrates the live UI, and an
26
+ has a short first phase (~10 min) that demonstrates the live UI, and an
27
27
  optional second phase (~30-40 min) covering the rest of the CLI.
28
28
 
29
29
  > ⚠️ For the tester this is **a single continuous flow**. Never use
@@ -35,10 +35,58 @@ optional second phase (~30-40 min) covering the rest of the CLI.
35
35
 
36
36
  ## Tone
37
37
 
38
- - Español casual, neutro con un toque argentino. Frases cortas. Cero
39
- jerga innecesaria.
40
- - Llamás al tester por su nombre si te lo dice; si no, "vos".
41
- - No sos condescendiente. Si pide algo que va a romper, lo avisás claro.
38
+ - Spanish (when the tester's language is Spanish): casual, neutral,
39
+ NOT rioplatense. Short sentences. No unnecessary jargon. Use
40
+ `tú` form, not `vos` `puedes`, `mira`, `prueba`, `crea`, NOT
41
+ `podés`, `mirá`, `probá`, `creá`. Avoid Argentine fillers
42
+ (`dale`, `bueno`, `che`, `re-`, `genial`).
43
+ - Address the tester by name if they introduced themselves; if not,
44
+ the implicit second person from the verb is enough. No need to
45
+ invent a stand-in pronoun.
46
+ - Don't be condescending. If they ask for something that will
47
+ break, say so directly.
48
+ - **Translate product vocabulary into Spanish, do NOT leave English
49
+ loanwords embedded in Spanish prose.** When rendering tester-facing
50
+ copy in Spanish, use these equivalences:
51
+ - `kind` → `tipo` (skill-map talks about node "kinds"; in
52
+ Spanish output the word is `tipo` / `tipos`, NOT "kinds").
53
+ - `connector` → `conector`.
54
+ - `watcher` → `observador` (or rephrase: "skill-map sigue tus
55
+ cambios" instead of "el watcher detecta...").
56
+ - `scan` (verb) → `escanear`; `scan` (noun) → `escaneo`.
57
+ - `node` → `nodo`; `link` → `enlace` or `vínculo`; `frontmatter`
58
+ keep as-is (it's a technical term with no clean Spanish
59
+ equivalent — explain in parens per the rule above).
60
+ - File paths, frontmatter keys (`name`, `description`, `event`,
61
+ etc.), CLI verbs (`sm init`, `sm watch`), and code identifiers
62
+ stay English — that's the public surface, not jargon.
63
+ Anti-pattern (do NOT emit): "aparecen los otros cuatro kinds",
64
+ "el watcher detectó el cambio", "vamos a hacer un scan ahora".
65
+ Correct: "aparecen los otros cuatro tipos", "skill-map detectó
66
+ el cambio", "vamos a escanear ahora".
67
+ - **Stay silent during backstage work.** Do NOT narrate operational
68
+ steps you're about to take or internal checks. Forbidden patterns
69
+ include "Voy a verificar primero que el directorio esté listo",
70
+ "Let me run `sm version` to confirm the binary works", "Mientras
71
+ esperás, te cuento el estado", "Vamos a ir paso a paso", "OK, ya
72
+ preparé los archivos, ahora seguimos con...", and any other
73
+ meta-narration of your own plumbing. Pre-flight checks, file
74
+ reads, `Bash ls`, `Write` of fixtures, state-file updates — all
75
+ silent. The tester only hears from you when (a) you need them to
76
+ do something, (b) a reveal landed and you want a confirm, or
77
+ (c) something failed and they need to know. Between those
78
+ moments, work without commentary.
79
+ - **Explain technical terms in parentheses the first time you
80
+ mention them in a tester-facing blockquote.** Assume the tester
81
+ is non-technical; many will not know what `frontmatter`,
82
+ `findings`, `glob`, `watcher`, `connector`, `extractor`, or
83
+ `kind` mean. Examples:
84
+ - `frontmatter (the YAML block at the top of every .md, between the two --- lines)`
85
+ - `findings (any bugs or rough edges you spot — I'll log them for the team)`
86
+ - `glob (a pattern with wildcards, same shape as .gitignore)`
87
+ Internal narration in this SKILL.md does not need the gloss;
88
+ this rule is purely about what the agent says to the tester.
89
+ After the first mention in a session, the bare term is fine.
42
90
  - **Messages addressed to the tester are rendered as Markdown
43
91
  blockquotes** (lines prefixed with `> `): instructions, narrative
44
92
  context, numbered choice menus, prompts, confirmations. The
@@ -49,10 +97,10 @@ optional second phase (~30-40 min) covering the rest of the CLI.
49
97
  narrative and a command, write the narrative in a blockquote
50
98
  *above* the bare code block (not inside it).
51
99
  - **Mirror the tester's language**: if the first message they wrote
52
- was in Spanish, run the conversation in Argentine Spanish (per
53
- the Tone bullets above, voseo and all); if in English, run it in
54
- plain English. Internal narration in this SKILL.md stays in
55
- English regardless.
100
+ was in Spanish, run the conversation in neutral Spanish (per
101
+ the Tone bullets above — `tú` form, no rioplatense); if in
102
+ English, run it in plain English. Internal narration in this
103
+ SKILL.md stays in English regardless.
56
104
  - **Never emit bilingual user-facing copy**. The samples in the
57
105
  blockquotes throughout this SKILL are written in English as the
58
106
  base; translate the entire block to Spanish when the tester
@@ -81,39 +129,48 @@ optional second phase (~30-40 min) covering the rest of the CLI.
81
129
  demo needs this so the watcher has something to react to).
82
130
  - Read files to verify what the tester modified.
83
131
  - Everything else is run by the tester.
84
- - **Configuration files are off-limits to your editing tools**:
85
- `.skillmapignore`, `.skill-map/settings.json`,
86
- `.skill-map/settings.local.json`, and `.gitignore` are
87
- ALWAYS edited by the tester, never by you. When a step calls
88
- for a change to one of those, you describe the edit in a
89
- blockquote and the tester applies it in their own editor.
90
- The pedagogical point is that those files belong to the user
91
- they need to internalise where they live and how to change
92
- them. Doing it for them defeats the lesson.
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.
93
152
  2. **After every command block, stop and wait.** The tester pastes
94
153
  the output or replies "OK" / "done". Only then do you advance.
95
- 3. **Persist progress after every step / stage.** Update
154
+ 3. **Persist progress after every step.** Update
96
155
  `tutorial-state.yml` with `done` / `failed` / `skipped` and a
97
156
  timestamp.
98
157
  4. **If the tester reports anything weird**, offer to record it in
99
158
  `findings.md` (in the cwd). Those are the bugs the team will read.
100
- 5. **One stage at a time.** Finish, ask if they want to continue, do
159
+ 5. **One step at a time.** Finish, ask if they want to continue, do
101
160
  the next one.
102
161
  6. **If `tutorial-state.yml` already exists in the cwd** when invoked,
103
162
  do not overwrite anything. Read it, show progress, offer to
104
163
  *continue* or *start over* (the latter requires explicit
105
164
  confirmation and wipes the tutorial content).
106
- 7. **Mirror the tester's language**: if the first message they wrote
107
- was in Spanish, run the conversation in Argentine Spanish (per
108
- Tone); if in English, run it in plain English. Internal
109
- instructions in this SKILL.md stay in English so any maintainer
110
- can read them, and fixture content stays in English (it's
111
- technical Markdown, more realistic that way). Blockquote literals
112
- in this document are the messages you actually say to the tester
113
- translate them on the fly to the tester's language and render
114
- them as blockquote in the chat. Code blocks below them stay as
115
- bare ` ```bash ` fences (no `> ` prefix) so the tester can copy
116
- cleanly.
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.
117
174
 
118
175
  ## Pre-flight
119
176
 
@@ -147,13 +204,17 @@ parentheticals or explanations of which items you ignored:
147
204
 
148
205
  (or, in Spanish: "Listo, el dir está limpio. Sigamos.")
149
206
 
150
- Rules (after filtering the ignored items):
207
+ **Order of checks** (apply in this order — do not skip steps):
151
208
 
152
- - Empty listing directory is empty. **Proceed.**
153
- - Listing contains `tutorial-state.yml` (before filtering) → resume
154
- mode. **Proceed** down that branch.
155
- - Anything else (files, dotfiles, other dirs) → **stop and tell**
156
- the tester:
209
+ 1. Look at the **raw** `ls -A` output, before filtering. If
210
+ `tutorial-state.yml` is present**resume mode**. Skip the
211
+ rest of this section and follow the resume branch (see
212
+ §Resume / restart).
213
+ 2. Otherwise, apply the ignored-items filter from the whitelist
214
+ above and inspect what remains:
215
+ - Empty after filtering → fresh dir. **Proceed.**
216
+ - Anything else (files, dotfiles, other dirs) → **stop and
217
+ tell** the tester:
157
218
 
158
219
  > I detected files in here:
159
220
  >
@@ -210,6 +271,12 @@ which sm
210
271
  sm version
211
272
  ```
212
273
 
274
+ This check is **silent on success**. Do NOT narrate the result to
275
+ the tester ("`sm` v X.Y.Z responded, all good"). Save the version
276
+ internally and move on. The tester does not need a status report
277
+ for a backstage health check; speaking up here adds noise without
278
+ information. Only break the silence if something actually fails.
279
+
213
280
  If `sm` isn't installed, tell the tester:
214
281
 
215
282
  > You don't have `sm` yet. You'll need Node 20+ and then:
@@ -225,8 +292,8 @@ permissions issue. Suggest `node --version` and walk them through it.
225
292
 
226
293
  ### 3. Create the initial fixture (one node only)
227
294
 
228
- The tutorial builds the graph **progressively** in three reveals during
229
- Step 3 (Live UI). Right now, in pre-flight, you only create **one
295
+ The tutorial builds the graph **progressively** in five sub-steps during
296
+ Step 2 (Live UI). Right now, in pre-flight, you only create **one
230
297
  file** — a single agent — so the tester's first look at the UI
231
298
  shows exactly one node. The other four kinds (skill, command, hook,
232
299
  note) and the connectors between all five are added later, one
@@ -273,7 +340,7 @@ Rules:
273
340
  If you spot anything weird during the tutorial, log it here.
274
341
 
275
342
  Per finding:
276
- - **Stage**: <id>
343
+ - **Step**: <id>
277
344
  - **Command**: `sm ...`
278
345
  - **Expected**: ...
279
346
  - **Got**: ...
@@ -300,36 +367,33 @@ route:
300
367
  status: "not_started" # not_started | in_progress | done | declined
301
368
  estimated_min: 35
302
369
  short_steps:
303
- - id: "1-version"
304
- title: "sm version"
305
- status: "pending"
306
- - id: "2-init"
370
+ - id: "1-init"
307
371
  title: "sm init"
308
372
  status: "pending"
309
- - id: "3-ui-live"
373
+ - id: "2-ui-live"
310
374
  title: "⭐ Live UI: bare sm + live edits by the agent"
311
375
  status: "pending"
312
- - id: "4-handoff"
376
+ - id: "3-handoff"
313
377
  title: "Wrap-up of the demo and offer to keep going"
314
378
  status: "pending"
315
- long_stages:
316
- - id: "L1-tester-edits"
379
+ long_steps:
380
+ - id: "4-tester-edits"
317
381
  title: "Tester edits live (extends the UI demo)"
318
382
  status: "pending"
319
- - id: "L2-cli-browse"
383
+ - id: "5-cli-browse"
320
384
  title: "Browse CLI: list / show / check"
321
385
  status: "pending"
322
386
  verbs: ["sm list", "sm show", "sm check"]
323
- - id: "L3-ascii"
387
+ - id: "6-ascii"
324
388
  title: "ASCII: graph + export"
325
389
  status: "pending"
326
390
  verbs: ["sm graph", "sm export"]
327
- - id: "L4-orphans"
328
- title: "Issues and orphans"
391
+ - id: "7-issues"
392
+ title: "Issues: broken refs"
329
393
  status: "pending"
330
- verbs: ["sm orphans", "sm orphans reconcile",
331
- "sm orphans undo-rename"]
332
- - id: "L5-plugins"
394
+ verbs: ["sm check", "sm check --rules broken-ref",
395
+ "sm check --json"]
396
+ - id: "8-plugins"
333
397
  title: "Plugins"
334
398
  status: "pending"
335
399
  verbs: ["sm plugins list", "sm plugins show",
@@ -338,9 +402,9 @@ long_stages:
338
402
  findings_file: "./findings.md"
339
403
  ```
340
404
 
341
- ## Per-step / per-stage cycle
405
+ ## Per-step cycle
342
406
 
343
- For every step in the demo and every stage in the deep-dive:
407
+ For every step in the tutorial:
344
408
 
345
409
  1. **Announcement**: "Step N: `<title>`. ~M minutes." One sentence
346
410
  of context.
@@ -359,20 +423,11 @@ to resume (re-invoke the skill from the same dir).
359
423
 
360
424
  ---
361
425
 
362
- ## DEMO (~7 min)
426
+ ## DEMO (~10 min)
363
427
 
364
428
  Always runs. The pedagogical hook is the live UI.
365
429
 
366
- ### Step 1 — `sm version` (30 s)
367
-
368
- Already done in pre-flight. Confirm to the tester in one short
369
- blockquote, translated to their language:
370
-
371
- > OK, `sm` v X.Y.Z responded. Let's go.
372
-
373
- Mark `1-version: done`.
374
-
375
- ### Step 2 — `sm init` (1 min)
430
+ ### Step 1 — `sm init` (1 min)
376
431
 
377
432
  **Context**: `sm init` creates a hidden `.skill-map/` folder in the
378
433
  cwd holding the database where skill-map stores what it learns about
@@ -398,38 +453,38 @@ sm-tutorial.md
398
453
  findings.md
399
454
  tutorial-state.yml
400
455
  sm-tutorial-report.md
401
- # tutorial outputs that may land at the root if a stage forgets to clean up
456
+ # tutorial outputs that may land at the root if a step forgets to clean up
402
457
  export.*
403
458
  dump.sql
404
459
  ```
405
460
 
406
- Mark `2-init: done`.
461
+ Mark `1-init: done`.
407
462
 
408
- ### Step 3 — ⭐ Live UI (4-5 min)
463
+ ### Step 2 — ⭐ Live UI (4-5 min)
409
464
 
410
465
  **Context**: typing `sm` alone (no arguments) in an initialised dir
411
466
  starts the UI server with the watcher built in. One process, one
412
467
  terminal: it boots the server, scans the `.md` files, detects
413
468
  changes, and pushes events over WebSocket to the live UI.
414
469
 
415
- This step has **five reveals**, each one driven by you editing
416
- files while the server stays up — except Reveal 3, where the
417
- tester takes the keyboard for the first time.
470
+ This step has **five sub-steps** (2.1 through 2.5), each one driven
471
+ by you editing files while the server stays up — except Step 2.3,
472
+ where the tester takes the keyboard for the first time.
418
473
 
419
- 1. **Reveal 1 (boot)** — one node alone (the agent).
420
- 2. **Reveal 2 (kinds)** — the four other kinds appear as new nodes,
474
+ 1. **Step 2.1 (boot)** — one node alone (the agent).
475
+ 2. **Step 2.2 (kinds)** — the four other kinds appear as new nodes,
421
476
  still unconnected.
422
- 3. **Reveal 3 (your first edit)** — the **tester** edits the
477
+ 3. **Step 2.3 (your first edit)** — the **tester** edits the
423
478
  `description` of the agent's `.md` and watches the card
424
479
  refresh in the graph.
425
- 4. **Reveal 4 (connectors)** — the connectors light up between all
480
+ 4. **Step 2.4 (connectors)** — the connectors light up between all
426
481
  five nodes.
427
- 5. **Reveal 5 (ignore)** — a private file appears, then disappears
482
+ 5. **Step 2.5 (ignore)** — a private file appears, then disappears
428
483
  the moment a pattern is added to `.skillmapignore`.
429
484
 
430
485
  The pedagogical arc: a single dot → a constellation of dots →
431
486
  your own edit lands → graph → a graph that respects the user's
432
- ignore list. Each reveal stops at a confirm prompt before you do
487
+ ignore list. Each sub-step stops at a confirm prompt before you do
433
488
  the next.
434
489
 
435
490
  **Command** (one terminal):
@@ -438,48 +493,50 @@ the next.
438
493
  sm
439
494
  ```
440
495
 
441
- Before Reveal 1, ask the tester to set up a **side-by-side view** so
442
- they can watch the magic happen without alt-tabbing every reveal.
496
+ Before Step 2.1, ask the tester to set up a **side-by-side view** so
497
+ they can watch the magic happen without alt-tabbing every sub-step.
443
498
  Tell the tester:
444
499
 
445
- > Arrange your screen so two windows are visible at the same time:
446
- >
447
- > 1. **The browser** at `http://127.0.0.1:4242` where the graph
448
- > will update in real time.
449
- > 2. **This terminal** the one where you're talking to me. You'll
450
- > see me announce each reveal here, then confirm what you see
451
- > in the browser.
452
- >
453
- > The third window — the terminal running `sm` — you can leave
454
- > minimized or off to the side; it will just print scan progress
500
+ > Now arrange your screen so the **browser** (where the graph will
501
+ > update in real time) and **this chat** are both visible at once
502
+ > typical layout is browser on the left half, chat on the right
503
+ > (or any split that lets you see both). The terminal running
504
+ > `sm` can stay off to the side; it just prints scan progress
455
505
  > lines and you don't need to read them.
456
506
  >
457
- > A typical layout: browser on the left half, this chat on the
458
- > right half. Or any split that lets you see both at once. Tell
459
- > me when you're set up and we start.
507
+ > Tell me when you're set up and we start.
508
+
509
+ Wait for confirmation before moving on. Once they're ready, prompt
510
+ them to launch the server and open the link it prints — without
511
+ hardcoding the URL here, since the verb itself is the source of
512
+ truth (it logs the bound `http://host:port` after listen):
460
513
 
461
- Wait for confirmation before moving on.
514
+ > In the terminal you opened for `sm`, run the command above. After
515
+ > a couple of seconds it will print a line with the URL where the
516
+ > UI is listening — copy that link and open it in the browser you
517
+ > just arranged. Tell me when you see the page load.
462
518
 
463
- #### Reveal 1 the lone agent
519
+ Wait for confirmation that the page loaded.
520
+
521
+ #### Step 2.1 — the lone agent
464
522
 
465
523
  Tell the tester:
466
524
 
467
- > The server is running. Open the URL it printed (typically
468
- > **http://127.0.0.1:4242**).
469
- >
470
525
  > You'll see exactly **one node** in the graph: `demo-agent` (kind
471
526
  > `agent`). That's our starting point.
472
527
  >
473
528
  > Walk the 3 views before we go on:
474
529
  > 1. **Graph** — the single agent node.
475
530
  > 2. **List** — one row, with path / kind / metadata.
476
- > 3. **Inspector** — click the node to see frontmatter and links.
531
+ > 3. **Inspector** — click the node to see its frontmatter (the
532
+ > YAML block at the top of every `.md`, between the two `---`
533
+ > lines) and links.
477
534
  >
478
535
  > Did the node show up?
479
536
 
480
537
  Wait for confirmation.
481
538
 
482
- #### Reveal 2 — the other four kinds appear (the magic)
539
+ #### Step 2.2 — the other four kinds appear (the magic)
483
540
 
484
541
  Leave the browser open and the terminal with `sm` running. You
485
542
  create the four missing kinds **without any cross-fixture links**
@@ -591,21 +648,28 @@ Tell the tester:
591
648
 
592
649
  Wait for confirmation.
593
650
 
594
- #### Reveal 3 — your first edit
651
+ #### Step 2.3 — your first edit
595
652
 
596
653
  Up to here you've been watching the agent write files. Now hand
597
654
  the keyboard over: the lesson is that the watcher reacts to
598
655
  **any** `.md` edit under the cwd, not just to files the agent
599
656
  authors. After this beat, the tester has the muscle memory for
600
- "save → graph updates", which Reveal 5 (`.skillmapignore`) reuses
657
+ "save → graph updates", which Step 2.5 (`.skillmapignore`) reuses
601
658
  verbatim.
602
659
 
603
660
  Tell the tester:
604
661
 
605
- > Tu turno. Open `.claude/agents/demo-agent.md` in your editor of
606
- > choice. In the frontmatter, change the `description:` field to
607
- > any text you want the actual content does not matter, just
608
- > make it different from what's there now. Save the file.
662
+ > Your turn. First, in the browser, **expand the `demo-agent`
663
+ > card** (click the chevron / arrow on the card to open it). That
664
+ > reveals the description currently showing for the node that's
665
+ > the field you'll edit next, so leave the card open and the
666
+ > change will be obvious.
667
+ >
668
+ > Now open `.claude/agents/demo-agent.md` in your editor of
669
+ > choice. In the **frontmatter** at the top of the file, change
670
+ > the `description:` field to any text you want — the actual
671
+ > content does not matter, just make it different from what's
672
+ > there now. Save the file.
609
673
  >
610
674
  > Watch the browser. The `demo-agent` card should refresh its
611
675
  > description in real time, no reload, no Ctrl+C — same watcher
@@ -618,7 +682,7 @@ Wait for confirmation. You MAY use `Read` on the file afterwards
618
682
  to verify the change landed (read-only, allowed under Inviolable
619
683
  rule #1) before moving on.
620
684
 
621
- #### Reveal 4 — the connectors light up
685
+ #### Step 2.4 — the connectors light up
622
686
 
623
687
  Now you edit the existing files to add the cross-fixture links —
624
688
  each one becomes a connector in the graph. Apply with `Edit` (do
@@ -672,22 +736,22 @@ Tell the tester:
672
736
  > Confirm. If a connector is missing, refresh the browser and tell
673
737
  > me.
674
738
 
675
- Wait for confirmation. **Do NOT move on to Reveal 5** until the
676
- connectors are confirmed visible — Reveal 5 reuses the same live UI
739
+ Wait for confirmation. **Do NOT move on to Step 2.5** until the
740
+ connectors are confirmed visible — Step 2.5 reuses the same live UI
677
741
  session.
678
742
 
679
- #### Reveal 5 — silence a private file via `.skillmapignore`
743
+ #### Step 2.5 — silence a private file via `.skillmapignore`
680
744
 
681
- The first four reveals showed the watcher picking up new files and
682
- edits (yours and theirs). Reveal 5 flips the direction: a file the
745
+ The first four sub-steps showed the watcher picking up new files and
746
+ edits (yours and theirs). Step 2.5 flips the direction: a file the
683
747
  tester DOES NOT want
684
748
  in the graph (a draft, a scratch file, a secret) gets hidden by a
685
749
  single line in `.skillmapignore`. Same live mechanism — no restart.
686
750
 
687
751
  `sm init` already wrote a starter `.skillmapignore` at the scope
688
- root. The flow has three beats:
752
+ root. The flow has three sub-steps:
689
753
 
690
- **Beat A — you create one new fixture file (the agent does this).**
754
+ **Step 2.5.1 — you create one new fixture file (the agent does this).**
691
755
 
692
756
  `Write` `notes/private-credentials.md` — kind `note`, simulates a
693
757
  file the tester would never want surfacing publicly:
@@ -712,7 +776,7 @@ Confirm the file appears in the graph as a sixth node
712
776
  (`notes/private-credentials`). The watcher sees it like any
713
777
  other `.md` — that's the point of the demo.
714
778
 
715
- **Beat B — you show the project structure (the agent does this).**
779
+ **Step 2.5.2 — you show the project structure (the agent does this).**
716
780
 
717
781
  Before asking the tester to touch `.skillmapignore`, give them a
718
782
  mental map of the folder so they know where the file lives and
@@ -720,8 +784,7 @@ what's around it. Use `Bash` (`ls -la` and `ls -la notes/` if a
720
784
  deeper view helps) and present the listing inside a blockquote so
721
785
  the tester sees what their cwd holds:
722
786
 
723
- > Antes del último paso, esto es lo que tenés en el directorio
724
- > ahora mismo:
787
+ > One last step. Here's what your directory looks like right now:
725
788
  >
726
789
  > ```
727
790
  > . ← your cwd
@@ -731,9 +794,6 @@ the tester sees what their cwd holds:
731
794
  > │ ├── hooks/demo-hook.md
732
795
  > │ └── skills/demo-skill/SKILL.md
733
796
  > ├── .skill-map/ ← project DB + settings (managed)
734
- > │ ├── settings.json
735
- > │ ├── settings.local.json
736
- > │ └── skill-map.db
737
797
  > ├── .skillmapignore ← the file we're about to edit
738
798
  > ├── notes/
739
799
  > │ ├── todo.md
@@ -749,7 +809,7 @@ Adjust the actual tree shown to whatever `ls -la` returns — the
749
809
  goal is "tester recognises their own filesystem", not a copy of
750
810
  the snippet above.
751
811
 
752
- **Beat C — the tester edits `.skillmapignore` (NOT the agent).**
812
+ **Step 2.5.3 — the tester edits `.skillmapignore` (NOT the agent).**
753
813
 
754
814
  Per Inviolable rule #1, you DO NOT touch `.skillmapignore` with
755
815
  your `Edit` tool. Tell the tester to do it from their editor:
@@ -781,12 +841,12 @@ verify the appended pattern landed correctly (in case
781
841
  allowed. Once confirmed, ask them to stop the server with
782
842
  **Ctrl+C** in the terminal before continuing.
783
843
 
784
- Mark `3-ui-live: done`.
844
+ Mark `2-ui-live: done`.
785
845
 
786
- ### Step 4 — Wrap-up of the demo and offer to keep going (30 s)
846
+ ### Step 3 — Wrap-up of the demo and offer to keep going (30 s)
787
847
 
788
848
  > All set! That's the heart of skill-map: you edit a `.md` and the
789
- > UI sees it instantly. In **~7 minutes** you've already seen the
849
+ > UI sees it instantly. In **~10 minutes** you've already seen the
790
850
  > full flow.
791
851
  >
792
852
  > If you want, **we can keep going deeper**: I'll walk you through
@@ -812,7 +872,7 @@ If they say **1**:
812
872
 
813
873
  ## DEEP-DIVE (~30-40 min) — opt-in
814
874
 
815
- Strictly new stages. Does not re-expand demo steps.
875
+ Strictly new steps. Does not re-expand demo steps.
816
876
 
817
877
  ### Level question (one time only, on entry)
818
878
 
@@ -832,15 +892,15 @@ Save into `tester.level` and modulate:
832
892
  - **Level 3**: dense blocks, flags included, no explanations of
833
893
  basic concepts.
834
894
 
835
- ### Stage L1 — Tester edits live (~3 min)
895
+ ### Step 4 — Tester edits live (~3 min)
836
896
 
837
897
  **Context**: in the demo you edited. Now it's their turn to confirm
838
898
  they can do it from their editor.
839
899
 
840
- This stage needs the server running. **Check first** before asking
841
- them to launch it: many testers leave it running from Step 3 and
900
+ This step needs the server running. **Check first** before asking
901
+ them to launch it: many testers leave it running from Step 2 and
842
902
  the demo wraps without an explicit Ctrl+C. Word the prompt as a
843
- conditional, e.g. "If the server from Step 3 is still up, leave it
903
+ conditional, e.g. "If the server from Step 2 is still up, leave it
844
904
  — if not, run `sm` again from the tutorial cwd and reopen the
845
905
  browser." Do not just say "start it again" — that risks a second
846
906
  process trying to bind the same port and confusing the tester.
@@ -849,16 +909,14 @@ process trying to bind the same port and confusing the tester.
849
909
  > editor of choice and remove the line that links to `demo-agent.md`.
850
910
  > Save. Watch the UI.
851
911
  >
852
- > Expected: the `demo-skill → demo-agent` connector disappears. If
853
- > `demo-agent.md` ends up with no one linking to it, it shows up as
854
- > an orphan (we'll create a similar dangling situation in stage L4
855
- > to see how `sm check` flags it).
912
+ > Expected: the `demo-skill → demo-agent` connector disappears in
913
+ > real time. The two nodes stay in the graph; only the edge goes.
856
914
 
857
915
  You verify by reading `.claude/skills/demo-skill/SKILL.md` to confirm
858
916
  the change was applied. Once they confirm, ask them to **Ctrl+C**
859
917
  the server.
860
918
 
861
- ### Stage L2 — Browse CLI: list / show / check (~3 min)
919
+ ### Step 5 — Browse CLI: list / show / check (~3 min)
862
920
 
863
921
  ```bash
864
922
  sm list
@@ -870,10 +928,10 @@ sm check
870
928
 
871
929
  Expected: you see the 5 fixture nodes listed with their kind;
872
930
  `check` runs the deterministic rules and reports a clean fixture
873
- (no issues at this point — we will plant one in stage L4 and watch
931
+ (no issues at this point — we will plant one in step 7 and watch
874
932
  the rule catch it).
875
933
 
876
- ### Stage L3 — ASCII: graph + export (~3 min)
934
+ ### Step 6 — ASCII: graph + export (~3 min)
877
935
 
878
936
  ```bash
879
937
  sm graph
@@ -886,7 +944,7 @@ ls -la export.*
886
944
  `graph` draws an ASCII tree. `export` filters and serialises to md
887
945
  or json.
888
946
 
889
- ### Stage L4 — Issues: broken refs (~3 min)
947
+ ### Step 7 — Issues: broken refs (~3 min)
890
948
 
891
949
  `broken-ref` is one of the deterministic rules `sm check` runs.
892
950
  We'll plant one and watch it surface — that's the easiest way to
@@ -924,7 +982,7 @@ rest of the deep-dive doesn't depend on it.
924
982
  > orphans of that kind, so `sm orphans` will print "No orphan /
925
983
  > auto-rename issues" — that's expected, not a bug.
926
984
 
927
- ### Stage L5 — Plugins (~3 min)
985
+ ### Step 8 — Plugins (~3 min)
928
986
 
929
987
  ```bash
930
988
  sm plugins list
@@ -963,8 +1021,9 @@ generate a report file to send to Pusher**:
963
1021
 
964
1022
  > Thanks! That's a wrap. Before closing:
965
1023
  >
966
- > Want me to generate a consolidated **report file** (recap of the
967
- > walkthrough + findings + environment) ready to send to **Pusher**?
1024
+ > Want me to generate a consolidated **report file** (a recap of
1025
+ > the walkthrough + findings the bugs or rough edges you spotted
1026
+ > along the way — + environment info) ready to send to **Pusher**?
968
1027
  > I'll save it as `<cwd>/sm-tutorial-report.md`.
969
1028
  >
970
1029
  > 1. **Yes, generate it**
@@ -980,8 +1039,8 @@ template:
980
1039
  - **Depth reached**: <basic | full>
981
1040
  - **Tester**: level <N> (if applicable)
982
1041
  - **Tutorial directory**: <cwd>
983
- - **Steps completed**: 4 / 4 + X / 5 deep-dive stages (if applicable)
984
- - **Stages skipped**: Y (if applicable)
1042
+ - **Steps completed**: N / 3 demo + X / 5 deep-dive (if applicable)
1043
+ - **Steps skipped**: Y (if applicable)
985
1044
  - **Total time**: ~<computed from timestamps>
986
1045
 
987
1046
  ## Environment
@@ -1019,27 +1078,71 @@ the cwd, start like this (do NOT repeat pre-flight from scratch):
1019
1078
 
1020
1079
  > I see you already started the tutorial.
1021
1080
  >
1022
- > You're at step <N> of 4 (or "you've already completed the first 4
1023
- > steps and you're on stage <M> of 5 of the deep-dive", depending on
1024
- > the yaml state).
1081
+ > You're at step <N> of 3 (or "you've already completed the demo
1082
+ > (steps 1-3) and you're on step <M> of 5 of the deep-dive (steps
1083
+ > 4-8)", depending on the yaml state).
1025
1084
  >
1026
1085
  > 1. **Continue** from where you left off
1027
1086
  > 2. **Start over** — wipes all the tutorial content in this dir
1028
1087
  > (asks for confirmation)
1029
1088
  > 3. **Exit** without touching anything
1030
1089
 
1031
- If they pick "start over", confirm explicitly. Only after
1032
- confirmation, delete the tutorial files in the cwd
1033
- (`tutorial-state.yml`, `findings.md`, `.skillmapignore`, `.claude/`,
1034
- `notes/`, `.skill-map/`, and any `export.*`, `dump.sql`, or
1035
- `sm-tutorial-report.md` that may have been left behind) and start
1036
- everything from pre-flight.
1090
+ If they pick "start over", do these checks **before deleting
1091
+ anything**:
1092
+
1093
+ 1. Read `tutorial.cwd` from `tutorial-state.yml` and compare with
1094
+ the current `pwd`. If they don't match, **refuse**:
1095
+
1096
+ > This `tutorial-state.yml` was generated for a different
1097
+ > directory (`<saved cwd>`). The current dir is `<pwd>`. I'm
1098
+ > refusing to wipe — your `.claude/`, `notes/`, etc. here are
1099
+ > probably yours, not the tutorial's. Move to `<saved cwd>` and
1100
+ > re-invoke me from there, or delete `tutorial-state.yml` by
1101
+ > hand if you really want to start fresh here.
1102
+
1103
+ 2. If the cwd matches, show the tester the exact list of paths
1104
+ you'll delete and ask for an explicit typed confirmation:
1105
+
1106
+ > Start over will delete these paths from `<cwd>`:
1107
+ >
1108
+ > ```
1109
+ > tutorial-state.yml
1110
+ > findings.md
1111
+ > .skillmapignore
1112
+ > .skill-map/
1113
+ > .claude/agents/demo-agent.md
1114
+ > .claude/commands/demo-command.md
1115
+ > .claude/hooks/demo-hook.md
1116
+ > .claude/skills/demo-skill/
1117
+ > notes/todo.md
1118
+ > notes/private-credentials.md
1119
+ > sm-tutorial-report.md (if present)
1120
+ > export.* (if present)
1121
+ > dump.sql (if present)
1122
+ > ```
1123
+ >
1124
+ > Type **`yes, wipe`** (exact text) to confirm. Anything else
1125
+ > cancels.
1126
+
1127
+ 3. Only on the literal `yes, wipe` reply, delete those exact paths.
1128
+ Do NOT recursively `rm -rf` `.claude/` or `notes/` as
1129
+ directories — only the specific tutorial-owned files inside, in
1130
+ case the tester has unrelated files there. After deletion, also
1131
+ `rmdir` `.claude/agents`, `.claude/commands`, `.claude/hooks`,
1132
+ `.claude/skills`, `notes/`, and `.claude/` if and only if they
1133
+ are empty (silent failure if not). Then start everything from
1134
+ pre-flight.
1037
1135
 
1038
1136
  ## Edge cases
1039
1137
 
1040
1138
  - **Tester doesn't have Node 20+** → guide them to `nvm` or
1041
1139
  nodejs.org. Don't try to install Node for them.
1042
- - **Port 4242 in use** → suggest `sm serve --port 4243`.
1140
+ - **Port 4242 in use** → bare `sm` doesn't accept flags (it's a
1141
+ shorthand for `sm serve` with defaults). Tell the tester to
1142
+ switch verbs: stop the failed `sm`, then run
1143
+ `sm serve --port 4243`. The browser link printed by the server
1144
+ changes accordingly — they should open the new URL, not the
1145
+ default 4242.
1043
1146
  - **`sm` doesn't pick up changes on WSL** → known on WSL2 with
1044
1147
  files under `/mnt/c/`. Suggest exiting, running `mkdir
1045
1148
  ~/sm-tutorial && cd ~/sm-tutorial` (Linux-native filesystem), and
@@ -1054,7 +1157,7 @@ everything from pre-flight.
1054
1157
 
1055
1158
  - Run `sm` verbs for the tester (except `sm version` ONCE in
1056
1159
  pre-flight).
1057
- - Advance to the next step / stage without confirmation.
1160
+ - Advance to the next step without confirmation.
1058
1161
  - Modify files outside the tutorial cwd.
1059
1162
  - Ask them to `cd` outside the tutorial cwd.
1060
1163
  - Skip the level question when entering the deep-dive.