@skill-map/cli 0.53.6 → 0.55.0

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 (32) hide show
  1. package/dist/cli/tutorial/sm-tutorial/SKILL.md +22 -24
  2. package/dist/cli/tutorial/sm-tutorial/references/_core.md +8 -7
  3. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +21 -42
  4. package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +15 -7
  5. package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +2 -2
  6. package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +1 -1
  7. package/dist/cli/tutorial/sm-tutorial/references/part-connect-harness.md +9 -10
  8. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +563 -0
  9. package/dist/cli/tutorial/sm-tutorial/references/part-mcp.md +5 -1
  10. package/dist/cli/tutorial/sm-tutorial/references/part-plugins.md +7 -7
  11. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +24 -12
  12. package/dist/cli/tutorial/sm-tutorial/references/part-settings.md +2 -2
  13. package/dist/cli.js +1019 -718
  14. package/dist/index.js +129 -15
  15. package/dist/kernel/index.d.ts +209 -89
  16. package/dist/kernel/index.js +129 -15
  17. package/dist/migrations/001_initial.sql +6 -1
  18. package/dist/ui/chunk-CN6IOM67.js +2 -0
  19. package/dist/ui/chunk-HPKRDGLH.js +123 -0
  20. package/dist/ui/{chunk-NBXEOYS4.js → chunk-LREXXX7T.js} +1 -1
  21. package/dist/ui/{chunk-7OJPO3XD.js → chunk-RGB5FBZL.js} +31 -30
  22. package/dist/ui/{chunk-4CXAL43H.js → chunk-XAM6VKXM.js} +1 -1
  23. package/dist/ui/index.html +2 -2
  24. package/dist/ui/{main-O4DGYJ62.js → main-7YXBWYHE.js} +3 -3
  25. package/dist/ui/{styles-L6FZYH7X.css → styles-HRJG67XW.css} +1 -1
  26. package/migrations/001_initial.sql +6 -1
  27. package/package.json +2 -2
  28. package/dist/cli/tutorial/sm-tutorial/references/part-live-site.md +0 -155
  29. package/dist/cli/tutorial/sm-tutorial/references/part-maintain.md +0 -284
  30. package/dist/cli/tutorial/sm-tutorial/references/part-run-harness.md +0 -181
  31. package/dist/ui/chunk-HWQTV6ZL.js +0 -2
  32. package/dist/ui/chunk-PRP3JSUU.js +0 -123
@@ -0,0 +1,563 @@
1
+ # Part 3: The daily loop (step library, `daily-loop`)
2
+
3
+ The campaign's payoff and finale fused into one part: the tester operates the
4
+ harness they built the way they would on any normal day, **for real**. Three
5
+ acts: **add** content, **modify / improve** it (where skill-map earns its
6
+ keep), and **publish** it through the real pipeline. Every agent, skill, and
7
+ command runs for real, no role-play: the orchestrator invokes the
8
+ `content-editor` via the Task tool, and the publish + link-check flow actually
9
+ executes. `pace: auto-advance`, `preflight: seed` (`harness-connected`, so a
10
+ tester can jump straight here). Shared conventions (tone, provider detection /
11
+ substitution, the `> ` rendering rule, the per-step cycle, §Closing a part,
12
+ §Final wrap-up) live in `_core.md`; do not restate them.
13
+
14
+ **The site is the tester's.** The `setup` chapter asks who it is for and builds
15
+ it around that answer. Identity lives in Layer 2 (the HTML / CSS under
16
+ `public/`), which skill-map does not map, so the graph stays identical no matter
17
+ what the tester names their portfolio. Persist the answer in `tutorial-state.yml`
18
+ under `tester.site_identity` (`{ name, tagline }`).
19
+
20
+ **Provider note (read once).** Substitute `.claude/` with the detected
21
+ `<provider_dir>`. On `agent-skills` / Antigravity the `content-editor` is a
22
+ **skill**, not an agent (invoke it as a skill); there is no `command` kind, so
23
+ the `reserved` chapter is skipped and the `broken-ref` / `publish` chapters use
24
+ their agent-skills variant (notes inline).
25
+
26
+ **Real-execution contract (read once).** When invoking the `content-editor` via
27
+ the Task tool, instruct it explicitly to write ONLY `.html` files under
28
+ `public/`, to NOT create any `.md` file, and to NOT touch the harness or its own
29
+ definition. After it runs, `Read` what it wrote before telling the tester what
30
+ landed (this keeps the node-count promises honest). If the subagent is not
31
+ invocable in the tester's setup, act as the `content-editor` yourself following
32
+ its rules and `docs/STYLE.md`, so the beat still lands.
33
+
34
+ ---
35
+
36
+ **Act A - Add**
37
+
38
+ ## Chapter `setup` - Make it yours, make it presentable (~3 min)
39
+
40
+ **Context**: the harness is wired (you built it in the earlier parts). Now you
41
+ put it to work on a real day. First, make the site yours and give it a look you
42
+ would not be embarrassed to share. The honest beat: the HTML and CSS are
43
+ Layer 2 (the harness's output); skill-map maps the harness (Layer 1, the `.md`
44
+ files), so the site landing on disk does NOT move the graph, and that is
45
+ correct, not a bug.
46
+
47
+ **Preparation**:
48
+
49
+ 1. Ask the tester, in one short exchange: what the site should be called (their
50
+ name or a title) and one line about what it is for. Keep it light; if they do
51
+ not care, offer defaults ("My Portfolio" / "Small, sturdy things on the
52
+ web"). Save both into `tutorial-state.yml` under `tester.site_identity`
53
+ (`{ name, tagline }`).
54
+ 2. Backstage, `Write` `public/style.css` exactly as below (Layer 2, ignored by
55
+ the scan; one stylesheet shared by every page).
56
+ 3. `Write` `public/index.html` and `public/about.html` from the templates below,
57
+ substituting the identity. These overwrite the placeholder `public/index.html`
58
+ the kickoff left.
59
+
60
+ `public/style.css`:
61
+ ```css
62
+ :root {
63
+ --bg: #fbfbfa; --surface: #fff; --ink: #1a1a1a; --ink-soft: #585858;
64
+ --accent: #3b5bdb; --border: #e7e7e3; --radius: 10px; --maxw: 46rem;
65
+ }
66
+ @media (prefers-color-scheme: dark) {
67
+ :root {
68
+ --bg: #14151a; --surface: #1c1e26; --ink: #f0f0f2; --ink-soft: #a0a3ad;
69
+ --accent: #8aa1ff; --border: #2a2d38;
70
+ }
71
+ }
72
+ * { box-sizing: border-box; }
73
+ body {
74
+ margin: 0; background: var(--bg); color: var(--ink); line-height: 1.65;
75
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
76
+ -webkit-font-smoothing: antialiased;
77
+ }
78
+ .wrap { max-width: var(--maxw); margin: 0 auto; padding: 0 1.25rem; }
79
+ header.site { border-bottom: 1px solid var(--border); padding: 1.4rem 0; margin-bottom: 2.5rem; }
80
+ header.site .wrap { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
81
+ .brand { font-weight: 700; font-size: 1.15rem; letter-spacing: -0.01em; text-decoration: none; color: var(--ink); }
82
+ nav a { color: var(--ink-soft); text-decoration: none; margin-left: 1.25rem; font-size: 0.95rem; transition: color 0.15s ease; }
83
+ nav a:hover { color: var(--accent); }
84
+ main { padding-bottom: 4rem; }
85
+ h1 { font-size: 2.4rem; line-height: 1.1; letter-spacing: -0.02em; margin: 0 0 0.4rem; }
86
+ h2 { font-size: 1.3rem; margin: 2.5rem 0 0.75rem; letter-spacing: -0.01em; }
87
+ .tagline { font-size: 1.2rem; color: var(--ink-soft); margin: 0 0 2rem; }
88
+ p { margin: 0 0 1.1rem; }
89
+ a { color: var(--accent); }
90
+ ul.cards { list-style: none; padding: 0; display: grid; gap: 1rem; }
91
+ ul.cards li { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.1rem 1.25rem; }
92
+ ul.cards h3 { margin: 0 0 0.3rem; font-size: 1.05rem; }
93
+ ul.cards p { margin: 0; color: var(--ink-soft); font-size: 0.95rem; }
94
+ footer.site { border-top: 1px solid var(--border); padding: 2rem 0; color: var(--ink-soft); font-size: 0.9rem; }
95
+ @media (max-width: 30rem) {
96
+ h1 { font-size: 1.9rem; }
97
+ header.site .wrap { flex-direction: column; gap: 0.5rem; }
98
+ nav a { margin: 0 1.25rem 0 0; }
99
+ }
100
+ ```
101
+
102
+ `public/index.html` (substitute `[NAME]`, `[TAGLINE]`, `[INTRO]` with the identity):
103
+ ```html
104
+ <!doctype html>
105
+ <html lang="en">
106
+ <head>
107
+ <meta charset="utf-8" />
108
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
109
+ <title>[NAME]</title>
110
+ <link rel="stylesheet" href="/style.css" />
111
+ </head>
112
+ <body>
113
+ <header class="site">
114
+ <div class="wrap">
115
+ <a class="brand" href="/">[NAME]</a>
116
+ <nav>
117
+ <a href="/">Home</a>
118
+ <a href="/about.html">About</a>
119
+ </nav>
120
+ </div>
121
+ </header>
122
+ <main class="wrap">
123
+ <h1>[NAME]</h1>
124
+ <p class="tagline">[TAGLINE]</p>
125
+ <p>[INTRO]</p>
126
+ </main>
127
+ <footer class="site"><div class="wrap">© [NAME]</div></footer>
128
+ </body>
129
+ </html>
130
+ ```
131
+
132
+ `public/about.html` (same shell, substitute `[NAME]` and a short `[ABOUT]`):
133
+ ```html
134
+ <!doctype html>
135
+ <html lang="en">
136
+ <head>
137
+ <meta charset="utf-8" />
138
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
139
+ <title>About · [NAME]</title>
140
+ <link rel="stylesheet" href="/style.css" />
141
+ </head>
142
+ <body>
143
+ <header class="site">
144
+ <div class="wrap">
145
+ <a class="brand" href="/">[NAME]</a>
146
+ <nav>
147
+ <a href="/">Home</a>
148
+ <a href="/about.html">About</a>
149
+ </nav>
150
+ </div>
151
+ </header>
152
+ <main class="wrap">
153
+ <h1>About</h1>
154
+ <p>[ABOUT]</p>
155
+ </main>
156
+ <footer class="site"><div class="wrap">© [NAME]</div></footer>
157
+ </body>
158
+ </html>
159
+ ```
160
+
161
+ Then tell the tester to serve it (the tester runs these; do not run them):
162
+
163
+ ```bash
164
+ npm install
165
+ node server.js
166
+ ```
167
+
168
+ > Your portfolio has a face now. `npm install` pulls the one small library the
169
+ > server needs (Express, on the Node you already have), and `node server.js`
170
+ > starts it and prints a line like `Listening on http://localhost:3000`.
171
+ >
172
+ > Open `http://localhost:3000`: there is your site, named after you, with a
173
+ > clean layout. Click **About** and back to **Home**.
174
+ >
175
+ > Now glance at the Map: it did not move. Everything you watched grow on the
176
+ > canvas is your harness, the `.md` files and how they reference each other
177
+ > (Layer 1). The pages and the stylesheet are Layer 2, what the harness
178
+ > produces, and skill-map maps the harness, not its output. Two layers, one
179
+ > project.
180
+ >
181
+ > Does the site load and look clean?
182
+
183
+ Wait for confirmation. Mark `setup`: done. Auto-advance to `add-page`.
184
+
185
+ ## Chapter `add-page` - Add a page with your agent (~4 min)
186
+
187
+ **Context**: the daily move. You want a new page, so you ask your
188
+ `content-editor` to write it. This is the first time it runs **for real** (no
189
+ more playing the agent). It reads `docs/STYLE.md` and the shared stylesheet and
190
+ writes a new page into `public/`. The graph does not move (HTML is Layer 2).
191
+
192
+ **Preparation**: none until the tester asks.
193
+
194
+ Tell the tester:
195
+
196
+ > Your turn to delegate, the way you would on a real day. Tell me what page to
197
+ > add, in your own words, for example "add a projects page" or "add a page about
198
+ > my talks". I'll hand it to your `content-editor` agent and let it write the
199
+ > page.
200
+
201
+ When the tester answers, invoke the project's `content-editor` (the
202
+ `<provider_dir>/agents/content-editor.md` agent, or the skill on `agent-skills`)
203
+ via the Task tool, honouring the real-execution contract above: write ONE new
204
+ `.html` page under `public/` named after the topic (default `public/projects.html`),
205
+ following the agent's own steps and `docs/STYLE.md` (the shared shell, link
206
+ `/style.css`, one `<h1>`, a nav link back to Home), and add the new page to the
207
+ home nav. Do NOT write any `.md`, do NOT touch the harness. Then `Read` the file
208
+ it produced.
209
+
210
+ > Your `content-editor` ran for real and wrote `public/projects.html`, linked
211
+ > from the home nav. Refresh the site: the new page is there, in the same style
212
+ > as the rest.
213
+ >
214
+ > Now glance at the Map: same nodes as before, nothing new. The page is Layer 2
215
+ > output; the harness on the canvas is Layer 1. Your nodes are not a diagram,
216
+ > they are runnable, and you just ran one.
217
+ >
218
+ > See the new page on the site, and the Map unchanged?
219
+
220
+ Wait for confirmation. Mark `add-page`: done. Auto-advance to `orphan-draft`.
221
+
222
+ ## Chapter `orphan-draft` - A page nobody links to yet (~2 min)
223
+
224
+ **Context**: mid-day you jot an idea for the next page but do not wire it up yet.
225
+ skill-map shows it as an **orphan**: a real node with nothing pointing at it.
226
+
227
+ **Preparation**: `Write` `docs/draft.md` (markdown kind):
228
+ ```markdown
229
+ ---
230
+ name: draft
231
+ description: |
232
+ A rough idea for the next page. Not linked from anywhere yet.
233
+ ---
234
+
235
+ # Draft
236
+
237
+ Notes toward a posts page. Nothing wired up.
238
+ ```
239
+
240
+ Tell the tester to run:
241
+
242
+ ```bash
243
+ sm scan
244
+ sm show docs/draft.md
245
+ ```
246
+
247
+ > A new `docs/draft` node appeared on the Map as a floating dot, no arrows in or
248
+ > out. `sm show docs/draft.md` has no "Links in" section: nothing references it.
249
+ > That is an **orphan**, a valid node with no incoming links.
250
+ >
251
+ > An orphan is NOT an error: run `sm check` and the harness still reads clean.
252
+ > It is just a node nobody points at yet. Keep three ideas apart: an **orphan**
253
+ > (a real node, no incoming link), a **broken reference** (a link with no target
254
+ > on the other end), and an **issue** (a rule violation `sm check` flags). You
255
+ > will meet the other two in a moment.
256
+ >
257
+ > See the floating dot, and the empty "Links in"?
258
+
259
+ Wait for confirmation. Mark `orphan-draft`: done. Auto-advance to `wire-and-improve`.
260
+
261
+ ---
262
+
263
+ **Act B - Modify / improve**
264
+
265
+ ## Chapter `wire-and-improve` - Wire the draft in (~3 min)
266
+
267
+ **Context**: you turn the draft into a real page and link it, so it stops being
268
+ an orphan. Two moves: the `content-editor` writes the actual page (Layer 2), and
269
+ you add a link to the draft note from the handbook (Layer 1), which gives the
270
+ orphan an incoming edge.
271
+
272
+ **Preparation**: invoke the `content-editor` via the Task tool (real-execution
273
+ contract) to write `public/posts.html` from the draft idea (a couple of short
274
+ sample posts, shared shell, nav link back to Home). `Read` it afterwards.
275
+
276
+ Then tell the tester to wire the note in (their file, Inviolable rule #2):
277
+
278
+ > Two moves to close the loop on that draft. First, I had your `content-editor`
279
+ > turn it into a real page: `public/posts.html` now exists (Layer 2, so the Map
280
+ > stays put for it). Second, your turn: open `AGENTS.md` and add this line to
281
+ > the body, so the handbook actually points at the draft note:
282
+ >
283
+ > ```markdown
284
+ > - The next page started as notes in [draft](docs/draft.md).
285
+ > ```
286
+ >
287
+ > Save it, then re-scan and look at the draft again:
288
+
289
+ ```bash
290
+ sm scan
291
+ sm show docs/draft.md
292
+ ```
293
+
294
+ > `docs/draft` is no longer an orphan: `sm show` now lists `Links in (1)
295
+ > ← references AGENTS.md`, and on the Map the floating dot is connected to the
296
+ > handbook. One incoming link is all it took to fold it into the graph.
297
+ >
298
+ > Did the draft connect to the handbook?
299
+
300
+ Wait for confirmation. Mark `wire-and-improve`: done. Auto-advance to `broken-ref`.
301
+
302
+ ## Chapter `broken-ref` - A rename breaks a link (~4 min)
303
+
304
+ **Context**: real reorganizing breaks things, and this is where skill-map earns
305
+ its keep. You rename a doc, and a link that pointed at the old name goes stale.
306
+ skill-map catches it the moment you re-scan.
307
+
308
+ On `agent-skills` / Antigravity there is no `/publish` command holding the deploy
309
+ link; use the variant in the note at the end of this chapter (rename
310
+ `docs/STYLE.md` to break the `content-editor`'s style-guide reference instead).
311
+
312
+ **Preparation**: none (the tester drives).
313
+
314
+ Tell the tester to rename the deploy runbook (their file):
315
+
316
+ ```bash
317
+ mv docs/DEPLOY.md docs/DEPLOYMENT.md
318
+ sm scan
319
+ sm check
320
+ ```
321
+
322
+ > You renamed the deploy runbook, but `/publish` still links to the old path.
323
+ > `sm check` flags it:
324
+ >
325
+ > ```
326
+ > sm check: 1 error
327
+ >
328
+ > .claude/commands/publish.md
329
+ > ✕ reference-broken Broken references reference → docs/DEPLOY.md
330
+ > ```
331
+ >
332
+ > That is the `reference-broken` analyzer: a link whose target no longer exists.
333
+ > On the Map the `publish → docs/DEPLOY.md` arrow has gone faint. `sm check` runs
334
+ > the full analyzer catalogue (around a dozen rules); to narrow it to one rule:
335
+
336
+ ```bash
337
+ sm check --analyzers reference-broken
338
+ ```
339
+
340
+ > Now fix it the way you would for real: open `.claude/commands/publish.md` and
341
+ > point the deploy-runbook link at `docs/DEPLOYMENT.md` (the new name). Then
342
+ > re-scan and re-check:
343
+
344
+ ```bash
345
+ sm scan
346
+ sm check
347
+ ```
348
+
349
+ > `✓ No issues`. The arrow is solid again. That is the daily safety net: rename
350
+ > and move things freely, and skill-map tells you exactly what you forgot to
351
+ > update, before it ships broken.
352
+ >
353
+ > Did `sm check` go from 1 error back to clean?
354
+
355
+ Wait for confirmation. The harness MUST read `✓ No issues` before Act C (the
356
+ real `/publish` later follows this runbook). Mark `broken-ref`: done.
357
+ Auto-advance to `reserved`.
358
+
359
+ On `agent-skills` / Antigravity (no `command` kind), run the same beat on a link
360
+ that exists there: `mv docs/STYLE.md docs/STYLE-GUIDE.md`, which breaks the
361
+ `content-editor` skill's `[style guide]` reference; `sm check` flags
362
+ `reference-broken` on the `content-editor`; fix the link in the skill body and
363
+ re-check to clean.
364
+
365
+ ## Chapter `reserved` - A reserved name collides (~2 min)
366
+
367
+ **Context**: you add a quick command to scaffold new pages and, without
368
+ thinking, name it `init`, a name Claude Code already owns for its own slash
369
+ command. skill-map warns you before the runtime silently ignores your file.
370
+
371
+ On `agent-skills` / Antigravity there is no `command` kind: **skip this chapter**
372
+ and fold a one-line mention ("skill-map also warns when a file's name collides
373
+ with a runtime built-in") into the close of the previous chapter. Adjust the
374
+ section's chapter count accordingly.
375
+
376
+ **Preparation**: `Write` `.claude/commands/init.md`:
377
+ ```markdown
378
+ ---
379
+ name: init
380
+ description: |
381
+ Scaffolds a new empty page in public/ from the shared template.
382
+ ---
383
+
384
+ # init
385
+
386
+ Creates a blank page so you can start writing.
387
+ ```
388
+
389
+ Tell the tester to scan and check:
390
+
391
+ ```bash
392
+ sm scan
393
+ sm check
394
+ ```
395
+
396
+ > `sm check` warns:
397
+ >
398
+ > ```
399
+ > sm check: 1 warning
400
+ >
401
+ > .claude/commands/init.md
402
+ > ⚠ name-reserved .claude/commands/init.md shadows a built-in claude command. The runtime ignores this file in favour of its own built-in. Rename the file or `frontmatter.name` to a non-reserved value.
403
+ > ```
404
+ >
405
+ > `init` is one of Claude Code's own slash commands (like `/help`, `/clear`,
406
+ > `/config`), so your file would be silently ignored, it never runs. The fix is
407
+ > to give it a name the runtime does not own.
408
+
409
+ Rename the command to `new-page`: rename the file `.claude/commands/init.md` to
410
+ `.claude/commands/new-page.md`, AND change `frontmatter.name` to `new-page` and
411
+ the H1 to `# new-page` (a command's H1 stays a plain title, never `# /new-page`).
412
+ Then have the tester re-scan and re-check:
413
+
414
+ ```bash
415
+ sm scan
416
+ sm check
417
+ ```
418
+
419
+ > `✓ No issues`. Notice what cleared the warning: changing the **name**, not
420
+ > just the filename. The reserved check looks at the command's name (its
421
+ > `frontmatter.name`), which is why the warning told you to rename "the file or
422
+ > `frontmatter.name`". Now `new-page` is yours and the runtime will actually run
423
+ > it.
424
+ >
425
+ > Did the warning clear after the rename?
426
+
427
+ Wait for confirmation. Mark `reserved`: done. Auto-advance to `publish`.
428
+
429
+ ---
430
+
431
+ **Act C - Publish**
432
+
433
+ ## Chapter `publish` - Ship it: run /publish for real (~4 min)
434
+
435
+ **Context**: the harness is not a picture, it is a set of instructions, and
436
+ `/publish` ties them together. You run it **for real** now: it invokes the link
437
+ checker over your pages, briefs the `content-editor` if anything needs a fix,
438
+ then follows the deploy runbook. This is the same Layer 1 / Layer 2 split, the
439
+ pages are output, so the Map stays put while the pipeline runs.
440
+
441
+ On `agent-skills` / Antigravity there is no `/publish` command: run the
442
+ `check-links` skill directly over `public/`, then follow `docs/DEPLOYMENT.md` by
443
+ hand. Everything else in this chapter is identical.
444
+
445
+ **Preparation**: make sure the pages exist (`index`, `about`, `projects`,
446
+ `posts` from the earlier chapters; lay any that are missing from the templates in
447
+ `setup`). When the tester asks to publish, **execute the publish flow for real**
448
+ by following `.claude/commands/publish.md`: run the `check-links` logic over
449
+ every `.html` under `public/` (does each internal `href` resolve to a file that
450
+ exists?); if any link is broken, brief the `content-editor` to fix it and
451
+ re-run the check; then walk the deploy runbook steps. Do not role-play it.
452
+
453
+ Tell the tester:
454
+
455
+ > The site is ready. Tell me to publish (or type `/publish`) and I'll run your
456
+ > publish command for real: I follow its steps, run the link check across your
457
+ > pages, fix anything through the `content-editor`, and walk the deploy runbook,
458
+ > exactly what the command says to do.
459
+
460
+ After running the flow, report what actually happened (keep the promises
461
+ conditional on the real result):
462
+
463
+ > Here is what just ran, for real:
464
+ >
465
+ > - **check-links** walked every page under `public/` and followed each internal
466
+ > link. Result: 0 broken links. (Had it found one, the next step would have
467
+ > briefed `content-editor` to fix it, then re-checked, that is what step 2 is
468
+ > for.)
469
+ > - the **deploy runbook** (`docs/DEPLOYMENT.md`) lists the ship steps:
470
+ > regenerate the pages (done), run the link check (done), start the server
471
+ > (next chapter).
472
+ >
473
+ > And the Map did not move while the pipeline ran: the pages are Layer 2 output;
474
+ > the harness on the canvas is Layer 1, and that is what skill-map maps.
475
+ >
476
+ > Did the publish run report the link check clean?
477
+
478
+ Wait for confirmation. Mark `publish`: done. Auto-advance to `sidecar`.
479
+
480
+ ## Chapter `sidecar` - Annotate the handbook (.sm and consent) (~3 min)
481
+
482
+ **Context**: skill-map keeps its own metadata in co-located `.sm` sidecars, right
483
+ next to each file, leaving the vendor file untouched. Writing the first one needs
484
+ your consent. Good moment now that the site shipped: leave a metadata note on the
485
+ handbook.
486
+
487
+ **Preparation**: none for a first-time tester. (If re-entering a dir where the
488
+ sidecar already exists, reset consent first with `rm -f AGENTS.sm
489
+ .skill-map/settings.local.json` so the prompt shows again.)
490
+
491
+ Tell the tester:
492
+
493
+ ```bash
494
+ sm sidecar annotate AGENTS.md
495
+ ```
496
+
497
+ > The first time you write a `.sm`, skill-map asks for consent: answer `y` at the
498
+ > `[Y/n]` prompt. It then scaffolds `AGENTS.sm` next to `AGENTS.md`:
499
+ >
500
+ > ```
501
+ > ✓ Created AGENTS.sm. Edit it, then run `sm bump AGENTS.md` to commit the version.
502
+ > ```
503
+ >
504
+ > Look at the two new artifacts:
505
+
506
+ ```bash
507
+ cat AGENTS.sm
508
+ cat .skill-map/settings.local.json
509
+ ```
510
+
511
+ > `AGENTS.sm` holds an `identity:` block (hashes that tie it to the live file)
512
+ > and an empty `annotations: {}` ready for you to fill in. And
513
+ > `.skill-map/settings.local.json` now records your consent,
514
+ > `{ "allowEditSmFiles": true }`, so skill-map will not ask again in this
515
+ > project. Open the Inspector for the `AGENTS` node: it now has a **Metadata**
516
+ > section it did not have before.
517
+ >
518
+ > See `AGENTS.sm` and the consent flag?
519
+
520
+ Wait for confirmation. Mark `sidecar`: done. Auto-advance to `golive`.
521
+
522
+ ## Chapter `golive` - Your portfolio, live next to the graph (~3 min)
523
+
524
+ **Context**: the climax. Serve the finished multi-page site and click through it,
525
+ ending with the running portfolio on one side and the full harness graph on the
526
+ other. One of the few chapters where the tester runs non-`sm` commands
527
+ themselves; guide them, do not run it for them. `npm install` is idempotent, so
528
+ it is safe whether or not they ran it in `setup`.
529
+
530
+ **Preparation**: none. `server.js` / `package.json` exist from the kickoff; the
531
+ pages exist from the earlier chapters.
532
+
533
+ ```bash
534
+ npm install
535
+ node server.js
536
+ ```
537
+
538
+ > Last step, the fun one. `npm install` confirms the one small library is there,
539
+ > and `node server.js` starts the server (`Listening on http://localhost:3000`).
540
+ >
541
+ > Open `http://localhost:3000` and click through Home, About, Projects, and
542
+ > Posts, the pages your harness produced and shipped through the publish flow you
543
+ > just ran.
544
+ >
545
+ > Now take it in at once. On one side, your real running portfolio, named after
546
+ > you, that you could deploy as-is. On the other, the skill-map graph of the
547
+ > harness that built it: the handbook, the content-editor, the style guide, the
548
+ > publish command, the link checker, the deploy runbook, all wired together. You
549
+ > started in an empty folder and ended with a real, running site and a living
550
+ > map of how it all fits.
551
+ >
552
+ > Does the site load, and can you click between all the pages?
553
+
554
+ Wait for confirmation. The tester runs the commands; do not run them. If
555
+ `npm install` fails, check they are in the project root and Node is on PATH
556
+ (`node --version` should print 24 or higher). If the port is busy, stop the
557
+ server with Ctrl+C and apply the ports edge case.
558
+
559
+ This is the campaign finale. Congratulate them plainly: they went from an empty
560
+ directory to a real, running portfolio plus a complete map of its harness. Mark
561
+ `golive`: done. Last chapter of the part: apply §Closing a part (name the part
562
+ by its title); since this closes the campaign spine, if every active part is now
563
+ done route to the §Final wrap-up instead of the menu.
@@ -1,4 +1,8 @@
1
- # Part 8: MCP (step library, `mcp-*` ids)
1
+ # MCP (parked appendix, `mcp-*` ids)
2
+
3
+ > Parked: this part is `status: planned` in `_manifest.yml` (hidden from
4
+ > the menu) while MCP is reworked as its own iteration. The body below is
5
+ > kept intact; re-enable by flipping the status back to `active`.
2
6
 
3
7
  This is a chapter apart, a standalone appendix that comes last in the
4
8
  book. Pace `auto-advance`, preflight `seed` (`harness-connected`, so it
@@ -1,4 +1,4 @@
1
- # Part 6 (b): Extend skill-map - plugins (step library, `tour-*` ids)
1
+ # Part 4 (b): Extend skill-map - plugins (step library, `tour-*` ids)
2
2
 
3
3
  Guided tour of the **built-in plugins** that ship with `sm`. Three
4
4
  steps: a quick mental model of what plugins are plus a peek at
@@ -115,10 +115,10 @@ Mark `tour-1-intro: done`.
115
115
  > in your second terminal:
116
116
 
117
117
  ```bash
118
- sm plugins show core
118
+ sm plugins list core
119
119
  ```
120
120
 
121
- Expected: the 28 extensions grouped by kind, each row showing its
121
+ Expected: the extensions grouped by kind, each row showing its
122
122
  kind and qualified id (e.g. `extractor core/markdown-link`). You
123
123
  can spot at least one of each of the six kinds you just read about,
124
124
  all packed into a single plugin.
@@ -151,7 +151,7 @@ line (`✓ core/external-url-counter built-in`) plus its Kind
151
151
  sm plugins doctor
152
152
  ```
153
153
 
154
- Expected on a clean machine: `34 enabled extensions · 0 issues · 0 warnings`.
154
+ Expected on a clean machine: `35 enabled extensions · 0 issues · 0 warnings`.
155
155
  If any plugin reports a load error, manifest validity issue, or
156
156
  spec-compatibility mismatch, `doctor` is the verb that flags it.
157
157
 
@@ -161,12 +161,12 @@ spec-compatibility mismatch, `doctor` is the verb that flags it.
161
161
 
162
162
  ```bash
163
163
  sm plugins disable core/external-url-counter
164
- sm plugins show core
164
+ sm plugins list core
165
165
  sm plugins enable core/external-url-counter
166
- sm plugins show core
166
+ sm plugins list core
167
167
  ```
168
168
 
169
- Expected: between the two `show core` calls, the
169
+ Expected: between the two `list core` calls, the
170
170
  `core/external-url-counter` row flips its marker from `✓` (enabled)
171
171
  to `✕` (disabled) and back. The change persists in the project DB;
172
172
  if you restarted `sm`, the disabled state would still be there.
@@ -5,7 +5,7 @@ starts an actual project: a tiny personal **portfolio website**,
5
5
  fully static, served by a ~15-line Express server, plus the
6
6
  `.claude/` **harness** that maintains it. skill-map maps the harness
7
7
  (the `.md` assets and how they reference each other); the site itself
8
- is plain HTML the harness produces (Part 3 runs it, Part 5 ships it).
8
+ is plain HTML the harness produces (the daily loop, Part 3, runs and ships it).
9
9
  `pace: per-step`, `preflight: portfolio-init`. Shared
10
10
  conventions live in `_core.md`.
11
11
 
@@ -104,13 +104,16 @@ model: sonnet
104
104
 
105
105
  # content-editor
106
106
 
107
- Turns a short brief into a finished portfolio page. Follows the
108
- conventions in the style guide and writes the result as static HTML
109
- under public/.
107
+ Turns a short brief into a finished portfolio page.
110
108
 
111
- Rules:
112
- - One page per file under public/.
113
- - Keep the markup plain; no framework, no client JS.
109
+ ## How to write a page
110
+ 1. Read the style guide and the shared stylesheet in public/.
111
+ 2. Write one HTML file under public/, named after the page (a projects page becomes `public/projects.html`).
112
+ 3. Start from `<!doctype html>`, link the stylesheet with `<link rel="stylesheet" href="/style.css">`, and set a `<title>`.
113
+ 4. Use one `<h1>`, group sections under `<h2>`, and reuse the shared header, nav, and footer so every page matches.
114
+ 5. Add a link back to Home, and link the new page from the home nav.
115
+
116
+ Rules: plain static HTML, no framework, no client JS, one page per file.
114
117
  ```
115
118
 
116
119
  Tell the tester:
@@ -129,7 +132,7 @@ Wait for confirmation. Mark `first-agent`: done.
129
132
  **Context**: the prologue showed the four kinds on abstract demo
130
133
  nodes. Now name them on the real project, and add the two markdown
131
134
  docs the harness references later (the style guide and the deploy
132
- runbook), so Part 4's maintenance beats have something to point at.
135
+ runbook), so the Daily Loop's maintenance beats have something to point at.
133
136
 
134
137
  `Write` two docs (markdown kind):
135
138
 
@@ -143,9 +146,18 @@ description: |
143
146
 
144
147
  # Style guide
145
148
 
149
+ ## Voice
146
150
  - Short, plain sentences. No marketing fluff.
151
+
152
+ ## Structure
147
153
  - One H1 per page; sections under H2.
148
- - Every page links back to the home page.
154
+ - Every page shares the same header, nav, and footer.
155
+ - Every page links back to Home.
156
+
157
+ ## Markup
158
+ - Plain static HTML: no framework, no client JS.
159
+ - Link the shared stylesheet `/style.css` in every page head.
160
+ - Use semantic tags: header, nav, main, footer.
149
161
  ```
150
162
 
151
163
  `docs/DEPLOY.md`:
@@ -158,9 +170,9 @@ description: |
158
170
 
159
171
  # Deploy runbook
160
172
 
161
- 1. Generate the pages into public/.
162
- 2. Run the link check.
163
- 3. Start the server: `node server.js`.
173
+ 1. Generate or update the pages in public/.
174
+ 2. Run the link check and fix anything it reports.
175
+ 3. Start the server with `node server.js`, then open the site in your browser.
164
176
  ```
165
177
 
166
178
  Tell the tester: