@hasna/skills 0.10.53 → 0.10.54

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/README.md CHANGED
@@ -643,9 +643,9 @@ skills hook native-catalog --cwd /absolute/project --output /private/catalog.jso
643
643
  skills hook install --agent codex --codex-native-catalog /private/catalog.json --json
644
644
  ```
645
645
 
646
- Codex 0.159.2, 0.160.0 and 0.160.1 have measured qualified-name catalog support.
646
+ Codex 0.159.2, 0.160.0, 0.160.1 and 0.161.0 have measured qualified-name catalog support.
647
647
  Native transport, capture and review use one capability registry of exact
648
- releases. Unmeasured releases, including 0.160.2 and 0.161.0, refuse until the
648
+ releases. Unmeasured releases, including 0.160.2 and 0.161.1, refuse until the
649
649
  native catalog/name-denial and hook-dispatch acceptance tests pass; an RPC
650
650
  handshake alone does not establish those semantics. Admitting a release does not
651
651
  admit its corpus: the transport still requires the existing native corpus
@@ -697,7 +697,7 @@ different extant, witnessed user version. Individual missing files, current
697
697
  registered roots, aliases and registration changes still refuse; historical
698
698
  source hashes and typed settings witnesses remain intact.
699
699
 
700
- For a Codex 0.160.0 or 0.160.1 remote refresh omitted by an existing qualified-name disable,
700
+ For a Codex 0.160.0, 0.160.1 or 0.161.0 remote refresh omitted by an existing qualified-name disable,
701
701
  a fresh native catalog and discovery review can plan the new exact path disable
702
702
  in the same transaction. The remote installation receipt, namespace and capability
703
703
  controls must match; conflicting enable rules, unknown names and ambiguous
package/bin/index.js CHANGED
@@ -36888,7 +36888,7 @@ var package_default;
36888
36888
  var init_package = __esm(() => {
36889
36889
  package_default = {
36890
36890
  name: "@hasna/skills",
36891
- version: "0.10.53",
36891
+ version: "0.10.54",
36892
36892
  description: "Skills library for AI coding agents",
36893
36893
  type: "module",
36894
36894
  bin: {
@@ -40291,7 +40291,8 @@ var init_codex_native_compatibility = __esm(() => {
40291
40291
  "codex-cli 0.159.0": ["hooks"],
40292
40292
  "codex-cli 0.159.2": ["hooks", "qualified-skill-catalog"],
40293
40293
  "codex-cli 0.160.0": ["hooks", "qualified-skill-catalog", "installed-plugin-review"],
40294
- "codex-cli 0.160.1": ["hooks", "qualified-skill-catalog", "installed-plugin-review"]
40294
+ "codex-cli 0.160.1": ["hooks", "qualified-skill-catalog", "installed-plugin-review"],
40295
+ "codex-cli 0.161.0": ["hooks", "qualified-skill-catalog", "installed-plugin-review"]
40295
40296
  };
40296
40297
  SUPPORTED_CODEX_HOOK_VERSIONS = Object.freeze(Object.keys(MEASURED_CODEX_CAPABILITIES).filter((version) => supportsCodexNativeCapability(version, "hooks")));
40297
40298
  });
@@ -59505,12 +59506,17 @@ function captureRetiredCodexDiscovery(binding, controls, rules) {
59505
59506
  return { ...current, codexRetiredMaterializations: previous };
59506
59507
  return { ...current, codexRetiredMaterializations: { roots, parents: parents3, directories: captureDiscoveryDirectoryProjection(directories.map((item) => item.path), roots) } };
59507
59508
  }
59509
+ function retainableAbsentSource(source) {
59510
+ if (source.format !== undefined || source.fields !== undefined || source.managedPlugins !== undefined)
59511
+ return false;
59512
+ return [undefined, "bytes"].includes(source.hashMode) || source.hashMode === "claude-plugin-manifest-v1" && source.sha256 !== null && source.path.endsWith(join37(sep8, ".claude-plugin", "plugin.json"));
59513
+ }
59508
59514
  function absentRetiredClaudeRoots(binding) {
59509
59515
  if (binding.agent !== "claude" || binding.method !== "reviewed")
59510
59516
  return [];
59511
59517
  const result2 = new Set;
59512
59518
  for (const source of binding.sources) {
59513
- if (source.format !== undefined || source.fields !== undefined || source.managedPlugins !== undefined || ![undefined, "bytes"].includes(source.hashMode) || source.sha256 === null)
59519
+ if (!retainableAbsentSource(source) || source.sha256 === null)
59514
59520
  continue;
59515
59521
  const marker = sep8 + ".claude" + sep8 + "plugins" + sep8 + "cache" + sep8, at2 = source.path.indexOf(marker);
59516
59522
  if (at2 < 0 || source.path.indexOf(marker, at2 + 1) >= 0)
@@ -59622,7 +59628,7 @@ function verifyAgentDiscovery(binding, codexRecovery) {
59622
59628
  safe4(source.path);
59623
59629
  continue;
59624
59630
  }
59625
- if (absentRoots.some((root2) => source.path.startsWith(root2 + sep8)) && source.format === undefined && source.fields === undefined && source.managedPlugins === undefined && [undefined, "bytes"].includes(source.hashMode)) {
59631
+ if (absentRoots.some((root2) => source.path.startsWith(root2 + sep8)) && retainableAbsentSource(source)) {
59626
59632
  safe4(source.path);
59627
59633
  continue;
59628
59634
  }
@@ -59678,7 +59684,7 @@ function rebindAgentDiscovery(binding, changes) {
59678
59684
  const installationRoots = codexInstallationRoots(binding), absentRoots = [...absentCodexSkillRoots(binding), ...absentRetiredClaudeRoots(binding), ...retiredCodexRoots(binding).filter((root2) => !lstatSync25(root2, { throwIfNoEntry: false }))];
59679
59685
  const rebound = { ...binding, sources: binding.sources.map((source) => {
59680
59686
  assertMarketplaceBinding(binding, source);
59681
- if (!changes.has(source.path) && (installationRoots.some((root2) => source.path.startsWith(root2 + sep8)) || absentRoots.some((root2) => source.path.startsWith(root2 + sep8)) && source.format === undefined && source.fields === undefined && source.managedPlugins === undefined && [undefined, "bytes"].includes(source.hashMode)))
59687
+ if (!changes.has(source.path) && (installationRoots.some((root2) => source.path.startsWith(root2 + sep8)) || absentRoots.some((root2) => source.path.startsWith(root2 + sep8)) && retainableAbsentSource(source)))
59682
59688
  return source;
59683
59689
  const sha2563 = projected(source, changes, budget2);
59684
59690
  if (!changes.has(source.path) && sha2563 !== source.sha256)
package/bin/mcp.js CHANGED
@@ -20019,7 +20019,7 @@ var package_default;
20019
20019
  var init_package = __esm(() => {
20020
20020
  package_default = {
20021
20021
  name: "@hasna/skills",
20022
- version: "0.10.53",
20022
+ version: "0.10.54",
20023
20023
  description: "Skills library for AI coding agents",
20024
20024
  type: "module",
20025
20025
  bin: {
@@ -38560,7 +38560,8 @@ var init_codex_native_compatibility = __esm(() => {
38560
38560
  "codex-cli 0.159.0": ["hooks"],
38561
38561
  "codex-cli 0.159.2": ["hooks", "qualified-skill-catalog"],
38562
38562
  "codex-cli 0.160.0": ["hooks", "qualified-skill-catalog", "installed-plugin-review"],
38563
- "codex-cli 0.160.1": ["hooks", "qualified-skill-catalog", "installed-plugin-review"]
38563
+ "codex-cli 0.160.1": ["hooks", "qualified-skill-catalog", "installed-plugin-review"],
38564
+ "codex-cli 0.161.0": ["hooks", "qualified-skill-catalog", "installed-plugin-review"]
38564
38565
  };
38565
38566
  SUPPORTED_CODEX_HOOK_VERSIONS = Object.freeze(Object.keys(MEASURED_CODEX_CAPABILITIES).filter((version2) => supportsCodexNativeCapability(version2, "hooks")));
38566
38567
  });
@@ -50916,12 +50917,17 @@ function retiredCodexRoots(binding) {
50916
50917
  }
50917
50918
  return proof.roots;
50918
50919
  }
50920
+ function retainableAbsentSource(source) {
50921
+ if (source.format !== undefined || source.fields !== undefined || source.managedPlugins !== undefined)
50922
+ return false;
50923
+ return [undefined, "bytes"].includes(source.hashMode) || source.hashMode === "claude-plugin-manifest-v1" && source.sha256 !== null && source.path.endsWith(join26(sep6, ".claude-plugin", "plugin.json"));
50924
+ }
50919
50925
  function absentRetiredClaudeRoots(binding) {
50920
50926
  if (binding.agent !== "claude" || binding.method !== "reviewed")
50921
50927
  return [];
50922
50928
  const result = new Set;
50923
50929
  for (const source of binding.sources) {
50924
- if (source.format !== undefined || source.fields !== undefined || source.managedPlugins !== undefined || ![undefined, "bytes"].includes(source.hashMode) || source.sha256 === null)
50930
+ if (!retainableAbsentSource(source) || source.sha256 === null)
50925
50931
  continue;
50926
50932
  const marker = sep6 + ".claude" + sep6 + "plugins" + sep6 + "cache" + sep6, at = source.path.indexOf(marker);
50927
50933
  if (at < 0 || source.path.indexOf(marker, at + 1) >= 0)
@@ -51033,7 +51039,7 @@ function verifyAgentDiscovery(binding, codexRecovery) {
51033
51039
  safe4(source.path);
51034
51040
  continue;
51035
51041
  }
51036
- if (absentRoots.some((root) => source.path.startsWith(root + sep6)) && source.format === undefined && source.fields === undefined && source.managedPlugins === undefined && [undefined, "bytes"].includes(source.hashMode)) {
51042
+ if (absentRoots.some((root) => source.path.startsWith(root + sep6)) && retainableAbsentSource(source)) {
51037
51043
  safe4(source.path);
51038
51044
  continue;
51039
51045
  }
package/bin/migrate.js CHANGED
@@ -25,7 +25,7 @@ import { join as join5 } from "path";
25
25
  // package.json
26
26
  var package_default = {
27
27
  name: "@hasna/skills",
28
- version: "0.10.53",
28
+ version: "0.10.54",
29
29
  description: "Skills library for AI coding agents",
30
30
  type: "module",
31
31
  bin: {
package/bin/server.js CHANGED
@@ -24140,7 +24140,7 @@ restoreLaunchCwd();
24140
24140
  // package.json
24141
24141
  var package_default = {
24142
24142
  name: "@hasna/skills",
24143
- version: "0.10.53",
24143
+ version: "0.10.54",
24144
24144
  description: "Skills library for AI coding agents",
24145
24145
  type: "module",
24146
24146
  bin: {
package/bin/worker.js CHANGED
@@ -24143,7 +24143,7 @@ import { randomUUID as randomUUID6 } from "crypto";
24143
24143
  // package.json
24144
24144
  var package_default = {
24145
24145
  name: "@hasna/skills",
24146
- version: "0.10.53",
24146
+ version: "0.10.54",
24147
24147
  description: "Skills library for AI coding agents",
24148
24148
  type: "module",
24149
24149
  bin: {
package/dist/index.js CHANGED
@@ -9398,7 +9398,8 @@ var MEASURED_CODEX_CAPABILITIES = {
9398
9398
  "codex-cli 0.159.0": ["hooks"],
9399
9399
  "codex-cli 0.159.2": ["hooks", "qualified-skill-catalog"],
9400
9400
  "codex-cli 0.160.0": ["hooks", "qualified-skill-catalog", "installed-plugin-review"],
9401
- "codex-cli 0.160.1": ["hooks", "qualified-skill-catalog", "installed-plugin-review"]
9401
+ "codex-cli 0.160.1": ["hooks", "qualified-skill-catalog", "installed-plugin-review"],
9402
+ "codex-cli 0.161.0": ["hooks", "qualified-skill-catalog", "installed-plugin-review"]
9402
9403
  };
9403
9404
  function supportsCodexNativeCapability(version, capability) {
9404
9405
  return typeof version === "string" && Object.hasOwn(MEASURED_CODEX_CAPABILITIES, version) && MEASURED_CODEX_CAPABILITIES[version].includes(capability);
@@ -11832,7 +11833,7 @@ function replaceSkillSession(expected, replacement, plan, options = {}, beforeCo
11832
11833
  // package.json
11833
11834
  var package_default = {
11834
11835
  name: "@hasna/skills",
11835
- version: "0.10.53",
11836
+ version: "0.10.54",
11836
11837
  description: "Skills library for AI coding agents",
11837
11838
  type: "module",
11838
11839
  bin: {
@@ -20837,12 +20838,17 @@ function captureRetiredCodexDiscovery(binding, controls, rules) {
20837
20838
  return { ...current, codexRetiredMaterializations: previous };
20838
20839
  return { ...current, codexRetiredMaterializations: { roots, parents: parents3, directories: captureDiscoveryDirectoryProjection(directories.map((item) => item.path), roots) } };
20839
20840
  }
20841
+ function retainableAbsentSource(source) {
20842
+ if (source.format !== undefined || source.fields !== undefined || source.managedPlugins !== undefined)
20843
+ return false;
20844
+ return [undefined, "bytes"].includes(source.hashMode) || source.hashMode === "claude-plugin-manifest-v1" && source.sha256 !== null && source.path.endsWith(join32(sep8, ".claude-plugin", "plugin.json"));
20845
+ }
20840
20846
  function absentRetiredClaudeRoots(binding) {
20841
20847
  if (binding.agent !== "claude" || binding.method !== "reviewed")
20842
20848
  return [];
20843
20849
  const result = new Set;
20844
20850
  for (const source of binding.sources) {
20845
- if (source.format !== undefined || source.fields !== undefined || source.managedPlugins !== undefined || ![undefined, "bytes"].includes(source.hashMode) || source.sha256 === null)
20851
+ if (!retainableAbsentSource(source) || source.sha256 === null)
20846
20852
  continue;
20847
20853
  const marker = sep8 + ".claude" + sep8 + "plugins" + sep8 + "cache" + sep8, at = source.path.indexOf(marker);
20848
20854
  if (at < 0 || source.path.indexOf(marker, at + 1) >= 0)
@@ -20954,7 +20960,7 @@ function verifyAgentDiscovery(binding, codexRecovery) {
20954
20960
  safe4(source.path);
20955
20961
  continue;
20956
20962
  }
20957
- if (absentRoots.some((root2) => source.path.startsWith(root2 + sep8)) && source.format === undefined && source.fields === undefined && source.managedPlugins === undefined && [undefined, "bytes"].includes(source.hashMode)) {
20963
+ if (absentRoots.some((root2) => source.path.startsWith(root2 + sep8)) && retainableAbsentSource(source)) {
20958
20964
  safe4(source.path);
20959
20965
  continue;
20960
20966
  }
@@ -21010,7 +21016,7 @@ function rebindAgentDiscovery(binding, changes) {
21010
21016
  const installationRoots = codexInstallationRoots(binding), absentRoots = [...absentCodexSkillRoots(binding), ...absentRetiredClaudeRoots(binding), ...retiredCodexRoots(binding).filter((root2) => !lstatSync25(root2, { throwIfNoEntry: false }))];
21011
21017
  const rebound = { ...binding, sources: binding.sources.map((source) => {
21012
21018
  assertMarketplaceBinding(binding, source);
21013
- if (!changes.has(source.path) && (installationRoots.some((root2) => source.path.startsWith(root2 + sep8)) || absentRoots.some((root2) => source.path.startsWith(root2 + sep8)) && source.format === undefined && source.fields === undefined && source.managedPlugins === undefined && [undefined, "bytes"].includes(source.hashMode)))
21019
+ if (!changes.has(source.path) && (installationRoots.some((root2) => source.path.startsWith(root2 + sep8)) || absentRoots.some((root2) => source.path.startsWith(root2 + sep8)) && retainableAbsentSource(source)))
21014
21020
  return source;
21015
21021
  const sha2563 = projected(source, changes, budget2);
21016
21022
  if (!changes.has(source.path) && sha2563 !== source.sha256)
package/dist/sdk/index.js CHANGED
@@ -32373,7 +32373,7 @@ var init_event_sink = __esm(() => {
32373
32373
  // package.json
32374
32374
  var package_default = {
32375
32375
  name: "@hasna/skills",
32376
- version: "0.10.53",
32376
+ version: "0.10.54",
32377
32377
  description: "Skills library for AI coding agents",
32378
32378
  type: "module",
32379
32379
  bin: {
@@ -38446,7 +38446,8 @@ var MEASURED_CODEX_CAPABILITIES = {
38446
38446
  "codex-cli 0.159.0": ["hooks"],
38447
38447
  "codex-cli 0.159.2": ["hooks", "qualified-skill-catalog"],
38448
38448
  "codex-cli 0.160.0": ["hooks", "qualified-skill-catalog", "installed-plugin-review"],
38449
- "codex-cli 0.160.1": ["hooks", "qualified-skill-catalog", "installed-plugin-review"]
38449
+ "codex-cli 0.160.1": ["hooks", "qualified-skill-catalog", "installed-plugin-review"],
38450
+ "codex-cli 0.161.0": ["hooks", "qualified-skill-catalog", "installed-plugin-review"]
38450
38451
  };
38451
38452
  function supportsCodexNativeCapability(version, capability) {
38452
38453
  return typeof version === "string" && Object.hasOwn(MEASURED_CODEX_CAPABILITIES, version) && MEASURED_CODEX_CAPABILITIES[version].includes(capability);
@@ -43655,12 +43656,17 @@ function captureRetiredCodexDiscovery(binding, controls, rules) {
43655
43656
  return { ...current, codexRetiredMaterializations: previous };
43656
43657
  return { ...current, codexRetiredMaterializations: { roots, parents: parents3, directories: captureDiscoveryDirectoryProjection(directories.map((item) => item.path), roots) } };
43657
43658
  }
43659
+ function retainableAbsentSource(source) {
43660
+ if (source.format !== undefined || source.fields !== undefined || source.managedPlugins !== undefined)
43661
+ return false;
43662
+ return [undefined, "bytes"].includes(source.hashMode) || source.hashMode === "claude-plugin-manifest-v1" && source.sha256 !== null && source.path.endsWith(join26(sep6, ".claude-plugin", "plugin.json"));
43663
+ }
43658
43664
  function absentRetiredClaudeRoots(binding) {
43659
43665
  if (binding.agent !== "claude" || binding.method !== "reviewed")
43660
43666
  return [];
43661
43667
  const result = new Set;
43662
43668
  for (const source of binding.sources) {
43663
- if (source.format !== undefined || source.fields !== undefined || source.managedPlugins !== undefined || ![undefined, "bytes"].includes(source.hashMode) || source.sha256 === null)
43669
+ if (!retainableAbsentSource(source) || source.sha256 === null)
43664
43670
  continue;
43665
43671
  const marker = sep6 + ".claude" + sep6 + "plugins" + sep6 + "cache" + sep6, at = source.path.indexOf(marker);
43666
43672
  if (at < 0 || source.path.indexOf(marker, at + 1) >= 0)
@@ -43772,7 +43778,7 @@ function verifyAgentDiscovery(binding, codexRecovery) {
43772
43778
  safe4(source.path);
43773
43779
  continue;
43774
43780
  }
43775
- if (absentRoots.some((root2) => source.path.startsWith(root2 + sep6)) && source.format === undefined && source.fields === undefined && source.managedPlugins === undefined && [undefined, "bytes"].includes(source.hashMode)) {
43781
+ if (absentRoots.some((root2) => source.path.startsWith(root2 + sep6)) && retainableAbsentSource(source)) {
43776
43782
  safe4(source.path);
43777
43783
  continue;
43778
43784
  }
@@ -43828,7 +43834,7 @@ function rebindAgentDiscovery(binding, changes) {
43828
43834
  const installationRoots = codexInstallationRoots(binding), absentRoots = [...absentCodexSkillRoots(binding), ...absentRetiredClaudeRoots(binding), ...retiredCodexRoots(binding).filter((root2) => !lstatSync21(root2, { throwIfNoEntry: false }))];
43829
43835
  const rebound = { ...binding, sources: binding.sources.map((source) => {
43830
43836
  assertMarketplaceBinding(binding, source);
43831
- if (!changes.has(source.path) && (installationRoots.some((root2) => source.path.startsWith(root2 + sep6)) || absentRoots.some((root2) => source.path.startsWith(root2 + sep6)) && source.format === undefined && source.fields === undefined && source.managedPlugins === undefined && [undefined, "bytes"].includes(source.hashMode)))
43837
+ if (!changes.has(source.path) && (installationRoots.some((root2) => source.path.startsWith(root2 + sep6)) || absentRoots.some((root2) => source.path.startsWith(root2 + sep6)) && retainableAbsentSource(source)))
43832
43838
  return source;
43833
43839
  const sha2562 = projected(source, changes, budget2);
43834
43840
  if (!changes.has(source.path) && sha2562 !== source.sha256)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/skills",
3
- "version": "0.10.53",
3
+ "version": "0.10.54",
4
4
  "description": "Skills library for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {