@skill-map/cli 0.53.4 → 0.53.6

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.
@@ -42,8 +42,10 @@ prefix when a part spans several files: `settings-*` →
42
42
  `part-authoring.md`).
43
43
 
44
44
  > For the tester this is a single guided session, never a course
45
- > catalogue. Never say "part 6", "chapter id", "the settings tour"
46
- > out loud. Use the friendly titles from the manifest.
45
+ > catalogue. Refer to a chapter by its tester-facing `section.chapter`
46
+ > number plus its friendly title (`_core.md` §Numbering); never expose
47
+ > the internal `order` index ("Part 6", off by one from the menu), a
48
+ > raw "chapter id", or tour jargon ("the settings tour").
47
49
 
48
50
  ## Pre-flight (run once, silent on success)
49
51
 
@@ -145,7 +147,7 @@ every other `<cwd>` mention.
145
147
  > output, and I verify.
146
148
  > 2. **A second terminal**: open it now (new window or tab), then run
147
149
  > the command below so it's anchored **exactly to this folder**.
148
- > That's where you copy and paste every `sm` command.
150
+ > That's where you copy and paste every command I give you to run.
149
151
 
150
152
  ```bash
151
153
  cd <cwd>
@@ -195,12 +197,13 @@ the files the prologue's own chapters lay as taught steps, exactly this
195
197
  set: `<provider_dir>/agents/demo-agent.md`,
196
198
  `<provider_dir>/skills/demo-skill/`,
197
199
  `<provider_dir>/commands/demo-command.md`, `notes/todo.md`,
198
- `notes/demo-guideline.md`, `notes/private-credentials.md`. This is the
200
+ `notes/demo-guideline.md`, `notes/demo-guideline2.md`,
201
+ `notes/private-credentials.md`. This is the
199
202
  single source for that list. Four entry points delete exactly this set
200
203
  when the prologue ran first in the dir: `portfolio-init`, the campaign
201
- `seed` fast-forward, and `backstage-init` (Part 7), each so the part's
204
+ `seed` fast-forward, and `backstage-init` (Part 6), each so the part's
202
205
  own fixture starts from a clean slate, plus start-over (§Menu, resume,
203
- wrap-up). Part 8 `cli` is the inverse
206
+ wrap-up). Part 7 `cli` is the inverse
204
207
  consumer: its `prologue-built` seed *lays* this fixture (the
205
208
  connector-chapter subset, without `notes/private-credentials.md`)
206
209
  instead of deleting it, see `fixtures.md` §Seed snapshots. Keep the list
@@ -332,7 +335,7 @@ When a part begins, honour its `preflight` from the manifest:
332
335
  `preflight: seed` to fast-forward into them directly, see the `seed`
333
336
  case below; `portfolio-init` is just Part 1's flavour of that,
334
337
  handling the Part 0 to Part 1 transition.)
335
- - **`backstage-init`** (Part 7 `extend`): the part teaches plugins on
338
+ - **`backstage-init`** (Part 6 `extend`): the part teaches plugins on
336
339
  its own **master fixture**, distinct from both the demo and the
337
340
  portfolio, so on entry make the master fixture the only one on disk.
338
341
  Silently, with no narration: (1) clear whatever prior-part fixture is
@@ -352,10 +355,10 @@ When a part begins, honour its `preflight` from the manifest:
352
355
  `Write` the part's fixture (read `references/fixtures.md` for the
353
356
  verbatim `master-agent` / `master-skill` / `notes/ideas` files; skip
354
357
  kinds the provider doesn't claim). If nothing needed clearing and the
355
- dir was already initialised with the master fixture in place (Part 7
358
+ dir was already initialised with the master fixture in place (Part 6
356
359
  re-entry), that is fine: skip the init and just ensure the fixture
357
360
  files are present.
358
- - **`seed: prologue-built`** (Part 8 `cli`): the part reads the **Part 0
361
+ - **`seed: prologue-built`** (Part 7 `cli`): the part reads the **Part 0
359
362
  demo fixture**, NOT the cumulative portfolio, so on entry make that
360
363
  fixture the one on disk. Read the state, then:
361
364
  - Demo fixture already present (the tester came straight from the
@@ -374,7 +377,15 @@ When a part begins, honour its `preflight` from the manifest:
374
377
  On entry, read the state file:
375
378
  - If every predecessor campaign part up the `prereq` chain is `done`
376
379
  → reuse the accumulated state; an `sm scan` to refresh is enough,
377
- nothing to lay.
380
+ nothing to lay. **`mcp` is the exception**: it is ordered last,
381
+ after `extend` (Part 6) and `cli` (Part 7), which both replace the
382
+ portfolio on disk with their own master / demo fixture, so its
383
+ accumulated state cannot be trusted to still be the portfolio.
384
+ `mcp` therefore ALWAYS re-lays its `harness-connected` snapshot on
385
+ entry (clearing a master / demo fixture first if one is present,
386
+ the same clears the `backstage-init` and `prologue-built` cases
387
+ do), then `sm init` if `.skill-map/` is missing and `sm scan`,
388
+ exactly like the fast-forward branch below.
378
389
  - Else → **fast-forward, silently** (backstage, do not narrate the
379
390
  plumbing): first, if the prologue ran first in this dir, clear the
380
391
  full Part 0 demo fixture set (§Fixture and state templates) so the
@@ -413,7 +424,7 @@ All three are specified in `_core.md`:
413
424
  the **numbered start menu** (Part 0 is option 1, the recommended
414
425
  first pick); the menu (the ToC from `_manifest.yml`, numbered,
415
426
  completed parts ticked, `planned` parts hidden, `prereq` gating only
416
- seedless parts, none today since Part 8 `cli` now self-seeds) is the
427
+ seedless parts, none today since Part 7 `cli` now self-seeds) is the
417
428
  entry point on the first
418
429
  invocation and after every part closes / on resume. Render it with
419
430
  the format in `_core.md` §Menu format.
@@ -421,7 +432,7 @@ All three are specified in `_core.md`:
421
432
  wipe list is whatever the tester's parts actually created:
422
433
  `tutorial-state.yml`, `findings.md`, `.skillmapignore`,
423
434
  `.skill-map/`, the full Part 0 demo fixture set (§Fixture and state
424
- templates), the Part 7 fixture if `extend` ran
435
+ templates), the Part 6 fixture if `extend` ran
425
436
  (`<provider_dir>/agents/master-agent.md`,
426
437
  `<provider_dir>/skills/master-skill/`, `notes/ideas.md`,
427
438
  `.skill-map/plugins/`), `link-validation/` if the CLI part ran,
@@ -8,9 +8,32 @@ library assumes it. Do NOT restate these rules inside a part file.
8
8
  The tutorial is **one book**: an ordered sequence of **chapters
9
9
  grouped in parts**, listed in `_manifest.yml`. A chapter is the
10
10
  minimal unit (1 to a few steps). For the tester it is a single
11
- guided session, never a "course catalogue"; never say "part 3",
12
- "the settings tour", "chapter id" out loud. The menu uses friendly
13
- titles; once they pick, you just walk that path.
11
+ guided session, never a "course catalogue": refer to a chapter by its
12
+ tester-facing `section.chapter` number (§Numbering) plus its friendly
13
+ title, never by a raw "chapter id" or tour jargon ("the settings
14
+ tour"). The menu uses friendly titles; once they pick, you just walk
15
+ that path.
16
+
17
+ ## Numbering (the `section.chapter` scheme)
18
+
19
+ Two numbering systems coexist; keep them apart:
20
+
21
+ - **Internal (authoring only)**: the `order` field in `_manifest.yml`
22
+ and the `# Part N` file headers, 0-based (Part 0 the prologue …
23
+ Part 8 the MCP appendix). Use it in `**Context**:` blocks and author
24
+ notes; NEVER say it to the tester, it is off by one from what they
25
+ see.
26
+ - **Tester-facing (`S.N`)**: every part is a **section** numbered by
27
+ its 1-based position in the menu (section `1` is the prologue), and
28
+ every chapter inside it carries a `section.chapter` number like a
29
+ semver minor, resetting per section: section `5`'s chapters are
30
+ `5.1`, `5.2`, … This `S.N` form is the ONLY number you say out loud;
31
+ it matches the menu number the tester picked.
32
+
33
+ So the third chapter of section 5 announces as `5.3`, and the
34
+ prologue's first chapter is `1.1`. The numbers are derived at render
35
+ time from the menu order and the chapter's position in its part,
36
+ nothing is stored in the manifest.
14
37
 
15
38
  ## Tone
16
39
 
@@ -263,10 +286,12 @@ Never call `TaskCreate` / `TaskUpdate` (Inviolable rule #4).
263
286
 
264
287
  For every chapter:
265
288
 
266
- 1. **Announcement**: "Capítulo N: `<title>`. ~M min." then a blank
289
+ 1. **Announcement**: "Capítulo S.N: `<title>`. ~M min." then a blank
267
290
  line, then (optionally) one sentence of context on its own
268
- paragraph. `N` is the 1-based index of the chapter inside its
269
- part; it resets per part. The context paragraph renders ONLY when
291
+ paragraph. `S` is the section number (the part's 1-based menu
292
+ position) and `N` is the 1-based index of the chapter inside that
293
+ part, resetting per part (§Numbering), so section 5's third chapter
294
+ announces as `Capítulo 5.3`. The context paragraph renders ONLY when
270
295
  the source has a `**Context**:` field; if omitted, announce the
271
296
  title alone. The title comes from the chapter's `title` in
272
297
  `_manifest.yml` (translated per §Tone), not the internal id.
@@ -293,11 +318,11 @@ For every chapter:
293
318
  §Menu format).
294
319
  - **Which parts to list**: parts in `order`, `status: active` only
295
320
  (`planned` parts are hidden). A part with a `seed` (the campaign
296
- parts plus Part 8 `cli`) is always shown, even out of order, its
321
+ parts plus Part 7 `cli`) is always shown, even out of order, its
297
322
  `preflight: seed` fast-forwards the project into it (SKILL.md
298
323
  §Entering a part). A part with a `prereq` but NO `seed` would be
299
324
  shown only once its `prereq` is `done`; no active part is in that
300
- state today (Part 8 `cli` used to be, now it self-seeds).
325
+ state today (Part 7 `cli` used to be, now it self-seeds).
301
326
  - **After the tester picks**: walk that part; when it ends, run
302
327
  §Closing a part (a tester-facing close, then this menu).
303
328
  - **Adding content** is data-only: a new chapter in a part (or a new
@@ -339,7 +364,8 @@ and go straight to §Final wrap-up.
339
364
 
340
365
  Render the menu numbered and formatted (NOT a bare list), translated
341
366
  to the tester's language. A one-line intro, then per part a **bold
342
- numbered title line** (number + title + `(~M min)`) as plain prose,
367
+ numbered title line** (the section number + title + `(~M min)`, that
368
+ number is the `S` major in the chapter `S.N` scheme, §Numbering) as plain prose,
343
369
  immediately followed by a single-level `> ` blockquote one-line
344
370
  description (what the part covers, derived from its title + chapters).
345
371
  A **completed part** keeps its plain title (NO `✓` on the title line)
@@ -51,7 +51,7 @@ parts:
51
51
  - id: ignore ; title: "Silence a file via .skillmapignore" ; est_min: 2
52
52
 
53
53
  - id: extend
54
- order: 7
54
+ order: 6
55
55
  title: "Extend skill-map for the site"
56
56
  # Spans three chapter libraries; dispatch by chapter-id prefix:
57
57
  # settings-* -> part-settings.md
@@ -81,7 +81,7 @@ parts:
81
81
  - id: authoring-6-upgrade ; title: "Try `sm plugins upgrade`" ; est_min: 2
82
82
 
83
83
  - id: cli
84
- order: 8
84
+ order: 7
85
85
  title: "The CLI in depth"
86
86
  step_file: part-cli.md
87
87
  pace: auto-advance
@@ -142,12 +142,13 @@ parts:
142
142
  prereq: connect-harness
143
143
  status: active
144
144
  chapters:
145
- - id: generate ; title: "The agent generates the HTML in public/" ; est_min: 3
146
- - id: serve ; title: "node server.js: your portfolio, live next to the graph" ; est_min: 3
145
+ - id: generate ; title: "The agent generates the HTML in public/" ; est_min: 3
146
+ - id: serve ; title: "node server.js: your portfolio, live next to the graph" ; est_min: 3
147
+ - id: editor-live ; title: "Let the content-editor agent write a posts page (optional)" ; est_min: 3
147
148
 
148
149
  - id: maintain
149
150
  order: 4
150
- title: "Maintain the site"
151
+ title: "Maintain the harness"
151
152
  step_file: part-maintain.md
152
153
  pace: auto-advance
153
154
  preflight: seed
@@ -157,14 +158,13 @@ parts:
157
158
  chapters:
158
159
  - id: broken-ref ; title: "A ref breaks (you rename DEPLOY.md)" ; est_min: 3
159
160
  - id: analyzers ; title: "The analyzer catalogue (what sm check catches)" ; est_min: 3
160
- - id: orphans ; title: "Orphans (sm orphans)" ; est_min: 2
161
+ - id: orphans ; title: "Orphans (a page nobody links to)" ; est_min: 2
161
162
  - id: reserved ; title: "Reserved names" ; est_min: 2
162
163
  - id: sidecar ; title: "Annotations .sm and consent" ; est_min: 3
163
- - id: versions ; title: "Versions: sm bump and history" ; est_min: 2
164
164
 
165
165
  - id: mcp
166
- order: 5
167
- title: "MCP" # a chapter apart, just before the finale
166
+ order: 8
167
+ title: "MCP" # standalone appendix, ordered last; ALWAYS re-seeds harness-connected (extend/cli wipe the portfolio before it)
168
168
  step_file: part-mcp.md
169
169
  pace: auto-advance
170
170
  preflight: seed
@@ -175,7 +175,7 @@ parts:
175
175
  - id: mcp-node ; title: "content-editor declares an MCP tool; the mcp:// node appears" ; est_min: 3
176
176
 
177
177
  - id: live-site
178
- order: 6
178
+ order: 5
179
179
  title: "Ship the site (the full publish pipeline)" # the finale / climax
180
180
  step_file: part-live-site.md
181
181
  pace: auto-advance
@@ -1,7 +1,7 @@
1
1
  # Fixture templates
2
2
 
3
3
  Fixtures the orchestrator lays for the auto-fixtured parts. Two full
4
- templates live here: the **master fixture** (Part 7, "Extend
4
+ templates live here: the **master fixture** (Part 6, "Extend
5
5
  skill-map", `backstage-init`) right below, and the **portfolio
6
6
  fixture** (Part 1, "The project from zero", `portfolio-init`) at the
7
7
  end of this file. The **Part 0 demo fixture** is not templated here:
@@ -18,7 +18,7 @@ context for. Holds for every command fixture wherever it is defined
18
18
  (today: the prologue `demo-command`, the `publish` command, and the
19
19
  `reserved` chapter's `init`).
20
20
 
21
- ## Master fixture (Part 7): layout (per provider)
21
+ ## Master fixture (Part 6): layout (per provider)
22
22
 
23
23
  Per §Provider detection in `SKILL.md`, the `<provider_dir>`
24
24
  placeholder resolves to `.claude/` or `.agents/skills/` depending
@@ -62,8 +62,6 @@ description: |
62
62
  tools so the `core/tools-counter` extractor emits a count.
63
63
  tools: [Read, Bash, Edit]
64
64
  model: sonnet
65
- metadata:
66
- version: "1.0.0"
67
65
  ---
68
66
 
69
67
  # master-agent
@@ -82,17 +80,6 @@ description: |
82
80
  Example skill paired with the master-agent for the advanced
83
81
  tutorial. Links to the agent so extractors and analyzers have
84
82
  something to chew on.
85
- inputs:
86
- - name: target
87
- type: path
88
- description: File to process.
89
- required: true
90
- outputs:
91
- - name: report
92
- type: string
93
- description: Markdown summary.
94
- metadata:
95
- version: "1.0.0"
96
83
  ---
97
84
 
98
85
  # master-skill
@@ -115,9 +102,6 @@ name: Ideas backlog
115
102
  description: |
116
103
  Free-form notes for the advanced tutorial. Demonstrates the
117
104
  catch-all markdown kind alongside the agent and skill.
118
- tags: [notes, master]
119
- metadata:
120
- version: "1.0.0"
121
105
  ---
122
106
 
123
107
  # Ideas
@@ -146,7 +130,7 @@ Per finding:
146
130
  Laid backstage before the tester's `sm init` in Part 1. The Express
147
131
  skeleton (`server.js`, `package.json`, `public/index.html`) is plain
148
132
  scaffolding, not `.md`, so the scan ignores it; it makes the project
149
- real and runnable (Part 3 runs it, Part 6 ships it). The one boot node is the
133
+ real and runnable (Part 3 runs it, Part 5 ships it). The one boot node is the
150
134
  handbook `AGENTS.md`. On `agent-skills` / Antigravity (no `agent`
151
135
  kind) the harness still works: the agent member is created as a skill
152
136
  in a later chapter.
@@ -224,7 +208,7 @@ Append to the universal `.skillmapignore` (written in pre-flight, see
224
208
  ## Seed snapshots (for `preflight: seed`)
225
209
 
226
210
  When the orchestrator enters a seedable part out of order (the campaign
227
- parts when their predecessors are not `done`, or Part 8 `cli` when the
211
+ parts when their predecessors are not `done`, or Part 7 `cli` when the
228
212
  demo fixture is not the one on disk), it fast-forwards the project by
229
213
  laying the snapshot below, then `sm init` (if `.skill-map/` is missing) +
230
214
  `sm scan`. These are **checklists, not content**: each row names a file
@@ -259,16 +243,16 @@ Everything in `harness-built`, PLUS the Part 2 wiring:
259
243
  After laying a campaign snapshot the map matches the state a tester would
260
244
  have at the END of the part just before the one being entered.
261
245
 
262
- ### Seed snapshot: `prologue-built` (Part 8 `cli`)
246
+ ### Seed snapshot: `prologue-built` (Part 7 `cli`)
263
247
 
264
248
  NOT cumulative and NOT the portfolio: this is the **Part 0 demo
265
- fixture**, the five standalone demo nodes with `notes/todo` wired as the
249
+ fixture**, the six standalone demo nodes with `notes/todo` wired as the
266
250
  hub, the clean state (`✓ No issues`) at the end of the prologue's
267
- connector chapters. Part 8 only reads it. Because it is a different
251
+ connector chapters. Part 7 only reads it. Because it is a different
268
252
  fixture from the portfolio, entry first resets any portfolio on disk
269
253
  (see SKILL.md §Entering a part, the `cli` case).
270
254
 
271
255
  1. `<provider_dir>/agents/demo-agent.md` <- SKILL.md §Fixture and state templates. (The `.skillmapignore` is universal, already on disk from pre-flight; the snapshot does not lay it.)
272
- 2. `<provider_dir>/skills/demo-skill/SKILL.md`, `<provider_dir>/commands/demo-command.md`, `notes/todo.md`, `notes/demo-guideline.md` <- part-fundamentals.md, chapter `kinds`.
273
- 3. EDIT `notes/todo.md`: wire the hub bullets pointing at the four other nodes <- part-fundamentals.md, chapter `connectors`.
256
+ 2. `<provider_dir>/skills/demo-skill/SKILL.md`, `<provider_dir>/commands/demo-command.md`, `notes/todo.md`, `notes/demo-guideline.md`, `notes/demo-guideline2.md` <- part-fundamentals.md, chapter `kinds`.
257
+ 3. EDIT `notes/todo.md`: wire the hub bullets pointing at the five other nodes <- part-fundamentals.md, chapter `connectors`.
274
258
 
@@ -1,6 +1,6 @@
1
- # Part 7 (c): Extend skill-map - build plugins (step library, `authoring-*` ids)
1
+ # Part 6 (c): Extend skill-map - build plugins (step library, `authoring-*` ids)
2
2
 
3
- Step bodies for the plugin-authoring chapters of Part 7.
3
+ Step bodies for the plugin-authoring chapters of Part 6.
4
4
  The SKILL.md orchestrator dispatches each `authoring-*` chapter id
5
5
  here; `settings-*` ids it dispatches to `part-settings.md`.
6
6
 
@@ -1,4 +1,4 @@
1
- # Part 8: The CLI in depth - step library
1
+ # Part 7: The CLI in depth - step library
2
2
 
3
3
  The deep-dive into the rest of the CLI: browsing verbs, ASCII graph + export, broken-ref issues, the `.sm` annotation consent prompt, and validating links to folders outside the scan scope. `pace: auto-advance` (walk straight into the next chapter's Announcement once one is marked done) and `preflight: seed` with the `prologue-built` snapshot: it self-seeds its own copy of the Part 0 demo fixture, so it works even if the campaign already replaced that fixture with the portfolio (see SKILL.md §Entering a part, the `cli` case). Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
4
4
 
@@ -13,7 +13,7 @@ sm show .claude/skills/demo-skill/SKILL.md
13
13
  sm check
14
14
  ```
15
15
 
16
- Expected: you see the 5 fixture nodes listed with their kind: `demo-skill` (skill), `demo-agent` (agent), `demo-command` (command), `notes/todo` (`markdown`, the catch-all per the `kinds` chapter), and `notes/demo-guideline` (`markdown` as well, the target of the hub's `references` link). `check` reads the persisted `scan_issues` table, it does NOT re-walk the filesystem. The fixture is clean (the connector / inspector chapters captured the latest state before Ctrl+C), so the verb prints `✓ No issues`. We will plant one in the `issues` chapter and watch the rule catch it after a fresh `sm scan`.
16
+ Expected: you see the 6 fixture nodes listed with their kind: `demo-skill` (skill), `demo-agent` (agent), `demo-command` (command), `notes/todo` (`markdown`, the catch-all per the `kinds` chapter), and the two guideline notes `notes/demo-guideline` and `notes/demo-guideline2` (both `markdown`, the hub's confidence pair: a faint `mentions` at 0.50 and a resolved `references` at 1.00). `check` reads the persisted `scan_issues` table, it does NOT re-walk the filesystem. The fixture is clean (the connector / inspector chapters captured the latest state before Ctrl+C), so the verb prints `✓ No issues`. We will plant one in the `issues` chapter and watch the rule catch it after a fresh `sm scan`.
17
17
 
18
18
  Mark `browse`: done.
19
19
 
@@ -63,50 +63,28 @@ sm check --json
63
63
 
64
64
  Expected: the error surfaces the dangling link from `notes/todo.md` to the non-existent `missing-page.md`. The `--analyzers` filter lets you focus on a single issue type; `--json` emits the structured payload (useful for CI / scripting). When done, the tester can leave the bullet in place or delete it, the rest of the deep-dive doesn't depend on it.
65
65
 
66
- If the tester asks about `sm orphans` vs `sm check`:
67
-
68
- - `sm check` reports broken-refs and other rule-driven issues
69
- (the deterministic catalog).
70
- - `sm orphans` is a **different scope**: auto-rename / orphan-node
71
- detection (a node whose file disappeared, or a candidate rename
72
- the kernel is still unsure about). Our fixture doesn't produce
73
- orphans of that kind, so `sm orphans` will print "No orphan /
74
- auto-rename issues", that's expected, not a bug.
75
-
76
66
  Mark `issues`: done.
77
67
 
78
68
  ## Chapter `annotations` - Annotations and the .sm consent prompt (~3 min)
79
69
 
80
- **Context**: every `.md` skill-map tracks gets a sibling **companion file** with extension `.sm` that carries **all of the tool's metadata about that markdown, so your `.md` stays clean and uncluttered**. Version, history, tags, annotations, anything that does not belong in the human-authored body lives in the `.sm`. The `.md` is content you write for Claude or humans; the `.sm` is bookkeeping the tool writes. They are ordinary source files, committed to git like everything else, and you'll encounter them often once you start working with the project.
70
+ **Context**: skill-map keeps each tracked `.md`'s metadata (version, history, tags, annotations) in a sibling **`.sm` companion file** so the `.md` stays clean, and the first time it writes one in a project it asks for consent (remembered in the gitignored `settings.local.json`). The Maintain part walks that consent flow in full; this chapter does not re-teach it. The CLI focus here is what Maintain does not cover: the **three sidecar verbs** and the `--yes` non-interactive switch. A tester who jumped straight here gets a one-line refresher in the demo below.
81
71
 
82
- The first time skill-map wants to write one in a new project it asks for your consent, it never touches your filesystem without permission. After you say yes, the choice is saved to the project's `settings.local.json` (part of your project config, gitignored) and the prompt never appears again.
83
-
84
- We'll demonstrate by creating an empty annotation scaffold for `notes/todo.md`. **Reset any prior consent state first** so the prompt actually appears (an earlier step may have flipped the flag without you noticing, in which case `sm sidecar annotate` would skip straight past the prompt and the lesson would not land):
72
+ Create a scaffold for `notes/todo.md` so there is a `.sm` on disk to talk about. **Reset any prior consent state first** so the prompt appears (an earlier step may have flipped the flag, in which case the verb skips straight past it):
85
73
 
86
74
  ```bash
87
75
  rm -f notes/todo.sm .skill-map/settings.local.json
88
76
  sm sidecar annotate notes/todo.md
89
77
  ```
90
78
 
91
- Expected: a short explanation paragraph appears in the terminal, followed by a `[Y/n]` prompt (capital Y = default Yes, you can just hit Enter). After accepting, `notes/todo.sm` appears next to `notes/todo.md` carrying an `identity:` block plus an empty `annotations: {}` block, and `.skill-map/settings.local.json` now contains `{ "allowEditSmFiles": true }`.
92
-
93
- ```bash
94
- cat notes/todo.sm
95
- cat .skill-map/settings.local.json
96
- ```
97
-
98
- **Why the prompt?** The choice is **per-user, per-project**: stored in the gitignored `settings.local.json` so each contributor consents independently and nothing about the choice travels via the repo. Once accepted, the flag stays set and skill-map will never ask again on this checkout (the next `sm sidecar annotate` or `sm bump` goes through silently). On a CI / non-interactive session, pass `--yes` to grant up-front.
79
+ Expected: a short explanation, then a `[Y/n]` prompt (capital Y = default Yes, just hit Enter). After accepting, `notes/todo.sm` appears with an `identity:` block plus an empty `annotations: {}`, and `.skill-map/settings.local.json` records `{ "allowEditSmFiles": true }` so it never asks again on this checkout (the choice is per-user, per-project, gitignored).
99
80
 
100
- If the tester asks about `sm bump` vs `sm sidecar annotate` vs `sm sidecar refresh`:
81
+ The part the CLI adds on top, the three sidecar verbs (all share that same consent gate):
101
82
 
102
- - `sm sidecar annotate` is the scaffold verb (creates a fresh
103
- `.sm`).
104
- - `sm bump <node>` is the day-to-day verb that increments the
105
- sidecar's version and refreshes its hashes, same consent gate.
106
- - `sm sidecar refresh <node>` is the hash-only update (no version
107
- bump).
83
+ - `sm sidecar annotate <node>` is the scaffold verb you just ran (creates a fresh `.sm`).
84
+ - `sm bump <node>` is the day-to-day verb: it increments the sidecar's version and refreshes its hashes.
85
+ - `sm sidecar refresh <node>` is the hash-only update (no version bump).
108
86
 
109
- If the tester ever asks about reserved names (e.g. `commands/help.md`): if they name a file after a built-in (`/help`, `/clear`, `/init`, `/agents`, `/model`, or one of the documented agent reservations like `general-purpose`), `sm check` surfaces a `reserved-name` warning. The vendor runtime ignores user-owned files that shadow its built-ins, so the warning is not a bug, it's skill-map telling the operator "Claude will never invoke this file; pick another name". Incoming links to the shadowed file resolve at confidence `0.1` instead of `1.0`, so the **Map** also visually de-emphasises them. Rename the file and the warning clears on the next scan.
87
+ And for automation: a CI / non-interactive session has no one to answer the `[Y/n]`, so pass `--yes` to grant consent up front (`sm sidecar annotate <node> --yes`).
110
88
 
111
89
  Mark `annotations`: done.
112
90
 
@@ -131,7 +109,6 @@ name: note-with-external-link
131
109
  description: |
132
110
  Demo note that links out to a sibling project (hijoB) sitting
133
111
  next to this one. Used to teach scan.referencePaths.
134
- tags: [demo, link-validation]
135
112
  ---
136
113
 
137
114
  # Note with external link
@@ -147,7 +124,6 @@ description: |
147
124
  Target of the cross-folder link. Lives outside hijoA's scan
148
125
  scope on purpose: that is precisely what scan.referencePaths
149
126
  is designed to bridge.
150
- tags: [demo, link-validation]
151
127
  ---
152
128
 
153
129
  # External spec
@@ -14,15 +14,6 @@ name: check-links
14
14
  description: |
15
15
  Validates the portfolio's internal links before publishing. Walks
16
16
  every generated page and reports any link whose target is missing.
17
- inputs:
18
- - name: root
19
- type: path
20
- description: Folder of generated pages to check.
21
- required: true
22
- outputs:
23
- - name: report
24
- type: string
25
- description: List of broken links, empty when all resolve.
26
17
  ---
27
18
 
28
19
  # check-links
@@ -55,9 +46,9 @@ Wait for confirmation. Mark `check-links`: done.
55
46
 
56
47
  On `agent-skills` / Antigravity there is no `command` kind, so skip this whole chapter and fold its purpose into the prose of the next one.
57
48
 
58
- Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them:
49
+ Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them. The frontmatter fence (`---`) MUST sit on column 0 with no leading spaces: present the block below exactly as written, and if the tester pastes it indented, have them strip the leading whitespace. An indented `---` does not parse as YAML, so the `publish` node would land without its `name` or `description`.
59
50
 
60
- > Create `.claude/commands/publish.md` with exactly this content:
51
+ > Create `.claude/commands/publish.md` with exactly this content (the first line is `---`, nothing before it):
61
52
 
62
53
  ```markdown
63
54
  ---
@@ -65,12 +56,6 @@ name: publish
65
56
  description: |
66
57
  Publishes the portfolio: runs the link check, hands off to the
67
58
  content editor for any last fixes, then follows the deploy runbook.
68
- shortcut: "ctrl+alt+p"
69
- args:
70
- - name: root
71
- type: path
72
- description: Folder of generated pages to publish.
73
- required: true
74
59
  ---
75
60
 
76
61
  # publish
@@ -99,6 +84,12 @@ Continue the tester message:
99
84
  > One node, three connectors, three link kinds. The harness is
100
85
  > starting to look like a real graph.
101
86
  >
87
+ > 💡 Tip: to tidy every node into a clean layout, click the
88
+ > **Re-arrange layout** button in the map toolbar (tooltip
89
+ > "Re-arrange the visible nodes"). Handy whenever the graph starts to
90
+ > look crowded. If you've dragged nodes by hand it asks for
91
+ > confirmation first, otherwise it just re-arranges.
92
+ >
102
93
  > Did the three arrows appear?
103
94
 
104
95
  Wait for confirmation. You MAY use `Read` on the file afterwards to verify it landed. Mark `publish`: done.
@@ -150,34 +141,43 @@ Wait for confirmation. You MAY use `Read` on the two files afterwards to verify
150
141
 
151
142
  ## Chapter `confidence` - How sure is each link (~3 min)
152
143
 
153
- **Context**: the connectors do not all look equally solid, and that is on purpose. Skill-map estimates how sure it is of every connection and shows that as opacity. Here we open the Inspector on a real harness node and read the per-link confidence numbers, mirroring the prologue's connectors beat but on the portfolio.
144
+ **Context**: skill-map estimates how sure it is of every connection and shows that as opacity. In this harness every link resolves to a real node, so they all read solid (1.00); the faint, low-confidence case is the one the tester met in the prologue (the bare `@demo-guideline` mention that had nothing to resolve to). Here we open the Inspector on a real harness node, read the all-solid numbers, and point back to that prologue contrast. Mirrors the prologue's connectors beat on the portfolio.
154
145
 
155
146
  No file edits in this chapter, pure observation on the graph the tester just built.
156
147
 
157
148
  Tell the tester:
158
149
 
159
150
  > Last beat of this part: how sure is skill-map about each connection?
160
- > Look closely at the **Map** and you'll notice the arrows are not all
161
- > equally solid. The more confident skill-map is that a link is real,
162
- > the more solid the arrow; the less sure, the more translucent.
151
+ > It estimates a **confidence** for every link and draws it as opacity:
152
+ > the surer a connection is real, the more solid the arrow; the less
153
+ > sure, the more translucent.
163
154
  >
164
155
  > Open the Inspector for the `publish` node (click it on the **Map**).
165
156
  > Scroll down to the **Connections** panel and read the **Outgoing**
166
- > rows. Each row shows the link kind and a confidence badge:
157
+ > rows. Each row shows the link kind and a confidence badge, and here
158
+ > every one reads **1.00**:
159
+ >
160
+ > - `publish -> docs/DEPLOY.md` (`references`) is a markdown link to a
161
+ > file that exists on disk, so skill-map is certain.
162
+ > - `publish -> content-editor` (`mentions`) resolves to the real
163
+ > content-editor agent, and `publish -> check-links` (`invokes`)
164
+ > resolves to the real check-links skill, so both are certain too.
167
165
  >
168
- > - `publish -> docs/DEPLOY.md` (`references`) reads **1.00** and looks
169
- > solid: it is a markdown link to a file that really exists on disk,
170
- > so skill-map is certain.
171
- > - `publish -> content-editor` (`mentions`) and `publish ->
172
- > check-links` (`invokes`) read high too, because each `@handle` and
173
- > `/slash` token resolves cleanly to a node that exists in your
174
- > harness.
166
+ > Your whole harness reads solid because every link lands on a real
167
+ > node, that is what a clean, fully wired graph looks like. So what
168
+ > does a *low*-confidence connector look like? You saw one back in the
169
+ > prologue: `@demo-guideline` was a bare `@`-mention pointing at a
170
+ > note, and a bare `@handle` only firmly resolves to an agent, so it
171
+ > had nothing to land on and stayed a soft guess at **0.50**, drawn
172
+ > translucent. The fix there was one character: `@demo-guideline2.md`,
173
+ > the same handle plus a `.md`, resolved to the real file and jumped to
174
+ > **1.00**.
175
175
  >
176
176
  > The number is the certainty, and the opacity on the canvas is just
177
177
  > that number drawn as transparency: a glance at the **Map** tells you
178
178
  > which connections are rock solid and which are skill-map's best
179
179
  > guess.
180
180
  >
181
- > Do you see the confidence badges in the Inspector?
181
+ > Do you see every badge reading 1.00 in the Inspector?
182
182
 
183
183
  Wait for confirmation. Mark `confidence`: done. Last chapter of the part: apply §Closing a part (the close names the part by its title and routes back to the menu; do NOT lead into the next part from here).