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.
- package/CHANGELOG.md +30 -0
- package/dist/{chunk-52HDHJ7I.js → chunk-24OD7IP4.js} +32 -21
- package/dist/chunk-24OD7IP4.js.map +1 -0
- package/dist/{chunk-MQ6CGZNJ.js → chunk-3YYHL76L.js} +1879 -2019
- package/dist/chunk-3YYHL76L.js.map +1 -0
- package/dist/chunk-4RQKCV6I.js +103 -0
- package/dist/chunk-4RQKCV6I.js.map +1 -0
- package/dist/{chunk-USVBYQSQ.js → chunk-5FM77WKW.js} +16 -6
- package/dist/chunk-5FM77WKW.js.map +1 -0
- package/dist/{chunk-HED2DAXZ.js → chunk-7IVLVEHX.js} +5 -5
- package/dist/chunk-7IVLVEHX.js.map +1 -0
- package/dist/{chunk-PJWGTNOX.js → chunk-A6OWEJGC.js} +144 -186
- package/dist/chunk-A6OWEJGC.js.map +1 -0
- package/dist/{chunk-BMRUNMPV.js → chunk-AWWCRL5A.js} +35 -35
- package/dist/chunk-AWWCRL5A.js.map +1 -0
- package/dist/{chunk-F2BHT5C4.js → chunk-EOKNEGRD.js} +129 -151
- package/dist/chunk-EOKNEGRD.js.map +1 -0
- package/dist/{chunk-NQW25DCF.js → chunk-GHHJYNAN.js} +1 -7
- package/dist/chunk-GHHJYNAN.js.map +1 -0
- package/dist/chunk-JGPE4RRE.js +35 -0
- package/dist/chunk-JGPE4RRE.js.map +1 -0
- package/dist/{chunk-JFLVEFFP.js → chunk-KIK5EZYD.js} +1 -1
- package/dist/chunk-KIK5EZYD.js.map +1 -0
- package/dist/{chunk-NCWDK6L7.js → chunk-KMOCMVK5.js} +254 -379
- package/dist/chunk-KMOCMVK5.js.map +1 -0
- package/dist/{chunk-4AAOOAIN.js → chunk-P6CYS4JK.js} +2 -2
- package/dist/chunk-P6CYS4JK.js.map +1 -0
- package/dist/chunk-QIR56IDM.js +1169 -0
- package/dist/chunk-QIR56IDM.js.map +1 -0
- package/dist/{chunk-6ZRH5RHC.js → chunk-R572RLTI.js} +4 -4
- package/dist/chunk-R572RLTI.js.map +1 -0
- package/dist/{chunk-WTWMGH2C.js → chunk-RDXY4GRO.js} +2 -2
- package/dist/chunk-RDXY4GRO.js.map +1 -0
- package/dist/{chunk-7RDMTR64.js → chunk-S2SKVJT2.js} +785 -256
- package/dist/chunk-S2SKVJT2.js.map +1 -0
- package/dist/{chunk-SZYQISA2.js → chunk-TNFYBKVD.js} +43 -29
- package/dist/chunk-TNFYBKVD.js.map +1 -0
- package/dist/{chunk-RIPSGNLU.js → chunk-W4KAY26P.js} +3 -3
- package/dist/chunk-W4KAY26P.js.map +1 -0
- package/dist/{chunk-OYJQUA3D.js → chunk-WDH6HHA3.js} +31 -13
- package/dist/chunk-WDH6HHA3.js.map +1 -0
- package/dist/{chunk-3G7X2WKI.js → chunk-WII6GOPM.js} +18 -38
- package/dist/chunk-WII6GOPM.js.map +1 -0
- package/dist/{chunk-F5EBEATU.js → chunk-WM2N2D6Q.js} +34 -46
- package/dist/chunk-WM2N2D6Q.js.map +1 -0
- package/dist/{chunk-KOLDW6SF.js → chunk-YLUOGAW7.js} +2 -2
- package/dist/chunk-YLUOGAW7.js.map +1 -0
- package/dist/{chunk-44TE3RKH.js → chunk-ZC6GC66J.js} +5 -4
- package/dist/chunk-ZC6GC66J.js.map +1 -0
- package/dist/{chunk-NEZ4OAOL.js → chunk-ZEGM3MVR.js} +3 -5
- package/dist/chunk-ZEGM3MVR.js.map +1 -0
- package/dist/commands/build/marketplace.js +46 -46
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +25 -28
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +87 -178
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +510 -360
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +451 -357
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +144 -125
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/init.js +20 -27
- package/dist/commands/list.js +39 -55
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/marketplace.js +6 -11
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +35 -32
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +17 -77
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/uninstall.js +159 -222
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +9 -32
- package/dist/commands/update.js.map +1 -1
- package/dist/components/common/prompt-confirm.js +2 -2
- package/dist/components/common/removal-plan-confirm.js +2 -2
- package/dist/components/common/scroll-affordance.js +2 -2
- package/dist/components/common/select-list.js +2 -2
- package/dist/components/common/skill-agent-summary.js +4 -4
- package/dist/components/common/spinner.js +2 -4
- package/dist/components/common/summary-panel.js +5 -5
- package/dist/components/common/summary-panel.js.map +1 -1
- package/dist/config-exports.js +7 -3
- package/dist/config-exports.js.map +1 -1
- package/dist/hooks/init.js +18 -19
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/load-agent-defs-UBWITIEI.js +14 -0
- package/dist/recompile-project-agents-IQANWGOP.js +65 -0
- package/dist/recompile-project-agents-IQANWGOP.js.map +1 -0
- package/dist/{source-loader-C5SQXZXI.js → source-loader-YGG7DY2W.js} +5 -5
- package/dist/src/agents/developer/ai-developer/playbook.md +2 -5
- package/dist/src/agents/developer/api-developer/playbook.md +2 -5
- package/dist/src/agents/developer/cli-developer/playbook.md +2 -5
- package/dist/src/agents/developer/web-developer/playbook.md +2 -5
- package/dist/src/agents/meta/agent-summoner/output.md +2 -2
- package/dist/src/agents/meta/agent-summoner/playbook.md +1 -13
- package/dist/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
- package/dist/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
- package/dist/src/agents/tester/ai-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/ai-tester/playbook.md +2 -0
- package/dist/src/agents/tester/api-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/api-tester/playbook.md +2 -0
- package/dist/src/agents/tester/cli-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/cli-tester/playbook.md +2 -0
- package/dist/src/agents/tester/web-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/web-tester/playbook.md +2 -0
- package/package.json +9 -8
- package/src/agents/developer/ai-developer/playbook.md +2 -5
- package/src/agents/developer/api-developer/playbook.md +2 -5
- package/src/agents/developer/cli-developer/playbook.md +2 -5
- package/src/agents/developer/web-developer/playbook.md +2 -5
- package/src/agents/meta/agent-summoner/output.md +2 -2
- package/src/agents/meta/agent-summoner/playbook.md +1 -13
- package/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
- package/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
- package/src/agents/tester/ai-tester/critical-requirements.md +1 -2
- package/src/agents/tester/ai-tester/playbook.md +2 -0
- package/src/agents/tester/api-tester/critical-requirements.md +1 -2
- package/src/agents/tester/api-tester/playbook.md +2 -0
- package/src/agents/tester/cli-tester/critical-requirements.md +1 -2
- package/src/agents/tester/cli-tester/playbook.md +2 -0
- package/src/agents/tester/web-tester/critical-requirements.md +1 -2
- package/src/agents/tester/web-tester/playbook.md +2 -0
- package/src/schemas/project-config.schema.json +0 -3
- package/src/schemas/project-source-config.schema.json +0 -6
- package/dist/chunk-3G7X2WKI.js.map +0 -1
- package/dist/chunk-44TE3RKH.js.map +0 -1
- package/dist/chunk-4AAOOAIN.js.map +0 -1
- package/dist/chunk-52HDHJ7I.js.map +0 -1
- package/dist/chunk-6HNXYYVF.js +0 -373
- package/dist/chunk-6HNXYYVF.js.map +0 -1
- package/dist/chunk-6ZRH5RHC.js.map +0 -1
- package/dist/chunk-7RDMTR64.js.map +0 -1
- package/dist/chunk-BMRUNMPV.js.map +0 -1
- package/dist/chunk-CLPUWOSA.js +0 -46
- package/dist/chunk-CLPUWOSA.js.map +0 -1
- package/dist/chunk-F2BHT5C4.js.map +0 -1
- package/dist/chunk-F5EBEATU.js.map +0 -1
- package/dist/chunk-HED2DAXZ.js.map +0 -1
- package/dist/chunk-JFLVEFFP.js.map +0 -1
- package/dist/chunk-KOLDW6SF.js.map +0 -1
- package/dist/chunk-MQ6CGZNJ.js.map +0 -1
- package/dist/chunk-NCWDK6L7.js.map +0 -1
- package/dist/chunk-NEZ4OAOL.js.map +0 -1
- package/dist/chunk-NIHUOWE4.js +0 -106
- package/dist/chunk-NIHUOWE4.js.map +0 -1
- package/dist/chunk-NQW25DCF.js.map +0 -1
- package/dist/chunk-OYJQUA3D.js.map +0 -1
- package/dist/chunk-PJWGTNOX.js.map +0 -1
- package/dist/chunk-RIPSGNLU.js.map +0 -1
- package/dist/chunk-SZYQISA2.js.map +0 -1
- package/dist/chunk-USVBYQSQ.js.map +0 -1
- package/dist/chunk-V3KTSP3Q.js +0 -940
- package/dist/chunk-V3KTSP3Q.js.map +0 -1
- package/dist/chunk-WTWMGH2C.js.map +0 -1
- package/dist/load-agent-defs-YMDWBFDP.js +0 -14
- package/dist/recompile-project-agents-SZ76WNTW.js +0 -18
- package/dist/source-loader-C5SQXZXI.js.map +0 -1
- /package/dist/{load-agent-defs-YMDWBFDP.js.map → load-agent-defs-UBWITIEI.js.map} +0 -0
- /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
|
-
|
|
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-
|
|
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 {
|
|
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,
|
|
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
|
|
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(([
|
|
292
|
-
|
|
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
|
|
306
|
-
const
|
|
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
|
|
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
|
-
//
|
|
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-
|
|
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-
|
|
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-
|
|
30
|
+
} from "./chunk-3YYHL76L.js";
|
|
32
31
|
import {
|
|
33
32
|
initializeMatrix,
|
|
34
|
-
matrix
|
|
35
|
-
|
|
36
|
-
typedKeys
|
|
37
|
-
} from "./chunk-52HDHJ7I.js";
|
|
33
|
+
matrix
|
|
34
|
+
} from "./chunk-24OD7IP4.js";
|
|
38
35
|
import {
|
|
39
36
|
globalInstallRoot
|
|
40
|
-
} from "./chunk-
|
|
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
|
|
153
|
-
const
|
|
154
|
-
|
|
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
|
|
167
|
-
|
|
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 ${
|
|
96
|
+
` Found ${skillCount(loaded.skills)} local skills from ${projectSkillsRoot(projectDir, scope)}`
|
|
170
97
|
);
|
|
171
|
-
|
|
172
|
-
|
|
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:
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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/
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
3586
|
+
//# sourceMappingURL=chunk-GHHJYNAN.js.map
|