@hasna/skills 0.10.9 → 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 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.9",
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 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 });
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) => {
@@ -107440,8 +107474,12 @@ function resolveRuntimeLayout(homeInput, pathInput) {
107440
107474
  throw new Error("ACTIVE_RUNTIME_ENTRYPOINT_MISMATCH");
107441
107475
  }
107442
107476
  const launchers = [];
107477
+ const seenDirectories = new Set;
107443
107478
  for (const rawDir of pathInput.split(delimiter).filter(Boolean)) {
107444
107479
  const dir = resolve22(rawDir);
107480
+ if (seenDirectories.has(dir))
107481
+ continue;
107482
+ seenDirectories.add(dir);
107445
107483
  for (const [name, target] of Object.entries(current.bins)) {
107446
107484
  const path = join54(dir, name);
107447
107485
  if (!existsSync33(path))
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.9",
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
@@ -7,7 +7,7 @@ import { join as join5 } from "path";
7
7
  // package.json
8
8
  var package_default = {
9
9
  name: "@hasna/skills",
10
- version: "0.10.9",
10
+ version: "0.10.11",
11
11
  description: "Skills library for AI coding agents",
12
12
  type: "module",
13
13
  bin: {
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.9",
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.9",
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.9",
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 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 });
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.9",
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 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 });
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) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/skills",
3
- "version": "0.10.9",
3
+ "version": "0.10.11",
4
4
  "description": "Skills library for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {