@skill-map/cli 0.60.2 → 0.60.3

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.
@@ -138,9 +138,21 @@ element. Decide with §Provider detection:
138
138
 
139
139
  Sample messages throughout the part files are written in the Claude
140
140
  variant (with `> `); strip the prefix when the host is non-Claude,
141
- the wording is unchanged. **Code / terminal blocks always stay at
142
- the top level** (never under `> `, even in the Claude variant) so
143
- copy-paste is clean.
141
+ the wording is unchanged.
142
+
143
+ **The rule, in one line**: every tester-facing line of prose carries
144
+ the `> ` bar in the Claude variant, context sentences, intros, tips,
145
+ expectations, confirmations, all of it, so a run of contiguous prose
146
+ reads as one continuous separator bar (put `>` on the blank lines
147
+ between paragraphs to keep the bar unbroken). The ONLY things that sit
148
+ at the top level are the command / code / terminal blocks the tester
149
+ copies (never under `> `, even in the Claude variant, so copy-paste is
150
+ clean). A command block in the middle of a message naturally splits
151
+ the bar, prose above it is one bar, prose below it another, and that
152
+ is correct: commands are meant to stand outside the bar. The two
153
+ documented exceptions to "all prose is quoted" are the plain
154
+ `Capítulo S.N:` announcement line (§Per-step cycle) and the menu
155
+ (§Menu format); everything else the tester reads is quoted.
144
156
 
145
157
  **Preservation rule, strict**: if a source line is already prefixed
146
158
  with `> `, keep that prefix verbatim (Claude mode). Do NOT strip
@@ -287,15 +299,21 @@ Never call `TaskCreate` / `TaskUpdate` (Inviolable rule #4).
287
299
 
288
300
  For every chapter:
289
301
 
290
- 1. **Announcement**: "Capítulo S.N: `<title>`. ~M min." then a blank
291
- line, then (optionally) one sentence of context on its own
292
- paragraph. `S` is the section number (the part's 1-based menu
293
- position) and `N` is the 1-based index of the chapter inside that
294
- part, resetting per part (§Numbering), so section 5's third chapter
295
- announces as `Capítulo 5.3`. The context paragraph renders ONLY when
296
- the source has a `**Context**:` field; if omitted, announce the
297
- title alone. The title comes from the chapter's `title` in
298
- `_manifest.yml` (translated per §Tone), not the internal id.
302
+ 1. **Announcement**: "Capítulo S.N: `<title>`. ~M min." as a plain
303
+ line (NOT quoted), then a blank line. `S` is the section number
304
+ (the part's 1-based menu position) and `N` is the 1-based index of
305
+ the chapter inside that part, resetting per part (§Numbering), so
306
+ section 5's third chapter announces as `Capítulo 5.3`. The title
307
+ comes from the chapter's `title` in `_manifest.yml` (translated per
308
+ §Tone), not the internal id. When the source has a `**Context**:`
309
+ field, follow the announcement with one tester-facing sentence of
310
+ context, and render it **under the `> ` bar as the opening line of
311
+ the SAME blockquote as the chapter's instructions** (Claude variant:
312
+ put `>` on the blank line between the context and the instructions
313
+ so they read as one continuous separator bar, never two stacked
314
+ blocks; the context line is tester-facing, so it is never plain
315
+ prose). When the source has no `**Context**:` field, announce the
316
+ title alone.
299
317
  2. **Preparation** (if applicable): create or modify the fixture
300
318
  files the chapter calls for (silently, per §Silence).
301
319
  3. **The tester's part**: the command block(s) and instructions,
@@ -4,26 +4,30 @@ The live-UI prologue: the tester runs `sm init`, opens the browser, and watches
4
4
 
5
5
  ## Chapter `init` - Your first node (~2 min)
6
6
 
7
- **Context**: `sm init` creates a hidden `.skill-map/` folder in the cwd holding the database where skill-map stores what it learns about the project. It also runs an initial scan. Mandatory first step. Then typing `sm` alone (no arguments) in an initialised dir starts the UI server with the watcher built in (it is just an alias of `sm serve` with all defaults; the moment you need any flag you write `sm serve --flag ...` explicitly). One process, one terminal: it boots the server, scans the `.md` files, detects changes, and pushes events over WebSocket to the live UI. The next chapters all run against the same `sm` session, you boot it here and keep it alive through the `ignore` chapter.
8
-
9
- ```bash
10
- sm init
11
- sm
12
- ```
7
+ Agent background (do NOT render this as a separate context paragraph; the tester-facing version is folded into the message below): `sm init` creates a hidden `.skill-map/` folder in the cwd holding the database where skill-map stores what it learns about the project, and runs an initial scan (mandatory first step). Typing `sm` alone (no arguments) in an initialised dir then starts the UI server with the watcher built in (it is just an alias of `sm serve` with all defaults; the moment you need any flag you write `sm serve --flag ...` explicitly). One process, one terminal: it boots the server, scans the `.md` files, detects changes, and pushes events over WebSocket to the live UI. The next chapters all run against this same `sm` session, you boot it here and keep it alive through the `ignore` chapter.
13
8
 
14
9
  Expected: `.skill-map/skill-map.db` appears (plus config files), and the initial scan reports a small node / link count from the demo-agent fixture. `sm init` runs and exits; `sm` then starts the UI server and stays running. (Agent context, do not narrate: pre-flight's `.skillmapignore` keeps the tutorial's own files, `sm-tutorial.md` / `findings.md` / `tutorial-state.yml`, out of the scan; `sm init` leaves that file alone since it only writes when absent.)
15
10
 
16
- Give the tester the whole flow in one message with ONE confirmation, do NOT pause for the `sm init` output separately. Don't hardcode the URL, the verb logs the bound `http://host:port` after listen. Tell the tester:
11
+ Give the tester the whole flow in ONE message with ONE confirmation, do NOT pause for the `sm init` output separately. Order matters: **lead with the browser setup**, then explain what the two commands do as you hand them over, then the command block, then the URL. Do NOT print the command block or an explanation paragraph before the browser instruction. Don't hardcode the URL, the verb logs the bound `http://host:port` after listen. Tell the tester:
17
12
 
18
13
  > First, **open your browser** and put it side by side with this
19
14
  > chat (browser on one half, chat on the other, any split that lets
20
15
  > you see both) so you can watch the **Map** update in real time.
21
16
  >
22
- > Then, in your second terminal, run the two commands above: `sm
23
- > init` sets the project up (it creates `.skill-map/` and runs a
24
- > first scan), and `sm` boots the live UI. After a couple of seconds
25
- > `sm` prints a URL, copy it and open it in your browser. The
26
- > terminal keeps printing scan lines, you don't need to read them.
17
+ > Then, in your second terminal, you'll run two commands. `sm init`
18
+ > sets the project up: it creates the hidden `.skill-map/` folder
19
+ > with the database where skill-map stores what it learns about the
20
+ > project, and runs a first scan. `sm` on its own (no arguments)
21
+ > then boots the live UI server, with the watcher built in.
22
+
23
+ ```bash
24
+ sm init
25
+ sm
26
+ ```
27
+
28
+ > After a couple of seconds `sm` prints a URL, copy it and open it
29
+ > in your browser. The terminal keeps printing scan lines, you don't
30
+ > need to read them.
27
31
  >
28
32
  > You'll see one node in the **Map**: `demo-agent`. Tell me when the
29
33
  > page is open showing it.
@@ -235,8 +239,8 @@ Tell the tester:
235
239
  > One word on solidity: skill-map draws each connector's
236
240
  > **confidence** as opacity, and every arrow you see here is fully
237
241
  > solid (1.00) because each one lands on a real node. The faint,
238
- > partial case (a link to a real file the runtime would ignore) shows
239
- > up later in the campaign; for now the rule is simple, a reference
242
+ > partial case shows up later in the campaign; for now the rule is
243
+ > simple, a reference
240
244
  > that resolves draws a solid arrow, a reference that points at
241
245
  > nothing is not drawn at all and gets flagged instead. The exact
242
246
  > per-link numbers live in the inspector, next chapter.
@@ -251,6 +255,12 @@ Expected: four drawn arrows plus one `core/reference-broken` error on `notes/tod
251
255
 
252
256
  The canvas only draws the resolved arrows; the full per-link breakdown, including the broken one that never drew, lives in the Inspector. Open it on the hub so the tester registers the surface before the `edit-link` chapter changes topology.
253
257
 
258
+ > 💡 Tip: if all these changes left the nodes crowded together, the
259
+ > map toolbar has a **Re-arrange layout** button (tooltip "Re-arrange
260
+ > the visible nodes"): it tidies the layout so everything reads
261
+ > better. If you've moved nodes by hand it asks for confirmation
262
+ > first, otherwise it just re-arranges.
263
+ >
254
264
  > 🆕 Open the Inspector for **Demo TODO list** (click the node on
255
265
  > the map). **Expand** the **Connections** section (it's collapsed
256
266
  > by default): it has two sections, **Outgoing** and **Incoming**.
@@ -263,26 +273,20 @@ The canvas only draws the resolved arrows; the full per-link breakdown, includin
263
273
  > `mentions` to `demo-guideline` reads `0.50` and is marked broken,
264
274
  > that 0.5 is the broken-reference penalty, not a "halfway sure".
265
275
  >
266
- > Now open the Inspector for a couple of the targets to read their
267
- > Incoming count. The four resolved targets (`demo-agent`,
276
+ > Now open the Inspector for a couple of the nodes to read their
277
+ > Incoming count. The four resolved nodes (`demo-agent`,
268
278
  > `demo-command`, `demo-skill`, `demo-guideline2`) each show **1**
269
279
  > incoming. Open `demo-guideline` and it shows **0**: the broken
270
280
  > mention never landed on it, so nothing points in. Five outgoing
271
281
  > links on the hub, but only four of them reach a node.
272
282
  >
273
- > 💡 Tip: if all these changes left the nodes crowded together, the
274
- > map toolbar has a **Re-arrange layout** button (tooltip "Re-arrange
275
- > the visible nodes"): it tidies the layout so everything reads
276
- > better. If you've moved nodes by hand it asks for confirmation
277
- > first, otherwise it just re-arranges.
278
- >
279
283
  > Let me know when you see it.
280
284
 
281
285
  Mark `inspector`: done.
282
286
 
283
287
  ## Chapter `edit-link` - Edit a link, the topology changes (~3 min)
284
288
 
285
- **Context**: the `first-edit` chapter had the tester edit a scalar (`description`) and watch the inspector card refresh. This chapter raises the bar: edit a Markdown link and watch the MAP TOPOLOGY change (a connector disappears). Same watcher, different surface.
289
+ **Context**: the `first-edit` chapter had the tester edit a scalar (`description`) and watch the inspector card refresh. This chapter raises the bar: edit a Markdown link and watch the MAP TOPOLOGY change (a connector disappears).
286
290
 
287
291
  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.
288
292
 
@@ -298,7 +302,7 @@ You verify by reading `notes/todo.md` to confirm the change was applied. (On `ag
298
302
 
299
303
  ## Chapter `workspace` - Navigate the workspace (files, search, isolate) (~2 min)
300
304
 
301
- **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. No file edits here, pure navigation, and the same `sm` session you booted back in the `init` chapter is still running.
305
+ **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.
302
306
 
303
307
  Per §Provider detection, on `agent-skills` / Antigravity the fixture has fewer nodes (`demo-skill` plus the two `notes/` files), so swap the node names below for ones that exist in that set; the gestures are identical.
304
308
 
@@ -333,18 +337,20 @@ Per §Provider detection, on `agent-skills` / Antigravity the fixture has fewer
333
337
  >
334
338
  > The Map collapses to **Demo TODO list** plus only the nodes it
335
339
  > draws an arrow to (`demo-command`, `demo-skill`,
336
- > `demo-guideline2`).
337
- > Two nodes drop out of view: `demo-agent`, which lost its only
338
- > connector back in the last step, and `demo-guideline`, whose bare
339
- > mention never resolved so it has no drawn connector either. The
340
- > Inspector opens on **Demo TODO list**.
341
- > That's how you
342
- > focus on one node's neighborhood when a map gets busy.
340
+ > `demo-guideline2`). That's how you focus on one node's
341
+ > neighborhood when a map gets busy.
343
342
  >
344
343
  > To bring the rest back, look at the toolbar along the bottom of
345
344
  > the Map: there's a **Show all** button (an eye icon). Click it and
346
345
  > all six nodes return.
347
346
  >
347
+ > 💡 Tip: remember the search box from a moment ago? The map-icon
348
+ > button right next to it controls whether the search also filters
349
+ > the **Map**. It's on by default, that's why the **Map** narrowed
350
+ > along with the tree when you searched `guideline`. Click it to
351
+ > switch to filtering only the files list, leaving the map's layout
352
+ > in place.
353
+ >
348
354
  > Did the map isolate and then restore?
349
355
 
350
356
  Leave the server running, the next chapter (`.skillmapignore`) is the last one that uses it. Mark `workspace`: done.
@@ -380,8 +386,8 @@ It lands in the map as a seventh node (`notes/private-credentials`); the watcher
380
386
  Give the tester a mental map of the folder so they know where the file lives, then the glob that hides it, all in ONE message. Use `Bash` (`ls -la`, plus `ls -la notes/` if a deeper view helps) for the real listing and apply the host-dependent rendering rule. Per Inviolable rule #2, the agent does NOT touch `.skillmapignore` with its `Edit` tool, the tester edits it from their own editor:
381
387
 
382
388
  > One last step. Your `private-credentials` note just popped into
383
- > the map as a seventh node, that's the watcher again. Now let's hide
384
- > it. Here's what your directory looks like right now:
389
+ > the map as a seventh node. Now let's hide it. Here's what your
390
+ > directory looks like right now:
385
391
 
386
392
  ```
387
393
  . ← your cwd
@@ -412,8 +418,7 @@ notes/private-*.md
412
418
  > Save the file. It's a glob (same as `.gitignore`):
413
419
  > `notes/private-*.md` matches `private-credentials.md` and any
414
420
  > future sibling `private-*.md`. A literal path
415
- > (`notes/private-credentials.md`) would also work, the glob teaches
416
- > the broader habit.
421
+ > (`notes/private-credentials.md`) would also work.
417
422
  >
418
423
  > Watch the browser when you save. The
419
424
  > `notes/private-credentials` node should disappear from the
@@ -51,12 +51,9 @@ Tell the tester:
51
51
  > `.claude/` folder is the **harness** (the helpers that maintain the
52
52
  > site). skill-map maps that harness.
53
53
  >
54
- > Run `sm init`. This folder has both a root `AGENTS.md` and a
55
- > `.claude/` folder, so skill-map can't tell on its own which runtime
56
- > you're authoring for and asks:
57
- > `⚠ Multiple provider markers detected. Pick the active lens: 1) claude 2) openai`.
58
- > Type `1` (or `claude`) and press Enter, this is a Claude project.
59
- > Then run `sm` to boot the live UI.
54
+ > Run `sm init`. If it asks you to pick a lens (`⚠ Multiple provider
55
+ > markers detected`), choose `claude`, this is a Claude project. Then
56
+ > run `sm` to boot the live UI.
60
57
  >
61
58
  > Open the URL `sm` printed. You'll see **one node**: `AGENTS.md`,
62
59
  > the project's handbook (the operating manual for the site).
@@ -70,11 +67,11 @@ Wait for confirmation. Mark `kickoff`: done.
70
67
 
71
68
  ## Chapter `manual` - The handbook and CLAUDE.md (~2 min)
72
69
 
73
- **Context**: the dogfood beat. Real Claude Code projects keep a
74
- `CLAUDE.md` that just points at `AGENTS.md` (this very repo does).
75
- That one-line pointer is a real `references` link (the `.md` extension
76
- makes `@AGENTS.md` a file pointer, not a bare mention), the tester's
77
- first connector on the real project.
70
+ **Context**: the dogfood beat. Real Claude Code projects can
71
+ reference the generic `AGENTS.md` from their `CLAUDE.md` (this very
72
+ repo does). That one-line pointer is a real `references` link (the
73
+ `.md` extension makes `@AGENTS.md` a file pointer, not a bare
74
+ mention), the tester's first connector on the real project.
78
75
 
79
76
  Tell the tester to create the file themselves (it is their project's
80
77
  file, Inviolable rule #2):
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // cli/entry.ts
2
2
 
3
- !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]="260025e8-f869-5831-9c99-f19ba80d10a4")}catch(e){}}();
3
+ !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]="d4d9801b-b9d6-5298-9ce5-eda6c347ce50")}catch(e){}}();
4
4
  import { existsSync as existsSync33 } from "fs";
5
5
  import { Builtins, Cli as Cli2 } from "clipanion";
6
6
 
@@ -250,7 +250,7 @@ function bucketByKind(kind, instance, bag) {
250
250
  // package.json
251
251
  var package_default = {
252
252
  name: "@skill-map/cli",
253
- version: "0.60.2",
253
+ version: "0.60.3",
254
254
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
255
255
  license: "MIT",
256
256
  type: "module",
@@ -31058,4 +31058,4 @@ function resolveBareDefault() {
31058
31058
  process.exit(ExitCode.Error);
31059
31059
  }
31060
31060
  //# sourceMappingURL=cli.js.map
31061
- //# debugId=260025e8-f869-5831-9c99-f19ba80d10a4
31061
+ //# debugId=d4d9801b-b9d6-5298-9ce5-eda6c347ce50
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // kernel/i18n/registry.texts.ts
2
2
 
3
- !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]="1dbff951-d266-51b9-8565-560ca6aafaa6")}catch(e){}}();
3
+ !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]="d0f545db-4fe8-57c6-904a-2d7bacf3f8cd")}catch(e){}}();
4
4
  var REGISTRY_TEXTS = {
5
5
  duplicateExtension: "Extension already registered: {{kind}}:{{qualifiedId}}",
6
6
  unknownKind: "Unknown extension kind: {{kind}}",
@@ -102,7 +102,7 @@ import { Tiktoken as Tiktoken2 } from "js-tiktoken/lite";
102
102
  // package.json
103
103
  var package_default = {
104
104
  name: "@skill-map/cli",
105
- version: "0.60.2",
105
+ version: "0.60.3",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -3845,4 +3845,4 @@ export {
3845
3845
  runScanWithRenames
3846
3846
  };
3847
3847
  //# sourceMappingURL=index.js.map
3848
- //# debugId=1dbff951-d266-51b9-8565-560ca6aafaa6
3848
+ //# debugId=d0f545db-4fe8-57c6-904a-2d7bacf3f8cd
@@ -1,6 +1,6 @@
1
1
  // kernel/i18n/registry.texts.ts
2
2
 
3
- !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]="1eb6aac0-4a18-59f2-9ce2-867e620db4d4")}catch(e){}}();
3
+ !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]="80354fd4-8ba5-5d44-bddb-926401a499be")}catch(e){}}();
4
4
  var REGISTRY_TEXTS = {
5
5
  duplicateExtension: "Extension already registered: {{kind}}:{{qualifiedId}}",
6
6
  unknownKind: "Unknown extension kind: {{kind}}",
@@ -102,7 +102,7 @@ import { Tiktoken as Tiktoken2 } from "js-tiktoken/lite";
102
102
  // package.json
103
103
  var package_default = {
104
104
  name: "@skill-map/cli",
105
- version: "0.60.2",
105
+ version: "0.60.3",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -3845,4 +3845,4 @@ export {
3845
3845
  runScanWithRenames
3846
3846
  };
3847
3847
  //# sourceMappingURL=index.js.map
3848
- //# debugId=1eb6aac0-4a18-59f2-9ce2-867e620db4d4
3848
+ //# debugId=80354fd4-8ba5-5d44-bddb-926401a499be