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