@skill-map/cli 0.43.0 → 0.45.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 +263 -369
  6. package/dist/cli.js +945 -256
  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 +43 -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-CBI77N5U.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-ERCTR2PR.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
 
@@ -437,8 +439,8 @@ Before you lay anything down, give the tester a one-shot heads-up.
437
439
  **This is not interactive**: do NOT wait for a confirmation, do
438
440
  NOT ask permission per file, do NOT enumerate the files. The
439
441
  tester just needs to know scaffolding is starting so they're not
440
- surprised when files appear; details (file list, cleanup) come
441
- later when they're relevant. Keep it to a single short sentence:
442
+ surprised when files appear; the specifics come later when
443
+ they're relevant. Keep it to a single short sentence:
442
444
 
443
445
  > Quick heads-up before we start: I'm about to set up the
444
446
  > tutorial scenario in this directory, that means creating a
@@ -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
@@ -752,22 +757,22 @@ them to launch the server and open the link it prints, without
752
757
  hardcoding the URL here, since the verb itself is the source of
753
758
  truth (it logs the bound `http://host:port` after listen):
754
759
 
755
- > In the terminal you opened for `sm`, run the command above. After
756
- > a couple of seconds it will print a line with the URL where the
757
- > UI is listening, copy that link and open it in the browser you
758
- > just arranged. Tell me when you see the page load.
760
+ > Run `sm`. After a couple of seconds it will print a line with the
761
+ > URL where the UI is listening, copy that link and open it in the
762
+ > browser you just arranged. Tell me when you see the page load.
759
763
 
760
764
  Wait for confirmation that the page loaded. Then tell the tester:
761
765
 
762
- > You'll see exactly **one node** in the graph: `demo-agent` (kind
763
- > `agent`). That's our starting point.
766
+ > You'll see exactly **one node** in the **Map**: `demo-agent`
767
+ > (kind `agent`). That's our starting point.
764
768
  >
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.
769
+ > Walk the two views before we go on:
770
+ > 1. **Map**: the single agent node on the canvas.
771
+ > 2. **Files**: one row, with path / kind / metadata.
772
+ >
773
+ > Then, back in **Map**, click the node: the **Inspector** panel
774
+ > slides out with its frontmatter (the YAML block at the top of
775
+ > every `.md`, between the two `---` lines) and its links.
771
776
  >
772
777
  > Did the node show up?
773
778
 
@@ -797,7 +802,7 @@ list shown to the tester in the sample below accordingly:
797
802
  name: demo-skill
798
803
  description: |
799
804
  Example skill that walks a file and returns a Markdown report.
800
- Showcases the `skill` kind in the demo graph.
805
+ Showcases the `skill` kind in the demo map.
801
806
  inputs:
802
807
  - name: target
803
808
  type: path
@@ -908,7 +913,7 @@ Up to here you've been watching the agent write files. Now hand
908
913
  the keyboard over: the lesson is that the watcher reacts to
909
914
  **any** `.md` edit under the cwd, not just to files the agent
910
915
  authors. After this beat, the tester has the muscle memory for
911
- "save → graph updates", which Step 6 (`.skillmapignore`) reuses
916
+ "save → map updates", which Step 8 (`.skillmapignore`) reuses
912
917
  verbatim.
913
918
 
914
919
  Tell the tester:
@@ -919,10 +924,10 @@ Tell the tester:
919
924
  > the field you'll edit next, so leave the card open and the
920
925
  > change will be obvious.
921
926
  >
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.
927
+ > ⚠ Heads-up: the inspector header shows a couple of action
928
+ > buttons (**Bump version**, **Refresh body**). **Don't click
929
+ > them yet**, they write files to your project and we cover that
930
+ > flow deliberately in step 14. For now, just look.
926
931
  >
927
932
  > Now open `.claude/agents/demo-agent.md` in your editor of
928
933
  > choice. In the **frontmatter** at the top of the file, change
@@ -943,13 +948,6 @@ rule #1) before moving on. Mark `4-live-edit: done`.
943
948
 
944
949
  ### Step 5: Live UI: the connectors light up (~2 min)
945
950
 
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
951
  You edit `notes/todo.md` so it becomes the **hub** that points
954
952
  to each of the other four nodes. Each bullet uses a syntax that
955
953
  maps to a specific **link kind**:
@@ -996,50 +994,76 @@ Tell the tester:
996
994
  > colours on the canvas (the two `invokes` share a colour, as you
997
995
  > would expect).
998
996
  >
999
- > Fijate también que los conectores tienen distinta transparencia.
1000
- > Skill-map estima qué tan seguro está de cada conexión: un
1001
- > `[text](file.md)` que apunta a un archivo concreto (1.00 de
1002
- > confianza, ahora que el target existe) se ve sólido, mientras que
1003
- > un `@handle` que no resuelve a ningún nodo se queda en 0.5
1004
- > (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.
997
+ > Notice too that the connectors have different transparency.
998
+ > Skill-map estimates how sure it is of each connection: a
999
+ > `[text](file.md)` that points at a real file (confidence 1.00,
1000
+ > now that the target exists) looks solid, while an `@handle` that
1001
+ > resolves to no node sits at 0.5 (ambiguous) and looks
1002
+ > translucent. The opacity tells that story at a glance: the more
1003
+ > solid the arrow, the more reliable the inference.
1007
1004
  >
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.
1005
+ > Confirm when you see it. If a connector is missing, refresh the
1006
+ > browser and let me know.
1007
+
1008
+ If a connector is missing, do not advance, the next step inspects
1009
+ the same hub edit. Mark `5-live-connectors: done`.
1010
+
1011
+ ### Step 6: Live UI: the Inspector and linked nodes (~1 min)
1012
+
1013
+ The connector opacity tells the confidence story at a glance; the
1014
+ exact per-link breakdown lives in the Inspector. Open it on the hub
1015
+ so the tester registers the surface before Step 7 changes topology.
1016
+
1017
+ > 🆕 Open the Inspector for `notes/todo` (click the node on the
1018
+ > map). Scroll down to the **Linked nodes** panel: it has two
1019
+ > sections, **Outgoing** and **Incoming**. `notes/todo` lists 4
1020
+ > links under Outgoing (it's the hub pointing at four nodes) and 0
1021
+ > under Incoming; if you open the Inspector for any of the four
1022
+ > targeted nodes, you'll see 1 under Incoming. Each row shows the
1023
+ > link kind (`mentions`, `invokes`, `references`) and a badge with
1024
+ > its confidence: the numeric value (`1.00`, `0.50`, …).
1030
1025
  >
1031
- > Confirm cuando las veas en las cinco cards.
1026
+ > Let me know when you see it.
1027
+
1028
+ After the tester confirms, drop this tip:
1029
+
1030
+ > 💡 Tip: if all these changes left the nodes crowded together,
1031
+ > the map toolbar has a **Reset layout** button: it re-runs the
1032
+ > auto-layout so everything reads better. It asks for confirmation
1033
+ > because it discards any positions you moved by hand.
1034
+
1035
+ Wait for confirmation. Mark `6-live-inspector: done`.
1036
+
1037
+ ### Step 7: Live UI: edit a link and watch the topology change (~3 min)
1032
1038
 
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`.
1039
+ **Context**: Step 4 had the tester edit a scalar (`description`)
1040
+ and watch the inspector card refresh. Step 7 raises the bar: edit
1041
+ a Markdown link and watch the MAP TOPOLOGY change (a connector
1042
+ disappears). Same watcher, different surface.
1043
+
1044
+ The server has been live since Step 2, leave it running; this step
1045
+ and the next one (`.skillmapignore`) both reuse it.
1037
1046
 
1038
- ### Step 6: Live UI: silence a private file via `.skillmapignore` (~2 min)
1047
+ > Your turn. Edit `notes/todo.md` with your editor of choice and
1048
+ > delete the bullet that contains `@demo-agent`. Save. Watch the
1049
+ > UI.
1050
+ >
1051
+ > Expected: the `notes/todo → demo-agent` connector (kind:
1052
+ > `mentions`) disappears in real time. The two nodes stay in the
1053
+ > **Map**; only the edge goes.
1054
+
1055
+ You verify by reading `notes/todo.md` to confirm the change was
1056
+ applied. (On `agent-skills`, where the `@demo-agent` bullet was
1057
+ never created in Step 5, ask the tester to remove the only bullet
1058
+ they did add and watch THAT connector vanish, the lesson is the
1059
+ same.) Once they confirm, leave the server running, the next step
1060
+ reuses it. Mark `7-live-edit: done`.
1061
+
1062
+ ### Step 8: Live UI: silence a private file via `.skillmapignore` (~2 min)
1039
1063
 
1040
1064
  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
1065
+ and theirs). Step 8 flips the direction: a file the tester DOES NOT
1066
+ want in the map (a draft, a scratch file, a secret) gets hidden by
1043
1067
  a single line in `.skillmapignore`. Same live mechanism, no restart.
1044
1068
 
1045
1069
  `sm init` already wrote a starter `.skillmapignore` at the scope
@@ -1047,15 +1071,15 @@ root. The flow has three beats:
1047
1071
 
1048
1072
  **Beat 1, you create one new fixture file (the agent does this).**
1049
1073
 
1050
- `Write` `notes/private-credentials.md`, kind `note`, simulates a
1051
- file the tester would never want surfacing publicly:
1074
+ `Write` `notes/private-credentials.md`, kind `markdown`, simulates
1075
+ a file the tester would never want surfacing publicly:
1052
1076
 
1053
1077
  ```markdown
1054
1078
  ---
1055
1079
  name: private-credentials
1056
1080
  description: |
1057
1081
  Personal API tokens, exists in the repo but should not show
1058
- up in the skill-map graph. Demonstrates the .skillmapignore
1082
+ up in skill-map's map. Demonstrates the .skillmapignore
1059
1083
  flow.
1060
1084
  ---
1061
1085
 
@@ -1064,7 +1088,7 @@ description: |
1064
1088
  API_TOKEN: example-not-real
1065
1089
  ```
1066
1090
 
1067
- Confirm the file appears in the graph as a sixth node
1091
+ Confirm the file appears in the map as a sixth node
1068
1092
  (`notes/private-credentials`). The watcher sees it like any
1069
1093
  other `.md`, that's the point of the demo.
1070
1094
 
@@ -1084,14 +1108,15 @@ sees what their cwd holds:
1084
1108
  ├── .claude/
1085
1109
  │ ├── agents/demo-agent.md
1086
1110
  │ ├── commands/demo-command.md
1087
- │ └── skills/demo-skill/SKILL.md
1111
+ │ └── skills/
1112
+ │ ├── demo-skill/SKILL.md
1113
+ │ └── sm-tutorial/SKILL.md ← the tutorial you loaded
1088
1114
  ├── .skill-map/ ← project DB + settings (managed)
1089
1115
  ├── .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
1116
+ └── notes/
1117
+ ├── todo.md
1118
+ ├── demo-guideline.md
1119
+ └── private-credentials.md ← what we want to hide
1095
1120
  ```
1096
1121
 
1097
1122
  > The `.skillmapignore` at the root is the file we'll touch
@@ -1118,7 +1143,7 @@ your `Edit` tool. Tell the tester to do it from their editor:
1118
1143
  >
1119
1144
  > Watch the browser when you save. The
1120
1145
  > `notes/private-credentials` node should disappear from the
1121
- > graph in real time, without restarting anything. Six nodes
1146
+ > **Map** in real time, without restarting anything. Six nodes
1122
1147
  > back to five.
1123
1148
  >
1124
1149
  > Did the node vanish?
@@ -1129,80 +1154,42 @@ verify the appended pattern landed correctly (in case
1129
1154
  allowed. Once confirmed, ask them to stop the server with
1130
1155
  **Ctrl+C** in the terminal before continuing.
1131
1156
 
1132
- Mark `6-live-ignore: done`.
1157
+ Mark `8-live-ignore: done`.
1133
1158
 
1134
- ### Step 7: Wrap-up of the demo and offer to keep going (30 s)
1159
+ ### Step 9: Wrap-up of the demo and offer to keep going (30 s)
1160
+
1161
+ Keep this short: one closing line, then a single decision. Do NOT
1162
+ dump feature notes here (no `.sm` files, multi-provider, active
1163
+ provider, or safety-net asides; those land in their own steps or in
1164
+ day-to-day use). One closing line, then ask.
1165
+
1166
+ Closing line (tester-facing):
1135
1167
 
1136
1168
  > 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
1169
+ > UI reflects it instantly. In ~10 minutes you've seen the full
1170
+ > flow.
1196
1171
 
1197
- If they say **2**:
1198
- - Mark `route.short.status: done`, `route.long.status: declined`.
1199
- - Generate the final summary (see §Final wrap-up).
1172
+ Then ask with the **`AskUserQuestion`** tool (not a numbered list),
1173
+ translating the labels to the tester's language. One question,
1174
+ header `Tutorial`, prompt "Keep going or wrap up here?", two
1175
+ options:
1200
1176
 
1201
- If they say **1**:
1177
+ - **Go deeper**: the rest of the CLI, verbs and flags (`list`,
1178
+ `export`, `plugins`, `db`, ...), about 20-30 min, pausable
1179
+ anytime.
1180
+ - **Wrap up here**: summary plus how to delete the dir.
1181
+
1182
+ (If the host lacks `AskUserQuestion`, fall back to a numbered list.)
1183
+
1184
+ On **Go deeper**:
1202
1185
  - 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).
1186
+ - Move to the next phase without announcing it: a short "Dale,
1187
+ seguimos" (tester-language equivalent), then the level question
1188
+ of the next block.
1189
+
1190
+ On **Wrap up here**:
1191
+ - Mark `route.short.status: done`, `route.long.status: declined`.
1192
+ - Generate the final summary (see §Final wrap-up).
1206
1193
 
1207
1194
  ---
1208
1195
 
@@ -1228,36 +1215,7 @@ Save into `tester.level` and modulate:
1228
1215
  - **Level 3**: dense blocks, flags included, no explanations of
1229
1216
  basic concepts.
1230
1217
 
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)
1218
+ ### Step 10: Browse CLI: list / show / check (~3 min)
1261
1219
 
1262
1220
  ```bash
1263
1221
  sm list
@@ -1276,9 +1234,9 @@ target of the hub's `references` link). `check` reads the persisted
1276
1234
  `scan_issues` table, it does NOT re-walk the filesystem. The
1277
1235
  fixture is clean (Steps 2-6 captured the latest state before
1278
1236
  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`.
1237
+ Step 12 and watch the rule catch it after a fresh `sm scan`.
1280
1238
 
1281
- ### Step 10: ASCII: graph + export (~3 min)
1239
+ ### Step 11: ASCII: graph + export (~3 min)
1282
1240
 
1283
1241
  ```bash
1284
1242
  sm graph
@@ -1296,11 +1254,11 @@ within a key, AND across keys) and a `--format` of `md` or
1296
1254
  segment, `**` spans segments) so `path=notes/**` cleanly
1297
1255
  captures the notes folder regardless of the catch-all kind.
1298
1256
 
1299
- ### Step 11: Issues: broken refs (~3 min)
1257
+ ### Step 12: Issues: broken refs (~3 min)
1300
1258
 
1301
1259
  `reference-broken` is one of the deterministic rules `sm check` runs.
1302
1260
  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
1261
+ internalise that it is an **issue** on a node, NOT a
1304
1262
  connector and NOT the same thing as an "orphan".
1305
1263
 
1306
1264
  > ℹ️ `reference-broken` is one of ~16 built-in rules. Others surface
@@ -1331,7 +1289,7 @@ sm check --analyzers reference-broken
1331
1289
  sm check --json
1332
1290
  ```
1333
1291
 
1334
- Expected: the warning surfaces the dangling link from
1292
+ Expected: the error surfaces the dangling link from
1335
1293
  `notes/todo.md` to the non-existent `missing-page.md`. The
1336
1294
  `--analyzers` filter lets you focus on a single issue type; `--json`
1337
1295
  emits the structured payload (useful for CI / scripting). When
@@ -1341,7 +1299,7 @@ rest of the deep-dive doesn't depend on it.
1341
1299
  If the tester asks about `sm orphans` vs `sm check`, see
1342
1300
  §Scope clarifications.
1343
1301
 
1344
- ### Step 12: Plugins (~3 min)
1302
+ ### Step 13: Plugins (~3 min)
1345
1303
 
1346
1304
  **Context, present plugins to the tester before any command runs.**
1347
1305
  This is the official welcome to the plugin world; many testers will
@@ -1352,15 +1310,13 @@ standard rules):
1352
1310
 
1353
1311
  > Plugins are how skill-map gets extended. The kernel ships with a
1354
1312
  > 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.
1313
+ > write their own and drop them into the project.
1358
1314
  >
1359
1315
  > The kernel exposes **six** plugin types you can implement:
1360
1316
  >
1361
1317
  > - **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`).
1318
+ > - **analyzers**: rules that detect issues on a node.
1319
+ > - **actions**: operations the user runs on a node.
1364
1320
  > - **hooks**: fire on lifecycle events (scan started, finished,
1365
1321
  > …).
1366
1322
  > - **formatters**: render outputs in different shapes (text,
@@ -1368,12 +1324,9 @@ standard rules):
1368
1324
  > - **providers**: declare new node kinds and where to look for
1369
1325
  > them.
1370
1326
  >
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.
1327
+ > Heads up: plugins can be managed from the UI as well as the CLI.
1328
+ > We'll use the CLI here because it shows the full surface in a few
1329
+ > lines.
1377
1330
  >
1378
1331
  > Let's look at what's installed right now.
1379
1332
 
@@ -1384,18 +1337,17 @@ sm plugins list
1384
1337
  sm plugins doctor
1385
1338
  sm plugins show core
1386
1339
  sm plugins disable core/external-url-counter
1387
- sm plugins list # confirm it shows as disabled
1340
+ sm plugins show core # confirm it shows as disabled
1388
1341
  sm plugins enable core/external-url-counter
1389
1342
  ```
1390
1343
 
1391
- If the tester asks about `plugins doctor` warnings, `plugins show`
1392
- behavior, or which id format `disable` / `enable` accept, see
1393
- §Scope clarifications.
1344
+ If the tester asks about `plugins doctor` warnings or `plugins show`
1345
+ behavior, see §Scope clarifications.
1394
1346
 
1395
1347
  If `plugins list` shows zero entries (depends on the build), tell
1396
1348
  the tester no plugins are installed yet and offer to skip.
1397
1349
 
1398
- ### Step 13: Annotations and the `.sm` consent prompt (~3 min)
1350
+ ### Step 14: Annotations and the `.sm` consent prompt (~3 min)
1399
1351
 
1400
1352
  **Context**: every `.md` skill-map tracks gets a sibling
1401
1353
  **companion file** with extension `.sm` that carries **all of
@@ -1410,8 +1362,9 @@ the project.
1410
1362
 
1411
1363
  The first time skill-map wants to write one in a new project it
1412
1364
  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.
1365
+ permission. After you say yes, the choice is saved to the
1366
+ project's `settings.local.json` (part of your project config,
1367
+ gitignored) and the prompt never appears again.
1415
1368
 
1416
1369
  We'll demonstrate by creating an empty annotation scaffold for
1417
1370
  `notes/todo.md`. **Reset any prior consent state first** so the
@@ -1447,9 +1400,9 @@ goes through silently). On a CI / non-interactive session, pass
1447
1400
  If the tester asks about `sm bump` vs `sm sidecar annotate` vs
1448
1401
  `sm sidecar refresh`, see §Scope clarifications.
1449
1402
 
1450
- ### Step 14: Validate links to folders outside the scan scope (~4 min)
1403
+ ### Step 15: Validate links to folders outside the scan scope (~4 min)
1451
1404
 
1452
- **Context**: until now the graph saw only files inside the cwd. In
1405
+ **Context**: until now the map saw only files inside the cwd. In
1453
1406
  real projects a repo often links to files in a sibling repo (a specs
1454
1407
  project, a sibling package in a monorepo). Skill-map only scans from
1455
1408
  its cwd downwards, so a link to `../sibling/file.md` shows up as
@@ -1457,7 +1410,7 @@ broken. The fix is to declare the external folders in
1457
1410
  `scan.referencePaths`, which lets the `reference-broken` analyzer
1458
1411
  validate path-style links against those extra roots **without
1459
1412
  indexing their files as nodes**. The folders are checked, not walked
1460
- as part of the graph.
1413
+ as part of the map.
1461
1414
 
1462
1415
  **Setup (you, silent)**: write the fixture under the tutorial cwd
1463
1416
  so both sub-projects are siblings of each other but children of the
@@ -1505,23 +1458,23 @@ Anything that hijoA points at lives here.
1505
1458
 
1506
1459
  Once the files are in place, tell the tester:
1507
1460
 
1508
- > Acabo de dejar dos carpetas hermanas dentro del cwd del tutorial:
1461
+ > I just dropped two sibling folders inside the tutorial cwd:
1509
1462
  >
1510
1463
  > ```
1511
1464
  > link-validation/
1512
1465
  > ├── hijoA/
1513
- > │ └── note-with-external-link.md ← contiene [spec](../hijoB/spec.md)
1466
+ > │ └── note-with-external-link.md ← contains [spec](../hijoB/spec.md)
1514
1467
  > └── hijoB/
1515
- > └── spec.md ← el archivo target real
1468
+ > └── spec.md ← the real target file
1516
1469
  > ```
1517
1470
  >
1518
- > Para este paso vas a cambiar de carpeta momentáneamente, así `sm`
1519
- > trata a `hijoA/` como un proyecto separado (cwd nuevo, scope
1520
- > acotado al subárbol). Al final del paso te indico cómo volver.
1471
+ > For this step you'll switch folders for a moment, so `sm` treats
1472
+ > `hijoA/` as a separate project (new cwd, scope limited to that
1473
+ > subtree). At the end of the step I'll tell you how to come back.
1521
1474
  >
1522
- > Si quedó algún `sm` corriendo de un paso anterior, ciérralo con
1523
- > Ctrl+C así el puerto queda libre para el de este paso. Después,
1524
- > en tu segundo terminal:
1475
+ > If an `sm` from an earlier step is still running, close it with
1476
+ > Ctrl+C so the port is free for this one. Then, in your second
1477
+ > terminal:
1525
1478
 
1526
1479
  ```bash
1527
1480
  cd link-validation/hijoA
@@ -1529,33 +1482,32 @@ sm init
1529
1482
  sm check
1530
1483
  ```
1531
1484
 
1532
- > Vas a ver un warning del analyzer (regla que detecta problemas)
1533
- > `reference-broken` apuntando al link `../hijoB/spec.md`. Para
1534
- > skill-map ese archivo no existe, porque `hijoB/` queda afuera
1535
- > del scope (alcance) que `sm` está escaneando desde `hijoA/`:
1536
- > cada proyecto tiene su propio `.skill-map/` y solo recorre
1537
- > desde su cwd hacia abajo, nunca para "arriba" ni hacia carpetas
1538
- > hermanas.
1485
+ > You'll see an error from the `reference-broken` analyzer (a rule
1486
+ > that flags problems) pointing at the link `../hijoB/spec.md`. As
1487
+ > far as skill-map is concerned that file doesn't exist, because
1488
+ > `hijoB/` sits outside the scope `sm` is scanning from `hijoA/`:
1489
+ > each project has its own `.skill-map/` and only walks from its
1490
+ > cwd downwards, never "up" and never into sibling folders.
1539
1491
  >
1540
- > Pásame la salida (o un OK) y seguimos con el fix.
1492
+ > Paste me the output (or just an OK) and we'll move on to the fix.
1541
1493
 
1542
- Wait for confirmation before showing the fix. Mark the warning
1494
+ Wait for confirmation before showing the fix. Mark the error
1543
1495
  landed as expected; if the tester reports `✓ No issues` instead,
1544
1496
  the most likely cause is that they ran `sm check` from the
1545
1497
  tutorial root by mistake (the root scan still sees both folders).
1546
1498
  Have them re-check that the cwd of their second terminal is
1547
1499
  `link-validation/hijoA/` (`pwd`) and rerun.
1548
1500
 
1549
- After they confirm the broken-ref warning, present the fix:
1501
+ After they confirm the broken-ref error, present the fix:
1550
1502
 
1551
- > Para resolver el link sin tener que mover `hijoB/` dentro de
1552
- > `hijoA/`, agregas `../hijoB` al setting `scan.referencePaths`.
1553
- > Le dice al analyzer "si un link path-style cae acá, valídalo
1554
- > también contra estas carpetas extra". Los archivos NO se
1555
- > agregan al grafo (no aparecen como nodos), solo se consultan
1556
- > para resolver referencias salientes desde `hijoA/`.
1503
+ > To resolve the link without moving `hijoB/` inside `hijoA/`, you
1504
+ > add `../hijoB` to the `scan.referencePaths` setting. It tells the
1505
+ > analyzer "if a path-style link lands here, validate it against
1506
+ > these extra folders too". The files are NOT added to the map
1507
+ > (they don't show up as nodes), they're only consulted to resolve
1508
+ > outgoing references from `hijoA/`.
1557
1509
  >
1558
- > En tu segundo terminal (todavía dentro de `link-validation/hijoA/`):
1510
+ > In your second terminal (still inside `link-validation/hijoA/`):
1559
1511
 
1560
1512
  ```bash
1561
1513
  sm config set scan.referencePaths '["../hijoB"]' --yes
@@ -1563,25 +1515,25 @@ sm scan
1563
1515
  sm check
1564
1516
  ```
1565
1517
 
1566
- > El flag `--yes` confirma el privacy gate (control de privacidad):
1567
- > estás autorizando que skill-map lea archivos fuera del project
1568
- > 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.
1518
+ > The `--yes` flag confirms the privacy gate: you're authorizing
1519
+ > skill-map to read files outside the project root, so it asks for
1520
+ > your explicit OK. Without `--yes` the verb aborts and asks you to
1521
+ > retry with `--yes` (it does not open an interactive prompt).
1522
+ > After the scan, `sm check` should print `✓ No issues`: the error
1523
+ > is gone and `hijoB/` still hasn't entered the map as a node.
1572
1524
  >
1573
- > Pásame la salida y vemos cómo quedó persistido.
1525
+ > Paste me the output and let's see how it got persisted.
1574
1526
 
1575
1527
  Wait for confirmation. After they paste the clean `sm check`
1576
1528
  output, show where the value lives on disk:
1577
1529
 
1578
- > Mira cómo quedó guardado el cambio:
1530
+ > Look at how the change got saved:
1579
1531
 
1580
1532
  ```bash
1581
1533
  cat .skill-map/settings.local.json
1582
1534
  ```
1583
1535
 
1584
- > Vas a ver algo así:
1536
+ > You'll see something like this:
1585
1537
  >
1586
1538
  > ```json
1587
1539
  > {
@@ -1591,50 +1543,42 @@ cat .skill-map/settings.local.json
1591
1543
  > }
1592
1544
  > ```
1593
1545
  >
1594
- > Vive en `settings.local.json` (gitignored, no viaja por git),
1595
- > NO en el `settings.json` que se commitea. La razón: los
1596
- > paths a carpetas hermanas suelen depender del layout local de
1597
- > tu máquina (no todos los contribuidores tienen el mismo árbol
1598
- > de proyectos en disco), por eso skill-map fuerza este setting
1599
- > al layer local.
1546
+ > It lives in `settings.local.json` (gitignored, doesn't travel
1547
+ > through git), NOT in the `settings.json` that does get committed.
1548
+ > The reason: paths to sibling folders usually depend on your
1549
+ > machine's local layout (not every contributor has the same
1550
+ > project tree on disk), so skill-map forces this setting into the
1551
+ > local layer.
1600
1552
 
1601
1553
  Now the UI half. The tester needs `sm` running with `hijoA/` as
1602
1554
  cwd to see the matching panel:
1603
1555
 
1604
- > Lo mismo desde la UI. En el mismo terminal, levanta el servidor
1605
- > desde `hijoA/`:
1556
+ > Now the same thing from the UI. In the same terminal, start the
1557
+ > server from `hijoA/`:
1606
1558
 
1607
1559
  ```bash
1608
1560
  sm
1609
1561
  ```
1610
1562
 
1611
- > Abre la URL que imprime el comando en el browser. Arriba a la
1612
- > derecha está el icono (gear), haz clic ahí, en el modal ve al
1613
- > tab **Project** y baja hasta la sección **Folders for link
1614
- > validation**. Vas a ver `../hijoB` listado, con botones para
1615
- > agregar o sacar paths. La CLI y la UI escriben al mismo archivo:
1616
- > si agregas uno desde la UI, aparece en el JSON, y viceversa.
1563
+ > Open the URL the command prints in the browser. Top right there's
1564
+ > the **sliders** icon (hover shows "Settings"), click it, in the
1565
+ > modal go to the **Project** tab and scroll down to the **Folders
1566
+ > for link validation** section. You'll see `../hijoB` listed, with buttons to add or
1567
+ > remove paths. The CLI and the UI write to the same file: if you
1568
+ > add one from the UI, it shows up in the JSON, and vice versa.
1617
1569
  >
1618
- > Cuando termines de mirar, Ctrl+C en el terminal para cerrar el
1619
- > servidor.
1570
+ > When you're done looking, Ctrl+C in the terminal to close the
1571
+ > server.
1620
1572
 
1621
1573
  Wait for confirmation that they saw the panel and closed the
1622
1574
  server. If the `sm` launch fails with a port-in-use error, an old
1623
1575
  `sm` is still bound to the default port from an earlier step;
1624
1576
  follow the §Edge cases recipe (`sm serve --port 4243`).
1625
1577
 
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`.
1578
+ The tester is still inside `link-validation/hijoA/` at this point.
1579
+ Do NOT send them back here; the return-to-root `cd ../..` now lives
1580
+ in §Final wrap-up, right before the cleanup line. Mark
1581
+ `15-reference-paths: done`.
1638
1582
 
1639
1583
  ---
1640
1584
 
@@ -1668,23 +1612,6 @@ extension table to spot the one you queried.
1668
1612
 
1669
1613
  ### IDs for `plugins disable` / `plugins enable`
1670
1614
 
1671
- Those verbs accept either a **qualified extension id**
1672
- `<bundle>/<ext-id>` (e.g. `core/external-url-counter`,
1673
- `claude/at-directive`) or a **bare bundle id** (e.g. `claude`,
1674
- `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`.
1680
-
1681
- Single-extension bundles (`openai`, `antigravity`,
1682
- `agent-skills`) flip without prompting because the macro is a
1683
- 1-1 mapping. Multi-extension bundles (`claude`, `core`,
1684
- multi-extension user plugins) need `--yes` OR an interactive TTY
1685
- confirm; pipe / CI contexts always need `--yes` to avoid an
1686
- accidental cascade.
1687
-
1688
1615
  **Multiple ids in one call**: both verbs accept any number of ids
1689
1616
  in a single invocation, e.g. `sm plugins disable antigravity openai
1690
1617
  agent-skills` or `sm plugins enable claude/at-directive core/external-url-counter`.
@@ -1702,7 +1629,7 @@ agent reservations like `general-purpose`), `sm check` surfaces a
1702
1629
  files that shadow its built-ins, so the warning is not a bug,
1703
1630
  it's skill-map telling the operator "Claude will never invoke this
1704
1631
  file; pick another name". Incoming links to the shadowed file
1705
- resolve at confidence `0.1` instead of `1.0`, so the graph also
1632
+ resolve at confidence `0.1` instead of `1.0`, so the **Map** also
1706
1633
  visually de-emphasises them. Rename the file and the warning
1707
1634
  clears on the next scan.
1708
1635
 
@@ -1720,10 +1647,10 @@ clears on the next scan.
1720
1647
  ## Final wrap-up
1721
1648
 
1722
1649
  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):
1650
+ closing block: a "that's a wrap" line, the sm-master pointer, the
1651
+ return-to-root line (deep-dive only), and a guilt-free cleanup line.
1725
1652
 
1726
- > Thanks! That's a wrap.
1653
+ > Thanks! That's a wrap, you went through the whole tutorial.
1727
1654
  >
1728
1655
  > One more thing before you go: there's a companion skill called
1729
1656
  > **sm-master** that picks up where this tutorial leaves off. It's
@@ -1737,61 +1664,28 @@ sm-master pointer + cleanup):
1737
1664
  sm tutorial master
1738
1665
  ```
1739
1666
 
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.
1667
+ If the deep-dive ran, the tester's second terminal is still inside
1668
+ `link-validation/hijoA/` from Step 15; send them back to the
1669
+ tutorial root before the cleanup line. **Skip this whole block if
1670
+ they stopped at the demo** (they never left the root).
1743
1671
 
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).
1672
+ > Last thing, go back to the tutorial root:
1754
1673
 
1755
- If the cwd is dedicated, render:
1756
-
1757
- > To delete everything THIS tutorial left behind:
1758
- >
1759
- > cd ~ && rm -rf <cwd>
1760
- >
1761
- > Thanks for testing skill-map!
1674
+ ```bash
1675
+ cd ../..
1676
+ ```
1762
1677
 
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):
1678
+ Then close with the thanks, a guilt-free cleanup line, and the
1679
+ findings reminder. The cleanup is safe to state plainly: `sm
1680
+ tutorial` only seeds into an empty directory, so everything in the
1681
+ cwd is tutorial-created and a whole-folder delete loses nothing of
1682
+ the tester's. Substitute `<dir>` with the actual directory name.
1767
1683
 
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!
1684
+ > Thanks for testing skill-map! You started in an empty directory, so
1685
+ > everything here was created by the tutorial: when you're done you
1686
+ > can delete the whole folder guilt-free with `cd .. && rm -rf <dir>`.
1687
+ > If anything felt off in any step, tell me and I'll log it in
1688
+ > `findings.md` before you close.
1795
1689
 
1796
1690
  ## Resume / restart
1797
1691
 
@@ -1800,9 +1694,9 @@ the cwd, start like this (do NOT repeat pre-flight from scratch):
1800
1694
 
1801
1695
  > I see you already started the tutorial.
1802
1696
  >
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).
1697
+ > You're at step <N> of 9 (or "you've already completed the demo
1698
+ > (steps 1-9) and you're on step <M> of 6 of the deep-dive (steps
1699
+ > 10-15)", depending on the yaml state).
1806
1700
  >
1807
1701
  > 1. **Continue** from where you left off
1808
1702
  > 2. **Start over**: wipes all the tutorial content in this dir
@@ -1841,7 +1735,7 @@ anything**:
1841
1735
  > notes/todo.md
1842
1736
  > notes/demo-guideline.md
1843
1737
  > notes/private-credentials.md
1844
- > link-validation/ (if Step 14 ran)
1738
+ > link-validation/ (if Step 15 ran)
1845
1739
  > export.* (if present)
1846
1740
  > dump.sql (if present)
1847
1741
  > ```
@@ -1862,12 +1756,12 @@ anything**:
1862
1756
  `<provider_dir>/skills`), then `notes/` and `<provider_dir>/`,
1863
1757
  each one only if empty (silent failure if not). `link-validation/`
1864
1758
  IS safe to remove recursively when present, the agent created it
1865
- from scratch in Step 14 and nothing else lives inside it. Then
1759
+ from scratch in Step 15 and nothing else lives inside it. Then
1866
1760
  start everything from pre-flight.
1867
1761
 
1868
1762
  ## Edge cases
1869
1763
 
1870
- - **Tester doesn't have Node 20+** → guide them to `nvm` or
1764
+ - **Tester doesn't have Node 24+** → guide them to `nvm` or
1871
1765
  nodejs.org. Don't try to install Node for them.
1872
1766
  - **Port 4242 in use** → bare `sm` doesn't accept flags (it's a
1873
1767
  shorthand for `sm serve` with defaults). Tell the tester to