agent-switchboard 0.1.27 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -1
- package/dist/commands/distribution.js +2 -2
- package/dist/commands/distribution.js.map +1 -1
- package/dist/commands/library.d.ts +1 -1
- package/dist/commands/library.js +5 -5
- package/dist/commands/library.js.map +1 -1
- package/dist/config/application-config.d.ts +37 -0
- package/dist/config/application-config.js +83 -0
- package/dist/config/application-config.js.map +1 -0
- package/dist/config/layered-config.js +43 -2
- package/dist/config/layered-config.js.map +1 -1
- package/dist/config/paths.d.ts +7 -2
- package/dist/config/paths.js +12 -3
- package/dist/config/paths.js.map +1 -1
- package/dist/config/schemas.d.ts +103 -22
- package/dist/config/schemas.js +22 -18
- package/dist/config/schemas.js.map +1 -1
- package/dist/config/switchboard-config.d.ts +3 -6
- package/dist/config/switchboard-config.js +3 -6
- package/dist/config/switchboard-config.js.map +1 -1
- package/dist/hooks/distribution.d.ts +27 -0
- package/dist/hooks/distribution.js +235 -0
- package/dist/hooks/distribution.js.map +1 -0
- package/dist/hooks/library.d.ts +40 -0
- package/dist/hooks/library.js +143 -0
- package/dist/hooks/library.js.map +1 -0
- package/dist/hooks/schema.d.ts +542 -0
- package/dist/hooks/schema.js +49 -0
- package/dist/hooks/schema.js.map +1 -0
- package/dist/index.js +608 -146
- package/dist/index.js.map +1 -1
- package/dist/library/fs.d.ts +1 -3
- package/dist/library/fs.js +24 -7
- package/dist/library/fs.js.map +1 -1
- package/dist/library/schema.d.ts +1 -1
- package/dist/library/schema.js +1 -1
- package/dist/library/sources.d.ts +3 -0
- package/dist/library/sources.js +8 -2
- package/dist/library/sources.js.map +1 -1
- package/dist/library/state.d.ts +4 -5
- package/dist/library/state.js +15 -31
- package/dist/library/state.js.map +1 -1
- package/dist/marketplace/plugin-loader.d.ts +30 -0
- package/dist/marketplace/plugin-loader.js +178 -0
- package/dist/marketplace/plugin-loader.js.map +1 -0
- package/dist/marketplace/reader.d.ts +36 -0
- package/dist/marketplace/reader.js +90 -0
- package/dist/marketplace/reader.js.map +1 -0
- package/dist/marketplace/schemas.d.ts +467 -0
- package/dist/marketplace/schemas.js +57 -0
- package/dist/marketplace/schemas.js.map +1 -0
- package/dist/marketplace/source-loader.d.ts +32 -0
- package/dist/marketplace/source-loader.js +45 -0
- package/dist/marketplace/source-loader.js.map +1 -0
- package/dist/rules/composer.d.ts +2 -2
- package/dist/rules/composer.js +5 -5
- package/dist/rules/composer.js.map +1 -1
- package/dist/rules/distribution.js +2 -2
- package/dist/rules/distribution.js.map +1 -1
- package/dist/skills/distribution.js +6 -6
- package/dist/skills/distribution.js.map +1 -1
- package/dist/skills/library.d.ts +1 -2
- package/dist/skills/library.js +6 -6
- package/dist/skills/library.js.map +1 -1
- package/dist/subagents/distribution.d.ts +1 -1
- package/dist/subagents/distribution.js +319 -20
- package/dist/subagents/distribution.js.map +1 -1
- package/dist/subagents/importer.d.ts +1 -1
- package/dist/subagents/importer.js +61 -1
- package/dist/subagents/importer.js.map +1 -1
- package/dist/subagents/inventory.js +3 -3
- package/dist/subagents/inventory.js.map +1 -1
- package/dist/subagents/library.d.ts +2 -2
- package/dist/subagents/library.js +14 -19
- package/dist/subagents/library.js.map +1 -1
- package/dist/ui/hook-ui.d.ts +8 -0
- package/dist/ui/hook-ui.js +17 -0
- package/dist/ui/hook-ui.js.map +1 -0
- package/dist/ui/library-selector.d.ts +1 -1
- package/dist/ui/subagent-ui.js +3 -3
- package/dist/ui/subagent-ui.js.map +1 -1
- package/dist/util/cli.d.ts +20 -0
- package/dist/util/cli.js +107 -14
- package/dist/util/cli.js.map +1 -1
- package/package.json +3 -2
- package/dist/config/agent-config.d.ts +0 -35
- package/dist/config/agent-config.js +0 -88
- package/dist/config/agent-config.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.js","sourceRoot":"","sources":["../../src/rules/composer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"composer.js","sourceRoot":"","sources":["../../src/rules/composer.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { getAgentsHome, getClaudeDir, getCodexDir, getCursorDir, getGeminiDir, getOpencodePath, getProjectCursorDir, } from '../config/paths.js';
|
|
4
4
|
import { RULE_INDIRECT_AGENTS, RULE_PER_FILE_AGENTS, RULE_SUPPORTED_AGENTS, RULE_UNSUPPORTED_AGENTS, } from './agents.js';
|
|
5
|
-
import {
|
|
5
|
+
import { composeActiveRulesForApplication } from './composer.js';
|
|
6
6
|
import { loadRuleLibrary } from './library.js';
|
|
7
7
|
import { updateRuleState } from './state.js';
|
|
8
8
|
function resolveRuleFile(agent, scope) {
|
|
@@ -92,7 +92,7 @@ export function distributeRules(_composed, options, scope) {
|
|
|
92
92
|
let firstComposed = null;
|
|
93
93
|
for (const agent of RULE_SUPPORTED_AGENTS) {
|
|
94
94
|
// Compose rules for this specific agent (applies per-agent overrides)
|
|
95
|
-
const document =
|
|
95
|
+
const document = composeActiveRulesForApplication(agent, scope);
|
|
96
96
|
if (!firstComposed) {
|
|
97
97
|
firstComposed = document;
|
|
98
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/rules/distribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/rules/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { getClaudeDir, getCodexDir, getCodexSkillsDir, getCursorDir, getGeminiDir, getOpencodeRoot, getProjectClaudeDir, getProjectCodexSkillsDir, getProjectCursorDir, getProjectGeminiDir, getProjectOpencodeRoot, } from '../config/paths.js';
|
|
4
4
|
import { distributeBundle, } from '../library/distribute-bundle.js';
|
|
5
|
-
import {
|
|
5
|
+
import { loadLibraryStateSectionForApplication } from '../library/state.js';
|
|
6
6
|
import { listSkillFiles, loadSkillLibrary } from './library.js';
|
|
7
7
|
export const SKILL_PLATFORMS = [
|
|
8
8
|
'claude-code',
|
|
@@ -22,7 +22,7 @@ const AGENTS_TARGET_PLATFORMS = ['codex', 'gemini', 'opencode'];
|
|
|
22
22
|
* cleanup of orphan `.cursor/skills/` directories still executes).
|
|
23
23
|
*/
|
|
24
24
|
function shouldDedupCursorSkills(scope) {
|
|
25
|
-
const claudeState =
|
|
25
|
+
const claudeState = loadLibraryStateSectionForApplication('skills', 'claude-code', scope);
|
|
26
26
|
return claudeState.active.length > 0;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
@@ -109,21 +109,21 @@ function distributeAgentsMode(entries, scope) {
|
|
|
109
109
|
if (target === 'cursor') {
|
|
110
110
|
if (shouldDedupCursorSkills(scope))
|
|
111
111
|
return [];
|
|
112
|
-
const state =
|
|
112
|
+
const state = loadLibraryStateSectionForApplication('skills', target, scope);
|
|
113
113
|
const activeIds = new Set(state.active);
|
|
114
114
|
return allEntries.filter((e) => activeIds.has(e.id));
|
|
115
115
|
}
|
|
116
116
|
if (target === 'agents') {
|
|
117
117
|
const unionIds = new Set();
|
|
118
118
|
for (const agentId of AGENTS_TARGET_PLATFORMS) {
|
|
119
|
-
const state =
|
|
119
|
+
const state = loadLibraryStateSectionForApplication('skills', agentId, scope);
|
|
120
120
|
for (const id of state.active) {
|
|
121
121
|
unionIds.add(id);
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
return allEntries.filter((e) => unionIds.has(e.id));
|
|
125
125
|
}
|
|
126
|
-
const state =
|
|
126
|
+
const state = loadLibraryStateSectionForApplication('skills', target, scope);
|
|
127
127
|
const activeIds = new Set(state.active);
|
|
128
128
|
return allEntries.filter((e) => activeIds.has(e.id));
|
|
129
129
|
};
|
|
@@ -177,7 +177,7 @@ function distributeLegacyMode(entries, scope) {
|
|
|
177
177
|
if (shouldDedupCursorSkills(scope))
|
|
178
178
|
return [];
|
|
179
179
|
}
|
|
180
|
-
const state =
|
|
180
|
+
const state = loadLibraryStateSectionForApplication('skills', target, scope);
|
|
181
181
|
const activeIds = new Set(state.active);
|
|
182
182
|
return allEntries.filter((e) => activeIds.has(e.id));
|
|
183
183
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/skills/distribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAIL,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/skills/distribution.ts"],"names":[],"mappings":"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"}
|
package/dist/skills/library.d.ts
CHANGED
|
@@ -25,8 +25,7 @@ export interface BundleFile {
|
|
|
25
25
|
}
|
|
26
26
|
export declare function ensureSkillsDirectory(): string;
|
|
27
27
|
/**
|
|
28
|
-
* Load all skills from default library and
|
|
29
|
-
* Each skill is a directory containing a SKILL.md file.
|
|
28
|
+
* Load all skills from default library, flat sources, and marketplace sources.
|
|
30
29
|
*/
|
|
31
30
|
export declare function loadSkillLibrary(): SkillEntry[];
|
|
32
31
|
/**
|
package/dist/skills/library.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { getSkillsDir } from '../config/paths.js';
|
|
4
|
-
import {
|
|
4
|
+
import { loadEntriesFromSources } from '../marketplace/source-loader.js';
|
|
5
5
|
import { parseSkillMarkdown } from './parser.js';
|
|
6
6
|
const SKILL_FILE = 'SKILL.md';
|
|
7
7
|
export function ensureSkillsDirectory() {
|
|
@@ -61,19 +61,19 @@ function loadSkillsFromDirectory(directory, namespace) {
|
|
|
61
61
|
return result;
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* Load all skills from default library and
|
|
65
|
-
* Each skill is a directory containing a SKILL.md file.
|
|
64
|
+
* Load all skills from default library, flat sources, and marketplace sources.
|
|
66
65
|
*/
|
|
67
66
|
export function loadSkillLibrary() {
|
|
68
67
|
const result = [];
|
|
69
|
-
// Load from default library (no namespace)
|
|
70
68
|
const defaultDir = ensureSkillsDirectory();
|
|
71
69
|
result.push(...loadSkillsFromDirectory(defaultDir));
|
|
72
|
-
const
|
|
73
|
-
for (const
|
|
70
|
+
const { flatSources, marketplaceEntries } = loadEntriesFromSources();
|
|
71
|
+
for (const { namespace, basePath } of flatSources) {
|
|
74
72
|
const skillsDir = path.join(basePath, 'skills');
|
|
75
73
|
result.push(...loadSkillsFromDirectory(skillsDir, namespace));
|
|
76
74
|
}
|
|
75
|
+
// Marketplace skill entries have the same shape as SkillEntry
|
|
76
|
+
result.push(...marketplaceEntries.skills);
|
|
77
77
|
result.sort((a, b) => a.id.localeCompare(b.id));
|
|
78
78
|
return result;
|
|
79
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/skills/library.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/skills/library.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA6BjD,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,MAAM,UAAU,qBAAqB;IACnC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,SAAiB,EAAE,SAAkB;IACpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAExC,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAEzD,kDAAkD;YAClD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CACV,0BAA0B,KAAK,CAAC,IAAI,oCAAoC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAChG,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE;gBACF,MAAM;gBACN,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,OAAO;gBACP,SAAS;gBACT,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;IAEpD,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,sBAAsB,EAAE,CAAC;IAErE,KAAK,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,8DAA8D;IAC9D,MAAM,CAAC,IAAI,CAAC,GAAI,kBAAkB,CAAC,MAAuB,CAAC,CAAC;IAE5D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,SAAS,IAAI,CAAC,GAAW,EAAE,MAAc;QACvC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,4CAA4C;YAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAExC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAEvE,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ConfigScope } from '../config/scope.js';
|
|
2
2
|
import { type DistributeOutcome } from '../library/distribute.js';
|
|
3
|
-
export type SubagentPlatform = 'claude-code' | 'opencode' | 'cursor';
|
|
3
|
+
export type SubagentPlatform = 'claude-code' | 'opencode' | 'cursor' | 'codex';
|
|
4
4
|
export interface SubagentDistributionResult {
|
|
5
5
|
platform: SubagentPlatform;
|
|
6
6
|
filePath: string;
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
1
2
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
3
|
+
import { parse as parseToml, stringify as tomlStringify } from '@iarna/toml';
|
|
4
|
+
import { getClaudeDir, getCodexAgentsDir, getCodexConfigPath, getCursorDir, getOpencodePath, getProjectClaudeDir, getProjectCursorDir, getProjectOpencodePath, } from '../config/paths.js';
|
|
3
5
|
import { distributeLibrary, } from '../library/distribute.js';
|
|
4
|
-
import {
|
|
6
|
+
import { ensureParentDir } from '../library/fs.js';
|
|
7
|
+
import { loadLibraryStateSectionForApplication } from '../library/state.js';
|
|
5
8
|
import { wrapFrontmatter } from '../util/frontmatter.js';
|
|
6
9
|
import { loadSubagentLibrary } from './library.js';
|
|
7
|
-
/**
|
|
8
|
-
* Map platform to agent ID for per-agent configuration lookup
|
|
9
|
-
*/
|
|
10
10
|
function platformToAgentId(platform) {
|
|
11
11
|
return platform;
|
|
12
12
|
}
|
|
13
13
|
export function resolveSubagentFilePath(platform, id, scope) {
|
|
14
|
-
|
|
14
|
+
const dir = resolveSubagentTargetDir(platform, scope);
|
|
15
|
+
const ext = platform === 'codex' ? '.toml' : '.md';
|
|
16
|
+
return path.join(dir, `${id}${ext}`);
|
|
15
17
|
}
|
|
16
18
|
function resolveSubagentTargetDir(platform, scope) {
|
|
17
19
|
const projectRoot = scope?.project?.trim();
|
|
@@ -34,8 +36,14 @@ function resolveSubagentTargetDir(platform, scope) {
|
|
|
34
36
|
}
|
|
35
37
|
return path.join(getCursorDir(), 'agents');
|
|
36
38
|
}
|
|
39
|
+
case 'codex': {
|
|
40
|
+
return getCodexAgentsDir();
|
|
41
|
+
}
|
|
37
42
|
}
|
|
38
43
|
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Markdown-based platforms (Claude Code, OpenCode, Cursor)
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
39
47
|
function buildFrontmatterForClaude(entry) {
|
|
40
48
|
const extras = entry.metadata.extras;
|
|
41
49
|
const cc = extras?.['claude-code'] ?? undefined;
|
|
@@ -46,7 +54,6 @@ function buildFrontmatterForClaude(entry) {
|
|
|
46
54
|
for (const [k, v] of Object.entries(cc))
|
|
47
55
|
base[k] = v;
|
|
48
56
|
}
|
|
49
|
-
// Claude Code requires `name` in frontmatter. If missing/empty, use filename (entry.id).
|
|
50
57
|
const rawName = base.name;
|
|
51
58
|
if (typeof rawName !== 'string' || rawName.trim().length === 0) {
|
|
52
59
|
base.name = entry.id;
|
|
@@ -91,7 +98,7 @@ function buildFrontmatterForCursor(entry) {
|
|
|
91
98
|
base.model = 'inherit';
|
|
92
99
|
return base;
|
|
93
100
|
}
|
|
94
|
-
function
|
|
101
|
+
function renderForMarkdownPlatform(platform, entry) {
|
|
95
102
|
switch (platform) {
|
|
96
103
|
case 'claude-code': {
|
|
97
104
|
const fm = buildFrontmatterForClaude(entry);
|
|
@@ -107,11 +114,297 @@ function renderForPlatform(platform, entry) {
|
|
|
107
114
|
}
|
|
108
115
|
}
|
|
109
116
|
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Codex platform (TOML-based agent roles)
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
const ASB_MANAGED_MARKER = '# managed-by: asb';
|
|
121
|
+
const CODEX_ROLE_CONFIG_FIELDS = new Set([
|
|
122
|
+
'model',
|
|
123
|
+
'model_reasoning_effort',
|
|
124
|
+
'model_reasoning_summary',
|
|
125
|
+
'model_verbosity',
|
|
126
|
+
'sandbox_mode',
|
|
127
|
+
]);
|
|
128
|
+
function hasCodexExtras(entry) {
|
|
129
|
+
const extras = entry.metadata.extras;
|
|
130
|
+
if (!extras?.codex)
|
|
131
|
+
return false;
|
|
132
|
+
const codex = extras.codex;
|
|
133
|
+
return typeof codex === 'object' && Object.keys(codex).length > 0;
|
|
134
|
+
}
|
|
135
|
+
function renderCodexRoleConfig(entry) {
|
|
136
|
+
const extras = entry.metadata.extras;
|
|
137
|
+
const codexExtras = extras?.codex ?? {};
|
|
138
|
+
const config = {};
|
|
139
|
+
for (const field of CODEX_ROLE_CONFIG_FIELDS) {
|
|
140
|
+
const value = codexExtras[field];
|
|
141
|
+
if (value !== undefined && value !== null) {
|
|
142
|
+
config[field] = value;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const trimmedContent = entry.content.trim();
|
|
146
|
+
if (trimmedContent.length > 0) {
|
|
147
|
+
config.developer_instructions = trimmedContent;
|
|
148
|
+
}
|
|
149
|
+
// Use @iarna/toml for correct value formatting
|
|
150
|
+
let toml = '';
|
|
151
|
+
try {
|
|
152
|
+
toml = tomlStringify(config);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Fallback: skip developer_instructions if it breaks TOML serialization
|
|
156
|
+
const { developer_instructions: _ignored, ...rest } = config;
|
|
157
|
+
toml = tomlStringify(rest);
|
|
158
|
+
}
|
|
159
|
+
return `${ASB_MANAGED_MARKER}\n${toml}`;
|
|
160
|
+
}
|
|
161
|
+
function isAsbManagedToml(filePath) {
|
|
162
|
+
try {
|
|
163
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
164
|
+
return content.startsWith(ASB_MANAGED_MARKER);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Distribute subagents to Codex as TOML role config files + config.toml injection.
|
|
172
|
+
* Handles:
|
|
173
|
+
* 1. Writing role config TOML files to ~/.codex/agents/
|
|
174
|
+
* 2. Cleaning up orphan ASB-managed TOML files
|
|
175
|
+
* 3. Injecting [agents.<id>] declarations into ~/.codex/config.toml
|
|
176
|
+
* 4. Enabling [features].multi_agent if needed
|
|
177
|
+
*/
|
|
178
|
+
function distributeCodexSubagents(_allEntries, byId, scope) {
|
|
179
|
+
const results = [];
|
|
180
|
+
const platform = 'codex';
|
|
181
|
+
// Resolve active IDs for Codex via per-agent config
|
|
182
|
+
const state = loadLibraryStateSectionForApplication('agents', platformToAgentId(platform), scope);
|
|
183
|
+
const selected = [];
|
|
184
|
+
for (const id of state.active) {
|
|
185
|
+
const e = byId.get(id);
|
|
186
|
+
// Only include entries that have extras.codex (Codex-compatible config)
|
|
187
|
+
if (e && hasCodexExtras(e))
|
|
188
|
+
selected.push(e);
|
|
189
|
+
}
|
|
190
|
+
const targetDir = resolveSubagentTargetDir(platform, scope);
|
|
191
|
+
// Step 1: Write TOML role config files
|
|
192
|
+
const activeIds = new Set();
|
|
193
|
+
for (const entry of selected) {
|
|
194
|
+
activeIds.add(entry.id);
|
|
195
|
+
const filePath = resolveSubagentFilePath(platform, entry.id, scope);
|
|
196
|
+
const content = renderCodexRoleConfig(entry);
|
|
197
|
+
ensureParentDir(filePath);
|
|
198
|
+
let existing = null;
|
|
199
|
+
try {
|
|
200
|
+
if (fs.existsSync(filePath))
|
|
201
|
+
existing = fs.readFileSync(filePath, 'utf-8');
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
existing = null;
|
|
205
|
+
}
|
|
206
|
+
if (existing !== null && existing === content) {
|
|
207
|
+
results.push({ platform, filePath, status: 'skipped', reason: 'up-to-date' });
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
try {
|
|
211
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
212
|
+
results.push({
|
|
213
|
+
platform,
|
|
214
|
+
filePath,
|
|
215
|
+
status: 'written',
|
|
216
|
+
reason: existing ? 'updated' : 'created',
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
221
|
+
results.push({ platform, filePath, status: 'error', error: msg });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Step 2: Clean up orphan ASB-managed TOML files
|
|
226
|
+
if (fs.existsSync(targetDir)) {
|
|
227
|
+
try {
|
|
228
|
+
for (const file of fs.readdirSync(targetDir)) {
|
|
229
|
+
if (!file.endsWith('.toml'))
|
|
230
|
+
continue;
|
|
231
|
+
const id = file.slice(0, -5);
|
|
232
|
+
if (activeIds.has(id))
|
|
233
|
+
continue;
|
|
234
|
+
const filePath = path.join(targetDir, file);
|
|
235
|
+
if (fs.statSync(filePath).isDirectory())
|
|
236
|
+
continue;
|
|
237
|
+
if (!isAsbManagedToml(filePath))
|
|
238
|
+
continue;
|
|
239
|
+
try {
|
|
240
|
+
fs.unlinkSync(filePath);
|
|
241
|
+
results.push({
|
|
242
|
+
platform,
|
|
243
|
+
filePath,
|
|
244
|
+
status: 'deleted',
|
|
245
|
+
reason: 'orphan',
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
250
|
+
results.push({
|
|
251
|
+
platform,
|
|
252
|
+
filePath,
|
|
253
|
+
status: 'error',
|
|
254
|
+
error: `Failed to delete orphan: ${msg}`,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
// Ignore directory read errors
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Step 3: Inject agent role declarations into config.toml
|
|
264
|
+
const injectionResult = injectCodexAgentEntries(selected, activeIds);
|
|
265
|
+
if (injectionResult.configResult) {
|
|
266
|
+
results.push(injectionResult.configResult);
|
|
267
|
+
}
|
|
268
|
+
return results;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Inject/remove [agents.<id>] declarations in ~/.codex/config.toml.
|
|
272
|
+
* Also enables [features].multi_agent when roles are distributed.
|
|
273
|
+
*/
|
|
274
|
+
function injectCodexAgentEntries(activeEntries, activeIds) {
|
|
275
|
+
const configPath = getCodexConfigPath();
|
|
276
|
+
const platform = 'codex';
|
|
277
|
+
let content = '';
|
|
278
|
+
try {
|
|
279
|
+
if (fs.existsSync(configPath)) {
|
|
280
|
+
content = fs.readFileSync(configPath, 'utf-8');
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return {
|
|
285
|
+
configResult: {
|
|
286
|
+
platform,
|
|
287
|
+
filePath: configPath,
|
|
288
|
+
status: 'error',
|
|
289
|
+
error: 'Failed to read config.toml',
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
let parsed = {};
|
|
294
|
+
try {
|
|
295
|
+
if (content.trim().length > 0) {
|
|
296
|
+
parsed = parseToml(content);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return {
|
|
301
|
+
configResult: {
|
|
302
|
+
platform,
|
|
303
|
+
filePath: configPath,
|
|
304
|
+
status: 'error',
|
|
305
|
+
error: 'Failed to parse config.toml',
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
const agents = (parsed.agents ?? {});
|
|
310
|
+
const reservedKeys = new Set(['max_threads', 'max_depth']);
|
|
311
|
+
let changed = false;
|
|
312
|
+
// Add/update entries for active subagents
|
|
313
|
+
for (const entry of activeEntries) {
|
|
314
|
+
const existing = agents[entry.id];
|
|
315
|
+
const newEntry = {
|
|
316
|
+
description: entry.metadata.description || `ASB-managed agent role: ${entry.id}`,
|
|
317
|
+
config_file: `agents/${entry.id}.toml`,
|
|
318
|
+
};
|
|
319
|
+
if (!existing ||
|
|
320
|
+
existing.description !== newEntry.description ||
|
|
321
|
+
existing.config_file !== newEntry.config_file) {
|
|
322
|
+
agents[entry.id] = newEntry;
|
|
323
|
+
changed = true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Remove orphan ASB-managed entries: entries pointing to agents/<id>.toml
|
|
327
|
+
// where the file no longer exists (was cleaned up in step 2) or id is not active
|
|
328
|
+
for (const [key, value] of Object.entries(agents)) {
|
|
329
|
+
if (reservedKeys.has(key))
|
|
330
|
+
continue;
|
|
331
|
+
if (activeIds.has(key))
|
|
332
|
+
continue;
|
|
333
|
+
if (typeof value !== 'object' || value === null)
|
|
334
|
+
continue;
|
|
335
|
+
const roleConfig = value;
|
|
336
|
+
const configFile = roleConfig.config_file;
|
|
337
|
+
if (typeof configFile === 'string' &&
|
|
338
|
+
configFile.startsWith('agents/') &&
|
|
339
|
+
configFile.endsWith('.toml')) {
|
|
340
|
+
// Check if the target file is ASB-managed (or already deleted)
|
|
341
|
+
const fullPath = path.join(path.dirname(configPath), configFile);
|
|
342
|
+
if (!fs.existsSync(fullPath) || isAsbManagedToml(fullPath)) {
|
|
343
|
+
delete agents[key];
|
|
344
|
+
changed = true;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (!changed && activeEntries.length === 0) {
|
|
349
|
+
return {};
|
|
350
|
+
}
|
|
351
|
+
parsed.agents = agents;
|
|
352
|
+
// Enable multi_agent feature flag when distributing roles
|
|
353
|
+
if (activeEntries.length > 0) {
|
|
354
|
+
const features = (parsed.features ?? {});
|
|
355
|
+
if (features.multi_agent !== true) {
|
|
356
|
+
features.multi_agent = true;
|
|
357
|
+
changed = true;
|
|
358
|
+
}
|
|
359
|
+
parsed.features = features;
|
|
360
|
+
}
|
|
361
|
+
if (!changed) {
|
|
362
|
+
return {};
|
|
363
|
+
}
|
|
364
|
+
// Rewrite config.toml preserving all sections.
|
|
365
|
+
// Separate mcp_servers to avoid @iarna/toml reformatting issues with its custom rendering.
|
|
366
|
+
const { mcp_servers, ...rest } = parsed;
|
|
367
|
+
try {
|
|
368
|
+
let newContent = tomlStringify(rest).trimEnd();
|
|
369
|
+
// Re-append mcp_servers if they existed (preserved verbatim from parsed structure)
|
|
370
|
+
if (mcp_servers && typeof mcp_servers === 'object' && Object.keys(mcp_servers).length > 0) {
|
|
371
|
+
const mcpPart = tomlStringify({
|
|
372
|
+
mcp_servers,
|
|
373
|
+
}).trimEnd();
|
|
374
|
+
newContent = `${newContent}\n\n${mcpPart}`;
|
|
375
|
+
}
|
|
376
|
+
newContent = `${newContent}\n`;
|
|
377
|
+
ensureParentDir(configPath);
|
|
378
|
+
fs.writeFileSync(configPath, newContent, 'utf-8');
|
|
379
|
+
return {
|
|
380
|
+
configResult: {
|
|
381
|
+
platform,
|
|
382
|
+
filePath: configPath,
|
|
383
|
+
status: 'written',
|
|
384
|
+
reason: 'agents injected',
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
390
|
+
return {
|
|
391
|
+
configResult: {
|
|
392
|
+
platform,
|
|
393
|
+
filePath: configPath,
|
|
394
|
+
status: 'error',
|
|
395
|
+
error: `Failed to write config.toml: ${msg}`,
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// ---------------------------------------------------------------------------
|
|
401
|
+
// Main distribution entry point
|
|
402
|
+
// ---------------------------------------------------------------------------
|
|
110
403
|
export function distributeSubagents(scope) {
|
|
111
404
|
const entries = loadSubagentLibrary();
|
|
112
405
|
const byId = new Map(entries.map((e) => [e.id, e]));
|
|
113
|
-
|
|
114
|
-
|
|
406
|
+
// Markdown-based platforms use the generic distributeLibrary framework
|
|
407
|
+
const markdownPlatforms = ['claude-code', 'opencode', 'cursor'];
|
|
115
408
|
const cleanup = {
|
|
116
409
|
resolveTargetDir: (p) => resolveSubagentTargetDir(p, scope),
|
|
117
410
|
extractId: (filename) => {
|
|
@@ -120,29 +413,35 @@ export function distributeSubagents(scope) {
|
|
|
120
413
|
return filename.slice(0, -3);
|
|
121
414
|
},
|
|
122
415
|
};
|
|
123
|
-
// Filter entries based on per-agent configuration
|
|
124
416
|
const filterSelected = (platform, _allEntries) => {
|
|
125
|
-
const
|
|
126
|
-
const state =
|
|
127
|
-
const activeIds = state.active;
|
|
417
|
+
const appId = platformToAgentId(platform);
|
|
418
|
+
const state = loadLibraryStateSectionForApplication('agents', appId, scope);
|
|
128
419
|
const selected = [];
|
|
129
|
-
for (const id of
|
|
420
|
+
for (const id of state.active) {
|
|
130
421
|
const e = byId.get(id);
|
|
131
422
|
if (e)
|
|
132
423
|
selected.push(e);
|
|
133
424
|
}
|
|
134
425
|
return selected;
|
|
135
426
|
};
|
|
136
|
-
|
|
137
|
-
section: '
|
|
138
|
-
selected: entries,
|
|
139
|
-
platforms,
|
|
427
|
+
const markdownOutcome = distributeLibrary({
|
|
428
|
+
section: 'agents',
|
|
429
|
+
selected: entries,
|
|
430
|
+
platforms: markdownPlatforms,
|
|
140
431
|
resolveFilePath: (p, e) => resolveSubagentFilePath(p, e.id, scope),
|
|
141
|
-
render: (p, e) =>
|
|
432
|
+
render: (p, e) => renderForMarkdownPlatform(p, e),
|
|
142
433
|
getId: (e) => e.id,
|
|
143
434
|
cleanup,
|
|
144
435
|
scope,
|
|
145
436
|
filterSelected,
|
|
146
437
|
});
|
|
438
|
+
// Codex: custom distribution (TOML files + config.toml injection)
|
|
439
|
+
const codexResults = distributeCodexSubagents(entries, byId, scope);
|
|
440
|
+
return {
|
|
441
|
+
results: [
|
|
442
|
+
...markdownOutcome.results,
|
|
443
|
+
...codexResults,
|
|
444
|
+
],
|
|
445
|
+
};
|
|
147
446
|
}
|
|
148
447
|
//# sourceMappingURL=distribution.js.map
|