agents-inc 0.170.1 → 0.171.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.
Files changed (163) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/{chunk-52HDHJ7I.js → chunk-24OD7IP4.js} +32 -21
  3. package/dist/chunk-24OD7IP4.js.map +1 -0
  4. package/dist/{chunk-MQ6CGZNJ.js → chunk-3YYHL76L.js} +1879 -2019
  5. package/dist/chunk-3YYHL76L.js.map +1 -0
  6. package/dist/chunk-4RQKCV6I.js +103 -0
  7. package/dist/chunk-4RQKCV6I.js.map +1 -0
  8. package/dist/{chunk-USVBYQSQ.js → chunk-5FM77WKW.js} +16 -6
  9. package/dist/chunk-5FM77WKW.js.map +1 -0
  10. package/dist/{chunk-HED2DAXZ.js → chunk-7IVLVEHX.js} +5 -5
  11. package/dist/chunk-7IVLVEHX.js.map +1 -0
  12. package/dist/{chunk-PJWGTNOX.js → chunk-A6OWEJGC.js} +144 -186
  13. package/dist/chunk-A6OWEJGC.js.map +1 -0
  14. package/dist/{chunk-BMRUNMPV.js → chunk-AWWCRL5A.js} +35 -35
  15. package/dist/chunk-AWWCRL5A.js.map +1 -0
  16. package/dist/{chunk-F2BHT5C4.js → chunk-EOKNEGRD.js} +129 -151
  17. package/dist/chunk-EOKNEGRD.js.map +1 -0
  18. package/dist/{chunk-NQW25DCF.js → chunk-GHHJYNAN.js} +1 -7
  19. package/dist/chunk-GHHJYNAN.js.map +1 -0
  20. package/dist/chunk-JGPE4RRE.js +35 -0
  21. package/dist/chunk-JGPE4RRE.js.map +1 -0
  22. package/dist/{chunk-JFLVEFFP.js → chunk-KIK5EZYD.js} +1 -1
  23. package/dist/chunk-KIK5EZYD.js.map +1 -0
  24. package/dist/{chunk-NCWDK6L7.js → chunk-KMOCMVK5.js} +254 -379
  25. package/dist/chunk-KMOCMVK5.js.map +1 -0
  26. package/dist/{chunk-4AAOOAIN.js → chunk-P6CYS4JK.js} +2 -2
  27. package/dist/chunk-P6CYS4JK.js.map +1 -0
  28. package/dist/chunk-QIR56IDM.js +1169 -0
  29. package/dist/chunk-QIR56IDM.js.map +1 -0
  30. package/dist/{chunk-6ZRH5RHC.js → chunk-R572RLTI.js} +4 -4
  31. package/dist/chunk-R572RLTI.js.map +1 -0
  32. package/dist/{chunk-WTWMGH2C.js → chunk-RDXY4GRO.js} +2 -2
  33. package/dist/chunk-RDXY4GRO.js.map +1 -0
  34. package/dist/{chunk-7RDMTR64.js → chunk-S2SKVJT2.js} +785 -256
  35. package/dist/chunk-S2SKVJT2.js.map +1 -0
  36. package/dist/{chunk-SZYQISA2.js → chunk-TNFYBKVD.js} +43 -29
  37. package/dist/chunk-TNFYBKVD.js.map +1 -0
  38. package/dist/{chunk-RIPSGNLU.js → chunk-W4KAY26P.js} +3 -3
  39. package/dist/chunk-W4KAY26P.js.map +1 -0
  40. package/dist/{chunk-OYJQUA3D.js → chunk-WDH6HHA3.js} +31 -13
  41. package/dist/chunk-WDH6HHA3.js.map +1 -0
  42. package/dist/{chunk-3G7X2WKI.js → chunk-WII6GOPM.js} +18 -38
  43. package/dist/chunk-WII6GOPM.js.map +1 -0
  44. package/dist/{chunk-F5EBEATU.js → chunk-WM2N2D6Q.js} +34 -46
  45. package/dist/chunk-WM2N2D6Q.js.map +1 -0
  46. package/dist/{chunk-KOLDW6SF.js → chunk-YLUOGAW7.js} +2 -2
  47. package/dist/chunk-YLUOGAW7.js.map +1 -0
  48. package/dist/{chunk-44TE3RKH.js → chunk-ZC6GC66J.js} +5 -4
  49. package/dist/chunk-ZC6GC66J.js.map +1 -0
  50. package/dist/{chunk-NEZ4OAOL.js → chunk-ZEGM3MVR.js} +3 -5
  51. package/dist/chunk-ZEGM3MVR.js.map +1 -0
  52. package/dist/commands/build/marketplace.js +46 -46
  53. package/dist/commands/build/marketplace.js.map +1 -1
  54. package/dist/commands/build/plugins.js +25 -28
  55. package/dist/commands/build/plugins.js.map +1 -1
  56. package/dist/commands/compile.js +87 -178
  57. package/dist/commands/compile.js.map +1 -1
  58. package/dist/commands/doctor.js +510 -360
  59. package/dist/commands/doctor.js.map +1 -1
  60. package/dist/commands/edit.js +451 -357
  61. package/dist/commands/edit.js.map +1 -1
  62. package/dist/commands/eject.js +144 -125
  63. package/dist/commands/eject.js.map +1 -1
  64. package/dist/commands/init.js +20 -27
  65. package/dist/commands/list.js +39 -55
  66. package/dist/commands/list.js.map +1 -1
  67. package/dist/commands/new/marketplace.js +6 -11
  68. package/dist/commands/new/marketplace.js.map +1 -1
  69. package/dist/commands/search.js +35 -32
  70. package/dist/commands/search.js.map +1 -1
  71. package/dist/commands/share.js +17 -77
  72. package/dist/commands/share.js.map +1 -1
  73. package/dist/commands/uninstall.js +159 -222
  74. package/dist/commands/uninstall.js.map +1 -1
  75. package/dist/commands/update.js +9 -32
  76. package/dist/commands/update.js.map +1 -1
  77. package/dist/components/common/prompt-confirm.js +2 -2
  78. package/dist/components/common/removal-plan-confirm.js +2 -2
  79. package/dist/components/common/scroll-affordance.js +2 -2
  80. package/dist/components/common/select-list.js +2 -2
  81. package/dist/components/common/skill-agent-summary.js +4 -4
  82. package/dist/components/common/spinner.js +2 -4
  83. package/dist/components/common/summary-panel.js +5 -5
  84. package/dist/components/common/summary-panel.js.map +1 -1
  85. package/dist/config-exports.js +7 -3
  86. package/dist/config-exports.js.map +1 -1
  87. package/dist/hooks/init.js +18 -19
  88. package/dist/hooks/init.js.map +1 -1
  89. package/dist/index.js.map +1 -1
  90. package/dist/load-agent-defs-UBWITIEI.js +14 -0
  91. package/dist/recompile-project-agents-IQANWGOP.js +65 -0
  92. package/dist/recompile-project-agents-IQANWGOP.js.map +1 -0
  93. package/dist/{source-loader-C5SQXZXI.js → source-loader-YGG7DY2W.js} +5 -5
  94. package/dist/src/agents/developer/ai-developer/playbook.md +2 -5
  95. package/dist/src/agents/developer/api-developer/playbook.md +2 -5
  96. package/dist/src/agents/developer/cli-developer/playbook.md +2 -5
  97. package/dist/src/agents/developer/web-developer/playbook.md +2 -5
  98. package/dist/src/agents/meta/agent-summoner/output.md +2 -2
  99. package/dist/src/agents/meta/agent-summoner/playbook.md +1 -13
  100. package/dist/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  101. package/dist/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  102. package/dist/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  103. package/dist/src/agents/tester/ai-tester/playbook.md +2 -0
  104. package/dist/src/agents/tester/api-tester/critical-requirements.md +1 -2
  105. package/dist/src/agents/tester/api-tester/playbook.md +2 -0
  106. package/dist/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  107. package/dist/src/agents/tester/cli-tester/playbook.md +2 -0
  108. package/dist/src/agents/tester/web-tester/critical-requirements.md +1 -2
  109. package/dist/src/agents/tester/web-tester/playbook.md +2 -0
  110. package/package.json +9 -8
  111. package/src/agents/developer/ai-developer/playbook.md +2 -5
  112. package/src/agents/developer/api-developer/playbook.md +2 -5
  113. package/src/agents/developer/cli-developer/playbook.md +2 -5
  114. package/src/agents/developer/web-developer/playbook.md +2 -5
  115. package/src/agents/meta/agent-summoner/output.md +2 -2
  116. package/src/agents/meta/agent-summoner/playbook.md +1 -13
  117. package/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  118. package/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  119. package/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  120. package/src/agents/tester/ai-tester/playbook.md +2 -0
  121. package/src/agents/tester/api-tester/critical-requirements.md +1 -2
  122. package/src/agents/tester/api-tester/playbook.md +2 -0
  123. package/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  124. package/src/agents/tester/cli-tester/playbook.md +2 -0
  125. package/src/agents/tester/web-tester/critical-requirements.md +1 -2
  126. package/src/agents/tester/web-tester/playbook.md +2 -0
  127. package/src/schemas/project-config.schema.json +0 -3
  128. package/src/schemas/project-source-config.schema.json +0 -6
  129. package/dist/chunk-3G7X2WKI.js.map +0 -1
  130. package/dist/chunk-44TE3RKH.js.map +0 -1
  131. package/dist/chunk-4AAOOAIN.js.map +0 -1
  132. package/dist/chunk-52HDHJ7I.js.map +0 -1
  133. package/dist/chunk-6HNXYYVF.js +0 -373
  134. package/dist/chunk-6HNXYYVF.js.map +0 -1
  135. package/dist/chunk-6ZRH5RHC.js.map +0 -1
  136. package/dist/chunk-7RDMTR64.js.map +0 -1
  137. package/dist/chunk-BMRUNMPV.js.map +0 -1
  138. package/dist/chunk-CLPUWOSA.js +0 -46
  139. package/dist/chunk-CLPUWOSA.js.map +0 -1
  140. package/dist/chunk-F2BHT5C4.js.map +0 -1
  141. package/dist/chunk-F5EBEATU.js.map +0 -1
  142. package/dist/chunk-HED2DAXZ.js.map +0 -1
  143. package/dist/chunk-JFLVEFFP.js.map +0 -1
  144. package/dist/chunk-KOLDW6SF.js.map +0 -1
  145. package/dist/chunk-MQ6CGZNJ.js.map +0 -1
  146. package/dist/chunk-NCWDK6L7.js.map +0 -1
  147. package/dist/chunk-NEZ4OAOL.js.map +0 -1
  148. package/dist/chunk-NIHUOWE4.js +0 -106
  149. package/dist/chunk-NIHUOWE4.js.map +0 -1
  150. package/dist/chunk-NQW25DCF.js.map +0 -1
  151. package/dist/chunk-OYJQUA3D.js.map +0 -1
  152. package/dist/chunk-PJWGTNOX.js.map +0 -1
  153. package/dist/chunk-RIPSGNLU.js.map +0 -1
  154. package/dist/chunk-SZYQISA2.js.map +0 -1
  155. package/dist/chunk-USVBYQSQ.js.map +0 -1
  156. package/dist/chunk-V3KTSP3Q.js +0 -940
  157. package/dist/chunk-V3KTSP3Q.js.map +0 -1
  158. package/dist/chunk-WTWMGH2C.js.map +0 -1
  159. package/dist/load-agent-defs-YMDWBFDP.js +0 -14
  160. package/dist/recompile-project-agents-SZ76WNTW.js +0 -18
  161. package/dist/source-loader-C5SQXZXI.js.map +0 -1
  162. /package/dist/{load-agent-defs-YMDWBFDP.js.map → load-agent-defs-UBWITIEI.js.map} +0 -0
  163. /package/dist/{recompile-project-agents-SZ76WNTW.js.map → source-loader-YGG7DY2W.js.map} +0 -0
@@ -27,14 +27,12 @@ import {
27
27
  resolveInstallPaths,
28
28
  sourceFolderInUse,
29
29
  sourceFolderName,
30
- verbose,
31
- writeFile
32
- } from "./chunk-MQ6CGZNJ.js";
33
- import {
34
30
  typedEntries,
35
31
  typedFromEntries,
36
- typedKeys
37
- } from "./chunk-52HDHJ7I.js";
32
+ typedKeys,
33
+ verbose,
34
+ writeFile
35
+ } from "./chunk-3YYHL76L.js";
38
36
  import {
39
37
  CLAUDE_DIR,
40
38
  DIRS,
@@ -42,7 +40,7 @@ import {
42
40
  STANDARD_DIRS,
43
41
  STANDARD_FILES,
44
42
  effectivelyExcludedSkillIds
45
- } from "./chunk-PJWGTNOX.js";
43
+ } from "./chunk-A6OWEJGC.js";
46
44
 
47
45
  // src/cli/lib/agents/list-compiled-agents.ts
48
46
  import path from "path";
@@ -60,18 +58,18 @@ async function splitAgentsByProvenance(agentsDir, codec = CLAUDE_AGENTS) {
60
58
  files.map((file) => readAgentProvenance(agentsDir, file, codec))
61
59
  );
62
60
  const [marked, unmarked] = partition(classified, (agent) => agent.compiledHere);
63
- return { marked: marked.map(agentName), unmarked: unmarked.map(agentName) };
61
+ return {
62
+ marked: marked.map((agent) => agent.name),
63
+ unmarked: unmarked.map((agent) => agent.name)
64
+ };
64
65
  }
65
66
  async function readAgentProvenance(agentsDir, file, codec) {
66
67
  const content = await readFileOptional(path.join(agentsDir, file));
67
68
  return { name: path.basename(file, codec.extension), compiledHere: codec.hasMarker(content) };
68
69
  }
69
- function agentName(agent) {
70
- return agent.name;
71
- }
72
70
  async function listCompiledAgentNames(agentsDir) {
73
71
  const files = await listAgentMdFiles(agentsDir);
74
- return files.map((f) => path.basename(f, ".md"));
72
+ return files.map((f) => path.basename(f, CLAUDE_AGENTS.extension));
75
73
  }
76
74
  async function pruneStaleCompiledAgents(agentsDir, keep, codec = CLAUDE_AGENTS) {
77
75
  const isStaleCompiledAgent = (file) => {
@@ -195,9 +193,7 @@ async function holdsExactly(filePath, content) {
195
193
  var UNROUTED_AGENT_SCOPE = "project";
196
194
  async function writeCompiledAgentsByScope(params) {
197
195
  const hosts = {
198
- // Each scope reads its OWN root, the way `resolveInstallPaths` reads one beside this: a
199
- // project on Codex under a global on Claude is an arrangement this product allows, and one
200
- // provider answered for both scopes is how a pass writes the wrong format into one of them.
196
+ // Each scope reads its own root: a Codex project under a Claude global is allowed.
201
197
  global: {
202
198
  provider: providerInUse(os.homedir()),
203
199
  agentsDir: resolveInstallPaths(os.homedir(), "global").agentsDir
@@ -288,8 +284,8 @@ function filterExcludedEntries(config) {
288
284
  }
289
285
  function withoutExcludedAssignments(stack, excludedIds) {
290
286
  return Object.fromEntries(
291
- typedEntries(stack).map(([agentName2, agentStack]) => [
292
- agentName2,
287
+ typedEntries(stack).map(([agentName, agentStack]) => [
288
+ agentName,
293
289
  Object.fromEntries(
294
290
  typedEntries(agentStack).map(([category, assignments]) => [
295
291
  category,
@@ -302,15 +298,8 @@ function withoutExcludedAssignments(stack, excludedIds) {
302
298
  async function recompileAgents(options) {
303
299
  const { pluginDir, sourcePath, skills: providedSkills, projectDir, outputDir } = options;
304
300
  const configDir = projectDir ?? pluginDir;
305
- const loadedConfig = await loadProjectConfig(configDir);
306
- const projectConfig = loadedConfig?.config ?? null;
307
- const filteredConfig = projectConfig ? filterExcludedEntries(projectConfig) : null;
308
- const builtinAgents = await loadAllAgents(sourcePath);
309
- const projectAgents = projectDir ? await loadProjectAgents(projectDir) : {};
310
- const allAgents = {
311
- ...builtinAgents,
312
- ...projectAgents
313
- };
301
+ const filteredConfig = await loadConfigWithoutExclusions(configDir);
302
+ const allAgents = await loadAgentDefinitions(sourcePath, projectDir);
314
303
  const agentNames = await resolveAgentNames({
315
304
  ...options.agents !== void 0 && { specifiedAgents: options.agents },
316
305
  projectConfig: filteredConfig,
@@ -328,13 +317,9 @@ async function recompileAgents(options) {
328
317
  filteredConfig,
329
318
  allAgents
330
319
  );
331
- const compileConfig = {
332
- name: filteredConfig?.name || path5.basename(pluginDir),
333
- description: filteredConfig?.description || "Recompiled plugin",
334
- agents: configAgents
335
- };
320
+ const compileConfig = compileConfigFor(filteredConfig, configAgents, pluginDir);
336
321
  const engine = await createLiquidEngine(projectDir);
337
- const resolvedAgents = await resolveAgents(allAgents, pluginSkills, compileConfig, sourcePath);
322
+ const resolvedAgents = await resolveAgents(allAgents, pluginSkills, compileConfig);
338
323
  const agentsDir = outputDir ?? getPluginAgentsDir(pluginDir);
339
324
  await ensureDir(agentsDir);
340
325
  const outcomes = await writeCompiledAgentsByScope({
@@ -342,13 +327,28 @@ async function recompileAgents(options) {
342
327
  sourcePath,
343
328
  engine,
344
329
  projectAgentsDir: agentsDir,
345
- // The same root this pass loaded its config from, so the provider that decides the FORMAT
346
- // and the provider that decided the configuration are read off one installation.
330
+ // Same root as the config, so format and configuration come from one installation.
347
331
  projectDir: configDir,
348
332
  ...options.agentScopeMap !== void 0 && { agentScopeMap: options.agentScopeMap }
349
333
  });
350
334
  return buildRecompileResult(outcomes, missingWarnings);
351
335
  }
336
+ async function loadConfigWithoutExclusions(configDir) {
337
+ const loaded = await loadProjectConfig(configDir);
338
+ return loaded ? filterExcludedEntries(loaded.config) : null;
339
+ }
340
+ async function loadAgentDefinitions(sourcePath, projectDir) {
341
+ const builtinAgents = await loadAllAgents(sourcePath);
342
+ const projectAgents = projectDir ? await loadProjectAgents(projectDir) : {};
343
+ return { ...builtinAgents, ...projectAgents };
344
+ }
345
+ function compileConfigFor(config, agents, pluginDir) {
346
+ return {
347
+ name: config?.name || path5.basename(pluginDir),
348
+ description: config?.description || "Recompiled plugin",
349
+ agents
350
+ };
351
+ }
352
352
  function compileEntriesFor(agentNames, config, allAgents) {
353
353
  const allConfigAgents = config ? buildCompileAgents(config, allAgents) : {};
354
354
  const [knownAgents, missingAgents] = partition2(
@@ -372,4 +372,4 @@ export {
372
372
  withoutExcludedAssignments,
373
373
  recompileAgents
374
374
  };
375
- //# sourceMappingURL=chunk-BMRUNMPV.js.map
375
+ //# sourceMappingURL=chunk-AWWCRL5A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/agents/list-compiled-agents.ts","../src/cli/lib/agents/agent-recompiler.ts","../src/cli/lib/agents/write-compiled-agents.ts","../src/cli/lib/compiler.ts","../src/cli/lib/agents/agent-provenance.ts"],"sourcesContent":["import path from \"path\";\nimport { partition } from \"remeda\";\nimport { glob, readFileOptional, remove } from \"../../utils/fs\";\nimport { isAgentName } from \"../../utils/type-guards\";\nimport { type AgentCodec, agentCodec } from \"../installation/install-layout\";\nimport type { AgentName } from \"../../types\";\n\n/**\n * The default codec; a caller on another host passes that host's\n * (`agentCodec(providerInUse(dir))`).\n */\nconst CLAUDE_AGENTS = agentCodec(\"claude\");\n\ntype AgentProvenanceSplit = {\n marked: string[];\n unmarked: string[];\n};\n\nexport async function listAgentMdFiles(agentsDir: string): Promise<string[]> {\n return listAgentFilesOf(agentsDir, CLAUDE_AGENTS);\n}\n\nexport async function listAgentFilesOf(agentsDir: string, codec: AgentCodec): Promise<string[]> {\n return glob(codec.listGlob, agentsDir);\n}\n\n/** An unreadable file lands in `unmarked`: \"cannot prove it is ours\" means leave it alone. */\nexport async function splitAgentsByProvenance(\n agentsDir: string,\n codec: AgentCodec = CLAUDE_AGENTS,\n): Promise<AgentProvenanceSplit> {\n const files = await listAgentFilesOf(agentsDir, codec);\n const classified = await Promise.all(\n files.map((file) => readAgentProvenance(agentsDir, file, codec)),\n );\n const [marked, unmarked] = partition(classified, (agent) => agent.compiledHere);\n\n return {\n marked: marked.map((agent) => agent.name),\n unmarked: unmarked.map((agent) => agent.name),\n };\n}\n\ntype ClassifiedAgent = { name: string; compiledHere: boolean };\n\nasync function readAgentProvenance(\n agentsDir: string,\n file: string,\n codec: AgentCodec,\n): Promise<ClassifiedAgent> {\n const content = await readFileOptional(path.join(agentsDir, file));\n return { name: path.basename(file, codec.extension), compiledHere: codec.hasMarker(content) };\n}\n\nexport async function listCompiledAgentNames(agentsDir: string): Promise<AgentName[]> {\n const files = await listAgentMdFiles(agentsDir);\n // Boundary cast: custom marketplace agents may fall outside the AgentName union.\n return files.map((f) => path.basename(f, CLAUDE_AGENTS.extension) as AgentName);\n}\n\n/**\n * Deletes built-in-named agent files not in `keep`, which must be the complete set for `agentsDir`.\n */\nexport async function pruneStaleCompiledAgents(\n agentsDir: string,\n keep: ReadonlySet<AgentName>,\n codec: AgentCodec = CLAUDE_AGENTS,\n): Promise<void> {\n const isStaleCompiledAgent = (file: string): boolean => {\n const name = path.basename(file, codec.extension);\n return isAgentName(name) && !keep.has(name);\n };\n\n const files = await listAgentFilesOf(agentsDir, codec);\n await Promise.all(\n files.filter(isStaleCompiledAgent).map((file) => remove(path.join(agentsDir, file))),\n );\n}\n","import { partition } from \"remeda\";\nimport { writeCompiledAgentsByScope, type AgentWriteOutcome } from \"./write-compiled-agents\";\nimport { listCompiledAgentNames } from \"./list-compiled-agents\";\nimport path from \"path\";\n\nimport { getErrorMessage } from \"../../utils/errors\";\nimport type {\n AgentDefinition,\n AgentName,\n CompileAgentConfig,\n CompileConfig,\n ProjectConfig,\n SkillDefinitionMap,\n SkillId,\n SkillScope,\n} from \"../../types\";\n\nimport { buildCompileAgents } from \"../installation/local-installer\";\nimport { ensureDir } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { typedEntries, typedFromEntries, typedKeys } from \"../../utils/typed-object\";\nimport { createLiquidEngine } from \"../compiler\";\nimport { loadProjectConfig, effectivelyExcludedSkillIds } from \"../configuration\";\nimport { loadAllAgents, loadProjectAgents } from \"../loading\";\nimport { getPluginAgentsDir } from \"../plugins\";\nimport { discoverAllPluginSkills } from \"../plugins/plugin-discovery\";\nimport { resolveAgents } from \"../resolver\";\n\nexport type RecompileAgentsOptions = {\n pluginDir: string;\n sourcePath: string;\n agents?: AgentName[];\n skills?: SkillDefinitionMap;\n projectDir?: string;\n outputDir?: string;\n /** When provided, routes agents by scope: global agents to ~/.claude/agents/, project agents to outputDir */\n agentScopeMap?: Map<AgentName, SkillScope>;\n};\n\nexport type RecompileAgentsResult = {\n compiled: AgentName[];\n /** The subset of `compiled` whose file content moved; the rest count as unchanged. */\n rewritten: AgentName[];\n failed: AgentName[];\n warnings: string[];\n};\n\nasync function getExistingAgentNames(pluginDir: string): Promise<AgentName[]> {\n return listCompiledAgentNames(getPluginAgentsDir(pluginDir));\n}\n\ntype ResolveAgentNamesParams = {\n specifiedAgents?: AgentName[];\n projectConfig: ProjectConfig | null;\n allAgents: Partial<Record<AgentName, AgentDefinition>>;\n outputDir?: string;\n pluginDir: string;\n};\n\nasync function resolveAgentNames(params: ResolveAgentNamesParams): Promise<AgentName[]> {\n const { specifiedAgents, projectConfig, allAgents, outputDir, pluginDir } = params;\n\n if (specifiedAgents) {\n return specifiedAgents;\n }\n\n // A present config is authoritative even when its roster is empty.\n if (projectConfig) {\n const agentNames = projectConfig.agents.map((a) => a.name);\n verbose(`Using agents from config: ${agentNames.join(\", \")}`);\n return agentNames;\n }\n\n if (outputDir) {\n const names = typedKeys<AgentName>(allAgents);\n verbose(`Using all available agents from source: ${names.join(\", \")}`);\n return names;\n }\n\n return getExistingAgentNames(pluginDir);\n}\n\nfunction buildRecompileResult(\n outcomes: AgentWriteOutcome[],\n priorWarnings: string[],\n): RecompileAgentsResult {\n const [succeeded, failedOutcomes] = partition(\n outcomes,\n (outcome): outcome is Extract<AgentWriteOutcome, { ok: true }> => outcome.ok,\n );\n succeeded.forEach((outcome) =>\n verbose(\n ` ${outcome.rewritten ? \"Rewrote\" : \"Unchanged\"}: ${outcome.name} (${outcome.scope} -> ${outcome.targetDir})`,\n ),\n );\n return {\n compiled: succeeded.map((outcome) => outcome.name),\n rewritten: succeeded.filter((outcome) => outcome.rewritten).map((outcome) => outcome.name),\n failed: failedOutcomes.map((outcome) => outcome.name),\n warnings: [\n ...priorWarnings,\n ...failedOutcomes.map(\n (outcome) => `Failed to compile ${outcome.name}: ${getErrorMessage(outcome.error)}`,\n ),\n ],\n };\n}\n\nexport function filterExcludedEntries(config: ProjectConfig): ProjectConfig {\n const excludedIds = effectivelyExcludedSkillIds(config.skills);\n const activeSkills = config.skills.filter((s) => !s.excluded);\n const activeAgents = config.agents.filter((a) => !a.excluded);\n\n // No stack stays absent rather than an explicit `undefined`.\n const filteredStack =\n config.stack === undefined\n ? {}\n : { stack: withoutExcludedAssignments(config.stack, excludedIds) };\n\n return { ...config, skills: activeSkills, agents: activeAgents, ...filteredStack };\n}\n\n/** Each agent and category keeps its key, even when left with no assignments. */\nexport function withoutExcludedAssignments(\n stack: NonNullable<ProjectConfig[\"stack\"]>,\n excludedIds: ReadonlySet<SkillId>,\n): NonNullable<ProjectConfig[\"stack\"]> {\n return Object.fromEntries(\n typedEntries(stack).map(([agentName, agentStack]) => [\n agentName,\n Object.fromEntries(\n typedEntries(agentStack).map(([category, assignments]) => [\n category,\n assignments.filter((assignment) => !excludedIds.has(assignment.id)),\n ]),\n ),\n ]),\n );\n}\n\nexport async function recompileAgents(\n options: RecompileAgentsOptions,\n): Promise<RecompileAgentsResult> {\n const { pluginDir, sourcePath, skills: providedSkills, projectDir, outputDir } = options;\n\n const configDir = projectDir ?? pluginDir;\n const filteredConfig = await loadConfigWithoutExclusions(configDir);\n const allAgents = await loadAgentDefinitions(sourcePath, projectDir);\n\n const agentNames = await resolveAgentNames({\n ...(options.agents !== undefined && { specifiedAgents: options.agents }),\n projectConfig: filteredConfig,\n allAgents,\n ...(outputDir !== undefined && { outputDir }),\n pluginDir,\n });\n\n // An empty pass is not a warning: callers report it off `compiled`.\n if (agentNames.length === 0) {\n return { compiled: [], rewritten: [], failed: [], warnings: [] };\n }\n\n verbose(`Recompiling ${agentNames.length} agents in ${outputDir ?? pluginDir}`);\n\n const pluginSkills: SkillDefinitionMap =\n providedSkills ?? (await discoverAllPluginSkills(projectDir ?? pluginDir));\n\n const { configAgents, missingWarnings } = compileEntriesFor(\n agentNames,\n filteredConfig,\n allAgents,\n );\n const compileConfig = compileConfigFor(filteredConfig, configAgents, pluginDir);\n\n const engine = await createLiquidEngine(projectDir);\n const resolvedAgents = await resolveAgents(allAgents, pluginSkills, compileConfig);\n\n const agentsDir = outputDir ?? getPluginAgentsDir(pluginDir);\n await ensureDir(agentsDir);\n\n const outcomes = await writeCompiledAgentsByScope({\n resolvedAgents,\n sourcePath,\n engine,\n projectAgentsDir: agentsDir,\n // Same root as the config, so format and configuration come from one installation.\n projectDir: configDir,\n ...(options.agentScopeMap !== undefined && { agentScopeMap: options.agentScopeMap }),\n });\n return buildRecompileResult(outcomes, missingWarnings);\n}\n\nasync function loadConfigWithoutExclusions(configDir: string): Promise<ProjectConfig | null> {\n const loaded = await loadProjectConfig(configDir);\n return loaded ? filterExcludedEntries(loaded.config) : null;\n}\n\n/** A project agent wins over a built-in one of the same name. */\nasync function loadAgentDefinitions(\n sourcePath: string,\n projectDir: string | undefined,\n): Promise<Partial<Record<AgentName, AgentDefinition>>> {\n const builtinAgents = await loadAllAgents(sourcePath);\n const projectAgents = projectDir ? await loadProjectAgents(projectDir) : {};\n\n return { ...builtinAgents, ...projectAgents };\n}\n\nfunction compileConfigFor(\n config: ProjectConfig | null,\n agents: Partial<Record<AgentName, CompileAgentConfig>>,\n pluginDir: string,\n): CompileConfig {\n return {\n name: config?.name || path.basename(pluginDir),\n description: config?.description || \"Recompiled plugin\",\n agents,\n };\n}\n\n/** Only agents the scope filter matches: a project pass must not overwrite stackless globals. */\nfunction compileEntriesFor(\n agentNames: AgentName[],\n config: ProjectConfig | null,\n allAgents: Partial<Record<AgentName, AgentDefinition>>,\n): { configAgents: Partial<Record<AgentName, CompileAgentConfig>>; missingWarnings: string[] } {\n const allConfigAgents = config ? buildCompileAgents(config, allAgents) : {};\n\n const [knownAgents, missingAgents] = partition(agentNames, (name) =>\n Boolean(allConfigAgents[name] || allAgents[name]),\n );\n\n return {\n configAgents: typedFromEntries<AgentName, CompileAgentConfig>(\n knownAgents.map((name) => [name, allConfigAgents[name] ?? {}]),\n ),\n missingWarnings: missingAgents.map((name) => `Agent \"${name}\" not found in source definitions`),\n };\n}\n","import os from \"os\";\nimport path from \"path\";\nimport type { Liquid } from \"liquidjs\";\nimport { compileAgentForHost } from \"../compiler.js\";\nimport { resolveInstallPaths } from \"../installation/install-base-dir.js\";\nimport { agentCodec, hostCompilesAgent, providerInUse } from \"../installation/install-layout.js\";\nimport { writeFile, fileExists, readFile } from \"../../utils/fs.js\";\nimport { typedEntries } from \"../../utils/typed-object.js\";\nimport type { Provider } from \"../../consts.js\";\nimport type { AgentConfig, AgentName, SkillScope } from \"../../types/index.js\";\n\nexport type AgentWriteOutcome =\n | {\n name: AgentName;\n ok: true;\n scope: SkillScope;\n targetDir: string;\n /** False when the output matched the file on disk, so nothing was written. */\n rewritten: boolean;\n }\n | { name: AgentName; ok: false; error: unknown };\n\n/** Skipping an identical write keeps the mtime, the only trace telling unchanged from rewritten. */\nasync function holdsExactly(filePath: string, content: string): Promise<boolean> {\n return (await fileExists(filePath)) && (await readFile(filePath)) === content;\n}\n\n/**\n * Routing for an agent the scope map does not name: the caller's `projectAgentsDir`. Deliberately\n * not the selection default, which would move unrouted agents into `~/.claude/agents`.\n */\nconst UNROUTED_AGENT_SCOPE: SkillScope = \"project\";\n\n/**\n * Per-agent failures come back as outcomes; a directory appears only when an agent routes into it.\n */\nexport async function writeCompiledAgentsByScope(params: {\n resolvedAgents: Partial<Record<AgentName, AgentConfig>>;\n sourcePath: string;\n engine: Liquid;\n projectAgentsDir: string;\n /** The root whose folder says which host the PROJECT scope's sub-agents are written for. */\n projectDir: string;\n agentScopeMap?: Map<AgentName, SkillScope>;\n}): Promise<AgentWriteOutcome[]> {\n const hosts: Record<SkillScope, AgentHost> = {\n // Each scope reads its own root: a Codex project under a Claude global is allowed.\n global: {\n provider: providerInUse(os.homedir()),\n agentsDir: resolveInstallPaths(os.homedir(), \"global\").agentsDir,\n },\n project: { provider: providerInUse(params.projectDir), agentsDir: params.projectAgentsDir },\n };\n\n const outcomes: AgentWriteOutcome[] = [];\n for (const [name, agent] of typedEntries<AgentName, AgentConfig>(params.resolvedAgents)) {\n const scope = params.agentScopeMap?.get(name) ?? UNROUTED_AGENT_SCOPE;\n const host = hosts[scope];\n\n // No outcome for a sub-agent this host does not carry: it was neither compiled nor failed.\n if (!hostCompilesAgent(host.provider, name)) continue;\n\n outcomes.push(await writeOneAgent({ ...params, name, agent, scope, host }));\n }\n return outcomes;\n}\n\n/** Returns the failure rather than throwing: the policy is the caller's. */\nasync function writeOneAgent(params: {\n name: AgentName;\n agent: AgentConfig;\n scope: SkillScope;\n host: AgentHost;\n sourcePath: string;\n engine: Liquid;\n}): Promise<AgentWriteOutcome> {\n const { name, scope, host } = params;\n\n try {\n const output = await compileAgentForHost(\n host.provider,\n name,\n params.agent,\n params.sourcePath,\n params.engine,\n );\n const targetPath = path.join(host.agentsDir, fileNameFor(name, host.provider));\n const rewritten = !(await holdsExactly(targetPath, output));\n if (rewritten) await writeFile(targetPath, output);\n\n return { name, ok: true, scope, targetDir: host.agentsDir, rewritten };\n } catch (error) {\n return { name, ok: false, error };\n }\n}\n\ntype AgentHost = { provider: Provider; agentsDir: string };\n\n/** The extension comes from `agentCodec`, so a `.md` never lands where Codex reads `.toml`. */\nfunction fileNameFor(name: AgentName, provider: Provider): string {\n return `${name}${agentCodec(provider).extension}`;\n}\n","import { Liquid } from \"liquidjs\";\nimport path from \"path\";\nimport {\n buildAgentTemplateContext,\n pluginRefFor,\n renderAgent,\n renderAgentBody,\n renderAgentRoleToml,\n type AgentFiles,\n} from \"@workspace/compile/agent-source\";\nimport { readFile, readFileOptional, directoryExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport {\n CLAUDE_DIR,\n DIRS,\n PROJECT_ROOT,\n STANDARD_FILES,\n STANDARD_DIRS,\n type Provider,\n} from \"../consts\";\nimport { providerInUse, sourceFolderInUse, sourceFolderName } from \"./installation/install-layout\";\nimport { cliVersion } from \"./agents/agent-provenance\";\nimport \"./compile-seat.js\";\nimport type { AgentConfig, AgentName } from \"../types\";\n\nexport {\n buildAgentTemplateContext,\n sanitizeCompiledAgentData,\n sanitizeLiquidSyntax,\n} from \"@workspace/compile/agent-source\";\n\nasync function readAgentFiles(\n name: AgentName,\n agent: AgentConfig,\n projectRoot: string,\n): Promise<AgentFiles> {\n const agentSourceRoot = agent.sourceRoot || projectRoot;\n const agentBaseDir = agent.agentBaseDir || DIRS.agents;\n const agentPath = agent.path || name;\n const agentDir = path.join(agentSourceRoot, agentBaseDir, agentPath);\n\n const identity = await readFile(path.join(agentDir, STANDARD_FILES.IDENTITY_MD));\n const playbook = await readFile(path.join(agentDir, STANDARD_FILES.PLAYBOOK_MD));\n const criticalRequirementsTop = await readFileOptional(\n path.join(agentDir, STANDARD_FILES.CRITICAL_REQUIREMENTS_MD),\n \"\",\n );\n const criticalReminders = await readFileOptional(\n path.join(agentDir, STANDARD_FILES.CRITICAL_REMINDERS_MD),\n \"\",\n );\n\n const category = agentPath.split(\"/\")[0] || name;\n const categoryDir = path.join(agentSourceRoot, agentBaseDir, category);\n const output = await readOutputPartial(agentDir, categoryDir);\n\n return { identity, playbook, output, criticalRequirementsTop, criticalReminders };\n}\n\n/** The agent's own `output.md`, or its category's where the agent's is absent or empty. */\nasync function readOutputPartial(agentDir: string, categoryDir: string): Promise<string> {\n const own = await readFileOptional(path.join(agentDir, STANDARD_FILES.OUTPUT_MD), \"\");\n if (own) return own;\n return readFileOptional(path.join(categoryDir, STANDARD_FILES.OUTPUT_MD), \"\");\n}\n\n/**\n * Template roots, first match wins: the project source folder's `agents/_templates/`, legacy\n * `.claude/templates/`, then the built-ins. The options mirror `createEngineFromTemplates` in\n * `@workspace/compile/engine`; keep the two in sync.\n */\nexport async function createLiquidEngine(projectDir?: string): Promise<Liquid> {\n const roots: string[] = [];\n // One read for both: template overrides and source folder must name one installation.\n const provider = providerInUse(projectDir);\n\n if (projectDir) {\n const srcTemplatesDir = path.join(\n sourceFolderInUse(projectDir, provider).dir,\n STANDARD_DIRS.AGENTS,\n path.basename(DIRS.templates),\n );\n if (await directoryExists(srcTemplatesDir)) {\n roots.push(srcTemplatesDir);\n verbose(`Using local templates from: ${srcTemplatesDir}`);\n }\n\n const legacyTemplatesDir = path.join(projectDir, CLAUDE_DIR, STANDARD_DIRS.TEMPLATES);\n if (await directoryExists(legacyTemplatesDir)) {\n roots.push(legacyTemplatesDir);\n verbose(`Using legacy templates from: ${legacyTemplatesDir}`);\n }\n }\n\n roots.push(path.join(PROJECT_ROOT, DIRS.templates));\n\n return new Liquid({\n root: roots,\n extname: \".liquid\",\n strictVariables: false,\n strictFilters: true,\n globals: { sourceFolder: sourceFolderName(projectDir, provider) },\n });\n}\n\n/** Both hosts render from one template context; only the wrapper differs (markdown or TOML). */\nexport async function compileAgentForHost(\n provider: Provider,\n name: AgentName,\n agent: AgentConfig,\n fallbackRoot: string,\n engine: Liquid,\n): Promise<string> {\n verbose(`Compiling agent: ${name} (${provider})`);\n\n const files = await readAgentFiles(name, agent, fallbackRoot);\n\n // Each skill's own `source` decides `${id}:${id}` versus a bare id; no `source` means bare.\n const data = buildAgentTemplateContext(name, agent, files, (skill) => ({\n ...skill,\n ...pluginRefFor(skill),\n }));\n const version = await cliVersion();\n\n switch (provider) {\n case \"claude\":\n return renderAgent(engine, data, version);\n case \"codex\":\n return renderAgentRoleToml(agent, await renderAgentBody(engine, data, version));\n default: {\n const _exhaustive: never = provider;\n return _exhaustive;\n }\n }\n}\n","import path from \"path\";\nimport { z } from \"zod\";\n\nimport { PROJECT_ROOT, STANDARD_FILES } from \"../../consts\";\nimport { readFile } from \"../../utils/fs\";\n\nconst ownPackageJsonSchema = z.object({ version: z.string().min(1) });\n\nexport {\n hasProvenanceMarker,\n provenanceMarker,\n stampProvenanceMarker,\n} from \"@workspace/compile/agent-source\";\n\nlet ownVersion: Promise<string> | undefined;\n\n/**\n * Rendered in the trailing `<system-reminder>`, not the provenance marker, so a version bump leaves\n * the first cacheable bytes of every compiled agent unchanged.\n */\nexport function cliVersion(): Promise<string> {\n ownVersion ??= readOwnVersion();\n return ownVersion;\n}\n\nasync function readOwnVersion(): Promise<string> {\n const manifestPath = path.join(PROJECT_ROOT, STANDARD_FILES.PACKAGE_JSON);\n const raw: unknown = JSON.parse(await readFile(manifestPath));\n\n const parsed = ownPackageJsonSchema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(`Could not read this CLI's own version from ${manifestPath}`);\n }\n return parsed.data.version;\n}\n"],"mappings":"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","names":["partition","path","path","path","path","path","path","path","partition","path"]}
@@ -1,11 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- loadAgentDefs
4
- } from "./chunk-HED2DAXZ.js";
5
2
  import {
6
3
  pruneStaleCompiledAgents,
7
4
  recompileAgents
8
- } from "./chunk-BMRUNMPV.js";
5
+ } from "./chunk-AWWCRL5A.js";
9
6
  import {
10
7
  agentCodec,
11
8
  buildAgentScopeMap,
@@ -27,97 +24,17 @@ import {
27
24
  sayingEachWarningOnce,
28
25
  skillsDir,
29
26
  skillsPathPrefix,
27
+ typedEntries,
28
+ typedKeys,
30
29
  verbose
31
- } from "./chunk-MQ6CGZNJ.js";
30
+ } from "./chunk-3YYHL76L.js";
32
31
  import {
33
32
  initializeMatrix,
34
- matrix,
35
- typedEntries,
36
- typedKeys
37
- } from "./chunk-52HDHJ7I.js";
33
+ matrix
34
+ } from "./chunk-24OD7IP4.js";
38
35
  import {
39
36
  globalInstallRoot
40
- } from "./chunk-PJWGTNOX.js";
41
-
42
- // src/cli/lib/operations/project/remove-compiled-agents.ts
43
- import path from "path";
44
- var AGENT_FILE_EXTENSION = ".md";
45
- async function removeCompiledAgents(options) {
46
- const outcomes = await Promise.all(
47
- options.agents.map((name) => removeCompiledAgentFile(options.agentsDir, name))
48
- );
49
- await tidyEmptiedAgentsDir(options.agentsDir);
50
- return {
51
- removed: outcomes.flatMap((outcome) => outcome.ok ? [outcome.name] : []),
52
- failed: outcomes.flatMap(
53
- (outcome) => outcome.ok ? [] : [{ name: outcome.name, error: outcome.error }]
54
- )
55
- };
56
- }
57
- async function pruneCompiledAgents(options) {
58
- await pruneStaleCompiledAgents(options.agentsDir, options.keep, options.codec);
59
- await tidyEmptiedAgentsDir(options.agentsDir);
60
- }
61
- async function removeCompiledAgentFile(agentsDir, name) {
62
- try {
63
- await remove(path.join(agentsDir, `${name}${AGENT_FILE_EXTENSION}`));
64
- return { name, ok: true };
65
- } catch (error) {
66
- return { name, ok: false, error: getErrorMessage(error) };
67
- }
68
- }
69
- async function tidyEmptiedAgentsDir(agentsDir) {
70
- await removeDirIfEmpty(agentsDir);
71
- }
72
-
73
- // src/cli/lib/operations/project/compile-agents.ts
74
- async function compileAgents(options) {
75
- const { agents: resolvedAgents, agentScopeMap: resolvedAgentScopeMap } = options.scopeFilter ? await rosterForScope(options, options.scopeFilter) : { agents: options.agents, agentScopeMap: options.agentScopeMap };
76
- const recompileResult = await recompileAgents({
77
- pluginDir: options.pluginDir ?? options.projectDir,
78
- sourcePath: options.sourcePath,
79
- ...resolvedAgents !== void 0 && { agents: resolvedAgents },
80
- ...options.skills !== void 0 && { skills: options.skills },
81
- projectDir: options.projectDir,
82
- ...options.outputDir !== void 0 && { outputDir: options.outputDir },
83
- ...resolvedAgentScopeMap !== void 0 && { agentScopeMap: resolvedAgentScopeMap }
84
- });
85
- await pruneStaleAgentsForPass(options, recompileResult);
86
- return {
87
- compiled: recompileResult.compiled,
88
- rewritten: recompileResult.rewritten,
89
- failed: recompileResult.failed,
90
- warnings: recompileResult.warnings
91
- };
92
- }
93
- async function rosterForScope(options, scope) {
94
- const config = (await loadInstalledConfig(options.projectDir))?.config;
95
- const activeAtScope = config?.agents.filter((agent) => !agent.excluded && agent.scope === scope).map((agent) => agent.name);
96
- return {
97
- agents: requestedAgentsAmong(options.agents, activeAtScope),
98
- agentScopeMap: options.agentScopeMap ?? (config ? buildAgentScopeMap(config) : void 0)
99
- };
100
- }
101
- function requestedAgentsAmong(requested, activeAtScope) {
102
- if (activeAtScope === void 0) return requested;
103
- if (requested === void 0) return activeAtScope;
104
- const atScope = new Set(activeAtScope);
105
- return requested.filter((name) => atScope.has(name));
106
- }
107
- async function pruneStaleAgentsForPass(options, recompileResult) {
108
- if (options.scopeFilter || !options.outputDir) return;
109
- const compiledForDir = /* @__PURE__ */ new Set([
110
- ...recompileResult.compiled,
111
- ...recompileResult.failed
112
- ]);
113
- await pruneCompiledAgents({
114
- agentsDir: options.outputDir,
115
- keep: compiledForDir,
116
- // The host this installation compiles for — a Codex role is a `.toml`, and a prune that only
117
- // knew `.md` left a deselected role in place for Codex to keep offering (CLI-896's sibling).
118
- codec: agentCodec(providerInUse(options.projectDir))
119
- });
120
- }
37
+ } from "./chunk-A6OWEJGC.js";
121
38
 
122
39
  // src/cli/lib/operations/skills/discover-skills.ts
123
40
  var NO_LOCAL_SKILLS = { skills: {}, unusableMetadata: [] };
@@ -149,37 +66,58 @@ function mergeSkills(...skillSources) {
149
66
  }
150
67
  async function discoverInstalledSkills(projectDir) {
151
68
  const isGlobalProject = isHomeDirectory(projectDir);
152
- const globalPluginSkills = isGlobalProject ? {} : await discoverAllPluginSkills(globalInstallRoot());
153
- const globalPluginSkillCount = typedKeys(globalPluginSkills).length;
154
- if (globalPluginSkillCount > 0) {
155
- verbose(` Found ${globalPluginSkillCount} skills from global plugins`);
156
- }
157
- const globalLocal = isGlobalProject ? NO_LOCAL_SKILLS : await discoverLocalProjectSkills(projectDir, "global");
158
- const globalLocalSkillCount = typedKeys(globalLocal.skills).length;
159
- if (globalLocalSkillCount > 0) {
160
- verbose(` Found ${globalLocalSkillCount} global local skills from ${globalSkillsRoot()}`);
161
- }
162
- const pluginSkills = await discoverAllPluginSkills(projectDir);
163
- const pluginSkillCount = typedKeys(pluginSkills).length;
164
- verbose(` Found ${pluginSkillCount} skills from installed plugins`);
69
+ const globalPlugins = isGlobalProject ? {} : await discoverGlobalPluginSkills();
70
+ const globalLocal = isGlobalProject ? NO_LOCAL_SKILLS : await discoverGlobalLocalSkills(projectDir);
71
+ const projectPlugins = await discoverProjectPluginSkills(projectDir);
165
72
  const localScope = isGlobalProject ? "global" : "project";
166
- const local = await discoverLocalProjectSkills(projectDir, localScope);
167
- const localSkillCount = typedKeys(local.skills).length;
73
+ const projectLocal = await discoverLocalSkillsAt(projectDir, localScope);
74
+ return assembleDiscoveredSkills({ globalPlugins, globalLocal, projectPlugins, projectLocal });
75
+ }
76
+ async function discoverGlobalPluginSkills() {
77
+ const skills = await discoverAllPluginSkills(globalInstallRoot());
78
+ const count = skillCount(skills);
79
+ if (count > 0) verbose(` Found ${count} skills from global plugins`);
80
+ return skills;
81
+ }
82
+ async function discoverGlobalLocalSkills(projectDir) {
83
+ const loaded = await discoverLocalProjectSkills(projectDir, "global");
84
+ const count = skillCount(loaded.skills);
85
+ if (count > 0) verbose(` Found ${count} global local skills from ${globalSkillsRoot()}`);
86
+ return loaded;
87
+ }
88
+ async function discoverProjectPluginSkills(projectDir) {
89
+ const skills = await discoverAllPluginSkills(projectDir);
90
+ verbose(` Found ${skillCount(skills)} skills from installed plugins`);
91
+ return skills;
92
+ }
93
+ async function discoverLocalSkillsAt(projectDir, scope) {
94
+ const loaded = await discoverLocalProjectSkills(projectDir, scope);
168
95
  verbose(
169
- ` Found ${localSkillCount} local skills from ${projectSkillsRoot(projectDir, localScope)}`
96
+ ` Found ${skillCount(loaded.skills)} local skills from ${projectSkillsRoot(projectDir, scope)}`
170
97
  );
171
- const allSkills = mergeSkills(globalPluginSkills, globalLocal.skills, pluginSkills, local.skills);
172
- const totalSkillCount = typedKeys(allSkills).length;
98
+ return loaded;
99
+ }
100
+ function assembleDiscoveredSkills(found) {
101
+ const { globalPlugins, globalLocal, projectPlugins, projectLocal } = found;
102
+ const allSkills = mergeSkills(
103
+ globalPlugins,
104
+ globalLocal.skills,
105
+ projectPlugins,
106
+ projectLocal.skills
107
+ );
108
+ const distinctPluginSkills = mergeSkills(globalPlugins, projectPlugins);
173
109
  return {
174
110
  allSkills,
175
- totalSkillCount,
176
- pluginSkillCount: globalPluginSkillCount + pluginSkillCount,
177
- localSkillCount: globalLocalSkillCount + localSkillCount,
178
- globalPluginSkillCount,
179
- globalLocalSkillCount,
180
- unusableMetadata: [...globalLocal.unusableMetadata, ...local.unusableMetadata]
111
+ totalSkillCount: skillCount(allSkills),
112
+ pluginSkillCount: skillCount(distinctPluginSkills),
113
+ globalPluginSkillCount: skillCount(globalPlugins),
114
+ globalLocalSkillCount: skillCount(globalLocal.skills),
115
+ unusableMetadata: [...globalLocal.unusableMetadata, ...projectLocal.unusableMetadata]
181
116
  };
182
117
  }
118
+ function skillCount(skills) {
119
+ return typedKeys(skills).length;
120
+ }
183
121
 
184
122
  // src/cli/lib/operations/skills/copy-local-skills.ts
185
123
  async function copyScopedLocalSkills(scopeSkills, skillsDir2, sourceResult) {
@@ -249,41 +187,83 @@ async function withCatalogueSeatedFor(projectDir, body) {
249
187
  }
250
188
  }
251
189
 
252
- // src/cli/lib/operations/project/recompile-project-agents.ts
253
- async function recompileRegisteredProjectAgents(projectDir) {
254
- return withCatalogueSeatedFor(projectDir, async () => {
255
- const { allSkills } = await discoverInstalledSkills(projectDir);
256
- const { sourcePath } = await loadAgentDefs();
257
- return compileAgents({
258
- projectDir,
259
- sourcePath,
260
- skills: allSkills,
261
- scopeFilter: "project",
262
- outputDir: resolveInstallPaths(projectDir, "project").agentsDir
263
- });
264
- });
190
+ // src/cli/lib/operations/project/remove-compiled-agents.ts
191
+ import path from "path";
192
+ async function removeCompiledAgents(options) {
193
+ const outcomes = await Promise.all(
194
+ options.agents.map((name) => removeCompiledAgentFile(options.agentsDir, name))
195
+ );
196
+ await removeDirIfEmpty(options.agentsDir);
197
+ return {
198
+ removed: outcomes.flatMap((outcome) => outcome.ok ? [outcome.name] : []),
199
+ failed: outcomes.flatMap(
200
+ (outcome) => outcome.ok ? [] : [{ name: outcome.name, error: outcome.error }]
201
+ )
202
+ };
265
203
  }
266
- async function recompilePropagatedProjectAgents(projectDirs) {
267
- let rewrittenCount = 0;
268
- let unchangedCount = 0;
269
- let failedCount = 0;
270
- const warnings = [];
271
- for (const dir of projectDirs) {
272
- try {
273
- const result = await recompileRegisteredProjectAgents(dir);
274
- if (result.failed.length > 0) {
275
- failedCount++;
276
- warnings.push(...result.warnings);
277
- continue;
278
- }
279
- if (result.rewritten.length > 0) rewrittenCount++;
280
- else unchangedCount++;
281
- } catch (error) {
282
- failedCount++;
283
- warnings.push(`Could not recompile agents in ${dir}: ${getErrorMessage(error)}`);
284
- }
204
+ async function pruneCompiledAgents(options) {
205
+ await pruneStaleCompiledAgents(options.agentsDir, options.keep, options.codec);
206
+ await removeDirIfEmpty(options.agentsDir);
207
+ }
208
+ async function removeCompiledAgentFile(agentsDir, name) {
209
+ try {
210
+ await remove(path.join(agentsDir, `${name}${agentCodec("claude").extension}`));
211
+ return { name, ok: true };
212
+ } catch (error) {
213
+ return { name, ok: false, error: getErrorMessage(error) };
285
214
  }
286
- return { rewrittenCount, unchangedCount, failedCount, warnings };
215
+ }
216
+
217
+ // src/cli/lib/operations/project/compile-agents.ts
218
+ async function compileAgents(options) {
219
+ const roster = await rosterForPass(options);
220
+ const recompileResult = await recompileAgents({
221
+ pluginDir: options.pluginDir ?? options.projectDir,
222
+ sourcePath: options.sourcePath,
223
+ ...roster.agents !== void 0 && { agents: roster.agents },
224
+ ...options.skills !== void 0 && { skills: options.skills },
225
+ projectDir: options.projectDir,
226
+ ...options.outputDir !== void 0 && { outputDir: options.outputDir },
227
+ ...roster.agentScopeMap !== void 0 && { agentScopeMap: roster.agentScopeMap }
228
+ });
229
+ await pruneStaleAgentsForPass(options, recompileResult);
230
+ return {
231
+ compiled: recompileResult.compiled,
232
+ rewritten: recompileResult.rewritten,
233
+ failed: recompileResult.failed,
234
+ warnings: recompileResult.warnings
235
+ };
236
+ }
237
+ async function rosterForPass(options) {
238
+ if (!options.scopeFilter) return { agents: options.agents, agentScopeMap: options.agentScopeMap };
239
+ return rosterForScope(options, options.scopeFilter);
240
+ }
241
+ async function rosterForScope(options, scope) {
242
+ const config = (await loadInstalledConfig(options.projectDir))?.config;
243
+ const activeAtScope = config?.agents.filter((agent) => !agent.excluded && agent.scope === scope).map((agent) => agent.name);
244
+ return {
245
+ agents: requestedAgentsAmong(options.agents, activeAtScope),
246
+ agentScopeMap: options.agentScopeMap ?? (config ? buildAgentScopeMap(config) : void 0)
247
+ };
248
+ }
249
+ function requestedAgentsAmong(requested, activeAtScope) {
250
+ if (activeAtScope === void 0) return requested;
251
+ if (requested === void 0) return activeAtScope;
252
+ const atScope = new Set(activeAtScope);
253
+ return requested.filter((name) => atScope.has(name));
254
+ }
255
+ async function pruneStaleAgentsForPass(options, recompileResult) {
256
+ if (options.scopeFilter || !options.outputDir) return;
257
+ const compiledForDir = /* @__PURE__ */ new Set([
258
+ ...recompileResult.compiled,
259
+ ...recompileResult.failed
260
+ ]);
261
+ await pruneCompiledAgents({
262
+ agentsDir: options.outputDir,
263
+ keep: compiledForDir,
264
+ // A Codex role is a `.toml`, so the prune must know the host's extension.
265
+ codec: agentCodec(providerInUse(options.projectDir))
266
+ });
287
267
  }
288
268
 
289
269
  export {
@@ -292,8 +272,6 @@ export {
292
272
  uninstallPluginSkills,
293
273
  withCatalogueSeatedFor,
294
274
  removeCompiledAgents,
295
- compileAgents,
296
- recompileRegisteredProjectAgents,
297
- recompilePropagatedProjectAgents
275
+ compileAgents
298
276
  };
299
- //# sourceMappingURL=chunk-F2BHT5C4.js.map
277
+ //# sourceMappingURL=chunk-EOKNEGRD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/operations/skills/discover-skills.ts","../src/cli/lib/operations/skills/copy-local-skills.ts","../src/cli/lib/operations/skills/uninstall-plugin-skills.ts","../src/cli/lib/loading/catalogue-seat.ts","../src/cli/lib/operations/project/remove-compiled-agents.ts","../src/cli/lib/operations/project/compile-agents.ts"],"sourcesContent":["import { discoverAllPluginSkills } from \"../../plugins/index.js\";\nimport { isHomeDirectory } from \"../../installation/is-home-directory.js\";\nimport { loadSkillsFromDir, type LoadedSkills } from \"../../loading/index.js\";\nimport { sayingEachWarningOnce, verbose } from \"../../../utils/logger.js\";\nimport { globalInstallRoot } from \"../../../consts.js\";\nimport {\n installBaseDir,\n providerInUse,\n skillsDir,\n skillsPathPrefix,\n} from \"../../installation/install-layout.js\";\nimport { typedEntries, typedKeys } from \"../../../utils/typed-object.js\";\nimport type { UnusableSkillMetadata } from \"../../loading/index.js\";\nimport type {\n SkillDefinition,\n SkillDefinitionMap,\n SkillId,\n SkillScope,\n} from \"../../../types/index.js\";\n\nexport type DiscoveredSkills = {\n allSkills: SkillDefinitionMap;\n totalSkillCount: number;\n pluginSkillCount: number;\n globalPluginSkillCount: number;\n globalLocalSkillCount: number;\n /** Skills whose metadata.yaml describes no skill; `compile` refuses over any entry. */\n unusableMetadata: UnusableSkillMetadata[];\n};\n\nconst NO_LOCAL_SKILLS: LoadedSkills = { skills: {}, unusableMetadata: [] };\n\n/**\n * Discovers copied-in (not plugin) skills at one scope. A global scan's warnings are said once per\n * run, since the fan-out asks for that one directory once per registered project.\n */\nasync function discoverLocalProjectSkills(\n projectDir: string,\n scope: SkillScope,\n): Promise<LoadedSkills> {\n const provider = providerInUse(installBaseDir(projectDir, scope));\n const scan = () =>\n loadSkillsFromDir(skillsDir(provider, scope, projectDir), {\n pathPrefix: skillsPathPrefix(provider, scope, projectDir),\n requireMetadata: true,\n });\n\n return scope === \"global\" ? sayingEachWarningOnce(scan) : scan();\n}\n\nfunction globalSkillsRoot(): string {\n const home = globalInstallRoot();\n return skillsDir(providerInUse(home), \"global\", home);\n}\n\nfunction projectSkillsRoot(projectDir: string, scope: SkillScope): string {\n return skillsDir(providerInUse(installBaseDir(projectDir, scope)), scope, projectDir);\n}\n\n/** Later sources win. */\nfunction mergeSkills(...skillSources: SkillDefinitionMap[]): SkillDefinitionMap {\n const merged: SkillDefinitionMap = {};\n\n for (const source of skillSources) {\n for (const [id, skill] of typedEntries<SkillId, SkillDefinition | undefined>(source)) {\n if (skill) {\n merged[id] = skill;\n }\n }\n }\n\n return merged;\n}\n\n/** Merges global plugins, global copied-in, project plugins, project copied-in; project wins. */\nexport async function discoverInstalledSkills(projectDir: string): Promise<DiscoveredSkills> {\n const isGlobalProject = isHomeDirectory(projectDir);\n\n const globalPlugins = isGlobalProject ? {} : await discoverGlobalPluginSkills();\n const globalLocal = isGlobalProject\n ? NO_LOCAL_SKILLS\n : await discoverGlobalLocalSkills(projectDir);\n const projectPlugins = await discoverProjectPluginSkills(projectDir);\n // At the home root both scopes are one installation, so ask the global scope only.\n const localScope: SkillScope = isGlobalProject ? \"global\" : \"project\";\n const projectLocal = await discoverLocalSkillsAt(projectDir, localScope);\n\n return assembleDiscoveredSkills({ globalPlugins, globalLocal, projectPlugins, projectLocal });\n}\n\nasync function discoverGlobalPluginSkills(): Promise<SkillDefinitionMap> {\n const skills = await discoverAllPluginSkills(globalInstallRoot());\n const count = skillCount(skills);\n if (count > 0) verbose(` Found ${count} skills from global plugins`);\n return skills;\n}\n\nasync function discoverGlobalLocalSkills(projectDir: string): Promise<LoadedSkills> {\n const loaded = await discoverLocalProjectSkills(projectDir, \"global\");\n const count = skillCount(loaded.skills);\n if (count > 0) verbose(` Found ${count} global local skills from ${globalSkillsRoot()}`);\n return loaded;\n}\n\nasync function discoverProjectPluginSkills(projectDir: string): Promise<SkillDefinitionMap> {\n const skills = await discoverAllPluginSkills(projectDir);\n verbose(` Found ${skillCount(skills)} skills from installed plugins`);\n return skills;\n}\n\nasync function discoverLocalSkillsAt(projectDir: string, scope: SkillScope): Promise<LoadedSkills> {\n const loaded = await discoverLocalProjectSkills(projectDir, scope);\n verbose(\n ` Found ${skillCount(loaded.skills)} local skills from ${projectSkillsRoot(projectDir, scope)}`,\n );\n return loaded;\n}\n\ntype SkillsByOrigin = {\n globalPlugins: SkillDefinitionMap;\n globalLocal: LoadedSkills;\n projectPlugins: SkillDefinitionMap;\n projectLocal: LoadedSkills;\n};\n\nfunction assembleDiscoveredSkills(found: SkillsByOrigin): DiscoveredSkills {\n const { globalPlugins, globalLocal, projectPlugins, projectLocal } = found;\n const allSkills = mergeSkills(\n globalPlugins,\n globalLocal.skills,\n projectPlugins,\n projectLocal.skills,\n );\n // A plugin installed at both scopes is listed by both, but is one skill.\n const distinctPluginSkills = mergeSkills(globalPlugins, projectPlugins);\n\n return {\n allSkills,\n totalSkillCount: skillCount(allSkills),\n pluginSkillCount: skillCount(distinctPluginSkills),\n globalPluginSkillCount: skillCount(globalPlugins),\n globalLocalSkillCount: skillCount(globalLocal.skills),\n unusableMetadata: [...globalLocal.unusableMetadata, ...projectLocal.unusableMetadata],\n };\n}\n\nfunction skillCount(skills: SkillDefinitionMap): number {\n return typedKeys<SkillId>(skills).length;\n}\n","import { resolveInstallPaths } from \"../../installation/index.js\";\nimport { copySkillsToLocalFlattened, type CopiedSkill } from \"../../skills/index.js\";\nimport { ensureDir } from \"../../../utils/fs.js\";\nimport type { SkillConfig } from \"../../../types/config.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type SkillCopyResult = {\n projectCopied: CopiedSkill[];\n globalCopied: CopiedSkill[];\n totalCopied: number;\n};\n\nasync function copyScopedLocalSkills(\n scopeSkills: SkillConfig[],\n skillsDir: string,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill[]> {\n if (scopeSkills.length === 0) return [];\n\n await ensureDir(skillsDir);\n\n return copySkillsToLocalFlattened(\n scopeSkills.map((s) => s.id),\n skillsDir,\n sourceResult,\n );\n}\n\nexport async function copyLocalSkills(\n skills: SkillConfig[],\n projectDir: string,\n sourceResult: SourceLoadResult,\n): Promise<SkillCopyResult> {\n const projectLocalSkills = skills.filter((s) => s.scope !== \"global\");\n const globalLocalSkills = skills.filter((s) => s.scope === \"global\");\n\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n const globalPaths = resolveInstallPaths(projectDir, \"global\");\n\n const projectCopied = await copyScopedLocalSkills(\n projectLocalSkills,\n projectPaths.skillsDir,\n sourceResult,\n );\n const globalCopied = await copyScopedLocalSkills(\n globalLocalSkills,\n globalPaths.skillsDir,\n sourceResult,\n );\n\n return {\n projectCopied,\n globalCopied,\n totalCopied: projectCopied.length + globalCopied.length,\n };\n}\n","import { hostAt } from \"../../hosts/host-for.js\";\nimport { buildMarketplacePluginRef } from \"../../plugins/index.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport type { SkillId } from \"../../../types/index.js\";\nimport type { SkillConfig, SkillScope } from \"../../../types/config.js\";\n\n/** The safe default: a project removal cannot take a plugin from every project under one HOME. */\nconst SCOPE_OF_AN_UNRECORDED_SKILL: SkillScope = \"project\";\n\nexport type PluginUninstallResult = {\n /** Only plugins the host reported `removed`; an already-absent plugin is not listed. */\n uninstalled: SkillId[];\n failed: Array<{ id: SkillId; error: string }>;\n};\n\nexport async function uninstallPluginSkills(\n skillIds: SkillId[],\n oldSkills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n): Promise<PluginUninstallResult> {\n const host = hostAt(projectDir);\n const uninstalled: SkillId[] = [];\n const failed: PluginUninstallResult[\"failed\"] = [];\n\n for (const skillId of skillIds) {\n const oldSkill = oldSkills.find((s) => s.id === skillId);\n const pluginScope = oldSkill?.scope ?? SCOPE_OF_AN_UNRECORDED_SKILL;\n const pluginRef = buildMarketplacePluginRef(skillId, marketplace);\n try {\n const outcome = await host.uninstallPlugin(pluginRef, pluginScope, projectDir);\n if (outcome === \"removed\") uninstalled.push(skillId);\n } catch (error) {\n failed.push({ id: skillId, error: getErrorMessage(error) });\n }\n }\n\n return { uninstalled, failed };\n}\n","import type { MergedSkillsMatrix } from \"../../types\";\nimport { initializeMatrix, matrix } from \"../matrix/matrix-provider.js\";\nimport { loadSkillsMatrixFromSource } from \"./source-loader.js\";\n\n/**\n * Runs `body` against `projectDir`'s own skills catalogue, then restores the caller's. The load\n * stays outside the `try`: a failed load seats nothing, so there is nothing to restore.\n */\nexport async function withCatalogueSeatedFor<T>(\n projectDir: string,\n body: (catalogue: MergedSkillsMatrix) => Promise<T>,\n): Promise<T> {\n const callersCatalogue = matrix;\n const { matrix: seated } = await loadSkillsMatrixFromSource({\n projectDir,\n purpose: \"upkeep\",\n skipExtraSources: true,\n matrixOnly: true,\n });\n try {\n return await body(seated);\n } finally {\n initializeMatrix(callersCatalogue);\n }\n}\n","import path from \"path\";\nimport { pruneStaleCompiledAgents } from \"../../agents/list-compiled-agents.js\";\nimport { type AgentCodec, agentCodec } from \"../../installation/install-layout.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport { remove, removeDirIfEmpty } from \"../../../utils/fs.js\";\nimport type { AgentName } from \"../../../types/index.js\";\n\nexport type RemoveCompiledAgentsOptions = {\n agentsDir: string;\n agents: readonly AgentName[];\n};\n\nexport type PruneCompiledAgentsOptions = {\n agentsDir: string;\n /** The COMPLETE set of agents that belong in `agentsDir`; every other compiled agent is stale. */\n keep: ReadonlySet<AgentName>;\n codec?: AgentCodec;\n};\n\nexport type RemoveCompiledAgentsResult = {\n /** An absent file counts as removed. */\n removed: AgentName[];\n failed: Array<{ name: AgentName; error: string }>;\n};\n\ntype RemovalOutcome = { name: AgentName; ok: true } | { name: AgentName; ok: false; error: string };\n\n/**\n * Also removes `agentsDir` when nothing at all is left in it; the `.claude/` above is uninstall's.\n */\nexport async function removeCompiledAgents(\n options: RemoveCompiledAgentsOptions,\n): Promise<RemoveCompiledAgentsResult> {\n const outcomes = await Promise.all(\n options.agents.map((name) => removeCompiledAgentFile(options.agentsDir, name)),\n );\n await removeDirIfEmpty(options.agentsDir);\n\n return {\n removed: outcomes.flatMap((outcome) => (outcome.ok ? [outcome.name] : [])),\n failed: outcomes.flatMap((outcome) =>\n outcome.ok ? [] : [{ name: outcome.name, error: outcome.error }],\n ),\n };\n}\n\n/** Hand-authored agents survive; the directory goes only when nothing at all remains. */\nexport async function pruneCompiledAgents(options: PruneCompiledAgentsOptions): Promise<void> {\n await pruneStaleCompiledAgents(options.agentsDir, options.keep, options.codec);\n await removeDirIfEmpty(options.agentsDir);\n}\n\nasync function removeCompiledAgentFile(\n agentsDir: string,\n name: AgentName,\n): Promise<RemovalOutcome> {\n try {\n await remove(path.join(agentsDir, `${name}${agentCodec(\"claude\").extension}`));\n return { name, ok: true };\n } catch (error) {\n return { name, ok: false, error: getErrorMessage(error) };\n }\n}\n","import { pruneCompiledAgents } from \"./remove-compiled-agents.js\";\nimport { recompileAgents } from \"../../agents/index.js\";\nimport { loadInstalledConfig } from \"../../configuration/index.js\";\nimport { buildAgentScopeMap } from \"../../installation/index.js\";\nimport { agentCodec, providerInUse } from \"../../installation/install-layout.js\";\nimport type { AgentName, SkillDefinitionMap, SkillScope } from \"../../../types/index.js\";\n\nexport type CompileAgentsOptions = {\n projectDir: string;\n sourcePath: string;\n pluginDir?: string;\n skills?: SkillDefinitionMap;\n agentScopeMap?: Map<AgentName, SkillScope>;\n agents?: AgentName[];\n scopeFilter?: SkillScope;\n outputDir?: string;\n};\n\nexport type CompilationResult = {\n compiled: AgentName[];\n /** The subset of `compiled` whose file this pass actually wrote. */\n rewritten: AgentName[];\n failed: AgentName[];\n warnings: string[];\n};\n\nexport async function compileAgents(options: CompileAgentsOptions): Promise<CompilationResult> {\n const roster = await rosterForPass(options);\n\n const recompileResult = await recompileAgents({\n pluginDir: options.pluginDir ?? options.projectDir,\n sourcePath: options.sourcePath,\n ...(roster.agents !== undefined && { agents: roster.agents }),\n ...(options.skills !== undefined && { skills: options.skills }),\n projectDir: options.projectDir,\n ...(options.outputDir !== undefined && { outputDir: options.outputDir }),\n ...(roster.agentScopeMap !== undefined && { agentScopeMap: roster.agentScopeMap }),\n });\n\n await pruneStaleAgentsForPass(options, recompileResult);\n\n return {\n compiled: recompileResult.compiled,\n rewritten: recompileResult.rewritten,\n failed: recompileResult.failed,\n warnings: recompileResult.warnings,\n };\n}\n\ntype PassRoster = {\n agents: AgentName[] | undefined;\n agentScopeMap: Map<AgentName, SkillScope> | undefined;\n};\n\nasync function rosterForPass(options: CompileAgentsOptions): Promise<PassRoster> {\n if (!options.scopeFilter) return { agents: options.agents, agentScopeMap: options.agentScopeMap };\n return rosterForScope(options, options.scopeFilter);\n}\n\nasync function rosterForScope(\n options: CompileAgentsOptions,\n scope: SkillScope,\n): Promise<PassRoster> {\n const config = (await loadInstalledConfig(options.projectDir))?.config;\n const activeAtScope = config?.agents\n .filter((agent) => !agent.excluded && agent.scope === scope)\n .map((agent) => agent.name);\n\n return {\n agents: requestedAgentsAmong(options.agents, activeAtScope),\n agentScopeMap: options.agentScopeMap ?? (config ? buildAgentScopeMap(config) : undefined),\n };\n}\n\nfunction requestedAgentsAmong(\n requested: AgentName[] | undefined,\n activeAtScope: AgentName[] | undefined,\n): AgentName[] | undefined {\n if (activeAtScope === undefined) return requested;\n if (requested === undefined) return activeAtScope;\n\n const atScope = new Set(activeAtScope);\n return requested.filter((name) => atScope.has(name));\n}\n\n/**\n * Only an unfiltered pass owns its whole `outputDir`, so only it prunes agents no longer compiled\n * there; a scope-filtered pass must never delete another scope's files.\n */\nasync function pruneStaleAgentsForPass(\n options: CompileAgentsOptions,\n recompileResult: CompilationResult,\n): Promise<void> {\n if (options.scopeFilter || !options.outputDir) return;\n\n const compiledForDir = new Set<AgentName>([\n ...recompileResult.compiled,\n ...recompileResult.failed,\n ]);\n await pruneCompiledAgents({\n agentsDir: options.outputDir,\n keep: compiledForDir,\n // A Codex role is a `.toml`, so the prune must know the host's extension.\n codec: agentCodec(providerInUse(options.projectDir)),\n });\n}\n"],"mappings":"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","names":["skillsDir"]}
@@ -1,10 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/cli/lib/configuration/define-config.ts
4
- function defineConfig(config) {
5
- return config;
6
- }
7
-
8
3
  // src/cli/lib/configuration/default-categories.ts
9
4
  var defaultCategories = {
10
5
  "web-framework": {
@@ -3584,9 +3579,8 @@ var defaultStacks = [
3584
3579
  ];
3585
3580
 
3586
3581
  export {
3587
- defineConfig,
3588
3582
  defaultCategories,
3589
3583
  defaultRules,
3590
3584
  defaultStacks
3591
3585
  };
3592
- //# sourceMappingURL=chunk-NQW25DCF.js.map
3586
+ //# sourceMappingURL=chunk-GHHJYNAN.js.map