@skill-map/cli 0.43.0 → 0.44.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.
Files changed (46) hide show
  1. package/dist/cli/tutorial/sm-master/SKILL.md +7 -9
  2. package/dist/cli/tutorial/sm-master/references/fixture-templates.md +1 -1
  3. package/dist/cli/tutorial/sm-master/references/tour-plugins.md +10 -9
  4. package/dist/cli/tutorial/sm-master/references/tour-settings.md +4 -4
  5. package/dist/cli/tutorial/sm-tutorial/SKILL.md +216 -299
  6. package/dist/cli.js +736 -221
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.js +21 -15
  9. package/dist/index.js.map +1 -1
  10. package/dist/kernel/index.d.ts +8 -6
  11. package/dist/kernel/index.js +21 -15
  12. package/dist/kernel/index.js.map +1 -1
  13. package/dist/ui/chunk-27WQPOXP.js +1 -0
  14. package/dist/ui/{chunk-DZBSELHN.js → chunk-43S72FTV.js} +1 -1
  15. package/dist/ui/chunk-555ST76V.js +1 -0
  16. package/dist/ui/{chunk-JPYAASHN.js → chunk-5AD5ZV4I.js} +3 -3
  17. package/dist/ui/{chunk-CFJBTDAA.js → chunk-5ITZXW3A.js} +1 -1
  18. package/dist/ui/chunk-A7PRWMQD.js +1021 -0
  19. package/dist/ui/chunk-DL5EA245.js +123 -0
  20. package/dist/ui/chunk-F7I6KMHX.js +1 -0
  21. package/dist/ui/{chunk-77J7XU3Y.js → chunk-I5AX4U2N.js} +28 -28
  22. package/dist/ui/chunk-IUZRAD7S.js +1 -0
  23. package/dist/ui/{chunk-XOHD5XWA.js → chunk-IYM26L3O.js} +1 -1
  24. package/dist/ui/{chunk-SBCO7ZSP.js → chunk-LGFABCIA.js} +1 -1
  25. package/dist/ui/{chunk-IUDL3NDH.js → chunk-MFLFIA7C.js} +1 -1
  26. package/dist/ui/chunk-MS6B7344.js +315 -0
  27. package/dist/ui/chunk-P3SNMV4X.js +2 -0
  28. package/dist/ui/chunk-PZQHB7GS.js +4 -0
  29. package/dist/ui/chunk-QDUSFOBE.js +1 -0
  30. package/dist/ui/{chunk-YCR3XCIW.js → chunk-QNTAOR2L.js} +5 -5
  31. package/dist/ui/{chunk-CR3AANNX.js → chunk-S4S5ZMXJ.js} +1 -1
  32. package/dist/ui/{chunk-5WJRN3LD.js → chunk-T3IVIRRJ.js} +1 -1
  33. package/dist/ui/{chunk-HP375T2O.js → chunk-VGPYYAVI.js} +1 -1
  34. package/dist/ui/chunk-X227ITGS.js +499 -0
  35. package/dist/ui/index.html +1 -1
  36. package/dist/ui/main-O3CWFYKV.js +3 -0
  37. package/package.json +10 -9
  38. package/dist/ui/chunk-2IF446BS.js +0 -1
  39. package/dist/ui/chunk-DIKPNZUZ.js +0 -315
  40. package/dist/ui/chunk-KGCJINI6.js +0 -1
  41. package/dist/ui/chunk-PPE3P2JD.js +0 -1
  42. package/dist/ui/chunk-UOCACZLI.js +0 -123
  43. package/dist/ui/chunk-YL6SWAFJ.js +0 -1024
  44. package/dist/ui/main-VHFB7Q2D.js +0 -3
  45. /package/dist/ui/{chunk-C2YUQODZ.js → chunk-4SG4352Z.js} +0 -0
  46. /package/dist/ui/{chunk-VB56BUGO.js → chunk-WCABR6TI.js} +0 -0
@@ -30,7 +30,7 @@ optional second phase (~20-30 min) covering the rest of the CLI.
30
30
  > "short path", "long path", "route", "phase 1" / "phase 2", or
31
31
  > "let's start the short one" in messages to the tester. The internal
32
32
  > split exists so YOU know what comes next; for the tester you only
33
- > talk about the current step and, at the end of step 7 (wrap-up),
33
+ > talk about the current step and, at the end of step 9 (wrap-up),
34
34
  > offer "if you want, we can keep going deeper" without labelling it.
35
35
 
36
36
  ## Tone
@@ -177,7 +177,7 @@ optional second phase (~20-30 min) covering the rest of the CLI.
177
177
  calls for a change to `.skillmapignore`,
178
178
  `.skill-map/settings.json`,
179
179
  `.skill-map/settings.local.json`, or `.gitignore` AS PART
180
- OF A LESSON (e.g. Step 6 hides a private node by appending
180
+ OF A LESSON (e.g. Step 8 hides a private node by appending
181
181
  a pattern), you describe the edit in a tester-facing
182
182
  message and the tester applies it in their own editor. The pedagogical point
183
183
  is that those files belong to the user, they need to
@@ -204,7 +204,7 @@ optional second phase (~20-30 min) covering the rest of the CLI.
204
204
  command blocks assume the second terminal is anchored to the
205
205
  tutorial folder.
206
206
  11. **Never skip the level question when entering the deep-dive.**
207
- The level drives modulation of every Step 8+ instruction.
207
+ The level drives modulation of every Step 10+ instruction.
208
208
 
209
209
  ## Provider detection
210
210
 
@@ -214,7 +214,7 @@ its own on-disk convention:
214
214
  | Provider | Base dir | Kinds it claims | Detect via env var(s) |
215
215
  |----------------|-----------------------|--------------------------------|------------------------------------------------|
216
216
  | `claude` | `.claude/` | `agent`, `command`, `skill` | `CLAUDECODE=1` OR `AI_AGENT` starts with `claude-code` |
217
- | `antigravity` | none (metadata-only) | none Antigravity adopted the open standard, skills land under `.agents/skills/` and route through `agent-skills` | no formal env detection yet; Antigravity CLI replaced Gemini CLI on 2026-05-19 and reuses the open-standard layout, so detection collapses into the `agent-skills` row |
217
+ | `antigravity` | none (metadata-only) | none, Antigravity adopted the open standard, skills land under `.agents/skills/` and route through `agent-skills` | no formal env detection yet; Antigravity CLI replaced Gemini CLI on 2026-05-19 and reuses the open-standard layout, so detection collapses into the `agent-skills` row |
218
218
  | `openai` | `.codex/` | `agent` (`.codex/agents/*.toml`) | no formal env detection yet; the OpenAI Codex CLI does not host this tutorial today (this SKILL.md lives under `.claude/skills/`), so the row is informational. Add when `.codex/skills/<name>/SKILL.md` mirroring lands. |
219
219
  | `agent-skills` | `.agents/skills/` | `skill` only (vendor-neutral, also the on-disk home for Antigravity skills) | no formal env yet; treat as opt-in if the tester says so |
220
220
 
@@ -288,7 +288,9 @@ user content, they're internal infrastructure of the skill itself):
288
288
  when the harness starts, has nothing to do with the tester.
289
289
  Ignore whether it exists or not.
290
290
  - `SKILL.md`: a loose copy of the skill.
291
- - `sm-tutorial.md`: the skill copy materialised by `sm tutorial`.
291
+ - `sm-tutorial.md`: legacy loose copy from older `sm tutorial`
292
+ runs; today the verb scaffolds `.claude/skills/sm-tutorial/`
293
+ (already covered by the `.claude` entry above).
292
294
  - `tutorial-state.yml`: resume mode (see §Resume / restart).
293
295
 
294
296
  The whitelist is **internal**: do NOT enumerate it to the tester.
@@ -348,7 +350,7 @@ Do not advance until the tester confirms they're in an empty dir.
348
350
  3. Even when the cwd looks filter-empty, `<provider_dir>/` may
349
351
  already contain `.md` files from a previous tutorial run, an
350
352
  experimental hook, or any other agent runtime. `sm scan` will
351
- pick them up as graph nodes and break the "exactly one node"
353
+ pick them up as nodes in the map and break the "exactly one node"
352
354
  promise of Step 2 (and the running node count of every
353
355
  subsequent step). Run, substituting `<provider_dir>` for the
354
356
  detected base dir:
@@ -368,7 +370,7 @@ Do not advance until the tester confirms they're in an empty dir.
368
370
  > <paste the find output verbatim>
369
371
  > ```
370
372
  >
371
- > Those will register as graph nodes the moment `sm scan` runs,
373
+ > Those will register as nodes in the map the moment `sm scan` runs,
372
374
  > which means the tutorial's "exactly one node" assertion in Step
373
375
  > 2 (and every running count after it) won't match what you see.
374
376
  > Two ways out:
@@ -424,7 +426,7 @@ information. Only break the silence if something actually fails.
424
426
 
425
427
  If `sm` isn't installed, tell the tester:
426
428
 
427
- > You don't have `sm` yet. You'll need Node 20+ and then run
429
+ > You don't have `sm` yet. You'll need Node 24+ and then run
428
430
  > `npm install -g @skill-map/cli`. Tell me "ready" when it
429
431
  > finishes.
430
432
 
@@ -447,7 +449,7 @@ later when they're relevant. Keep it to a single short sentence:
447
449
  Then proceed straight to the writes below, no pause, no "ready?"
448
450
  prompt.
449
451
 
450
- The tutorial builds the graph **progressively** across Steps 2-6
452
+ The tutorial builds the map **progressively** across Steps 2-6
451
453
  (the live UI block). Right now, in pre-flight, you only create
452
454
  **one file**: a single agent, so the tester's first look at the
453
455
  UI shows exactly one node. The other three nodes (skill, command,
@@ -554,10 +556,10 @@ tutorial-state.yml
554
556
  export.*
555
557
  dump.sql
556
558
 
557
- # Step 14 spawns a self-contained sub-project under link-validation/hijoA
559
+ # Step 15 spawns a self-contained sub-project under link-validation/hijoA
558
560
  # with its own .skill-map/. Excluded here so that, if the tester
559
- # relaunches `sm` from the tutorial root after Step 14, the nested
560
- # project does not leak into the main demo graph.
561
+ # relaunches `sm` from the tutorial root after Step 15, the nested
562
+ # project does not leak into the main demo map.
561
563
  link-validation/
562
564
  ```
563
565
 
@@ -597,40 +599,43 @@ short_steps:
597
599
  - id: "5-live-connectors"
598
600
  title: "⭐ Live UI: the connectors light up"
599
601
  status: "pending"
600
- - id: "6-live-ignore"
602
+ - id: "6-live-inspector"
603
+ title: "⭐ Live UI: the Inspector and linked nodes"
604
+ status: "pending"
605
+ - id: "7-live-edit"
606
+ title: "⭐ Live UI: edit a link and watch the topology change"
607
+ status: "pending"
608
+ - id: "8-live-ignore"
601
609
  title: "⭐ Live UI: silence via .skillmapignore"
602
610
  status: "pending"
603
- - id: "7-handoff"
611
+ - id: "9-handoff"
604
612
  title: "Wrap-up of the demo and offer to keep going"
605
613
  status: "pending"
606
614
  long_steps:
607
- - id: "8-tester-edits"
608
- title: "Tester edits live (extends the UI demo)"
609
- status: "pending"
610
- - id: "9-cli-browse"
615
+ - id: "10-cli-browse"
611
616
  title: "Browse CLI: list / show / check"
612
617
  status: "pending"
613
618
  verbs: ["sm list", "sm show", "sm check"]
614
- - id: "10-ascii"
619
+ - id: "11-ascii"
615
620
  title: "ASCII: graph + export"
616
621
  status: "pending"
617
622
  verbs: ["sm graph", "sm export"]
618
- - id: "11-issues"
623
+ - id: "12-issues"
619
624
  title: "Issues: broken refs"
620
625
  status: "pending"
621
626
  verbs: ["sm check", "sm check --analyzers reference-broken",
622
627
  "sm check --json"]
623
- - id: "12-plugins"
628
+ - id: "13-plugins"
624
629
  title: "Plugins"
625
630
  status: "pending"
626
631
  verbs: ["sm plugins list", "sm plugins show",
627
632
  "sm plugins doctor", "sm plugins enable",
628
633
  "sm plugins disable"]
629
- - id: "13-annotations"
634
+ - id: "14-annotations"
630
635
  title: "Annotations and the .sm consent prompt"
631
636
  status: "pending"
632
637
  verbs: ["sm sidecar annotate"]
633
- - id: "14-reference-paths"
638
+ - id: "15-reference-paths"
634
639
  title: "Validate links to folders outside the scan scope"
635
640
  status: "pending"
636
641
  verbs: ["sm config set scan.referencePaths", "sm scan", "sm check"]
@@ -725,8 +730,8 @@ of `sm serve` with all defaults; the moment you need any flag
725
730
  you write `sm serve --flag ...` explicitly). One process, one
726
731
  terminal: it boots the server, scans the `.md` files, detects
727
732
  changes, and pushes events over WebSocket to the live UI. The next
728
- five steps (2-6) all run against the same `sm` session, you boot
729
- it here and keep it alive through Step 6.
733
+ seven steps (2-8) all run against the same `sm` session, you boot
734
+ it here and keep it alive through Step 8.
730
735
 
731
736
  **Command** (one terminal):
732
737
 
@@ -738,8 +743,8 @@ Before launching, ask the tester to set up a **side-by-side view** so
738
743
  they can watch the magic happen without alt-tabbing every step.
739
744
  Tell the tester:
740
745
 
741
- > Now arrange your screen so the **browser** (where the graph will
742
- > update in real time) and **this chat** are both visible at once
746
+ > Now arrange your screen so the **browser** (where the **Map**
747
+ > updates in real time) and **this chat** are both visible at once
743
748
  >, typical layout is browser on the left half, chat on the right
744
749
  > (or any split that lets you see both). The terminal running
745
750
  > `sm` can stay off to the side; it just prints scan progress
@@ -759,15 +764,16 @@ truth (it logs the bound `http://host:port` after listen):
759
764
 
760
765
  Wait for confirmation that the page loaded. Then tell the tester:
761
766
 
762
- > You'll see exactly **one node** in the graph: `demo-agent` (kind
763
- > `agent`). That's our starting point.
767
+ > You'll see exactly **one node** in the **Map**: `demo-agent`
768
+ > (kind `agent`). That's our starting point.
764
769
  >
765
- > Walk the 3 views before we go on:
766
- > 1. **Graph**: the single agent node.
767
- > 2. **List**: one row, with path / kind / metadata.
768
- > 3. **Inspector**: click the node to see its frontmatter (the
769
- > YAML block at the top of every `.md`, between the two `---`
770
- > lines) and links.
770
+ > Walk the two views before we go on:
771
+ > 1. **Map**: the single agent node on the canvas.
772
+ > 2. **Files**: one row, with path / kind / metadata.
773
+ >
774
+ > Then, back in **Map**, click the node: the **Inspector** panel
775
+ > slides out with its frontmatter (the YAML block at the top of
776
+ > every `.md`, between the two `---` lines) and its links.
771
777
  >
772
778
  > Did the node show up?
773
779
 
@@ -797,7 +803,7 @@ list shown to the tester in the sample below accordingly:
797
803
  name: demo-skill
798
804
  description: |
799
805
  Example skill that walks a file and returns a Markdown report.
800
- Showcases the `skill` kind in the demo graph.
806
+ Showcases the `skill` kind in the demo map.
801
807
  inputs:
802
808
  - name: target
803
809
  type: path
@@ -908,7 +914,7 @@ Up to here you've been watching the agent write files. Now hand
908
914
  the keyboard over: the lesson is that the watcher reacts to
909
915
  **any** `.md` edit under the cwd, not just to files the agent
910
916
  authors. After this beat, the tester has the muscle memory for
911
- "save → graph updates", which Step 6 (`.skillmapignore`) reuses
917
+ "save → map updates", which Step 8 (`.skillmapignore`) reuses
912
918
  verbatim.
913
919
 
914
920
  Tell the tester:
@@ -919,10 +925,10 @@ Tell the tester:
919
925
  > the field you'll edit next, so leave the card open and the
920
926
  > change will be obvious.
921
927
  >
922
- > ⚠ Heads-up: the inspector header shows a few action buttons
923
- > (Bump, Close, etc). **Don't click any of them yet** , some of
924
- > them write files to your project and we cover that flow
925
- > deliberately in step 13. For now, just look.
928
+ > ⚠ Heads-up: the inspector header shows a couple of action
929
+ > buttons (**Bump version**, **Refresh body**). **Don't click
930
+ > them yet**, they write files to your project and we cover that
931
+ > flow deliberately in step 14. For now, just look.
926
932
  >
927
933
  > Now open `.claude/agents/demo-agent.md` in your editor of
928
934
  > choice. In the **frontmatter** at the top of the file, change
@@ -943,13 +949,6 @@ rule #1) before moving on. Mark `4-live-edit: done`.
943
949
 
944
950
  ### Step 5: Live UI: the connectors light up (~2 min)
945
951
 
946
- Two beats. Beat 1 wires up the connectors (the arrows and their
947
- kinds). Beat 2 calls out the per-node ↑/↓ chips that the same hub
948
- edit lit up on every card. Each beat gets its own confirm so the
949
- tester slows down on each surface instead of conflating them.
950
-
951
- **Beat 1, connectors (the arrows themselves).**
952
-
953
952
  You edit `notes/todo.md` so it becomes the **hub** that points
954
953
  to each of the other four nodes. Each bullet uses a syntax that
955
954
  maps to a specific **link kind**:
@@ -996,50 +995,76 @@ Tell the tester:
996
995
  > colours on the canvas (the two `invokes` share a colour, as you
997
996
  > would expect).
998
997
  >
999
- > Fijate también que los conectores tienen distinta transparencia.
998
+ > Observa también que los conectores tienen distinta transparencia.
1000
999
  > Skill-map estima qué tan seguro está de cada conexión: un
1001
1000
  > `[text](file.md)` que apunta a un archivo concreto (1.00 de
1002
1001
  > confianza, ahora que el target existe) se ve sólido, mientras que
1003
1002
  > un `@handle` que no resuelve a ningún nodo se queda en 0.5
1004
1003
  > (ambiguo) y se ve translúcido. La opacidad cuenta esa historia de
1005
- > un vistazo: cuanto más sólido, más confiable es la inferencia, y
1006
- > el badge numérico arriba del conector lo dice explícito.
1004
+ > un vistazo: cuanto más sólido, más confiable es la inferencia.
1005
+ >
1006
+ > Confirma. Si falta algún conector, refresca el browser y avísame.
1007
+
1008
+ After the tester confirms the connectors, drop this tip:
1009
+
1010
+ > 💡 Tip: si tras tantos cambios los nodos quedaron amontonados, en
1011
+ > la barra de herramientas del mapa tienes el botón **Reset
1012
+ > layout**: reorganiza todo con el auto-layout para que se vea
1013
+ > mejor. Te pide confirmación porque descarta las posiciones que
1014
+ > hayas movido a mano.
1015
+
1016
+ If a connector is missing, do not advance, the next step inspects
1017
+ the same hub edit. Mark `5-live-connectors: done`.
1018
+
1019
+ ### Step 6: Live UI: the Inspector and linked nodes (~1 min)
1020
+
1021
+ The connector opacity tells the confidence story at a glance; the
1022
+ exact per-link breakdown lives in the Inspector. Open it on the hub
1023
+ so the tester registers the surface before Step 7 changes topology.
1024
+
1025
+ > 🆕 Abre el Inspector de `notes/todo` (clic en el nodo en el
1026
+ > mapa). Baja hasta el panel **Linked nodes**: tiene dos secciones,
1027
+ > **Outgoing** e **Incoming**. `notes/todo` lista 4 enlaces en
1028
+ > Outgoing (es el hub que apunta a cuatro nodos) y 0 en Incoming;
1029
+ > si abres el Inspector de cualquiera de los cuatro nodos
1030
+ > apuntados, ves 1 en Incoming. Cada fila muestra el tipo del
1031
+ > enlace (`mentions`, `invokes`, `references`) y una etiqueta con
1032
+ > su confianza: el valor numérico (`1.00`, `0.50`, …).
1007
1033
  >
1008
- > Confirm. If a connector is missing, refresh the browser and tell
1009
- > me.
1010
-
1011
- Wait for confirmation of the connectors before moving on to Beat 2.
1012
- If a connector is missing, do not advance, the chips below depend
1013
- on the same hub edit having landed.
1014
-
1015
- **Beat 2, the ↑/↓ chips on every card.**
1016
-
1017
- The same edit also lit up a per-node link counter on each card.
1018
- Call it out explicitly so the tester registers the surface before
1019
- Step 6 changes topology, easier to notice the chips going up and
1020
- down later if they saw the baseline now.
1021
-
1022
- > 🆕 Mirá también las cards de los nodos: ahora cada nodo muestra
1023
- > dos pequeñas chips abajo a la izquierda, y ↓, que cuentan los
1024
- > links entrantes y salientes. `notes/todo` ahora marca 0↑ / 4↓
1025
- > (es el hub que apunta a cuatro nodos), y los cuatro nodos
1026
- > apuntados muestran 1↑ cada uno. Pasale el mouse a una chip y se
1027
- > abre un tooltip con el desglose por kind (`mentions`, `invokes`,
1028
- > `references`). Es la misma info que el grafo, resumida en la
1029
- > card por si trabajás desde la list view.
1034
+ > Confírmame cuando lo veas.
1035
+
1036
+ Wait for confirmation. Mark `6-live-inspector: done`.
1037
+
1038
+ ### Step 7: Live UI: edit a link and watch the topology change (~3 min)
1039
+
1040
+ **Context**: Step 4 had the tester edit a scalar (`description`)
1041
+ and watch the inspector card refresh. Step 7 raises the bar: edit
1042
+ a Markdown link and watch the MAP TOPOLOGY change (a connector
1043
+ disappears). Same watcher, different surface.
1044
+
1045
+ The server has been live since Step 2, leave it running; this step
1046
+ and the next one (`.skillmapignore`) both reuse it.
1047
+
1048
+ > Your turn. Edit `notes/todo.md` with your editor of choice and
1049
+ > delete the bullet that contains `@demo-agent`. Save. Watch the
1050
+ > UI.
1030
1051
  >
1031
- > Confirm cuando las veas en las cinco cards.
1052
+ > Expected: the `notes/todo demo-agent` connector (kind:
1053
+ > `mentions`) disappears in real time. The two nodes stay in the
1054
+ > **Map**; only the edge goes.
1032
1055
 
1033
- Wait for confirmation. **Do NOT move on to Step 6** until both
1034
- beats are confirmed, Step 6 reuses the same live UI session and
1035
- the chip counts are the baseline the tester will watch change
1036
- when the private node disappears. Mark `5-live-connectors: done`.
1056
+ You verify by reading `notes/todo.md` to confirm the change was
1057
+ applied. (On `agent-skills`, where the `@demo-agent` bullet was
1058
+ never created in Step 5, ask the tester to remove the only bullet
1059
+ they did add and watch THAT connector vanish, the lesson is the
1060
+ same.) Once they confirm, leave the server running, the next step
1061
+ reuses it. Mark `7-live-edit: done`.
1037
1062
 
1038
- ### Step 6: Live UI: silence a private file via `.skillmapignore` (~2 min)
1063
+ ### Step 8: Live UI: silence a private file via `.skillmapignore` (~2 min)
1039
1064
 
1040
1065
  Steps 2-5 showed the watcher picking up new files and edits (yours
1041
- and theirs). Step 6 flips the direction: a file the tester DOES NOT
1042
- want in the graph (a draft, a scratch file, a secret) gets hidden by
1066
+ and theirs). Step 8 flips the direction: a file the tester DOES NOT
1067
+ want in the map (a draft, a scratch file, a secret) gets hidden by
1043
1068
  a single line in `.skillmapignore`. Same live mechanism, no restart.
1044
1069
 
1045
1070
  `sm init` already wrote a starter `.skillmapignore` at the scope
@@ -1047,15 +1072,15 @@ root. The flow has three beats:
1047
1072
 
1048
1073
  **Beat 1, you create one new fixture file (the agent does this).**
1049
1074
 
1050
- `Write` `notes/private-credentials.md`, kind `note`, simulates a
1051
- file the tester would never want surfacing publicly:
1075
+ `Write` `notes/private-credentials.md`, kind `markdown`, simulates
1076
+ a file the tester would never want surfacing publicly:
1052
1077
 
1053
1078
  ```markdown
1054
1079
  ---
1055
1080
  name: private-credentials
1056
1081
  description: |
1057
1082
  Personal API tokens, exists in the repo but should not show
1058
- up in the skill-map graph. Demonstrates the .skillmapignore
1083
+ up in skill-map's map. Demonstrates the .skillmapignore
1059
1084
  flow.
1060
1085
  ---
1061
1086
 
@@ -1064,7 +1089,7 @@ description: |
1064
1089
  API_TOKEN: example-not-real
1065
1090
  ```
1066
1091
 
1067
- Confirm the file appears in the graph as a sixth node
1092
+ Confirm the file appears in the map as a sixth node
1068
1093
  (`notes/private-credentials`). The watcher sees it like any
1069
1094
  other `.md`, that's the point of the demo.
1070
1095
 
@@ -1084,14 +1109,15 @@ sees what their cwd holds:
1084
1109
  ├── .claude/
1085
1110
  │ ├── agents/demo-agent.md
1086
1111
  │ ├── commands/demo-command.md
1087
- │ └── skills/demo-skill/SKILL.md
1112
+ │ └── skills/
1113
+ │ ├── demo-skill/SKILL.md
1114
+ │ └── sm-tutorial/SKILL.md ← the tutorial you loaded
1088
1115
  ├── .skill-map/ ← project DB + settings (managed)
1089
1116
  ├── .skillmapignore ← the file we're about to edit
1090
- ├── notes/
1091
- ├── todo.md
1092
- ├── demo-guideline.md
1093
- └── private-credentials.md ← what we want to hide
1094
- └── sm-tutorial.md ← the tutorial file you loaded
1117
+ └── notes/
1118
+ ├── todo.md
1119
+ ├── demo-guideline.md
1120
+ └── private-credentials.md ← what we want to hide
1095
1121
  ```
1096
1122
 
1097
1123
  > The `.skillmapignore` at the root is the file we'll touch
@@ -1118,7 +1144,7 @@ your `Edit` tool. Tell the tester to do it from their editor:
1118
1144
  >
1119
1145
  > Watch the browser when you save. The
1120
1146
  > `notes/private-credentials` node should disappear from the
1121
- > graph in real time, without restarting anything. Six nodes
1147
+ > **Map** in real time, without restarting anything. Six nodes
1122
1148
  > back to five.
1123
1149
  >
1124
1150
  > Did the node vanish?
@@ -1129,80 +1155,42 @@ verify the appended pattern landed correctly (in case
1129
1155
  allowed. Once confirmed, ask them to stop the server with
1130
1156
  **Ctrl+C** in the terminal before continuing.
1131
1157
 
1132
- Mark `6-live-ignore: done`.
1158
+ Mark `8-live-ignore: done`.
1159
+
1160
+ ### Step 9: Wrap-up of the demo and offer to keep going (30 s)
1133
1161
 
1134
- ### Step 7: Wrap-up of the demo and offer to keep going (30 s)
1162
+ Keep this short: one closing line, then a single decision. Do NOT
1163
+ dump feature notes here (no `.sm` files, multi-provider, active
1164
+ provider, or safety-net asides; those land in their own steps or in
1165
+ day-to-day use). One closing line, then ask.
1166
+
1167
+ Closing line (tester-facing):
1135
1168
 
1136
1169
  > All set! That's the heart of skill-map: you edit a `.md` and the
1137
- > UI sees it instantly. In **~10 minutes** you've already seen the
1138
- > full flow.
1139
- >
1140
- > ⚠️ **`.sm` files (heads-up for later)**: every `.md` skill-map
1141
- > tracks has a sibling `.sm` file (e.g. `demo-agent.sm` next to
1142
- > `demo-agent.md`) that carries **all of the tool's metadata
1143
- > about that markdown, so your `.md` stays clean and uncluttered**.
1144
- > Version, history, tags, annotations, anything that does not
1145
- > belong in the human-authored body lives in the `.sm`. You write
1146
- > the `.md` for Claude or for humans, the tool writes the `.sm`.
1147
- > Each `sm bump` and each `sm sidecar annotate` creates or
1148
- > refreshes one, so you'll see them often as you use skill-map
1149
- > day to day. Commit them to git like any other source file.
1150
- >
1151
- > 🔀 **Multi-provider**: this demo ran with the
1152
- > `<provider>` provider (base dir `<provider_dir>`). Skill-map
1153
- > walks three other built-in conventions with identical mechanics:
1154
- > the open agent-skills standard (also used by Google's Antigravity
1155
- > CLI, which retired Gemini CLI in May 2026) lives under
1156
- > `.agents/skills/` (kind: skill), OpenAI Codex lives under
1157
- > `.codex/agents/*.toml` (TOML sub-agents), and the `antigravity`
1158
- > lens is metadata-only (no kinds of its own; selecting it just
1159
- > tags the project as Antigravity-flavoured). Drop a `.md` (or
1160
- > `.toml` for Codex) in any of those and the same watcher picks it
1161
- > up, the same connectors light up, the same rules run.
1162
- >
1163
- > 💡 **Tip avanzado (no toques si no querés rescanear)**: en
1164
- > Settings → Project hay un dropdown **Active provider** que
1165
- > selecciona qué lente aplica a TODO el grafo (Claude / Antigravity
1166
- > / Codex / Cursor / agent-skills). Cambiarlo limpia el scan
1167
- > persistido y rearma el grafo desde cero bajo el nuevo lente, así
1168
- > que sirve cuando tu proyecto migra de runtime. Por default
1169
- > skill-map autodetecta el lente correcto al primer scan (en este
1170
- > caso, `claude` porque hay `.claude/`); si tu repo tiene markers
1171
- > ambiguos (`.claude/` + `.codex/` al mismo tiempo) `sm scan` te
1172
- > pregunta cuál usar, o aborta con exit 2 si pasás `--yes` y todavía
1173
- > está ambiguo. El lente `antigravity` no se auto-detecta (Google
1174
- > adoptó el open standard sin marker propio); seleccionarlo es
1175
- > manual.
1176
- >
1177
- > 🛡️ **Red de seguridad**: si en algún momento desactivás el bundle
1178
- > al que apunta el lente activo (por ejemplo `sm plugins disable
1179
- > claude` con `activeProvider: claude`), el próximo `sm scan` te
1180
- > avisa con un warning explícito ("the active lens points at a
1181
- > disabled bundle") y te ofrece los dos arreglos: reactivar el
1182
- > bundle o cambiar el lente. Lo mismo si la DB local quedó vieja
1183
- > respecto del binario, el open de SQLite detecta el skew de
1184
- > versiones y te dice qué correr para refrescarla. Tip: si ves uno
1185
- > de esos warnings durante el tutorial, NO los ignores, son la
1186
- > señal de que el grafo no refleja lo que vos esperás.
1187
- >
1188
- > If you want, **we can keep going deeper**: I'll walk you through
1189
- > the CLI verbs and flags (`list`, `graph`, `export`, `orphans`,
1190
- > `plugins`, `db ops`, etc.). About ~20-30 min more, pausable
1191
- > whenever.
1192
- >
1193
- > 1. **Yes, let's continue**
1194
- > 2. **No, we wrap here**: give me the summary and tell me how to
1195
- > delete the dir
1170
+ > UI reflects it instantly. In ~10 minutes you've seen the full
1171
+ > flow.
1196
1172
 
1197
- If they say **2**:
1198
- - Mark `route.short.status: done`, `route.long.status: declined`.
1199
- - Generate the final summary (see §Final wrap-up).
1173
+ Then ask with the **`AskUserQuestion`** tool (not a numbered list),
1174
+ translating the labels to the tester's language. One question,
1175
+ header `Tutorial`, prompt "Keep going or wrap up here?", two
1176
+ options:
1177
+
1178
+ - **Go deeper**: the rest of the CLI, verbs and flags (`list`,
1179
+ `export`, `plugins`, `db`, ...), about 20-30 min, pausable
1180
+ anytime.
1181
+ - **Wrap up here**: summary plus how to delete the dir.
1200
1182
 
1201
- If they say **1**:
1183
+ (If the host lacks `AskUserQuestion`, fall back to a numbered list.)
1184
+
1185
+ On **Go deeper**:
1202
1186
  - Mark `route.short.status: done`, `route.long.status: in_progress`.
1203
- - Move on to the next phase (without announcing it, just say
1204
- "Cool, keep going" and start with the level question of the next
1205
- block).
1187
+ - Move to the next phase without announcing it: a short "Dale,
1188
+ seguimos" (tester-language equivalent), then the level question
1189
+ of the next block.
1190
+
1191
+ On **Wrap up here**:
1192
+ - Mark `route.short.status: done`, `route.long.status: declined`.
1193
+ - Generate the final summary (see §Final wrap-up).
1206
1194
 
1207
1195
  ---
1208
1196
 
@@ -1228,36 +1216,7 @@ Save into `tester.level` and modulate:
1228
1216
  - **Level 3**: dense blocks, flags included, no explanations of
1229
1217
  basic concepts.
1230
1218
 
1231
- ### Step 8: Tester edits live (~3 min)
1232
-
1233
- **Context**: Step 4 had the tester edit a scalar (`description`)
1234
- and watch the inspector card refresh. Step 8 raises the bar: edit
1235
- a Markdown link and watch the GRAPH TOPOLOGY change (a connector
1236
- disappears). Same watcher, different surface.
1237
-
1238
- This step needs the server running. **Check first** before asking
1239
- them to launch it: many testers leave it running from Step 2 and
1240
- the demo wraps without an explicit Ctrl+C. Word the prompt as a
1241
- conditional, e.g. "If the server from Step 2 is still up, leave it,
1242
- if not, run `sm` again from the tutorial cwd and reopen the
1243
- browser." Do not just say "start it again", that risks a second
1244
- process trying to bind the same port and confusing the tester.
1245
-
1246
- > Your turn. Edit `notes/todo.md` with your editor of choice and
1247
- > delete the bullet that contains `@demo-agent`. Save. Watch the
1248
- > UI.
1249
- >
1250
- > Expected: the `notes/todo → demo-agent` connector (kind:
1251
- > `mentions`) disappears in real time. The two nodes stay in the
1252
- > graph; only the edge goes.
1253
-
1254
- You verify by reading `notes/todo.md` to confirm the change was
1255
- applied. (On `agent-skills`, where the `@demo-agent` bullet was
1256
- never created in Step 5, ask the tester to remove the only bullet
1257
- they did add and watch THAT connector vanish, the lesson is the
1258
- same.) Once they confirm, ask them to **Ctrl+C** the server.
1259
-
1260
- ### Step 9: Browse CLI: list / show / check (~3 min)
1219
+ ### Step 10: Browse CLI: list / show / check (~3 min)
1261
1220
 
1262
1221
  ```bash
1263
1222
  sm list
@@ -1276,9 +1235,9 @@ target of the hub's `references` link). `check` reads the persisted
1276
1235
  `scan_issues` table, it does NOT re-walk the filesystem. The
1277
1236
  fixture is clean (Steps 2-6 captured the latest state before
1278
1237
  Ctrl+C), so the verb prints `✓ No issues`. We will plant one in
1279
- Step 11 and watch the rule catch it after a fresh `sm scan`.
1238
+ Step 12 and watch the rule catch it after a fresh `sm scan`.
1280
1239
 
1281
- ### Step 10: ASCII: graph + export (~3 min)
1240
+ ### Step 11: ASCII: graph + export (~3 min)
1282
1241
 
1283
1242
  ```bash
1284
1243
  sm graph
@@ -1296,11 +1255,11 @@ within a key, AND across keys) and a `--format` of `md` or
1296
1255
  segment, `**` spans segments) so `path=notes/**` cleanly
1297
1256
  captures the notes folder regardless of the catch-all kind.
1298
1257
 
1299
- ### Step 11: Issues: broken refs (~3 min)
1258
+ ### Step 12: Issues: broken refs (~3 min)
1300
1259
 
1301
1260
  `reference-broken` is one of the deterministic rules `sm check` runs.
1302
1261
  We'll plant one and watch it surface, that's the easiest way to
1303
- internalise that it is an **issue** on a node, NOT a graph
1262
+ internalise that it is an **issue** on a node, NOT a
1304
1263
  connector and NOT the same thing as an "orphan".
1305
1264
 
1306
1265
  > ℹ️ `reference-broken` is one of ~16 built-in rules. Others surface
@@ -1341,7 +1300,7 @@ rest of the deep-dive doesn't depend on it.
1341
1300
  If the tester asks about `sm orphans` vs `sm check`, see
1342
1301
  §Scope clarifications.
1343
1302
 
1344
- ### Step 12: Plugins (~3 min)
1303
+ ### Step 13: Plugins (~3 min)
1345
1304
 
1346
1305
  **Context, present plugins to the tester before any command runs.**
1347
1306
  This is the official welcome to the plugin world; many testers will
@@ -1352,15 +1311,13 @@ standard rules):
1352
1311
 
1353
1312
  > Plugins are how skill-map gets extended. The kernel ships with a
1354
1313
  > small set of built-in plugins out of the box, but anyone can
1355
- > write their own and drop them into the project, `sm plugins
1356
- > create` scaffolds a manifest and the stubs, so there is no
1357
- > handwritten boilerplate to start from.
1314
+ > write their own and drop them into the project.
1358
1315
  >
1359
1316
  > The kernel exposes **six** plugin types you can implement:
1360
1317
  >
1361
1318
  > - **extractors**: find links and references inside markdown.
1362
- > - **analyzers**: rules that surface issues on a node.
1363
- > - **actions**: verbs the user can run on a node (e.g. `bump`).
1319
+ > - **analyzers**: rules that detect issues on a node.
1320
+ > - **actions**: operations the user runs on a node.
1364
1321
  > - **hooks**: fire on lifecycle events (scan started, finished,
1365
1322
  > …).
1366
1323
  > - **formatters**: render outputs in different shapes (text,
@@ -1368,12 +1325,9 @@ standard rules):
1368
1325
  > - **providers**: declare new node kinds and where to look for
1369
1326
  > them.
1370
1327
  >
1371
- > Heads up: the same plugin management is in the UI too. From any
1372
- > `sm serve` session, open the **gear icon Plugins** tab to
1373
- > browse and toggle plugins, CLI and UI hit the same store so a
1374
- > change in one is reflected in the other. We'll use the CLI here
1375
- > because it shows the full surface in a few lines, but knowing
1376
- > the UI panel exists is useful for day-to-day work.
1328
+ > Heads up: plugins can be managed from the UI as well as the CLI.
1329
+ > We'll use the CLI here because it shows the full surface in a few
1330
+ > lines.
1377
1331
  >
1378
1332
  > Let's look at what's installed right now.
1379
1333
 
@@ -1384,7 +1338,7 @@ sm plugins list
1384
1338
  sm plugins doctor
1385
1339
  sm plugins show core
1386
1340
  sm plugins disable core/external-url-counter
1387
- sm plugins list # confirm it shows as disabled
1341
+ sm plugins show core # confirm it shows as disabled
1388
1342
  sm plugins enable core/external-url-counter
1389
1343
  ```
1390
1344
 
@@ -1395,7 +1349,7 @@ behavior, or which id format `disable` / `enable` accept, see
1395
1349
  If `plugins list` shows zero entries (depends on the build), tell
1396
1350
  the tester no plugins are installed yet and offer to skip.
1397
1351
 
1398
- ### Step 13: Annotations and the `.sm` consent prompt (~3 min)
1352
+ ### Step 14: Annotations and the `.sm` consent prompt (~3 min)
1399
1353
 
1400
1354
  **Context**: every `.md` skill-map tracks gets a sibling
1401
1355
  **companion file** with extension `.sm` that carries **all of
@@ -1410,8 +1364,9 @@ the project.
1410
1364
 
1411
1365
  The first time skill-map wants to write one in a new project it
1412
1366
  asks for your consent, it never touches your filesystem without
1413
- permission. After you say yes, the choice persists per-checkout
1414
- (gitignored) and the prompt never appears again.
1367
+ permission. After you say yes, the choice is saved to the
1368
+ project's `settings.local.json` (part of your project config,
1369
+ gitignored) and the prompt never appears again.
1415
1370
 
1416
1371
  We'll demonstrate by creating an empty annotation scaffold for
1417
1372
  `notes/todo.md`. **Reset any prior consent state first** so the
@@ -1447,9 +1402,9 @@ goes through silently). On a CI / non-interactive session, pass
1447
1402
  If the tester asks about `sm bump` vs `sm sidecar annotate` vs
1448
1403
  `sm sidecar refresh`, see §Scope clarifications.
1449
1404
 
1450
- ### Step 14: Validate links to folders outside the scan scope (~4 min)
1405
+ ### Step 15: Validate links to folders outside the scan scope (~4 min)
1451
1406
 
1452
- **Context**: until now the graph saw only files inside the cwd. In
1407
+ **Context**: until now the map saw only files inside the cwd. In
1453
1408
  real projects a repo often links to files in a sibling repo (a specs
1454
1409
  project, a sibling package in a monorepo). Skill-map only scans from
1455
1410
  its cwd downwards, so a link to `../sibling/file.md` shows up as
@@ -1457,7 +1412,7 @@ broken. The fix is to declare the external folders in
1457
1412
  `scan.referencePaths`, which lets the `reference-broken` analyzer
1458
1413
  validate path-style links against those extra roots **without
1459
1414
  indexing their files as nodes**. The folders are checked, not walked
1460
- as part of the graph.
1415
+ as part of the map.
1461
1416
 
1462
1417
  **Setup (you, silent)**: write the fixture under the tutorial cwd
1463
1418
  so both sub-projects are siblings of each other but children of the
@@ -1529,7 +1484,7 @@ sm init
1529
1484
  sm check
1530
1485
  ```
1531
1486
 
1532
- > Vas a ver un warning del analyzer (regla que detecta problemas)
1487
+ > Vas a ver un error del analyzer (regla que detecta problemas)
1533
1488
  > `reference-broken` apuntando al link `../hijoB/spec.md`. Para
1534
1489
  > skill-map ese archivo no existe, porque `hijoB/` queda afuera
1535
1490
  > del scope (alcance) que `sm` está escaneando desde `hijoA/`:
@@ -1539,20 +1494,20 @@ sm check
1539
1494
  >
1540
1495
  > Pásame la salida (o un OK) y seguimos con el fix.
1541
1496
 
1542
- Wait for confirmation before showing the fix. Mark the warning
1497
+ Wait for confirmation before showing the fix. Mark the error
1543
1498
  landed as expected; if the tester reports `✓ No issues` instead,
1544
1499
  the most likely cause is that they ran `sm check` from the
1545
1500
  tutorial root by mistake (the root scan still sees both folders).
1546
1501
  Have them re-check that the cwd of their second terminal is
1547
1502
  `link-validation/hijoA/` (`pwd`) and rerun.
1548
1503
 
1549
- After they confirm the broken-ref warning, present the fix:
1504
+ After they confirm the broken-ref error, present the fix:
1550
1505
 
1551
1506
  > Para resolver el link sin tener que mover `hijoB/` dentro de
1552
1507
  > `hijoA/`, agregas `../hijoB` al setting `scan.referencePaths`.
1553
1508
  > Le dice al analyzer "si un link path-style cae acá, valídalo
1554
1509
  > también contra estas carpetas extra". Los archivos NO se
1555
- > agregan al grafo (no aparecen como nodos), solo se consultan
1510
+ > agregan al mapa (no aparecen como nodos), solo se consultan
1556
1511
  > para resolver referencias salientes desde `hijoA/`.
1557
1512
  >
1558
1513
  > En tu segundo terminal (todavía dentro de `link-validation/hijoA/`):
@@ -1566,9 +1521,9 @@ sm check
1566
1521
  > El flag `--yes` confirma el privacy gate (control de privacidad):
1567
1522
  > estás autorizando que skill-map lea archivos fuera del project
1568
1523
  > root, así que pide tu OK explícito. Sin `--yes` el verb se aborta
1569
- > y te pregunta en interactivo. Después del scan, `sm check`
1570
- > debería imprimir `✓ No issues`: el warning desapareció y `hijoB/`
1571
- > sigue sin entrar al grafo como nodo.
1524
+ > y te pide reintentar con `--yes` (no abre un prompt interactivo).
1525
+ > Después del scan, `sm check` debería imprimir `✓ No issues`: el
1526
+ > error desapareció y `hijoB/` sigue sin entrar al mapa como nodo.
1572
1527
  >
1573
1528
  > Pásame la salida y vemos cómo quedó persistido.
1574
1529
 
@@ -1623,18 +1578,10 @@ server. If the `sm` launch fails with a port-in-use error, an old
1623
1578
  `sm` is still bound to the default port from an earlier step;
1624
1579
  follow the §Edge cases recipe (`sm serve --port 4243`).
1625
1580
 
1626
- Finally, return the tester to the tutorial root so any wrap-up
1627
- work runs against the original cwd:
1628
-
1629
- > Último detalle: vuelve al cwd raíz del tutorial:
1630
-
1631
- ```bash
1632
- cd ../..
1633
- ```
1634
-
1635
- > Confirma cuando estés de vuelta.
1636
-
1637
- Mark `14-reference-paths: done`.
1581
+ The tester is still inside `link-validation/hijoA/` at this point.
1582
+ Do NOT send them back here; the return-to-root `cd ../..` now lives
1583
+ in §Final wrap-up, right before the cleanup line. Mark
1584
+ `15-reference-paths: done`.
1638
1585
 
1639
1586
  ---
1640
1587
 
@@ -1672,11 +1619,11 @@ Those verbs accept either a **qualified extension id**
1672
1619
  `<bundle>/<ext-id>` (e.g. `core/external-url-counter`,
1673
1620
  `claude/at-directive`) or a **bare bundle id** (e.g. `claude`,
1674
1621
  `core`) which the CLI treats as a macro that fans the toggle out
1675
- across every extension inside the bundle. The display format you
1676
- see in `plugins list`
1677
- (`extractor:core/external-url-counter@1.0.0`) includes the kind
1678
- prefix and the version for readability, strip both when passing
1679
- the id to `disable` / `enable`.
1622
+ across every extension inside the bundle. `plugins show <bundle>`
1623
+ lists each extension as `<kind> <bundle>/<ext-id>` (e.g.
1624
+ `extractor core/external-url-counter`); the leading kind is just a
1625
+ readability column, pass only the `<bundle>/<ext-id>` part to
1626
+ `disable` / `enable`.
1680
1627
 
1681
1628
  Single-extension bundles (`openai`, `antigravity`,
1682
1629
  `agent-skills`) flip without prompting because the macro is a
@@ -1702,7 +1649,7 @@ agent reservations like `general-purpose`), `sm check` surfaces a
1702
1649
  files that shadow its built-ins, so the warning is not a bug,
1703
1650
  it's skill-map telling the operator "Claude will never invoke this
1704
1651
  file; pick another name". Incoming links to the shadowed file
1705
- resolve at confidence `0.1` instead of `1.0`, so the graph also
1652
+ resolve at confidence `0.1` instead of `1.0`, so the **Map** also
1706
1653
  visually de-emphasises them. Rename the file and the warning
1707
1654
  clears on the next scan.
1708
1655
 
@@ -1720,10 +1667,10 @@ clears on the next scan.
1720
1667
  ## Final wrap-up
1721
1668
 
1722
1669
  When everything is done (demo only, or demo + deep-dive), show the
1723
- closing block (open with a "thanks, that's a wrap" line, then the
1724
- sm-master pointer + cleanup):
1670
+ closing block: a "that's a wrap" line, the sm-master pointer, the
1671
+ return-to-root line (deep-dive only), then a one-line cleanup.
1725
1672
 
1726
- > Thanks! That's a wrap.
1673
+ > Thanks! That's a wrap, you went through the whole tutorial.
1727
1674
  >
1728
1675
  > One more thing before you go: there's a companion skill called
1729
1676
  > **sm-master** that picks up where this tutorial leaves off. It's
@@ -1737,61 +1684,31 @@ sm-master pointer + cleanup):
1737
1684
  sm tutorial master
1738
1685
  ```
1739
1686
 
1740
- > That drops `sm-master.md` in the cwd. Then load it from your
1741
- > agent (e.g. `ejecutá @sm-master.md` in Claude Code, or the
1742
- > equivalent `@`-mention in Antigravity CLI) and the deep-dive starts.
1743
-
1744
- **Cleanup, choose ONE of the two paths**. Decide programmatically
1745
- before showing the closing message: list the cwd (`ls -A <cwd>`)
1746
- and compare against the set of paths this tutorial owns. If the
1747
- ONLY entries are tutorial-owned, the cwd looks dedicated and the
1748
- bulk path is safe. If there are unrelated entries (git repo,
1749
- unrelated source, the tester's day-to-day work), use the per-file
1750
- path instead. **Never recommend `rm -rf <cwd>` when the cwd
1751
- contains any path skill-map did not put there**, the tester might
1752
- be running the tutorial inside their actual work dir (a frequent
1753
- finding from real sessions).
1754
-
1755
- If the cwd is dedicated, render:
1687
+ If the deep-dive ran, the tester's second terminal is still inside
1688
+ `link-validation/hijoA/` from Step 15; send them back to the
1689
+ tutorial root before the cleanup line. **Skip this whole block if
1690
+ they stopped at the demo** (they never left the root).
1756
1691
 
1757
- > To delete everything THIS tutorial left behind:
1758
- >
1759
- > cd ~ && rm -rf <cwd>
1760
- >
1761
- > Thanks for testing skill-map!
1692
+ > Last thing, go back to the tutorial root:
1762
1693
 
1763
- If the cwd is NOT dedicated, render the exact per-file list
1764
- (substituting `<provider_dir>` per the saved `tutorial.provider`
1765
- and dropping rows the provider did not create, same shape as
1766
- the "start over" branch below):
1694
+ ```bash
1695
+ cd ../..
1696
+ ```
1767
1697
 
1768
- > Your cwd has unrelated files, so removing it would also delete
1769
- > work that is not mine. To delete only what THIS tutorial left
1770
- > behind, remove these specific paths from `<cwd>`:
1771
- >
1772
- > ```
1773
- > tutorial-state.yml
1774
- > findings.md
1775
- > .skillmapignore
1776
- > .skill-map/
1777
- > <provider_dir>/agents/demo-agent.md (claude only)
1778
- > <provider_dir>/commands/demo-command.md (claude only)
1779
- > <provider_dir>/skills/demo-skill/ (both providers)
1780
- > notes/todo.md
1781
- > notes/demo-guideline.md
1782
- > notes/private-credentials.md
1783
- > link-validation/ (if Step 14 ran)
1784
- > export.* (if present)
1785
- > dump.sql (if present)
1786
- > ```
1787
- >
1788
- > Do NOT `rm -rf <provider_dir>/` or `notes/` as directories,
1789
- > remove only the tutorial-owned files inside in case you have
1790
- > unrelated files there. `link-validation/` IS safe to remove as
1791
- > a whole directory, the agent created it from scratch in Step 14
1792
- > and nothing else lives inside it.
1793
- >
1794
- > Thanks for testing skill-map!
1698
+ Then close with the thanks plus a one-line cleanup. **Keep it to a
1699
+ single line, never a file inventory.** Pick the shape from
1700
+ `ls -A <cwd>`: if every entry is tutorial-owned the cwd is
1701
+ dedicated and `rm -rf` is safe; otherwise point only at the
1702
+ tutorial-owned paths. **Never recommend `rm -rf <cwd>` when the
1703
+ cwd holds anything skill-map did not create** (testers often run
1704
+ this inside their real work dir).
1705
+
1706
+ > Thanks for testing skill-map! To clean up: a throwaway dir is
1707
+ > just `cd ~ && rm -rf <cwd>`; if it lives inside your own work,
1708
+ > delete only what the tutorial created (`.skill-map/`, the fixture
1709
+ > `.md` / `.sm` files, and `link-validation/`) and leave the rest.
1710
+ > If anything felt off in any step, tell me and I'll log it in
1711
+ > `findings.md` before you close.
1795
1712
 
1796
1713
  ## Resume / restart
1797
1714
 
@@ -1800,9 +1717,9 @@ the cwd, start like this (do NOT repeat pre-flight from scratch):
1800
1717
 
1801
1718
  > I see you already started the tutorial.
1802
1719
  >
1803
- > You're at step <N> of 7 (or "you've already completed the demo
1804
- > (steps 1-7) and you're on step <M> of 6 of the deep-dive (steps
1805
- > 8-13)", depending on the yaml state).
1720
+ > You're at step <N> of 9 (or "you've already completed the demo
1721
+ > (steps 1-9) and you're on step <M> of 6 of the deep-dive (steps
1722
+ > 10-15)", depending on the yaml state).
1806
1723
  >
1807
1724
  > 1. **Continue** from where you left off
1808
1725
  > 2. **Start over**: wipes all the tutorial content in this dir
@@ -1841,7 +1758,7 @@ anything**:
1841
1758
  > notes/todo.md
1842
1759
  > notes/demo-guideline.md
1843
1760
  > notes/private-credentials.md
1844
- > link-validation/ (if Step 14 ran)
1761
+ > link-validation/ (if Step 15 ran)
1845
1762
  > export.* (if present)
1846
1763
  > dump.sql (if present)
1847
1764
  > ```
@@ -1862,12 +1779,12 @@ anything**:
1862
1779
  `<provider_dir>/skills`), then `notes/` and `<provider_dir>/`,
1863
1780
  each one only if empty (silent failure if not). `link-validation/`
1864
1781
  IS safe to remove recursively when present, the agent created it
1865
- from scratch in Step 14 and nothing else lives inside it. Then
1782
+ from scratch in Step 15 and nothing else lives inside it. Then
1866
1783
  start everything from pre-flight.
1867
1784
 
1868
1785
  ## Edge cases
1869
1786
 
1870
- - **Tester doesn't have Node 20+** → guide them to `nvm` or
1787
+ - **Tester doesn't have Node 24+** → guide them to `nvm` or
1871
1788
  nodejs.org. Don't try to install Node for them.
1872
1789
  - **Port 4242 in use** → bare `sm` doesn't accept flags (it's a
1873
1790
  shorthand for `sm serve` with defaults). Tell the tester to