@skill-map/cli 0.69.0 → 0.71.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 (45) 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 +73 -47
  19. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +2 -2
  20. package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +0 -7
  21. package/dist/cli/tutorial/sm-tutorial/references/part-basic-daily.md +10 -26
  22. package/dist/cli/tutorial/sm-tutorial/references/part-basic-fundamentals.md +10 -18
  23. package/dist/cli/tutorial/sm-tutorial/references/part-basic-kickoff.md +12 -31
  24. package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +0 -4
  25. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +97 -43
  26. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +11 -14
  27. package/dist/cli/tutorial/sm-tutorial/references/part-mcp.md +4 -14
  28. package/dist/cli/tutorial/sm-tutorial/references/part-plugins.md +0 -8
  29. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +18 -36
  30. package/dist/cli/tutorial/sm-tutorial/references/part-settings.md +2 -10
  31. package/dist/cli/tutorial/sm-tutorial/scripts/lib/paths.js +6 -5
  32. package/dist/cli.js +441 -269
  33. package/dist/index.js +115 -18
  34. package/dist/kernel/index.d.ts +27 -0
  35. package/dist/kernel/index.js +115 -18
  36. package/dist/ui/chunk-CK4C2IIP.js +3 -0
  37. package/dist/ui/{chunk-RRRXQNG6.js → chunk-EVNCL7FV.js} +21 -21
  38. package/dist/ui/{chunk-E7GLGHVY.js → chunk-GUGB4JY5.js} +1 -1
  39. package/dist/ui/{chunk-SXSNTF26.js → chunk-RSPEJBPT.js} +1 -1
  40. package/dist/ui/chunk-SQCXHF3J.js +2 -0
  41. package/dist/ui/index.html +1 -1
  42. package/dist/ui/{main-23NGLEUB.js → main-GY4PAVQW.js} +3 -3
  43. package/package.json +2 -2
  44. package/dist/ui/chunk-RLRSNHYG.js +0 -3
  45. package/dist/ui/chunk-SI4MGFOW.js +0 -2
@@ -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
@@ -61,15 +125,6 @@ broken-reference markers, and confidence live.
61
125
 
62
126
  ## Chapter `setup` - Make it yours and bring it up (~5 min)
63
127
 
64
- **Context**: the harness is wired (you built it in the earlier parts). Now you
65
- put it to work on a real day. First, make the site yours, about whatever you
66
- like, then serve it and open it in the browser, the early payoff before the
67
- daily loop fills it with pages. The honest beat: the HTML
68
- and CSS are Layer 2 (the harness's output); skill-map maps the harness (Layer 1,
69
- the `.md` files), so the site landing on disk does NOT move the graph, and that
70
- is correct, not a bug. The tester runs the serve commands themselves (one of the
71
- few non-`sm` beats); guide them, do not run them.
72
-
73
128
  **Preparation**:
74
129
 
75
130
  1. Ask the tester the two questions straight, with no "before we build, let's
@@ -262,10 +317,6 @@ Wait for confirmation. Mark `add-page`: done. Auto-advance to `broken-ref`.
262
317
 
263
318
  ## Chapter `broken-ref` - A rename breaks a link (~4 min)
264
319
 
265
- **Context**: the daily safety net, and where skill-map earns its keep: rename and
266
- move things freely, and skill-map shows you exactly what you forgot to update
267
- before it ships broken.
268
-
269
320
  **Preparation**: none (the tester drives). Everything here is watched live on
270
321
  the Map; no `sm` commands.
271
322
 
@@ -341,10 +392,6 @@ Wait for confirmation. Mark `reserved`: done. Auto-advance to `publish`.
341
392
 
342
393
  ## Chapter `publish` - Ship it: run /publish for real (~4 min)
343
394
 
344
- **Context**: the publish flow only earns its keep when something is actually
345
- wrong, so first you plant a real bug in the site, then watch `/publish` catch and
346
- fix it for real.
347
-
348
395
  **Preparation**: make sure the pages exist (`index`, `about`, `projects` from the
349
396
  earlier chapters; lay any that are missing from the templates in `setup`).
350
397
 
@@ -434,12 +481,17 @@ Tell the tester:
434
481
  > The first time skill-map writes its own metadata it asks for **consent**:
435
482
  > confirm it in the dialog that pops up. Two things happen at once: a stability
436
483
  > 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.
484
+ > creates a **`.sm` sidecar file** right next to the handbook, named after it
485
+ > (`AGENTS.md` becomes `AGENTS.sm` in the same folder), to hold that metadata.
486
+ > Your `AGENTS.md` itself is never touched. Your consent is remembered for the
487
+ > project, so it will not ask again.
440
488
  >
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).
489
+ > What is a **sidecar**? A sibling file that lives in the same folder as the
490
+ > node it describes and is committed to the same repository, so it travels with
491
+ > the `.md` wherever it goes. skill-map keeps what it learns about a node
492
+ > (stability, version, tags) there ON PURPOSE: that is the tool's bookkeeping,
493
+ > not your content, so it stays OUT of your source markdown. Your `.md` files
494
+ > stay clean and authored by you, never polluted by skill-map.
443
495
  >
444
496
  > See the new stability badge on the handbook?
445
497
 
@@ -447,23 +499,25 @@ Wait for confirmation. Mark `stability`: done. Auto-advance to `golive`.
447
499
 
448
500
  ## Chapter `golive` - Your website, live next to the graph (~3 min)
449
501
 
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`.
502
+ The site is already serving from `add-page` (the tester brought `node server.js`
503
+ back up in their third terminal after their agent wrote its page), so for most
504
+ testers the finale is just opening it, not restarting anything. Only if they
505
+ closed that terminal do they bring it back with the block below; guide them, do
506
+ not run it for them. `npm install` is idempotent if they do restart.
453
507
 
454
508
  **Preparation**: none. `server.js` / `package.json` exist from the kickoff; the
455
509
  pages exist from the earlier chapters.
456
510
 
511
+ > Last step, the fun one. Your site is still serving from earlier in your third
512
+ > terminal, so just open `http://localhost:3000` and click through Home, About,
513
+ > and the page you added, the pages your harness produced and shipped through the
514
+ > publish flow you just ran. (If you closed that terminal, bring it back up first
515
+ > with the commands below.)
516
+
457
517
  ```bash
458
518
  npm install
459
519
  node server.js
460
520
  ```
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
521
  >
468
522
  > Now take it in at once. On one side, your real running website, named after
469
523
  > 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
 
@@ -197,8 +200,6 @@ Mark `inspector`: done.
197
200
 
198
201
  ## Chapter `edit-link` - Edit a link, the topology changes (~3 min)
199
202
 
200
- **Context**: the `first-edit` chapter had the tester edit a scalar (`description`) and watch the inspector card refresh. This chapter raises the bar: edit Markdown links and watch the MAP TOPOLOGY change both ways, a connector disappears when you remove a link, and a new one appears (clearing the broken-reference error) when you fix the unresolved one.
201
-
202
203
  The server has been live since the `init` chapter, leave it running; this chapter and the next two (the workspace tour, then `.skillmapignore`) reuse it.
203
204
 
204
205
  > Your turn. Edit `notes/todo.md` with your editor of choice and
@@ -229,8 +230,6 @@ You verify by reading `notes/todo.md` to confirm both edits landed (the `@demo-a
229
230
 
230
231
  ## Chapter `workspace` - Navigate the workspace (files, search, isolate) (~2 min)
231
232
 
232
- **Context**: you've built the graph and understood it; this beat is about *moving around* it. The workspace has two halves: the **Map** you've been working in, and a **Files** panel, a folder tree of every node. You'll open that tree and filter it with the search box. The same `sm` session you booted back in the `init` chapter is still running.
233
-
234
233
  Walk the three tester actions below one at a time (open the Files
235
234
  panel, then search, then isolate); each ends with its own
236
235
  confirmation, so present one and wait for the tester before the next.
@@ -251,8 +250,12 @@ action itself.
251
250
  > two guideline nodes (`demo-guideline` and `demo-guideline2`). The
252
251
  > search matches a node's name, path, or description, and filters
253
252
  > 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).
253
+ > default the search filters only the files list, not the map.
254
+ >
255
+ > 💡 Tip: the map-icon button right next to the search box controls
256
+ > whether the search also filters the **Map**. It's off by default,
257
+ > which is why the **Map** stayed put while only the tree narrowed.
258
+ > Click it on if you want a search to filter the map too.
256
259
  >
257
260
  > Now clear the box. All six nodes come back in the tree. Confirm you
258
261
  > saw it filter and then restore.
@@ -271,12 +274,6 @@ action itself.
271
274
  > the Map: there's a **Show all** button (an eye icon). Click it and
272
275
  > all six nodes return.
273
276
  >
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
277
  > Did the map isolate and then restore?
281
278
 
282
279
  Leave the server running, the next chapter (`.skillmapignore`) is the last one that uses it. Mark `workspace`: done.
@@ -12,20 +12,10 @@ only. Shared conventions live in `_core.md`.
12
12
 
13
13
  ## Chapter `mcp-node` - The agent reaches for an MCP tool (~3 min)
14
14
 
15
- **Context**: until now every node on the map has been a file you can
16
- open. This chapter introduces a node that is NOT a file: an MCP
17
- server the `content-editor` agent calls. MCP (Model Context
18
- Protocol) is the standard way an agent reaches an external tool, and
19
- Claude names those tools `mcp__<server>__<tool>` in an agent's
20
- frontmatter. When the agent declares it uses `mcp__images__search`
21
- (an image-search tool, so it can find art for the pages), skill-map's
22
- `core/mcp-tools` extractor reads that declaration and draws a
23
- virtual `mcp://images` node plus a `references` link from
24
- content-editor to it. The link confidence is around 0.85 (high, but
25
- not the 1.00 of a markdown link to a real file, because the target is
26
- an external service, not a file on disk). If several harness members
27
- named the same server, skill-map would draw a single shared
28
- `mcp://images` node, not one per caller.
15
+ Agent note (not narrated, the demo only adds one tool so it never
16
+ manifests here): if several harness members named the same MCP
17
+ server, skill-map draws ONE shared `mcp://images` node, not one per
18
+ caller.
29
19
 
30
20
  **Preparation**: `Edit` `.claude/agents/content-editor.md`. Do NOT
31
21
  rewrite the file. Change only the `tools:` line in the frontmatter so
@@ -23,10 +23,6 @@ restore the files.") and stop.
23
23
 
24
24
  ## Step `tour-1-intro` - how plugins work (~4 min)
25
25
 
26
- **Context**: A short tour of what a plugin is, how it groups
27
- extensions, and a peek at the five plugins that ship
28
- pre-installed.
29
-
30
26
  > Plugins are how skill-map gets extended. A **plugin** is the
31
27
  > deployable unit: one directory with a `plugin.json` manifest and
32
28
  > the extension code. It groups one or more **extensions**, the
@@ -130,10 +126,6 @@ Mark `tour-2-kinds: done`.
130
126
 
131
127
  ## Step `tour-3-explore` - explore one extension up close (~4 min)
132
128
 
133
- **Context**: Drill into a single extension to see its detail,
134
- run the diagnostic, then toggle one off and back on so you see
135
- the change persists.
136
-
137
129
  > Pick one extension and look at its details. We'll use
138
130
  > `core/external-url-counter`, an extractor that counts how many
139
131
  > external URLs each node body contains:
@@ -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,28 +40,24 @@ 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)
45
47
 
46
- **Context**: same `sm init` the tester learned in the prologue, but
47
- now on a real project. The map will show the project's harness, not
48
- throwaway demo nodes.
49
-
50
48
  If the prologue (`fundamentals`) ran first in this directory, the
51
49
  demo fixture (`demo-agent`, `demo-skill`, `notes/…`) is still on
52
50
  disk. The orchestrator's `portfolio-init` already cleared it during
53
51
  pre-flight, so the tester sees only the portfolio. If anything demo
54
52
  lingers, mention it once and move on.
55
53
 
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.
54
+ **Context (agent, do not narrate the plumbing): the lens.** `sm init`
55
+ auto-detects the lens with no prompt: claude from its lone `.claude/`
56
+ marker, codex from `.codex/` (which outranks the shared `.agents/` open
57
+ default, so the extra `.agents/skills/` skill home does NOT trigger an
58
+ ambiguous prompt). The root `AGENTS.md` is the vendor-neutral handbook,
59
+ NOT a lens marker, so it never forces a prompt either. Do not promise the
60
+ tester a lens prompt here.
63
61
 
64
62
  ```bash
65
63
  sm init
@@ -88,12 +86,6 @@ Wait for confirmation. Mark `kickoff`: done.
88
86
 
89
87
  ## Chapter `manual` - The handbook (AGENTS.md) and CLAUDE.md (~2 min)
90
88
 
91
- **Context**: the dogfood beat. Real Claude Code projects can
92
- reference the generic `AGENTS.md` from their `CLAUDE.md` (this very
93
- repo does). That one-line pointer is a real `references` link (the
94
- `.md` extension makes `@AGENTS.md` a file pointer), the tester's first
95
- connector on the real project.
96
-
97
89
  Tell the tester to create the file themselves (it is their project's
98
90
  file, Inviolable rule #2). Backstage, get the content:
99
91
  `node .claude/skills/sm-tutorial/scripts/fixtures.js cat portfolio --file "CLAUDE.md" --provider <provider> --lang <lang>`,
@@ -145,11 +137,6 @@ Wait for confirmation. Mark `first-agent`: done.
145
137
 
146
138
  ## Chapter `real-kinds` - The real kinds in context (~2 min)
147
139
 
148
- **Context**: the prologue showed the four kinds on abstract demo
149
- nodes. Now name them on the real project, and add the two markdown
150
- docs the harness references later (the style guide and the deploy
151
- runbook), so the Daily Loop's maintenance beats have something to point at.
152
-
153
140
  Lay the two markdown docs the harness references later (their content
154
141
  + translation live in `fixtures-data/`). Backstage (silent):
155
142
 
@@ -179,8 +166,6 @@ Wait for confirmation. Mark `real-kinds`: done.
179
166
 
180
167
  ## Chapter `check-links` - The link checker (~3 min)
181
168
 
182
- **Context**: the harness needs a guard that runs before publishing, a skill that checks the site's internal links resolve before it ships. We only create the `skill` node here; the `publish` command in the next chapter is its caller.
183
-
184
169
  Lay the `check-links` skill (its content + translation live in
185
170
  `fixtures-data/`; this kind exists on every provider, so no skip).
186
171
  Backstage (silent):
@@ -201,9 +186,7 @@ Wait for confirmation. Mark `check-links`: done.
201
186
 
202
187
  ## Chapter `publish` - The publish command (~4 min)
203
188
 
204
- **Context**: this is the chapter where the graph comes alive. The `/publish` command ties three pieces together in one body: it invokes the link checker, mentions the content editor, and references the deploy runbook. Three connectors light up from a single new node, one per link syntax.
205
-
206
- 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.
189
+ 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, line for line: never soft-wrap, and never let a newline fall inside a `[text](path)` link (a break inside the `(path)`, e.g. `(../../docs/DEPLOY.md)`, splits it and the link stops resolving). See `_core.md` §Language mirroring + fixture content.
207
190
 
208
191
  > Create `.claude/commands/publish.md` with exactly this content (the first line is `---`, nothing before it):
209
192
 
@@ -251,8 +234,6 @@ Wait for confirmation. You MAY use `Read` on the file afterwards to verify it la
251
234
 
252
235
  ## Chapter `links` - The handbook becomes the hub (~4 min)
253
236
 
254
- **Context**: the handbook (`AGENTS.md`) has been a lonely node since the start of this part. 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.
255
-
256
237
  Apply both edits (their content + translation live in `fixtures-data/`).
257
238
  The first appends the two hub bullets to `AGENTS.md`; the second adds
258
239
  the style-guide reference line to the content-editor. Backstage (silent):
@@ -323,9 +304,10 @@ Tell the tester:
323
304
  >
324
305
  > **IMPORTANT:** why does confidence matter? It mirrors how the runtime itself
325
306
  > resolves a reference: a deterministic name-and-path lookup, no guessing
326
- > and no scanning the tree for a file under some other extension. That is
327
- > cheaper and it does not fail, so the agent spends fewer tokens and less
328
- > time, the same reason a clean, well-named harness is worth keeping.
307
+ > and no scanning the tree for a file under some other extension. A link that
308
+ > does not resolve sends the agent guessing and retrying, which burns time and
309
+ > tokens; a deterministic one does not fail and resolves first try, the same
310
+ > reason a clean, well-named harness is worth keeping.
329
311
  >
330
312
  > Do you see every badge reading 1.00 in the Inspector?
331
313
 
@@ -22,9 +22,6 @@ stop, do not try to re-init mid-chapter.
22
22
 
23
23
  ## Step `settings-1-layers` - the config layers (~3 min)
24
24
 
25
- **Context**: where settings live and how `sm` resolves a value
26
- when more than one place sets it.
27
-
28
25
  > `sm` resolves every setting through a stack of **layers**, each
29
26
  > one overriding the layer below it:
30
27
  >
@@ -74,9 +71,6 @@ Mark `settings-1-layers: done`.
74
71
 
75
72
  ## Step `settings-2-resolve` - read, resolve, and set a value (~3 min)
76
73
 
77
- **Context**: the four config verbs (`get`, `show`, `set`, `reset`)
78
- and how `show --source` reveals which layer won.
79
-
80
74
  > Read a single setting. We'll use `scan.maxNodes`, the cap on how
81
75
  > many nodes a scan walks:
82
76
 
@@ -123,10 +117,8 @@ Mark `settings-2-resolve: done`.
123
117
 
124
118
  ## Step `settings-3-lens` - the active provider lens (~2 min)
125
119
 
126
- **Context**: the single most consequential setting, the lens that
127
- decides which provider types the project's files. It auto-detects and
128
- never touches your `.md` files. (Agent: substitute `<provider>` with
129
- `tutorial.provider`, the lens this run was scaffolded for.)
120
+ (Agent: substitute `<provider>` with `tutorial.provider`, the lens
121
+ this run was scaffolded for.)
130
122
 
131
123
  > One setting earns its own step: the **active provider lens**. A
132
124
  > skill-map project reads its files through exactly **one** provider
@@ -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