@skill-map/cli 0.16.6 → 0.17.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.
@@ -57,8 +57,8 @@
57
57
  * prefix.
58
58
  */
59
59
  /**
60
- * The five node kinds the **built-in Claude Provider** declares — `skill`,
61
- * `agent`, `command`, `hook`, `note`. **NOT** the kernel-wide kind type.
60
+ * The four node kinds the **built-in Claude Provider** declares — `skill`,
61
+ * `agent`, `command`, `note`. **NOT** the kernel-wide kind type.
62
62
  *
63
63
  * `Node.kind` is `string`. An external Provider (Cursor, Obsidian, …)
64
64
  * MAY classify into its own kinds (e.g. `'cursorRule'`, `'daily'`); the
@@ -67,19 +67,25 @@
67
67
  * `node.schema.json#/properties/kind`, the contract is open-by-design
68
68
  * (matches `IProvider.kinds` "open by design" docstring).
69
69
  *
70
+ * Step 9.5 dropped `hook` from the catalog: `.claude/hooks/*.md` is NOT
71
+ * an Anthropic-defined node type — hooks live in `settings.json` or as
72
+ * sub-objects of agent / skill frontmatter (see
73
+ * https://code.claude.com/docs/en/hooks.md). Files at the old path now
74
+ * classify as `note` via the Provider's fallback.
75
+ *
70
76
  * This alias survives because:
71
- * - claude-specific code legitimately wants to switch on the five
77
+ * - claude-specific code legitimately wants to switch on the four
72
78
  * hard-coded values (filter widgets, kind-aware UI cards, the
73
79
  * `validate-all` built-in rule that maps each kind to its
74
80
  * frontmatter schema);
75
81
  * - sorting helpers want a stable `KIND_ORDER` for the canonical
76
82
  * catalog;
77
- * - tests expect to enumerate the five kinds when seeding fixtures.
83
+ * - tests expect to enumerate the four kinds when seeding fixtures.
78
84
  *
79
85
  * For "any kind a Provider could declare", use plain `string`. Only use
80
86
  * `NodeKind` when the code is intentionally claude-catalog-specific.
81
87
  */
82
- type NodeKind = 'skill' | 'agent' | 'command' | 'hook' | 'note';
88
+ type NodeKind = 'skill' | 'agent' | 'command' | 'note';
83
89
  type LinkKind = 'invokes' | 'references' | 'mentions' | 'supersedes';
84
90
  type Confidence = 'high' | 'medium' | 'low';
85
91
  type Severity = 'error' | 'warn' | 'info';
@@ -919,6 +925,23 @@ interface IProvider extends IExtensionBase {
919
925
  * column all accept any non-empty string an enabled Provider returns.
920
926
  */
921
927
  kinds: Record<string, IProviderKind>;
928
+ /**
929
+ * Optional auxiliary JSON Schemas this Provider's per-kind schemas
930
+ * `$ref` by `$id`. Registered with AJV via `addSchema` BEFORE the
931
+ * per-kind schemas compile, so cross-file `$ref` resolution succeeds.
932
+ *
933
+ * Use case: when several kinds share a common base (e.g. Anthropic's
934
+ * merged skill / command frontmatter — both extend a shared
935
+ * `skill-base.schema.json`), the Provider declares the base here so
936
+ * `skill.schema.json` and `command.schema.json` can `$ref` it without
937
+ * duplicating fields.
938
+ *
939
+ * Runtime-only — does NOT appear in the spec's `provider.schema.json`
940
+ * manifest. Manifest-validated schemas remain the per-kind ones in
941
+ * `kinds[<kind>].schema`; auxiliary schemas are an implementation
942
+ * concern of how the runtime composes those.
943
+ */
944
+ schemas?: unknown[];
922
945
  /**
923
946
  * Walk the given roots and yield every node the Provider recognises.
924
947
  * Non-matching files are silently skipped. Unreadable files produce
@@ -102,7 +102,7 @@ import yaml from "js-yaml";
102
102
  // package.json
103
103
  var package_default = {
104
104
  name: "@skill-map/cli",
105
- version: "0.16.6",
105
+ version: "0.17.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -168,7 +168,7 @@ var package_default = {
168
168
  },
169
169
  dependencies: {
170
170
  "@hono/node-server": "2.0.1",
171
- "@skill-map/spec": "0.16.0",
171
+ "@skill-map/spec": "0.17.0",
172
172
  ajv: "8.18.0",
173
173
  "ajv-formats": "3.0.1",
174
174
  chokidar: "5.0.0",
@@ -384,6 +384,7 @@ function buildProviderFrontmatterValidator(providers) {
384
384
  const baseFile = resolve2(specRoot, "schemas/frontmatter/base.schema.json");
385
385
  const baseSchema = JSON.parse(readFileSync2(baseFile, "utf8"));
386
386
  ajv.addSchema(baseSchema);
387
+ registerProviderAuxiliarySchemas(ajv, providers);
387
388
  const compiled = /* @__PURE__ */ new Map();
388
389
  for (const provider of providers) {
389
390
  for (const [kind, entry] of Object.entries(provider.kinds)) {
@@ -408,6 +409,16 @@ function formatError(err) {
408
409
  const path = err.instancePath || "(root)";
409
410
  return `${path} ${err.message ?? err.keyword}`;
410
411
  }
412
+ function registerProviderAuxiliarySchemas(ajv, providers) {
413
+ for (const provider of providers) {
414
+ if (!provider.schemas) continue;
415
+ for (const aux of provider.schemas) {
416
+ const auxJson = aux;
417
+ if (typeof auxJson.$id === "string" && ajv.getSchema(auxJson.$id)) continue;
418
+ ajv.addSchema(aux);
419
+ }
420
+ }
421
+ }
411
422
  function resolveSpecRoot() {
412
423
  const require2 = createRequire2(import.meta.url);
413
424
  try {