@skill-map/cli 0.61.3 → 0.61.5

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.
@@ -18,4 +18,4 @@ Turns a short brief into a finished portfolio page.
18
18
  4. Use one `<h1>`, group sections under `<h2>`, and reuse the shared header, nav, and footer so every page matches.
19
19
  5. Add a link back to Home, and link the new page from the home nav.
20
20
 
21
- Rules: plain static HTML, no framework, no client JS, one page per file.
21
+ Rules: plain static HTML, no framework, no client JS, one page per file. If a page needs an image, use a free placeholder from https://placekittens.com/ (e.g. `https://placekittens.com/400/300`) so the `<img>` never points at a missing file.
@@ -18,4 +18,4 @@ Convierte un brief corto en una página de portfolio terminada.
18
18
  4. Usa un solo `<h1>`, agrupa las secciones bajo `<h2>` y reutiliza el header, la nav y el footer compartidos para que todas las páginas coincidan.
19
19
  5. Agrega un enlace de vuelta a Home, y enlaza la nueva página desde la nav de inicio.
20
20
 
21
- Reglas: HTML estático plano, sin framework, sin JS de cliente, una página por archivo.
21
+ Reglas: HTML estático plano, sin framework, sin JS de cliente, una página por archivo. Si una página necesita una imagen, usa un placeholder gratuito de https://placekittens.com/ (por ejemplo `https://placekittens.com/400/300`) para que el `<img>` nunca apunte a un archivo inexistente.
@@ -128,13 +128,8 @@
128
128
  "chapters": [
129
129
  {
130
130
  "id": "setup",
131
- "title": "Make it yours, make it presentable",
132
- "est_min": 3
133
- },
134
- {
135
- "id": "preview",
136
- "title": "Bring it up and see your site",
137
- "est_min": 2
131
+ "title": "Make it yours and bring it up",
132
+ "est_min": 5
138
133
  },
139
134
  {
140
135
  "id": "add-page",
@@ -143,8 +143,7 @@ parts:
143
143
  fixture: portfolio # reuses the wired harness; lays the pretty site (style.css + pages) as taught steps
144
144
  status: active
145
145
  chapters:
146
- - id: setup ; title: "Make it yours, make it presentable" ; est_min: 3
147
- - id: preview ; title: "Bring it up and see your site" ; est_min: 2
146
+ - id: setup ; title: "Make it yours and bring it up" ; est_min: 5
148
147
  - id: add-page ; title: "Add a page with your agent" ; est_min: 4
149
148
  - id: broken-ref ; title: "A rename breaks a link" ; est_min: 4
150
149
  - id: reserved ; title: "A reserved name collides" ; est_min: 2
@@ -162,6 +162,12 @@ Tell the tester:
162
162
  > daily-loop part. The opacity on the canvas is just that number drawn
163
163
  > as transparency.
164
164
  >
165
+ > **Note:** why does confidence matter? It mirrors how the runtime itself
166
+ > resolves a reference: a deterministic name-and-path lookup, no guessing
167
+ > and no scanning the tree for a file under some other extension. That is
168
+ > cheaper and it does not fail, so the agent spends fewer tokens and less
169
+ > time, the same reason a clean, well-named harness is worth keeping.
170
+ >
165
171
  > Do you see every badge reading 1.00 in the Inspector?
166
172
 
167
173
  Wait for confirmation. Mark `confidence`: done. Last chapter of the part: apply §Closing a part (the close names the part by its title and routes back to the menu; do NOT lead into the next part from here).
@@ -45,14 +45,16 @@ broken-reference markers, and confidence live.
45
45
 
46
46
  **Act A - Add**
47
47
 
48
- ## Chapter `setup` - Make it yours, make it presentable (~3 min)
48
+ ## Chapter `setup` - Make it yours and bring it up (~5 min)
49
49
 
50
50
  **Context**: the harness is wired (you built it in the earlier parts). Now you
51
51
  put it to work on a real day. First, make the site yours and give it a look you
52
- would not be embarrassed to share. The honest beat: the HTML and CSS are
53
- Layer 2 (the harness's output); skill-map maps the harness (Layer 1, the `.md`
54
- files), so the site landing on disk does NOT move the graph, and that is
55
- correct, not a bug.
52
+ would not be embarrassed to share, then serve it and open it in the browser, the
53
+ early payoff before the daily loop fills it with pages. The honest beat: the HTML
54
+ and CSS are Layer 2 (the harness's output); skill-map maps the harness (Layer 1,
55
+ the `.md` files), so the site landing on disk does NOT move the graph, and that
56
+ is correct, not a bug. The tester runs the serve commands themselves (one of the
57
+ few non-`sm` beats); guide them, do not run them.
56
58
 
57
59
  **Preparation**:
58
60
 
@@ -169,31 +171,25 @@ footer.site { border-top: 1px solid var(--border); padding: 2rem 0; color: var(-
169
171
  </html>
170
172
  ```
171
173
 
172
- Tell the tester the face is on (no serving yet, that is the next chapter):
173
-
174
- > I gave your site a face: a shared stylesheet plus a styled **Home** and
175
- > **About** page, named after you. These are Layer 2 (the harness's output), so
176
- > the **Map** did not move, and that is correct: skill-map maps the harness (the
177
- > `.md` files, Layer 1), not the HTML it produces. Next we bring it up so you
178
- > can see it.
179
-
180
- Mark `setup`: done. Auto-advance to `preview`.
181
-
182
- ## Chapter `preview` - Bring it up and see your site (~2 min)
183
-
184
- **Context**: the first look. The site is styled but the tester has only seen it
185
- as files; now serve it and open it in the browser, the early payoff before the
186
- daily loop fills it with pages. The tester runs the commands themselves (one of
187
- the few non-`sm` beats); guide them, do not run them.
174
+ The site is styled now, so bring it up in the same beat (the tester runs the
175
+ serve commands themselves). `sm` is still running in their second terminal, so
176
+ the server needs a **third terminal** anchored to the same project folder:
188
177
 
189
178
  ```bash
190
179
  npm install
191
180
  node server.js
192
181
  ```
193
182
 
194
- > Bring your site up. `npm install` pulls the one small library the server needs
195
- > (Express, on the Node you already have), and `node server.js` starts it and
196
- > prints a line like `Listening on http://localhost:3000`.
183
+ > **Note:** I gave your site a face: a shared stylesheet plus a styled **Home**
184
+ > and **About** page, named after you. These are Layer 2 (the harness's output),
185
+ > so the **Map** did not move, and that is correct: skill-map maps the harness
186
+ > (the `.md` files, Layer 1), not the HTML it produces.
187
+ >
188
+ > Now bring your site up. `sm` is still running in your second terminal, so open
189
+ > a **third terminal** in this same project folder and run the two commands
190
+ > there. `npm install` pulls the one small library the server needs (Express, on
191
+ > the Node you already have), and `node server.js` starts it and prints a line
192
+ > like `Listening on http://localhost:3000`.
197
193
  >
198
194
  > Open `http://localhost:3000`: there is your site, named after you, with a
199
195
  > clean layout. Click **About** and back to **Home**.
@@ -209,7 +205,7 @@ node server.js
209
205
  Wait for confirmation. If `node server.js` reports `Cannot find module
210
206
  'express'`, `npm install` did not run first, run it (it reads `package.json` and
211
207
  pulls Express), then retry; if `npm install` itself fails, check they are in the
212
- project root and Node is on PATH. Mark `preview`: done. Auto-advance to
208
+ project root and Node is on PATH. Mark `setup`: done. Auto-advance to
213
209
  `add-page`.
214
210
 
215
211
  ## Chapter `add-page` - Add a page with your agent (~4 min)
@@ -335,10 +331,11 @@ The watcher picks up the new command. Tell the tester:
335
331
  > `/help`, `/clear`, `/config`), so the runtime would silently ignore your file,
336
332
  > it never runs. The fix is a name the runtime does not own.
337
333
  >
338
- > Rename it to `new-page`: rename the file `.claude/commands/init.md` to
339
- > `.claude/commands/new-page.md`, AND change `frontmatter.name` to `new-page`
340
- > and the H1 to `# new-page` (a command's H1 stays a plain title, never
341
- > `# /new-page`). Save.
334
+ > Rename it to `new-page`: first rename the file `.claude/commands/init.md` to
335
+ > `.claude/commands/new-page.md`. Then open it in your text editor / IDE and, at
336
+ > the top, where the frontmatter says `name: init`, change it to
337
+ > `name: new-page`; also change the H1 to `# new-page` (a command's H1 stays a
338
+ > plain title, never `# /new-page`). Save.
342
339
  >
343
340
  > Watch the **Map** again: the warning clears and the node is now `new-page`,
344
341
  > all live. Notice what cleared it: changing the **name** (`frontmatter.name`),
@@ -396,7 +393,9 @@ conditional on the real result):
396
393
  > And the Map did not move while the pipeline ran: the pages are Layer 2 output;
397
394
  > the harness on the canvas is Layer 1, and that is what skill-map maps.
398
395
  >
399
- > Did the publish run report the link check clean?
396
+ > As you saw in the lines just above, I did not report anything odd: the link
397
+ > check came back clean and `/publish` is wired correctly across your pages.
398
+ > Shall we continue?
400
399
 
401
400
  Wait for confirmation. Mark `publish`: done. Auto-advance to `stability`.
402
401
 
@@ -472,7 +471,14 @@ Wait for confirmation. The tester runs the commands; do not run them. If
472
471
  server with Ctrl+C and apply the ports edge case.
473
472
 
474
473
  This is the campaign finale. Congratulate them plainly: they went from an empty
475
- directory to a real, running portfolio plus a complete map of its harness. Mark
476
- `golive`: done. Last chapter of the part: apply §Closing a part (name the part
477
- by its title); since this closes the campaign spine, if every active part is now
478
- done route to the §Final wrap-up instead of the menu.
474
+ directory to a real, running portfolio plus a complete map of its harness. Then
475
+ invite them to keep going on their own:
476
+
477
+ > And this site is yours to keep playing with: add more pages, refine the style
478
+ > guide, wire a new command, then watch the map react. Creating and maintaining a
479
+ > small site like this, by hand, is the best practice there is for getting a feel
480
+ > for how to build a harness.
481
+
482
+ Mark `golive`: done. Last chapter of the part: apply §Closing a part (name the
483
+ part by its title); since this closes the campaign spine, if every active part is
484
+ now done route to the §Final wrap-up instead of the menu.
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]="ce13dce1-d18b-5abf-b6a8-1ef997ccaf99")}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]="971924c5-3da8-5670-8c42-6f13b41acfa0")}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.61.3",
253
+ version: "0.61.5",
254
254
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
255
255
  license: "MIT",
256
256
  type: "module",
@@ -30561,8 +30561,14 @@ var TUTORIAL_TEXTS = {
30561
30561
  // default).
30562
30562
  promptHeader: "{{glyph}} Which agent should host the tutorial skill?",
30563
30563
  promptOption: " {{index}}) {{label}}: {{skillDir}}{{marker}}",
30564
+ // Coming-soon Providers are listed for visibility but cannot be picked
30565
+ // (no skillDir, a `(coming soon)` tag instead of a target path).
30566
+ promptOptionComingSoon: " {{index}}) {{label}} (coming soon)",
30564
30567
  promptDefaultMarker: " (default)",
30565
30568
  promptInput: " Enter the number or provider id [default {{index}}]: ",
30569
+ // Shown (and the prompt re-asked) when the tester picks a coming-soon
30570
+ // entry: it is visible but not selectable yet.
30571
+ promptComingSoonNotice: " {{label}} is coming soon, not selectable yet. Pick {{defaultLabel}}.",
30566
30572
  // Prompt answer matched neither an index nor an id. Goes to stderr,
30567
30573
  // exit code 2. Mirrors the error shape: glyph + headline + dim hint.
30568
30574
  promptInvalid: "{{glyph}} sm tutorial: that is not one of the listed providers\n {{hint}}\n",
@@ -30629,7 +30635,7 @@ var TutorialCommand = class extends SmCommand {
30629
30635
  // the skill is materialised under, skipping the interactive prompt.
30630
30636
  forProvider = Option36.String("--for", {
30631
30637
  required: false,
30632
- description: "Destination provider id (e.g. claude, agent-skills). Skips the prompt."
30638
+ description: "Destination provider id (e.g. claude). Skips the prompt."
30633
30639
  });
30634
30640
  force = Option36.Boolean("--force", false, {
30635
30641
  description: "Overwrite an existing target directory without prompting."
@@ -30662,6 +30668,10 @@ var TutorialCommand = class extends SmCommand {
30662
30668
  const targets = listScaffoldTargets();
30663
30669
  const target = await this.resolveScaffoldTarget(targets, stderrAnsi, errGlyph);
30664
30670
  if (target === null) return ExitCode.Error;
30671
+ if (target.skillDir === void 0) {
30672
+ this.printer.error(tx(TUTORIAL_TEXTS.noTargets, { glyph: errGlyph }));
30673
+ return ExitCode.Error;
30674
+ }
30665
30675
  const targetDir = join21(ctx.cwd, target.skillDir, SKILL_SLUG);
30666
30676
  const targetDisplay = `${target.skillDir}/${SKILL_SLUG}/`;
30667
30677
  let sourceDir;
@@ -30725,20 +30735,21 @@ var TutorialCommand = class extends SmCommand {
30725
30735
  * Returns `null` after printing an error (caller exits non-zero).
30726
30736
  */
30727
30737
  async resolveScaffoldTarget(targets, stderrAnsi, errGlyph) {
30728
- if (targets.length === 0) {
30738
+ const selectable = selectableTargets(targets);
30739
+ if (selectable.length === 0) {
30729
30740
  this.printer.error(tx(TUTORIAL_TEXTS.noTargets, { glyph: errGlyph }));
30730
30741
  return null;
30731
30742
  }
30732
30743
  const requested = this.forProvider;
30733
30744
  if (requested !== void 0) {
30734
- const found = targets.find((t) => t.id === requested);
30745
+ const found = selectable.find((t) => t.id === requested);
30735
30746
  if (found === void 0) {
30736
30747
  this.printer.error(
30737
30748
  tx(TUTORIAL_TEXTS.forUnknown, {
30738
30749
  glyph: errGlyph,
30739
30750
  provider: requested,
30740
30751
  hint: stderrAnsi.dim(
30741
- tx(TUTORIAL_TEXTS.forUnknownHint, { ids: targets.map((t) => t.id).join(", ") })
30752
+ tx(TUTORIAL_TEXTS.forUnknownHint, { ids: selectable.map((t) => t.id).join(", ") })
30742
30753
  )
30743
30754
  })
30744
30755
  );
@@ -30746,14 +30757,13 @@ var TutorialCommand = class extends SmCommand {
30746
30757
  }
30747
30758
  return found;
30748
30759
  }
30749
- const defaultIndex = 0;
30750
- const def = targets[defaultIndex];
30760
+ const def = selectable[0];
30751
30761
  const stdin = this.context.stdin;
30752
- if (targets.length === 1 || stdin.isTTY !== true) return def;
30762
+ if (stdin.isTTY !== true) return def;
30753
30763
  const stderr = this.context.stderr;
30754
30764
  const picked = await promptForTarget(
30755
30765
  targets,
30756
- defaultIndex,
30766
+ def,
30757
30767
  stdin,
30758
30768
  stderr,
30759
30769
  stderrAnsi.yellow("?")
@@ -30763,7 +30773,7 @@ var TutorialCommand = class extends SmCommand {
30763
30773
  tx(TUTORIAL_TEXTS.promptInvalid, {
30764
30774
  glyph: errGlyph,
30765
30775
  hint: stderrAnsi.dim(
30766
- tx(TUTORIAL_TEXTS.forUnknownHint, { ids: targets.map((t) => t.id).join(", ") })
30776
+ tx(TUTORIAL_TEXTS.forUnknownHint, { ids: selectable.map((t) => t.id).join(", ") })
30767
30777
  )
30768
30778
  })
30769
30779
  );
@@ -30773,13 +30783,23 @@ var TutorialCommand = class extends SmCommand {
30773
30783
  }
30774
30784
  };
30775
30785
  function toScaffoldTarget(provider) {
30786
+ const comingSoon = provider.presentation.comingSoon === true;
30787
+ if (comingSoon) {
30788
+ return {
30789
+ id: provider.id,
30790
+ label: provider.presentation.label,
30791
+ aka: provider.scaffold?.aka ?? [],
30792
+ comingSoon: true
30793
+ };
30794
+ }
30776
30795
  const scaffold = provider.scaffold;
30777
30796
  if (!scaffold || !scaffold.skillDir) return null;
30778
30797
  return {
30779
30798
  id: provider.id,
30780
30799
  label: provider.presentation.label,
30781
30800
  skillDir: scaffold.skillDir,
30782
- aka: scaffold.aka ?? []
30801
+ aka: scaffold.aka ?? [],
30802
+ comingSoon: false
30783
30803
  };
30784
30804
  }
30785
30805
  function listScaffoldTargets() {
@@ -30790,36 +30810,53 @@ function listScaffoldTargets() {
30790
30810
  }
30791
30811
  return out;
30792
30812
  }
30813
+ function selectableTargets(targets) {
30814
+ return targets.filter((t) => !t.comingSoon);
30815
+ }
30793
30816
  function labelWithAka(target) {
30794
30817
  return target.aka.length > 0 ? `${target.label} (${target.aka.join(", ")})` : target.label;
30795
30818
  }
30796
- async function promptForTarget(targets, defaultIndex, stdin, stderr, glyph) {
30819
+ function renderTargetLines(targets, def, glyph) {
30797
30820
  const lines = [tx(TUTORIAL_TEXTS.promptHeader, { glyph })];
30798
30821
  for (let i = 0; i < targets.length; i += 1) {
30799
30822
  const t = targets[i];
30800
30823
  lines.push(
30801
- tx(TUTORIAL_TEXTS.promptOption, {
30824
+ t.comingSoon ? tx(TUTORIAL_TEXTS.promptOptionComingSoon, { index: i + 1, label: t.label }) : tx(TUTORIAL_TEXTS.promptOption, {
30802
30825
  index: i + 1,
30803
30826
  label: labelWithAka(t),
30804
30827
  skillDir: `${t.skillDir}/`,
30805
- marker: i === defaultIndex ? TUTORIAL_TEXTS.promptDefaultMarker : ""
30828
+ marker: t.id === def.id ? TUTORIAL_TEXTS.promptDefaultMarker : ""
30806
30829
  })
30807
30830
  );
30808
30831
  }
30809
- stderr.write(lines.join("\n") + "\n");
30832
+ return lines.join("\n");
30833
+ }
30834
+ function classifyAnswer(trimmed, targets, def) {
30835
+ if (trimmed === "") return def;
30836
+ const asNumber = Number.parseInt(trimmed, 10);
30837
+ const byIndex = !Number.isNaN(asNumber) && asNumber >= 1 && asNumber <= targets.length ? targets[asNumber - 1] : void 0;
30838
+ return byIndex ?? targets.find((t) => t.id.toLowerCase() === trimmed.toLowerCase()) ?? null;
30839
+ }
30840
+ async function promptForTarget(targets, def, stdin, stderr, glyph) {
30841
+ stderr.write(renderTargetLines(targets, def, glyph) + "\n");
30842
+ const defIndex = targets.findIndex((t) => t.id === def.id);
30810
30843
  const rl = createInterface5({ input: stdin, output: stderr });
30811
30844
  try {
30812
- const answer = await new Promise(
30813
- (resolveP) => rl.question(tx(TUTORIAL_TEXTS.promptInput, { index: defaultIndex + 1 }), resolveP)
30814
- );
30815
- const trimmed = answer.trim();
30816
- if (trimmed === "") return targets[defaultIndex];
30817
- const asNumber = Number.parseInt(trimmed, 10);
30818
- if (!Number.isNaN(asNumber) && asNumber >= 1 && asNumber <= targets.length) {
30819
- return targets[asNumber - 1];
30845
+ for (let attempt = 0; attempt < 5; attempt += 1) {
30846
+ const answer = await new Promise(
30847
+ (resolveP) => rl.question(tx(TUTORIAL_TEXTS.promptInput, { index: defIndex + 1 }), resolveP)
30848
+ );
30849
+ const result = classifyAnswer(answer.trim(), targets, def);
30850
+ if (result === null) continue;
30851
+ if (!result.comingSoon) return result;
30852
+ stderr.write(
30853
+ tx(TUTORIAL_TEXTS.promptComingSoonNotice, {
30854
+ label: result.label,
30855
+ defaultLabel: def.label
30856
+ }) + "\n"
30857
+ );
30820
30858
  }
30821
- const byId = targets.find((t) => t.id.toLowerCase() === trimmed.toLowerCase());
30822
- return byId ?? null;
30859
+ return null;
30823
30860
  } finally {
30824
30861
  rl.close();
30825
30862
  }
@@ -31073,4 +31110,4 @@ function resolveBareDefault() {
31073
31110
  process.exit(ExitCode.Error);
31074
31111
  }
31075
31112
  //# sourceMappingURL=cli.js.map
31076
- //# debugId=ce13dce1-d18b-5abf-b6a8-1ef997ccaf99
31113
+ //# debugId=971924c5-3da8-5670-8c42-6f13b41acfa0
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]="f3e27769-f4cb-5526-a022-5ef018a37ef8")}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]="b1dadbaf-2a39-57c7-80df-bbba973403c5")}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.61.3",
105
+ version: "0.61.5",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -3851,4 +3851,4 @@ export {
3851
3851
  runScanWithRenames
3852
3852
  };
3853
3853
  //# sourceMappingURL=index.js.map
3854
- //# debugId=f3e27769-f4cb-5526-a022-5ef018a37ef8
3854
+ //# debugId=b1dadbaf-2a39-57c7-80df-bbba973403c5
@@ -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]="efabc578-2328-5428-97bc-6c89a870170a")}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]="5077263a-bf07-58af-b37d-ea6ab8f9a27c")}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.61.3",
105
+ version: "0.61.5",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -3851,4 +3851,4 @@ export {
3851
3851
  runScanWithRenames
3852
3852
  };
3853
3853
  //# sourceMappingURL=index.js.map
3854
- //# debugId=efabc578-2328-5428-97bc-6c89a870170a
3854
+ //# debugId=5077263a-bf07-58af-b37d-ea6ab8f9a27c