@skill-map/cli 0.69.0 → 0.70.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 (38) hide show
  1. package/dist/cli/tutorial/sm-tutorial/SKILL.md +8 -3
  2. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/agents-hub/providers/codex/en/agents-hub.md +2 -0
  3. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/agents-hub/providers/codex/es/agents-hub.md +2 -0
  4. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/codex/en/todo-bullet-agent.md +1 -0
  5. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/codex/en/todo-bullet-command.md +1 -0
  6. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/codex/en/todo-bullet-skill.md +1 -0
  7. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/codex/es/todo-bullet-agent.md +1 -0
  8. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/codex/es/todo-bullet-command.md +1 -0
  9. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/codex/es/todo-bullet-skill.md +1 -0
  10. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/codex/en/__PROVIDER__/skills/publish/SKILL.md +2 -2
  11. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/codex/es/__PROVIDER__/skills/publish/SKILL.md +2 -2
  12. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/codex/en/.codex/agents/master-agent.toml +1 -1
  13. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/codex/es/.codex/agents/master-agent.toml +1 -1
  14. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/codex/en/.codex/agents/content-editor.toml +1 -1
  15. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/codex/es/.codex/agents/content-editor.toml +1 -1
  16. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/en/.codex/agents/demo-agent.toml +1 -1
  17. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/es/.codex/agents/demo-agent.toml +1 -1
  18. package/dist/cli/tutorial/sm-tutorial/references/_core.md +46 -27
  19. package/dist/cli/tutorial/sm-tutorial/references/part-basic-daily.md +18 -13
  20. package/dist/cli/tutorial/sm-tutorial/references/part-basic-fundamentals.md +6 -7
  21. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +97 -26
  22. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +11 -10
  23. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +13 -11
  24. package/dist/cli/tutorial/sm-tutorial/scripts/lib/paths.js +6 -5
  25. package/dist/cli.js +267 -128
  26. package/dist/index.js +9 -7
  27. package/dist/kernel/index.d.ts +27 -0
  28. package/dist/kernel/index.js +9 -7
  29. package/dist/ui/{chunk-RRRXQNG6.js → chunk-EVNCL7FV.js} +21 -21
  30. package/dist/ui/{chunk-E7GLGHVY.js → chunk-GUGB4JY5.js} +1 -1
  31. package/dist/ui/chunk-RJUHQQOF.js +3 -0
  32. package/dist/ui/{chunk-SXSNTF26.js → chunk-RSPEJBPT.js} +1 -1
  33. package/dist/ui/chunk-SQCXHF3J.js +2 -0
  34. package/dist/ui/index.html +1 -1
  35. package/dist/ui/{main-23NGLEUB.js → main-K4O6LCIJ.js} +3 -3
  36. package/package.json +2 -2
  37. package/dist/ui/chunk-RLRSNHYG.js +0 -3
  38. package/dist/ui/chunk-SI4MGFOW.js +0 -2
@@ -64,9 +64,14 @@ ls -A
64
64
  ```
65
65
 
66
66
  **Items you ignore** when evaluating "empty" (internal
67
- infrastructure, not user content): `.claude` (skills/agents infra),
68
- `.tmp` (Claude Code scratch dir), `SKILL.md` / `sm-tutorial.md`
69
- (loose copies of this skill), `tutorial-state.json` (resume mode).
67
+ infrastructure, not user content): the provider scaffold dirs `sm
68
+ tutorial` drops for the active lens, `.claude`, `.codex`, `.agents`,
69
+ `.agent` (the vendor marker plus the open-standard skill home, e.g.
70
+ codex drops both `.codex/` and `.agents/skills/`), `.git` (a
71
+ version-control dir alone is a fresh repo, not user content; real
72
+ files alongside it still trip the check), `.tmp` (Claude Code
73
+ scratch dir), `SKILL.md` / `sm-tutorial.md` (loose copies of this
74
+ skill), `tutorial-state.json` (resume mode).
70
75
 
71
76
  The whitelist is internal; do NOT enumerate it to the tester.
72
77
 
@@ -0,0 +1,2 @@
1
+ - When a page needs writing or fixing, brief [content-editor](.codex/agents/content-editor.toml).
2
+ - When the site is ready to go out, run $publish.
@@ -0,0 +1,2 @@
1
+ - Cuando una página necesita escribirse o arreglarse, informa a [content-editor](.codex/agents/content-editor.toml).
2
+ - Cuando el sitio esté listo para salir, corre $publish.
@@ -0,0 +1 @@
1
+ - [ ] Brief [demo-agent](../.codex/agents/demo-agent.toml) on the rough edges.
@@ -0,0 +1 @@
1
+ - [ ] Trigger $demo-skill when the input lands.
@@ -0,0 +1 @@
1
+ - [ ] Informa a [demo-agent](../.codex/agents/demo-agent.toml) sobre los detalles pendientes.
@@ -0,0 +1 @@
1
+ - [ ] Dispara $demo-skill cuando llegue la entrada.
@@ -10,6 +10,6 @@ description: |
10
10
  The one skill you run when the site is ready to go out.
11
11
 
12
12
  ## Steps
13
- 1. Run /check-links on the pages in public/. If it reports broken links, stop and fix them first.
14
- 2. If a page needs a content fix, brief @content-editor with the change.
13
+ 1. Run $check-links on the pages in public/. If it reports broken links, stop and fix them first.
14
+ 2. If a page needs a content fix, brief [content-editor](../../../.codex/agents/content-editor.toml) with the change.
15
15
  3. Follow the [deploy runbook](../../../docs/DEPLOY.md): regenerate pages, run the link check, start the server.
@@ -11,6 +11,6 @@ description: |
11
11
  La única skill que corres cuando el sitio está listo para salir.
12
12
 
13
13
  ## Pasos
14
- 1. Corre /check-links sobre las páginas en public/. Si reporta enlaces rotos, frena y arréglalos primero.
15
- 2. Si una página necesita un arreglo de contenido, dale el cambio a @content-editor.
14
+ 1. Corre $check-links sobre las páginas en public/. Si reporta enlaces rotos, frena y arréglalos primero.
15
+ 2. Si una página necesita un arreglo de contenido, dale el cambio a [content-editor](../../../.codex/agents/content-editor.toml).
16
16
  3. Sigue el [runbook de despliegue](../../../docs/DEPLOY.md): regenera las páginas, corre el chequeo de enlaces, inicia el servidor.
@@ -1,6 +1,6 @@
1
1
  name = "master-agent"
2
2
  description = "Example agent used by the advanced tutorial. The target node when we exercise extractors, analyzers, and the plugin-authoring flow."
3
- model = "gpt-5-codex"
3
+ model = "gpt-5.5"
4
4
  developer_instructions = """
5
5
  # master-agent
6
6
 
@@ -1,6 +1,6 @@
1
1
  name = "master-agent"
2
2
  description = "Agente de ejemplo que usa el tutorial avanzado. Es el nodo objetivo cuando ejercitamos extractors, analyzers y el flujo de autoría de plugins."
3
- model = "gpt-5-codex"
3
+ model = "gpt-5.5"
4
4
  developer_instructions = """
5
5
  # master-agent
6
6
 
@@ -1,6 +1,6 @@
1
1
  name = "content-editor"
2
2
  description = "Writes and edits the portfolio's pages. Reads a brief, follows the style guide, and emits the HTML into public/."
3
- model = "gpt-5-codex"
3
+ model = "gpt-5.5"
4
4
  developer_instructions = """
5
5
  # content-editor
6
6
 
@@ -1,6 +1,6 @@
1
1
  name = "content-editor"
2
2
  description = "Escribe y edita las páginas del portfolio. Lee un brief, sigue la guía de estilo y emite el HTML en public/."
3
- model = "gpt-5-codex"
3
+ model = "gpt-5.5"
4
4
  developer_instructions = """
5
5
  # content-editor
6
6
 
@@ -1,6 +1,6 @@
1
1
  name = "demo-agent"
2
2
  description = "Example agent that handles read and shell tasks. Solo node at boot; gets connected to the rest of the demo fixture during the Live UI step."
3
- model = "gpt-5-codex"
3
+ model = "gpt-5.5"
4
4
  developer_instructions = """
5
5
  # demo-agent
6
6
 
@@ -1,6 +1,6 @@
1
1
  name = "demo-agent"
2
2
  description = "Agente de ejemplo que maneja tareas de lectura y shell. Nodo solo al arranque; se conecta al resto del fixture demo durante el paso de UI en vivo."
3
- model = "gpt-5-codex"
3
+ model = "gpt-5.5"
4
4
  developer_instructions = """
5
5
  # demo-agent
6
6
 
@@ -259,7 +259,7 @@ A skill-map project reads its files through exactly ONE active lens
259
259
  | Provider | Asset layout | Kinds | Connectors that form | Marker | Stability | Track |
260
260
  |----------------|-------------------------------------------|--------------------------------|--------------------------------|--------------------|------------------|---------|
261
261
  | `claude` | `.claude/` (agents, commands, skills) | agent, command, skill, markdown| `/` invokes, `@` mentions, refs| `.claude/` | stable | rich |
262
- | `codex` | `.codex/agents/*.toml` + `.agents/skills/`| agent (TOML), skill, markdown | `/` invokes, `@` mentions, refs| `.codex/` | beta | rich |
262
+ | `codex` | `.codex/agents/*.toml` + `.agents/skills/`| agent (TOML), skill, markdown | `$` invokes, `@` file-refs, refs| `.codex/` | beta | rich |
263
263
  | `antigravity` | `.agents/skills/` | skill, markdown | `/` invokes, refs | `.agent/workflows/`| beta | basic |
264
264
  | `agent-skills` | `.agents/skills/` | skill, markdown | refs only | `.agents/` | stable (default) | basic |
265
265
 
@@ -269,8 +269,11 @@ active; it is the universal base, never a selectable lens.
269
269
  **Two tracks, by capability** (the axis is "does the lens have an
270
270
  `agent` kind?"):
271
271
 
272
- - **rich** (`claude`, `codex`): agents + skills (+ commands on claude),
273
- wired with `/` invocations and `@` mentions plus markdown references.
272
+ - **rich** (`claude`, `codex`): agents + skills (+ commands on claude).
273
+ Claude wires `/` invocations and `@` mentions; Codex wires `$` invocations
274
+ (skills) and `@`-FILE references (Codex's `@` is a file picker, it cannot
275
+ mention an agent by name, and `/` is a Codex built-in command, not a skill
276
+ invocation). Both also use markdown references.
274
277
  - **basic** (`agent-skills`, `antigravity`): the open-standard family,
275
278
  `skill` + `markdown` only, wired with **markdown references**
276
279
  (`[text](path)`), the one connection the Agent Skills standard
@@ -280,8 +283,10 @@ active; it is the universal base, never a selectable lens.
280
283
 
281
284
  Why references and not slash on the open standard: the Agent Skills
282
285
  spec (agentskills.io) activates a skill by its `description` and
283
- connects files by relative markdown links; it has no `/`-invocation
284
- syntax. claude/codex add `/` and `@` as vendor features on top.
286
+ connects files by relative markdown links; it has no invocation sigil.
287
+ Vendors add their own on top: claude `/`-invokes and `@`-mentions; Codex
288
+ `$`-invokes skills and treats `@` as a file picker (`/` is a Codex
289
+ built-in command, not a skill invocation).
285
290
 
286
291
  **Decision logic, applied silently at pre-flight:**
287
292
 
@@ -296,14 +301,17 @@ syntax. claude/codex add `/` and `@` as vendor features on top.
296
301
  `<provider_dir> = .claude`, `track = rich`.
297
302
  - else skill under `.agents/skills/sm-tutorial/` → `provider = agent-skills`,
298
303
  `<provider_dir> = .agents/skills`, `track = basic`.
299
- **Lens ambiguity for codex / antigravity**: both adopt the open
300
- `.agents/skills/` layout, so their own marker (`.codex/` or
301
- `.agent/workflows/`) coexists with the `agent-skills` marker (`.agents/`)
302
- and a plain `sm scan --yes` reports the lens as ambiguous. For those two,
303
- set it explicitly once before the first scan, `sm config set
304
- activeProvider <codex|antigravity> --yes`, then the book runs unchanged
305
- (the fixture engine renders the right shape: codex its TOML agents +
306
- command-as-skill, antigravity reuses the `agent-skills` overlays).
304
+ **Lens precedence for codex / antigravity**: both adopt the open
305
+ `.agents/skills/` layout, so the scaffold leaves the vendor marker
306
+ (`.codex/` or `.agent/workflows/`) alongside the `agent-skills` marker
307
+ (`.agents/`). The vendor marker WINS: `sm init` resolves `codex` /
308
+ `antigravity` outright with no prompt (the `.agents/` open default only
309
+ competes when no vendor marker is present). So the codex book runs
310
+ exactly like claude, `sm init` then `sm`, with no lens prompt and no
311
+ `sm config set activeProvider` step anywhere (tester chapters or
312
+ backstage seeds). The fixture engine still renders the right shape:
313
+ codex its TOML agents + command-as-skill, antigravity reuses the
314
+ `agent-skills` overlays.
307
315
  2. `state.js init --provider <p>` persists `provider` plus the derived
308
316
  `track`, so a resumed session never re-detects.
309
317
  3. Render only the parts whose `track` is `tutorial.track` (or `both`).
@@ -325,31 +333,42 @@ at `.claude/skills/sm-tutorial/` (this repo is itself a Claude project);
325
333
 
326
334
  ### Rendering the rich book on Codex
327
335
 
328
- The rich track has two lenses, `claude` and `codex`. They teach the SAME
329
- lessons with the SAME connectors (`/` invocations, `@` mentions, markdown
330
- references all resolve on both), so the rich part bodies are written in the
331
- `claude` shape; when `tutorial.provider == codex`, apply these substitutions:
336
+ The rich track has two lenses, `claude` and `codex`. They teach the same
337
+ lessons, but Codex's CONNECTOR GRAMMAR differs from claude's (see the
338
+ Connectors bullet below), so the rich part bodies are written in the `claude`
339
+ shape; when `tutorial.provider == codex`, apply these substitutions:
332
340
 
333
341
  - **Agents are TOML.** A Codex agent is a single `.codex/agents/<name>.toml`
334
342
  file (the prompt lives in its `developer_instructions` field), NOT a
335
343
  `.claude/agents/<name>.md`. The fixtures lay them, so when a chapter says
336
344
  "open the agent file" point at the `.toml`; a chapter that has the tester
337
345
  read or tweak an agent works on the TOML frontmatter / `developer_instructions`.
346
+ - **Connectors differ.** Codex invokes a skill with `$<name>` (NOT `/`, which
347
+ is a Codex built-in command), and `@<name>` is a FILE picker, not an agent
348
+ mention. So where the claude book writes `/check-links` (invoke) say
349
+ `$check-links`; where it writes `@content-editor` (mention an agent),
350
+ reference the agent's FILE instead, a markdown link `[content-editor](<rel-path>.toml)`
351
+ or a file-shaped `@<file>.md` / `@<file>.toml`; a bare `@<name>` (no
352
+ path/extension) forms NOTHING on Codex. The codex fixture overlays already
353
+ carry the `$`/file-ref shapes, narrate them, do not re-derive.
338
354
  - **No `command` kind.** Where the claude book authors a `command` (the
339
- `/publish` command, the reserved-name chapter's `model` command), Codex uses a
340
- **skill** at `.agents/skills/<name>/SKILL.md`. The body is identical (same
341
- `/check-links` + `@content-editor` + deploy reference); only the kind and path
342
- change. `cat <set> --file --provider codex` already returns the Codex skill
343
- body, so the create-the-file block stays a copy-paste. The reserved-name beat
344
- uses a skill named with a reserved verb (Codex inherits the open-standard
345
- `COMMONS_RESERVED_NAMES`, e.g. `model`), exactly like the basic track's
346
- `reserved` chapter, on a skill instead of a command.
355
+ `/publish` command), Codex uses a **skill** at `.agents/skills/<name>/SKILL.md`.
356
+ The body uses the CODEX grammar (`$check-links` to invoke, a file reference to
357
+ `content-editor` instead of an `@`-mention, per Connectors above); the codex
358
+ fixture overlay already carries that shape, so the create-the-file block
359
+ (`cat <set> --file --provider codex`) stays a copy-paste.
360
+ - **No reserved skill names on Codex.** Codex `$`-invokes skills, a namespace
361
+ disjoint from its `/` built-in commands, so a skill named like a built-in
362
+ (`model`) does NOT collide with `/model` and is NOT flagged. The claude
363
+ `reserved` chapter (a `/model` COMMAND collides) has no Codex equivalent; the
364
+ daily-loop `reserved` Codex delta reframes / skips it (see that chapter).
347
365
  **Apply every substitution silently.** Use the Codex path, kind and file
348
366
  directly in the tester-facing prose, but never EXPLAIN the substitution or
349
367
  compare it to the claude shape. The Codex tester only ever sees a `skill`
350
368
  where the claude book has a command; never tell them "Codex has no `command`
351
- kind", never say a node "is a command that shows as a skill", never reference
352
- "the claude command". On Codex these nodes were always skills, there is
369
+ kind", never say a node "is a command that shows as a skill" or that it
370
+ "replaces" / "stands in for" / "reemplaza" a command, never append a parenthetical
371
+ like "(in Codex this replaces the command)", never reference "the claude command". On Codex these nodes were always skills, there is
353
372
  nothing to explain. (Same for the TOML-agent and path swaps above: point the
354
373
  tester at the real `.toml` / `.agents/` file when they interact with it, just
355
374
  do not narrate that it "would be" something else on claude.)
@@ -165,24 +165,29 @@ Creates a blank page so you can start writing.
165
165
  The watcher picks up the new skill. Tell the tester:
166
166
 
167
167
  > I added a skill named `model`. Watch the **Map**: the new `model` skill node
168
- > appears, but flagged with a **warning** marker. Open its inspector: it reads
169
- > `name-reserved`, `model` shadows one of the agent runtime's own built-in verbs
170
- > (like `help`, `clear`, `config`), so the runtime would silently ignore your
171
- > skill, it never runs. The fix is a name the runtime does not own.
168
+ > appears **clean, no warning**. On the open Agent Skills standard a skill is
169
+ > activated by its `description`, not invoked by a `/` command, so a skill name
170
+ > can never collide with a built-in command, there are NO reserved skill names.
171
+ > Name your skills anything you like, even after a CLI built-in like `model` or
172
+ > `help`.
172
173
  >
173
- > Rename it to `new-page`: first rename the folder `<provider_dir>/model/` to
174
- > `<provider_dir>/new-page/`. Then open `new-page/SKILL.md` and, at the top where
175
- > the frontmatter says `name: model`, change it to `name: new-page`. Save.
174
+ > The one exception is a vendor that bolts `/`-invocation onto the standard:
175
+ > Google's Antigravity invokes skills with `/<name>`, so under the Antigravity
176
+ > lens a skill named after one of its built-in verbs (like `goal`) WOULD be
177
+ > flagged `name-reserved`. The neutral open standard you are on reserves nothing.
176
178
  >
177
- > Watch the **Map** again: the warning clears and the node is now `new-page`, all
178
- > live. What cleared it was changing `frontmatter.name` (which for a skill must
179
- > match its folder, so you renamed both). Now `new-page` is yours and the runtime
180
- > will run it.
181
- >
182
- > Did the warning clear after the rename?
179
+ > See the `model` node land clean, with no warning?
183
180
 
184
181
  Wait for confirmation. Mark `reserved`: done. Auto-advance to `publish`.
185
182
 
183
+ **Antigravity delta** (`tutorial.provider == antigravity`): skills ARE
184
+ `/`-invoked here, so a built-in verb DOES collide. Name the skill `goal` (an
185
+ Antigravity built-in) instead of `model`, narrate the `name-reserved`
186
+ **warning** that appears, and have the tester clear it by renaming the folder +
187
+ `frontmatter.name` to `new-page` (the warning clears live). That collision-and-
188
+ fix beat is the Antigravity version; `agent-skills` gets the "names are free"
189
+ lesson above.
190
+
186
191
  ---
187
192
 
188
193
  **Act C - Publish**
@@ -251,8 +251,12 @@ each ends with its own confirmation. Do NOT prepend an intro line to a block.
251
251
  > `Search…`). Type `guideline`. Watch the tree narrow to the two
252
252
  > guideline nodes. The search matches a node's name, path, or
253
253
  > description, and filters live, no Enter needed. The **Map** stays
254
- > put: by default the search filters only the files list, not the map
255
- > (the tip below changes that).
254
+ > put: by default the search filters only the files list, not the map.
255
+ >
256
+ > 💡 Tip: the map-icon button next to the search box controls whether
257
+ > the search also filters the **Map** (off by default, which is why the
258
+ > map stayed put while only the tree narrowed). Click it on if you want
259
+ > a search to filter the map too.
256
260
  >
257
261
  > Now clear the box. All four nodes come back in the tree. Confirm you
258
262
  > saw it filter and then restore.
@@ -270,11 +274,6 @@ each ends with its own confirmation. Do NOT prepend an intro line to a block.
270
274
  > Map: there's a **Show all** button (an eye icon). Click it and all
271
275
  > four nodes return.
272
276
  >
273
- > 💡 Tip: the map-icon button next to the search box controls whether
274
- > the search also filters the **Map** (off by default, which is why the
275
- > map stayed put while only the tree narrowed). Click it on if you want
276
- > a search to filter the map too.
277
- >
278
277
  > Did the map isolate and then restore?
279
278
 
280
279
  Leave the server running, the next chapter is the last that uses it. Mark
@@ -23,20 +23,84 @@ what the tester names their portfolio. Persist the answer with
23
23
  antigravity) walks its own `basic-daily` part. **Codex deltas** (when
24
24
  `tutorial.provider == codex`): the `content-editor` is a TOML agent at
25
25
  `.codex/agents/content-editor.toml`, and Codex has no `command` kind, so
26
- `publish` is a **skill** at `.agents/skills/publish/SKILL.md`. The `@`/`/`
27
- connectors all resolve on Codex, so every beat lands the same; only the path /
28
- kind of those two nodes changes. Per chapter:
29
-
30
- - `add-page`: invoke the `content-editor` TOML agent via the Task tool (same flow).
26
+ `publish` is a **skill** at `.agents/skills/publish/SKILL.md`. The CONNECTOR
27
+ GRAMMAR differs: Codex invokes a skill with `$` (not `/`, a Codex built-in
28
+ command) and `@` is a file picker (not an agent mention), so `$publish` /
29
+ `$check-links` invoke and the `content-editor` agent is referenced by a
30
+ markdown link to its `.toml`. Per chapter:
31
+
32
+ - `add-page` (Codex: the tester runs the agent for real in a fresh Codex).
33
+ Codex loads its agents only at startup and has no live reload (`/agent`
34
+ just switches existing threads), and the `content-editor` was created
35
+ mid-tutorial, so it is not invocable in any running session. Do NOT invoke
36
+ it via the Task tool and do NOT tell the tester to "reload". Instead hand
37
+ the run to the tester in a fresh Codex so they watch their own agent work,
38
+ reusing the **third terminal** (the one running `node server.js`); `sm`
39
+ stays up in the second terminal so the "Map unchanged" beat still lands.
40
+ Skip the claude `add-page` body and run this flow. First ask what page
41
+ they want:
42
+
43
+ > Your turn to delegate, for real, and the page is yours: tell me what to
44
+ > add, about anything you like, your projects, your talks, a reading list,
45
+ > whatever fits your site.
46
+
47
+ When they answer, guide them, dropping the topic they chose into the
48
+ `<your topic>` placeholder below:
49
+
50
+ > Your `content-editor` is a real Codex agent
51
+ > (`.codex/agents/content-editor.toml`). Heads up, this is a Codex
52
+ > limitation: Codex reads its agents only when it boots and has no way to
53
+ > reload them mid-session, so an agent you just created is not available
54
+ > until you start Codex again. That is why we run it in a fresh Codex now,
55
+ > and you get to watch it work. In your **third terminal** (the one running
56
+ > `node server.js`), stop the site with `Ctrl+C`, then start Codex in the
57
+ > same folder:
58
+
59
+ ```bash
60
+ codex
61
+ ```
62
+
63
+ > Once it is up, ask it for the page you chose, in your own words, for
64
+ > example:
65
+
66
+ ```text
67
+ Use the content-editor agent to add a page about <your topic>.
68
+ ```
69
+
70
+ > Watch it run: it writes your new page under `public/` for real, the way
71
+ > it would on a normal day. When it finishes, exit Codex (`Ctrl+D`), bring the
72
+ > site back up with `node server.js`, and refresh
73
+ > `http://localhost:3000`. Your new page is there, in the same style.
74
+ >
75
+ > Now glance at the **Map** (still running in your second terminal): same
76
+ > nodes as before, nothing new. The page is Layer 2 output; the harness on
77
+ > the canvas is Layer 1. Your nodes are not a diagram, they are runnable,
78
+ > and you just ran one.
79
+ >
80
+ > See the new page on the site, and the Map unchanged?
81
+
82
+ Wait for confirmation, then mark `add-page` done. If the tester's Codex
83
+ goes off-script (writes a `.md`, touches the harness, or the page lands
84
+ wrong), help them steer it, or as a last resort act as the `content-editor`
85
+ yourself following its rules + `docs/STYLE.md` so the beat still lands.
31
86
  - `broken-ref`: the deploy link that breaks lives in the `publish` SKILL; fix it
32
87
  in `.agents/skills/publish/SKILL.md` (not a `.claude/commands/` file).
33
- - `reserved`: Codex has no command, so create a SKILL with a reserved name
34
- instead, `Write` `.agents/skills/model/SKILL.md` named `model` (it shadows
35
- the open-standard `COMMONS_RESERVED_NAMES`); clear it by renaming the folder +
36
- `frontmatter.name` to `new-page`, exactly like the basic track's `reserved`
37
- chapter, on a skill.
38
- - `publish`: run the `publish` SKILL's steps for real (same `/check-links` +
39
- `@content-editor` + deploy runbook).
88
+ - `reserved` (Codex: SKIP this chapter, it cannot be reproduced). The reserved-
89
+ name collision is a claude `/`-command beat: a user `/model` COMMAND shadows
90
+ Codex's own built-in `/model`. On Codex skills are `$`-invoked, a namespace
91
+ disjoint from the `/` built-in commands, so a skill named like a built-in
92
+ (`model`) never collides and skill-map flags nothing, there is no beat to
93
+ show. Do NOT write a `model` skill, do NOT narrate a (non-)warning, do NOT
94
+ make a beat of it. Silently `state.js mark daily-loop reserved skipped` and go
95
+ from `broken-ref` straight to `publish`. Keep the numbering it already has:
96
+ it is position-based, so `publish` stays 3.5, `stability` 3.6, `golive` 3.7
97
+ (do NOT renumber); the tester simply never sees a 3.4 on Codex.
98
+ - `publish`: run the `publish` SKILL's steps for real (`$check-links` invokes
99
+ the link checker, the `content-editor` markdown-link reference, the deploy
100
+ runbook).
101
+ - `golive`: when you name the harness pieces on the graph, say the **publish
102
+ skill**, not "the publish command" (Codex has no command kind); everything
103
+ else is identical.
40
104
 
41
105
  **Real-execution contract (read once).** When invoking the `content-editor` via
42
106
  the Task tool, instruct it explicitly to write ONLY `.html` files under
@@ -434,12 +498,17 @@ Tell the tester:
434
498
  > The first time skill-map writes its own metadata it asks for **consent**:
435
499
  > confirm it in the dialog that pops up. Two things happen at once: a stability
436
500
  > badge for the stage you picked appears on the `AGENTS` node, and skill-map
437
- > creates a **`.sm` sidecar file** (`AGENTS.sm`) right next to the handbook to
438
- > hold that metadata, your `AGENTS.md` itself is never touched. Your consent is
439
- > remembered for the project, so it will not ask again.
501
+ > creates a **`.sm` sidecar file** right next to the handbook, named after it
502
+ > (`AGENTS.md` becomes `AGENTS.sm` in the same folder), to hold that metadata.
503
+ > Your `AGENTS.md` itself is never touched. Your consent is remembered for the
504
+ > project, so it will not ask again.
440
505
  >
441
- > That sidecar is where skill-map keeps what it knows about a node that does not
442
- > belong in the vendor file (stability, version, tags).
506
+ > What is a **sidecar**? A sibling file that lives in the same folder as the
507
+ > node it describes and is committed to the same repository, so it travels with
508
+ > the `.md` wherever it goes. skill-map keeps what it learns about a node
509
+ > (stability, version, tags) there ON PURPOSE: that is the tool's bookkeeping,
510
+ > not your content, so it stays OUT of your source markdown. Your `.md` files
511
+ > stay clean and authored by you, never polluted by skill-map.
443
512
  >
444
513
  > See the new stability badge on the handbook?
445
514
 
@@ -447,23 +516,25 @@ Wait for confirmation. Mark `stability`: done. Auto-advance to `golive`.
447
516
 
448
517
  ## Chapter `golive` - Your website, live next to the graph (~3 min)
449
518
 
450
- One of the few chapters where the tester runs non-`sm` commands themselves;
451
- guide them, do not run it for them. `npm install` is idempotent, so it is safe
452
- whether or not they ran it in `setup`.
519
+ The site is already serving from `add-page` (the tester brought `node server.js`
520
+ back up in their third terminal after their agent wrote its page), so for most
521
+ testers the finale is just opening it, not restarting anything. Only if they
522
+ closed that terminal do they bring it back with the block below; guide them, do
523
+ not run it for them. `npm install` is idempotent if they do restart.
453
524
 
454
525
  **Preparation**: none. `server.js` / `package.json` exist from the kickoff; the
455
526
  pages exist from the earlier chapters.
456
527
 
528
+ > Last step, the fun one. Your site is still serving from earlier in your third
529
+ > terminal, so just open `http://localhost:3000` and click through Home, About,
530
+ > and the page you added, the pages your harness produced and shipped through the
531
+ > publish flow you just ran. (If you closed that terminal, bring it back up first
532
+ > with the commands below.)
533
+
457
534
  ```bash
458
535
  npm install
459
536
  node server.js
460
537
  ```
461
-
462
- > Last step, the fun one. `npm install` confirms the one small library is there,
463
- > and `node server.js` starts the server (`Listening on http://localhost:3000`).
464
- >
465
- > Open `http://localhost:3000` and click through Home, About, and Projects, the
466
- > pages your harness produced and shipped through the publish flow you just ran.
467
538
  >
468
539
  > Now take it in at once. On one side, your real running website, named after
469
540
  > you, that you could deploy as-is. On the other, the skill-map graph of the
@@ -4,10 +4,13 @@ The live-UI prologue: the tester runs `sm init`, opens the browser, and watches
4
4
 
5
5
  **Codex deltas (rich track).** When `tutorial.provider == codex` the lay commands are unchanged (the `--only` ids match the Codex overlay), but the on-disk shapes differ; substitute in the tester-facing prose:
6
6
 
7
- - `init`: the boot node `demo-agent` is a **TOML agent** at `.codex/agents/demo-agent.toml`.
7
+ - `init`: the boot node `demo-agent` is a **TOML agent** at `.codex/agents/demo-agent.toml`. `sm init` resolves the `codex` lens with no prompt (the `.codex/` marker outranks the shared `.agents/` open default), so the commands stay `sm init` then `sm`, exactly like claude.
8
8
  - `kinds`: the node list reads `.codex/agents/demo-agent.toml` (agent), `.agents/skills/demo-command/SKILL.md` (skill), `.agents/skills/demo-skill/SKILL.md` (skill), and the `notes/*.md`. Name the kinds as agent + skill + markdown (two new kinds this step: skill + markdown). Present `demo-command` as a plain skill: do NOT tell the tester it "is a command" or narrate any command-to-skill substitution. Codex has no `command` kind, so on this track `demo-command` is simply one of the two skills, nothing to explain.
9
9
  - `first-edit`: the description to edit lives in `.codex/agents/demo-agent.toml` (the `description = "…"` TOML field, not YAML frontmatter).
10
- - `connectors` onward: identical, the `@`/`/` bullets resolve the same on Codex; only the `ignore` chapter's directory tree shows `.codex/agents/` + `.agents/skills/` instead of `.claude/`.
10
+ - `connectors`: the hub wires its nodes with the CODEX grammar, NOT claude's `/`+`@`-mention (the `todo-connectors` codex overlay lays the right bullets automatically; you only narrate the shapes). The two skill bullets INVOKE with `$` (`$demo-command`, `$demo-skill`); the agent bullet is a markdown-link reference to the agent file (`[demo-agent](../.codex/agents/demo-agent.toml)`, since Codex cannot `@`-mention an agent); `@demo-guideline2.md` is a file reference (Codex's `@` is a file picker). The bare `@demo-guideline` (no extension) forms NO edge on Codex (`@` points at a FILE, not a name), so the hub shows **four resolved arrows and NO broken-reference marker** (claude's fifth, broken bullet does not exist here). `Expected`: four drawn arrows, zero issues.
11
+ - `inspector` (Codex): the hub lists **four** outgoing links, all resolved at `1.00`, and zero incoming. There is no `0.50` broken row (the bare `@demo-guideline` formed nothing); adapt the claude "five links, one broken" wording to "four links, all resolved".
12
+ - `edit-link` (Codex): the tester turns the inert bare `@demo-guideline` into a file reference by adding `.md` (`@demo-guideline.md`), and the new arrow appears live. Same muscle memory as claude ("add `.md`"), but the Codex lesson is "`@` needs a filename to be a file reference, a bare `@handle` is just text".
13
+ - `workspace` / `ignore`: identical; only the directory tree shows `.codex/agents/` + `.agents/skills/` instead of `.claude/`.
11
14
 
12
15
  ## Chapter `init` - Your first node (~2 min)
13
16
 
@@ -251,8 +254,12 @@ action itself.
251
254
  > two guideline nodes (`demo-guideline` and `demo-guideline2`). The
252
255
  > search matches a node's name, path, or description, and filters
253
256
  > live as you type, no Enter needed. The **Map** stays put: by
254
- > default the search filters only the files list, not the map (the
255
- > tip below changes that).
257
+ > default the search filters only the files list, not the map.
258
+ >
259
+ > 💡 Tip: the map-icon button right next to the search box controls
260
+ > whether the search also filters the **Map**. It's off by default,
261
+ > which is why the **Map** stayed put while only the tree narrowed.
262
+ > Click it on if you want a search to filter the map too.
256
263
  >
257
264
  > Now clear the box. All six nodes come back in the tree. Confirm you
258
265
  > saw it filter and then restore.
@@ -271,12 +278,6 @@ action itself.
271
278
  > the Map: there's a **Show all** button (an eye icon). Click it and
272
279
  > all six nodes return.
273
280
  >
274
- > 💡 Tip: remember the search box from a moment ago? The map-icon
275
- > button right next to it controls whether the search also filters
276
- > the **Map**. It's off by default, which is why the **Map** stayed
277
- > put while only the tree narrowed when you searched `guideline`.
278
- > Click it on if you want a search to filter the map too.
279
- >
280
281
  > Did the map isolate and then restore?
281
282
 
282
283
  Leave the server running, the next chapter (`.skillmapignore`) is the last one that uses it. Mark `workspace`: done.
@@ -22,9 +22,11 @@ The chapters grow the harness from there.
22
22
 
23
23
  **Codex deltas (rich track).** When `tutorial.provider == codex`:
24
24
 
25
- - `kickoff` / `manual`: identical. A `.codex/` project resolves the `codex`
26
- lens; `CLAUDE.md`'s `@AGENTS.md` reference resolves the same (Codex has the
27
- `@`-directive). `AGENTS.md` is still the one boot node.
25
+ - `kickoff` / `manual`: identical flow (`sm init` then `sm`, no lens
26
+ prompt, `.codex/` outranks the shared `.agents/` home). `CLAUDE.md`'s
27
+ `@AGENTS.md` reference resolves the same (it carries `.md`, so Codex reads
28
+ `@AGENTS.md` as a FILE reference, Codex's `@` is a file picker, not an agent
29
+ mention). `AGENTS.md` is still the one boot node.
28
30
  - `first-agent`: the `content-editor` is a **TOML agent** at
29
31
  `.codex/agents/content-editor.toml`, not a `.claude/agents/*.md` file; point
30
32
  the tester at the `.toml` if they want to peek. Its body references the style
@@ -38,7 +40,7 @@ The chapters grow the harness from there.
38
40
  no `command`. Lay only `docs/DEPLOY.md` here (STYLE landed in `first-agent`),
39
41
  and name the kinds as agent + skill + markdown (the skill + the publish piece
40
42
  arrive later in this part as skills).
41
- - `publish`: Codex has no `command` kind, so the tester creates a **skill** at `.agents/skills/publish/SKILL.md` instead of `.claude/commands/publish.md`. The body is the Codex one (same `/check-links` + `@content-editor` + deploy reference); fetch it with `fixtures.js cat harness --file "__PROVIDER__/skills/publish/SKILL.md" --provider codex --lang <lang>`. Tell the tester they are creating a `skill` (one node, three connectors); present it plainly as a skill, with no mention of a command or a substitution (per _core.md §Rendering the rich book on Codex, silent substitution). The fixture lays no `publish` for codex in this chapter (the tester authors it), so the `cat` is the source.
43
+ - `publish`: Codex has no `command` kind, so the tester creates a **skill** at `.agents/skills/publish/SKILL.md` instead of `.claude/commands/publish.md`. The body uses the CODEX grammar (`$check-links` invokes the link checker; a markdown link references `content-editor`; the deploy runbook is a markdown reference), so the three connectors still light up, just `$`/file-ref instead of `/`+`@`-mention. Fetch it with `fixtures.js cat harness --file "__PROVIDER__/skills/publish/SKILL.md" --provider codex --lang <lang>`. Tell the tester they are creating a `skill` (one node, three connectors); present it plainly as a skill, with no mention of a command or a substitution (per _core.md §Rendering the rich book on Codex, silent substitution). The fixture lays no `publish` for codex in this chapter (the tester authors it), so the `cat` is the source.
42
44
  - `links`: the `content-editor-style` reference is baked into the Codex content-editor's TOML (`developer_instructions`) at lay time, so the `edit content-editor-style` step is a no-op on Codex, the `content-editor -> docs/STYLE.md` arrow is already drawn from earlier in this part. Run only `edit agents-hub` and narrate the two `AGENTS.md` arrows; mention the style-guide arrow as already present.
43
45
 
44
46
  ## Chapter `kickoff` - Start the portfolio (~2 min)
@@ -53,13 +55,13 @@ disk. The orchestrator's `portfolio-init` already cleared it during
53
55
  pre-flight, so the tester sees only the portfolio. If anything demo
54
56
  lingers, mention it once and move on.
55
57
 
56
- **Context (agent, do not narrate the plumbing): the lens.** The skill
57
- was scaffolded under `.claude/` (the `claude` marker, where the tutorial
58
- skill itself lives), so `sm init` auto-detects the `claude` lens with no
59
- prompt. The root `AGENTS.md` is the vendor-neutral handbook, NOT a lens
60
- marker, so it never forces an ambiguous prompt. (This is the rich track;
61
- a Codex project resolves the `codex` lens the same way from its
62
- `.codex/` marker.) Do not promise the tester a lens prompt here.
58
+ **Context (agent, do not narrate the plumbing): the lens.** `sm init`
59
+ auto-detects the lens with no prompt: claude from its lone `.claude/`
60
+ marker, codex from `.codex/` (which outranks the shared `.agents/` open
61
+ default, so the extra `.agents/skills/` skill home does NOT trigger an
62
+ ambiguous prompt). The root `AGENTS.md` is the vendor-neutral handbook,
63
+ NOT a lens marker, so it never forces a prompt either. Do not promise the
64
+ tester a lens prompt here.
63
65
 
64
66
  ```bash
65
67
  sm init
@@ -58,9 +58,10 @@ export function overlayKey(provider) {
58
58
  /**
59
59
  * Kinds whose edit fragments (the todo-connectors hub bullets, etc.) apply for
60
60
  * a provider, keyed by TRACK, not by the base-tier kinds. A rich provider links
61
- * to every node role even when it renders some differently, Codex's agent is a
62
- * TOML overlay and its command-node is a skill, but an `@agent` mention and a
63
- * `/command` invocation still resolve, so every bullet applies. A basic
61
+ * to every node role even when it renders some differently (Codex's agent is a
62
+ * TOML overlay and its command-node is a skill), so every hub bullet applies;
63
+ * the per-provider overlay then supplies the right connector grammar (claude
64
+ * `/`+`@`, codex `$`-invoke + `@`-file / markdown-link references). A basic
64
65
  * provider only has skill + markdown, so the agent / command bullets fold away.
65
66
  */
66
67
  export function fragmentKindsFor(provider) {
@@ -134,5 +135,5 @@ export function nodeIdForTokenPath(tokenRelPath) {
134
135
  if (codexAgent) return codexAgent[1];
135
136
  return tokenRelPath;
136
137
  }
137
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9a867c5a-0c61-500e-a583-7d7dd6c5ac92")}catch(e){}}();
138
- //# debugId=9a867c5a-0c61-500e-a583-7d7dd6c5ac92
138
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="54e1e331-4312-5c77-adc1-287ab9df7502")}catch(e){}}();
139
+ //# debugId=54e1e331-4312-5c77-adc1-287ab9df7502