@skill-map/cli 0.68.1 → 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 (51) 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 +57 -29
  19. package/dist/cli/tutorial/sm-tutorial/references/_manifest.json +70 -70
  20. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +38 -38
  21. package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +3 -3
  22. package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +25 -8
  23. package/dist/cli/tutorial/sm-tutorial/references/part-basic-daily.md +91 -38
  24. package/dist/cli/tutorial/sm-tutorial/references/part-basic-fundamentals.md +7 -8
  25. package/dist/cli/tutorial/sm-tutorial/references/part-basic-kickoff.md +1 -1
  26. package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +1 -1
  27. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +173 -56
  28. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +14 -13
  29. package/dist/cli/tutorial/sm-tutorial/references/part-plugins.md +1 -1
  30. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +14 -12
  31. package/dist/cli/tutorial/sm-tutorial/references/part-settings.md +2 -2
  32. package/dist/cli/tutorial/sm-tutorial/scripts/lib/paths.js +6 -5
  33. package/dist/cli.js +963 -451
  34. package/dist/conformance/index.js +3 -3
  35. package/dist/index.js +17 -14
  36. package/dist/kernel/index.d.ts +54 -17
  37. package/dist/kernel/index.js +17 -14
  38. package/dist/migrations/001_initial.sql +7 -3
  39. package/dist/ui/{chunk-22EQLC23.js → chunk-EVNCL7FV.js} +21 -21
  40. package/dist/ui/chunk-GUGB4JY5.js +1 -0
  41. package/dist/ui/chunk-RJUHQQOF.js +3 -0
  42. package/dist/ui/{chunk-KMHXNOFZ.js → chunk-RSPEJBPT.js} +1 -1
  43. package/dist/ui/chunk-SQCXHF3J.js +2 -0
  44. package/dist/ui/index.html +1 -1
  45. package/dist/ui/main-K4O6LCIJ.js +4 -0
  46. package/migrations/001_initial.sql +7 -3
  47. package/package.json +2 -2
  48. package/dist/ui/chunk-K3ZRQNN5.js +0 -2
  49. package/dist/ui/chunk-PU5OP5RN.js +0 -1
  50. package/dist/ui/chunk-TLMV4LOQ.js +0 -3
  51. package/dist/ui/main-R7BIU4HU.js +0 -4
@@ -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/config/SKILL.md` named `config` (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
@@ -249,6 +313,9 @@ the `> ` blockquote, do NOT drop the bar when you personalise it.
249
313
  > output; the harness on the canvas is Layer 1. Your nodes are not a diagram,
250
314
  > they are runnable, and you just ran one.
251
315
  >
316
+ > If the new page is not showing, refresh the browser with F5, the site does
317
+ > not reload on its own.
318
+ >
252
319
  > See the new page on the site, and the Map unchanged?
253
320
 
254
321
  Wait for confirmation. Mark `add-page`: done. Auto-advance to `broken-ref`.
@@ -297,30 +364,30 @@ done. Auto-advance to `reserved`.
297
364
 
298
365
  ## Chapter `reserved` - A reserved name collides (~2 min)
299
366
 
300
- **Preparation**: `Write` `.claude/commands/init.md`:
367
+ **Preparation**: `Write` `.claude/commands/model.md`:
301
368
  ```markdown
302
369
  ---
303
- name: init
370
+ name: model
304
371
  description: |
305
372
  Scaffolds a new empty page in public/ from the shared template.
306
373
  ---
307
374
 
308
- # init
375
+ # model
309
376
 
310
377
  Creates a blank page so you can start writing.
311
378
  ```
312
379
 
313
380
  The watcher picks up the new command. Tell the tester:
314
381
 
315
- > I added a command named `init`. Watch the **Map**: the new `init` command node
382
+ > I added a command named `model`. Watch the **Map**: the new `model` command node
316
383
  > appears, but flagged with a **warning** marker. Open its inspector: it reads
317
- > `name-reserved`, `init` shadows one of Claude Code's own slash commands (like
384
+ > `name-reserved`, `model` shadows one of Claude Code's own slash commands (like
318
385
  > `/help`, `/clear`, `/config`), so the runtime would silently ignore your file,
319
386
  > it never runs. The fix is a name the runtime does not own.
320
387
  >
321
- > Rename it to `new-page`: first rename the file `.claude/commands/init.md` to
388
+ > Rename it to `new-page`: first rename the file `.claude/commands/model.md` to
322
389
  > `.claude/commands/new-page.md`. Then open it in your text editor / IDE and, at
323
- > the top, where the frontmatter says `name: init`, change it to
390
+ > the top, where the frontmatter says `name: model`, change it to
324
391
  > `name: new-page`. Save.
325
392
  >
326
393
  > Watch the **Map** again: the warning clears and the node is now `new-page`,
@@ -338,40 +405,83 @@ Wait for confirmation. Mark `reserved`: done. Auto-advance to `publish`.
338
405
 
339
406
  ## Chapter `publish` - Ship it: run /publish for real (~4 min)
340
407
 
408
+ **Context**: the publish flow only earns its keep when something is actually
409
+ wrong, so first you plant a real bug in the site, then watch `/publish` catch and
410
+ fix it for real.
411
+
341
412
  **Preparation**: make sure the pages exist (`index`, `about`, `projects` from the
342
- earlier chapters; lay any that are missing from the templates in `setup`). When the tester asks to publish, **execute the publish flow for real**
343
- by following `.claude/commands/publish.md`: run the `check-links` logic over
344
- every `.html` under `public/` (does each internal `href` resolve to a file that
345
- exists?); if any link is broken, brief the `content-editor` to fix it and
346
- re-run the check; then walk the deploy runbook steps. Do not role-play it.
413
+ earlier chapters; lay any that are missing from the templates in `setup`).
347
414
 
348
- Tell the tester:
415
+ This chapter has two beats: the tester breaks a link in the HTML first, then runs
416
+ `/publish` so the skill catches the break. The split is required, the publish run
417
+ cannot demonstrate the catch until the break is in place.
349
418
 
350
- > The site is ready. Tell me to publish (or type `/publish`) and I'll run your
351
- > publish command for real: I follow its steps, run the link check across your
352
- > pages, fix anything through the `content-editor`, and walk the deploy runbook,
353
- > exactly what the command says to do. (You can read the command's content
354
- > anytime by clicking the `publish` node on the Map, then opening its **Body**
355
- > section.)
419
+ **Beat 1, plant the bug (the tester breaks the HTML, their file).** Tell the
420
+ tester:
356
421
 
357
- After running the flow, report what actually happened (keep the promises
358
- conditional on the real result):
422
+ > Before we ship, let's break something on purpose. Open `public/index.html` in
423
+ > your editor and find the **About** link in the top nav:
424
+ >
425
+ > ```html
426
+ > <a href="/about.html">About</a>
427
+ > ```
428
+ >
429
+ > Change the target to a typo that points at a page that does not exist, then
430
+ > save:
431
+ >
432
+ > ```html
433
+ > <a href="/abuot.html">About</a>
434
+ > ```
435
+ >
436
+ > Now watch the **Map**. Nothing happens: no arrow moves, no red marker. Back in
437
+ > the `broken-ref` chapter, breaking a link between your `.md` files lit up the
438
+ > graph the instant you saved. This break is invisible to it, and that is
439
+ > correct: skill-map maps your **harness** (the `.md` files, Layer 1), not the
440
+ > HTML pages it produces (Layer 2, your `public/` folder, which is even in
441
+ > `.skillmapignore`). A broken link inside your actual site never shows on the
442
+ > graph. The one thing that catches it is your `check-links` skill, which is
443
+ > exactly what `/publish` runs as its first step.
444
+ >
445
+ > Saved the typo, and the Map stayed unchanged?
446
+
447
+ Wait for confirmation. The Map MUST stay unchanged; if a marker appeared they
448
+ edited a `.md` by mistake, point them back at `public/index.html`.
449
+
450
+ **Beat 2, run /publish for real.** Tell the tester:
451
+
452
+ > Now ship it. Tell me to publish (or type `/publish`) and I'll run your publish
453
+ > command for real, exactly as written. (You can read the command anytime by
454
+ > clicking the `publish` node on the Map, then opening its **Body** section.)
455
+
456
+ When the tester asks to publish, **execute the publish flow for real** by
457
+ following `.claude/commands/publish.md`: run the `check-links` logic over every
458
+ `.html` under `public/` (does each internal `href` resolve to a file that
459
+ exists?), which now finds the planted typo; per step 2, brief the
460
+ `content-editor` to fix it (point the link back at `/about.html`), re-run the
461
+ check until it is clean, then walk the deploy runbook. Do not role-play it;
462
+ `Read` `public/index.html` before and after the fix so the report is honest.
463
+
464
+ After running the flow, report what actually happened:
359
465
 
360
466
  > Here is what just ran, for real:
361
467
  >
362
468
  > - **check-links** walked every page under `public/` and followed each internal
363
- > link. Result: 0 broken links. (Had it found one, the next step would have
364
- > briefed `content-editor` to fix it, then re-checked, that is what step 2 is
365
- > for.)
469
+ > link. It caught **1 broken link**: `/abuot.html` on `index.html`, the typo
470
+ > you planted. The graph never flagged it, but the skill did, because the skill
471
+ > reads your real pages.
472
+ > - **step 2 kicked in**: I briefed your `content-editor` to fix it. It pointed
473
+ > the link back at `/about.html`, and a re-run of **check-links** came back
474
+ > clean: 0 broken links.
366
475
  > - the **deploy runbook** (`docs/DEPLOYMENT.md`) lists the ship steps:
367
- > regenerate the pages (done), run the link check (done), start the server
368
- > (next chapter).
476
+ > regenerate the pages (done), run the link check (done, now clean), start the
477
+ > server (next chapter).
369
478
  >
370
- > As you saw in the lines just above, I did not report anything odd: the link
371
- > check came back clean and `/publish` is wired correctly across your pages.
372
- > Shall we continue?
479
+ > That is the whole point of the harness: you broke the site, the graph stayed
480
+ > quiet because the HTML is its output and not its map, and your own publish
481
+ > command caught the break and fixed it before it shipped. Shall we continue?
373
482
 
374
- Wait for confirmation. Mark `publish`: done. Auto-advance to `stability`.
483
+ Wait for confirmation. The site MUST be clean again (the typo fixed) before
484
+ `golive`. Mark `publish`: done. Auto-advance to `stability`.
375
485
 
376
486
  ## Chapter `stability` - Set a node's stability (and the `.sm` sidecar) (~3 min)
377
487
 
@@ -388,12 +498,17 @@ Tell the tester:
388
498
  > The first time skill-map writes its own metadata it asks for **consent**:
389
499
  > confirm it in the dialog that pops up. Two things happen at once: a stability
390
500
  > badge for the stage you picked appears on the `AGENTS` node, and skill-map
391
- > creates a **`.sm` sidecar file** (`AGENTS.sm`) right next to the handbook to
392
- > hold that metadata, your `AGENTS.md` itself is never touched. Your consent is
393
- > 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.
394
505
  >
395
- > That sidecar is where skill-map keeps what it knows about a node that does not
396
- > 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.
397
512
  >
398
513
  > See the new stability badge on the handbook?
399
514
 
@@ -401,23 +516,25 @@ Wait for confirmation. Mark `stability`: done. Auto-advance to `golive`.
401
516
 
402
517
  ## Chapter `golive` - Your website, live next to the graph (~3 min)
403
518
 
404
- One of the few chapters where the tester runs non-`sm` commands themselves;
405
- guide them, do not run it for them. `npm install` is idempotent, so it is safe
406
- 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.
407
524
 
408
525
  **Preparation**: none. `server.js` / `package.json` exist from the kickoff; the
409
526
  pages exist from the earlier chapters.
410
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
+
411
534
  ```bash
412
535
  npm install
413
536
  node server.js
414
537
  ```
415
-
416
- > Last step, the fun one. `npm install` confirms the one small library is there,
417
- > and `node server.js` starts the server (`Listening on http://localhost:3000`).
418
- >
419
- > Open `http://localhost:3000` and click through Home, About, and Projects, the
420
- > pages your harness produced and shipped through the publish flow you just ran.
421
538
  >
422
539
  > Now take it in at once. On one side, your real running website, named after
423
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`.
8
- - `kinds`: the node list reads `.codex/agents/demo-agent.toml` (agent), `.agents/skills/demo-command/SKILL.md` (Codex has no `command`, so this node is a **skill**), `.agents/skills/demo-skill/SKILL.md` (skill), and the `notes/*.md`. Name the kinds as agent + skill + markdown.
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
+ - `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
 
@@ -177,7 +180,7 @@ The canvas only draws the resolved arrows; the full per-link breakdown, includin
177
180
  > confidence: the numeric value. Here you'll see the contrast, the
178
181
  > `references` to `demo-guideline2` reads `1.00` (resolved), while the
179
182
  > `mentions` to `demo-guideline` reads `0.50` and is marked broken,
180
- > that 0.5 is the broken-reference penalty, not "half sure".
183
+ > that 0.5 is the broken-reference penalty, it's a "half sure".
181
184
  >
182
185
  > Now open the Inspector for a couple of the nodes to read their
183
186
  > Incoming count. The four resolved nodes (`demo-agent`,
@@ -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.
@@ -313,7 +314,7 @@ Give the tester a mental map of the folder so they know where the file lives, th
313
314
  │ └── skills/
314
315
  │ ├── demo-skill/SKILL.md
315
316
  │ └── sm-tutorial/SKILL.md ← the tutorial you loaded
316
- ├── .skill-map/ ← project DB + settings (managed)
317
+ ├── .skill-map/ ← project DB + settings
317
318
  ├── .skillmapignore ← the file we're about to edit
318
319
  └── notes/
319
320
  ├── todo.md
@@ -1,4 +1,4 @@
1
- # Part 3 (b): Extend skill-map - plugins (step library, `tour-*` ids)
1
+ # Part 4 (b): Extend skill-map - plugins (step library, `tour-*` ids)
2
2
 
3
3
  Guided tour of the **built-in plugins** that ship with `sm`. Three
4
4
  steps: a quick mental model of what plugins are plus a peek at
@@ -1,4 +1,4 @@
1
- # Part 1: The project from zero (step library, `kickoff-*` ids)
1
+ # Part 1: The harness from zero (step library, `kickoff-*` ids)
2
2
 
3
3
  The campaign turns real here. After the abstract prologue, the tester
4
4
  starts an actual project: a tiny personal **portfolio website**,
@@ -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, same as the claude command). 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
@@ -1,6 +1,6 @@
1
- # Part 3 (a): Extend skill-map - settings (step library, `settings-*` ids)
1
+ # Part 4 (a): Extend skill-map - settings (step library, `settings-*` ids)
2
2
 
3
- Step bodies for the settings chapters of Part 3 (config layers, the
3
+ Step bodies for the settings chapters of Part 4 (config layers, the
4
4
  `sm config` verbs, the active provider lens). The SKILL.md
5
5
  orchestrator dispatches each `settings-*` chapter id here;
6
6
  `authoring-*` ids it dispatches to `part-authoring.md`.
@@ -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