@hasna/skills 0.10.10 → 0.10.11
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/bin/index.js +39 -5
- package/bin/mcp.js +1 -1
- package/bin/migrate.js +1 -1
- package/bin/server.js +1 -1
- package/bin/worker.js +1 -1
- package/dist/index.js +39 -5
- package/dist/lib/agent-integration.d.ts +1 -0
- package/dist/sdk/index.js +39 -5
- package/package.json +1 -1
package/bin/index.js
CHANGED
|
@@ -36868,7 +36868,7 @@ var package_default;
|
|
|
36868
36868
|
var init_package = __esm(() => {
|
|
36869
36869
|
package_default = {
|
|
36870
36870
|
name: "@hasna/skills",
|
|
36871
|
-
version: "0.10.
|
|
36871
|
+
version: "0.10.11",
|
|
36872
36872
|
description: "Skills library for AI coding agents",
|
|
36873
36873
|
type: "module",
|
|
36874
36874
|
bin: {
|
|
@@ -51082,6 +51082,33 @@ function canonicalAgentPath(path, aliases) {
|
|
|
51082
51082
|
const absolute = resolve10(path), binding = aliases.find((item) => absolute === item.alias || absolute.startsWith(item.alias + sep4));
|
|
51083
51083
|
return binding ? join20(binding.target, relative4(binding.alias, absolute)) : absolute;
|
|
51084
51084
|
}
|
|
51085
|
+
function disabledCodexSkillPaths(config, aliases) {
|
|
51086
|
+
const skills = config.skills;
|
|
51087
|
+
if (!skills || typeof skills !== "object" || Array.isArray(skills))
|
|
51088
|
+
return [];
|
|
51089
|
+
const rows = skills.config;
|
|
51090
|
+
if (!Array.isArray(rows))
|
|
51091
|
+
return [];
|
|
51092
|
+
if (rows.some((entry) => !entry || typeof entry !== "object" || Array.isArray(entry) || typeof entry.enabled !== "boolean" || entry.path !== undefined && (typeof entry.path !== "string" || !isAbsolute9(entry.path)) || entry.name !== undefined && typeof entry.name !== "string"))
|
|
51093
|
+
return [];
|
|
51094
|
+
if (rows.some((entry) => entry.name !== undefined))
|
|
51095
|
+
return [];
|
|
51096
|
+
const settings = new Map;
|
|
51097
|
+
for (const entry of rows) {
|
|
51098
|
+
if (typeof entry.path !== "string" || !isAbsolute9(entry.path))
|
|
51099
|
+
continue;
|
|
51100
|
+
let document3;
|
|
51101
|
+
try {
|
|
51102
|
+
document3 = realpathSync3(canonicalAgentPath(entry.path, aliases));
|
|
51103
|
+
} catch {
|
|
51104
|
+
continue;
|
|
51105
|
+
}
|
|
51106
|
+
if (!document3.endsWith(`${sep4}SKILL.md`))
|
|
51107
|
+
continue;
|
|
51108
|
+
settings.set(document3, [...settings.get(document3) ?? [], entry.enabled === false]);
|
|
51109
|
+
}
|
|
51110
|
+
return [...settings].filter(([, values2]) => values2.length === 1 && values2[0] === true).map(([document3]) => dirname10(document3));
|
|
51111
|
+
}
|
|
51085
51112
|
function recheckRootAliases(aliases) {
|
|
51086
51113
|
for (const binding of aliases) {
|
|
51087
51114
|
if (!["claude", "codex"].includes(binding.agent) || binding.alias !== join20(binding.home, `.${binding.agent}`))
|
|
@@ -51238,6 +51265,9 @@ function projectAncestorDirectories(projects) {
|
|
|
51238
51265
|
function inventoryNativeSkills(home = homedir3(), options = {}) {
|
|
51239
51266
|
if (options.reviewedCacheAlias !== undefined && (!options.includeVendor || !isAbsolute9(options.reviewedCacheAlias) || resolve10(options.reviewedCacheAlias) !== options.reviewedCacheAlias))
|
|
51240
51267
|
throw new Error("A reviewed cache alias requires vendor inventory and an exact absolute path");
|
|
51268
|
+
if (options.disabledVendorPaths?.some((path) => !isAbsolute9(path) || resolve10(path) !== path))
|
|
51269
|
+
throw new Error("Disabled vendor paths must be exact absolute paths");
|
|
51270
|
+
const disabledVendorPaths = new Set(options.disabledVendorPaths ?? []);
|
|
51241
51271
|
const aliases = rootAliases(home, options.allowRootAliases);
|
|
51242
51272
|
const selectedAgents = options.agents ? new Set(options.agents) : undefined;
|
|
51243
51273
|
const includesAgent = (agent) => !selectedAgents || selectedAgents.has(agent);
|
|
@@ -51259,7 +51289,7 @@ function inventoryNativeSkills(home = homedir3(), options = {}) {
|
|
|
51259
51289
|
throw new Error("Native skill discovery metadata limit exceeded");
|
|
51260
51290
|
}
|
|
51261
51291
|
let reviewedCacheAliasFound = false;
|
|
51262
|
-
function verifiedSiblingCacheAlias(path, parent) {
|
|
51292
|
+
function verifiedSiblingCacheAlias(agent, path, parent) {
|
|
51263
51293
|
const link2 = readlinkSync3(path), target = resolve10(parent, link2);
|
|
51264
51294
|
if (dirname10(target) !== parent || (isAbsolute9(link2) ? link2 !== target : dirname10(link2) !== "."))
|
|
51265
51295
|
return false;
|
|
@@ -51269,6 +51299,9 @@ function inventoryNativeSkills(home = homedir3(), options = {}) {
|
|
|
51269
51299
|
if (!scan?.complete || scan.entries > maxAliasProofEntries)
|
|
51270
51300
|
return false;
|
|
51271
51301
|
if (scan.hasSkills) {
|
|
51302
|
+
const targetSkills = entries.filter((entry) => entry.agent === agent && entry.vendor && (entry.path === target || entry.path.startsWith(target + sep4)));
|
|
51303
|
+
if (agent === "codex" && targetSkills.length > 0 && targetSkills.every((entry) => disabledVendorPaths.has(entry.path)))
|
|
51304
|
+
return true;
|
|
51272
51305
|
if (path !== options.reviewedCacheAlias)
|
|
51273
51306
|
return false;
|
|
51274
51307
|
reviewedCacheAliasFound = true;
|
|
@@ -51330,7 +51363,7 @@ function inventoryNativeSkills(home = homedir3(), options = {}) {
|
|
|
51330
51363
|
const child = join20(path, name);
|
|
51331
51364
|
if (isVendor && lstatSync14(child, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
51332
51365
|
const target = statSync7(child, { throwIfNoEntry: false });
|
|
51333
|
-
if (target?.isFile() || pluginCache && target?.isDirectory() && verifiedSiblingCacheAlias(child, path)) {
|
|
51366
|
+
if (target?.isFile() || pluginCache && target?.isDirectory() && verifiedSiblingCacheAlias(agent, child, path)) {
|
|
51334
51367
|
scan.entries++;
|
|
51335
51368
|
continue;
|
|
51336
51369
|
}
|
|
@@ -51538,7 +51571,8 @@ function planAgentIntegration(options) {
|
|
|
51538
51571
|
}
|
|
51539
51572
|
return resolveAgentDiscovery({ home, agent, reviewed: options.discoveryInputs, retainedReview, canonical: (path) => canonicalAgentPath(path, aliases) });
|
|
51540
51573
|
});
|
|
51541
|
-
const
|
|
51574
|
+
const codexConfig = options.agents.includes("codex") ? Bun.TOML.parse(readOptional(canonicalAgentPath(join20(home, ".codex", "config.toml"), aliases)) ?? "") : {};
|
|
51575
|
+
const nativeSkills = inventoryNativeSkills(home, { includeVendor: true, guardHermes: options.agents.includes("hermes"), agents: options.agents, projectDir: options.projectDir, agentRoots: discoveries.flatMap((binding) => binding.roots.map((path) => ({ agent: binding.agent, path }))), allowRootAliases: options.allowRootAliases, disabledVendorPaths: disabledCodexSkillPaths(codexConfig, aliases) });
|
|
51542
51576
|
const changes = [];
|
|
51543
51577
|
for (const agent of [...new Set(options.agents)]) {
|
|
51544
51578
|
if (!INTEGRATION_AGENTS.includes(agent))
|
|
@@ -51979,7 +52013,7 @@ function assertManagedAgentBridge(agent, options = {}) {
|
|
|
51979
52013
|
} catch (error) {
|
|
51980
52014
|
throw new Error(`NATIVE_SKILL_DRIFT: ${error.message}`);
|
|
51981
52015
|
}
|
|
51982
|
-
const inventory = inventoryNativeSkills(home, { includeVendor: true, guardHermes: agent === "hermes", agents: [agent], projectDirs: [...roots], agentRoots: discovery.roots.map((path) => ({ agent, path })), allowRootAliases: aliases.length > 0 });
|
|
52016
|
+
const inventory = inventoryNativeSkills(home, { includeVendor: true, guardHermes: agent === "hermes", agents: [agent], projectDirs: [...roots], agentRoots: discovery.roots.map((path) => ({ agent, path })), allowRootAliases: aliases.length > 0, disabledVendorPaths: agent === "codex" ? disabledCodexSkillPaths(codexConfig, aliases) : [] });
|
|
51983
52017
|
const unexpected = inventory.filter((entry) => visible(entry) && !entry.bridge && !disabledVendorSkill(entry));
|
|
51984
52018
|
if (unexpected.length) {
|
|
51985
52019
|
const paths = unexpected.slice(0, 3).map((entry) => {
|
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.11",
|
|
20023
20023
|
description: "Skills library for AI coding agents",
|
|
20024
20024
|
type: "module",
|
|
20025
20025
|
bin: {
|
package/bin/migrate.js
CHANGED
package/bin/server.js
CHANGED
|
@@ -24122,7 +24122,7 @@ var init_dist_es9 = __esm(() => {
|
|
|
24122
24122
|
// package.json
|
|
24123
24123
|
var package_default = {
|
|
24124
24124
|
name: "@hasna/skills",
|
|
24125
|
-
version: "0.10.
|
|
24125
|
+
version: "0.10.11",
|
|
24126
24126
|
description: "Skills library for AI coding agents",
|
|
24127
24127
|
type: "module",
|
|
24128
24128
|
bin: {
|
package/bin/worker.js
CHANGED
|
@@ -24125,7 +24125,7 @@ import { randomUUID as randomUUID6 } from "crypto";
|
|
|
24125
24125
|
// package.json
|
|
24126
24126
|
var package_default = {
|
|
24127
24127
|
name: "@hasna/skills",
|
|
24128
|
-
version: "0.10.
|
|
24128
|
+
version: "0.10.11",
|
|
24129
24129
|
description: "Skills library for AI coding agents",
|
|
24130
24130
|
type: "module",
|
|
24131
24131
|
bin: {
|
package/dist/index.js
CHANGED
|
@@ -9611,7 +9611,7 @@ import { isAbsolute as isAbsolute11, join as join23, resolve as resolve11 } from
|
|
|
9611
9611
|
// package.json
|
|
9612
9612
|
var package_default = {
|
|
9613
9613
|
name: "@hasna/skills",
|
|
9614
|
-
version: "0.10.
|
|
9614
|
+
version: "0.10.11",
|
|
9615
9615
|
description: "Skills library for AI coding agents",
|
|
9616
9616
|
type: "module",
|
|
9617
9617
|
bin: {
|
|
@@ -13227,6 +13227,33 @@ function canonicalAgentPath(path, aliases) {
|
|
|
13227
13227
|
const absolute = resolve9(path), binding = aliases.find((item) => absolute === item.alias || absolute.startsWith(item.alias + sep4));
|
|
13228
13228
|
return binding ? join16(binding.target, relative4(binding.alias, absolute)) : absolute;
|
|
13229
13229
|
}
|
|
13230
|
+
function disabledCodexSkillPaths(config, aliases) {
|
|
13231
|
+
const skills = config.skills;
|
|
13232
|
+
if (!skills || typeof skills !== "object" || Array.isArray(skills))
|
|
13233
|
+
return [];
|
|
13234
|
+
const rows = skills.config;
|
|
13235
|
+
if (!Array.isArray(rows))
|
|
13236
|
+
return [];
|
|
13237
|
+
if (rows.some((entry) => !entry || typeof entry !== "object" || Array.isArray(entry) || typeof entry.enabled !== "boolean" || entry.path !== undefined && (typeof entry.path !== "string" || !isAbsolute9(entry.path)) || entry.name !== undefined && typeof entry.name !== "string"))
|
|
13238
|
+
return [];
|
|
13239
|
+
if (rows.some((entry) => entry.name !== undefined))
|
|
13240
|
+
return [];
|
|
13241
|
+
const settings = new Map;
|
|
13242
|
+
for (const entry of rows) {
|
|
13243
|
+
if (typeof entry.path !== "string" || !isAbsolute9(entry.path))
|
|
13244
|
+
continue;
|
|
13245
|
+
let document2;
|
|
13246
|
+
try {
|
|
13247
|
+
document2 = realpathSync3(canonicalAgentPath(entry.path, aliases));
|
|
13248
|
+
} catch {
|
|
13249
|
+
continue;
|
|
13250
|
+
}
|
|
13251
|
+
if (!document2.endsWith(`${sep4}SKILL.md`))
|
|
13252
|
+
continue;
|
|
13253
|
+
settings.set(document2, [...settings.get(document2) ?? [], entry.enabled === false]);
|
|
13254
|
+
}
|
|
13255
|
+
return [...settings].filter(([, values]) => values.length === 1 && values[0] === true).map(([document2]) => dirname10(document2));
|
|
13256
|
+
}
|
|
13230
13257
|
function recheckRootAliases(aliases) {
|
|
13231
13258
|
for (const binding of aliases) {
|
|
13232
13259
|
if (!["claude", "codex"].includes(binding.agent) || binding.alias !== join16(binding.home, `.${binding.agent}`))
|
|
@@ -13336,6 +13363,9 @@ function projectAncestorDirectories(projects) {
|
|
|
13336
13363
|
function inventoryNativeSkills(home = homedir2(), options = {}) {
|
|
13337
13364
|
if (options.reviewedCacheAlias !== undefined && (!options.includeVendor || !isAbsolute9(options.reviewedCacheAlias) || resolve9(options.reviewedCacheAlias) !== options.reviewedCacheAlias))
|
|
13338
13365
|
throw new Error("A reviewed cache alias requires vendor inventory and an exact absolute path");
|
|
13366
|
+
if (options.disabledVendorPaths?.some((path) => !isAbsolute9(path) || resolve9(path) !== path))
|
|
13367
|
+
throw new Error("Disabled vendor paths must be exact absolute paths");
|
|
13368
|
+
const disabledVendorPaths = new Set(options.disabledVendorPaths ?? []);
|
|
13339
13369
|
const aliases = rootAliases(home, options.allowRootAliases);
|
|
13340
13370
|
const selectedAgents = options.agents ? new Set(options.agents) : undefined;
|
|
13341
13371
|
const includesAgent = (agent) => !selectedAgents || selectedAgents.has(agent);
|
|
@@ -13357,7 +13387,7 @@ function inventoryNativeSkills(home = homedir2(), options = {}) {
|
|
|
13357
13387
|
throw new Error("Native skill discovery metadata limit exceeded");
|
|
13358
13388
|
}
|
|
13359
13389
|
let reviewedCacheAliasFound = false;
|
|
13360
|
-
function verifiedSiblingCacheAlias(path, parent) {
|
|
13390
|
+
function verifiedSiblingCacheAlias(agent, path, parent) {
|
|
13361
13391
|
const link = readlinkSync3(path), target = resolve9(parent, link);
|
|
13362
13392
|
if (dirname10(target) !== parent || (isAbsolute9(link) ? link !== target : dirname10(link) !== "."))
|
|
13363
13393
|
return false;
|
|
@@ -13367,6 +13397,9 @@ function inventoryNativeSkills(home = homedir2(), options = {}) {
|
|
|
13367
13397
|
if (!scan?.complete || scan.entries > maxAliasProofEntries)
|
|
13368
13398
|
return false;
|
|
13369
13399
|
if (scan.hasSkills) {
|
|
13400
|
+
const targetSkills = entries.filter((entry) => entry.agent === agent && entry.vendor && (entry.path === target || entry.path.startsWith(target + sep4)));
|
|
13401
|
+
if (agent === "codex" && targetSkills.length > 0 && targetSkills.every((entry) => disabledVendorPaths.has(entry.path)))
|
|
13402
|
+
return true;
|
|
13370
13403
|
if (path !== options.reviewedCacheAlias)
|
|
13371
13404
|
return false;
|
|
13372
13405
|
reviewedCacheAliasFound = true;
|
|
@@ -13428,7 +13461,7 @@ function inventoryNativeSkills(home = homedir2(), options = {}) {
|
|
|
13428
13461
|
const child = join16(path, name);
|
|
13429
13462
|
if (isVendor && lstatSync14(child, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
13430
13463
|
const target = statSync7(child, { throwIfNoEntry: false });
|
|
13431
|
-
if (target?.isFile() || pluginCache && target?.isDirectory() && verifiedSiblingCacheAlias(child, path)) {
|
|
13464
|
+
if (target?.isFile() || pluginCache && target?.isDirectory() && verifiedSiblingCacheAlias(agent, child, path)) {
|
|
13432
13465
|
scan.entries++;
|
|
13433
13466
|
continue;
|
|
13434
13467
|
}
|
|
@@ -13636,7 +13669,8 @@ function planAgentIntegration(options) {
|
|
|
13636
13669
|
}
|
|
13637
13670
|
return resolveAgentDiscovery({ home, agent, reviewed: options.discoveryInputs, retainedReview, canonical: (path) => canonicalAgentPath(path, aliases) });
|
|
13638
13671
|
});
|
|
13639
|
-
const
|
|
13672
|
+
const codexConfig = options.agents.includes("codex") ? Bun.TOML.parse(readOptional(canonicalAgentPath(join16(home, ".codex", "config.toml"), aliases)) ?? "") : {};
|
|
13673
|
+
const nativeSkills = inventoryNativeSkills(home, { includeVendor: true, guardHermes: options.agents.includes("hermes"), agents: options.agents, projectDir: options.projectDir, agentRoots: discoveries.flatMap((binding) => binding.roots.map((path) => ({ agent: binding.agent, path }))), allowRootAliases: options.allowRootAliases, disabledVendorPaths: disabledCodexSkillPaths(codexConfig, aliases) });
|
|
13640
13674
|
const changes = [];
|
|
13641
13675
|
for (const agent of [...new Set(options.agents)]) {
|
|
13642
13676
|
if (!INTEGRATION_AGENTS.includes(agent))
|
|
@@ -14158,7 +14192,7 @@ function assertManagedAgentBridge(agent, options = {}) {
|
|
|
14158
14192
|
} catch (error) {
|
|
14159
14193
|
throw new Error(`NATIVE_SKILL_DRIFT: ${error.message}`);
|
|
14160
14194
|
}
|
|
14161
|
-
const inventory = inventoryNativeSkills(home, { includeVendor: true, guardHermes: agent === "hermes", agents: [agent], projectDirs: [...roots], agentRoots: discovery.roots.map((path) => ({ agent, path })), allowRootAliases: aliases.length > 0 });
|
|
14195
|
+
const inventory = inventoryNativeSkills(home, { includeVendor: true, guardHermes: agent === "hermes", agents: [agent], projectDirs: [...roots], agentRoots: discovery.roots.map((path) => ({ agent, path })), allowRootAliases: aliases.length > 0, disabledVendorPaths: agent === "codex" ? disabledCodexSkillPaths(codexConfig, aliases) : [] });
|
|
14162
14196
|
const unexpected = inventory.filter((entry) => visible(entry) && !entry.bridge && !disabledVendorSkill(entry));
|
|
14163
14197
|
if (unexpected.length) {
|
|
14164
14198
|
const paths = unexpected.slice(0, 3).map((entry) => {
|
|
@@ -86,6 +86,7 @@ export declare function inventoryNativeSkills(home?: string, options?: {
|
|
|
86
86
|
discoveryInputs?: ReviewedDiscoveryInputs;
|
|
87
87
|
allowRootAliases?: boolean;
|
|
88
88
|
reviewedCacheAlias?: string;
|
|
89
|
+
disabledVendorPaths?: readonly string[];
|
|
89
90
|
}): NativeSkillEntry[];
|
|
90
91
|
/** Planning is read-only; credentials and unrelated settings never appear in CLI output. */
|
|
91
92
|
export declare function planAgentIntegration(options: {
|
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.11",
|
|
32377
32377
|
description: "Skills library for AI coding agents",
|
|
32378
32378
|
type: "module",
|
|
32379
32379
|
bin: {
|
|
@@ -41100,6 +41100,33 @@ function canonicalAgentPath(path, aliases) {
|
|
|
41100
41100
|
const absolute = resolve14(path), binding = aliases.find((item) => absolute === item.alias || absolute.startsWith(item.alias + sep4));
|
|
41101
41101
|
return binding ? join21(binding.target, relative3(binding.alias, absolute)) : absolute;
|
|
41102
41102
|
}
|
|
41103
|
+
function disabledCodexSkillPaths(config, aliases) {
|
|
41104
|
+
const skills = config.skills;
|
|
41105
|
+
if (!skills || typeof skills !== "object" || Array.isArray(skills))
|
|
41106
|
+
return [];
|
|
41107
|
+
const rows = skills.config;
|
|
41108
|
+
if (!Array.isArray(rows))
|
|
41109
|
+
return [];
|
|
41110
|
+
if (rows.some((entry) => !entry || typeof entry !== "object" || Array.isArray(entry) || typeof entry.enabled !== "boolean" || entry.path !== undefined && (typeof entry.path !== "string" || !isAbsolute15(entry.path)) || entry.name !== undefined && typeof entry.name !== "string"))
|
|
41111
|
+
return [];
|
|
41112
|
+
if (rows.some((entry) => entry.name !== undefined))
|
|
41113
|
+
return [];
|
|
41114
|
+
const settings = new Map;
|
|
41115
|
+
for (const entry of rows) {
|
|
41116
|
+
if (typeof entry.path !== "string" || !isAbsolute15(entry.path))
|
|
41117
|
+
continue;
|
|
41118
|
+
let document2;
|
|
41119
|
+
try {
|
|
41120
|
+
document2 = realpathSync4(canonicalAgentPath(entry.path, aliases));
|
|
41121
|
+
} catch {
|
|
41122
|
+
continue;
|
|
41123
|
+
}
|
|
41124
|
+
if (!document2.endsWith(`${sep4}SKILL.md`))
|
|
41125
|
+
continue;
|
|
41126
|
+
settings.set(document2, [...settings.get(document2) ?? [], entry.enabled === false]);
|
|
41127
|
+
}
|
|
41128
|
+
return [...settings].filter(([, values]) => values.length === 1 && values[0] === true).map(([document2]) => dirname14(document2));
|
|
41129
|
+
}
|
|
41103
41130
|
function recheckRootAliases(aliases) {
|
|
41104
41131
|
for (const binding of aliases) {
|
|
41105
41132
|
if (!["claude", "codex"].includes(binding.agent) || binding.alias !== join21(binding.home, `.${binding.agent}`))
|
|
@@ -41209,6 +41236,9 @@ function projectAncestorDirectories(projects) {
|
|
|
41209
41236
|
function inventoryNativeSkills(home = homedir3(), options = {}) {
|
|
41210
41237
|
if (options.reviewedCacheAlias !== undefined && (!options.includeVendor || !isAbsolute15(options.reviewedCacheAlias) || resolve14(options.reviewedCacheAlias) !== options.reviewedCacheAlias))
|
|
41211
41238
|
throw new Error("A reviewed cache alias requires vendor inventory and an exact absolute path");
|
|
41239
|
+
if (options.disabledVendorPaths?.some((path) => !isAbsolute15(path) || resolve14(path) !== path))
|
|
41240
|
+
throw new Error("Disabled vendor paths must be exact absolute paths");
|
|
41241
|
+
const disabledVendorPaths = new Set(options.disabledVendorPaths ?? []);
|
|
41212
41242
|
const aliases = rootAliases(home, options.allowRootAliases);
|
|
41213
41243
|
const selectedAgents = options.agents ? new Set(options.agents) : undefined;
|
|
41214
41244
|
const includesAgent = (agent) => !selectedAgents || selectedAgents.has(agent);
|
|
@@ -41230,7 +41260,7 @@ function inventoryNativeSkills(home = homedir3(), options = {}) {
|
|
|
41230
41260
|
throw new Error("Native skill discovery metadata limit exceeded");
|
|
41231
41261
|
}
|
|
41232
41262
|
let reviewedCacheAliasFound = false;
|
|
41233
|
-
function verifiedSiblingCacheAlias(path, parent) {
|
|
41263
|
+
function verifiedSiblingCacheAlias(agent, path, parent) {
|
|
41234
41264
|
const link = readlinkSync3(path), target = resolve14(parent, link);
|
|
41235
41265
|
if (dirname14(target) !== parent || (isAbsolute15(link) ? link !== target : dirname14(link) !== "."))
|
|
41236
41266
|
return false;
|
|
@@ -41240,6 +41270,9 @@ function inventoryNativeSkills(home = homedir3(), options = {}) {
|
|
|
41240
41270
|
if (!scan?.complete || scan.entries > maxAliasProofEntries)
|
|
41241
41271
|
return false;
|
|
41242
41272
|
if (scan.hasSkills) {
|
|
41273
|
+
const targetSkills = entries.filter((entry) => entry.agent === agent && entry.vendor && (entry.path === target || entry.path.startsWith(target + sep4)));
|
|
41274
|
+
if (agent === "codex" && targetSkills.length > 0 && targetSkills.every((entry) => disabledVendorPaths.has(entry.path)))
|
|
41275
|
+
return true;
|
|
41243
41276
|
if (path !== options.reviewedCacheAlias)
|
|
41244
41277
|
return false;
|
|
41245
41278
|
reviewedCacheAliasFound = true;
|
|
@@ -41301,7 +41334,7 @@ function inventoryNativeSkills(home = homedir3(), options = {}) {
|
|
|
41301
41334
|
const child = join21(path, name);
|
|
41302
41335
|
if (isVendor && lstatSync18(child, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
41303
41336
|
const target = statSync5(child, { throwIfNoEntry: false });
|
|
41304
|
-
if (target?.isFile() || pluginCache && target?.isDirectory() && verifiedSiblingCacheAlias(child, path)) {
|
|
41337
|
+
if (target?.isFile() || pluginCache && target?.isDirectory() && verifiedSiblingCacheAlias(agent, child, path)) {
|
|
41305
41338
|
scan.entries++;
|
|
41306
41339
|
continue;
|
|
41307
41340
|
}
|
|
@@ -41509,7 +41542,8 @@ function planAgentIntegration(options) {
|
|
|
41509
41542
|
}
|
|
41510
41543
|
return resolveAgentDiscovery({ home, agent, reviewed: options.discoveryInputs, retainedReview, canonical: (path) => canonicalAgentPath(path, aliases) });
|
|
41511
41544
|
});
|
|
41512
|
-
const
|
|
41545
|
+
const codexConfig = options.agents.includes("codex") ? Bun.TOML.parse(readOptional(canonicalAgentPath(join21(home, ".codex", "config.toml"), aliases)) ?? "") : {};
|
|
41546
|
+
const nativeSkills = inventoryNativeSkills(home, { includeVendor: true, guardHermes: options.agents.includes("hermes"), agents: options.agents, projectDir: options.projectDir, agentRoots: discoveries.flatMap((binding) => binding.roots.map((path) => ({ agent: binding.agent, path }))), allowRootAliases: options.allowRootAliases, disabledVendorPaths: disabledCodexSkillPaths(codexConfig, aliases) });
|
|
41513
41547
|
const changes = [];
|
|
41514
41548
|
for (const agent of [...new Set(options.agents)]) {
|
|
41515
41549
|
if (!INTEGRATION_AGENTS.includes(agent))
|
|
@@ -42031,7 +42065,7 @@ function assertManagedAgentBridge(agent, options = {}) {
|
|
|
42031
42065
|
} catch (error) {
|
|
42032
42066
|
throw new Error(`NATIVE_SKILL_DRIFT: ${error.message}`);
|
|
42033
42067
|
}
|
|
42034
|
-
const inventory = inventoryNativeSkills(home, { includeVendor: true, guardHermes: agent === "hermes", agents: [agent], projectDirs: [...roots], agentRoots: discovery.roots.map((path) => ({ agent, path })), allowRootAliases: aliases.length > 0 });
|
|
42068
|
+
const inventory = inventoryNativeSkills(home, { includeVendor: true, guardHermes: agent === "hermes", agents: [agent], projectDirs: [...roots], agentRoots: discovery.roots.map((path) => ({ agent, path })), allowRootAliases: aliases.length > 0, disabledVendorPaths: agent === "codex" ? disabledCodexSkillPaths(codexConfig, aliases) : [] });
|
|
42035
42069
|
const unexpected = inventory.filter((entry) => visible(entry) && !entry.bridge && !disabledVendorSkill(entry));
|
|
42036
42070
|
if (unexpected.length) {
|
|
42037
42071
|
const paths = unexpected.slice(0, 3).map((entry) => {
|