agent-switchboard 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/agents/adapter.d.ts +17 -2
- package/dist/agents/claude-code.d.ts +8 -0
- package/dist/agents/claude-code.js +20 -0
- package/dist/agents/claude-code.js.map +1 -1
- package/dist/agents/codex.d.ts +7 -0
- package/dist/agents/codex.js +16 -6
- package/dist/agents/codex.js.map +1 -1
- package/dist/agents/cursor.d.ts +7 -0
- package/dist/agents/cursor.js +20 -3
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/gemini.d.ts +7 -0
- package/dist/agents/gemini.js +21 -3
- package/dist/agents/gemini.js.map +1 -1
- package/dist/agents/json-utils.js +6 -11
- package/dist/agents/json-utils.js.map +1 -1
- package/dist/agents/opencode.d.ts +8 -0
- package/dist/agents/opencode.js +18 -4
- package/dist/agents/opencode.js.map +1 -1
- package/dist/commands/distribution.js +49 -21
- package/dist/commands/distribution.js.map +1 -1
- package/dist/commands/importer.js +4 -16
- package/dist/commands/importer.js.map +1 -1
- package/dist/commands/inventory.js +23 -36
- package/dist/commands/inventory.js.map +1 -1
- package/dist/config/agent-config.d.ts +35 -0
- package/dist/config/agent-config.js +88 -0
- package/dist/config/agent-config.js.map +1 -0
- package/dist/config/mcp-config.d.ts +6 -18
- package/dist/config/mcp-config.js +33 -65
- package/dist/config/mcp-config.js.map +1 -1
- package/dist/config/schemas.d.ts +294 -15
- package/dist/config/schemas.js +54 -4
- package/dist/config/schemas.js.map +1 -1
- package/dist/index.js +136 -252
- package/dist/index.js.map +1 -1
- package/dist/library/distribute-bundle.d.ts +12 -1
- package/dist/library/distribute-bundle.js +62 -1
- package/dist/library/distribute-bundle.js.map +1 -1
- package/dist/library/distribute.d.ts +16 -1
- package/dist/library/distribute.js +46 -1
- package/dist/library/distribute.js.map +1 -1
- package/dist/library/state.d.ts +9 -0
- package/dist/library/state.js +36 -0
- package/dist/library/state.js.map +1 -1
- package/dist/skills/distribution.d.ts +1 -0
- package/dist/skills/distribution.js +37 -16
- package/dist/skills/distribution.js.map +1 -1
- package/dist/subagents/distribution.js +40 -16
- package/dist/subagents/distribution.js.map +1 -1
- package/dist/subagents/importer.js +4 -16
- package/dist/subagents/importer.js.map +1 -1
- package/dist/subagents/inventory.js +27 -68
- package/dist/subagents/inventory.js.map +1 -1
- package/dist/ui/library-selector.d.ts +1 -0
- package/dist/ui/library-selector.js +1 -1
- package/dist/ui/library-selector.js.map +1 -1
- package/dist/ui/mcp-ui.d.ts +6 -4
- package/dist/ui/mcp-ui.js +10 -11
- package/dist/ui/mcp-ui.js.map +1 -1
- package/dist/ui/rule-ui.js +3 -73
- package/dist/ui/rule-ui.js.map +1 -1
- package/dist/util/cli.d.ts +22 -0
- package/dist/util/cli.js +55 -0
- package/dist/util/cli.js.map +1 -1
- package/dist/util/extras.d.ts +3 -0
- package/dist/util/extras.js +29 -0
- package/dist/util/extras.js.map +1 -1
- package/dist/util/markdown.d.ts +10 -0
- package/dist/util/markdown.js +22 -0
- package/dist/util/markdown.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -212,6 +212,24 @@ The command merges the layered configuration, prints a warning that files will b
|
|
|
212
212
|
|
|
213
213
|
- `ASB_HOME`: overrides `~/.agent-switchboard` for library/state files.
|
|
214
214
|
|
|
215
|
+
## Development
|
|
216
|
+
|
|
217
|
+
Install dependencies, build, and link globally:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
pnpm install
|
|
221
|
+
pnpm build
|
|
222
|
+
pnpm link --global
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
After linking, the global `agent-switchboard` command points to your local build. Code changes take effect after running `pnpm build` again.
|
|
226
|
+
|
|
227
|
+
To unlink:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
pnpm uninstall -g agent-switchboard
|
|
231
|
+
```
|
|
232
|
+
|
|
215
233
|
## License
|
|
216
234
|
|
|
217
235
|
MIT
|
package/dist/agents/adapter.d.ts
CHANGED
|
@@ -15,13 +15,20 @@ export interface AgentAdapter {
|
|
|
15
15
|
*/
|
|
16
16
|
readonly id: string;
|
|
17
17
|
/**
|
|
18
|
-
* Returns the absolute path to the agent's config file
|
|
18
|
+
* Returns the absolute path to the agent's global config file
|
|
19
19
|
* @returns Absolute path to the config file
|
|
20
20
|
* @example "/Users/username/.claude.json"
|
|
21
21
|
*/
|
|
22
22
|
configPath(): string;
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* Returns the absolute path to the agent's project-level config file
|
|
25
|
+
* @param projectRoot - Absolute path to the project root directory
|
|
26
|
+
* @returns Absolute path to the project config file, or undefined if not supported
|
|
27
|
+
* @example "/path/to/project/.mcp.json"
|
|
28
|
+
*/
|
|
29
|
+
projectConfigPath?(projectRoot: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Applies MCP config to the agent's global config file
|
|
25
32
|
* - Merges with existing config (preserves unknown fields)
|
|
26
33
|
* - The 'enabled' field is excluded from the input
|
|
27
34
|
* @param config - MCP servers to apply (without 'enabled')
|
|
@@ -29,4 +36,12 @@ export interface AgentAdapter {
|
|
|
29
36
|
applyConfig(config: {
|
|
30
37
|
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
31
38
|
}): void;
|
|
39
|
+
/**
|
|
40
|
+
* Applies MCP config to the agent's project-level config file
|
|
41
|
+
* @param projectRoot - Absolute path to the project root directory
|
|
42
|
+
* @param config - MCP servers to apply (without 'enabled')
|
|
43
|
+
*/
|
|
44
|
+
applyProjectConfig?(projectRoot: string, config: {
|
|
45
|
+
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
46
|
+
}): void;
|
|
32
47
|
}
|
|
@@ -11,7 +11,15 @@ import type { AgentAdapter } from './adapter.js';
|
|
|
11
11
|
export declare class ClaudeCodeAgent implements AgentAdapter {
|
|
12
12
|
readonly id: "claude-code";
|
|
13
13
|
configPath(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Project-level config: <project>/.mcp.json
|
|
16
|
+
* Note: .claude/.mcp.json is NOT supported by Claude Code (known bug)
|
|
17
|
+
*/
|
|
18
|
+
projectConfigPath(projectRoot: string): string;
|
|
14
19
|
applyConfig(config: {
|
|
15
20
|
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
16
21
|
}): void;
|
|
22
|
+
applyProjectConfig(projectRoot: string, config: {
|
|
23
|
+
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
24
|
+
}): void;
|
|
17
25
|
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Claude Code agent adapter
|
|
3
3
|
* Manages MCP server configuration for Claude Code CLI
|
|
4
4
|
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import nodePath from 'node:path';
|
|
5
7
|
import { getClaudeJsonPath } from '../config/paths.js';
|
|
6
8
|
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js';
|
|
7
9
|
/**
|
|
@@ -13,11 +15,29 @@ export class ClaudeCodeAgent {
|
|
|
13
15
|
configPath() {
|
|
14
16
|
return getClaudeJsonPath();
|
|
15
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Project-level config: <project>/.mcp.json
|
|
20
|
+
* Note: .claude/.mcp.json is NOT supported by Claude Code (known bug)
|
|
21
|
+
*/
|
|
22
|
+
projectConfigPath(projectRoot) {
|
|
23
|
+
return nodePath.join(nodePath.resolve(projectRoot), '.mcp.json');
|
|
24
|
+
}
|
|
16
25
|
applyConfig(config) {
|
|
17
26
|
const path = this.configPath();
|
|
18
27
|
const agentConfig = loadJsonFile(path, { mcpServers: {} });
|
|
19
28
|
const merged = mergeMcpIntoAgent(agentConfig, config.mcpServers);
|
|
20
29
|
saveJsonFile(path, merged);
|
|
21
30
|
}
|
|
31
|
+
applyProjectConfig(projectRoot, config) {
|
|
32
|
+
const configPath = this.projectConfigPath(projectRoot);
|
|
33
|
+
// For project-level .mcp.json, only write mcpServers (no merge with existing non-mcp fields)
|
|
34
|
+
const existing = loadJsonFile(configPath, { mcpServers: {} });
|
|
35
|
+
const merged = mergeMcpIntoAgent(existing, config.mcpServers);
|
|
36
|
+
// Ensure parent directory exists
|
|
37
|
+
const dir = nodePath.dirname(configPath);
|
|
38
|
+
if (!fs.existsSync(dir))
|
|
39
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
40
|
+
saveJsonFile(configPath, merged);
|
|
41
|
+
}
|
|
22
42
|
}
|
|
23
43
|
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIvD,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;;GAGG;AACH,MAAM,OAAO,eAAe;IACjB,EAAE,GAAG,aAAsB,CAAC;IAErC,UAAU;QACR,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIvD,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;;GAGG;AACH,MAAM,OAAO,eAAe;IACjB,EAAE,GAAG,aAAsB,CAAC;IAErC,UAAU;QACR,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,WAAmB;QACnC,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IACnE,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,kBAAkB,CAChB,WAAmB,EACnB,MAAkE;QAElE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACvD,6FAA6F;QAC7F,MAAM,QAAQ,GAAG,YAAY,CAAkB,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QACxF,iCAAiC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;CACF"}
|
package/dist/agents/codex.d.ts
CHANGED
|
@@ -11,9 +11,16 @@ import type { AgentAdapter } from './adapter.js';
|
|
|
11
11
|
export declare class CodexAgent implements AgentAdapter {
|
|
12
12
|
readonly id: "codex";
|
|
13
13
|
configPath(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Project-level config: <project>/.codex/config.toml
|
|
16
|
+
*/
|
|
17
|
+
projectConfigPath(projectRoot: string): string;
|
|
14
18
|
applyConfig(config: {
|
|
15
19
|
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
16
20
|
}): void;
|
|
21
|
+
applyProjectConfig(projectRoot: string, config: {
|
|
22
|
+
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
23
|
+
}): void;
|
|
17
24
|
private _loadConfig;
|
|
18
25
|
private _saveConfig;
|
|
19
26
|
}
|
package/dist/agents/codex.js
CHANGED
|
@@ -15,20 +15,30 @@ export class CodexAgent {
|
|
|
15
15
|
configPath() {
|
|
16
16
|
return getCodexConfigPath();
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Project-level config: <project>/.codex/config.toml
|
|
20
|
+
*/
|
|
21
|
+
projectConfigPath(projectRoot) {
|
|
22
|
+
return path.join(path.resolve(projectRoot), '.codex', 'config.toml');
|
|
23
|
+
}
|
|
18
24
|
applyConfig(config) {
|
|
19
|
-
const content = this._loadConfig();
|
|
25
|
+
const content = this._loadConfig(this.configPath());
|
|
26
|
+
const updated = mergeConfig(content, config.mcpServers);
|
|
27
|
+
this._saveConfig(this.configPath(), updated);
|
|
28
|
+
}
|
|
29
|
+
applyProjectConfig(projectRoot, config) {
|
|
30
|
+
const configPath = this.projectConfigPath(projectRoot);
|
|
31
|
+
const content = this._loadConfig(configPath);
|
|
20
32
|
const updated = mergeConfig(content, config.mcpServers);
|
|
21
|
-
this._saveConfig(updated);
|
|
33
|
+
this._saveConfig(configPath, updated);
|
|
22
34
|
}
|
|
23
|
-
_loadConfig() {
|
|
24
|
-
const configPath = this.configPath();
|
|
35
|
+
_loadConfig(configPath) {
|
|
25
36
|
if (!fs.existsSync(configPath)) {
|
|
26
37
|
return '';
|
|
27
38
|
}
|
|
28
39
|
return fs.readFileSync(configPath, 'utf-8');
|
|
29
40
|
}
|
|
30
|
-
_saveConfig(content) {
|
|
31
|
-
const configPath = this.configPath();
|
|
41
|
+
_saveConfig(configPath, content) {
|
|
32
42
|
const dirPath = path.dirname(configPath);
|
|
33
43
|
if (!fs.existsSync(dirPath)) {
|
|
34
44
|
fs.mkdirSync(dirPath, { recursive: true });
|
package/dist/agents/codex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD;;;GAGG;AACH,MAAM,OAAO,UAAU;IACZ,EAAE,GAAG,OAAgB,CAAC;IAE/B,UAAU;QACR,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/cursor.d.ts
CHANGED
|
@@ -14,7 +14,14 @@ import type { AgentAdapter } from './adapter.js';
|
|
|
14
14
|
export declare class CursorAgent implements AgentAdapter {
|
|
15
15
|
readonly id: "cursor";
|
|
16
16
|
configPath(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Project-level config: <project>/.cursor/mcp.json
|
|
19
|
+
*/
|
|
20
|
+
projectConfigPath(projectRoot: string): string;
|
|
17
21
|
applyConfig(config: {
|
|
18
22
|
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
19
23
|
}): void;
|
|
24
|
+
applyProjectConfig(projectRoot: string, config: {
|
|
25
|
+
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
26
|
+
}): void;
|
|
20
27
|
}
|
package/dist/agents/cursor.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Cursor agent adapter
|
|
3
3
|
* Manages MCP server configuration for Cursor IDE
|
|
4
4
|
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
5
6
|
import os from 'node:os';
|
|
6
7
|
import path from 'node:path';
|
|
7
8
|
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js';
|
|
@@ -21,11 +22,27 @@ export class CursorAgent {
|
|
|
21
22
|
: os.homedir();
|
|
22
23
|
return path.join(base, '.cursor', 'mcp.json');
|
|
23
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Project-level config: <project>/.cursor/mcp.json
|
|
27
|
+
*/
|
|
28
|
+
projectConfigPath(projectRoot) {
|
|
29
|
+
return path.join(path.resolve(projectRoot), '.cursor', 'mcp.json');
|
|
30
|
+
}
|
|
24
31
|
applyConfig(config) {
|
|
25
|
-
const
|
|
26
|
-
const agentConfig = loadJsonFile(
|
|
32
|
+
const configPath = this.configPath();
|
|
33
|
+
const agentConfig = loadJsonFile(configPath, { mcpServers: {} });
|
|
27
34
|
const merged = mergeMcpIntoAgent(agentConfig, config.mcpServers);
|
|
28
|
-
saveJsonFile(
|
|
35
|
+
saveJsonFile(configPath, merged);
|
|
36
|
+
}
|
|
37
|
+
applyProjectConfig(projectRoot, config) {
|
|
38
|
+
const configPath = this.projectConfigPath(projectRoot);
|
|
39
|
+
const existing = loadJsonFile(configPath, { mcpServers: {} });
|
|
40
|
+
const merged = mergeMcpIntoAgent(existing, config.mcpServers);
|
|
41
|
+
// Ensure .cursor directory exists
|
|
42
|
+
const dir = path.dirname(configPath);
|
|
43
|
+
if (!fs.existsSync(dir))
|
|
44
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
45
|
+
saveJsonFile(configPath, merged);
|
|
29
46
|
}
|
|
30
47
|
}
|
|
31
48
|
//# sourceMappingURL=cursor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,EAAE,GAAG,QAAiB,CAAC;IAEhC,UAAU;QACR,MAAM,IAAI,GACR,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC1E,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,eAA0B;YACzC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,EAAE,GAAG,QAAiB,CAAC;IAEhC,UAAU;QACR,MAAM,IAAI,GACR,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC1E,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,eAA0B;YACzC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,WAAmB;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,YAAY,CAAkB,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB,CAChB,WAAmB,EACnB,MAAkE;QAElE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,YAAY,CAAkB,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QACxF,kCAAkC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;CACF"}
|
package/dist/agents/gemini.d.ts
CHANGED
|
@@ -14,7 +14,14 @@ import type { AgentAdapter } from './adapter.js';
|
|
|
14
14
|
export declare class GeminiAgent implements AgentAdapter {
|
|
15
15
|
readonly id: "gemini";
|
|
16
16
|
configPath(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Project-level config: <project>/.gemini/settings.json
|
|
19
|
+
*/
|
|
20
|
+
projectConfigPath(projectRoot: string): string;
|
|
17
21
|
applyConfig(config: {
|
|
18
22
|
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
19
23
|
}): void;
|
|
24
|
+
applyProjectConfig(projectRoot: string, config: {
|
|
25
|
+
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
26
|
+
}): void;
|
|
20
27
|
}
|
package/dist/agents/gemini.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Gemini CLI agent adapter
|
|
3
3
|
* Manages MCP server configuration for Gemini CLI
|
|
4
4
|
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
5
7
|
import { getGeminiSettingsPath } from '../config/paths.js';
|
|
6
8
|
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js';
|
|
7
9
|
/**
|
|
@@ -17,11 +19,27 @@ export class GeminiAgent {
|
|
|
17
19
|
configPath() {
|
|
18
20
|
return getGeminiSettingsPath();
|
|
19
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Project-level config: <project>/.gemini/settings.json
|
|
24
|
+
*/
|
|
25
|
+
projectConfigPath(projectRoot) {
|
|
26
|
+
return path.join(path.resolve(projectRoot), '.gemini', 'settings.json');
|
|
27
|
+
}
|
|
20
28
|
applyConfig(config) {
|
|
21
|
-
const
|
|
22
|
-
const agentConfig = loadJsonFile(
|
|
29
|
+
const configPath = this.configPath();
|
|
30
|
+
const agentConfig = loadJsonFile(configPath, { mcpServers: {} });
|
|
23
31
|
const merged = mergeMcpIntoAgent(agentConfig, config.mcpServers);
|
|
24
|
-
saveJsonFile(
|
|
32
|
+
saveJsonFile(configPath, merged);
|
|
33
|
+
}
|
|
34
|
+
applyProjectConfig(projectRoot, config) {
|
|
35
|
+
const configPath = this.projectConfigPath(projectRoot);
|
|
36
|
+
const existing = loadJsonFile(configPath, { mcpServers: {} });
|
|
37
|
+
const merged = mergeMcpIntoAgent(existing, config.mcpServers);
|
|
38
|
+
// Ensure .gemini directory exists
|
|
39
|
+
const dir = path.dirname(configPath);
|
|
40
|
+
if (!fs.existsSync(dir))
|
|
41
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
42
|
+
saveJsonFile(configPath, merged);
|
|
25
43
|
}
|
|
26
44
|
}
|
|
27
45
|
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agents/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,EAAE,GAAG,QAAiB,CAAC;IAEhC,UAAU;QACR,OAAO,qBAAqB,EAAE,CAAC;IACjC,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agents/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,EAAE,GAAG,QAAiB,CAAC;IAEhC,UAAU;QACR,OAAO,qBAAqB,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,WAAmB;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAC1E,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,YAAY,CAAkB,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB,CAChB,WAAmB,EACnB,MAAkE;QAElE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,YAAY,CAAkB,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QACxF,kCAAkC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -14,18 +14,13 @@ export function saveJsonFile(filePath, data) {
|
|
|
14
14
|
}
|
|
15
15
|
export function mergeMcpIntoAgent(agentConfig, mcpServers) {
|
|
16
16
|
const merged = { ...agentConfig };
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return merged;
|
|
21
|
-
}
|
|
22
|
-
if (!merged.mcpServers) {
|
|
23
|
-
merged.mcpServers = {};
|
|
24
|
-
}
|
|
25
|
-
const target = merged.mcpServers;
|
|
17
|
+
// Replace mcpServers entirely - only keep servers in the new config
|
|
18
|
+
// This ensures disabled servers are removed from target
|
|
19
|
+
merged.mcpServers = {};
|
|
26
20
|
for (const [name, server] of Object.entries(mcpServers)) {
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
// Preserve existing server-specific settings (if any) while applying new config
|
|
22
|
+
const existing = agentConfig.mcpServers?.[name] ?? {};
|
|
23
|
+
merged.mcpServers[name] = { ...existing, ...server };
|
|
29
24
|
}
|
|
30
25
|
return merged;
|
|
31
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../src/agents/json-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AAIzB,MAAM,UAAU,YAAY,CAAmB,QAAgB,EAAE,QAAW;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,IAAY;IACzD,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,WAA4B,EAC5B,UAAkC;IAElC,MAAM,MAAM,GAAoB,EAAE,GAAG,WAAW,EAAE,CAAC;IAEnD,
|
|
1
|
+
{"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../src/agents/json-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AAIzB,MAAM,UAAU,YAAY,CAAmB,QAAgB,EAAE,QAAW;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,IAAY;IACzD,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,WAA4B,EAC5B,UAAkC;IAElC,MAAM,MAAM,GAAoB,EAAE,GAAG,WAAW,EAAE,CAAC;IAEnD,oEAAoE;IACpE,wDAAwD;IACxD,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IAEvB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,gFAAgF;QAChF,MAAM,QAAQ,GAAI,WAAW,CAAC,UAAU,EAAE,CAAC,IAAI,CAA6B,IAAI,EAAE,CAAC;QACnF,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -7,7 +7,15 @@ import type { AgentAdapter } from './adapter.js';
|
|
|
7
7
|
export declare class OpencodeAgent implements AgentAdapter {
|
|
8
8
|
readonly id: "opencode";
|
|
9
9
|
configPath(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Project-level config: <project>/.opencode/opencode.json
|
|
12
|
+
*/
|
|
13
|
+
projectConfigPath(projectRoot: string): string;
|
|
10
14
|
applyConfig(config: {
|
|
11
15
|
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
12
16
|
}): void;
|
|
17
|
+
applyProjectConfig(projectRoot: string, config: {
|
|
18
|
+
mcpServers: Record<string, Omit<McpServer, 'enabled'>>;
|
|
19
|
+
}): void;
|
|
20
|
+
private _applyToPath;
|
|
13
21
|
}
|
package/dist/agents/opencode.js
CHANGED
|
@@ -4,14 +4,25 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import fs from 'node:fs';
|
|
6
6
|
import path from 'node:path';
|
|
7
|
-
import { getOpencodePath } from '../config/paths.js';
|
|
7
|
+
import { getOpencodePath, getProjectOpencodePath } from '../config/paths.js';
|
|
8
8
|
export class OpencodeAgent {
|
|
9
9
|
id = 'opencode';
|
|
10
10
|
configPath() {
|
|
11
11
|
return getOpencodePath('opencode.json');
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Project-level config: <project>/.opencode/opencode.json
|
|
15
|
+
*/
|
|
16
|
+
projectConfigPath(projectRoot) {
|
|
17
|
+
return getProjectOpencodePath(projectRoot, 'opencode.json');
|
|
18
|
+
}
|
|
13
19
|
applyConfig(config) {
|
|
14
|
-
|
|
20
|
+
this._applyToPath(this.configPath(), config);
|
|
21
|
+
}
|
|
22
|
+
applyProjectConfig(projectRoot, config) {
|
|
23
|
+
this._applyToPath(this.projectConfigPath(projectRoot), config);
|
|
24
|
+
}
|
|
25
|
+
_applyToPath(filePath, config) {
|
|
15
26
|
// Load existing
|
|
16
27
|
let current = {};
|
|
17
28
|
if (fs.existsSync(filePath)) {
|
|
@@ -25,9 +36,12 @@ export class OpencodeAgent {
|
|
|
25
36
|
}
|
|
26
37
|
}
|
|
27
38
|
const out = { ...current };
|
|
28
|
-
|
|
39
|
+
// Replace mcp entirely - only keep servers in the new config
|
|
40
|
+
// This ensures disabled servers are removed from target
|
|
41
|
+
const mcpOut = {};
|
|
29
42
|
for (const [name, server] of Object.entries(config.mcpServers)) {
|
|
30
|
-
|
|
43
|
+
// Preserve existing server-specific settings (if any) while applying new config
|
|
44
|
+
const prev = { ...(current.mcp?.[name] ?? {}) };
|
|
31
45
|
// Cast to extended type to access potential additional fields
|
|
32
46
|
const extServer = server;
|
|
33
47
|
// Map stdio/local vs http/remote
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,39 +2,47 @@ import path from 'node:path';
|
|
|
2
2
|
import { stringify as toToml } from '@iarna/toml';
|
|
3
3
|
import { getClaudeDir, getCodexDir, getGeminiDir, getOpencodePath, getProjectClaudeDir, getProjectGeminiDir, getProjectOpencodePath, } from '../config/paths.js';
|
|
4
4
|
import { distributeLibrary, } from '../library/distribute.js';
|
|
5
|
-
import {
|
|
5
|
+
import { loadLibraryStateSectionForAgent } from '../library/state.js';
|
|
6
6
|
import { wrapFrontmatter } from '../util/frontmatter.js';
|
|
7
7
|
import { loadCommandLibrary } from './library.js';
|
|
8
|
+
/**
|
|
9
|
+
* Map platform to agent ID for per-agent configuration lookup
|
|
10
|
+
*/
|
|
11
|
+
function platformToAgentId(platform) {
|
|
12
|
+
return platform;
|
|
13
|
+
}
|
|
8
14
|
export function resolveCommandFilePath(platform, id, scope) {
|
|
15
|
+
return path.join(resolveCommandTargetDir(platform, scope), getCommandFilename(platform, id));
|
|
16
|
+
}
|
|
17
|
+
function resolveCommandTargetDir(platform, scope) {
|
|
9
18
|
const projectRoot = scope?.project?.trim();
|
|
10
19
|
switch (platform) {
|
|
11
20
|
case 'claude-code': {
|
|
12
|
-
// Project-level supported: .claude/commands/
|
|
13
21
|
if (projectRoot && projectRoot.length > 0) {
|
|
14
|
-
return path.join(getProjectClaudeDir(projectRoot), 'commands'
|
|
22
|
+
return path.join(getProjectClaudeDir(projectRoot), 'commands');
|
|
15
23
|
}
|
|
16
|
-
return path.join(getClaudeDir(), 'commands'
|
|
24
|
+
return path.join(getClaudeDir(), 'commands');
|
|
17
25
|
}
|
|
18
26
|
case 'codex': {
|
|
19
|
-
|
|
20
|
-
return path.join(getCodexDir(), 'prompts', `${id}.md`);
|
|
27
|
+
return path.join(getCodexDir(), 'prompts');
|
|
21
28
|
}
|
|
22
29
|
case 'gemini': {
|
|
23
|
-
// Project-level supported: .gemini/commands/
|
|
24
30
|
if (projectRoot && projectRoot.length > 0) {
|
|
25
|
-
return path.join(getProjectGeminiDir(projectRoot), 'commands'
|
|
31
|
+
return path.join(getProjectGeminiDir(projectRoot), 'commands');
|
|
26
32
|
}
|
|
27
|
-
return path.join(getGeminiDir(), 'commands'
|
|
33
|
+
return path.join(getGeminiDir(), 'commands');
|
|
28
34
|
}
|
|
29
35
|
case 'opencode': {
|
|
30
|
-
// Project-level supported: .opencode/command/
|
|
31
36
|
if (projectRoot && projectRoot.length > 0) {
|
|
32
|
-
return getProjectOpencodePath(projectRoot, 'command'
|
|
37
|
+
return getProjectOpencodePath(projectRoot, 'command');
|
|
33
38
|
}
|
|
34
|
-
return getOpencodePath('command'
|
|
39
|
+
return getOpencodePath('command');
|
|
35
40
|
}
|
|
36
41
|
}
|
|
37
42
|
}
|
|
43
|
+
function getCommandFilename(platform, id) {
|
|
44
|
+
return platform === 'gemini' ? `${id}.toml` : `${id}.md`;
|
|
45
|
+
}
|
|
38
46
|
function buildFrontmatterForClaude(entry) {
|
|
39
47
|
const base = {};
|
|
40
48
|
if (entry.metadata.description)
|
|
@@ -93,23 +101,43 @@ function renderForPlatform(platform, entry) {
|
|
|
93
101
|
}
|
|
94
102
|
export function distributeCommands(scope) {
|
|
95
103
|
const entries = loadCommandLibrary();
|
|
96
|
-
const state = loadLibraryStateSection('commands', scope);
|
|
97
|
-
const activeIds = state.active;
|
|
98
104
|
const byId = new Map(entries.map((e) => [e.id, e]));
|
|
99
|
-
const selected = [];
|
|
100
|
-
for (const id of activeIds) {
|
|
101
|
-
const e = byId.get(id);
|
|
102
|
-
if (e)
|
|
103
|
-
selected.push(e);
|
|
104
|
-
}
|
|
105
105
|
const platforms = ['claude-code', 'codex', 'gemini', 'opencode'];
|
|
106
|
+
// Cleanup config to remove orphan command files
|
|
107
|
+
const cleanup = {
|
|
108
|
+
resolveTargetDir: (p) => resolveCommandTargetDir(p, scope),
|
|
109
|
+
extractId: (filename) => {
|
|
110
|
+
// Try both extensions since we don't know platform in extractId
|
|
111
|
+
if (filename.endsWith('.toml'))
|
|
112
|
+
return filename.slice(0, -5);
|
|
113
|
+
if (filename.endsWith('.md'))
|
|
114
|
+
return filename.slice(0, -3);
|
|
115
|
+
return null;
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
// Filter entries based on per-agent configuration
|
|
119
|
+
const filterSelected = (platform, _allEntries) => {
|
|
120
|
+
const agentId = platformToAgentId(platform);
|
|
121
|
+
const state = loadLibraryStateSectionForAgent('commands', agentId, scope);
|
|
122
|
+
const activeIds = state.active;
|
|
123
|
+
const selected = [];
|
|
124
|
+
for (const id of activeIds) {
|
|
125
|
+
const e = byId.get(id);
|
|
126
|
+
if (e)
|
|
127
|
+
selected.push(e);
|
|
128
|
+
}
|
|
129
|
+
return selected;
|
|
130
|
+
};
|
|
106
131
|
return distributeLibrary({
|
|
107
132
|
section: 'commands',
|
|
108
|
-
selected,
|
|
133
|
+
selected: entries, // Pass all entries, filtering happens per-platform
|
|
109
134
|
platforms,
|
|
110
135
|
resolveFilePath: (p, e) => resolveCommandFilePath(p, e.id, scope),
|
|
111
136
|
render: (p, e) => renderForPlatform(p, e),
|
|
137
|
+
getId: (e) => e.id,
|
|
138
|
+
cleanup,
|
|
112
139
|
scope,
|
|
140
|
+
filterSelected,
|
|
113
141
|
});
|
|
114
142
|
}
|
|
115
143
|
//# sourceMappingURL=distribution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/commands/distribution.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/commands/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { wrapFrontmatter } from '../util/frontmatter.js';
|
|
4
|
-
import {
|
|
4
|
+
import { extractMergedFrontmatter, slugify } from '../util/markdown.js';
|
|
5
5
|
function parseTomlString(content, key) {
|
|
6
6
|
// Naive TOML key = "value" or key = """multiline"""
|
|
7
7
|
const triple = new RegExp(`^\\s*${key}\\s*=\\s*"""([\\s\\S]*?)"""`, 'm');
|
|
@@ -14,7 +14,6 @@ function parseTomlString(content, key) {
|
|
|
14
14
|
return m1[1] ?? '';
|
|
15
15
|
return null;
|
|
16
16
|
}
|
|
17
|
-
// Using shared stripYamlFrontmatter from util/markdown
|
|
18
17
|
export function importCommandFromFile(platform, filePath) {
|
|
19
18
|
if (!fs.existsSync(filePath)) {
|
|
20
19
|
throw new Error(`Source file not found: ${filePath}`);
|
|
@@ -25,23 +24,12 @@ export function importCommandFromFile(platform, filePath) {
|
|
|
25
24
|
case 'claude-code':
|
|
26
25
|
case 'opencode': {
|
|
27
26
|
// Strip any existing frontmatter and wrap into library schema (description + extras.<platform>)
|
|
28
|
-
const extracted =
|
|
29
|
-
|
|
30
|
-
let meta = extracted.meta ?? {};
|
|
31
|
-
if (!meta || typeof meta !== 'object')
|
|
32
|
-
meta = {};
|
|
33
|
-
// Attempt to strip accidental second frontmatter at body start
|
|
34
|
-
const second = body.match(FRONTMATTER_PATTERN);
|
|
35
|
-
if (second && second.index === 0) {
|
|
36
|
-
const stripped = stripYamlFrontmatter(body);
|
|
37
|
-
meta = { ...meta, ...(stripped.meta ?? {}) };
|
|
38
|
-
body = stripped.body;
|
|
39
|
-
}
|
|
40
|
-
const metaRecord = meta;
|
|
27
|
+
const extracted = extractMergedFrontmatter(raw);
|
|
28
|
+
const metaRecord = extracted.meta;
|
|
41
29
|
const description = typeof metaRecord.description === 'string' ? metaRecord.description : '';
|
|
42
30
|
const rest = Object.fromEntries(Object.entries(metaRecord).filter(([k]) => k !== 'description'));
|
|
43
31
|
const fm = { description, extras: { [platform]: rest } };
|
|
44
|
-
const bodyNoFrontmatter = body.replace(/^\s*---\s*[\s\S]*?\r?\n---\s*\r?\n?/, '');
|
|
32
|
+
const bodyNoFrontmatter = extracted.body.replace(/^\s*---\s*[\s\S]*?\r?\n---\s*\r?\n?/, '');
|
|
45
33
|
return { slug: baseSlug, content: wrapFrontmatter(fm, bodyNoFrontmatter) };
|
|
46
34
|
}
|
|
47
35
|
case 'codex': {
|