@skill-map/cli 0.60.4 → 0.61.1

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 (87) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/tutorial/sm-tutorial/SKILL.md +161 -266
  3. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/agents-hub/en/agents-hub.md +2 -0
  4. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/agents-hub/es/agents-hub.md +2 -0
  5. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/content-editor-style/en/content-editor-style.md +1 -0
  6. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/content-editor-style/es/content-editor-style.md +1 -0
  7. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/en/todo-bullet-agent.md +1 -0
  8. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/en/todo-bullet-command.md +1 -0
  9. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/en/todo-bullet-guideline.md +1 -0
  10. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/en/todo-bullet-guideline2.md +1 -0
  11. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/en/todo-bullet-skill.md +1 -0
  12. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/es/todo-bullet-agent.md +1 -0
  13. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/es/todo-bullet-command.md +1 -0
  14. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/es/todo-bullet-guideline.md +1 -0
  15. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/es/todo-bullet-guideline2.md +1 -0
  16. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/es/todo-bullet-skill.md +1 -0
  17. package/dist/cli/tutorial/sm-tutorial/fixtures-data/manifest.json +85 -0
  18. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/cli-external/en/link-validation/hijoA/note-with-external-link.md +10 -0
  19. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/cli-external/en/link-validation/hijoB/spec.md +11 -0
  20. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/cli-external/es/link-validation/hijoA/note-with-external-link.md +10 -0
  21. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/cli-external/es/link-validation/hijoB/spec.md +11 -0
  22. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/en/__PROVIDER__/commands/publish.md +15 -0
  23. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/en/__PROVIDER__/skills/check-links/SKILL.md +16 -0
  24. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/es/__PROVIDER__/commands/publish.md +16 -0
  25. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/es/__PROVIDER__/skills/check-links/SKILL.md +17 -0
  26. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/en/__PROVIDER__/agents/master-agent.md +14 -0
  27. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/en/__PROVIDER__/skills/master-skill/SKILL.md +18 -0
  28. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/en/notes/ideas.md +11 -0
  29. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/es/__PROVIDER__/agents/master-agent.md +15 -0
  30. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/es/__PROVIDER__/skills/master-skill/SKILL.md +18 -0
  31. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/es/notes/ideas.md +11 -0
  32. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/en/AGENTS.md +6 -0
  33. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/en/__PROVIDER__/agents/content-editor.md +21 -0
  34. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/en/docs/DEPLOY.md +11 -0
  35. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/en/docs/STYLE.md +20 -0
  36. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/en/public/index.html +5 -0
  37. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/es/AGENTS.md +7 -0
  38. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/es/__PROVIDER__/agents/content-editor.md +21 -0
  39. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/es/docs/DEPLOY.md +12 -0
  40. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/es/docs/STYLE.md +21 -0
  41. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/es/public/index.html +5 -0
  42. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/shared/CLAUDE.md +1 -0
  43. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/shared/package.json +6 -0
  44. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/shared/server.js +11 -0
  45. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/en/__PROVIDER__/agents/demo-agent.md +16 -0
  46. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/en/__PROVIDER__/commands/demo-command.md +11 -0
  47. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/en/__PROVIDER__/skills/demo-skill/SKILL.md +16 -0
  48. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/en/notes/demo-guideline.md +16 -0
  49. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/en/notes/demo-guideline2.md +12 -0
  50. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/en/notes/private-credentials.md +11 -0
  51. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/en/notes/todo.md +9 -0
  52. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/es/__PROVIDER__/agents/demo-agent.md +16 -0
  53. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/es/__PROVIDER__/commands/demo-command.md +11 -0
  54. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/es/__PROVIDER__/skills/demo-skill/SKILL.md +16 -0
  55. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/es/notes/demo-guideline.md +16 -0
  56. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/es/notes/demo-guideline2.md +13 -0
  57. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/es/notes/private-credentials.md +11 -0
  58. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/es/notes/todo.md +9 -0
  59. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/universal/en/findings.md +10 -0
  60. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/universal/es/findings.md +10 -0
  61. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/universal/shared/.skillmapignore +28 -0
  62. package/dist/cli/tutorial/sm-tutorial/references/_core.md +60 -40
  63. package/dist/cli/tutorial/sm-tutorial/references/_manifest.json +304 -0
  64. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +4 -5
  65. package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +93 -271
  66. package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +1 -2
  67. package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +7 -30
  68. package/dist/cli/tutorial/sm-tutorial/references/part-connect-harness.md +21 -40
  69. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +107 -194
  70. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +58 -143
  71. package/dist/cli/tutorial/sm-tutorial/references/part-plugins.md +2 -3
  72. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +22 -69
  73. package/dist/cli/tutorial/sm-tutorial/scripts/fixtures.js +238 -0
  74. package/dist/cli/tutorial/sm-tutorial/scripts/lib/args.js +29 -0
  75. package/dist/cli/tutorial/sm-tutorial/scripts/lib/fixtures-manifest.js +32 -0
  76. package/dist/cli/tutorial/sm-tutorial/scripts/lib/io.js +37 -0
  77. package/dist/cli/tutorial/sm-tutorial/scripts/lib/manifest.js +24 -0
  78. package/dist/cli/tutorial/sm-tutorial/scripts/lib/paths.js +68 -0
  79. package/dist/cli/tutorial/sm-tutorial/scripts/state.js +262 -0
  80. package/dist/cli.js +7 -8
  81. package/dist/index.js +6 -4
  82. package/dist/kernel/index.js +6 -4
  83. package/dist/ui/chunk-DG3EAGXB.js +3 -0
  84. package/dist/ui/index.html +1 -1
  85. package/dist/ui/{main-VJJVD754.js → main-32BO6UKY.js} +1 -1
  86. package/package.json +5 -3
  87. package/dist/ui/chunk-DDDCORVR.js +0 -3
@@ -1,277 +1,99 @@
1
- # Fixture templates
1
+ # Fixtures and state: the data + script model
2
2
 
3
- Fixtures the orchestrator lays for the auto-fixtured parts. Two full
4
- templates live here: the **master fixture** (Part 4, "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.
3
+ The tutorial no longer embeds fixture content in prose or hand-edits
4
+ the state file. **Content lives in `fixtures-data/` and is laid by
5
+ `scripts/fixtures.js`; progress lives in `tutorial-state.json` and is
6
+ owned by `scripts/state.js`.** This file is the reference for that
7
+ model; the per-chapter invocations live in each `part-*.md`.
11
8
 
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 4): layout (per provider)
22
-
23
- Per §Provider detection in `SKILL.md`, the `<provider_dir>`
24
- placeholder resolves to `.claude/` or `.agents/skills/` depending
25
- on the detected runtime (Google's Antigravity CLI, which replaced
26
- Gemini CLI on 2026-05-19, adopted the same open standard as
27
- `agent-skills`, so both share the `.agents/skills/` layout). Drop
28
- any file whose kind is not in the provider's supported set: on
29
- `agent-skills` / Antigravity only the skill + note are valid;
30
- on `claude` (default) all three apply.
31
-
32
- Canonical layout (substitute `<provider_dir>` per detection):
33
-
34
- ```
35
- <cwd>/
36
- ├── <provider_dir>/
37
- │ ├── agents/ (claude only)
38
- │ │ └── master-agent.md
39
- │ └── skills/ (both providers)
40
- │ └── master-skill/
41
- │ └── SKILL.md
42
- ├── notes/
43
- │ └── ideas.md
44
- └── findings.md
45
- ```
46
-
47
- On `agent-skills` the `agents/` subtree is omitted (the provider
48
- does not claim that kind); the skill lives at
49
- `.agents/skills/master-skill/SKILL.md`.
50
-
51
- Translate the natural-language prose (descriptions, body text,
52
- list items) to the tester's language. Keep paths, frontmatter
53
- keys, identifiers, and link targets in English.
54
-
55
- ## File: `.claude/agents/master-agent.md` (kind: agent)
56
-
57
- ```markdown
58
- ---
59
- name: master-agent
60
- description: |
61
- Example agent used by the advanced tutorial. Has a couple of
62
- tools so the `core/tools-counter` extractor emits a count.
63
- tools: [Read, Bash, Edit]
64
- model: sonnet
65
- ---
66
-
67
- # master-agent
68
-
69
- Walks the master-skill outputs and reports findings. Used as the
70
- target node when we exercise extractors, analyzers, and the
71
- plugin-authoring flow.
72
- ```
73
-
74
- ## File: `.claude/skills/master-skill/SKILL.md` (kind: skill)
75
-
76
- ```markdown
77
- ---
78
- name: master-skill
79
- description: |
80
- Example skill paired with the master-agent for the advanced
81
- tutorial. Links to the agent so extractors and analyzers have
82
- something to chew on.
83
- ---
84
-
85
- # master-skill
86
-
87
- Hands heavy work over to the
88
- [master-agent](../../agents/master-agent.md) and emits a Markdown
89
- report.
90
-
91
- ## Steps
92
- 1. Read the `target`.
93
- 2. Validate the frontmatter.
94
- 3. Delegate to the agent.
95
- ```
96
-
97
- ## File: `notes/ideas.md` (kind: markdown)
98
-
99
- ```markdown
100
- ---
101
- name: Ideas backlog
102
- description: |
103
- Free-form notes for the advanced tutorial. Demonstrates the
104
- catch-all markdown kind alongside the agent and skill.
105
- ---
106
-
107
- # Ideas
108
-
109
- - [ ] Compare extractor outputs side by side.
110
- - [ ] Sketch a tiny plugin that surfaces a counter on the agent.
111
- ```
112
-
113
- ## File: `findings.md`
114
-
115
- ```markdown
116
- # Findings
117
-
118
- If you spot anything weird during the tutorial, log it here.
119
-
120
- Per finding:
121
- - **Chapter**: <id>
122
- - **Command**: `sm ...`
123
- - **Expected**: ...
124
- - **Got**: ...
125
- - **Notes**: ...
126
- ```
127
-
128
- ## Portfolio fixture (Part 1, `portfolio-init`)
129
-
130
- Laid backstage before the tester's `sm init` in Part 1. The Express
131
- skeleton (`server.js`, `package.json`, `public/index.html`) is plain
132
- scaffolding, not `.md`, so the scan ignores it; it makes the project
133
- real and runnable (the daily loop, Part 3, runs and ships it). The one boot node is the
134
- handbook `AGENTS.md`. On `agent-skills` / Antigravity (no `agent`
135
- kind) the harness still works: the agent member is created as a skill
136
- in a later chapter.
137
-
138
- Layout:
9
+ ## Data layout (`fixtures-data/`)
139
10
 
140
11
  ```
141
- <cwd>/
142
- ├── <provider_dir>/ (harness, grown by the chapters)
143
- ├── docs/ (created in the real-kinds chapter)
144
- ├── public/
145
- │ └── index.html
146
- ├── AGENTS.md (the boot node)
147
- ├── server.js
148
- └── package.json
12
+ fixtures-data/
13
+ manifest.json sets, footprints, edits, seeds, providerToken, langs
14
+ sets/<set>/
15
+ shared/ lang-invariant files (code: server.js, package.json, CLAUDE.md)
16
+ en/ es/ one tree per language (files with translatable prose)
17
+ edits/<edit-id>/
18
+ en/ es/ append fragments (one file per fragment)
149
19
  ```
150
20
 
151
- The daily loop (Part 3) grows this further as taught steps, all Layer 2
152
- or loose notes (not part of the harness graph): `public/style.css` plus
153
- the generated pages (`index.html` rewritten, `about.html`,
154
- `projects.html`, `posts.html`), `docs/draft.md`, the renamed `new-page`
155
- command, `AGENTS.sm`, and `.skill-map/settings.local.json`. The
156
- start-over wipe and the `extend` / `cli` clears account for them via
157
- this section.
158
-
159
- ### File: `AGENTS.md` (kind: markdown, the boot node)
160
-
161
- No frontmatter: a real handbook is plain prose (this repo's own
162
- `AGENTS.md` and the tutorial's `CLAUDE.md` carry none either), and a
163
- `name:` that differs from the filename only confuses the tester. The
164
- node displays by its path, `AGENTS.md`.
165
-
166
- **No backtick-wrapped relative `.md` paths in the body either.**
167
- `core/backtick-path` (Decision #127) turns a `` `docs/STYLE.md` `` written
168
- inside a code span into a `points` link, and at kickoff (before the
169
- `docs/` files exist) that link lands as a broken reference, which would
170
- break the "one lonely node" beat the `kickoff` chapter promises. Name the
171
- docs in prose (the style guide, the deploy runbook), never as backticked
172
- paths. They become real nodes in the `real-kinds` chapter and are wired
173
- in explicitly in Part 2.
174
-
175
- ```markdown
176
- # Portfolio handbook
177
-
178
- A small static portfolio site, served by Express (`server.js`). The
179
- `.claude/` harness maintains it: an agent writes the pages, a skill
180
- checks the links, a command publishes. The conventions live in the
181
- style guide; the deploy steps in the deploy runbook.
182
- ```
183
-
184
- ### File: `server.js` (not scanned; runnable scaffolding)
185
-
186
- ```js
187
- // Minimal static server for the portfolio. No framework, one dep.
188
- const express = require('express');
189
- const path = require('node:path');
190
-
191
- const app = express();
192
- app.use(express.static(path.join(__dirname, 'public')));
193
-
194
- const port = process.env.PORT || 3000;
195
- app.listen(port, () => console.log(`Portfolio live at http://localhost:${port}`));
196
- ```
197
-
198
- ### File: `package.json` (not scanned)
199
-
200
- ```json
201
- {
202
- "name": "my-portfolio",
203
- "private": true,
204
- "scripts": { "start": "node server.js" },
205
- "dependencies": { "express": "4.21.2" }
206
- }
207
- ```
208
-
209
- ### File: `public/index.html` (not scanned; placeholder until Part 3)
210
-
211
- ```html
212
- <!doctype html>
213
- <meta charset="utf-8">
214
- <title>My portfolio</title>
215
- <h1>My portfolio</h1>
216
- <p>Pages land here once the content-editor generates them.</p>
217
- ```
218
-
219
- ### `.skillmapignore` additions
220
-
221
- Append to the universal `.skillmapignore` (written in pre-flight, see
222
- `SKILL.md`): `node_modules/` (the Express install) and `public/`
223
- (generated HTML, not part of the harness graph).
224
-
225
- ## Seed snapshots (for `preflight: seed`)
226
-
227
- When the orchestrator enters a seedable part out of order (the campaign
228
- parts when their predecessors are not `done`, or Part 5 `cli` when the
229
- demo fixture is not the one on disk), it fast-forwards the project by
230
- laying the snapshot below, then `sm init` (if `.skill-map/` is missing) +
231
- `sm scan`. These are **checklists, not content**: each row names a file
232
- and the chapter that holds its canonical content. Lay each file by
233
- copying the content from the named chapter (substitute `<provider_dir>`
234
- and skip provider-unsupported kinds per `_core.md`); an `EDIT` row is
235
- applied on top of the file an earlier row laid. Keep these lists in
236
- sync only when a harness FILE is added or removed, the file CONTENT
237
- lives in the chapters, so editing a chapter needs no change here.
238
-
239
- ### Seed snapshot: `harness-built` (start of Part 2)
240
-
241
- The portfolio skeleton plus the harness members Part 1 created, before
242
- any cross-links:
243
-
244
- 1. `AGENTS.md`, `server.js`, `package.json`, `public/index.html`, and
245
- the portfolio `.skillmapignore` additions <- the `## Portfolio
246
- fixture` section above.
247
- 2. `CLAUDE.md` (`@AGENTS.md`) <- part-project-kickoff.md, chapter `manual`.
248
- 3. `<provider_dir>/agents/content-editor.md` <- part-project-kickoff.md, chapter `first-agent`.
249
- 4. `docs/STYLE.md` and `docs/DEPLOY.md` <- part-project-kickoff.md, chapter `real-kinds`.
250
-
251
- ### Seed snapshot: `harness-connected` (start of the daily-loop part)
252
-
253
- Everything in `harness-built`, PLUS the Part 2 wiring:
254
-
255
- 5. `<provider_dir>/skills/check-links/SKILL.md` <- part-connect-harness.md, chapter `check-links`.
256
- 6. `<provider_dir>/commands/publish.md` <- part-connect-harness.md, chapter `publish`.
257
- 7. EDIT `AGENTS.md`: append the two hub bullets (mention `@content-editor`, invoke `/publish`) <- part-connect-harness.md, chapter `links`.
258
- 8. EDIT `<provider_dir>/agents/content-editor.md`: add the `[style guide](../../docs/STYLE.md)` line <- part-connect-harness.md, chapter `links`.
259
-
260
- After laying a campaign snapshot the map matches the state a tester would
261
- have at the END of the part just before the one being entered.
262
-
263
- ### Seed snapshot: `prologue-built` (Part 5 `cli`)
264
-
265
- NOT cumulative and NOT the portfolio: this is the **Part 0 demo
266
- fixture**, the six standalone demo nodes with `notes/todo` wired as the
267
- hub, the state at the end of the prologue's connector chapters: five hub
268
- links, one of them (`@demo-guideline`, a bare mention that resolves to no
269
- agent) a deliberate broken reference that `sm check` reports as a single
270
- `reference-broken` error. Part 5 only reads it. Because it is a different
271
- fixture from the portfolio, entry first resets any portfolio on disk
272
- (see SKILL.md §Entering a part, the `cli` case).
273
-
274
- 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.)
275
- 2. `<provider_dir>/skills/demo-skill/SKILL.md`, `<provider_dir>/commands/demo-command.md`, `notes/todo.md`, `notes/demo-guideline.md`, `notes/demo-guideline2.md` <- part-fundamentals.md, chapter `kinds`.
276
- 3. EDIT `notes/todo.md`: wire the hub bullets pointing at the five other nodes <- part-fundamentals.md, chapter `connectors`.
277
-
21
+ - **`__PROVIDER__`** is a literal path segment in the data tree (e.g.
22
+ `sets/prologue/en/__PROVIDER__/agents/demo-agent.md`). The script
23
+ resolves it per provider: `.claude/agents/…` on claude,
24
+ `.agents/skills/…` on agent-skills (where the `skills/` segment
25
+ collapses, since that layout has no `agents`/`commands` dirs). Only
26
+ the PATH is resolved; file CONTENT is laid verbatim.
27
+ - **Kind** is derived from the path (`__PROVIDER__/agents|commands|skills`
28
+ → agent/command/skill, else markdown); files whose kind the provider
29
+ does not claim are skipped automatically.
30
+ - **Language**: pass `--lang en|es`. A missing language tier for a set
31
+ falls back to the default (`en`). Translate prose (descriptions,
32
+ body, list items, anchor text); keep paths, frontmatter keys, node
33
+ identifiers, link targets, and code in English.
34
+
35
+ ## Sets
36
+
37
+ | Set | What it lays | Used by |
38
+ |---|---|---|
39
+ | `universal` | `.skillmapignore`, `findings.md` | pre-flight |
40
+ | `prologue` | the seven Part 0 demo nodes | Part 0 (progressive, `--only`), `prologue-built` seed |
41
+ | `portfolio` | Express skeleton, handbook, `content-editor`, `docs/STYLE` + `DEPLOY` | Part 1 (`--only` boot, chapters lay the rest), `harness-*` seeds |
42
+ | `harness` | `check-links` skill, `publish` command | Part 2 chapters, `harness-connected` seed |
43
+ | `master` | `master-agent`, `master-skill`, `notes/ideas` | Part 4 `backstage-init` |
44
+ | `cli-external` | `link-validation/hijoA` + `hijoB` | Part 5 `reference-paths` |
45
+
46
+ ## Edits (append fragments)
47
+
48
+ `edit <id>` appends fragment files to a target (after a one-time
49
+ `prefix`). A `requiresKind` on a fragment (or on the edit's target
50
+ kind) drops it on a provider that does not claim that kind.
51
+
52
+ | Edit | Target | Fragments |
53
+ |---|---|---|
54
+ | `todo-connectors` | `notes/todo.md` | five hub bullets (agent / command / skill gated by kind) |
55
+ | `agents-hub` | `AGENTS.md` | the two handbook hub bullets |
56
+ | `content-editor-style` | `<provider_dir>/agents/content-editor.md` | the style-guide reference line (agent target, so skipped on agent-skills) |
57
+
58
+ ## Seeds (fast-forward snapshots)
59
+
60
+ `seed <id>` composes sets + edits + drops to fast-forward into a part
61
+ entered out of order.
62
+
63
+ | Seed | Lays | Edits | Drops |
64
+ |---|---|---|---|
65
+ | `prologue-built` (Part 5) | `prologue` | `todo-connectors` | `notes/private-credentials.md` |
66
+ | `harness-built` (Part 2) | `portfolio` | , | , |
67
+ | `harness-connected` (Part 3) | `portfolio` + `harness` | `agents-hub`, `content-editor-style` | , |
68
+
69
+ ## Footprints (what `clear` and `wipe` remove)
70
+
71
+ `manifest.json#footprints` lists the full on-disk reach of each
72
+ fixture, INCLUDING files a part's later chapters add (the daily loop's
73
+ `public/style.css` + generated pages, the renamed `new-page` command,
74
+ `AGENTS.sm`; the portfolio's `DEPLOYMENT.md` rename). `fixtures.js clear <footprint>` (part-entry resets) and
75
+ `state.js wipe` (start-over) both read it, so the per-fixture path list
76
+ lives in ONE place. Add or drop a harness file there.
77
+
78
+ ## Changing a fixture
79
+
80
+ Edit the data file under `fixtures-data/`; the chapter that teaches it
81
+ reads the same file (the agent lays it with `fixtures.js`, or shows it
82
+ to the tester with `fixtures.js cat <set> --file <relpath>`). There is
83
+ no second copy to keep in sync. After any change, rebuild
84
+ (`pnpm --filter @skill-map/cli build`) so the byte-for-byte payload
85
+ test sees the new bytes.
86
+
87
+ ## Authoring notes (still apply)
88
+
89
+ - **A `command` node's H1 is a plain title (`# publish`), never the
90
+ slash form (`# /publish`).** The `slash` extractor reads a `/name`
91
+ token anywhere in the body (the H1 included) as an `invoke`, so
92
+ `# /publish` makes the command invoke itself and `sm check` emits a
93
+ spurious `core/link-self-loop`. Holds for every command fixture
94
+ (`demo-command`, `publish`, the daily-loop `init`).
95
+ - **No backtick-wrapped relative `.md` paths in `AGENTS.md`'s body.**
96
+ `core/backtick-path` turns a `` `docs/STYLE.md` `` in a code span
97
+ into a `points` link; at kickoff (before `docs/` exists) that lands
98
+ as a broken reference and breaks the "one lonely node" beat. Name
99
+ the docs in prose, never as backticked paths.
@@ -282,5 +282,4 @@ Mark `authoring-6-upgrade: done`.
282
282
  >
283
283
  > Anything weird worth logging? If not, back to the menu.
284
284
 
285
- Mark the authoring chapters done in `tutorial-state.yml`, update
286
- the matching harness task, return to the menu in `SKILL.md`.
285
+ Mark the chapters done (rule #4) and return to the menu in `SKILL.md`.
@@ -92,7 +92,13 @@ Mark `annotations`: done.
92
92
 
93
93
  **Context**: until now the map saw only files inside the cwd. In real projects a repo often links to files in a sibling repo (a specs project, a sibling package in a monorepo). Skill-map only scans from its cwd downwards, so a link to `../sibling/file.md` shows up as broken. The fix is to declare the external folders in `scan.referencePaths`, which lets the `reference-broken` analyzer validate path-style links against those extra roots **without indexing their files as nodes**. The folders are checked, not walked as part of the map.
94
94
 
95
- **Setup (you, silent)**: write the fixture under the tutorial cwd so both sub-projects are siblings of each other but children of the tutorial root. The agent does this with `Write`, no confirmation beat needed, the tester learns about the files in the next message.
95
+ **Setup (you, silent)**: lay the fixture under the tutorial cwd so both sub-projects are siblings of each other but children of the tutorial root (its content + translation live in `fixtures-data/`). No confirmation beat needed, the tester learns about the files in the next message. Backstage (silent):
96
+
97
+ ```
98
+ node .claude/skills/sm-tutorial/scripts/fixtures.js lay cli-external --provider <provider> --lang <lang>
99
+ ```
100
+
101
+ The fixture lays:
96
102
 
97
103
  ```
98
104
  link-validation/
@@ -102,35 +108,6 @@ link-validation/
102
108
  └── spec.md ← the real target file
103
109
  ```
104
110
 
105
- `link-validation/hijoA/note-with-external-link.md`:
106
- ```markdown
107
- ---
108
- name: note-with-external-link
109
- description: |
110
- Demo note that links out to a sibling project (hijoB) sitting
111
- next to this one. Used to teach scan.referencePaths.
112
- ---
113
-
114
- # Note with external link
115
-
116
- See the [spec](../hijoB/spec.md) for the agreed format.
117
- ```
118
-
119
- `link-validation/hijoB/spec.md`:
120
- ```markdown
121
- ---
122
- name: spec
123
- description: |
124
- Target of the cross-folder link. Lives outside hijoA's scan
125
- scope on purpose: that is precisely what scan.referencePaths
126
- is designed to bridge.
127
- ---
128
-
129
- # External spec
130
-
131
- Anything that hijoA points at lives here.
132
- ```
133
-
134
111
  Once the files are in place, tell the tester:
135
112
 
136
113
  > I just dropped two sibling folders inside the tutorial cwd:
@@ -6,25 +6,12 @@ This is the wiring part. Part 1 grew a small set of standalone nodes around the
6
6
 
7
7
  **Context**: the harness needs a guard that runs before publishing: a skill that walks every page and checks the internal links resolve. We only create it here (its first standalone `skill` node); the `publish` command in the next chapter is what invokes it.
8
8
 
9
- `Write` `.claude/skills/check-links/SKILL.md` (substitute `<provider_dir>` per `_core.md`; this kind exists on every provider, so no skip):
9
+ Lay the `check-links` skill (its content + translation live in
10
+ `fixtures-data/`; this kind exists on every provider, so no skip).
11
+ Backstage (silent):
10
12
 
11
- ```markdown
12
- ---
13
- name: check-links
14
- description: |
15
- Validates the portfolio's internal links before publishing. Walks
16
- every generated page and reports any link whose target is missing.
17
- ---
18
-
19
- # check-links
20
-
21
- The last gate before the site goes out.
22
-
23
- ## Steps
24
- 1. List every HTML file under `public/`.
25
- 2. For each page, collect its internal links (every `href` to `/` or to a `.html` file).
26
- 3. Check the target exists under `public/` (treat `/` as `public/index.html`).
27
- 4. Report any link whose target is missing; if none, report "0 broken links".
13
+ ```
14
+ node .claude/skills/sm-tutorial/scripts/fixtures.js lay harness --only "__PROVIDER__/skills/check-links/SKILL.md" --provider <provider> --lang <lang>
28
15
  ```
29
16
 
30
17
  Tell the tester:
@@ -45,7 +32,7 @@ Wait for confirmation. Mark `check-links`: done.
45
32
 
46
33
  On `agent-skills` / Antigravity there is no `command` kind, so skip this whole chapter and fold its purpose into the prose of the next one.
47
34
 
48
- Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them. The frontmatter fence (`---`) MUST sit on column 0 with no leading spaces: present the block below exactly as written, and if the tester pastes it indented, have them strip the leading whitespace. An indented `---` does not parse as YAML, so the `publish` node would land without its `name` or `description`.
35
+ Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them. Backstage, get the content: `node .claude/skills/sm-tutorial/scripts/fixtures.js cat harness --file "__PROVIDER__/commands/publish.md" --provider <provider> --lang <lang>`, then render it as a **top-level fenced code block**: at column 0, NOT inside the `> ` blockquote and with NO leading indentation, so the tester's copy keeps every line flush left. The frontmatter fences (`---`) MUST land on column 0. If the block is rendered (or pasted) indented, the opening and closing `---` shift off column 0, the YAML never parses, and the `publish` node loads body-only without its `name` / `description` (`sm check` then warns `frontmatter-malformed`). Present the block below exactly as written.
49
36
 
50
37
  > Create `.claude/commands/publish.md` with exactly this content (the first line is `---`, nothing before it):
51
38
 
@@ -91,25 +78,20 @@ Continue the tester message:
91
78
  >
92
79
  > Did the three arrows appear?
93
80
 
94
- Wait for confirmation. You MAY use `Read` on the file afterwards to verify it landed. Mark `publish`: done.
81
+ Wait for confirmation. You MAY use `Read` on the file afterwards to verify it landed, in particular that the opening and closing `---` are flush at column 0. If a later `sm check` flags `frontmatter-malformed` on `publish.md`, the fences got indented on paste: have the tester re-align every line flush left (strip the leading spaces so `---` is at column 0), then the next scan reads it clean. Mark `publish`: done.
95
82
 
96
83
  ## Chapter `links` - The handbook becomes the hub (~4 min)
97
84
 
98
85
  **Context**: the handbook (`AGENTS.md`) has been a lonely node since Part 1. Here it becomes the hub: we add two bullets so it mentions the content editor and invokes the publish command. We also give the content editor a reference to the style guide it follows. Several connectors land, and we recap the three link kinds and which syntax produced each.
99
86
 
100
- Apply both edits with `Edit` (do not rewrite the files).
87
+ Apply both edits (their content + translation live in `fixtures-data/`).
88
+ The first appends the two hub bullets to `AGENTS.md`; the second adds
89
+ the style-guide reference line to the content-editor (an agent target,
90
+ so it folds away on `agent-skills`). Backstage (silent):
101
91
 
102
- **Edit `AGENTS.md`**: append these two bullets at the end of the body (substitute `<provider_dir>` only in prose, the link tokens below stay as written):
103
-
104
- ```markdown
105
- - When a page needs writing or fixing, brief @content-editor.
106
- - When the site is ready to go out, run /publish.
107
92
  ```
108
-
109
- **Edit `.claude/agents/content-editor.md`**: add this line at the end of the body, after the `Rules:` line (substitute `<provider_dir>` per `_core.md`):
110
-
111
- ```markdown
112
- Every page follows the [style guide](../../docs/STYLE.md).
93
+ node .claude/skills/sm-tutorial/scripts/fixtures.js edit agents-hub --provider <provider> --lang <lang>
94
+ node .claude/skills/sm-tutorial/scripts/fixtures.js edit content-editor-style --provider <provider> --lang <lang>
113
95
  ```
114
96
 
115
97
  Tell the tester:
@@ -140,7 +122,7 @@ Wait for confirmation. You MAY use `Read` on the two files afterwards to verify
140
122
 
141
123
  ## Chapter `confidence` - How sure is each link (~3 min)
142
124
 
143
- **Context**: skill-map records how sure it is of every connection and shows that as opacity. In this harness every link resolves to a real node, so they all read solid (1.00); the broken-reference case is the one the tester met in the prologue (the bare `@demo-guideline` mention that resolved to no agent, drawn as no arrow and flagged `reference-broken` at 0.50). Here we open the Inspector on a real harness node, read the all-solid numbers, and point back to that prologue contrast. Mirrors the prologue's connectors beat on the portfolio.
125
+ **Context**: skill-map records how sure it is of every connection and shows that as opacity. In this harness every link resolves to a real node, so they all read solid (1.00); the broken-reference case is the one the tester met in the prologue (the `@demo-guideline` reference skill-map could not resolve, drawn as no arrow and flagged `reference-broken` at 0.50, then resolved by hand with `.md`). Here we open the Inspector on a real harness node, read the all-solid numbers, and point back to that prologue contrast. Mirrors the prologue's connectors beat on the portfolio.
144
126
 
145
127
  No file edits in this chapter, pure observation on the graph the tester just built.
146
128
 
@@ -165,14 +147,13 @@ Tell the tester:
165
147
  >
166
148
  > Your whole harness reads solid because every link lands on a real
167
149
  > node, that is what a clean, fully wired graph looks like. So what
168
- > does a link that does NOT resolve look like? You saw one back in the
169
- > prologue: `@demo-guideline` was a bare `@`-mention, and a bare
170
- > `@handle` only resolves to an agent. `demo-guideline` is a note, so
171
- > it had nothing to land on: skill-map drew no arrow and flagged it as
172
- > a **broken reference**, its confidence knocked down to **0.50** by
173
- > the broken penalty. The fix there was one character:
174
- > `@demo-guideline2.md`, the same handle plus a `.md`, resolved to the
175
- > real file and drew a solid arrow at **1.00**.
150
+ > does a link that does NOT resolve look like? You met one back in the
151
+ > prologue: `@demo-guideline` was a reference skill-map could not
152
+ > resolve, it had nothing to land on, so skill-map drew no arrow and
153
+ > flagged it as a **broken reference**, its confidence knocked down to
154
+ > **0.50** by the broken penalty. The fix was one character: adding
155
+ > `.md` (`@demo-guideline.md`) turned it into a file reference to the
156
+ > real `demo-guideline.md`, and it drew a solid arrow at **1.00**.
176
157
  >
177
158
  > So confidence here is really about resolution: **1.00** for a link
178
159
  > that lands on a real node, **0.50** for one flagged broken. There is