@skill-map/cli 0.24.5 → 0.26.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.md +498 -0
- package/dist/cli/tutorial/sm-tutorial.md +407 -306
- package/dist/cli.js +290 -105
- package/dist/cli.js.map +1 -1
- package/dist/index.js +22 -1
- package/dist/index.js.map +1 -1
- package/dist/kernel/index.js +22 -1
- package/dist/kernel/index.js.map +1 -1
- package/dist/ui/{chunk-BK4M46IZ.js → chunk-4GTCV7V4.js} +1 -1
- package/dist/ui/{chunk-533YMAY3.js → chunk-PY2R7LHN.js} +2 -2
- package/dist/ui/{chunk-5RHOYCWS.js → chunk-Q64EKSUB.js} +3 -3
- package/dist/ui/chunk-VH5GRUT7.js +255 -0
- package/dist/ui/{chunk-RR36XBDS.js → chunk-WOLLYGGL.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/ui/main-CYRAD3L6.js +2 -0
- package/dist/ui/{styles-DLFC3F2G.css → styles-EGXMA46P.css} +1 -1
- package/package.json +2 -2
- package/dist/ui/chunk-O546Z3K4.js +0 -251
- package/dist/ui/main-PNXPQAO6.js +0 -2
|
@@ -30,27 +30,38 @@ 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
|
|
34
|
-
> "if you want, we can keep going deeper" without labelling it.
|
|
33
|
+
> talk about the current step and, at the end of step 7 (wrap-up),
|
|
34
|
+
> offer "if you want, we can keep going deeper" without labelling it.
|
|
35
35
|
|
|
36
36
|
## Tone
|
|
37
37
|
|
|
38
|
+
### Language and register
|
|
39
|
+
|
|
38
40
|
- Spanish (when the tester's language is Spanish): casual, neutral,
|
|
39
41
|
NOT rioplatense. Short sentences. No unnecessary jargon. Use
|
|
40
42
|
`tú` form, not `vos` — `puedes`, `mira`, `prueba`, `crea`, NOT
|
|
41
43
|
`podés`, `mirá`, `probá`, `creá`. Avoid Argentine fillers
|
|
42
|
-
(`dale`, `bueno`, `che`, `re-`, `genial`).
|
|
44
|
+
(`dale`, `bueno`, `che`, `re-`, `genial`). Also avoid overly
|
|
45
|
+
colloquial imperatives even when they're grammatical: prefer
|
|
46
|
+
`espera` / `aguarda` over `aguanta`, `revisa` over `chequea`,
|
|
47
|
+
`observa` / `fíjate en` over `fijate`. Casual is OK; slangy is
|
|
48
|
+
not.
|
|
43
49
|
- Address the tester by name if they introduced themselves; if not,
|
|
44
50
|
the implicit second person from the verb is enough. No need to
|
|
45
51
|
invent a stand-in pronoun.
|
|
46
52
|
- Don't be condescending. If they ask for something that will
|
|
47
53
|
break, say so directly.
|
|
54
|
+
### Vocabulary translation (Spanish)
|
|
55
|
+
|
|
48
56
|
- **Translate product vocabulary into Spanish, do NOT leave English
|
|
49
57
|
loanwords embedded in Spanish prose.** When rendering tester-facing
|
|
50
58
|
copy in Spanish, use these equivalences:
|
|
51
59
|
- `kind` → `tipo` (skill-map talks about node "kinds"; in
|
|
52
60
|
Spanish output the word is `tipo` / `tipos`, NOT "kinds").
|
|
53
|
-
- `connector` → `conector
|
|
61
|
+
- `connector` / `edge` → `conector` (**NEVER** `arista`, even
|
|
62
|
+
though it's the common Spanish translation for graph edge;
|
|
63
|
+
skill-map's house word is `conector` everywhere — UI, docs,
|
|
64
|
+
CLI, conversation).
|
|
54
65
|
- `watcher` → `observador` (or rephrase: "skill-map sigue tus
|
|
55
66
|
cambios" instead of "el watcher detecta...").
|
|
56
67
|
- `scan` (verb) → `escanear`; `scan` (noun) → `escaneo`.
|
|
@@ -60,10 +71,12 @@ optional second phase (~20-30 min) covering the rest of the CLI.
|
|
|
60
71
|
- File paths, frontmatter keys (`name`, `description`, `event`,
|
|
61
72
|
etc.), CLI verbs (`sm init`, `sm watch`), and code identifiers
|
|
62
73
|
stay English — that's the public surface, not jargon.
|
|
63
|
-
Anti-pattern (do NOT emit): "aparecen los otros
|
|
74
|
+
Anti-pattern (do NOT emit): "aparecen los otros tres kinds",
|
|
64
75
|
"el watcher detectó el cambio", "vamos a hacer un scan ahora".
|
|
65
|
-
Correct: "aparecen los otros
|
|
76
|
+
Correct: "aparecen los otros tres tipos", "skill-map detectó
|
|
66
77
|
el cambio", "vamos a escanear ahora".
|
|
78
|
+
### Silence during backstage work
|
|
79
|
+
|
|
67
80
|
- **Stay silent during backstage work.** Do NOT narrate operational
|
|
68
81
|
steps you're about to take or internal checks. Forbidden patterns
|
|
69
82
|
include "Voy a verificar primero que el directorio esté listo",
|
|
@@ -76,6 +89,8 @@ optional second phase (~20-30 min) covering the rest of the CLI.
|
|
|
76
89
|
do something, (b) a sub-step landed and you want a confirm, or
|
|
77
90
|
(c) something failed and they need to know. Between those
|
|
78
91
|
moments, work without commentary.
|
|
92
|
+
### Glossing technical terms
|
|
93
|
+
|
|
79
94
|
- **Explain technical terms in parentheses the first time you
|
|
80
95
|
mention them in a tester-facing blockquote.** Assume the tester
|
|
81
96
|
is non-technical; many will not know what `frontmatter`,
|
|
@@ -87,6 +102,8 @@ optional second phase (~20-30 min) covering the rest of the CLI.
|
|
|
87
102
|
Internal narration in this SKILL.md does not need the gloss;
|
|
88
103
|
this rule is purely about what the agent says to the tester.
|
|
89
104
|
After the first mention in a session, the bare term is fine.
|
|
105
|
+
### Tester-facing Markdown (blockquotes vs code blocks)
|
|
106
|
+
|
|
90
107
|
- **Messages addressed to the tester are rendered as Markdown
|
|
91
108
|
blockquotes** (lines prefixed with `> `): instructions, narrative
|
|
92
109
|
context, numbered choice menus, prompts, confirmations. The
|
|
@@ -96,6 +113,8 @@ optional second phase (~20-30 min) covering the rest of the CLI.
|
|
|
96
113
|
plain code blocks so the copy works cleanly. If a step has both
|
|
97
114
|
narrative and a command, write the narrative in a blockquote
|
|
98
115
|
*above* the bare code block (not inside it).
|
|
116
|
+
### Language mirroring + fixture content
|
|
117
|
+
|
|
99
118
|
- **Mirror the tester's language**: if the first message they wrote
|
|
100
119
|
was in Spanish, run the conversation in neutral Spanish (per
|
|
101
120
|
the Tone bullets above — `tú` form, no rioplatense); if in
|
|
@@ -129,48 +148,98 @@ optional second phase (~20-30 min) covering the rest of the CLI.
|
|
|
129
148
|
demo needs this so the watcher has something to react to).
|
|
130
149
|
- Read files to verify what the tester modified.
|
|
131
150
|
- Everything else is run by the tester.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
2. **After every command block, stop and wait.** The tester pastes
|
|
151
|
+
2. **Configuration files have two-mode access**: backstage setup
|
|
152
|
+
vs teach moment.
|
|
153
|
+
- **Backstage setup (you DO edit)**: right after `sm init` in
|
|
154
|
+
Step 1, you append the tutorial's internal entries
|
|
155
|
+
(`sm-tutorial.md`, `findings.md`, `tutorial-state.yml`,
|
|
156
|
+
`sm-tutorial-report.md`, etc.) to the freshly created
|
|
157
|
+
`.skillmapignore` with `Edit`. That is plumbing — the
|
|
158
|
+
tester does not need to learn that the tutorial hides its
|
|
159
|
+
own scaffolding from the scan. Do it silently and move on.
|
|
160
|
+
- **Teach moment (you DO NOT edit)**: any time the SKILL
|
|
161
|
+
calls for a change to `.skillmapignore`,
|
|
162
|
+
`.skill-map/settings.json`,
|
|
163
|
+
`.skill-map/settings.local.json`, or `.gitignore` AS PART
|
|
164
|
+
OF A LESSON (e.g. Step 6 hides a private node by appending
|
|
165
|
+
a pattern), you describe the edit in a blockquote and the
|
|
166
|
+
tester applies it in their own editor. The pedagogical point
|
|
167
|
+
is that those files belong to the user — they need to
|
|
168
|
+
internalise where they live and how to change them. Doing it
|
|
169
|
+
for them in a teach moment defeats the lesson.
|
|
170
|
+
3. **After every command block, stop and wait.** The tester pastes
|
|
153
171
|
the output or replies "OK" / "done". Only then do you advance.
|
|
154
|
-
|
|
172
|
+
4. **Persist progress after every step.** Update
|
|
155
173
|
`tutorial-state.yml` with `done` / `failed` / `skipped` and a
|
|
156
174
|
timestamp.
|
|
157
|
-
|
|
175
|
+
5. **If the tester reports anything weird**, offer to record it in
|
|
158
176
|
`findings.md` (in the cwd). Those are the bugs the team will read.
|
|
159
|
-
|
|
177
|
+
6. **One step at a time.** Finish, ask if they want to continue, do
|
|
160
178
|
the next one.
|
|
161
|
-
|
|
179
|
+
7. **If `tutorial-state.yml` already exists in the cwd** when invoked,
|
|
162
180
|
do not overwrite anything. Read it, show progress, offer to
|
|
163
181
|
*continue* or *start over* (the latter requires explicit
|
|
164
182
|
confirmation and wipes the tutorial content).
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
183
|
+
8. **Mirror the tester's language** per §Tone. Internal narration
|
|
184
|
+
and code-block fences stay English regardless.
|
|
185
|
+
9. **Never modify files outside the tutorial cwd.** Stay scoped to
|
|
186
|
+
the directory verified in pre-flight.
|
|
187
|
+
10. **Never ask the tester to `cd` outside the tutorial cwd.** All
|
|
188
|
+
command blocks assume the second terminal is anchored to the
|
|
189
|
+
tutorial folder.
|
|
190
|
+
11. **Never skip the level question when entering the deep-dive.**
|
|
191
|
+
The level drives modulation of every Step 8+ instruction.
|
|
192
|
+
|
|
193
|
+
## Provider detection
|
|
194
|
+
|
|
195
|
+
Skill-map ships with three built-in providers, each one walks its
|
|
196
|
+
own on-disk convention:
|
|
197
|
+
|
|
198
|
+
| Provider | Base dir | Kinds it claims | Detect via env var(s) |
|
|
199
|
+
|----------------|-----------------------|--------------------------------|------------------------------------------------|
|
|
200
|
+
| `claude` | `.claude/` | `agent`, `command`, `skill` | `CLAUDECODE=1` OR `AI_AGENT` starts with `claude-code` |
|
|
201
|
+
| `gemini` | `.gemini/` | `agent`, `skill` | `GEMINI_CLI=1` OR `AI_AGENT` starts with `gemini` (any equivalent vendor var) |
|
|
202
|
+
| `agent-skills` | `.agents/skills/` | `skill` only (vendor-neutral) | no formal env yet; treat as opt-in if the tester says so |
|
|
203
|
+
|
|
204
|
+
**Decision logic, applied silently during pre-flight**:
|
|
205
|
+
|
|
206
|
+
1. Inspect the agent's environment (`process.env` in your runtime).
|
|
207
|
+
2. If a Claude-flavoured var is present → `provider = claude`,
|
|
208
|
+
`<provider_dir> = .claude`, supported kinds = `{agent, command,
|
|
209
|
+
skill}`.
|
|
210
|
+
3. Else if a Gemini-flavoured var is present → `provider = gemini`,
|
|
211
|
+
`<provider_dir> = .gemini`, supported kinds = `{agent, skill}`.
|
|
212
|
+
4. Else → **fallback to claude** AND surface one short blockquote
|
|
213
|
+
to the tester so they can correct course:
|
|
214
|
+
|
|
215
|
+
> Heads up: I couldn't detect which agent runtime is hosting
|
|
216
|
+
> me, so I'll demo skill-map's Claude provider (`.claude/`).
|
|
217
|
+
> If you actually use Gemini or agent-skills, tell me and I
|
|
218
|
+
> swap the fixture to `.gemini/` or `.agents/skills/`.
|
|
219
|
+
|
|
220
|
+
**Reality check (do not mention to the tester unless asked)**:
|
|
221
|
+
this SKILL.md lives at `.claude/skills/sm-tutorial/SKILL.md`, so
|
|
222
|
+
in practice only Claude Code loads it today. The detection logic
|
|
223
|
+
is wired so that the day mirrored skills land at
|
|
224
|
+
`.gemini/skills/sm-tutorial/` and `.agents/skills/sm-tutorial/`,
|
|
225
|
+
they reuse this same body and the fixture follows automatically.
|
|
226
|
+
|
|
227
|
+
### Global substitution rule
|
|
228
|
+
|
|
229
|
+
The rest of this file says `.claude/<…>` as the canonical example
|
|
230
|
+
because that is the 100% case today. **Wherever you see
|
|
231
|
+
`.claude/`, swap it for the detected `<provider_dir>` when writing
|
|
232
|
+
the fixture, when showing the tester commands, when computing the
|
|
233
|
+
expected node count, and when listing files for the start-over
|
|
234
|
+
wipe.** Also: **skip any sub-step whose kind is not in the
|
|
235
|
+
provider's supported set** (e.g. on `gemini`, skip the
|
|
236
|
+
`demo-command` file in Step 3 and the `demo-command → demo-skill`
|
|
237
|
+
connector in Step 5; on `agent-skills`, skip both `demo-agent`
|
|
238
|
+
and `demo-command` and demo only the skill + the markdown note).
|
|
239
|
+
|
|
240
|
+
Persist `provider` into `tutorial-state.yml` (top-level
|
|
241
|
+
`provider: <id>` field) so a resumed session does not have to
|
|
242
|
+
re-detect.
|
|
174
243
|
|
|
175
244
|
## Pre-flight
|
|
176
245
|
|
|
@@ -192,6 +261,9 @@ ls -A
|
|
|
192
261
|
user content — they're internal infrastructure of the skill itself):
|
|
193
262
|
|
|
194
263
|
- `.claude` — skills/agents infrastructure.
|
|
264
|
+
- `.tmp` — Claude Code scratch directory; created automatically
|
|
265
|
+
when the harness starts, has nothing to do with the tester.
|
|
266
|
+
Ignore whether it exists or not.
|
|
195
267
|
- `SKILL.md` — a loose copy of the skill.
|
|
196
268
|
- `sm-tutorial.md` — the skill copy materialised by `sm tutorial`.
|
|
197
269
|
- `tutorial-state.yml` — resume mode (see §Resume / restart).
|
|
@@ -301,17 +373,17 @@ later when they're relevant. Keep it to a single short sentence:
|
|
|
301
373
|
|
|
302
374
|
> Quick heads-up before we start: I'm about to set up the
|
|
303
375
|
> tutorial scenario in this directory — that means creating a
|
|
304
|
-
> handful of files.
|
|
376
|
+
> handful of files. Please wait a moment while I finish.
|
|
305
377
|
|
|
306
378
|
Then proceed straight to the writes below — no pause, no "ready?"
|
|
307
379
|
prompt.
|
|
308
380
|
|
|
309
|
-
The tutorial builds the graph **progressively**
|
|
310
|
-
|
|
311
|
-
file** — a single agent — so the tester's first look at the
|
|
312
|
-
shows exactly one node. The other
|
|
313
|
-
note) and the connectors between all
|
|
314
|
-
|
|
381
|
+
The tutorial builds the graph **progressively** across Steps 2-6
|
|
382
|
+
(the live UI block). Right now, in pre-flight, you only create
|
|
383
|
+
**one file** — a single agent — so the tester's first look at the
|
|
384
|
+
UI shows exactly one node. The other three nodes (skill, command,
|
|
385
|
+
note) and the connectors between all four are added later, one
|
|
386
|
+
step at a time.
|
|
315
387
|
|
|
316
388
|
```
|
|
317
389
|
<cwd>/
|
|
@@ -323,7 +395,7 @@ sub-step at a time.
|
|
|
323
395
|
```
|
|
324
396
|
|
|
325
397
|
`.claude/agents/demo-agent.md` (no cross-fixture links yet — those
|
|
326
|
-
arrive in Step
|
|
398
|
+
arrive in Step 5):
|
|
327
399
|
```markdown
|
|
328
400
|
---
|
|
329
401
|
name: demo-agent
|
|
@@ -333,8 +405,6 @@ description: |
|
|
|
333
405
|
Live UI step.
|
|
334
406
|
tools: [Read, Bash]
|
|
335
407
|
model: sonnet
|
|
336
|
-
metadata:
|
|
337
|
-
version: "1.0.0"
|
|
338
408
|
---
|
|
339
409
|
|
|
340
410
|
# demo-agent
|
|
@@ -369,6 +439,7 @@ tutorial:
|
|
|
369
439
|
started_at: "<ISO-8601 now>"
|
|
370
440
|
cwd: "<output of pwd>"
|
|
371
441
|
sm_version: "<output of sm version>"
|
|
442
|
+
provider: "<claude | gemini | agent-skills>" # filled from §Provider detection
|
|
372
443
|
tester:
|
|
373
444
|
level: 2 # default; only asked if they advance into the deep-dive
|
|
374
445
|
route:
|
|
@@ -384,36 +455,48 @@ short_steps:
|
|
|
384
455
|
- id: "1-init"
|
|
385
456
|
title: "sm init"
|
|
386
457
|
status: "pending"
|
|
387
|
-
- id: "2-
|
|
388
|
-
title: "⭐ Live UI:
|
|
458
|
+
- id: "2-live-boot"
|
|
459
|
+
title: "⭐ Live UI: the lone agent"
|
|
460
|
+
status: "pending"
|
|
461
|
+
- id: "3-live-kinds"
|
|
462
|
+
title: "⭐ Live UI: the other three kinds appear"
|
|
389
463
|
status: "pending"
|
|
390
|
-
- id: "
|
|
464
|
+
- id: "4-live-edit"
|
|
465
|
+
title: "⭐ Live UI: your first edit"
|
|
466
|
+
status: "pending"
|
|
467
|
+
- id: "5-live-connectors"
|
|
468
|
+
title: "⭐ Live UI: the connectors light up"
|
|
469
|
+
status: "pending"
|
|
470
|
+
- id: "6-live-ignore"
|
|
471
|
+
title: "⭐ Live UI: silence via .skillmapignore"
|
|
472
|
+
status: "pending"
|
|
473
|
+
- id: "7-handoff"
|
|
391
474
|
title: "Wrap-up of the demo and offer to keep going"
|
|
392
475
|
status: "pending"
|
|
393
476
|
long_steps:
|
|
394
|
-
- id: "
|
|
477
|
+
- id: "8-tester-edits"
|
|
395
478
|
title: "Tester edits live (extends the UI demo)"
|
|
396
479
|
status: "pending"
|
|
397
|
-
- id: "
|
|
480
|
+
- id: "9-cli-browse"
|
|
398
481
|
title: "Browse CLI: list / show / check"
|
|
399
482
|
status: "pending"
|
|
400
483
|
verbs: ["sm list", "sm show", "sm check"]
|
|
401
|
-
- id: "
|
|
484
|
+
- id: "10-ascii"
|
|
402
485
|
title: "ASCII: graph + export"
|
|
403
486
|
status: "pending"
|
|
404
487
|
verbs: ["sm graph", "sm export"]
|
|
405
|
-
- id: "
|
|
488
|
+
- id: "11-issues"
|
|
406
489
|
title: "Issues: broken refs"
|
|
407
490
|
status: "pending"
|
|
408
491
|
verbs: ["sm check", "sm check --analyzers broken-ref",
|
|
409
492
|
"sm check --json"]
|
|
410
|
-
- id: "
|
|
493
|
+
- id: "12-plugins"
|
|
411
494
|
title: "Plugins"
|
|
412
495
|
status: "pending"
|
|
413
496
|
verbs: ["sm plugins list", "sm plugins show",
|
|
414
497
|
"sm plugins doctor", "sm plugins enable",
|
|
415
498
|
"sm plugins disable"]
|
|
416
|
-
- id: "
|
|
499
|
+
- id: "13-annotations"
|
|
417
500
|
title: "Annotations and the .sm consent prompt"
|
|
418
501
|
status: "pending"
|
|
419
502
|
verbs: ["sm sidecar annotate"]
|
|
@@ -422,6 +505,14 @@ findings_file: "./findings.md"
|
|
|
422
505
|
|
|
423
506
|
## Per-step cycle
|
|
424
507
|
|
|
508
|
+
Before Step 1's announcement, call `TaskCreate` once with one task
|
|
509
|
+
per entry in `tutorial-state.yml` (`short_steps`, plus `long_steps`
|
|
510
|
+
if the deep-dive is accepted later). Update each task to
|
|
511
|
+
`in_progress` when its block begins and `completed` when it ends —
|
|
512
|
+
the harness task list gives the tester a live "where am I" view
|
|
513
|
+
during the session, while `tutorial-state.yml` remains the
|
|
514
|
+
cross-session source of truth for pause/resume.
|
|
515
|
+
|
|
425
516
|
For every step in the tutorial:
|
|
426
517
|
|
|
427
518
|
1. **Announcement**: "Step N: `<title>`. ~M minutes." One sentence
|
|
@@ -478,32 +569,14 @@ dump.sql
|
|
|
478
569
|
|
|
479
570
|
Mark `1-init: done`.
|
|
480
571
|
|
|
481
|
-
### Step 2 — ⭐ Live UI (
|
|
572
|
+
### Step 2 — ⭐ Live UI: the lone agent (~1 min)
|
|
482
573
|
|
|
483
574
|
**Context**: typing `sm` alone (no arguments) in an initialised dir
|
|
484
575
|
starts the UI server with the watcher built in. One process, one
|
|
485
576
|
terminal: it boots the server, scans the `.md` files, detects
|
|
486
|
-
changes, and pushes events over WebSocket to the live UI.
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
by you editing files while the server stays up — except Step 2.3,
|
|
490
|
-
where the tester takes the keyboard for the first time.
|
|
491
|
-
|
|
492
|
-
1. **Step 2.1 (boot)** — one node alone (the agent).
|
|
493
|
-
2. **Step 2.2 (kinds)** — the four other kinds appear as new nodes,
|
|
494
|
-
still unconnected.
|
|
495
|
-
3. **Step 2.3 (your first edit)** — the **tester** edits the
|
|
496
|
-
`description` of the agent's `.md` and watches the card
|
|
497
|
-
refresh in the graph.
|
|
498
|
-
4. **Step 2.4 (connectors)** — the connectors light up between all
|
|
499
|
-
five nodes.
|
|
500
|
-
5. **Step 2.5 (ignore)** — a private file appears, then disappears
|
|
501
|
-
the moment a pattern is added to `.skillmapignore`.
|
|
502
|
-
|
|
503
|
-
The pedagogical arc: a single dot → a constellation of dots →
|
|
504
|
-
your own edit lands → graph → a graph that respects the user's
|
|
505
|
-
ignore list. Each sub-step stops at a confirm prompt before you do
|
|
506
|
-
the next.
|
|
577
|
+
changes, and pushes events over WebSocket to the live UI. The next
|
|
578
|
+
five steps (2-6) all run against the same `sm` session — you boot
|
|
579
|
+
it here and keep it alive through Step 6.
|
|
507
580
|
|
|
508
581
|
**Command** (one terminal):
|
|
509
582
|
|
|
@@ -511,8 +584,8 @@ the next.
|
|
|
511
584
|
sm
|
|
512
585
|
```
|
|
513
586
|
|
|
514
|
-
Before
|
|
515
|
-
they can watch the magic happen without alt-tabbing every
|
|
587
|
+
Before launching, ask the tester to set up a **side-by-side view** so
|
|
588
|
+
they can watch the magic happen without alt-tabbing every step.
|
|
516
589
|
Tell the tester:
|
|
517
590
|
|
|
518
591
|
> Now arrange your screen so the **browser** (where the graph will
|
|
@@ -534,11 +607,7 @@ truth (it logs the bound `http://host:port` after listen):
|
|
|
534
607
|
> UI is listening — copy that link and open it in the browser you
|
|
535
608
|
> just arranged. Tell me when you see the page load.
|
|
536
609
|
|
|
537
|
-
Wait for confirmation that the page loaded.
|
|
538
|
-
|
|
539
|
-
#### Step 2.1 — the lone agent
|
|
540
|
-
|
|
541
|
-
Tell the tester:
|
|
610
|
+
Wait for confirmation that the page loaded. Then tell the tester:
|
|
542
611
|
|
|
543
612
|
> You'll see exactly **one node** in the graph: `demo-agent` (kind
|
|
544
613
|
> `agent`). That's our starting point.
|
|
@@ -552,16 +621,22 @@ Tell the tester:
|
|
|
552
621
|
>
|
|
553
622
|
> Did the node show up?
|
|
554
623
|
|
|
555
|
-
Wait for confirmation.
|
|
624
|
+
Wait for confirmation. Mark `2-live-boot: done`.
|
|
556
625
|
|
|
557
|
-
|
|
626
|
+
### Step 3 — Live UI: the other three kinds appear (~1 min)
|
|
558
627
|
|
|
559
628
|
Leave the browser open and the terminal with `sm` running. You
|
|
560
|
-
create
|
|
561
|
-
yet — pure standalone nodes — so the tester sees
|
|
629
|
+
create three more nodes **without any cross-fixture links**
|
|
630
|
+
yet — pure standalone nodes — so the tester sees three new dots pop
|
|
562
631
|
in.
|
|
563
632
|
|
|
564
|
-
Create these
|
|
633
|
+
Create these three files (with `Write`), exactly in this order.
|
|
634
|
+
Per §Provider detection, **substitute `.claude/` with the
|
|
635
|
+
detected `<provider_dir>` and skip files whose kind is not in the
|
|
636
|
+
provider's supported set** (`gemini`: skip `demo-command`;
|
|
637
|
+
`agent-skills`: skip both `demo-agent` and `demo-command`, only
|
|
638
|
+
the skill + the markdown note remain). Adjust the node count and
|
|
639
|
+
the "three new nodes" message in the blockquote below accordingly:
|
|
565
640
|
|
|
566
641
|
1. `.claude/skills/demo-skill/SKILL.md` (kind: skill):
|
|
567
642
|
```markdown
|
|
@@ -579,8 +654,6 @@ Create these four files (with `Write`), exactly in this order:
|
|
|
579
654
|
- name: report
|
|
580
655
|
type: string
|
|
581
656
|
description: Markdown summary.
|
|
582
|
-
metadata:
|
|
583
|
-
version: "1.0.0"
|
|
584
657
|
---
|
|
585
658
|
|
|
586
659
|
# demo-skill
|
|
@@ -607,8 +680,6 @@ Create these four files (with `Write`), exactly in this order:
|
|
|
607
680
|
type: path
|
|
608
681
|
description: File the command will hand off to the skill.
|
|
609
682
|
required: true
|
|
610
|
-
metadata:
|
|
611
|
-
version: "1.0.0"
|
|
612
683
|
---
|
|
613
684
|
|
|
614
685
|
# demo-command
|
|
@@ -617,44 +688,16 @@ Create these four files (with `Write`), exactly in this order:
|
|
|
617
688
|
target file. Connectors land in the next sub-step.
|
|
618
689
|
```
|
|
619
690
|
|
|
620
|
-
3.
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
(the catch-all kind for `.md` files outside the
|
|
624
|
-
skill / agent / command folders); a dedicated `hook` kind
|
|
625
|
-
is on the roadmap:
|
|
626
|
-
```markdown
|
|
627
|
-
---
|
|
628
|
-
name: demo-hook
|
|
629
|
-
description: |
|
|
630
|
-
Example hook that fires when a subagent stops. Showcases the
|
|
631
|
-
`hook` kind in the demo graph.
|
|
632
|
-
event: SubagentStop
|
|
633
|
-
blocking: false
|
|
634
|
-
idempotent: true
|
|
635
|
-
metadata:
|
|
636
|
-
version: "1.0.0"
|
|
637
|
-
---
|
|
638
|
-
|
|
639
|
-
# demo-hook
|
|
640
|
-
|
|
641
|
-
Fires when a subagent terminates. Records the closure. Will get
|
|
642
|
-
wired into the rest of the fixture next.
|
|
643
|
-
```
|
|
644
|
-
|
|
645
|
-
4. `notes/todo.md` — also classified as `kind: markdown` today
|
|
646
|
-
(same catch-all as the hook above; a dedicated `note` kind
|
|
647
|
-
is on the roadmap):
|
|
691
|
+
3. `notes/todo.md` — classified as `kind: markdown` today
|
|
692
|
+
(the catch-all for `.md` files outside the
|
|
693
|
+
skill / agent / command folders):
|
|
648
694
|
```markdown
|
|
649
695
|
---
|
|
650
696
|
name: Demo TODO list
|
|
651
697
|
description: |
|
|
652
698
|
Live list of things to review in the demo. Will become the
|
|
653
|
-
hub between skill / agent / command
|
|
654
|
-
sub-step.
|
|
699
|
+
hub between skill / agent / command in the next sub-step.
|
|
655
700
|
tags: [notes, demo]
|
|
656
|
-
metadata:
|
|
657
|
-
version: "1.0.0"
|
|
658
701
|
---
|
|
659
702
|
|
|
660
703
|
# Pending
|
|
@@ -662,23 +705,23 @@ Create these four files (with `Write`), exactly in this order:
|
|
|
662
705
|
|
|
663
706
|
Tell the tester:
|
|
664
707
|
|
|
665
|
-
> Look at the browser.
|
|
666
|
-
> `demo-skill`, `demo-command`, `
|
|
667
|
-
>
|
|
668
|
-
>
|
|
669
|
-
>
|
|
708
|
+
> Look at the browser. Three new nodes should have popped in:
|
|
709
|
+
> `demo-skill`, `demo-command`, and `notes/todo`. Four total now,
|
|
710
|
+
> **still unconnected** — they're floating dots. The viewport
|
|
711
|
+
> auto-fits whenever a node is added or removed, so all four
|
|
712
|
+
> should be visible without panning.
|
|
670
713
|
>
|
|
671
|
-
> Did the
|
|
714
|
+
> Did the three appear? Confirm so we can wire them up.
|
|
672
715
|
|
|
673
|
-
Wait for confirmation.
|
|
716
|
+
Wait for confirmation. Mark `3-live-kinds: done`.
|
|
674
717
|
|
|
675
|
-
|
|
718
|
+
### Step 4 — Live UI: your first edit (~1 min)
|
|
676
719
|
|
|
677
720
|
Up to here you've been watching the agent write files. Now hand
|
|
678
721
|
the keyboard over: the lesson is that the watcher reacts to
|
|
679
722
|
**any** `.md` edit under the cwd, not just to files the agent
|
|
680
723
|
authors. After this beat, the tester has the muscle memory for
|
|
681
|
-
"save → graph updates", which Step
|
|
724
|
+
"save → graph updates", which Step 6 (`.skillmapignore`) reuses
|
|
682
725
|
verbatim.
|
|
683
726
|
|
|
684
727
|
Tell the tester:
|
|
@@ -697,85 +740,74 @@ Tell the tester:
|
|
|
697
740
|
>
|
|
698
741
|
> Watch the browser. The `demo-agent` card should refresh its
|
|
699
742
|
> description in real time, no reload, no Ctrl+C — same watcher
|
|
700
|
-
> that picked up the
|
|
743
|
+
> that picked up the three new nodes a moment ago, this time
|
|
701
744
|
> reacting to YOUR edit.
|
|
702
745
|
>
|
|
703
|
-
> Confirm so we wire the
|
|
746
|
+
> Confirm so we wire the four up.
|
|
704
747
|
|
|
705
748
|
Wait for confirmation. You MAY use `Read` on the file afterwards
|
|
706
749
|
to verify the change landed (read-only, allowed under Inviolable
|
|
707
|
-
rule #1) before moving on.
|
|
750
|
+
rule #1) before moving on. Mark `4-live-edit: done`.
|
|
708
751
|
|
|
709
|
-
|
|
752
|
+
### Step 5 — Live UI: the connectors light up (~1 min)
|
|
710
753
|
|
|
711
754
|
Now you edit the existing files to add the cross-fixture links —
|
|
712
755
|
each one becomes a connector in the graph. Apply with `Edit` (do
|
|
713
|
-
not rewrite the files)
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
2. **Edit `.claude/skills/demo-skill/SKILL.md`** — append at the
|
|
756
|
+
not rewrite the files). Per §Provider detection, **swap `.claude/`
|
|
757
|
+
for the detected `<provider_dir>` and skip any sub-step whose
|
|
758
|
+
target node was not created in Step 3** (no `demo-command` on
|
|
759
|
+
gemini → skip sub-step #2 and the `demo-command → demo-skill`
|
|
760
|
+
connector; on agent-skills there is no agent and no command →
|
|
761
|
+
keep only `notes/todo → demo-skill`):
|
|
762
|
+
|
|
763
|
+
1. **Edit `.claude/skills/demo-skill/SKILL.md`** — append at the
|
|
722
764
|
very end:
|
|
723
765
|
```markdown
|
|
724
766
|
When it needs to delegate heavier work it leans on the
|
|
725
767
|
[demo-agent](../../agents/demo-agent.md).
|
|
726
768
|
```
|
|
727
|
-
|
|
769
|
+
2. **Edit `.claude/commands/demo-command.md`** — append at the
|
|
728
770
|
very end:
|
|
729
771
|
```markdown
|
|
730
772
|
Triggers the [demo-skill](../skills/demo-skill/SKILL.md) on the
|
|
731
773
|
given target.
|
|
732
774
|
```
|
|
733
|
-
|
|
734
|
-
```markdown
|
|
735
|
-
See [pending items](../../notes/todo.md) for operational
|
|
736
|
-
context.
|
|
737
|
-
```
|
|
738
|
-
5. **Edit `notes/todo.md`** — append these two bullets after the
|
|
775
|
+
3. **Edit `notes/todo.md`** — append this bullet after the
|
|
739
776
|
`# Pending` heading:
|
|
740
777
|
```markdown
|
|
741
778
|
- [ ] Polish the
|
|
742
779
|
[demo-skill](../.claude/skills/demo-skill/SKILL.md)
|
|
743
780
|
prompt.
|
|
744
|
-
- [ ] Confirm the `event` of the
|
|
745
|
-
[demo-hook](../.claude/hooks/demo-hook.md).
|
|
746
781
|
```
|
|
747
782
|
|
|
748
783
|
Tell the tester:
|
|
749
784
|
|
|
750
|
-
> Look at the magic again. The
|
|
785
|
+
> Look at the magic again. The four floating nodes should now be
|
|
751
786
|
> wired together — connectors light
|
|
752
787
|
> up between them as the watcher picks up each edit:
|
|
753
788
|
>
|
|
754
789
|
> - `demo-skill → demo-agent`
|
|
755
|
-
> - `demo-agent → demo-hook`
|
|
756
790
|
> - `demo-command → demo-skill`
|
|
757
|
-
> - `
|
|
758
|
-
> - `notes/todo → demo-skill`, `notes/todo → demo-hook`
|
|
791
|
+
> - `notes/todo → demo-skill`
|
|
759
792
|
>
|
|
760
793
|
> Confirm. If a connector is missing, refresh the browser and tell
|
|
761
794
|
> me.
|
|
762
795
|
|
|
763
|
-
Wait for confirmation. **Do NOT move on to Step
|
|
764
|
-
connectors are confirmed visible — Step
|
|
765
|
-
session.
|
|
796
|
+
Wait for confirmation. **Do NOT move on to Step 6** until the
|
|
797
|
+
connectors are confirmed visible — Step 6 reuses the same live UI
|
|
798
|
+
session. Mark `5-live-connectors: done`.
|
|
766
799
|
|
|
767
|
-
|
|
800
|
+
### Step 6 — Live UI: silence a private file via `.skillmapignore` (~2 min)
|
|
768
801
|
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
single line in `.skillmapignore`. Same live mechanism — no restart.
|
|
802
|
+
Steps 2-5 showed the watcher picking up new files and edits (yours
|
|
803
|
+
and theirs). Step 6 flips the direction: a file the tester DOES NOT
|
|
804
|
+
want in the graph (a draft, a scratch file, a secret) gets hidden by
|
|
805
|
+
a single line in `.skillmapignore`. Same live mechanism — no restart.
|
|
774
806
|
|
|
775
807
|
`sm init` already wrote a starter `.skillmapignore` at the scope
|
|
776
|
-
root. The flow has three
|
|
808
|
+
root. The flow has three beats:
|
|
777
809
|
|
|
778
|
-
**
|
|
810
|
+
**Beat 1 — you create one new fixture file (the agent does this).**
|
|
779
811
|
|
|
780
812
|
`Write` `notes/private-credentials.md` — kind `note`, simulates a
|
|
781
813
|
file the tester would never want surfacing publicly:
|
|
@@ -787,8 +819,6 @@ description: |
|
|
|
787
819
|
Personal API tokens — exists in the repo but should not show
|
|
788
820
|
up in the skill-map graph. Demonstrates the .skillmapignore
|
|
789
821
|
flow.
|
|
790
|
-
metadata:
|
|
791
|
-
version: "0.0.1"
|
|
792
822
|
---
|
|
793
823
|
|
|
794
824
|
# Private
|
|
@@ -800,7 +830,7 @@ Confirm the file appears in the graph as a sixth node
|
|
|
800
830
|
(`notes/private-credentials`). The watcher sees it like any
|
|
801
831
|
other `.md` — that's the point of the demo.
|
|
802
832
|
|
|
803
|
-
**
|
|
833
|
+
**Beat 2 — you show the project structure (the agent does this).**
|
|
804
834
|
|
|
805
835
|
Before asking the tester to touch `.skillmapignore`, give them a
|
|
806
836
|
mental map of the folder so they know where the file lives and
|
|
@@ -815,7 +845,6 @@ the tester sees what their cwd holds:
|
|
|
815
845
|
> ├── .claude/
|
|
816
846
|
> │ ├── agents/demo-agent.md
|
|
817
847
|
> │ ├── commands/demo-command.md
|
|
818
|
-
> │ ├── hooks/demo-hook.md
|
|
819
848
|
> │ └── skills/demo-skill/SKILL.md
|
|
820
849
|
> ├── .skill-map/ ← project DB + settings (managed)
|
|
821
850
|
> ├── .skillmapignore ← the file we're about to edit
|
|
@@ -833,9 +862,9 @@ Adjust the actual tree shown to whatever `ls -la` returns — the
|
|
|
833
862
|
goal is "tester recognises their own filesystem", not a copy of
|
|
834
863
|
the snippet above.
|
|
835
864
|
|
|
836
|
-
**
|
|
865
|
+
**Beat 3 — the tester edits `.skillmapignore` (NOT the agent).**
|
|
837
866
|
|
|
838
|
-
Per Inviolable rule #
|
|
867
|
+
Per Inviolable rule #2, the agent does NOT touch `.skillmapignore` with
|
|
839
868
|
your `Edit` tool. Tell the tester to do it from their editor:
|
|
840
869
|
|
|
841
870
|
> Last step. Open `.skillmapignore` (it's at the cwd root) in
|
|
@@ -854,8 +883,8 @@ your `Edit` tool. Tell the tester to do it from their editor:
|
|
|
854
883
|
>
|
|
855
884
|
> Watch the browser when you save. The
|
|
856
885
|
> `notes/private-credentials` node should disappear from the
|
|
857
|
-
> graph in real time, without restarting anything.
|
|
858
|
-
> back to
|
|
886
|
+
> graph in real time, without restarting anything. Five nodes
|
|
887
|
+
> back to four.
|
|
859
888
|
>
|
|
860
889
|
> Did the node vanish?
|
|
861
890
|
|
|
@@ -865,20 +894,32 @@ verify the appended pattern landed correctly (in case
|
|
|
865
894
|
allowed. Once confirmed, ask them to stop the server with
|
|
866
895
|
**Ctrl+C** in the terminal before continuing.
|
|
867
896
|
|
|
868
|
-
Mark `
|
|
897
|
+
Mark `6-live-ignore: done`.
|
|
869
898
|
|
|
870
|
-
### Step
|
|
899
|
+
### Step 7 — Wrap-up of the demo and offer to keep going (30 s)
|
|
871
900
|
|
|
872
901
|
> All set! That's the heart of skill-map: you edit a `.md` and the
|
|
873
902
|
> UI sees it instantly. In **~10 minutes** you've already seen the
|
|
874
903
|
> full flow.
|
|
875
904
|
>
|
|
876
|
-
> ⚠️ **`.sm` files (heads-up for later)** —
|
|
877
|
-
>
|
|
878
|
-
>
|
|
879
|
-
>
|
|
880
|
-
>
|
|
881
|
-
>
|
|
905
|
+
> ⚠️ **`.sm` files (heads-up for later)** — every `.md` skill-map
|
|
906
|
+
> tracks has a sibling `.sm` file (e.g. `demo-agent.sm` next to
|
|
907
|
+
> `demo-agent.md`) that carries **all of the tool's metadata
|
|
908
|
+
> about that markdown, so your `.md` stays clean and uncluttered**.
|
|
909
|
+
> Version, history, tags, annotations, anything that does not
|
|
910
|
+
> belong in the human-authored body lives in the `.sm`. You write
|
|
911
|
+
> the `.md` for Claude or for humans, the tool writes the `.sm`.
|
|
912
|
+
> Each `sm bump` and each `sm sidecar annotate` creates or
|
|
913
|
+
> refreshes one, so you'll see them often as you use skill-map
|
|
914
|
+
> day to day. Commit them to git like any other source file.
|
|
915
|
+
>
|
|
916
|
+
> 🔀 **Multi-provider** — this demo ran with the
|
|
917
|
+
> `<provider>` provider (base dir `<provider_dir>`). Skill-map
|
|
918
|
+
> walks two other built-in conventions with identical mechanics:
|
|
919
|
+
> Gemini lives under `.gemini/` (kinds: agent + skill), and the
|
|
920
|
+
> open agent-skills standard lives under `.agents/skills/` (kind:
|
|
921
|
+
> skill). Drop a `.md` in any of those and the same watcher
|
|
922
|
+
> picks it up, the same connectors light up, the same rules run.
|
|
882
923
|
>
|
|
883
924
|
> If you want, **we can keep going deeper**: I'll walk you through
|
|
884
925
|
> the CLI verbs and flags (`list`, `graph`, `export`, `orphans`,
|
|
@@ -923,10 +964,12 @@ Save into `tester.level` and modulate:
|
|
|
923
964
|
- **Level 3**: dense blocks, flags included, no explanations of
|
|
924
965
|
basic concepts.
|
|
925
966
|
|
|
926
|
-
### Step
|
|
967
|
+
### Step 8 — Tester edits live (~3 min)
|
|
927
968
|
|
|
928
|
-
**Context**:
|
|
929
|
-
|
|
969
|
+
**Context**: Step 4 had the tester edit a scalar (`description`)
|
|
970
|
+
and watch the inspector card refresh. Step 8 raises the bar: edit
|
|
971
|
+
a Markdown link and watch the GRAPH TOPOLOGY change (a connector
|
|
972
|
+
disappears). Same watcher, different surface.
|
|
930
973
|
|
|
931
974
|
This step needs the server running. **Check first** before asking
|
|
932
975
|
them to launch it: many testers leave it running from Step 2 and
|
|
@@ -947,7 +990,7 @@ You verify by reading `.claude/skills/demo-skill/SKILL.md` to confirm
|
|
|
947
990
|
the change was applied. Once they confirm, ask them to **Ctrl+C**
|
|
948
991
|
the server.
|
|
949
992
|
|
|
950
|
-
### Step
|
|
993
|
+
### Step 9 — Browse CLI: list / show / check (~3 min)
|
|
951
994
|
|
|
952
995
|
```bash
|
|
953
996
|
sm list
|
|
@@ -958,17 +1001,16 @@ sm show .claude/skills/demo-skill/SKILL.md
|
|
|
958
1001
|
sm check
|
|
959
1002
|
```
|
|
960
1003
|
|
|
961
|
-
Expected: you see the
|
|
1004
|
+
Expected: you see the 4 fixture nodes listed with their kind:
|
|
962
1005
|
`demo-skill` (skill), `demo-agent` (agent), `demo-command`
|
|
963
|
-
(command), and `
|
|
964
|
-
|
|
1006
|
+
(command), and `notes/todo` (`markdown`, the catch-all per
|
|
1007
|
+
Step 3). `check` reads the persisted
|
|
965
1008
|
`scan_issues` table — it does NOT re-walk the filesystem. The
|
|
966
|
-
fixture is clean (
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
`sm scan`.
|
|
1009
|
+
fixture is clean (Steps 2-6 captured the latest state before
|
|
1010
|
+
Ctrl+C), so the verb prints `✓ No issues`. We will plant one in
|
|
1011
|
+
Step 11 and watch the rule catch it after a fresh `sm scan`.
|
|
970
1012
|
|
|
971
|
-
### Step
|
|
1013
|
+
### Step 10 — ASCII: graph + export (~3 min)
|
|
972
1014
|
|
|
973
1015
|
```bash
|
|
974
1016
|
sm graph
|
|
@@ -986,7 +1028,7 @@ within a key, AND across keys) and a `--format` of `md` or
|
|
|
986
1028
|
segment, `**` spans segments) so `path=notes/**` cleanly
|
|
987
1029
|
captures the notes folder regardless of the catch-all kind.
|
|
988
1030
|
|
|
989
|
-
### Step
|
|
1031
|
+
### Step 11 — Issues: broken refs (~3 min)
|
|
990
1032
|
|
|
991
1033
|
`broken-ref` is one of the deterministic rules `sm check` runs.
|
|
992
1034
|
We'll plant one and watch it surface — that's the easiest way to
|
|
@@ -999,13 +1041,9 @@ Ask the tester to **append one bullet** to `notes/todo.md`:
|
|
|
999
1041
|
- [ ] Document the [flow diagram](./missing-page.md).
|
|
1000
1042
|
```
|
|
1001
1043
|
|
|
1002
|
-
`./missing-page.md` deliberately doesn't exist. Save the file
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
`scan_issues` table still reflects the pre-edit state. `sm check`
|
|
1006
|
-
reads from that table without re-walking, so a bare `sm check`
|
|
1007
|
-
right now would still print `✓ No issues`. Run `sm scan` first
|
|
1008
|
-
to refresh the snapshot:
|
|
1044
|
+
`./missing-page.md` deliberately doesn't exist. Save the file,
|
|
1045
|
+
then run `sm scan` first to refresh the snapshot before
|
|
1046
|
+
checking:
|
|
1009
1047
|
|
|
1010
1048
|
```bash
|
|
1011
1049
|
sm scan
|
|
@@ -1021,70 +1059,70 @@ emits the structured payload (useful for CI / scripting). When
|
|
|
1021
1059
|
done, the tester can leave the bullet in place or delete it — the
|
|
1022
1060
|
rest of the deep-dive doesn't depend on it.
|
|
1023
1061
|
|
|
1024
|
-
|
|
1062
|
+
If the tester asks about `sm orphans` vs `sm check`, see
|
|
1063
|
+
§Scope clarifications.
|
|
1064
|
+
|
|
1065
|
+
### Step 12 — Plugins (~3 min)
|
|
1066
|
+
|
|
1067
|
+
**Context — present plugins to the tester before any command runs.**
|
|
1068
|
+
This is the official welcome to the plugin world; many testers will
|
|
1069
|
+
not have considered that skill-map is extensible at all. Frame it
|
|
1070
|
+
like this in a blockquote (translate to the tester's language per
|
|
1071
|
+
the standard rules):
|
|
1072
|
+
|
|
1073
|
+
> Plugins are how skill-map gets extended. The kernel ships with a
|
|
1074
|
+
> small set of built-in plugins out of the box, but anyone can
|
|
1075
|
+
> write their own and drop them into the project — `sm plugins
|
|
1076
|
+
> create` scaffolds a manifest and the stubs, so there is no
|
|
1077
|
+
> handwritten boilerplate to start from.
|
|
1025
1078
|
>
|
|
1026
|
-
>
|
|
1027
|
-
>
|
|
1028
|
-
> -
|
|
1029
|
-
>
|
|
1030
|
-
>
|
|
1031
|
-
>
|
|
1032
|
-
>
|
|
1079
|
+
> The kernel exposes **six** plugin types you can implement:
|
|
1080
|
+
>
|
|
1081
|
+
> - **extractors** — find links and references inside markdown.
|
|
1082
|
+
> - **analyzers** — rules that surface issues on a node.
|
|
1083
|
+
> - **actions** — verbs the user can run on a node (e.g. `bump`).
|
|
1084
|
+
> - **hooks** — fire on lifecycle events (scan started, finished,
|
|
1085
|
+
> …).
|
|
1086
|
+
> - **formatters** — render outputs in different shapes (text,
|
|
1087
|
+
> JSON, custom).
|
|
1088
|
+
> - **providers** — declare new node kinds and where to look for
|
|
1089
|
+
> them.
|
|
1090
|
+
>
|
|
1091
|
+
> Let's look at what's installed right now.
|
|
1033
1092
|
|
|
1034
|
-
|
|
1093
|
+
Then run the commands:
|
|
1035
1094
|
|
|
1036
1095
|
```bash
|
|
1037
1096
|
sm plugins list
|
|
1038
1097
|
sm plugins doctor
|
|
1039
|
-
sm plugins show core
|
|
1098
|
+
sm plugins show core
|
|
1040
1099
|
sm plugins disable core/external-url-counter
|
|
1041
1100
|
sm plugins list # confirm it shows as disabled
|
|
1042
1101
|
sm plugins enable core/external-url-counter
|
|
1043
1102
|
```
|
|
1044
1103
|
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
> (`.agents`). These are normal on a machine that has not installed
|
|
1049
|
-
> those tools — the providers declare optional discovery paths and
|
|
1050
|
-
> warn when the path is absent. Nothing is broken; the providers just
|
|
1051
|
-
> have nothing to scan.
|
|
1052
|
-
|
|
1053
|
-
> **About `sm plugins show <qualified-id>`**: the verb is
|
|
1054
|
-
> informational — passing `core/external-url-counter` validates the
|
|
1055
|
-
> extension exists and then renders the **parent bundle's** detail
|
|
1056
|
-
> (i.e. the full `core` listing). The extension you named lives in
|
|
1057
|
-
> that list. This is deliberate: forcing the user to type the bundle
|
|
1058
|
-
> id just to read a single extension's manifest would be hostile, so
|
|
1059
|
-
> `show` accepts the qualified shape and resolves up. Use
|
|
1060
|
-
> `sm plugins doctor` or scroll the bundle's extension table to spot
|
|
1061
|
-
> the one you queried.
|
|
1062
|
-
|
|
1063
|
-
> **About IDs for `disable` / `enable`**: those verbs accept either a
|
|
1064
|
-
> **bundle id** (e.g. `claude`, which toggles every Claude extension
|
|
1065
|
-
> at once) or a **qualified extension id** `<bundle>/<ext-id>` (e.g.
|
|
1066
|
-
> `core/external-url-counter`). The display format you see in
|
|
1067
|
-
> `plugins list` (`extractor:core/external-url-counter@1.0.0`)
|
|
1068
|
-
> includes the kind prefix and the version for readability — strip
|
|
1069
|
-
> both when passing the id to `disable` / `enable`. Per-extension
|
|
1070
|
-
> toggles only work on extension-granularity bundles like `core`;
|
|
1071
|
-
> the `claude` bundle is bundle-granularity and only accepts the
|
|
1072
|
-
> bundle id.
|
|
1073
|
-
|
|
1074
|
-
We pick `core/external-url-counter` because disabling it has the
|
|
1075
|
-
smallest blast radius (one extractor that doesn't run, easily
|
|
1076
|
-
re-enabled). Avoid disabling `claude` for this demo — it would kill
|
|
1077
|
-
all Claude-kind extraction during the window.
|
|
1104
|
+
If the tester asks about `plugins doctor` warnings, `plugins show`
|
|
1105
|
+
behavior, or which id format `disable` / `enable` accept, see
|
|
1106
|
+
§Scope clarifications.
|
|
1078
1107
|
|
|
1079
1108
|
If `plugins list` shows zero entries (depends on the build), tell
|
|
1080
1109
|
the tester no plugins are installed yet and offer to skip.
|
|
1081
1110
|
|
|
1082
|
-
### Step
|
|
1083
|
-
|
|
1084
|
-
**Context**: skill-map
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1111
|
+
### Step 13 — Annotations and the `.sm` consent prompt (~3 min)
|
|
1112
|
+
|
|
1113
|
+
**Context**: every `.md` skill-map tracks gets a sibling
|
|
1114
|
+
**companion file** with extension `.sm` that carries **all of
|
|
1115
|
+
the tool's metadata about that markdown, so your `.md` stays
|
|
1116
|
+
clean and uncluttered**. Version, history, tags, annotations,
|
|
1117
|
+
anything that does not belong in the human-authored body lives
|
|
1118
|
+
in the `.sm`. The `.md` is content you write for Claude or
|
|
1119
|
+
humans; the `.sm` is bookkeeping the tool writes. They are
|
|
1120
|
+
ordinary source files, committed to git like everything else,
|
|
1121
|
+
and you'll encounter them often once you start working with
|
|
1122
|
+
the project.
|
|
1123
|
+
|
|
1124
|
+
The first time skill-map wants to write one in a new project it
|
|
1125
|
+
asks for your consent — it never touches your filesystem without
|
|
1088
1126
|
permission. After you say yes, the choice persists per-checkout
|
|
1089
1127
|
(gitignored) and the prompt never appears again.
|
|
1090
1128
|
|
|
@@ -1109,26 +1147,74 @@ cat .skill-map/settings.local.json
|
|
|
1109
1147
|
|
|
1110
1148
|
**Why the prompt?** The choice is **per-user, per-project** — stored
|
|
1111
1149
|
in the gitignored `settings.local.json` so each contributor consents
|
|
1112
|
-
independently and nothing about the choice travels via the repo.
|
|
1113
|
-
|
|
1150
|
+
independently and nothing about the choice travels via the repo.
|
|
1151
|
+
Once accepted, the flag stays set and skill-map will never ask
|
|
1152
|
+
again on this checkout (the next `sm sidecar annotate` or `sm bump`
|
|
1153
|
+
goes through silently). On a CI / non-interactive session, pass
|
|
1154
|
+
`--yes` to grant up-front.
|
|
1114
1155
|
|
|
1115
|
-
|
|
1116
|
-
|
|
1156
|
+
If the tester asks about `sm bump` vs `sm sidecar annotate` vs
|
|
1157
|
+
`sm sidecar refresh`, see §Scope clarifications.
|
|
1117
1158
|
|
|
1118
|
-
|
|
1119
|
-
rm notes/todo.sm
|
|
1120
|
-
sm sidecar annotate notes/todo.md
|
|
1121
|
-
```
|
|
1122
|
-
|
|
1123
|
-
Expected: same scaffold reappears, no prompt.
|
|
1159
|
+
---
|
|
1124
1160
|
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1161
|
+
## Scope clarifications (on demand)
|
|
1162
|
+
|
|
1163
|
+
Reference material for the "mention only if the tester asks"
|
|
1164
|
+
beats in Steps 7, 8 and 9. Do NOT volunteer these unprompted —
|
|
1165
|
+
they exist so the agent has a precise answer ready when the
|
|
1166
|
+
tester pulls on the thread.
|
|
1167
|
+
|
|
1168
|
+
### `sm check` vs `sm orphans`
|
|
1169
|
+
|
|
1170
|
+
- `sm check` reports broken-refs and other rule-driven issues
|
|
1171
|
+
(the deterministic catalog).
|
|
1172
|
+
- `sm orphans` is a **different scope**: auto-rename / orphan-node
|
|
1173
|
+
detection (a node whose file disappeared, or a candidate rename
|
|
1174
|
+
the kernel is still unsure about). Our fixture doesn't produce
|
|
1175
|
+
orphans of that kind, so `sm orphans` will print "No orphan /
|
|
1176
|
+
auto-rename issues" — that's expected, not a bug.
|
|
1177
|
+
|
|
1178
|
+
### `plugins doctor` warnings on a clean fixture
|
|
1179
|
+
|
|
1180
|
+
`doctor` may emit 1-2 informational warnings about `explorationDir`
|
|
1181
|
+
not existing for `gemini/gemini` (`~/.gemini`) or
|
|
1182
|
+
`agent-skills/agent-skills` (`.agents`). These are normal on a
|
|
1183
|
+
machine that has not installed those tools — the providers declare
|
|
1184
|
+
optional discovery paths and warn when the path is absent. Nothing
|
|
1185
|
+
is broken; the providers just have nothing to scan.
|
|
1186
|
+
|
|
1187
|
+
### `sm plugins show <qualified-id>`
|
|
1188
|
+
|
|
1189
|
+
The verb is informational — passing `core/external-url-counter`
|
|
1190
|
+
validates the extension exists and then renders the **parent
|
|
1191
|
+
bundle's** detail (i.e. the full `core` listing). The extension
|
|
1192
|
+
you named lives in that list. This is deliberate: forcing the user
|
|
1193
|
+
to type the bundle id just to read a single extension's manifest
|
|
1194
|
+
would be hostile, so `show` accepts the qualified shape and
|
|
1195
|
+
resolves up. Use `sm plugins doctor` or scroll the bundle's
|
|
1196
|
+
extension table to spot the one you queried.
|
|
1197
|
+
|
|
1198
|
+
### IDs for `plugins disable` / `plugins enable`
|
|
1199
|
+
|
|
1200
|
+
Those verbs accept either a **bundle id** (e.g. `claude`, which
|
|
1201
|
+
toggles every Claude extension at once) or a **qualified extension
|
|
1202
|
+
id** `<bundle>/<ext-id>` (e.g. `core/external-url-counter`). The
|
|
1203
|
+
display format you see in `plugins list`
|
|
1204
|
+
(`extractor:core/external-url-counter@1.0.0`) includes the kind
|
|
1205
|
+
prefix and the version for readability — strip both when passing
|
|
1206
|
+
the id to `disable` / `enable`. Per-extension toggles only work on
|
|
1207
|
+
extension-granularity bundles like `core`; the `claude` bundle is
|
|
1208
|
+
bundle-granularity and only accepts the bundle id.
|
|
1209
|
+
|
|
1210
|
+
### `sm sidecar annotate` vs `sm bump` vs `sm sidecar refresh`
|
|
1211
|
+
|
|
1212
|
+
- `sm sidecar annotate` is the scaffold verb (creates a fresh
|
|
1213
|
+
`.sm`).
|
|
1214
|
+
- `sm bump <node>` is the day-to-day verb that increments the
|
|
1215
|
+
sidecar's version and refreshes its hashes — same consent gate.
|
|
1216
|
+
- `sm sidecar refresh <node>` is the hash-only update (no version
|
|
1217
|
+
bump).
|
|
1132
1218
|
|
|
1133
1219
|
---
|
|
1134
1220
|
|
|
@@ -1157,7 +1243,7 @@ template:
|
|
|
1157
1243
|
- **Depth reached**: <basic | full>
|
|
1158
1244
|
- **Tester**: level <N> (if applicable)
|
|
1159
1245
|
- **Tutorial directory**: <cwd>
|
|
1160
|
-
- **Steps completed**: N /
|
|
1246
|
+
- **Steps completed**: N / 7 demo + X / 6 deep-dive (if applicable)
|
|
1161
1247
|
- **Steps skipped**: Y (if applicable)
|
|
1162
1248
|
- **Total time**: ~<computed from timestamps>
|
|
1163
1249
|
|
|
@@ -1180,14 +1266,32 @@ Then show:
|
|
|
1180
1266
|
> <cwd>/sm-tutorial-report.md
|
|
1181
1267
|
>
|
|
1182
1268
|
> Send it to Pusher whenever you're ready (over the agreed channel).
|
|
1269
|
+
|
|
1270
|
+
If they say **2**, skip the report path and go straight to the
|
|
1271
|
+
closing block below.
|
|
1272
|
+
|
|
1273
|
+
**Always show this closing block** (regardless of the report
|
|
1274
|
+
choice — both branches converge here):
|
|
1275
|
+
|
|
1276
|
+
> One more thing before you go: there's a companion skill called
|
|
1277
|
+
> **sm-master** that picks up where this tutorial leaves off. It's
|
|
1278
|
+
> a modular deep-dive — you choose which areas to explore from a
|
|
1279
|
+
> menu — and it covers a guided tour of the built-in plugins
|
|
1280
|
+
> (extractors, analyzers, actions, hooks, formatters, providers),
|
|
1281
|
+
> plugin authoring via `sm plugins create` / `sm plugins upgrade`,
|
|
1282
|
+
> and settings + view-slots at depth. Same external-tester
|
|
1283
|
+
> audience, same pause/resume style, but a lot more ground covered.
|
|
1183
1284
|
>
|
|
1184
|
-
>
|
|
1285
|
+
> When you're ready, **invoke it from a fresh empty directory**
|
|
1286
|
+
> (same setup as this tutorial), and just say `sm-master` or
|
|
1287
|
+
> `advanced tutorial` to start.
|
|
1288
|
+
>
|
|
1289
|
+
> To delete everything THIS tutorial left behind, if the cwd was a
|
|
1185
1290
|
> dedicated dir:
|
|
1186
1291
|
>
|
|
1187
1292
|
> cd ~ && rm -rf <cwd>
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
thanks.
|
|
1293
|
+
>
|
|
1294
|
+
> Thanks for testing skill-map!
|
|
1191
1295
|
|
|
1192
1296
|
## Resume / restart
|
|
1193
1297
|
|
|
@@ -1196,9 +1300,9 @@ the cwd, start like this (do NOT repeat pre-flight from scratch):
|
|
|
1196
1300
|
|
|
1197
1301
|
> I see you already started the tutorial.
|
|
1198
1302
|
>
|
|
1199
|
-
> You're at step <N> of
|
|
1200
|
-
> (steps 1-
|
|
1201
|
-
>
|
|
1303
|
+
> You're at step <N> of 7 (or "you've already completed the demo
|
|
1304
|
+
> (steps 1-7) and you're on step <M> of 6 of the deep-dive (steps
|
|
1305
|
+
> 8-13)", depending on the yaml state).
|
|
1202
1306
|
>
|
|
1203
1307
|
> 1. **Continue** from where you left off
|
|
1204
1308
|
> 2. **Start over** — wipes all the tutorial content in this dir
|
|
@@ -1218,8 +1322,11 @@ anything**:
|
|
|
1218
1322
|
> re-invoke me from there, or delete `tutorial-state.yml` by
|
|
1219
1323
|
> hand if you really want to start fresh here.
|
|
1220
1324
|
|
|
1221
|
-
2. If the cwd matches,
|
|
1222
|
-
|
|
1325
|
+
2. If the cwd matches, read `tutorial.provider` from the yaml and
|
|
1326
|
+
use it to compute `<provider_dir>` (and the subset of files
|
|
1327
|
+
actually present, since gemini and agent-skills skip some). Then
|
|
1328
|
+
show the tester the exact list of paths you'll delete and ask
|
|
1329
|
+
for an explicit typed confirmation:
|
|
1223
1330
|
|
|
1224
1331
|
> Start over will delete these paths from `<cwd>`:
|
|
1225
1332
|
>
|
|
@@ -1228,10 +1335,9 @@ anything**:
|
|
|
1228
1335
|
> findings.md
|
|
1229
1336
|
> .skillmapignore
|
|
1230
1337
|
> .skill-map/
|
|
1231
|
-
>
|
|
1232
|
-
>
|
|
1233
|
-
>
|
|
1234
|
-
> .claude/skills/demo-skill/
|
|
1338
|
+
> <provider_dir>/agents/demo-agent.md (claude, gemini)
|
|
1339
|
+
> <provider_dir>/commands/demo-command.md (claude only)
|
|
1340
|
+
> <provider_dir>/skills/demo-skill/ (all three)
|
|
1235
1341
|
> notes/todo.md
|
|
1236
1342
|
> notes/private-credentials.md
|
|
1237
1343
|
> sm-tutorial-report.md (if present)
|
|
@@ -1242,14 +1348,19 @@ anything**:
|
|
|
1242
1348
|
> Type **`yes, wipe`** (exact text) to confirm. Anything else
|
|
1243
1349
|
> cancels.
|
|
1244
1350
|
|
|
1351
|
+
Render the ACTUAL list (substituting `<provider_dir>` and
|
|
1352
|
+
dropping the rows the saved provider didn't create) so the
|
|
1353
|
+
tester sees the real paths, not the abstract placeholders.
|
|
1354
|
+
|
|
1245
1355
|
3. Only on the literal `yes, wipe` reply, delete those exact paths.
|
|
1246
|
-
Do NOT recursively `rm -rf`
|
|
1356
|
+
Do NOT recursively `rm -rf` `<provider_dir>/` or `notes/` as
|
|
1247
1357
|
directories — only the specific tutorial-owned files inside, in
|
|
1248
1358
|
case the tester has unrelated files there. After deletion, also
|
|
1249
|
-
`rmdir`
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1359
|
+
`rmdir` the per-provider subdirs that actually exist
|
|
1360
|
+
(`<provider_dir>/agents`, `<provider_dir>/commands`,
|
|
1361
|
+
`<provider_dir>/skills`), then `notes/` and `<provider_dir>/`,
|
|
1362
|
+
each one only if empty (silent failure if not). Then start
|
|
1363
|
+
everything from pre-flight.
|
|
1253
1364
|
|
|
1254
1365
|
## Edge cases
|
|
1255
1366
|
|
|
@@ -1270,13 +1381,3 @@ anything**:
|
|
|
1270
1381
|
`curl http://127.0.0.1:4242` from another terminal.
|
|
1271
1382
|
- **Tester gets lost** → "no worries, tell me where you are and
|
|
1272
1383
|
we'll pick up from there". State is in `tutorial-state.yml`.
|
|
1273
|
-
|
|
1274
|
-
## Things you NEVER do
|
|
1275
|
-
|
|
1276
|
-
- Run `sm` verbs for the tester (except `sm version` ONCE in
|
|
1277
|
-
pre-flight).
|
|
1278
|
-
- Advance to the next step without confirmation.
|
|
1279
|
-
- Modify files outside the tutorial cwd.
|
|
1280
|
-
- Ask them to `cd` outside the tutorial cwd.
|
|
1281
|
-
- Skip the level question when entering the deep-dive.
|
|
1282
|
-
- Ignore findings — always offer to log them.
|