@skill-map/cli 0.16.0 → 0.16.2

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.
@@ -35,10 +35,58 @@ optional second phase (~30-40 min) covering the rest of the CLI.
35
35
 
36
36
  ## Tone
37
37
 
38
- - Español casual, neutro con un toque argentino. Frases cortas. Cero
39
- jerga innecesaria.
40
- - Llamás al tester por su nombre si te lo dice; si no, "vos".
41
- - No sos condescendiente. Si pide algo que va a romper, lo avisás claro.
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,20 +97,58 @@ 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 Argentine Spanish (per
53
- the Tone bullets above, voseo and all); if in English, run it in
54
- plain English. Internal narration in this SKILL.md stays in
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.
104
+ - **Never emit bilingual user-facing copy**. The samples in the
105
+ blockquotes throughout this SKILL are written in English as the
106
+ base; translate the entire block to Spanish when the tester
107
+ speaks Spanish. Do NOT show "Spanish / English" pairs inline,
108
+ do NOT keep one sentence in English while another is in Spanish,
109
+ do NOT sprinkle isolated Spanish words inside English paragraphs
110
+ (or vice versa). Pick one language and commit.
111
+ - **Fixture content also follows the tester's language**. When you
112
+ `Write` the demo `.md` files (frontmatter `description`, body
113
+ prose, link anchor text, list items), translate the human text
114
+ to the tester's language. **Keep these English regardless**:
115
+ file paths and filenames (`.claude/agents/demo-agent.md`),
116
+ frontmatter keys (`name`, `description`, `metadata`, `tools`,
117
+ `event`, etc.), node identifiers (`demo-agent`, `demo-skill`),
118
+ link target paths inside `[...]( ... )`, code snippets, fenced
119
+ blocks, and anything the kernel parses structurally. Only the
120
+ natural-language portions get translated — schema and identifiers
121
+ stay stable so the watcher and link extractors keep working.
56
122
 
57
123
  ## Inviolable rules
58
124
 
59
125
  1. **You DO NOT run `sm` verbs for the tester** except `sm version`
60
126
  ONCE during pre-flight to verify the install. Your responsibilities:
61
127
  - Write fixture files and `tutorial-state.yml` directly in the cwd.
62
- - Edit `.md` files when a step calls for it (the live-UI demo
63
- needs this so the watcher has something to react to).
128
+ - Edit `.md` fixture files when a step calls for it (the live-UI
129
+ demo needs this so the watcher has something to react to).
64
130
  - Read files to verify what the tester modified.
65
131
  - Everything else is run by the tester.
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 REVEAL OR LESSON (e.g. Reveal 5 in Step 2 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.
66
152
  2. **After every command block, stop and wait.** The tester pastes
67
153
  the output or replies "OK" / "done". Only then do you advance.
68
154
  3. **Persist progress after every step / stage.** Update
@@ -183,6 +269,12 @@ which sm
183
269
  sm version
184
270
  ```
185
271
 
272
+ This check is **silent on success**. Do NOT narrate the result to
273
+ the tester ("`sm` v X.Y.Z responded, all good"). Save the version
274
+ internally and move on. The tester does not need a status report
275
+ for a backstage health check; speaking up here adds noise without
276
+ information. Only break the silence if something actually fails.
277
+
186
278
  If `sm` isn't installed, tell the tester:
187
279
 
188
280
  > You don't have `sm` yet. You'll need Node 20+ and then:
@@ -198,8 +290,8 @@ permissions issue. Suggest `node --version` and walk them through it.
198
290
 
199
291
  ### 3. Create the initial fixture (one node only)
200
292
 
201
- The tutorial builds the graph **progressively** in three reveals during
202
- Step 3 (Live UI). Right now, in pre-flight, you only create **one
293
+ The tutorial builds the graph **progressively** in five reveals during
294
+ Step 2 (Live UI). Right now, in pre-flight, you only create **one
203
295
  file** — a single agent — so the tester's first look at the UI
204
296
  shows exactly one node. The other four kinds (skill, command, hook,
205
297
  note) and the connectors between all five are added later, one
@@ -273,16 +365,13 @@ route:
273
365
  status: "not_started" # not_started | in_progress | done | declined
274
366
  estimated_min: 35
275
367
  short_steps:
276
- - id: "1-version"
277
- title: "sm version"
278
- status: "pending"
279
- - id: "2-init"
368
+ - id: "1-init"
280
369
  title: "sm init"
281
370
  status: "pending"
282
- - id: "3-ui-live"
371
+ - id: "2-ui-live"
283
372
  title: "⭐ Live UI: bare sm + live edits by the agent"
284
373
  status: "pending"
285
- - id: "4-handoff"
374
+ - id: "3-handoff"
286
375
  title: "Wrap-up of the demo and offer to keep going"
287
376
  status: "pending"
288
377
  long_stages:
@@ -336,16 +425,7 @@ to resume (re-invoke the skill from the same dir).
336
425
 
337
426
  Always runs. The pedagogical hook is the live UI.
338
427
 
339
- ### Step 1 — `sm version` (30 s)
340
-
341
- Already done in pre-flight. Confirm to the tester in one short
342
- blockquote, translated to their language:
343
-
344
- > OK, `sm` v X.Y.Z responded. Let's go.
345
-
346
- Mark `1-version: done`.
347
-
348
- ### Step 2 — `sm init` (1 min)
428
+ ### Step 1 — `sm init` (1 min)
349
429
 
350
430
  **Context**: `sm init` creates a hidden `.skill-map/` folder in the
351
431
  cwd holding the database where skill-map stores what it learns about
@@ -376,27 +456,34 @@ export.*
376
456
  dump.sql
377
457
  ```
378
458
 
379
- Mark `2-init: done`.
459
+ Mark `1-init: done`.
380
460
 
381
- ### Step 3 — ⭐ Live UI (4-5 min)
461
+ ### Step 2 — ⭐ Live UI (4-5 min)
382
462
 
383
463
  **Context**: typing `sm` alone (no arguments) in an initialised dir
384
464
  starts the UI server with the watcher built in. One process, one
385
465
  terminal: it boots the server, scans the `.md` files, detects
386
466
  changes, and pushes events over WebSocket to the live UI.
387
467
 
388
- This step has **three reveals**, each one driven by you editing
389
- files while the server stays up:
468
+ This step has **five reveals**, each one driven by you editing
469
+ files while the server stays up — except Reveal 3, where the
470
+ tester takes the keyboard for the first time.
390
471
 
391
472
  1. **Reveal 1 (boot)** — one node alone (the agent).
392
473
  2. **Reveal 2 (kinds)** — the four other kinds appear as new nodes,
393
474
  still unconnected.
394
- 3. **Reveal 3 (connectors)** — the connectors light up between all
475
+ 3. **Reveal 3 (your first edit)** — the **tester** edits the
476
+ `description` of the agent's `.md` and watches the card
477
+ refresh in the graph.
478
+ 4. **Reveal 4 (connectors)** — the connectors light up between all
395
479
  five nodes.
480
+ 5. **Reveal 5 (ignore)** — a private file appears, then disappears
481
+ the moment a pattern is added to `.skillmapignore`.
396
482
 
397
- The pedagogical arc: a single dot → a constellation of dots → a
398
- graph. Each reveal stops at a confirm prompt before you do the
399
- next.
483
+ The pedagogical arc: a single dot → a constellation of dots →
484
+ your own edit lands graph a graph that respects the user's
485
+ ignore list. Each reveal stops at a confirm prompt before you do
486
+ the next.
400
487
 
401
488
  **Command** (one terminal):
402
489
 
@@ -404,20 +491,52 @@ next.
404
491
  sm
405
492
  ```
406
493
 
494
+ Before Reveal 1, ask the tester to set up a **side-by-side view** so
495
+ they can watch the magic happen without alt-tabbing every reveal.
496
+ Tell the tester:
497
+
498
+ > Arrange your screen so two windows are visible at the same time:
499
+ >
500
+ > 1. **The browser** — where the graph will update in real time.
501
+ > Leave it ready to navigate to a URL; we'll get the link in a
502
+ > moment.
503
+ > 2. **This terminal** — the one where you're talking to me. You'll
504
+ > see me announce each reveal here, then confirm what you see
505
+ > in the browser.
506
+ >
507
+ > The third window — the terminal running `sm` — you can leave
508
+ > minimized or off to the side; it will just print scan progress
509
+ > lines and you don't need to read them.
510
+ >
511
+ > A typical layout: browser on the left half, this chat on the
512
+ > right half. Or any split that lets you see both at once. Tell
513
+ > me when you're set up and we start.
514
+
515
+ Wait for confirmation before moving on. Once they're ready, prompt
516
+ them to launch the server and open the link it prints — without
517
+ hardcoding the URL here, since the verb itself is the source of
518
+ truth (it logs the bound `http://host:port` after listen):
519
+
520
+ > In the terminal you opened for `sm`, run the command above. After
521
+ > a couple of seconds it will print a line with the URL where the
522
+ > UI is listening — copy that link and open it in the browser you
523
+ > just arranged. Tell me when you see the page load.
524
+
525
+ Wait for confirmation that the page loaded.
526
+
407
527
  #### Reveal 1 — the lone agent
408
528
 
409
529
  Tell the tester:
410
530
 
411
- > The server is running. Open the URL it printed (typically
412
- > **http://127.0.0.1:4242**).
413
- >
414
531
  > You'll see exactly **one node** in the graph: `demo-agent` (kind
415
532
  > `agent`). That's our starting point.
416
533
  >
417
534
  > Walk the 3 views before we go on:
418
535
  > 1. **Graph** — the single agent node.
419
536
  > 2. **List** — one row, with path / kind / metadata.
420
- > 3. **Inspector** — click the node to see frontmatter and links.
537
+ > 3. **Inspector** — click the node to see its frontmatter (the
538
+ > YAML block at the top of every `.md`, between the two `---`
539
+ > lines) and links.
421
540
  >
422
541
  > Did the node show up?
423
542
 
@@ -507,42 +626,70 @@ Create these four files (with `Write`), exactly in this order:
507
626
  wired into the rest of the fixture next.
508
627
  ```
509
628
 
510
- 4. `notes/todo.md` (kind: note — has a **deliberately broken link**
511
- that we exploit later in stage L4):
629
+ 4. `notes/todo.md` (kind: note):
512
630
  ```markdown
513
631
  ---
514
632
  name: Demo TODO list
515
633
  description: |
516
634
  Live list of things to review in the demo. Will become the
517
635
  hub between skill / agent / command / hook in the next
518
- reveal. Contains a broken link on purpose for the broken-ref
519
- stage later on.
636
+ reveal.
520
637
  tags: [notes, demo]
521
638
  metadata:
522
639
  version: "1.0.0"
523
640
  ---
524
641
 
525
642
  # Pending
526
-
527
- - [ ] Document the [flow diagram](./missing-page.md) — broken
528
- link on purpose, leave it.
529
643
  ```
530
644
 
531
645
  Tell the tester:
532
646
 
533
- > Mirá el navegador / Look at the browser. Four new nodes should
534
- > have popped in: `demo-skill`, `demo-command`, `demo-hook`, and
647
+ > Look at the browser. Four new nodes should have popped in:
648
+ > `demo-skill`, `demo-command`, `demo-hook`, and
535
649
  > `notes/todo`. Five total now, **still unconnected** — they're
536
- > floating dots.
537
- >
538
- > If you don't see them, zoom out with the mouse wheel or the UI
539
- > zoom control — new nodes sometimes land off-screen.
650
+ > floating dots. The viewport auto-fits whenever a node is added or
651
+ > removed, so all five should be visible without panning.
540
652
  >
541
653
  > Did the four appear? Confirm so we can wire them up.
542
654
 
543
655
  Wait for confirmation.
544
656
 
545
- #### Reveal 3 — the connectors light up
657
+ #### Reveal 3 — your first edit
658
+
659
+ Up to here you've been watching the agent write files. Now hand
660
+ the keyboard over: the lesson is that the watcher reacts to
661
+ **any** `.md` edit under the cwd, not just to files the agent
662
+ authors. After this beat, the tester has the muscle memory for
663
+ "save → graph updates", which Reveal 5 (`.skillmapignore`) reuses
664
+ verbatim.
665
+
666
+ Tell the tester:
667
+
668
+ > Your turn. First, in the browser, **expand the `demo-agent`
669
+ > card** (click the chevron / arrow on the card to open it). That
670
+ > reveals the description currently showing for the node — that's
671
+ > the field you'll edit next, so leave the card open and the
672
+ > change will be obvious.
673
+ >
674
+ > Now open `.claude/agents/demo-agent.md` in your editor of
675
+ > choice. In the **frontmatter** (the YAML block at the top of
676
+ > the file, between the two `---` lines), change the
677
+ > `description:` field to any text you want — the actual content
678
+ > does not matter, just make it different from what's there now.
679
+ > Save the file.
680
+ >
681
+ > Watch the browser. The `demo-agent` card should refresh its
682
+ > description in real time, no reload, no Ctrl+C — same watcher
683
+ > that picked up the four new nodes a moment ago, this time
684
+ > reacting to YOUR edit.
685
+ >
686
+ > Confirm so we wire the five up.
687
+
688
+ Wait for confirmation. You MAY use `Read` on the file afterwards
689
+ to verify the change landed (read-only, allowed under Inviolable
690
+ rule #1) before moving on.
691
+
692
+ #### Reveal 4 — the connectors light up
546
693
 
547
694
  Now you edit the existing files to add the cross-fixture links —
548
695
  each one becomes a connector in the graph. Apply with `Edit` (do
@@ -571,11 +718,9 @@ not rewrite the files):
571
718
  See [pending items](../../notes/todo.md) for operational
572
719
  context.
573
720
  ```
574
- 5. **Edit `notes/todo.md`** — replace the existing single bullet
575
- with these three (keep the broken-link bullet intact):
721
+ 5. **Edit `notes/todo.md`** — append these two bullets after the
722
+ `# Pending` heading:
576
723
  ```markdown
577
- - [ ] Document the [flow diagram](./missing-page.md) — broken
578
- link on purpose, leave it.
579
724
  - [ ] Polish the
580
725
  [demo-skill](../.claude/skills/demo-skill/SKILL.md)
581
726
  prompt.
@@ -585,8 +730,8 @@ not rewrite the files):
585
730
 
586
731
  Tell the tester:
587
732
 
588
- > Mirá la magia de nuevo / Look at the magic again. The five
589
- > floating nodes should now be wired together — connectors light
733
+ > Look at the magic again. The five floating nodes should now be
734
+ > wired together — connectors light
590
735
  > up between them as the watcher picks up each edit:
591
736
  >
592
737
  > - `demo-skill → demo-agent`
@@ -595,90 +740,118 @@ Tell the tester:
595
740
  > - `demo-hook → notes/todo`
596
741
  > - `notes/todo → demo-skill`, `notes/todo → demo-hook`
597
742
  >
598
- > The intentional broken link inside `notes/todo` (pointing at the
599
- > non-existent `missing-page.md`) does **not** show up as a
600
- > connector in the graph — it surfaces as a `broken-ref` **issue**
601
- > on the `notes/todo` node (look for a warning marker on the node
602
- > or open it in the inspector). We'll explore that issue properly
603
- > in stage L4 if you continue with the deeper part.
604
- >
605
- > Confirmá / confirm. If a connector is missing, refresh the
606
- > browser and tell me.
743
+ > Confirm. If a connector is missing, refresh the browser and tell
744
+ > me.
607
745
 
608
- Wait for confirmation. **Do NOT move on to Reveal 4** until the
609
- connectors are confirmed visible — Reveal 4 reuses the same live UI
746
+ Wait for confirmation. **Do NOT move on to Reveal 5** until the
747
+ connectors are confirmed visible — Reveal 5 reuses the same live UI
610
748
  session.
611
749
 
612
- #### Reveal 4 — silence a private file via `.skillmapignore`
750
+ #### Reveal 5 — silence a private file via `.skillmapignore`
613
751
 
614
- The first three reveals showed the watcher picking up new files and
615
- edits. Reveal 4 flips the direction: a file the tester DOES NOT want
752
+ The first four reveals showed the watcher picking up new files and
753
+ edits (yours and theirs). Reveal 5 flips the direction: a file the
754
+ tester DOES NOT want
616
755
  in the graph (a draft, a scratch file, a secret) gets hidden by a
617
756
  single line in `.skillmapignore`. Same live mechanism — no restart.
618
757
 
619
758
  `sm init` already wrote a starter `.skillmapignore` at the scope
620
- root. The tester edits that file plus creates one new fixture node:
759
+ root. The flow has three beats:
621
760
 
622
- 1. Create (`Write`) `notes/private-credentials.md` kind `note`,
623
- simulates a file the tester would never want surfacing publicly:
624
- ```markdown
625
- ---
626
- name: private-credentials
627
- description: |
628
- Personal API tokens — exists in the repo but should not show
629
- up in the skill-map graph. Demonstrates the .skillmapignore
630
- flow.
631
- metadata:
632
- version: "0.0.1"
633
- ---
761
+ **Beat A — you create one new fixture file (the agent does this).**
634
762
 
635
- # Private
763
+ `Write` `notes/private-credentials.md` — kind `note`, simulates a
764
+ file the tester would never want surfacing publicly:
636
765
 
637
- API_TOKEN: example-not-real
638
- ```
766
+ ```markdown
767
+ ---
768
+ name: private-credentials
769
+ description: |
770
+ Personal API tokens — exists in the repo but should not show
771
+ up in the skill-map graph. Demonstrates the .skillmapignore
772
+ flow.
773
+ metadata:
774
+ version: "0.0.1"
775
+ ---
639
776
 
640
- 2. Confirm the file appears in the graph as a sixth node
641
- (`notes/private-credentials`). The watcher sees it like any
642
- other `.md` — that's the point of the demo.
777
+ # Private
643
778
 
644
- 3. Edit (`Edit`) `.skillmapignore` and append a single new line at
645
- the end:
646
- ```
647
- notes/private-*.md
648
- ```
649
- (Pattern syntax mirrors `.gitignore` — kaelzhang's `ignore`
650
- under the hood. A literal path like `notes/private-credentials.md`
651
- would also work; the glob teaches the broader habit.)
779
+ API_TOKEN: example-not-real
780
+ ```
652
781
 
653
- 4. Confirm the node disappears from the graph in the browser, no
654
- refresh needed. Six nodes back to five.
782
+ Confirm the file appears in the graph as a sixth node
783
+ (`notes/private-credentials`). The watcher sees it like any
784
+ other `.md` — that's the point of the demo.
655
785
 
656
- Tell the tester:
786
+ **Beat B — you show the project structure (the agent does this).**
787
+
788
+ Before asking the tester to touch `.skillmapignore`, give them a
789
+ mental map of the folder so they know where the file lives and
790
+ what's around it. Use `Bash` (`ls -la` and `ls -la notes/` if a
791
+ deeper view helps) and present the listing inside a blockquote so
792
+ the tester sees what their cwd holds:
657
793
 
658
- > Última magia / one last trick: skill-map stops tracking a file
659
- > the moment it matches a pattern in `.skillmapignore`. No restart
660
- > needed — same watcher, opposite direction.
794
+ > Antes del último paso, esto es lo que tenés en el directorio
795
+ > ahora mismo:
661
796
  >
662
- > Two steps:
797
+ > ```
798
+ > . ← your cwd
799
+ > ├── .claude/
800
+ > │ ├── agents/demo-agent.md
801
+ > │ ├── commands/demo-command.md
802
+ > │ ├── hooks/demo-hook.md
803
+ > │ └── skills/demo-skill/SKILL.md
804
+ > ├── .skill-map/ ← project DB + settings (managed)
805
+ > ├── .skillmapignore ← the file we're about to edit
806
+ > ├── notes/
807
+ > │ ├── todo.md
808
+ > │ └── private-credentials.md ← what we want to hide
809
+ > └── sm-tutorial.md ← the tutorial file you loaded
810
+ > ```
811
+ >
812
+ > The `.skillmapignore` at the root is the file we'll touch
813
+ > next. Same syntax as `.gitignore`. Anything matching a pattern
814
+ > there is invisible to skill-map's scan.
815
+
816
+ Adjust the actual tree shown to whatever `ls -la` returns — the
817
+ goal is "tester recognises their own filesystem", not a copy of
818
+ the snippet above.
819
+
820
+ **Beat C — the tester edits `.skillmapignore` (NOT the agent).**
821
+
822
+ Per Inviolable rule #1, you DO NOT touch `.skillmapignore` with
823
+ your `Edit` tool. Tell the tester to do it from their editor:
824
+
825
+ > Last step. Open `.skillmapignore` (it's at the cwd root) in
826
+ > your editor of choice. At the end of the file, on a new line,
827
+ > append:
828
+ >
829
+ > ```
830
+ > notes/private-*.md
831
+ > ```
663
832
  >
664
- > 1. Create `notes/private-credentials.md` with the content I'll
665
- > paste a new node appears on the graph (watcher magic again,
666
- > expected).
667
- > 2. Open `.skillmapignore` and append `notes/private-*.md` on a
668
- > new line the node disappears from the graph.
833
+ > Save the file. The pattern uses a glob (same as `.gitignore`):
834
+ > `notes/private-*.md` matches `private-credentials.md` and any
835
+ > future sibling `private-*.md`. A literal path
836
+ > (`notes/private-credentials.md`) would also work — the glob
837
+ > teaches the broader habit.
669
838
  >
670
- > Use this whenever you have drafts, scratch files, or anything
671
- > you don't want surfacing in the map. Syntax is the same as
672
- > `.gitignore`: globs, `!pattern` to re-include, `#` for comments.
839
+ > Watch the browser when you save. The
840
+ > `notes/private-credentials` node should disappear from the
841
+ > graph in real time, without restarting anything. Six nodes
842
+ > back to five.
673
843
  >
674
844
  > Did the node vanish?
675
845
 
676
- Wait for confirmation. Once they confirm, ask them to stop the
677
- server with **Ctrl+C** in the terminal before continuing.
846
+ After they confirm, you MAY use `Read` on `.skillmapignore` to
847
+ verify the appended pattern landed correctly (in case
848
+ `sm check` later reports something odd) — that is read-only and
849
+ allowed. Once confirmed, ask them to stop the server with
850
+ **Ctrl+C** in the terminal before continuing.
678
851
 
679
- Mark `3-ui-live: done`.
852
+ Mark `2-ui-live: done`.
680
853
 
681
- ### Step 4 — Wrap-up of the demo and offer to keep going (30 s)
854
+ ### Step 3 — Wrap-up of the demo and offer to keep going (30 s)
682
855
 
683
856
  > All set! That's the heart of skill-map: you edit a `.md` and the
684
857
  > UI sees it instantly. In **~7 minutes** you've already seen the
@@ -733,9 +906,9 @@ Save into `tester.level` and modulate:
733
906
  they can do it from their editor.
734
907
 
735
908
  This stage needs the server running. **Check first** before asking
736
- them to launch it: many testers leave it running from Step 3 and
909
+ them to launch it: many testers leave it running from Step 2 and
737
910
  the demo wraps without an explicit Ctrl+C. Word the prompt as a
738
- conditional, e.g. "If the server from Step 3 is still up, leave it
911
+ conditional, e.g. "If the server from Step 2 is still up, leave it
739
912
  — if not, run `sm` again from the tutorial cwd and reopen the
740
913
  browser." Do not just say "start it again" — that risks a second
741
914
  process trying to bind the same port and confusing the tester.
@@ -746,7 +919,8 @@ process trying to bind the same port and confusing the tester.
746
919
  >
747
920
  > Expected: the `demo-skill → demo-agent` connector disappears. If
748
921
  > `demo-agent.md` ends up with no one linking to it, it shows up as
749
- > an orphan (we'll exploit this in stage L4).
922
+ > an orphan (we'll create a similar dangling situation in stage L4
923
+ > to see how `sm check` flags it).
750
924
 
751
925
  You verify by reading `.claude/skills/demo-skill/SKILL.md` to confirm
752
926
  the change was applied. Once they confirm, ask them to **Ctrl+C**
@@ -763,8 +937,9 @@ sm check
763
937
  ```
764
938
 
765
939
  Expected: you see the 5 fixture nodes listed with their kind;
766
- `check` reports the broken-link issue in `notes/todo.md` pointing
767
- at `missing-page.md`.
940
+ `check` runs the deterministic rules and reports a clean fixture
941
+ (no issues at this point — we will plant one in stage L4 and watch
942
+ the rule catch it).
768
943
 
769
944
  ### Stage L3 — ASCII: graph + export (~3 min)
770
945
 
@@ -781,10 +956,18 @@ or json.
781
956
 
782
957
  ### Stage L4 — Issues: broken refs (~3 min)
783
958
 
784
- The fixture has a deliberate broken link in `notes/todo.md`
785
- pointing at `notes/missing-page.md`. skill-map flags it as a
786
- **`broken-ref` issue** (not a graph connector, not an "orphan" —
787
- those are different concepts).
959
+ `broken-ref` is one of the deterministic rules `sm check` runs.
960
+ We'll plant one and watch it surface — that's the easiest way to
961
+ internalise that it is an **issue** on a node, NOT a graph
962
+ connector and NOT the same thing as an "orphan".
963
+
964
+ Ask the tester to **append one bullet** to `notes/todo.md`:
965
+
966
+ ```markdown
967
+ - [ ] Document the [flow diagram](./missing-page.md).
968
+ ```
969
+
970
+ `./missing-page.md` deliberately doesn't exist. Save the file.
788
971
 
789
972
  ```bash
790
973
  sm check
@@ -795,7 +978,9 @@ sm check --json
795
978
  Expected: the warning surfaces the dangling link from
796
979
  `notes/todo.md` to the non-existent `missing-page.md`. The
797
980
  `--rules` filter lets you focus on a single issue type; `--json`
798
- emits the structured payload (useful for CI / scripting).
981
+ emits the structured payload (useful for CI / scripting). When
982
+ done, the tester can leave the bullet in place or delete it — the
983
+ rest of the deep-dive doesn't depend on it.
799
984
 
800
985
  > **Heads up about scope** (mention only if the tester asks):
801
986
  >
@@ -846,8 +1031,9 @@ generate a report file to send to Pusher**:
846
1031
 
847
1032
  > Thanks! That's a wrap. Before closing:
848
1033
  >
849
- > Want me to generate a consolidated **report file** (recap of the
850
- > walkthrough + findings + environment) ready to send to **Pusher**?
1034
+ > Want me to generate a consolidated **report file** (a recap of
1035
+ > the walkthrough + findings the bugs or rough edges you spotted
1036
+ > along the way — + environment info) ready to send to **Pusher**?
851
1037
  > I'll save it as `<cwd>/sm-tutorial-report.md`.
852
1038
  >
853
1039
  > 1. **Yes, generate it**