@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 +3 -3
- package/bin/index.js +11 -5
- package/bin/mcp.js +10 -4
- package/bin/migrate.js +1 -1
- package/bin/server.js +1 -1
- package/bin/worker.js +1 -1
- package/dist/index.js +11 -5
- package/dist/sdk/index.js +11 -5
- package/package.json +1 -1
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
|
|
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.
|
|
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
|
|
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.
|
|
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 (
|
|
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)) &&
|
|
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)) &&
|
|
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.
|
|
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 (
|
|
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)) &&
|
|
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
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.
|
|
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.
|
|
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.
|
|
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 (
|
|
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)) &&
|
|
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)) &&
|
|
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.
|
|
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 (
|
|
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)) &&
|
|
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)) &&
|
|
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)
|