@skill-map/cli 0.62.1 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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]="e988f87f-5c82-5b18-9deb-cc1acdb9b566")}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]="33aa5dcf-6bc0-53c8-8982-afd24237bdae")}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.62.1",
105
+ version: "0.63.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -787,6 +787,17 @@ var ORCHESTRATOR_TEXTS = {
787
787
  // kernel/scan/detect-providers.ts
788
788
  import { existsSync as existsSync3 } from "fs";
789
789
  import { join as join3 } from "path";
790
+
791
+ // kernel/config/plugin-resolver.ts
792
+ var SHIPS_DISABLED = /* @__PURE__ */ new Set([
793
+ "experimental",
794
+ "deprecated"
795
+ ]);
796
+ function installedDefaultEnabled(stability) {
797
+ return stability === void 0 || !SHIPS_DISABLED.has(stability);
798
+ }
799
+
800
+ // kernel/scan/detect-providers.ts
790
801
  function detectProvidersFromFilesystem(cwd, providers) {
791
802
  const seen = /* @__PURE__ */ new Set();
792
803
  const out = [];
@@ -799,7 +810,7 @@ function detectProvidersFromFilesystem(cwd, providers) {
799
810
  return out;
800
811
  }
801
812
  function isDetectableUnderCwd(cwd, provider) {
802
- if (provider.presentation?.comingSoon === true) return false;
813
+ if (!installedDefaultEnabled(provider.stability)) return false;
803
814
  const markers = provider.detect?.markers;
804
815
  if (!markers || markers.length === 0) return false;
805
816
  return markers.some((marker) => existsSync3(join3(cwd, marker)));
@@ -1548,8 +1559,7 @@ function matchesKindPrecondition(ex, kind) {
1548
1559
  function matchesProviderPrecondition(ex, activeProvider) {
1549
1560
  const providers = ex.precondition?.provider;
1550
1561
  if (!providers || providers.length === 0) return true;
1551
- if (activeProvider === null) return false;
1552
- return providers.includes(activeProvider);
1562
+ return activeProvider !== null && providers.includes(activeProvider);
1553
1563
  }
1554
1564
  function splitLegacy(applicableExtractors, applicableQualifiedIds, nodeHashCacheEligible) {
1555
1565
  const cachedQualifiedIds = /* @__PURE__ */ new Set();
@@ -3127,7 +3137,6 @@ function buildPriorMtimes(opts) {
3127
3137
  }
3128
3138
  function providerParticipates(provider, activeProvider) {
3129
3139
  if (!provider.gatedByActiveLens) return true;
3130
- if (activeProvider === null) return true;
3131
3140
  return provider.id === activeProvider;
3132
3141
  }
3133
3142
  function createWalkAccumulators() {
@@ -3549,8 +3558,7 @@ function buildPostWalkTransformCtx(providers, nodes, activeProvider) {
3549
3558
  const reservedNodePaths = buildReservedNodePaths(
3550
3559
  nodes,
3551
3560
  kindRegistry,
3552
- reservedNamesByProviderKind,
3553
- activeProvider
3561
+ reservedNamesByProviderKind
3554
3562
  );
3555
3563
  return { kindRegistry, providerResolution, activeProvider, reservedNodePaths };
3556
3564
  }
@@ -3581,15 +3589,14 @@ function indexReservedNames(provider, out) {
3581
3589
  }
3582
3590
  }
3583
3591
  }
3584
- function buildReservedNodePaths(nodes, kindRegistry, reservedNamesByProviderKind, activeProvider) {
3592
+ function buildReservedNodePaths(nodes, kindRegistry, reservedNamesByProviderKind) {
3585
3593
  const out = /* @__PURE__ */ new Set();
3586
3594
  for (const node of nodes) {
3587
3595
  const selfKey = `${node.provider}/${node.kind}`;
3588
3596
  const selfReserved = reservedNamesByProviderKind.get(selfKey);
3589
- const lensReserved = activeProvider && activeProvider !== node.provider ? reservedNamesByProviderKind.get(`${activeProvider}/${node.kind}`) : void 0;
3590
- if (!hasEntries(selfReserved) && !hasEntries(lensReserved)) continue;
3597
+ if (!hasEntries(selfReserved)) continue;
3591
3598
  const ids = deriveNodeIdentifiers(node, kindRegistry.get(selfKey));
3592
- if (ids.some((id) => selfReserved?.has(id) === true || lensReserved?.has(id) === true)) {
3599
+ if (ids.some((id) => selfReserved?.has(id) === true)) {
3593
3600
  out.add(node.path);
3594
3601
  }
3595
3602
  }
@@ -4123,4 +4130,4 @@ export {
4123
4130
  runScanWithRenames
4124
4131
  };
4125
4132
  //# sourceMappingURL=index.js.map
4126
- //# debugId=e988f87f-5c82-5b18-9deb-cc1acdb9b566
4133
+ //# debugId=33aa5dcf-6bc0-53c8-8982-afd24237bdae
@@ -1833,7 +1833,10 @@ interface IIssueIncidenceCount {
1833
1833
  * graph projection the BFF `/api/branch` endpoint returns. `nodes` is
1834
1834
  * the first `LIMIT` nodes of the union (every requested prefix's
1835
1835
  * subtree) in stable path order (`ORDER BY path`); `links` carries only
1836
- * edges whose source AND target are both in that node set; `issues`
1836
+ * edges whose source AND RESOLVED target (`resolvedTarget`, else the raw
1837
+ * `target` for path-style links) are both in that node set, so a
1838
+ * trigger-style `invokes` / `mentions` edge that resolves to a rendered
1839
+ * node is kept and a genuinely-broken link is dropped; `issues`
1837
1840
  * carries only those whose `nodeIds` intersect it. `total` is the count
1838
1841
  * of nodes in the union BEFORE the cap (so the route can compute
1839
1842
  * `truncated`). `paths` echoes the (de-duped) requested prefixes; the
@@ -2558,17 +2561,6 @@ interface IProviderUi {
2558
2561
  * topbar lens chip; only the per-card badge is suppressed.
2559
2562
  */
2560
2563
  hideChip?: boolean;
2561
- /**
2562
- * When `true`, this Provider is registered but NOT yet selectable as
2563
- * the active lens. Auto-detect skips it (`detectProvidersFromFilesystem`),
2564
- * the BFF drops it from the `selectable` set, and the UI greys it with
2565
- * a `(coming soon)` suffix. It still ships in `providerRegistry` so
2566
- * node chips render. Mirrors
2567
- * `spec/schemas/extensions/provider.schema.json#/properties/presentation/properties/comingSoon`.
2568
- * Distinct from `hideChip` and from the operator toggle
2569
- * `plugins[<id>].enabled = false`. Defaults to `false` (selectable).
2570
- */
2571
- comingSoon?: boolean;
2572
2564
  }
2573
2565
  /**
2574
2566
  * Auto-detection markers for the active-provider lens. The lens resolver
@@ -2791,10 +2783,10 @@ interface IProvider extends IExtensionBase {
2791
2783
  * this `false`: their territory is consumed by every vendor and they
2792
2784
  * MUST run on every scan, regardless of the active lens.
2793
2785
  *
2794
- * When `activeProvider === null` (no lens resolved, e.g. a project
2795
- * with no provider markers), the walker bypasses the gate entirely
2796
- * and every gated Provider runs, mirroring the permissive
2797
- * extractor-side fallback for unlensed projects.
2786
+ * There is no unlensed state: a project with no provider markers
2787
+ * resolves to the universal `core/markdown` lens (id `markdown`),
2788
+ * under which every gated Provider stays off (only the universal
2789
+ * Providers run). The resolver never yields a null lens.
2798
2790
  *
2799
2791
  * Default `undefined` ≡ `false` ≡ universal. The field affects
2800
2792
  * classification ONLY; extractors continue to filter via their own
@@ -4181,14 +4173,17 @@ interface RunScanOptions {
4181
4173
  * - `string`: explicit lens. Provider-specific extractors run only
4182
4174
  * when their declared `precondition.provider` includes BOTH this
4183
4175
  * value AND the node's provider.
4184
- * - `null`: explicit "no lens". Provider-specific extractors are
4185
- * unconditionally skipped (spec-strict).
4176
+ * - `null`: "no lens" for bare callers. Provider-specific extractors
4177
+ * are unconditionally skipped, the same shape as the universal
4178
+ * markdown lens. Production never reaches this: the resolver in
4179
+ * `core/runtime` always yields a concrete lens (a vendor id, or
4180
+ * the markdown id when no marker is present).
4186
4181
  * - `undefined`: kernel auto-detects from `options.roots[0]` using
4187
4182
  * filesystem markers (`.claude/`, `.codex/`, `AGENTS.md`).
4188
4183
  * Convenient default for out-of-band callers
4189
4184
  * (integration tests, embedders) that don't thread a settings
4190
4185
  * reader. Production callers (scan-runner) resolve upstream and
4191
- * pass `string | null` explicitly, never `undefined`.
4186
+ * pass a concrete lens string explicitly, never `undefined`.
4192
4187
  */
4193
4188
  activeProvider?: string | null;
4194
4189
  /**
@@ -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]="076fe62f-6f3e-5ed6-88e8-66cf41154399")}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]="1cbc1ad0-b202-5d2a-a4b2-7498564c5261")}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.62.1",
105
+ version: "0.63.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -787,6 +787,17 @@ var ORCHESTRATOR_TEXTS = {
787
787
  // kernel/scan/detect-providers.ts
788
788
  import { existsSync as existsSync3 } from "fs";
789
789
  import { join as join3 } from "path";
790
+
791
+ // kernel/config/plugin-resolver.ts
792
+ var SHIPS_DISABLED = /* @__PURE__ */ new Set([
793
+ "experimental",
794
+ "deprecated"
795
+ ]);
796
+ function installedDefaultEnabled(stability) {
797
+ return stability === void 0 || !SHIPS_DISABLED.has(stability);
798
+ }
799
+
800
+ // kernel/scan/detect-providers.ts
790
801
  function detectProvidersFromFilesystem(cwd, providers) {
791
802
  const seen = /* @__PURE__ */ new Set();
792
803
  const out = [];
@@ -799,7 +810,7 @@ function detectProvidersFromFilesystem(cwd, providers) {
799
810
  return out;
800
811
  }
801
812
  function isDetectableUnderCwd(cwd, provider) {
802
- if (provider.presentation?.comingSoon === true) return false;
813
+ if (!installedDefaultEnabled(provider.stability)) return false;
803
814
  const markers = provider.detect?.markers;
804
815
  if (!markers || markers.length === 0) return false;
805
816
  return markers.some((marker) => existsSync3(join3(cwd, marker)));
@@ -1548,8 +1559,7 @@ function matchesKindPrecondition(ex, kind) {
1548
1559
  function matchesProviderPrecondition(ex, activeProvider) {
1549
1560
  const providers = ex.precondition?.provider;
1550
1561
  if (!providers || providers.length === 0) return true;
1551
- if (activeProvider === null) return false;
1552
- return providers.includes(activeProvider);
1562
+ return activeProvider !== null && providers.includes(activeProvider);
1553
1563
  }
1554
1564
  function splitLegacy(applicableExtractors, applicableQualifiedIds, nodeHashCacheEligible) {
1555
1565
  const cachedQualifiedIds = /* @__PURE__ */ new Set();
@@ -3127,7 +3137,6 @@ function buildPriorMtimes(opts) {
3127
3137
  }
3128
3138
  function providerParticipates(provider, activeProvider) {
3129
3139
  if (!provider.gatedByActiveLens) return true;
3130
- if (activeProvider === null) return true;
3131
3140
  return provider.id === activeProvider;
3132
3141
  }
3133
3142
  function createWalkAccumulators() {
@@ -3549,8 +3558,7 @@ function buildPostWalkTransformCtx(providers, nodes, activeProvider) {
3549
3558
  const reservedNodePaths = buildReservedNodePaths(
3550
3559
  nodes,
3551
3560
  kindRegistry,
3552
- reservedNamesByProviderKind,
3553
- activeProvider
3561
+ reservedNamesByProviderKind
3554
3562
  );
3555
3563
  return { kindRegistry, providerResolution, activeProvider, reservedNodePaths };
3556
3564
  }
@@ -3581,15 +3589,14 @@ function indexReservedNames(provider, out) {
3581
3589
  }
3582
3590
  }
3583
3591
  }
3584
- function buildReservedNodePaths(nodes, kindRegistry, reservedNamesByProviderKind, activeProvider) {
3592
+ function buildReservedNodePaths(nodes, kindRegistry, reservedNamesByProviderKind) {
3585
3593
  const out = /* @__PURE__ */ new Set();
3586
3594
  for (const node of nodes) {
3587
3595
  const selfKey = `${node.provider}/${node.kind}`;
3588
3596
  const selfReserved = reservedNamesByProviderKind.get(selfKey);
3589
- const lensReserved = activeProvider && activeProvider !== node.provider ? reservedNamesByProviderKind.get(`${activeProvider}/${node.kind}`) : void 0;
3590
- if (!hasEntries(selfReserved) && !hasEntries(lensReserved)) continue;
3597
+ if (!hasEntries(selfReserved)) continue;
3591
3598
  const ids = deriveNodeIdentifiers(node, kindRegistry.get(selfKey));
3592
- if (ids.some((id) => selfReserved?.has(id) === true || lensReserved?.has(id) === true)) {
3599
+ if (ids.some((id) => selfReserved?.has(id) === true)) {
3593
3600
  out.add(node.path);
3594
3601
  }
3595
3602
  }
@@ -4123,4 +4130,4 @@ export {
4123
4130
  runScanWithRenames
4124
4131
  };
4125
4132
  //# sourceMappingURL=index.js.map
4126
- //# debugId=076fe62f-6f3e-5ed6-88e8-66cf41154399
4133
+ //# debugId=1cbc1ad0-b202-5d2a-a4b2-7498564c5261