@skill-map/cli 0.53.3 → 0.53.4

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.
@@ -160,9 +160,19 @@ cd <cwd>
160
160
  ### 5. Write the universal files and show the menu
161
161
 
162
162
  Pre-flight does NOT pre-lay any part's fixture and does NOT auto-enter
163
- a part. It writes only the two files every part needs, then routes to
164
- the menu:
165
-
163
+ a part. It writes only the universal files every part needs, then
164
+ routes to the menu:
165
+
166
+ - `.skillmapignore` (block below). Universal, not a part fixture:
167
+ every part scans, and every part needs the tutorial's own machinery
168
+ kept out of the map (this skill's `.claude/skills/sm-tutorial/` dir,
169
+ `findings.md`, `tutorial-state.yml`, the CLI part's
170
+ `link-validation/`, and so on). Writing it here, once, before any
171
+ `sm init`, is what guarantees no part-entry can forget it on a
172
+ direct jump from the menu. `sm init` only writes `.skillmapignore`
173
+ when it is absent, so the tester's later `sm init` leaves this one
174
+ intact. Parts that need more append their own lines on entry (the
175
+ portfolio's `node_modules/` and `public/`).
166
176
  - `findings.md` (block below).
167
177
  - `tutorial-state.yml` (template below; it starts with `parts: {}`,
168
178
  empty, a part's entry is added the first time the tester picks it).
@@ -171,14 +181,30 @@ Then **route** per §Routing + menu in `_core.md`: render the **start
171
181
  menu** (numbered, Part 0 the prologue as option 1, the recommended
172
182
  first pick). The tester picks a part by number; that part's own
173
183
  `preflight` (see §Entering a part) lays its fixture when it begins.
174
- Part 0's demo fixture (the `demo-agent` + the demo `.skillmapignore`,
175
- blocks below) is laid by its `taught-init` entry, not here.
184
+ Part 0's demo fixture (the `demo-agent` block below) is laid by its
185
+ `taught-init` entry, not here.
176
186
 
177
187
  ## Fixture and state templates
178
188
 
179
- The `findings.md` and `tutorial-state.yml` here are universal (written
180
- in pre-flight); the `demo-agent.md` + the demo `.skillmapignore` are
181
- Part 0's fixture (laid by its `taught-init` entry).
189
+ The `.skillmapignore`, `findings.md`, and `tutorial-state.yml` here are
190
+ universal (written in pre-flight); the `demo-agent.md` is Part 0's
191
+ fixture (laid by its `taught-init` entry).
192
+
193
+ The **full Part 0 demo fixture** is the boot `demo-agent.md` above plus
194
+ the files the prologue's own chapters lay as taught steps, exactly this
195
+ set: `<provider_dir>/agents/demo-agent.md`,
196
+ `<provider_dir>/skills/demo-skill/`,
197
+ `<provider_dir>/commands/demo-command.md`, `notes/todo.md`,
198
+ `notes/demo-guideline.md`, `notes/private-credentials.md`. This is the
199
+ single source for that list. Four entry points delete exactly this set
200
+ 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
202
+ own fixture starts from a clean slate, plus start-over (§Menu, resume,
203
+ wrap-up). Part 8 `cli` is the inverse
204
+ consumer: its `prologue-built` seed *lays* this fixture (the
205
+ connector-chapter subset, without `notes/private-credentials.md`)
206
+ instead of deleting it, see `fixtures.md` §Seed snapshots. Keep the list
207
+ here in sync if a prologue chapter adds or drops a demo file.
182
208
 
183
209
  `<provider_dir>/agents/demo-agent.md`:
184
210
  ```markdown
@@ -284,45 +310,64 @@ When a part begins, honour its `preflight` from the manifest:
284
310
 
285
311
  - **`taught-init`** (Part 0): silently, before the tester's `sm init`
286
312
  in the `init` chapter, `Write` the demo fixture (the
287
- `<provider_dir>/agents/demo-agent.md` boot node + the demo
288
- `.skillmapignore`, both in the §Fixture blocks above), substituting
289
- `<provider_dir>` per detection. Write `.skillmapignore` BEFORE the
290
- tester runs `sm init` so the first scan never sees the tutorial's
291
- own files (`sm init` only writes that file when absent). The tester
292
- runs `sm init` themselves in the first chapter.
313
+ `<provider_dir>/agents/demo-agent.md` boot node, in the §Fixture
314
+ blocks above), substituting `<provider_dir>` per detection. The
315
+ universal `.skillmapignore` is already on disk from pre-flight, so
316
+ the first scan never sees the tutorial's own files; nothing to lay
317
+ here for it. The tester runs `sm init` themselves in the first
318
+ chapter (`sm init` only writes `.skillmapignore` when absent, so it
319
+ leaves the pre-flight one intact).
293
320
  - **`portfolio-init`** (Part 1 `project-kickoff`): the campaign's
294
321
  real project begins. Backstage, before the tester's `sm init` in
295
322
  the `kickoff` chapter: (1) if the prologue ran first in this dir,
296
- clear its demo fixture so the map starts clean, delete ONLY the
297
- Part 0 fixture files (`<provider_dir>/agents/demo-agent.md`,
298
- `<provider_dir>/skills/demo-skill/`,
299
- `<provider_dir>/commands/demo-command.md`, `notes/todo.md`,
300
- `notes/demo-guideline.md`, `notes/private-credentials.md`) plus the
323
+ clear its demo fixture so the map starts clean, delete ONLY the full
324
+ Part 0 demo fixture set (§Fixture and state templates) plus the
301
325
  stale `.skill-map/` DB (a fresh `sm init` rebuilds it), never the
302
326
  tester's own files; (2) `Write` the portfolio fixture from
303
327
  `references/fixtures.md` (the Express skeleton + the handbook
304
- `AGENTS.md`); (3) ensure `.skillmapignore` carries the portfolio
305
- additions (`node_modules/`, `public/`). The tester runs `sm init`
328
+ `AGENTS.md`); (3) append the portfolio additions (`node_modules/`,
329
+ `public/`) to the universal `.skillmapignore` pre-flight already
330
+ wrote (its tutorial internals are already there). The tester runs `sm init`
306
331
  themselves in the first chapter. (The later campaign parts use
307
332
  `preflight: seed` to fast-forward into them directly, see the `seed`
308
333
  case below; `portfolio-init` is just Part 1's flavour of that,
309
334
  handling the Part 0 to Part 1 transition.)
310
- - **`backstage-init`** (Part 7 `extend`): silently, with no
311
- narration: run `sm init --no-scan` from the cwd, then `Edit` the
312
- freshly created `.skillmapignore` to append the tutorial's
313
- internal entries (the `sm-tutorial.md` / `findings.md` /
314
- `tutorial-state.yml` / skill-dir block above), then `Write` the
315
- part's fixture (read `references/fixtures.md` for the verbatim
316
- `master-agent` / `master-skill` / `notes/ideas` files; skip kinds
317
- the provider doesn't claim). If `sm init --no-scan` fails because
318
- the dir was already initialised by an earlier part, that is fine:
319
- the DB already exists, skip the init and just ensure the fixture
335
+ - **`backstage-init`** (Part 7 `extend`): the part teaches plugins on
336
+ its own **master fixture**, distinct from both the demo and the
337
+ portfolio, so on entry make the master fixture the only one on disk.
338
+ Silently, with no narration: (1) clear whatever prior-part fixture is
339
+ present so the master map starts clean (never the tester's own files;
340
+ the universal `.skillmapignore` stays):
341
+ - Part 0 demo fixture present (the tester came from the prologue) →
342
+ delete the full Part 0 demo fixture set (§Fixture and state
343
+ templates);
344
+ - portfolio fixture present instead (the tester ran the campaign)
345
+ delete everything `portfolio-init` and the campaign chapters lay
346
+ (see `fixtures.md` §Portfolio fixture + §Seed snapshots);
347
+ - in either of those cases also drop the stale `.skill-map/` DB so a
348
+ fresh init rebuilds it.
349
+ (2) run `sm init --no-scan` from the cwd (the universal
350
+ `.skillmapignore` from pre-flight is already on disk, so init leaves
351
+ it intact and the tutorial's own files stay out of the scan); (3)
352
+ `Write` the part's fixture (read `references/fixtures.md` for the
353
+ verbatim `master-agent` / `master-skill` / `notes/ideas` files; skip
354
+ 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
356
+ re-entry), that is fine: skip the init and just ensure the fixture
320
357
  files are present.
321
- - **`reuse`** (Part 8 `cli`): assumes the prologue fixture and
322
- `.skill-map/` already exist; nothing to lay. The menu offers Part 8
323
- only once its `prereq` (`fundamentals`) is done, so the state is
324
- there. If `.skill-map/` is somehow missing, point the tester back to
325
- the prologue rather than re-initialising mid-part.
358
+ - **`seed: prologue-built`** (Part 8 `cli`): the part reads the **Part 0
359
+ demo fixture**, NOT the cumulative portfolio, so on entry make that
360
+ fixture the one on disk. Read the state, then:
361
+ - Demo fixture already present (the tester came straight from the
362
+ prologue) just `sm scan`, nothing to lay.
363
+ - **Portfolio** fixture present instead (the tester ran the campaign)
364
+ → clear it first (the inverse of `portfolio-init`: delete the
365
+ portfolio fixture, everything `portfolio-init` and the campaign
366
+ chapters lay, see `fixtures.md` §Portfolio fixture + §Seed snapshots,
367
+ plus the stale `.skill-map/` DB; never the tester's own files), then
368
+ lay the `prologue-built` snapshot from `fixtures.md` (§Seed
369
+ snapshots), `sm init`, `sm scan`.
370
+ - Nothing there → lay the snapshot, `sm init`, `sm scan`.
326
371
  - **`seed`** (the campaign parts `connect-harness` / `run-harness` /
327
372
  `maintain` / `mcp` / `live-site`): the part builds on the accumulating portfolio
328
373
  harness, but the tester may have jumped straight here from the menu.
@@ -331,13 +376,22 @@ When a part begins, honour its `preflight` from the manifest:
331
376
  → reuse the accumulated state; an `sm scan` to refresh is enough,
332
377
  nothing to lay.
333
378
  - Else → **fast-forward, silently** (backstage, do not narrate the
334
- plumbing): lay the part's `seed` snapshot from
379
+ plumbing): first, if the prologue ran first in this dir, clear the
380
+ full Part 0 demo fixture set (§Fixture and state templates) so the
381
+ seeded campaign map does not carry the prologue's demo nodes (the
382
+ `sm scan` below reconciles the removed files out of the DB). Then
383
+ lay the part's `seed` snapshot from
335
384
  `references/fixtures.md` (§Seed snapshots) by following its
336
385
  checklist, copy each file's canonical content from the chapter the
337
386
  row names, apply the `EDIT` rows on top, substituting
338
387
  `<provider_dir>` and skipping provider-unsupported kinds per
339
- `_core.md`. Then run `sm init` if `.skill-map/` is missing, then
340
- `sm scan` so the map reflects the seeded harness. Mark the skipped
388
+ `_core.md`. The snapshot's `.skillmapignore` additions
389
+ (`node_modules/`, `public/`) are appended to the universal
390
+ `.skillmapignore` pre-flight already wrote, so the tutorial's own
391
+ `.claude/skills/sm-tutorial/` files stay out of the scan even on a
392
+ direct jump here. Then run `sm init` if `.skill-map/` is missing
393
+ (it will not overwrite that `.skillmapignore`), then `sm scan` so
394
+ the map reflects the seeded harness. Mark the skipped
341
395
  predecessor campaign parts `skipped` in the state (they stay in the
342
396
  menu for later). Then emit exactly ONE tester-facing line:
343
397
 
@@ -359,18 +413,15 @@ All three are specified in `_core.md`:
359
413
  the **numbered start menu** (Part 0 is option 1, the recommended
360
414
  first pick); the menu (the ToC from `_manifest.yml`, numbered,
361
415
  completed parts ticked, `planned` parts hidden, `prereq` gating only
362
- the parts that have no `seed`) is the entry point on the first
416
+ seedless parts, none today since Part 8 `cli` now self-seeds) is the
417
+ entry point on the first
363
418
  invocation and after every part closes / on resume. Render it with
364
419
  the format in `_core.md` §Menu format.
365
420
  - **Resume / restart**: §Resume / restart. On start-over, the exact
366
421
  wipe list is whatever the tester's parts actually created:
367
422
  `tutorial-state.yml`, `findings.md`, `.skillmapignore`,
368
- `.skill-map/`, the Part 0 fixture
369
- (`<provider_dir>/agents/demo-agent.md`,
370
- `<provider_dir>/skills/demo-skill/`,
371
- `<provider_dir>/commands/demo-command.md`, `notes/todo.md`,
372
- `notes/demo-guideline.md`, `notes/private-credentials.md`), the
373
- Part 7 fixture if `extend` ran
423
+ `.skill-map/`, the full Part 0 demo fixture set (§Fixture and state
424
+ templates), the Part 7 fixture if `extend` ran
374
425
  (`<provider_dir>/agents/master-agent.md`,
375
426
  `<provider_dir>/skills/master-skill/`, `notes/ideas.md`,
376
427
  `.skill-map/plugins/`), `link-validation/` if the CLI part ran,
@@ -149,9 +149,10 @@ first kind quoted, the second kind never.
149
149
  pre-flight only (both silent, no narration):
150
150
  - `sm version` ONCE to verify the install.
151
151
  - `sm init --no-scan` ONCE for parts whose manifest entry is
152
- `preflight: backstage-init`, to provision `.skill-map/` and the
153
- bundled `.skillmapignore` BEFORE any scan, so you can append the
154
- tutorial's internal entries before the scanner sees the fixture.
152
+ `preflight: backstage-init`, to provision `.skill-map/` BEFORE
153
+ any scan. The universal `.skillmapignore` written in pre-flight
154
+ already keeps the tutorial's own files out, so there is nothing
155
+ to append here.
155
156
  Parts with `preflight: taught-init` (e.g. Part 0) do NOT run
156
157
  `sm init` in pre-flight, the tester runs it as the first taught
157
158
  step. You also DO NOT run `sm plugins create` on their behalf;
@@ -162,10 +163,10 @@ first kind quoted, the second kind never.
162
163
  `Read` files to verify what the tester modified. Everything else
163
164
  the tester runs.
164
165
  2. **Configuration files have two-mode access.**
165
- - **Backstage setup (you DO edit)**: appending the tutorial's
166
- internal entries to `.skillmapignore` right after a backstage
167
- `sm init --no-scan`; writing the state file; writing fixture
168
- `.md` files.
166
+ - **Backstage setup (you DO edit)**: writing the universal
167
+ `.skillmapignore` in pre-flight and appending a part's own
168
+ additions on entry (the portfolio's `node_modules/` / `public/`);
169
+ writing the state file; writing fixture `.md` files.
169
170
  - **Teach moment (you DO NOT edit)**: any change to
170
171
  `.skill-map/settings.json`, `.skill-map/settings.local.json`,
171
172
  `.skillmapignore`, or `.gitignore` that is part of a chapter
@@ -292,10 +293,11 @@ For every chapter:
292
293
  §Menu format).
293
294
  - **Which parts to list**: parts in `order`, `status: active` only
294
295
  (`planned` parts are hidden). A part with a `seed` (the campaign
295
- parts) is always shown, even out of order, its `preflight: seed`
296
- fast-forwards the project into it (SKILL.md §Entering a part). A
297
- part with a `prereq` but NO `seed` (Part 8 `cli`) is shown only once
298
- its `prereq` is `done`.
296
+ parts plus Part 8 `cli`) is always shown, even out of order, its
297
+ `preflight: seed` fast-forwards the project into it (SKILL.md
298
+ §Entering a part). A part with a `prereq` but NO `seed` would be
299
+ 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).
299
301
  - **After the tester picks**: walk that part; when it ends, run
300
302
  §Closing a part (a tester-facing close, then this menu).
301
303
  - **Adding content** is data-only: a new chapter in a part (or a new
@@ -15,11 +15,12 @@
15
15
  # step_files list form when a part spans several files; dispatch
16
16
  # by chapter-id prefix.
17
17
  # pace per-step | auto-advance (see _core.md per-step cycle).
18
- # preflight taught-init | backstage-init | portfolio-init | seed |
19
- # reuse (see _core.md rule #1 + SKILL.md §Entering a part).
20
- # seed which cumulative snapshot to fast-forward to when this
21
- # part is entered out of order (see fixtures.md §Seed
22
- # snapshot:*). Campaign parts only.
18
+ # preflight taught-init | backstage-init | portfolio-init | seed
19
+ # (see _core.md rule #1 + SKILL.md §Entering a part).
20
+ # seed which snapshot to fast-forward to when this part is
21
+ # entered out of order (see fixtures.md §Seed snapshot:*).
22
+ # Campaign parts use a cumulative portfolio snapshot;
23
+ # Part 8 `cli` uses the standalone `prologue-built` demo.
23
24
  # prereq recommended predecessor. Gates the menu ONLY for a part
24
25
  # with NO `seed`; a seedable part is always shown (its
25
26
  # seed bridges the gap, predecessors get marked `skipped`).
@@ -84,8 +85,9 @@ parts:
84
85
  title: "The CLI in depth"
85
86
  step_file: part-cli.md
86
87
  pace: auto-advance
87
- preflight: reuse # reuses the fundamentals fixture + DB
88
- prereq: fundamentals # menu offers this only after Part 0
88
+ preflight: seed # self-seeds the Part 0 demo fixture
89
+ seed: prologue-built # the prologue demo fixture (not the cumulative portfolio)
90
+ prereq: fundamentals # recommended predecessor; cli self-seeds, so it is always shown
89
91
  status: active
90
92
  chapters:
91
93
  - id: browse ; title: "list / show / check" ; est_min: 3
@@ -1,10 +1,22 @@
1
1
  # Fixture templates
2
2
 
3
- Fixtures the orchestrator lays for the auto-fixtured parts. Two sets
4
- today: the **master fixture** (Part 7, "Extend skill-map",
5
- `backstage-init`) right below, and the **portfolio fixture** (Part 1,
6
- "The project from zero", `portfolio-init`) at the end of this file.
7
- Read the set for the part being entered.
3
+ Fixtures the orchestrator lays for the auto-fixtured parts. Two full
4
+ templates live here: the **master fixture** (Part 7, "Extend
5
+ skill-map", `backstage-init`) right below, and the **portfolio
6
+ fixture** (Part 1, "The project from zero", `portfolio-init`) at the
7
+ end of this file. The **Part 0 demo fixture** is not templated here:
8
+ its content lives in `SKILL.md` (§Fixture and state templates) and
9
+ `part-fundamentals.md`, and the `prologue-built` seed snapshot below
10
+ just points at those. Read the set for the part being entered.
11
+
12
+ **Authoring note (command fixtures).** A `command` node's H1 is a plain
13
+ title (`# publish`), never the slash form (`# /publish`). The `slash`
14
+ extractor reads a `/name` token anywhere in the body, the H1 included,
15
+ as an `invoke`, so `# /publish` makes the command invoke itself and
16
+ `sm check` emits a spurious `core/link-self-loop` the tester has no
17
+ context for. Holds for every command fixture wherever it is defined
18
+ (today: the prologue `demo-command`, the `publish` command, and the
19
+ `reserved` chapter's `init`).
8
20
 
9
21
  ## Master fixture (Part 7): layout (per provider)
10
22
 
@@ -205,15 +217,16 @@ app.listen(port, () => console.log(`Portfolio live at http://localhost:${port}`)
205
217
 
206
218
  ### `.skillmapignore` additions
207
219
 
208
- Append to the portfolio `.skillmapignore` (on top of the tutorial
209
- internals from `SKILL.md`): `node_modules/` (the Express install) and
210
- `public/` (generated HTML, not part of the harness graph).
220
+ Append to the universal `.skillmapignore` (written in pre-flight, see
221
+ `SKILL.md`): `node_modules/` (the Express install) and `public/`
222
+ (generated HTML, not part of the harness graph).
211
223
 
212
- ## Seed snapshots (for `preflight: seed`, jumping into a campaign part)
224
+ ## Seed snapshots (for `preflight: seed`)
213
225
 
214
- When the orchestrator enters a campaign part out of order (its
215
- predecessors are not `done`), it fast-forwards the project by laying
216
- the snapshot below, then `sm init` (if `.skill-map/` is missing) +
226
+ 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
228
+ demo fixture is not the one on disk), it fast-forwards the project by
229
+ laying the snapshot below, then `sm init` (if `.skill-map/` is missing) +
217
230
  `sm scan`. These are **checklists, not content**: each row names a file
218
231
  and the chapter that holds its canonical content. Lay each file by
219
232
  copying the content from the named chapter (substitute `<provider_dir>`
@@ -243,6 +256,19 @@ Everything in `harness-built`, PLUS the Part 2 wiring:
243
256
  7. EDIT `AGENTS.md`: append the two hub bullets (mention `@content-editor`, invoke `/publish`) <- part-connect-harness.md, chapter `links`.
244
257
  8. EDIT `<provider_dir>/agents/content-editor.md`: add the `[style guide](../../docs/STYLE.md)` line <- part-connect-harness.md, chapter `links`.
245
258
 
246
- After laying a snapshot the map matches the state a tester would have at
247
- the END of the part just before the one being entered.
259
+ After laying a campaign snapshot the map matches the state a tester would
260
+ have at the END of the part just before the one being entered.
261
+
262
+ ### Seed snapshot: `prologue-built` (Part 8 `cli`)
263
+
264
+ 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
266
+ 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
268
+ fixture from the portfolio, entry first resets any portfolio on disk
269
+ (see SKILL.md §Entering a part, the `cli` case).
270
+
271
+ 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`.
248
274
 
@@ -11,11 +11,11 @@ view-slot, and confirm the contribution lands in the UI.
11
11
 
12
12
  ## Precondition check
13
13
 
14
- Verify that `.skill-map/` exists in the cwd (pre-flight step 4 of
15
- the `SKILL.md` orchestrator ran `sm init --no-scan` and appended
16
- the master-tutorial's internal entries to `.skillmapignore`, so
17
- this is the expected state regardless of whether the tester ran
18
- the plugins chapters first). If `.skill-map/` is missing, the fixture
14
+ Verify that `.skill-map/` exists in the cwd (the `extend` part's
15
+ `backstage-init` preflight ran `sm init --no-scan` to provision it;
16
+ the universal `.skillmapignore` from pre-flight keeps the tutorial's
17
+ own files out of the scan, so this is the expected state regardless
18
+ of whether the tester ran the plugins chapters first). If `.skill-map/` is missing, the fixture
19
19
  is corrupted: surface the mismatch ("the project bootstrap is
20
20
  gone, re-invoke the tutorial from an empty dir") and stop.
21
21
 
@@ -1,6 +1,6 @@
1
1
  # Part 8: The CLI in depth - step library
2
2
 
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 it reuses the fundamentals fixture and DB built in Part 0 (no fresh fixture of its own). Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
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
 
5
5
  ## Chapter `browse` - list / show / check (~3 min)
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Part 2: Connect the harness (step library, `connect-harness`)
2
2
 
3
- This is the wiring part. Part 1 grew a small set of standalone nodes around the handbook (the portfolio harness); here the tester turns that scatter of dots into a connected graph: a link checker, a publish command that pulls three pieces together, the handbook becoming a real hub, and a close-up on how sure skill-map is of each connection. `pace: auto-advance` (walk straight into the next chapter once one is marked done), `preflight: reuse` (it builds on the portfolio harness from Part 1, no fresh fixture of its own). Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
3
+ This is the wiring part. Part 1 grew a small set of standalone nodes around the handbook (the portfolio harness); here the tester turns that scatter of dots into a connected graph: a link checker, a publish command that pulls three pieces together, the handbook becoming a real hub, and a close-up on how sure skill-map is of each connection. `pace: auto-advance` (walk straight into the next chapter once one is marked done), `preflight: seed` (it builds on the portfolio harness from Part 1, reusing the accumulated state when its predecessors are done, no fresh fixture of its own). Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
4
4
 
5
5
  ## Chapter `check-links` - The link checker (~3 min)
6
6
 
@@ -73,7 +73,7 @@ args:
73
73
  required: true
74
74
  ---
75
75
 
76
- # /publish
76
+ # publish
77
77
 
78
78
  The one command you run when the site is ready to go out.
79
79
 
@@ -1,6 +1,6 @@
1
1
  # Part 4: Maintain the site (step library, `maintain`)
2
2
 
3
- This is the upkeep part. The harness from Part 2 is wired and clean; real projects drift, links break, drafts pile up, names collide. Here the tester breaks something on purpose and fixes it, meets the analyzer catalogue that catches those problems, finds an orphan nobody links to, clears a reserved-name warning, and learns the `.sm` companion files that carry the tool's bookkeeping. `pace: auto-advance` (walk straight into the next chapter once one is marked done), `preflight: reuse` (it builds on the portfolio harness from Parts 1 and 2, no fresh fixture of its own). Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
3
+ This is the upkeep part. The harness from Part 2 is wired and clean; real projects drift, links break, drafts pile up, names collide. Here the tester breaks something on purpose and fixes it, meets the analyzer catalogue that catches those problems, finds an orphan nobody links to, clears a reserved-name warning, and learns the `.sm` companion files that carry the tool's bookkeeping. `pace: auto-advance` (walk straight into the next chapter once one is marked done), `preflight: seed` (it builds on the portfolio harness from Parts 1 and 2, reusing the accumulated state when its predecessors are done, no fresh fixture of its own). Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
4
4
 
5
5
  ## Chapter `broken-ref` - A link breaks (~3 min)
6
6
 
@@ -12,6 +12,21 @@ This chapter is the tester's hands the whole way (renaming and editing their own
12
12
  sm
13
13
  ```
14
14
 
15
+ This part is the first time the live server and one-off `sm` commands run side by side, so give the tester the third-terminal heads-up below (substitute `<cwd>` with the tester's actual cwd, same substitution as every other `<cwd>` mention):
16
+
17
+ > ⚠️ Heads up: from here you run one-off commands (`sm scan`, `sm
18
+ > check`, the `mv` below) **while the `sm` server keeps running**. The
19
+ > server holds its terminal until you Ctrl+C it, so open a **third
20
+ > terminal** and anchor it to this same folder, that is where every
21
+ > one-off command from here on goes:
22
+
23
+ ```bash
24
+ cd <cwd>
25
+ ```
26
+
27
+ > Three terminals now: this chat, the one running the live `sm` server
28
+ > (leave it alone), and this new one for the one-off commands.
29
+
15
30
  > Open the URL `sm` prints, same as before. Now break something on
16
31
  > purpose. Rename your deploy runbook from `docs/DEPLOY.md` to
17
32
  > `docs/DEPLOYMENT.md` (just change the filename, leave the contents
@@ -167,7 +182,7 @@ args:
167
182
  required: true
168
183
  ---
169
184
 
170
- # /init
185
+ # init
171
186
 
172
187
  Sets up the empty folders a new portfolio needs.
173
188
  ```
@@ -13,9 +13,10 @@ which verbs reach which surface.
13
13
  Before announcing the first step, verify the fixture is initialised
14
14
  (the cwd has `.claude/agents/master-agent.md`,
15
15
  `.claude/skills/master-skill/SKILL.md`, AND `.skill-map/` with
16
- `settings.json` and `skill-map.db`). Pre-flight already ran
17
- `sm init --no-scan` and appended the master entries to
18
- `.skillmapignore`. If any of that is missing, surface the
16
+ `settings.json` and `skill-map.db`). The `extend` part's
17
+ `backstage-init` preflight ran `sm init --no-scan` to provision it;
18
+ the universal `.skillmapignore` from pre-flight keeps the tutorial's
19
+ own files out of the scan. If any of that is missing, surface the
19
20
  bootstrap mismatch ("tutorial-state.yml says we are running, but
20
21
  the bootstrap is missing. Re-run the tutorial from an empty dir or
21
22
  restore the files.") and stop.
@@ -14,9 +14,10 @@ system and the `sm config` verbs.
14
14
  ## Precondition check
15
15
 
16
16
  Same as the authoring chapters: `.skill-map/` must exist in the
17
- cwd (the orchestrator's backstage-init pre-flight ran `sm init
18
- --no-scan` and appended the tutorial's internal entries to
19
- `.skillmapignore`, so this is the expected state). If
17
+ cwd (the `extend` part's `backstage-init` preflight ran `sm init
18
+ --no-scan` to provision it; the universal `.skillmapignore` from
19
+ pre-flight keeps the tutorial's own files out of the scan, so this
20
+ is the expected state). If
20
21
  `.skill-map/` is missing, surface the bootstrap mismatch and
21
22
  stop, do not try to re-init mid-chapter.
22
23
 
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // cli/entry.ts
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="542dae21-a4ed-50bb-ad3c-62e84e47b380")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="888d57e8-17f0-5013-89d1-f60f3ef2828b")}catch(e){}}();
4
4
  import { existsSync as existsSync33 } from "fs";
5
5
  import { Builtins, Cli as Cli2 } from "clipanion";
6
6
 
@@ -246,7 +246,7 @@ function bucketByKind(kind, instance, bag) {
246
246
  // package.json
247
247
  var package_default = {
248
248
  name: "@skill-map/cli",
249
- version: "0.53.3",
249
+ version: "0.53.4",
250
250
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
251
251
  license: "MIT",
252
252
  type: "module",
@@ -30251,4 +30251,4 @@ function resolveBareDefault() {
30251
30251
  process.exit(ExitCode.Error);
30252
30252
  }
30253
30253
  //# sourceMappingURL=cli.js.map
30254
- //# debugId=542dae21-a4ed-50bb-ad3c-62e84e47b380
30254
+ //# debugId=888d57e8-17f0-5013-89d1-f60f3ef2828b
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // kernel/i18n/registry.texts.ts
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="89adb52b-2657-5932-aa07-61e08ebbf98b")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="66543317-554b-53e5-b2d4-5ed32dfdc81a")}catch(e){}}();
4
4
  var REGISTRY_TEXTS = {
5
5
  duplicateExtension: "Extension already registered: {{kind}}:{{qualifiedId}}",
6
6
  unknownKind: "Unknown extension kind: {{kind}}",
@@ -102,7 +102,7 @@ import { Tiktoken as Tiktoken2 } from "js-tiktoken/lite";
102
102
  // package.json
103
103
  var package_default = {
104
104
  name: "@skill-map/cli",
105
- version: "0.53.3",
105
+ version: "0.53.4",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -3632,4 +3632,4 @@ export {
3632
3632
  runScanWithRenames
3633
3633
  };
3634
3634
  //# sourceMappingURL=index.js.map
3635
- //# debugId=89adb52b-2657-5932-aa07-61e08ebbf98b
3635
+ //# debugId=66543317-554b-53e5-b2d4-5ed32dfdc81a
@@ -1,6 +1,6 @@
1
1
  // kernel/i18n/registry.texts.ts
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="eda01250-1ec1-5934-9fb3-c95548eccf56")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3034c153-d87d-57ef-9e51-8770d99ad465")}catch(e){}}();
4
4
  var REGISTRY_TEXTS = {
5
5
  duplicateExtension: "Extension already registered: {{kind}}:{{qualifiedId}}",
6
6
  unknownKind: "Unknown extension kind: {{kind}}",
@@ -102,7 +102,7 @@ import { Tiktoken as Tiktoken2 } from "js-tiktoken/lite";
102
102
  // package.json
103
103
  var package_default = {
104
104
  name: "@skill-map/cli",
105
- version: "0.53.3",
105
+ version: "0.53.4",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -3632,4 +3632,4 @@ export {
3632
3632
  runScanWithRenames
3633
3633
  };
3634
3634
  //# sourceMappingURL=index.js.map
3635
- //# debugId=eda01250-1ec1-5934-9fb3-c95548eccf56
3635
+ //# debugId=3034c153-d87d-57ef-9e51-8770d99ad465