@skill-map/cli 0.61.1 → 0.61.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.
@@ -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:
@@ -131,14 +131,16 @@ element. Decide with §Provider detection:
131
131
 
132
132
  - `provider == claude` (Claude Code, blockquotes render as a styled
133
133
  left bar): emit tester-facing messages with `> ` on every line,
134
- including blank lines inside a multi-paragraph block.
135
- - `provider != claude` (Antigravity CLI, agent-skills, any other
136
- host: most non-Claude renderers show `>` as a literal character):
137
- emit **plain prose**, NO `> ` prefix anywhere.
134
+ including blank lines inside a multi-paragraph block. This is the
135
+ only active path today.
136
+ - `provider != claude` (coming soon: Antigravity CLI, agent-skills,
137
+ any other host where most non-Claude renderers show `>` as a
138
+ literal character): emit **plain prose**, NO `> ` prefix anywhere.
139
+ Kept as the wiring for the coming-soon providers; not exercised
140
+ while the tutorial demos `claude` only.
138
141
 
139
142
  Sample messages throughout the part files are written in the Claude
140
- variant (with `> `); strip the prefix when the host is non-Claude,
141
- the wording is unchanged.
143
+ variant (with `> `).
142
144
 
143
145
  **The rule, in one line**: every tester-facing line of prose carries
144
146
  the `> ` bar in the Claude variant, context sentences, intros, tips,
@@ -257,41 +259,41 @@ on-disk convention:
257
259
  | Provider | Base dir | Kinds it claims | Detect via env var(s) |
258
260
  |----------------|-------------------|-----------------------------|--------------------------------------------------------|
259
261
  | `claude` | `.claude/` | `agent`, `command`, `skill` | `CLAUDECODE=1` OR `AI_AGENT` starts with `claude-code` |
260
- | `agent-skills` | `.agents/skills/` | `skill` only (vendor-neutral; also the on-disk home for Google's Antigravity CLI, which replaced the Gemini CLI on 2026-05-19 and adopted this open standard) | no formal env yet; opt-in if the tester says so |
261
- | `openai` | `.codex/` | `agent` (`.codex/agents/*.toml`) | no formal env yet; informational today |
262
-
263
- **Decision logic, applied silently during pre-flight**:
264
-
265
- 1. Inspect the agent's environment (`process.env`).
266
- 2. Claude-flavoured var present `provider = claude`,
267
- `<provider_dir> = .claude`, kinds = `{agent, command, skill}`.
268
- 3. Else if the tester says Antigravity / agent-skills (opt-in) →
269
- `provider = agent-skills`, `<provider_dir> = .agents`, kinds =
270
- `{skill}`.
271
- 4. Else **fallback to claude** AND surface one short message so
272
- they can correct course (render `> ` if it turns out to be
273
- Claude, plain prose if they correct you):
274
-
275
- > Heads up: I couldn't detect which agent runtime is hosting me,
276
- > so I'll demo skill-map's Claude provider (`.claude/`). If you
277
- > actually use Antigravity or agent-skills, tell me and I swap
278
- > the fixture to `.agents/skills/`.
262
+ | `agent-skills` | `.agents/skills/` | `skill` only (vendor-neutral; also the on-disk home for Google's Antigravity CLI, which replaced the Gemini CLI on 2026-05-19 and adopted this open standard) | coming soon (not selectable in the tutorial yet) |
263
+ | `openai` | `.codex/` | `agent` (`.codex/agents/*.toml`) | coming soon (not selectable in the tutorial yet) |
264
+
265
+ **Decision logic, applied silently during pre-flight**: the tutorial
266
+ demonstrates the `claude` provider only. `agent-skills` and `openai`
267
+ are **coming soon** and are not selectable here, so there is no
268
+ runtime to detect or opt into.
269
+
270
+ 1. `provider = claude`, `<provider_dir> = .claude`, kinds =
271
+ `{agent, command, skill}`. Always.
272
+ 2. Do NOT offer Antigravity / agent-skills / openai as an alternative,
273
+ and do NOT ask the tester which runtime hosts them. If a tester
274
+ says they use another runtime, acknowledge it briefly and explain
275
+ that those providers are coming soon, the tutorial demos `claude`
276
+ (`.claude/`) today:
277
+
278
+ > Heads up: skill-map also reads Antigravity, agent-skills and
279
+ > Codex projects, but those providers are coming soon in this
280
+ > tutorial. We'll demo skill-map's Claude provider (`.claude/`)
281
+ > today.
279
282
 
280
283
  Persist `provider` into the state file (`tutorial.provider`) so a
281
- resumed session does not re-detect.
284
+ resumed session does not re-detect. (It is always `claude` for now.)
282
285
 
283
286
  **Global substitution rule**: the fixture scripts do the file-level
284
287
  work. You pass `--provider <p>` (the value persisted in
285
288
  `tutorial.provider`) and `--lang <l>`, and they resolve the
286
289
  `__PROVIDER__` path token, skip files whose kind the provider does
287
290
  not claim, and report the adjusted `nodeCount` plus the `skipped`
288
- list in their summary. Your job is the **narration**: wherever a part
289
- file's tester-facing prose says `.claude/`, swap it for the detected
290
- `<provider_dir>`, and narrate the node count from the script summary
291
- (on `agent-skills` / Antigravity only the skill + markdown notes
292
- exist, so the count is lower and the agent / command beats fold
293
- away). The campaign cross-link chapters target `claude` today (see
294
- the reality check below).
291
+ list in their summary. Today `provider` is always `claude`, so the
292
+ narration uses `.claude/` throughout; the `--provider` plumbing stays
293
+ wired so the coming-soon providers (`agent-skills` / Antigravity,
294
+ `openai`) drop in later without a narrative rewrite. The campaign
295
+ cross-link chapters target `claude` today (see the reality check
296
+ below).
295
297
 
296
298
  **Reality check (don't mention to the tester)**: this skill ships
297
299
  at `.claude/skills/sm-tutorial/`, so Claude Code is the only host
@@ -28,16 +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 `claude`. The
39
- prompt is expected, blessed behaviour; the tester just needs to know
40
- which 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.
41
39
 
42
40
  ```bash
43
41
  sm init
@@ -51,9 +49,9 @@ Tell the tester:
51
49
  > `.claude/` folder is the **harness** (the helpers that maintain the
52
50
  > site). skill-map maps that harness.
53
51
  >
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.
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.
57
55
  >
58
56
  > Open the URL `sm` printed. You'll see **one node**: `AGENTS.md`,
59
57
  > the project's handbook (the operating manual for the site).
@@ -122,24 +122,20 @@ catalog is closed.)
122
122
 
123
123
  Mark `settings-2-resolve: done`.
124
124
 
125
- ## Step `settings-3-lens` - the active provider lens (~4 min)
125
+ ## Step `settings-3-lens` - the active provider lens (~2 min)
126
126
 
127
127
  **Context**: the single most consequential setting, the lens that
128
- decides which provider types the project's files. It is reversible
129
- and never touches your `.md` files, only the scan cache.
128
+ decides which provider types the project's files. It auto-detects and
129
+ never touches your `.md` files, only the scan cache.
130
130
 
131
131
  > One setting earns its own step: the **active provider lens**. A
132
132
  > skill-map project sees its filesystem through exactly **one**
133
133
  > provider at a time, and that lens decides how each file is read.
134
134
  > Under the `claude` lens a `.claude/agents/*.md` is an agent and
135
- > `@`-mentions / `/`-commands become links; point the lens at
136
- > `openai` and the same tree is read against Codex's layout instead.
137
- > Same files, different reading.
135
+ > `@`-mentions / `/`-commands become links. Same files, one reading.
138
136
 
139
137
  > The lens auto-detects on the first scan from the markers in your
140
- > project (`.claude/` → claude, `.codex/` or a root `AGENTS.md`
141
- > openai, `.agents/` → agent-skills). Scan once and check where it
142
- > landed:
138
+ > project (`.claude/` → claude). Scan once and check where it landed:
143
139
 
144
140
  ```bash
145
141
  sm scan
@@ -151,39 +147,13 @@ Expected: the scan prints a line like `Auto-detected activeProvider
151
147
  .skill-map/settings.json`, and `get` then reports `claude`. The lens
152
148
  is just a key in `settings.json`, persisted like any other setting.
153
149
 
154
- > Now switch it by hand and watch what happens. We'll point it at
155
- > `openai`:
156
-
157
- ```bash
158
- sm config set activeProvider openai
159
- ```
160
-
161
- Expected: alongside the usual `✓ activeProvider = openai (wrote
162
- .skill-map/settings.json)`, the CLI warns `Lens switched. Cleared 7
163
- scan table(s) ... Run sm scan to repopulate the graph under the new
164
- lens`. The important part: it cleared the **scan cache only**, your
165
- `.md` files are untouched. The graph is derived data; the source is
166
- always your filesystem.
167
-
168
- > Re-scan under the new lens, then put it back the way you found it:
169
-
170
- ```bash
171
- sm scan
172
- sm config reset activeProvider
173
- sm scan
174
- ```
175
-
176
- Expected: the first scan repopulates under `openai`; `reset` removes
177
- the key (`Removed activeProvider from .skill-map/settings.json`); the
178
- last scan auto-detects `claude` again from your `.claude/` marker.
179
- Back where you started, nothing lost.
180
-
181
- > That's the whole idea of the lens: one project, one active
182
- > provider at a time, chosen by `activeProvider` and backed by the
183
- > built-in provider plugins (`claude`, `openai`, `agent-skills`,
184
- > `antigravity`). Switching it is cheap and reversible because the
185
- > graph is always rebuilt from your files, never the other way
186
- > around.
150
+ > Other lenses exist in the engine (`openai` for Codex,
151
+ > `agent-skills`, `antigravity`), but they are **coming soon** in the
152
+ > tutorial: today we demo the `claude` lens only. The idea to keep is
153
+ > the one above, one project reads through exactly one provider at a
154
+ > time, chosen by `activeProvider`. The lens is cheap to change later
155
+ > because the graph is always rebuilt from your files, never the
156
+ > other way around.
187
157
 
188
158
  Mark `settings-3-lens: done`.
189
159
 
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]="9a536139-6f70-53a7-b32a-eed4fc49b7a4")}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]="ce13dce1-d18b-5abf-b6a8-1ef997ccaf99")}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.1",
253
+ version: "0.61.3",
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;
@@ -31057,4 +31073,4 @@ function resolveBareDefault() {
31057
31073
  process.exit(ExitCode.Error);
31058
31074
  }
31059
31075
  //# sourceMappingURL=cli.js.map
31060
- //# debugId=9a536139-6f70-53a7-b32a-eed4fc49b7a4
31076
+ //# debugId=ce13dce1-d18b-5abf-b6a8-1ef997ccaf99
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]="3bc6390b-70e8-568a-835e-870172658869")}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]="f3e27769-f4cb-5526-a022-5ef018a37ef8")}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.1",
105
+ version: "0.61.3",
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=3bc6390b-70e8-568a-835e-870172658869
3854
+ //# debugId=f3e27769-f4cb-5526-a022-5ef018a37ef8
@@ -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]="1b30d8c8-edea-5922-be87-39c4ebe079c0")}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]="efabc578-2328-5428-97bc-6c89a870170a")}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.1",
105
+ version: "0.61.3",
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=1b30d8c8-edea-5922-be87-39c4ebe079c0
3854
+ //# debugId=efabc578-2328-5428-97bc-6c89a870170a