@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.
- package/dist/cli/tutorial/sm-master/SKILL.md +7 -9
- package/dist/cli/tutorial/sm-master/references/fixture-templates.md +1 -1
- package/dist/cli/tutorial/sm-master/references/tour-plugins.md +10 -9
- package/dist/cli/tutorial/sm-master/references/tour-settings.md +4 -4
- package/dist/cli/tutorial/sm-tutorial/SKILL.md +263 -369
- package/dist/cli.js +945 -256
- package/dist/cli.js.map +1 -1
- package/dist/index.js +21 -15
- package/dist/index.js.map +1 -1
- package/dist/kernel/index.d.ts +43 -6
- package/dist/kernel/index.js +21 -15
- package/dist/kernel/index.js.map +1 -1
- package/dist/ui/chunk-27WQPOXP.js +1 -0
- package/dist/ui/{chunk-DZBSELHN.js → chunk-43S72FTV.js} +1 -1
- package/dist/ui/chunk-555ST76V.js +1 -0
- package/dist/ui/{chunk-JPYAASHN.js → chunk-5AD5ZV4I.js} +3 -3
- package/dist/ui/{chunk-CFJBTDAA.js → chunk-5ITZXW3A.js} +1 -1
- package/dist/ui/chunk-A7PRWMQD.js +1021 -0
- package/dist/ui/chunk-CBI77N5U.js +123 -0
- package/dist/ui/chunk-F7I6KMHX.js +1 -0
- package/dist/ui/{chunk-77J7XU3Y.js → chunk-I5AX4U2N.js} +28 -28
- package/dist/ui/chunk-IUZRAD7S.js +1 -0
- package/dist/ui/{chunk-XOHD5XWA.js → chunk-IYM26L3O.js} +1 -1
- package/dist/ui/{chunk-SBCO7ZSP.js → chunk-LGFABCIA.js} +1 -1
- package/dist/ui/{chunk-IUDL3NDH.js → chunk-MFLFIA7C.js} +1 -1
- package/dist/ui/chunk-MS6B7344.js +315 -0
- package/dist/ui/chunk-P3SNMV4X.js +2 -0
- package/dist/ui/chunk-PZQHB7GS.js +4 -0
- package/dist/ui/chunk-QDUSFOBE.js +1 -0
- package/dist/ui/{chunk-YCR3XCIW.js → chunk-QNTAOR2L.js} +5 -5
- package/dist/ui/{chunk-CR3AANNX.js → chunk-S4S5ZMXJ.js} +1 -1
- package/dist/ui/{chunk-5WJRN3LD.js → chunk-T3IVIRRJ.js} +1 -1
- package/dist/ui/{chunk-HP375T2O.js → chunk-VGPYYAVI.js} +1 -1
- package/dist/ui/chunk-X227ITGS.js +499 -0
- package/dist/ui/index.html +1 -1
- package/dist/ui/main-ERCTR2PR.js +3 -0
- package/package.json +10 -9
- package/dist/ui/chunk-2IF446BS.js +0 -1
- package/dist/ui/chunk-DIKPNZUZ.js +0 -315
- package/dist/ui/chunk-KGCJINI6.js +0 -1
- package/dist/ui/chunk-PPE3P2JD.js +0 -1
- package/dist/ui/chunk-UOCACZLI.js +0 -123
- package/dist/ui/chunk-YL6SWAFJ.js +0 -1024
- package/dist/ui/main-VHFB7Q2D.js +0 -3
- /package/dist/ui/{chunk-C2YUQODZ.js → chunk-4SG4352Z.js} +0 -0
- /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
|
|
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
|
|
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
|
|
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
|
|
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`:
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
441
|
-
|
|
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
|
|
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
|
|
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
|
|
560
|
-
# project does not leak into the main demo
|
|
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-
|
|
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: "
|
|
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: "
|
|
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: "
|
|
619
|
+
- id: "11-ascii"
|
|
615
620
|
title: "ASCII: graph + export"
|
|
616
621
|
status: "pending"
|
|
617
622
|
verbs: ["sm graph", "sm export"]
|
|
618
|
-
- id: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
-
|
|
729
|
-
it here and keep it alive through Step
|
|
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
|
|
742
|
-
>
|
|
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
|
-
>
|
|
756
|
-
>
|
|
757
|
-
>
|
|
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
|
|
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
|
|
766
|
-
> 1. **
|
|
767
|
-
> 2. **
|
|
768
|
-
>
|
|
769
|
-
>
|
|
770
|
-
>
|
|
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
|
|
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 →
|
|
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
|
|
923
|
-
> (Bump
|
|
924
|
-
> them write files to your project and we cover that
|
|
925
|
-
> deliberately in step
|
|
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
|
-
>
|
|
1000
|
-
> Skill-map
|
|
1001
|
-
> `[text](file.md)`
|
|
1002
|
-
>
|
|
1003
|
-
>
|
|
1004
|
-
>
|
|
1005
|
-
>
|
|
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
|
|
1009
|
-
> me.
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
>
|
|
1023
|
-
>
|
|
1024
|
-
>
|
|
1025
|
-
>
|
|
1026
|
-
>
|
|
1027
|
-
>
|
|
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
|
-
>
|
|
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
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
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
|
-
|
|
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
|
|
1042
|
-
want in the
|
|
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 `
|
|
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
|
|
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
|
|
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/
|
|
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
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
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
|
-
>
|
|
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 `
|
|
1157
|
+
Mark `8-live-ignore: done`.
|
|
1133
1158
|
|
|
1134
|
-
### Step
|
|
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
|
|
1138
|
-
>
|
|
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
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
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
|
-
|
|
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
|
|
1204
|
-
"
|
|
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
|
|
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
|
|
1237
|
+
Step 12 and watch the rule catch it after a fresh `sm scan`.
|
|
1280
1238
|
|
|
1281
|
-
### Step
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1363
|
-
> - **actions**:
|
|
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:
|
|
1372
|
-
>
|
|
1373
|
-
>
|
|
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
|
|
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
|
|
1392
|
-
behavior,
|
|
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
|
|
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
|
|
1414
|
-
|
|
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
|
|
1403
|
+
### Step 15: Validate links to folders outside the scan scope (~4 min)
|
|
1451
1404
|
|
|
1452
|
-
**Context**: until now the
|
|
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
|
|
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
|
-
>
|
|
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 ←
|
|
1466
|
+
> │ └── note-with-external-link.md ← contains [spec](../hijoB/spec.md)
|
|
1514
1467
|
> └── hijoB/
|
|
1515
|
-
> └── spec.md ←
|
|
1468
|
+
> └── spec.md ← the real target file
|
|
1516
1469
|
> ```
|
|
1517
1470
|
>
|
|
1518
|
-
>
|
|
1519
|
-
>
|
|
1520
|
-
>
|
|
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
|
-
>
|
|
1523
|
-
> Ctrl+C
|
|
1524
|
-
>
|
|
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
|
-
>
|
|
1533
|
-
>
|
|
1534
|
-
> skill-map
|
|
1535
|
-
>
|
|
1536
|
-
>
|
|
1537
|
-
>
|
|
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
|
-
>
|
|
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
|
|
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
|
|
1501
|
+
After they confirm the broken-ref error, present the fix:
|
|
1550
1502
|
|
|
1551
|
-
>
|
|
1552
|
-
>
|
|
1553
|
-
>
|
|
1554
|
-
>
|
|
1555
|
-
>
|
|
1556
|
-
>
|
|
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
|
-
>
|
|
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
|
-
>
|
|
1567
|
-
>
|
|
1568
|
-
>
|
|
1569
|
-
>
|
|
1570
|
-
>
|
|
1571
|
-
>
|
|
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
|
-
>
|
|
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
|
-
>
|
|
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
|
-
>
|
|
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
|
-
>
|
|
1595
|
-
>
|
|
1596
|
-
>
|
|
1597
|
-
>
|
|
1598
|
-
>
|
|
1599
|
-
>
|
|
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
|
-
>
|
|
1605
|
-
>
|
|
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
|
-
>
|
|
1612
|
-
>
|
|
1613
|
-
>
|
|
1614
|
-
> validation
|
|
1615
|
-
>
|
|
1616
|
-
>
|
|
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
|
-
>
|
|
1619
|
-
>
|
|
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
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
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
|
|
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
|
|
1724
|
-
|
|
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
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
>
|
|
1759
|
-
> cd ~ && rm -rf <cwd>
|
|
1760
|
-
>
|
|
1761
|
-
> Thanks for testing skill-map!
|
|
1674
|
+
```bash
|
|
1675
|
+
cd ../..
|
|
1676
|
+
```
|
|
1762
1677
|
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
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
|
-
>
|
|
1769
|
-
>
|
|
1770
|
-
>
|
|
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
|
|
1804
|
-
> (steps 1-
|
|
1805
|
-
>
|
|
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
|
|
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
|
|
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
|
|
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
|