@skill-map/cli 0.53.5 → 0.54.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.
@@ -42,8 +42,10 @@ prefix when a part spans several files: `settings-*` →
42
42
  `part-authoring.md`).
43
43
 
44
44
  > For the tester this is a single guided session, never a course
45
- > catalogue. Never say "part 6", "chapter id", "the settings tour"
46
- > out loud. Use the friendly titles from the manifest.
45
+ > catalogue. Refer to a chapter by its tester-facing `section.chapter`
46
+ > number plus its friendly title (`_core.md` §Numbering); never expose
47
+ > the internal `order` index ("Part 6", off by one from the menu), a
48
+ > raw "chapter id", or tour jargon ("the settings tour").
47
49
 
48
50
  ## Pre-flight (run once, silent on success)
49
51
 
@@ -8,9 +8,32 @@ library assumes it. Do NOT restate these rules inside a part file.
8
8
  The tutorial is **one book**: an ordered sequence of **chapters
9
9
  grouped in parts**, listed in `_manifest.yml`. A chapter is the
10
10
  minimal unit (1 to a few steps). For the tester it is a single
11
- guided session, never a "course catalogue"; never say "part 3",
12
- "the settings tour", "chapter id" out loud. The menu uses friendly
13
- titles; once they pick, you just walk that path.
11
+ guided session, never a "course catalogue": refer to a chapter by its
12
+ tester-facing `section.chapter` number (§Numbering) plus its friendly
13
+ title, never by a raw "chapter id" or tour jargon ("the settings
14
+ tour"). The menu uses friendly titles; once they pick, you just walk
15
+ that path.
16
+
17
+ ## Numbering (the `section.chapter` scheme)
18
+
19
+ Two numbering systems coexist; keep them apart:
20
+
21
+ - **Internal (authoring only)**: the `order` field in `_manifest.yml`
22
+ and the `# Part N` file headers, 0-based (Part 0 the prologue …
23
+ Part 8 the MCP appendix). Use it in `**Context**:` blocks and author
24
+ notes; NEVER say it to the tester, it is off by one from what they
25
+ see.
26
+ - **Tester-facing (`S.N`)**: every part is a **section** numbered by
27
+ its 1-based position in the menu (section `1` is the prologue), and
28
+ every chapter inside it carries a `section.chapter` number like a
29
+ semver minor, resetting per section: section `5`'s chapters are
30
+ `5.1`, `5.2`, … This `S.N` form is the ONLY number you say out loud;
31
+ it matches the menu number the tester picked.
32
+
33
+ So the third chapter of section 5 announces as `5.3`, and the
34
+ prologue's first chapter is `1.1`. The numbers are derived at render
35
+ time from the menu order and the chapter's position in its part,
36
+ nothing is stored in the manifest.
14
37
 
15
38
  ## Tone
16
39
 
@@ -263,10 +286,12 @@ Never call `TaskCreate` / `TaskUpdate` (Inviolable rule #4).
263
286
 
264
287
  For every chapter:
265
288
 
266
- 1. **Announcement**: "Capítulo N: `<title>`. ~M min." then a blank
289
+ 1. **Announcement**: "Capítulo S.N: `<title>`. ~M min." then a blank
267
290
  line, then (optionally) one sentence of context on its own
268
- paragraph. `N` is the 1-based index of the chapter inside its
269
- part; it resets per part. The context paragraph renders ONLY when
291
+ paragraph. `S` is the section number (the part's 1-based menu
292
+ position) and `N` is the 1-based index of the chapter inside that
293
+ part, resetting per part (§Numbering), so section 5's third chapter
294
+ announces as `Capítulo 5.3`. The context paragraph renders ONLY when
270
295
  the source has a `**Context**:` field; if omitted, announce the
271
296
  title alone. The title comes from the chapter's `title` in
272
297
  `_manifest.yml` (translated per §Tone), not the internal id.
@@ -339,7 +364,8 @@ and go straight to §Final wrap-up.
339
364
 
340
365
  Render the menu numbered and formatted (NOT a bare list), translated
341
366
  to the tester's language. A one-line intro, then per part a **bold
342
- numbered title line** (number + title + `(~M min)`) as plain prose,
367
+ numbered title line** (the section number + title + `(~M min)`, that
368
+ number is the `S` major in the chapter `S.N` scheme, §Numbering) as plain prose,
343
369
  immediately followed by a single-level `> ` blockquote one-line
344
370
  description (what the part covers, derived from its title + chapters).
345
371
  A **completed part** keeps its plain title (NO `✓` on the title line)
@@ -148,7 +148,7 @@ parts:
148
148
 
149
149
  - id: maintain
150
150
  order: 4
151
- title: "Maintain the site"
151
+ title: "Maintain the harness"
152
152
  step_file: part-maintain.md
153
153
  pace: auto-advance
154
154
  preflight: seed
@@ -62,8 +62,6 @@ description: |
62
62
  tools so the `core/tools-counter` extractor emits a count.
63
63
  tools: [Read, Bash, Edit]
64
64
  model: sonnet
65
- metadata:
66
- version: "1.0.0"
67
65
  ---
68
66
 
69
67
  # master-agent
@@ -82,17 +80,6 @@ description: |
82
80
  Example skill paired with the master-agent for the advanced
83
81
  tutorial. Links to the agent so extractors and analyzers have
84
82
  something to chew on.
85
- inputs:
86
- - name: target
87
- type: path
88
- description: File to process.
89
- required: true
90
- outputs:
91
- - name: report
92
- type: string
93
- description: Markdown summary.
94
- metadata:
95
- version: "1.0.0"
96
83
  ---
97
84
 
98
85
  # master-skill
@@ -115,9 +102,6 @@ name: Ideas backlog
115
102
  description: |
116
103
  Free-form notes for the advanced tutorial. Demonstrates the
117
104
  catch-all markdown kind alongside the agent and skill.
118
- tags: [notes, master]
119
- metadata:
120
- version: "1.0.0"
121
105
  ---
122
106
 
123
107
  # Ideas
@@ -63,50 +63,28 @@ sm check --json
63
63
 
64
64
  Expected: the error surfaces the dangling link from `notes/todo.md` to the non-existent `missing-page.md`. The `--analyzers` filter lets you focus on a single issue type; `--json` emits the structured payload (useful for CI / scripting). When done, the tester can leave the bullet in place or delete it, the rest of the deep-dive doesn't depend on it.
65
65
 
66
- If the tester asks about `sm orphans` vs `sm check`:
67
-
68
- - `sm check` reports broken-refs and other rule-driven issues
69
- (the deterministic catalog).
70
- - `sm orphans` is a **different scope**: auto-rename / orphan-node
71
- detection (a node whose file disappeared, or a candidate rename
72
- the kernel is still unsure about). Our fixture doesn't produce
73
- orphans of that kind, so `sm orphans` will print "No orphan /
74
- auto-rename issues", that's expected, not a bug.
75
-
76
66
  Mark `issues`: done.
77
67
 
78
68
  ## Chapter `annotations` - Annotations and the .sm consent prompt (~3 min)
79
69
 
80
- **Context**: every `.md` skill-map tracks gets a sibling **companion file** with extension `.sm` that carries **all of the tool's metadata about that markdown, so your `.md` stays clean and uncluttered**. Version, history, tags, annotations, anything that does not belong in the human-authored body lives in the `.sm`. The `.md` is content you write for Claude or humans; the `.sm` is bookkeeping the tool writes. They are ordinary source files, committed to git like everything else, and you'll encounter them often once you start working with the project.
70
+ **Context**: skill-map keeps each tracked `.md`'s metadata (version, history, tags, annotations) in a sibling **`.sm` companion file** so the `.md` stays clean, and the first time it writes one in a project it asks for consent (remembered in the gitignored `settings.local.json`). The Maintain part walks that consent flow in full; this chapter does not re-teach it. The CLI focus here is what Maintain does not cover: the **three sidecar verbs** and the `--yes` non-interactive switch. A tester who jumped straight here gets a one-line refresher in the demo below.
81
71
 
82
- The first time skill-map wants to write one in a new project it asks for your consent, it never touches your filesystem without permission. After you say yes, the choice is saved to the project's `settings.local.json` (part of your project config, gitignored) and the prompt never appears again.
83
-
84
- We'll demonstrate by creating an empty annotation scaffold for `notes/todo.md`. **Reset any prior consent state first** so the prompt actually appears (an earlier step may have flipped the flag without you noticing, in which case `sm sidecar annotate` would skip straight past the prompt and the lesson would not land):
72
+ Create a scaffold for `notes/todo.md` so there is a `.sm` on disk to talk about. **Reset any prior consent state first** so the prompt appears (an earlier step may have flipped the flag, in which case the verb skips straight past it):
85
73
 
86
74
  ```bash
87
75
  rm -f notes/todo.sm .skill-map/settings.local.json
88
76
  sm sidecar annotate notes/todo.md
89
77
  ```
90
78
 
91
- Expected: a short explanation paragraph appears in the terminal, followed by a `[Y/n]` prompt (capital Y = default Yes, you can just hit Enter). After accepting, `notes/todo.sm` appears next to `notes/todo.md` carrying an `identity:` block plus an empty `annotations: {}` block, and `.skill-map/settings.local.json` now contains `{ "allowEditSmFiles": true }`.
92
-
93
- ```bash
94
- cat notes/todo.sm
95
- cat .skill-map/settings.local.json
96
- ```
97
-
98
- **Why the prompt?** The choice is **per-user, per-project**: stored in the gitignored `settings.local.json` so each contributor consents independently and nothing about the choice travels via the repo. Once accepted, the flag stays set and skill-map will never ask again on this checkout (the next `sm sidecar annotate` or `sm bump` goes through silently). On a CI / non-interactive session, pass `--yes` to grant up-front.
79
+ Expected: a short explanation, then a `[Y/n]` prompt (capital Y = default Yes, just hit Enter). After accepting, `notes/todo.sm` appears with an `identity:` block plus an empty `annotations: {}`, and `.skill-map/settings.local.json` records `{ "allowEditSmFiles": true }` so it never asks again on this checkout (the choice is per-user, per-project, gitignored).
99
80
 
100
- If the tester asks about `sm bump` vs `sm sidecar annotate` vs `sm sidecar refresh`:
81
+ The part the CLI adds on top, the three sidecar verbs (all share that same consent gate):
101
82
 
102
- - `sm sidecar annotate` is the scaffold verb (creates a fresh
103
- `.sm`).
104
- - `sm bump <node>` is the day-to-day verb that increments the
105
- sidecar's version and refreshes its hashes, same consent gate.
106
- - `sm sidecar refresh <node>` is the hash-only update (no version
107
- bump).
83
+ - `sm sidecar annotate <node>` is the scaffold verb you just ran (creates a fresh `.sm`).
84
+ - `sm bump <node>` is the day-to-day verb: it increments the sidecar's version and refreshes its hashes.
85
+ - `sm sidecar refresh <node>` is the hash-only update (no version bump).
108
86
 
109
- If the tester ever asks about reserved names (e.g. `commands/help.md`): if they name a file after a built-in (`/help`, `/clear`, `/init`, `/agents`, `/model`, or one of the documented agent reservations like `general-purpose`), `sm check` surfaces a `reserved-name` warning. The vendor runtime ignores user-owned files that shadow its built-ins, so the warning is not a bug, it's skill-map telling the operator "Claude will never invoke this file; pick another name". Incoming links to the shadowed file resolve at confidence `0.1` instead of `1.0`, so the **Map** also visually de-emphasises them. Rename the file and the warning clears on the next scan.
87
+ And for automation: a CI / non-interactive session has no one to answer the `[Y/n]`, so pass `--yes` to grant consent up front (`sm sidecar annotate <node> --yes`).
110
88
 
111
89
  Mark `annotations`: done.
112
90
 
@@ -131,7 +109,6 @@ name: note-with-external-link
131
109
  description: |
132
110
  Demo note that links out to a sibling project (hijoB) sitting
133
111
  next to this one. Used to teach scan.referencePaths.
134
- tags: [demo, link-validation]
135
112
  ---
136
113
 
137
114
  # Note with external link
@@ -147,7 +124,6 @@ description: |
147
124
  Target of the cross-folder link. Lives outside hijoA's scan
148
125
  scope on purpose: that is precisely what scan.referencePaths
149
126
  is designed to bridge.
150
- tags: [demo, link-validation]
151
127
  ---
152
128
 
153
129
  # External spec
@@ -14,15 +14,6 @@ name: check-links
14
14
  description: |
15
15
  Validates the portfolio's internal links before publishing. Walks
16
16
  every generated page and reports any link whose target is missing.
17
- inputs:
18
- - name: root
19
- type: path
20
- description: Folder of generated pages to check.
21
- required: true
22
- outputs:
23
- - name: report
24
- type: string
25
- description: List of broken links, empty when all resolve.
26
17
  ---
27
18
 
28
19
  # check-links
@@ -55,7 +46,7 @@ Wait for confirmation. Mark `check-links`: done.
55
46
 
56
47
  On `agent-skills` / Antigravity there is no `command` kind, so skip this whole chapter and fold its purpose into the prose of the next one.
57
48
 
58
- Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them. The frontmatter fence (`---`) MUST sit on column 0 with no leading spaces: present the block below exactly as written, and if the tester pastes it indented, have them strip the leading whitespace. An indented `---` does not parse as YAML, so the `publish` node would land without its `name`, `description`, or `shortcut`.
49
+ Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them. The frontmatter fence (`---`) MUST sit on column 0 with no leading spaces: present the block below exactly as written, and if the tester pastes it indented, have them strip the leading whitespace. An indented `---` does not parse as YAML, so the `publish` node would land without its `name` or `description`.
59
50
 
60
51
  > Create `.claude/commands/publish.md` with exactly this content (the first line is `---`, nothing before it):
61
52
 
@@ -65,12 +56,6 @@ name: publish
65
56
  description: |
66
57
  Publishes the portfolio: runs the link check, hands off to the
67
58
  content editor for any last fixes, then follows the deploy runbook.
68
- shortcut: "ctrl+alt+p"
69
- args:
70
- - name: root
71
- type: path
72
- description: Folder of generated pages to publish.
73
- required: true
74
59
  ---
75
60
 
76
61
  # publish
@@ -43,15 +43,6 @@ Create these five files (with `Write`), exactly in this order. Per §Provider de
43
43
  description: |
44
44
  Example skill that walks a file and returns a Markdown report.
45
45
  Showcases the `skill` kind in the demo map.
46
- inputs:
47
- - name: target
48
- type: path
49
- description: File to process.
50
- required: true
51
- outputs:
52
- - name: report
53
- type: string
54
- description: Markdown summary.
55
46
  ---
56
47
 
57
48
  # demo-skill
@@ -70,20 +61,14 @@ Create these five files (with `Write`), exactly in this order. Per §Provider de
70
61
  ---
71
62
  name: demo-command
72
63
  description: |
73
- Example slash-style command that wraps the demo-skill behind
74
- a keyboard shortcut. Showcases the `command` kind.
75
- shortcut: "ctrl+alt+d"
76
- args:
77
- - name: target
78
- type: path
79
- description: File the command will hand off to the skill.
80
- required: true
64
+ Example slash command that wraps the demo-skill. Showcases the
65
+ `command` kind.
81
66
  ---
82
67
 
83
68
  # demo-command
84
69
 
85
- Quick keyboard entry point for running the demo flow on a
86
- target file. Connectors land in the next sub-step.
70
+ Quick entry point for running the demo flow on a target file.
71
+ Connectors land in the next sub-step.
87
72
  ```
88
73
 
89
74
  3. `notes/todo.md`, classified as `kind: markdown` today
@@ -96,7 +81,6 @@ Create these five files (with `Write`), exactly in this order. Per §Provider de
96
81
  Live list of things to review in the demo. Will become the
97
82
  hub that points to the rest of the fixture in the next
98
83
  sub-step.
99
- tags: [notes, demo]
100
84
  ---
101
85
 
102
86
  # Pending
@@ -112,7 +96,6 @@ Create these five files (with `Write`), exactly in this order. Per §Provider de
112
96
  Static reference notes the rest of the demo points at. The hub
113
97
  reaches it with a bare `@`-mention, which stays a faint guess
114
98
  (0.50) because it can't resolve to a known entity.
115
- tags: [notes, demo]
116
99
  ---
117
100
 
118
101
  # Demo Guideline
@@ -135,7 +118,6 @@ Create these five files (with `Write`), exactly in this order. Per §Provider de
135
118
  Sibling of demo-guideline. The hub reaches it with an
136
119
  `@`-mention that carries the `.md` extension, so the link
137
120
  resolves to this file and lands certain (1.00).
138
- tags: [notes, demo]
139
121
  ---
140
122
 
141
123
  # Demo Guideline 2
@@ -80,8 +80,8 @@ Tell the tester:
80
80
  >
81
81
  > **Step 2, brief the editor** (`@content-editor`). The check found
82
82
  > nothing to fix, so there is no brief to hand off this time, that is
83
- > the happy path. (Part 4 is where a link actually breaks and this
84
- > step earns its keep.)
83
+ > the happy path. (Maintaining the harness is where a link actually
84
+ > breaks, and that is where this step earns its keep.)
85
85
  >
86
86
  > **Step 3, follow the deploy runbook** (`docs/DEPLOY.md`). It lists:
87
87
  > generate the pages (done), run the link check (done), start the
@@ -122,7 +122,7 @@ Tell the tester:
122
122
  > Last step, the fun one. In your terminal, run these two commands:
123
123
  >
124
124
  > `npm install` downloads the one small library the server needs
125
- > (Express). If you already ran it in Part 3 it just confirms it is
125
+ > (Express). If you already ran it earlier it just confirms it is
126
126
  > there. Then `node server.js` starts the server; it prints a line
127
127
  > like `Listening on http://localhost:3000`.
128
128
  >
@@ -1,4 +1,4 @@
1
- # Part 4: Maintain the site (step library, `maintain`)
1
+ # Part 4: Maintain the harness (step library, `maintain`)
2
2
 
3
3
  This is the upkeep part. The harness from Part 2 is wired and clean; real projects drift, links break, drafts pile up, names collide. Here the tester breaks something on purpose and fixes it, meets the analyzer catalogue that catches those problems, finds an orphan nobody links to, clears a reserved-name warning, and learns the `.sm` companion files that carry the tool's bookkeeping. `pace: auto-advance` (walk straight into the next chapter once one is marked done), `preflight: seed` (it builds on the portfolio harness from Parts 1 and 2, reusing the accumulated state when its predecessors are done, no fresh fixture of its own). Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
4
4
 
@@ -113,7 +113,7 @@ Wait for confirmation. Mark `analyzers`: done.
113
113
 
114
114
  ## Chapter `orphans` - A page nobody links to (~3 min)
115
115
 
116
- **Context**: a different kind of loose end. A node can be perfectly valid and still be an orphan: nothing in the harness links to it. We create a draft page that no one references; it lands on the **Map** as a floating dot, and `sm show` confirms it has no incoming links. The point is to separate three ideas the tester now has names for: orphan (nothing points at it) vs broken-ref (a link with no target) vs issue (a rule violation). Note: orphan-ness is a property of the graph (visible on the Map / inspector), there is no `sm check` analyzer for it. The separate `sm orphans` verb is unrelated, it surfaces history stranded by a rename, not unlinked pages, so do NOT use it here.
116
+ **Context**: a different kind of loose end. A node can be perfectly valid and still be an orphan: nothing in the harness links to it. We create a draft page that no one references; it lands on the **Map** as a floating dot, and `sm show` confirms it has no incoming links. The point is to separate three ideas the tester now has names for: orphan (nothing points at it) vs broken-ref (a link with no target) vs issue (a rule violation). Note: orphan-ness is a property of the graph (visible on the Map / inspector), there is no `sm check` analyzer for it. The separate `sm orphans` verb is unrelated (it surfaces history stranded by a rename, not unlinked pages), so do NOT run it or bring it up with the tester here.
117
117
 
118
118
  `Write` `docs/draft.md` (markdown kind), a half-finished page nobody has wired up yet:
119
119
 
@@ -123,7 +123,6 @@ name: draft
123
123
  description: |
124
124
  Half-finished page nobody links to yet. Here to show what an
125
125
  orphan looks like: a valid node with no incoming connectors.
126
- tags: [docs, portfolio, draft]
127
126
  ---
128
127
 
129
128
  # Draft page
@@ -163,16 +162,12 @@ Tell the tester:
163
162
  > - **issue**: any rule violation `sm check` reports (broken-ref is
164
163
  > one family; name-reserved, self-loop and the rest are others).
165
164
  >
166
- > An orphan is not automatically a problem (a draft you have not wired
167
- > up yet is fine), it is just skill-map pointing out the page is not
168
- > reachable from anywhere. When you link to it later, it stops being
169
- > an orphan.
170
- >
171
- > (Heads up: there is also an `sm orphans` command, but it is a
172
- > different tool. It tracks history left stranded when you rename a
173
- > file that had tracked state, not pages with no links, so it will
174
- > not list `docs/draft`. Running it here prints "no orphan issues",
175
- > which is correct.)
165
+ > An orphan is not automatically a problem. Sometimes it is a draft you
166
+ > have not wired up yet; sometimes it is a node you deliberately keep on
167
+ > its own, isolated on purpose, and that is just as valid. skill-map is
168
+ > only pointing out that the page is not reachable from anywhere, not
169
+ > telling you to fix it: if you link to it later it stops being an
170
+ > orphan, and if you never do, that was your call, not an error.
176
171
  >
177
172
  > Did `docs/draft` land as a floating dot, with `sm show` confirming
178
173
  > no links in?
@@ -191,11 +186,6 @@ name: init
191
186
  description: |
192
187
  Bootstraps a fresh portfolio scaffold. Named init on purpose, to
193
188
  collide with the runtime built-in and trigger name-reserved.
194
- args:
195
- - name: target
196
- type: path
197
- description: Folder to scaffold into.
198
- required: true
199
189
  ---
200
190
 
201
191
  # init
@@ -280,6 +270,15 @@ sm sidecar annotate AGENTS.md
280
270
  > layer (gitignored), so each contributor consents on their own
281
271
  > checkout and the choice never travels through git.
282
272
  >
273
+ > **Tip:** that `.sm` is also where the inspector gets a node's
274
+ > **Metadata**. With the live `sm` still running, click the `AGENTS`
275
+ > node on the **Map**: the inspector now shows a **Metadata** section
276
+ > that was not there before you created the companion file. It reads
277
+ > straight from `AGENTS.sm`, so a node with no `.sm` has no Metadata
278
+ > section at all. For now it reads **never bumped**, because you only
279
+ > scaffolded the file; once you start running `sm bump AGENTS.md` that
280
+ > panel fills in **Created** and **Last bumped**.
281
+ >
283
282
  > Did the prompt appear, and does `AGENTS.sm` exist now?
284
283
 
285
284
  Wait for confirmation. You MAY use `Read` on `AGENTS.sm` to verify it landed. Mark `sidecar`: done. Last chapter of the part: apply §Closing a part (the close names the part by its title and routes back to the menu).
@@ -139,7 +139,6 @@ runbook), so Part 4's maintenance beats have something to point at.
139
139
  name: style-guide
140
140
  description: |
141
141
  Writing and markup conventions every portfolio page follows.
142
- tags: [docs, portfolio]
143
142
  ---
144
143
 
145
144
  # Style guide
@@ -155,7 +154,6 @@ tags: [docs, portfolio]
155
154
  name: deploy-runbook
156
155
  description: |
157
156
  How the portfolio gets published once the pages are written.
158
- tags: [docs, portfolio]
159
157
  ---
160
158
 
161
159
  # Deploy runbook