@skill-map/cli 0.60.3 → 0.61.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 (87) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/tutorial/sm-tutorial/SKILL.md +149 -263
  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 +87 -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 +18 -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 +18 -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 +55 -40
  63. package/dist/cli/tutorial/sm-tutorial/references/_manifest.json +309 -0
  64. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +1 -1
  65. package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +94 -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 +12 -30
  69. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +6 -4
  70. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +14 -116
  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 +13 -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-FDBHGLTW.js +3 -0
  84. package/dist/ui/index.html +1 -1
  85. package/dist/ui/{main-HAPQJZOA.js → main-5GMGTLYQ.js} +1 -1
  86. package/package.json +5 -3
  87. package/dist/ui/chunk-HOIHEE6W.js +0 -3
@@ -1,277 +1,100 @@
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
+ `docs/draft.md`, `public/style.css` + generated pages, the renamed
74
+ `new-page` command, `AGENTS.sm`; the portfolio's `DEPLOYMENT.md`
75
+ rename). `fixtures.js clear <footprint>` (part-entry resets) and
76
+ `state.js wipe` (start-over) both read it, so the per-fixture path list
77
+ lives in ONE place. Add or drop a harness file there.
78
+
79
+ ## Changing a fixture
80
+
81
+ Edit the data file under `fixtures-data/`; the chapter that teaches it
82
+ reads the same file (the agent lays it with `fixtures.js`, or shows it
83
+ to the tester with `fixtures.js cat <set> --file <relpath>`). There is
84
+ no second copy to keep in sync. After any change, rebuild
85
+ (`pnpm --filter @skill-map/cli build`) so the byte-for-byte payload
86
+ test sees the new bytes.
87
+
88
+ ## Authoring notes (still apply)
89
+
90
+ - **A `command` node's H1 is a plain title (`# publish`), never the
91
+ slash form (`# /publish`).** The `slash` extractor reads a `/name`
92
+ token anywhere in the body (the H1 included) as an `invoke`, so
93
+ `# /publish` makes the command invoke itself and `sm check` emits a
94
+ spurious `core/link-self-loop`. Holds for every command fixture
95
+ (`demo-command`, `publish`, the daily-loop `init`).
96
+ - **No backtick-wrapped relative `.md` paths in `AGENTS.md`'s body.**
97
+ `core/backtick-path` turns a `` `docs/STYLE.md` `` in a code span
98
+ into a `points` link; at kickoff (before `docs/` exists) that lands
99
+ as a broken reference and breaks the "one lonely node" beat. Name
100
+ 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 in the fenced block the tester copies. 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`.
49
36
 
50
37
  > Create `.claude/commands/publish.md` with exactly this content (the first line is `---`, nothing before it):
51
38
 
@@ -97,19 +84,14 @@ Wait for confirmation. You MAY use `Read` on the file afterwards to verify it la
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:
@@ -14,8 +14,9 @@ substitution, the `> ` rendering rule, the per-step cycle, §Closing a part,
14
14
  **The site is the tester's.** The `setup` chapter asks who it is for and builds
15
15
  it around that answer. Identity lives in Layer 2 (the HTML / CSS under
16
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 }`).
17
+ what the tester names their portfolio. Persist the answer with
18
+ `state.js set-identity --name "<name>" --tagline "<tagline>"` (it records
19
+ `tester.site_identity` in `tutorial-state.json`).
19
20
 
20
21
  **Provider note (read once).** Substitute `.claude/` with the detected
21
22
  `<provider_dir>`. On `agent-skills` / Antigravity the `content-editor` is a
@@ -49,8 +50,9 @@ correct, not a bug.
49
50
  1. Ask the tester, in one short exchange: what the site should be called (their
50
51
  name or a title) and one line about what it is for. Keep it light; if they do
51
52
  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 }`).
53
+ web"). Persist both with
54
+ `node .claude/skills/sm-tutorial/scripts/state.js set-identity --name "<name>" --tagline "<tagline>"`
55
+ (it writes `tester.site_identity` into `tutorial-state.json`).
54
56
  2. Backstage, `Write` `public/style.css` exactly as below (Layer 2, ignored by
55
57
  the scan; one stylesheet shared by every page).
56
58
  3. `Write` `public/index.html` and `public/about.html` from the templates below,