@skill-map/cli 0.61.2 → 0.61.4

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.
@@ -304,12 +304,11 @@ the `__PROVIDER__` token and skip kinds the provider does not claim.
304
304
  2. Seed: `fixtures.js seed <harness-built|harness-connected> --provider <provider> --lang <lang>`
305
305
  (`harness-built` for `connect-harness`, `harness-connected` for
306
306
  `daily-loop`).
307
- 3. Provision with the **non-interactive lens recipe**: the seeded
308
- portfolio has BOTH a root `AGENTS.md` (an `openai` marker) and
309
- `.claude/` (a `claude` marker), so a plain `sm init` would stop on
310
- `⚠ Multiple provider markers detected`. Run `sm init --no-scan`,
311
- then `sm config set activeProvider claude`, then `sm scan`. (If
312
- `.skill-map/` already exists, just `sm scan`.)
307
+ 3. Provision the lens: the seeded portfolio has a root `AGENTS.md`
308
+ (the `openai`/Codex marker) next to `.claude/`, but `openai` is
309
+ coming soon, so auto-detect ignores it and a plain `sm init`
310
+ resolves the `claude` lens with no prompt. Run `sm init`, then
311
+ `sm scan`. (If `.skill-map/` already exists, just `sm scan`.)
313
312
  4. Mark the skipped predecessors: `state.js set-part <predecessor> skipped`
314
313
  for each (they stay in the menu). Then emit exactly ONE
315
314
  tester-facing line:
@@ -28,18 +28,14 @@ disk. The orchestrator's `portfolio-init` already cleared it during
28
28
  pre-flight, so the tester sees only the portfolio. If anything demo
29
29
  lingers, mention it once and move on.
30
30
 
31
- **Context (agent, do not narrate the plumbing): the lens prompt.**
32
- Unlike the prologue (a pure `.claude/` project that auto-detected
33
- `claude` silently), this project has a root `AGENTS.md` (a filesystem
34
- marker for the `openai` lens) sitting next to the `.claude/` folder
35
- (the `claude` marker, where the tutorial skill itself lives). With two
36
- markers present, `sm init`'s first scan can NOT auto-pick a lens and
37
- asks the tester to choose (`⚠ Multiple provider markers detected`).
38
- The portfolio is a Claude project, so the answer is always `claude`,
39
- the other options the prompt lists (`openai`/Codex and friends) are
40
- coming soon in the tutorial and we do not walk them. The prompt is
41
- expected, blessed behaviour; the tester just needs to know which
42
- option to pick, so the message below previews it.
31
+ **Context (agent, do not narrate the plumbing): the lens.** This
32
+ project has a root `AGENTS.md` (the `openai`/Codex marker) sitting next
33
+ to the `.claude/` folder (the `claude` marker, where the tutorial skill
34
+ itself lives). `openai` is **coming soon**, though, so auto-detect
35
+ ignores its marker and `sm init` resolves the lens to `claude`
36
+ silently, exactly like the prologue: only `claude` is selectable today,
37
+ so there is no ambiguity and no prompt. Do not promise the tester a
38
+ lens prompt here.
43
39
 
44
40
  ```bash
45
41
  sm init
@@ -53,9 +49,9 @@ Tell the tester:
53
49
  > `.claude/` folder is the **harness** (the helpers that maintain the
54
50
  > site). skill-map maps that harness.
55
51
  >
56
- > Run `sm init`. If it asks you to pick a lens (`⚠ Multiple provider
57
- > markers detected`), choose `claude`, this is a Claude project (the
58
- > other lenses are coming soon). Then run `sm` to boot the live UI.
52
+ > Run `sm init`, it auto-detects the `claude` lens (this is a Claude
53
+ > project; the other lenses are coming soon). Then run `sm` to boot the
54
+ > live UI.
59
55
  >
60
56
  > Open the URL `sm` printed. You'll see **one node**: `AGENTS.md`,
61
57
  > the project's handbook (the operating manual for the site).
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]="e231edcd-bd03-5552-a0d2-b977373884d8")}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]="d6e5d903-0942-5718-94b3-53a96de15b21")}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.2",
253
+ version: "0.61.4",
254
254
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
255
255
  license: "MIT",
256
256
  type: "module",
@@ -1071,7 +1071,10 @@ var antigravityProvider = {
1071
1071
  presentation: {
1072
1072
  label: "Antigravity",
1073
1073
  color: "#7c3aed",
1074
- colorDark: "#a78bfa"
1074
+ colorDark: "#a78bfa",
1075
+ // Registered but not yet selectable as the active lens; the UI greys
1076
+ // it with a `(coming soon)` suffix.
1077
+ comingSoon: true
1075
1078
  },
1076
1079
  // No `detect` block: Antigravity has no vendor-specific workspace marker
1077
1080
  // (it adopted the open-standard `.agents/`, owned by `agent-skills`), so
@@ -1233,7 +1236,10 @@ var openaiProvider = {
1233
1236
  presentation: {
1234
1237
  label: "OpenAI Codex",
1235
1238
  color: "#22c55e",
1236
- colorDark: "#4ade80"
1239
+ colorDark: "#4ade80",
1240
+ // Registered but not yet selectable as the active lens; auto-detect
1241
+ // skips its markers and the UI greys it with a `(coming soon)` suffix.
1242
+ comingSoon: true
1237
1243
  },
1238
1244
  // Auto-detect markers: a `.codex/` directory or a root `AGENTS.md` marks
1239
1245
  // a Codex CLI project. Provider-owned (replaces the old central
@@ -1322,7 +1328,11 @@ var agentSkillsProvider = {
1322
1328
  presentation: {
1323
1329
  label: "Open Skills",
1324
1330
  color: "#64748b",
1325
- colorDark: "#94a3b8"
1331
+ colorDark: "#94a3b8",
1332
+ // Registered but not yet selectable as the active lens; auto-detect
1333
+ // skips its `.agents/` marker and the UI greys it with a
1334
+ // `(coming soon)` suffix.
1335
+ comingSoon: true
1326
1336
  },
1327
1337
  // Auto-detect marker: a `.agents/` directory marks an open-standard
1328
1338
  // project. This is also the marker a Google/Antigravity project carries
@@ -11559,14 +11569,18 @@ function detectProvidersFromFilesystem(cwd, providers) {
11559
11569
  const out = [];
11560
11570
  for (const provider of providers) {
11561
11571
  if (seen.has(provider.id)) continue;
11562
- const markers = provider.detect?.markers;
11563
- if (!markers || markers.length === 0) continue;
11564
- if (!markers.some((marker) => existsSync15(join10(cwd, marker)))) continue;
11572
+ if (!isDetectableUnderCwd(cwd, provider)) continue;
11565
11573
  seen.add(provider.id);
11566
11574
  out.push(provider.id);
11567
11575
  }
11568
11576
  return out;
11569
11577
  }
11578
+ function isDetectableUnderCwd(cwd, provider) {
11579
+ if (provider.presentation?.comingSoon === true) return false;
11580
+ const markers = provider.detect?.markers;
11581
+ if (!markers || markers.length === 0) return false;
11582
+ return markers.some((marker) => existsSync15(join10(cwd, marker)));
11583
+ }
11570
11584
 
11571
11585
  // core/config/active-provider.ts
11572
11586
  function resolveActiveProvider(cwd, providers = []) {
@@ -27232,6 +27246,7 @@ async function resolveSelectableProviders(deps) {
27232
27246
  });
27233
27247
  const selectable = /* @__PURE__ */ new Set();
27234
27248
  for (const provider of deps.providers) {
27249
+ if (provider.presentation?.comingSoon === true) continue;
27235
27250
  if (isPluginExtensionEnabled(provider, resolveEnabled)) {
27236
27251
  selectable.add(provider.id);
27237
27252
  }
@@ -28442,6 +28457,7 @@ function buildProviderRegistry(providers) {
28442
28457
  if (ui.emoji !== void 0) entry.emoji = ui.emoji;
28443
28458
  if (ui.icon !== void 0) entry.icon = ui.icon;
28444
28459
  if (ui.hideChip !== void 0) entry.hideChip = ui.hideChip;
28460
+ if (ui.comingSoon !== void 0) entry.comingSoon = ui.comingSoon;
28445
28461
  registry[provider.id] = entry;
28446
28462
  }
28447
28463
  return registry;
@@ -30545,8 +30561,14 @@ var TUTORIAL_TEXTS = {
30545
30561
  // default).
30546
30562
  promptHeader: "{{glyph}} Which agent should host the tutorial skill?",
30547
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)",
30548
30567
  promptDefaultMarker: " (default)",
30549
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}}.",
30550
30572
  // Prompt answer matched neither an index nor an id. Goes to stderr,
30551
30573
  // exit code 2. Mirrors the error shape: glyph + headline + dim hint.
30552
30574
  promptInvalid: "{{glyph}} sm tutorial: that is not one of the listed providers\n {{hint}}\n",
@@ -30613,7 +30635,7 @@ var TutorialCommand = class extends SmCommand {
30613
30635
  // the skill is materialised under, skipping the interactive prompt.
30614
30636
  forProvider = Option36.String("--for", {
30615
30637
  required: false,
30616
- description: "Destination provider id (e.g. claude, agent-skills). Skips the prompt."
30638
+ description: "Destination provider id (e.g. claude). Skips the prompt."
30617
30639
  });
30618
30640
  force = Option36.Boolean("--force", false, {
30619
30641
  description: "Overwrite an existing target directory without prompting."
@@ -30646,6 +30668,10 @@ var TutorialCommand = class extends SmCommand {
30646
30668
  const targets = listScaffoldTargets();
30647
30669
  const target = await this.resolveScaffoldTarget(targets, stderrAnsi, errGlyph);
30648
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
+ }
30649
30675
  const targetDir = join21(ctx.cwd, target.skillDir, SKILL_SLUG);
30650
30676
  const targetDisplay = `${target.skillDir}/${SKILL_SLUG}/`;
30651
30677
  let sourceDir;
@@ -30709,20 +30735,21 @@ var TutorialCommand = class extends SmCommand {
30709
30735
  * Returns `null` after printing an error (caller exits non-zero).
30710
30736
  */
30711
30737
  async resolveScaffoldTarget(targets, stderrAnsi, errGlyph) {
30712
- if (targets.length === 0) {
30738
+ const selectable = selectableTargets(targets);
30739
+ if (selectable.length === 0) {
30713
30740
  this.printer.error(tx(TUTORIAL_TEXTS.noTargets, { glyph: errGlyph }));
30714
30741
  return null;
30715
30742
  }
30716
30743
  const requested = this.forProvider;
30717
30744
  if (requested !== void 0) {
30718
- const found = targets.find((t) => t.id === requested);
30745
+ const found = selectable.find((t) => t.id === requested);
30719
30746
  if (found === void 0) {
30720
30747
  this.printer.error(
30721
30748
  tx(TUTORIAL_TEXTS.forUnknown, {
30722
30749
  glyph: errGlyph,
30723
30750
  provider: requested,
30724
30751
  hint: stderrAnsi.dim(
30725
- tx(TUTORIAL_TEXTS.forUnknownHint, { ids: targets.map((t) => t.id).join(", ") })
30752
+ tx(TUTORIAL_TEXTS.forUnknownHint, { ids: selectable.map((t) => t.id).join(", ") })
30726
30753
  )
30727
30754
  })
30728
30755
  );
@@ -30730,14 +30757,13 @@ var TutorialCommand = class extends SmCommand {
30730
30757
  }
30731
30758
  return found;
30732
30759
  }
30733
- const defaultIndex = 0;
30734
- const def = targets[defaultIndex];
30760
+ const def = selectable[0];
30735
30761
  const stdin = this.context.stdin;
30736
- if (targets.length === 1 || stdin.isTTY !== true) return def;
30762
+ if (stdin.isTTY !== true) return def;
30737
30763
  const stderr = this.context.stderr;
30738
30764
  const picked = await promptForTarget(
30739
30765
  targets,
30740
- defaultIndex,
30766
+ def,
30741
30767
  stdin,
30742
30768
  stderr,
30743
30769
  stderrAnsi.yellow("?")
@@ -30747,7 +30773,7 @@ var TutorialCommand = class extends SmCommand {
30747
30773
  tx(TUTORIAL_TEXTS.promptInvalid, {
30748
30774
  glyph: errGlyph,
30749
30775
  hint: stderrAnsi.dim(
30750
- tx(TUTORIAL_TEXTS.forUnknownHint, { ids: targets.map((t) => t.id).join(", ") })
30776
+ tx(TUTORIAL_TEXTS.forUnknownHint, { ids: selectable.map((t) => t.id).join(", ") })
30751
30777
  )
30752
30778
  })
30753
30779
  );
@@ -30757,13 +30783,23 @@ var TutorialCommand = class extends SmCommand {
30757
30783
  }
30758
30784
  };
30759
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
+ }
30760
30795
  const scaffold = provider.scaffold;
30761
30796
  if (!scaffold || !scaffold.skillDir) return null;
30762
30797
  return {
30763
30798
  id: provider.id,
30764
30799
  label: provider.presentation.label,
30765
30800
  skillDir: scaffold.skillDir,
30766
- aka: scaffold.aka ?? []
30801
+ aka: scaffold.aka ?? [],
30802
+ comingSoon: false
30767
30803
  };
30768
30804
  }
30769
30805
  function listScaffoldTargets() {
@@ -30774,36 +30810,53 @@ function listScaffoldTargets() {
30774
30810
  }
30775
30811
  return out;
30776
30812
  }
30813
+ function selectableTargets(targets) {
30814
+ return targets.filter((t) => !t.comingSoon);
30815
+ }
30777
30816
  function labelWithAka(target) {
30778
30817
  return target.aka.length > 0 ? `${target.label} (${target.aka.join(", ")})` : target.label;
30779
30818
  }
30780
- async function promptForTarget(targets, defaultIndex, stdin, stderr, glyph) {
30819
+ function renderTargetLines(targets, def, glyph) {
30781
30820
  const lines = [tx(TUTORIAL_TEXTS.promptHeader, { glyph })];
30782
30821
  for (let i = 0; i < targets.length; i += 1) {
30783
30822
  const t = targets[i];
30784
30823
  lines.push(
30785
- tx(TUTORIAL_TEXTS.promptOption, {
30824
+ t.comingSoon ? tx(TUTORIAL_TEXTS.promptOptionComingSoon, { index: i + 1, label: t.label }) : tx(TUTORIAL_TEXTS.promptOption, {
30786
30825
  index: i + 1,
30787
30826
  label: labelWithAka(t),
30788
30827
  skillDir: `${t.skillDir}/`,
30789
- marker: i === defaultIndex ? TUTORIAL_TEXTS.promptDefaultMarker : ""
30828
+ marker: t.id === def.id ? TUTORIAL_TEXTS.promptDefaultMarker : ""
30790
30829
  })
30791
30830
  );
30792
30831
  }
30793
- 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);
30794
30843
  const rl = createInterface5({ input: stdin, output: stderr });
30795
30844
  try {
30796
- const answer = await new Promise(
30797
- (resolveP) => rl.question(tx(TUTORIAL_TEXTS.promptInput, { index: defaultIndex + 1 }), resolveP)
30798
- );
30799
- const trimmed = answer.trim();
30800
- if (trimmed === "") return targets[defaultIndex];
30801
- const asNumber = Number.parseInt(trimmed, 10);
30802
- if (!Number.isNaN(asNumber) && asNumber >= 1 && asNumber <= targets.length) {
30803
- 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
+ );
30804
30858
  }
30805
- const byId = targets.find((t) => t.id.toLowerCase() === trimmed.toLowerCase());
30806
- return byId ?? null;
30859
+ return null;
30807
30860
  } finally {
30808
30861
  rl.close();
30809
30862
  }
@@ -31057,4 +31110,4 @@ function resolveBareDefault() {
31057
31110
  process.exit(ExitCode.Error);
31058
31111
  }
31059
31112
  //# sourceMappingURL=cli.js.map
31060
- //# debugId=e231edcd-bd03-5552-a0d2-b977373884d8
31113
+ //# debugId=d6e5d903-0942-5718-94b3-53a96de15b21
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]="2ededba2-1ecd-5a1b-a725-23567a98a0b7")}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]="ff44c503-9fc8-5d12-a12c-7d02344be603")}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.2",
105
+ version: "0.61.4",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -792,14 +792,18 @@ function detectProvidersFromFilesystem(cwd, providers) {
792
792
  const out = [];
793
793
  for (const provider of providers) {
794
794
  if (seen.has(provider.id)) continue;
795
- const markers = provider.detect?.markers;
796
- if (!markers || markers.length === 0) continue;
797
- if (!markers.some((marker) => existsSync3(join3(cwd, marker)))) continue;
795
+ if (!isDetectableUnderCwd(cwd, provider)) continue;
798
796
  seen.add(provider.id);
799
797
  out.push(provider.id);
800
798
  }
801
799
  return out;
802
800
  }
801
+ function isDetectableUnderCwd(cwd, provider) {
802
+ if (provider.presentation?.comingSoon === true) return false;
803
+ const markers = provider.detect?.markers;
804
+ if (!markers || markers.length === 0) return false;
805
+ return markers.some((marker) => existsSync3(join3(cwd, marker)));
806
+ }
803
807
 
804
808
  // kernel/types.ts
805
809
  var ConfidenceTier = Object.freeze({
@@ -3847,4 +3851,4 @@ export {
3847
3851
  runScanWithRenames
3848
3852
  };
3849
3853
  //# sourceMappingURL=index.js.map
3850
- //# debugId=2ededba2-1ecd-5a1b-a725-23567a98a0b7
3854
+ //# debugId=ff44c503-9fc8-5d12-a12c-7d02344be603
@@ -2471,6 +2471,17 @@ interface IProviderUi {
2471
2471
  * topbar lens chip; only the per-card badge is suppressed.
2472
2472
  */
2473
2473
  hideChip?: boolean;
2474
+ /**
2475
+ * When `true`, this Provider is registered but NOT yet selectable as
2476
+ * the active lens. Auto-detect skips it (`detectProvidersFromFilesystem`),
2477
+ * the BFF drops it from the `selectable` set, and the UI greys it with
2478
+ * a `(coming soon)` suffix. It still ships in `providerRegistry` so
2479
+ * node chips render. Mirrors
2480
+ * `spec/schemas/extensions/provider.schema.json#/properties/presentation/properties/comingSoon`.
2481
+ * Distinct from `hideChip` and from the operator toggle
2482
+ * `plugins[<id>].enabled = false`. Defaults to `false` (selectable).
2483
+ */
2484
+ comingSoon?: boolean;
2474
2485
  }
2475
2486
  /**
2476
2487
  * Auto-detection markers for the active-provider lens. The lens resolver
@@ -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]="8f7ca4a9-1a8e-5b21-a436-9a4500fd710f")}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]="6c0e0b1c-ef76-52e7-a1d9-09240ef98ada")}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.2",
105
+ version: "0.61.4",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -792,14 +792,18 @@ function detectProvidersFromFilesystem(cwd, providers) {
792
792
  const out = [];
793
793
  for (const provider of providers) {
794
794
  if (seen.has(provider.id)) continue;
795
- const markers = provider.detect?.markers;
796
- if (!markers || markers.length === 0) continue;
797
- if (!markers.some((marker) => existsSync3(join3(cwd, marker)))) continue;
795
+ if (!isDetectableUnderCwd(cwd, provider)) continue;
798
796
  seen.add(provider.id);
799
797
  out.push(provider.id);
800
798
  }
801
799
  return out;
802
800
  }
801
+ function isDetectableUnderCwd(cwd, provider) {
802
+ if (provider.presentation?.comingSoon === true) return false;
803
+ const markers = provider.detect?.markers;
804
+ if (!markers || markers.length === 0) return false;
805
+ return markers.some((marker) => existsSync3(join3(cwd, marker)));
806
+ }
803
807
 
804
808
  // kernel/types.ts
805
809
  var ConfidenceTier = Object.freeze({
@@ -3847,4 +3851,4 @@ export {
3847
3851
  runScanWithRenames
3848
3852
  };
3849
3853
  //# sourceMappingURL=index.js.map
3850
- //# debugId=8f7ca4a9-1a8e-5b21-a436-9a4500fd710f
3854
+ //# debugId=6c0e0b1c-ef76-52e7-a1d9-09240ef98ada