@skill-map/cli 0.53.2 → 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.
Files changed (27) hide show
  1. package/dist/cli/tutorial/sm-tutorial/SKILL.md +112 -52
  2. package/dist/cli/tutorial/sm-tutorial/references/_core.md +65 -15
  3. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +31 -16
  4. package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +50 -27
  5. package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +7 -7
  6. package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +2 -2
  7. package/dist/cli/tutorial/sm-tutorial/references/part-connect-harness.md +14 -11
  8. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +16 -22
  9. package/dist/cli/tutorial/sm-tutorial/references/part-live-site.md +111 -112
  10. package/dist/cli/tutorial/sm-tutorial/references/part-maintain.md +19 -4
  11. package/dist/cli/tutorial/sm-tutorial/references/part-mcp.md +4 -4
  12. package/dist/cli/tutorial/sm-tutorial/references/part-plugins.md +5 -4
  13. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +11 -13
  14. package/dist/cli/tutorial/sm-tutorial/references/part-run-harness.md +155 -0
  15. package/dist/cli/tutorial/sm-tutorial/references/part-settings.md +6 -5
  16. package/dist/cli.js +3 -3
  17. package/dist/index.js +3 -3
  18. package/dist/kernel/index.js +3 -3
  19. package/dist/ui/{chunk-OFDQMBSJ.js → chunk-4CXAL43H.js} +1 -1
  20. package/dist/ui/{chunk-IUZM6XLN.js → chunk-HWQTV6ZL.js} +1 -1
  21. package/dist/ui/{chunk-UHNBYD6J.js → chunk-JQE4N6JU.js} +3 -3
  22. package/dist/ui/{chunk-EQ72PEHT.js → chunk-NBXEOYS4.js} +1 -1
  23. package/dist/ui/{chunk-UV5Q423S.js → chunk-R2IJXS47.js} +3 -3
  24. package/dist/ui/index.html +2 -2
  25. package/dist/ui/{main-TXPLL7VU.js → main-ZXOCLPLS.js} +3 -3
  26. package/dist/ui/{styles-Q4NCOJQY.css → styles-L6FZYH7X.css} +1 -1
  27. package/package.json +1 -1
@@ -132,18 +132,27 @@ Apply §Provider detection from `_core.md`. Persist the result into
132
132
 
133
133
  ### 4. Two-terminals heads-up (one time)
134
134
 
135
+ Agent-only: in the `cd` block below, substitute `<cwd>` with the
136
+ tester's actual cwd (the absolute path of the folder the tutorial is
137
+ running in) so the command is copy-pasteable, same substitution as
138
+ every other `<cwd>` mention.
139
+
135
140
  > ⚠️ Heads up: throughout the tutorial you'll be using **two
136
141
  > terminals**.
137
142
  >
138
143
  > 1. **This terminal**: the one you're using right now to talk to
139
144
  > me (Claude Code). I show you the commands, you paste me the
140
145
  > output, and I verify.
141
- > 2. **A second terminal**: open it now (new window or tab). In it
142
- > run `cd <cwd>` so it's anchored **exactly to this folder**.
146
+ > 2. **A second terminal**: open it now (new window or tab), then run
147
+ > the command below so it's anchored **exactly to this folder**.
143
148
  > That's where you copy and paste every `sm` command.
144
- >
149
+
150
+ ```bash
151
+ cd <cwd>
152
+ ```
153
+
145
154
  > Keep both terminals open until the end. If you accidentally close
146
- > the second one, reopen it and `cd <cwd>` again.
155
+ > the second one, reopen it and run that `cd` again.
147
156
  >
148
157
  > Got the second terminal open and anchored to the folder? Confirm
149
158
  > before we move on.
@@ -151,9 +160,19 @@ Apply §Provider detection from `_core.md`. Persist the result into
151
160
  ### 5. Write the universal files and show the menu
152
161
 
153
162
  Pre-flight does NOT pre-lay any part's fixture and does NOT auto-enter
154
- a part. It writes only the two files every part needs, then routes to
155
- the menu:
156
-
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/`).
157
176
  - `findings.md` (block below).
158
177
  - `tutorial-state.yml` (template below; it starts with `parts: {}`,
159
178
  empty, a part's entry is added the first time the tester picks it).
@@ -162,14 +181,30 @@ Then **route** per §Routing + menu in `_core.md`: render the **start
162
181
  menu** (numbered, Part 0 the prologue as option 1, the recommended
163
182
  first pick). The tester picks a part by number; that part's own
164
183
  `preflight` (see §Entering a part) lays its fixture when it begins.
165
- Part 0's demo fixture (the `demo-agent` + the demo `.skillmapignore`,
166
- 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.
167
186
 
168
187
  ## Fixture and state templates
169
188
 
170
- The `findings.md` and `tutorial-state.yml` here are universal (written
171
- in pre-flight); the `demo-agent.md` + the demo `.skillmapignore` are
172
- 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.
173
208
 
174
209
  `<provider_dir>/agents/demo-agent.md`:
175
210
  ```markdown
@@ -275,60 +310,88 @@ When a part begins, honour its `preflight` from the manifest:
275
310
 
276
311
  - **`taught-init`** (Part 0): silently, before the tester's `sm init`
277
312
  in the `init` chapter, `Write` the demo fixture (the
278
- `<provider_dir>/agents/demo-agent.md` boot node + the demo
279
- `.skillmapignore`, both in the §Fixture blocks above), substituting
280
- `<provider_dir>` per detection. Write `.skillmapignore` BEFORE the
281
- tester runs `sm init` so the first scan never sees the tutorial's
282
- own files (`sm init` only writes that file when absent). The tester
283
- 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).
284
320
  - **`portfolio-init`** (Part 1 `project-kickoff`): the campaign's
285
321
  real project begins. Backstage, before the tester's `sm init` in
286
322
  the `kickoff` chapter: (1) if the prologue ran first in this dir,
287
- clear its demo fixture so the map starts clean, delete ONLY the
288
- Part 0 fixture files (`<provider_dir>/agents/demo-agent.md`,
289
- `<provider_dir>/skills/demo-skill/`,
290
- `<provider_dir>/commands/demo-command.md`, `notes/todo.md`,
291
- `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
292
325
  stale `.skill-map/` DB (a fresh `sm init` rebuilds it), never the
293
326
  tester's own files; (2) `Write` the portfolio fixture from
294
327
  `references/fixtures.md` (the Express skeleton + the handbook
295
- `AGENTS.md`); (3) ensure `.skillmapignore` carries the portfolio
296
- 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`
297
331
  themselves in the first chapter. (The later campaign parts use
298
332
  `preflight: seed` to fast-forward into them directly, see the `seed`
299
333
  case below; `portfolio-init` is just Part 1's flavour of that,
300
334
  handling the Part 0 to Part 1 transition.)
301
- - **`backstage-init`** (Part 6 `extend`): silently, with no
302
- narration: run `sm init --no-scan` from the cwd, then `Edit` the
303
- freshly created `.skillmapignore` to append the tutorial's
304
- internal entries (the `sm-tutorial.md` / `findings.md` /
305
- `tutorial-state.yml` / skill-dir block above), then `Write` the
306
- part's fixture (read `references/fixtures.md` for the verbatim
307
- `master-agent` / `master-skill` / `notes/ideas` files; skip kinds
308
- the provider doesn't claim). If `sm init --no-scan` fails because
309
- the dir was already initialised by an earlier part, that is fine:
310
- 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
311
357
  files are present.
312
- - **`reuse`** (Part 7 `cli`): assumes the prologue fixture and
313
- `.skill-map/` already exist; nothing to lay. The menu offers Part 7
314
- only once its `prereq` (`fundamentals`) is done, so the state is
315
- there. If `.skill-map/` is somehow missing, point the tester back to
316
- the prologue rather than re-initialising mid-part.
317
- - **`seed`** (the campaign parts `connect-harness` / `maintain` /
318
- `mcp` / `live-site`): the part builds on the accumulating portfolio
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`.
371
+ - **`seed`** (the campaign parts `connect-harness` / `run-harness` /
372
+ `maintain` / `mcp` / `live-site`): the part builds on the accumulating portfolio
319
373
  harness, but the tester may have jumped straight here from the menu.
320
374
  On entry, read the state file:
321
375
  - If every predecessor campaign part up the `prereq` chain is `done`
322
376
  → reuse the accumulated state; an `sm scan` to refresh is enough,
323
377
  nothing to lay.
324
378
  - Else → **fast-forward, silently** (backstage, do not narrate the
325
- 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
326
384
  `references/fixtures.md` (§Seed snapshots) by following its
327
385
  checklist, copy each file's canonical content from the chapter the
328
386
  row names, apply the `EDIT` rows on top, substituting
329
387
  `<provider_dir>` and skipping provider-unsupported kinds per
330
- `_core.md`. Then run `sm init` if `.skill-map/` is missing, then
331
- `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
332
395
  predecessor campaign parts `skipped` in the state (they stay in the
333
396
  menu for later). Then emit exactly ONE tester-facing line:
334
397
 
@@ -350,18 +413,15 @@ All three are specified in `_core.md`:
350
413
  the **numbered start menu** (Part 0 is option 1, the recommended
351
414
  first pick); the menu (the ToC from `_manifest.yml`, numbered,
352
415
  completed parts ticked, `planned` parts hidden, `prereq` gating only
353
- 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
354
418
  invocation and after every part closes / on resume. Render it with
355
419
  the format in `_core.md` §Menu format.
356
420
  - **Resume / restart**: §Resume / restart. On start-over, the exact
357
421
  wipe list is whatever the tester's parts actually created:
358
422
  `tutorial-state.yml`, `findings.md`, `.skillmapignore`,
359
- `.skill-map/`, the Part 0 fixture
360
- (`<provider_dir>/agents/demo-agent.md`,
361
- `<provider_dir>/skills/demo-skill/`,
362
- `<provider_dir>/commands/demo-command.md`, `notes/todo.md`,
363
- `notes/demo-guideline.md`, `notes/private-credentials.md`), the
364
- Part 6 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
365
425
  (`<provider_dir>/agents/master-agent.md`,
366
426
  `<provider_dir>/skills/master-skill/`, `notes/ideas.md`,
367
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
@@ -287,20 +288,53 @@ For every chapter:
287
288
  the book ToC, numbered, and let the tester pick a part by number.
288
289
  Part 0 (the prologue) is option 1, the recommended starting point,
289
290
  so a brand-new tester just types `1`. Do NOT auto-enter a part; the
290
- menu is the entry point every time. On later renders, prefix any
291
- completed part's title with `✓ `.
291
+ menu is the entry point every time. On later renders, mark completed
292
+ parts with a `✓` in their description line, not on the title (see
293
+ §Menu format).
292
294
  - **Which parts to list**: parts in `order`, `status: active` only
293
295
  (`planned` parts are hidden). A part with a `seed` (the campaign
294
- parts) is always shown, even out of order, its `preflight: seed`
295
- fast-forwards the project into it (SKILL.md §Entering a part). A
296
- part with a `prereq` but NO `seed` (Part 7 `cli`) is shown only once
297
- its `prereq` is `done`.
298
- - **After the tester picks**: walk that part; when it ends, return to
299
- this menu.
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).
301
+ - **After the tester picks**: walk that part; when it ends, run
302
+ §Closing a part (a tester-facing close, then this menu).
300
303
  - **Adding content** is data-only: a new chapter in a part (or a new
301
304
  `part-<id>.md` + a manifest row). Keep chapter-id prefixes matching
302
305
  the file name so dispatch stays mechanical.
303
306
 
307
+ ### Closing a part
308
+
309
+ A part must FEEL finished before the menu comes back: the tester
310
+ should never slide into the next part as if it auto-continued. When a
311
+ part's last chapter (the last in `_manifest.yml` order) is confirmed,
312
+ before re-rendering the menu emit a short tester-facing close:
313
+
314
+ - A `✓` line naming the part just finished BY ITS TITLE (from
315
+ `_manifest.yml`), not the internal "Part N" index, which is off by
316
+ one from the menu numbering the tester sees.
317
+ - One line recapping what they built or learned (same source as the
318
+ menu description).
319
+ - A hand-off line: back to the menu, pick the next part.
320
+
321
+ Then render the menu (§Menu format) with this part now marked done (a
322
+ `✓` in its description line, not on the title); its intro may lean to
323
+ "what's next" on a post-part render. The last
324
+ chapter's own confirmation stays scoped to that chapter, it does NOT
325
+ promise or pre-announce the next part, the close and the menu own the
326
+ transition. Sample (Claude variant, mirror the tester's language,
327
+ apply the host rendering rule):
328
+
329
+ > ✓ Listo, terminaste **El proyecto desde cero**. Levantaste un
330
+ > proyecto real, su handbook y el harness `.claude/` con sus primeros
331
+ > nodos.
332
+ >
333
+ > Volvés al menú, elegí con qué seguir.
334
+
335
+ If every active part is now `✓` (nothing left to pick), skip the menu
336
+ and go straight to §Final wrap-up.
337
+
304
338
  ### Menu format
305
339
 
306
340
  Render the menu numbered and formatted (NOT a bare list), translated
@@ -308,6 +342,11 @@ to the tester's language. A one-line intro, then per part a **bold
308
342
  numbered title line** (number + title + `(~M min)`) as plain prose,
309
343
  immediately followed by a single-level `> ` blockquote one-line
310
344
  description (what the part covers, derived from its title + chapters).
345
+ A **completed part** keeps its plain title (NO `✓` on the title line)
346
+ and swaps its description for the done marker: `> ✓ ` plus a short
347
+ "already done" note (e.g. `✓ Ya la hiciste.`). The green check lives
348
+ inside the content, mirroring the `✓` confirmations used elsewhere,
349
+ never as a title prefix.
311
350
  NO blank line between a title and its description; ONE blank line
312
351
  between parts; NO outer blockquote around the whole menu. Close with a
313
352
  short "¿Cuál?" / "Which one?" on its own line. Sample (Claude variant,
@@ -331,6 +370,17 @@ single blockquote" rule: the intro, the bold titles and the trailing
331
370
  non-Claude hosts the `> ` collapses to plain prose, indent each
332
371
  description two spaces so it stays subordinate to its title.
333
372
 
373
+ Same menu after Part 1 is done (the `✓` sits in the description line,
374
+ the title stays plain):
375
+
376
+ ```
377
+ **1. El mapa en vivo** (~12 min)
378
+ > ✓ Ya la hiciste.
379
+
380
+ **2. El proyecto desde cero** (~8 min)
381
+ > Arrancás un proyecto real (un portfolio) y su harness `.claude/`.
382
+ ```
383
+
334
384
  ## Resume / restart
335
385
 
336
386
  When re-invoked and the state file already exists, do NOT repeat
@@ -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`).
@@ -44,13 +45,13 @@ parts:
44
45
  - id: kinds ; title: "The other kinds appear" ; est_min: 1
45
46
  - id: first-edit ; title: "Your first edit (the watcher reacts)" ; est_min: 1
46
47
  - id: connectors ; title: "The connectors light up" ; est_min: 2
47
- - id: inspector ; title: "The inspector and linked nodes" ; est_min: 1
48
+ - id: inspector ; title: "The inspector and connections" ; est_min: 1
48
49
  - id: edit-link ; title: "Edit a link, the topology changes" ; est_min: 3
49
50
  - id: workspace ; title: "Navigate the workspace (files, search, isolate)" ; est_min: 2
50
51
  - id: ignore ; title: "Silence a file via .skillmapignore" ; est_min: 2
51
52
 
52
53
  - id: extend
53
- order: 6
54
+ order: 7
54
55
  title: "Extend skill-map for the site"
55
56
  # Spans three chapter libraries; dispatch by chapter-id prefix:
56
57
  # settings-* -> part-settings.md
@@ -80,12 +81,13 @@ parts:
80
81
  - id: authoring-6-upgrade ; title: "Try `sm plugins upgrade`" ; est_min: 2
81
82
 
82
83
  - id: cli
83
- order: 7
84
+ order: 8
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
@@ -130,8 +132,21 @@ parts:
130
132
  - id: links ; title: "Mentions (@) and references between assets" ; est_min: 3
131
133
  - id: confidence ; title: "Connector confidence (opacity = certainty)" ; est_min: 2
132
134
 
133
- - id: maintain
135
+ - id: run-harness
134
136
  order: 3
137
+ title: "Run the harness (your site, live)"
138
+ step_file: part-run-harness.md
139
+ pace: auto-advance
140
+ preflight: seed
141
+ seed: harness-connected # fast-forward to here if the earlier parts are not done
142
+ prereq: connect-harness
143
+ status: active
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
147
+
148
+ - id: maintain
149
+ order: 4
135
150
  title: "Maintain the site"
136
151
  step_file: part-maintain.md
137
152
  pace: auto-advance
@@ -148,7 +163,7 @@ parts:
148
163
  - id: versions ; title: "Versions: sm bump and history" ; est_min: 2
149
164
 
150
165
  - id: mcp
151
- order: 4
166
+ order: 5
152
167
  title: "MCP" # a chapter apart, just before the finale
153
168
  step_file: part-mcp.md
154
169
  pace: auto-advance
@@ -160,8 +175,8 @@ parts:
160
175
  - id: mcp-node ; title: "content-editor declares an MCP tool; the mcp:// node appears" ; est_min: 3
161
176
 
162
177
  - id: live-site
163
- order: 5
164
- title: "The site, live" # the finale / climax
178
+ order: 6
179
+ title: "Ship the site (the full publish pipeline)" # the finale / climax
165
180
  step_file: part-live-site.md
166
181
  pace: auto-advance
167
182
  preflight: seed
@@ -169,7 +184,7 @@ parts:
169
184
  prereq: connect-harness
170
185
  status: active
171
186
  chapters:
172
- - id: generate ; title: "The agent generates the HTML in public/" ; est_min: 3
173
- - id: serve ; title: "node server.js: your portfolio, live, next to the graph" ; est_min: 3
187
+ - id: pipeline ; title: "Run /publish end to end (check-links, brief, deploy runbook)" ; est_min: 4
188
+ - id: golive ; title: "Ship it: the richer site live next to the full graph" ; est_min: 3
174
189
 
175
190
  findings_file: "./findings.md"
@@ -1,12 +1,24 @@
1
1
  # Fixture templates
2
2
 
3
- Fixtures the orchestrator lays for the auto-fixtured parts. Two sets
4
- today: the **master fixture** (Part 6, "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.
8
-
9
- ## Master fixture (Part 6): layout (per provider)
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`).
20
+
21
+ ## Master fixture (Part 7): layout (per provider)
10
22
 
11
23
  Per §Provider detection in `SKILL.md`, the `<provider_dir>`
12
24
  placeholder resolves to `.claude/` or `.agents/skills/` depending
@@ -134,7 +146,7 @@ Per finding:
134
146
  Laid backstage before the tester's `sm init` in Part 1. The Express
135
147
  skeleton (`server.js`, `package.json`, `public/index.html`) is plain
136
148
  scaffolding, not `.md`, so the scan ignores it; it makes the project
137
- real and runnable (Part 5 starts it). The one boot node is the
149
+ real and runnable (Part 3 runs it, Part 6 ships it). The one boot node is the
138
150
  handbook `AGENTS.md`. On `agent-skills` / Antigravity (no `agent`
139
151
  kind) the harness still works: the agent member is created as a skill
140
152
  in a later chapter.
@@ -154,15 +166,12 @@ Layout:
154
166
 
155
167
  ### File: `AGENTS.md` (kind: markdown, the boot node)
156
168
 
157
- ```markdown
158
- ---
159
- name: portfolio-handbook
160
- description: |
161
- Operating manual for this portfolio site: how its pages get
162
- written, checked, and published by the .claude/ harness.
163
- tags: [docs, portfolio]
164
- ---
169
+ No frontmatter: a real handbook is plain prose (this repo's own
170
+ `AGENTS.md` and the tutorial's `CLAUDE.md` carry none either), and a
171
+ `name:` that differs from the filename only confuses the tester. The
172
+ node displays by its path, `AGENTS.md`.
165
173
 
174
+ ```markdown
166
175
  # Portfolio handbook
167
176
 
168
177
  A small static portfolio site, served by Express (`server.js`). The
@@ -196,7 +205,7 @@ app.listen(port, () => console.log(`Portfolio live at http://localhost:${port}`)
196
205
  }
197
206
  ```
198
207
 
199
- ### File: `public/index.html` (not scanned; placeholder until Part 5)
208
+ ### File: `public/index.html` (not scanned; placeholder until Part 3)
200
209
 
201
210
  ```html
202
211
  <!doctype html>
@@ -208,15 +217,16 @@ app.listen(port, () => console.log(`Portfolio live at http://localhost:${port}`)
208
217
 
209
218
  ### `.skillmapignore` additions
210
219
 
211
- Append to the portfolio `.skillmapignore` (on top of the tutorial
212
- internals from `SKILL.md`): `node_modules/` (the Express install) and
213
- `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).
214
223
 
215
- ## Seed snapshots (for `preflight: seed`, jumping into a campaign part)
224
+ ## Seed snapshots (for `preflight: seed`)
216
225
 
217
- When the orchestrator enters a campaign part out of order (its
218
- predecessors are not `done`), it fast-forwards the project by laying
219
- 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) +
220
230
  `sm scan`. These are **checklists, not content**: each row names a file
221
231
  and the chapter that holds its canonical content. Lay each file by
222
232
  copying the content from the named chapter (substitute `<provider_dir>`
@@ -237,7 +247,7 @@ any cross-links:
237
247
  3. `<provider_dir>/agents/content-editor.md` <- part-project-kickoff.md, chapter `first-agent`.
238
248
  4. `docs/STYLE.md` and `docs/DEPLOY.md` <- part-project-kickoff.md, chapter `real-kinds`.
239
249
 
240
- ### Seed snapshot: `harness-connected` (start of Parts 3, 4, 5)
250
+ ### Seed snapshot: `harness-connected` (start of Parts 3-6)
241
251
 
242
252
  Everything in `harness-built`, PLUS the Part 2 wiring:
243
253
 
@@ -246,6 +256,19 @@ Everything in `harness-built`, PLUS the Part 2 wiring:
246
256
  7. EDIT `AGENTS.md`: append the two hub bullets (mention `@content-editor`, invoke `/publish`) <- part-connect-harness.md, chapter `links`.
247
257
  8. EDIT `<provider_dir>/agents/content-editor.md`: add the `[style guide](../../docs/STYLE.md)` line <- part-connect-harness.md, chapter `links`.
248
258
 
249
- After laying a snapshot the map matches the state a tester would have at
250
- 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`.
251
274
 
@@ -1,6 +1,6 @@
1
- # Part 6 (c): Extend skill-map - build plugins (step library, `authoring-*` ids)
1
+ # Part 7 (c): Extend skill-map - build plugins (step library, `authoring-*` ids)
2
2
 
3
- Step bodies for the plugin-authoring chapters of Part 6.
3
+ Step bodies for the plugin-authoring chapters of Part 7.
4
4
  The SKILL.md orchestrator dispatches each `authoring-*` chapter id
5
5
  here; `settings-*` ids it dispatches to `part-settings.md`.
6
6
 
@@ -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
- # Part 7: The CLI in depth - step library
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