@sentry/dotagents 0.3.0 → 0.4.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/README.md +73 -15
- package/dist/agents/definitions/claude.d.ts +4 -0
- package/dist/agents/definitions/claude.d.ts.map +1 -0
- package/dist/agents/definitions/claude.js +28 -0
- package/dist/agents/definitions/claude.js.map +1 -0
- package/dist/agents/definitions/codex.d.ts +4 -0
- package/dist/agents/definitions/codex.d.ts.map +1 -0
- package/dist/agents/definitions/codex.js +21 -0
- package/dist/agents/definitions/codex.js.map +1 -0
- package/dist/agents/definitions/cursor.d.ts +4 -0
- package/dist/agents/definitions/cursor.d.ts.map +1 -0
- package/dist/agents/definitions/cursor.js +45 -0
- package/dist/agents/definitions/cursor.js.map +1 -0
- package/dist/agents/definitions/helpers.d.ts +14 -0
- package/dist/agents/definitions/helpers.d.ts.map +1 -0
- package/dist/agents/definitions/helpers.js +39 -0
- package/dist/agents/definitions/helpers.js.map +1 -0
- package/dist/agents/definitions/opencode.d.ts +4 -0
- package/dist/agents/definitions/opencode.d.ts.map +1 -0
- package/dist/agents/definitions/opencode.js +33 -0
- package/dist/agents/definitions/opencode.js.map +1 -0
- package/dist/agents/definitions/vscode.d.ts +4 -0
- package/dist/agents/definitions/vscode.d.ts.map +1 -0
- package/dist/agents/definitions/vscode.js +31 -0
- package/dist/agents/definitions/vscode.js.map +1 -0
- package/dist/agents/errors.d.ts +9 -0
- package/dist/agents/errors.d.ts.map +1 -0
- package/dist/agents/errors.js +14 -0
- package/dist/agents/errors.js.map +1 -0
- package/dist/agents/hook-writer.d.ts +26 -0
- package/dist/agents/hook-writer.d.ts.map +1 -0
- package/dist/agents/hook-writer.js +105 -0
- package/dist/agents/hook-writer.js.map +1 -0
- package/dist/agents/hook-writer.test.d.ts +2 -0
- package/dist/agents/hook-writer.test.d.ts.map +1 -0
- package/dist/agents/hook-writer.test.js +155 -0
- package/dist/agents/hook-writer.test.js.map +1 -0
- package/dist/agents/index.d.ts +6 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/mcp-writer.d.ts +21 -0
- package/dist/agents/mcp-writer.d.ts.map +1 -0
- package/dist/agents/mcp-writer.js +115 -0
- package/dist/agents/mcp-writer.js.map +1 -0
- package/dist/agents/mcp-writer.test.d.ts +2 -0
- package/dist/agents/mcp-writer.test.d.ts.map +1 -0
- package/dist/agents/mcp-writer.test.js +146 -0
- package/dist/agents/mcp-writer.test.js.map +1 -0
- package/dist/agents/registry.d.ts +4 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +14 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/registry.test.d.ts +2 -0
- package/dist/agents/registry.test.d.ts.map +1 -0
- package/dist/agents/registry.test.js +144 -0
- package/dist/agents/registry.test.js.map +1 -0
- package/dist/agents/types.d.ts +88 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +6 -2
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +29 -9
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.test.js +16 -0
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/install.d.ts +4 -0
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +83 -69
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/install.test.js +44 -0
- package/dist/cli/commands/install.test.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +3 -1
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +61 -3
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/sync.test.js +35 -0
- package/dist/cli/commands/sync.test.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +4 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +7 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/loader.test.js +21 -0
- package/dist/config/loader.test.js.map +1 -1
- package/dist/config/schema.d.ts +63 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +39 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/schema.test.js +156 -0
- package/dist/config/schema.test.js.map +1 -1
- package/dist/config/writer.d.ts +1 -1
- package/dist/config/writer.d.ts.map +1 -1
- package/dist/config/writer.js +7 -2
- package/dist/config/writer.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/trust/index.d.ts +2 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +2 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/validator.d.ts +25 -0
- package/dist/trust/validator.d.ts.map +1 -0
- package/dist/trust/validator.js +86 -0
- package/dist/trust/validator.js.map +1 -0
- package/dist/trust/validator.test.d.ts +2 -0
- package/dist/trust/validator.test.d.ts.map +1 -0
- package/dist/trust/validator.test.js +145 -0
- package/dist/trust/validator.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtemp, readFile, writeFile, rm, mkdir } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import { writeHookConfigs, verifyHookConfigs, toHookDeclarations } from "./hook-writer.js";
|
|
7
|
+
const HOOKS = [
|
|
8
|
+
{ event: "PreToolUse", matcher: "Bash", command: ".agents/hooks/block-rm.sh" },
|
|
9
|
+
{ event: "Stop", command: ".agents/hooks/check-tests.sh" },
|
|
10
|
+
];
|
|
11
|
+
describe("toHookDeclarations", () => {
|
|
12
|
+
it("converts HookConfig entries to HookDeclarations", () => {
|
|
13
|
+
const configs = [
|
|
14
|
+
{ event: "PreToolUse", matcher: "Bash", command: ".agents/hooks/block-rm.sh" },
|
|
15
|
+
{ event: "Stop", command: ".agents/hooks/check-tests.sh" },
|
|
16
|
+
];
|
|
17
|
+
const decls = toHookDeclarations(configs);
|
|
18
|
+
expect(decls).toEqual(HOOKS);
|
|
19
|
+
});
|
|
20
|
+
it("omits matcher when not present", () => {
|
|
21
|
+
const configs = [{ event: "Stop", command: "test.sh" }];
|
|
22
|
+
const decls = toHookDeclarations(configs);
|
|
23
|
+
expect(decls[0]).toEqual({ event: "Stop", command: "test.sh" });
|
|
24
|
+
expect("matcher" in decls[0]).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("writeHookConfigs", () => {
|
|
28
|
+
let dir;
|
|
29
|
+
beforeEach(async () => {
|
|
30
|
+
dir = await mkdtemp(join(tmpdir(), "dotagents-hooks-"));
|
|
31
|
+
});
|
|
32
|
+
afterEach(async () => {
|
|
33
|
+
await rm(dir, { recursive: true });
|
|
34
|
+
});
|
|
35
|
+
it("skips when no hooks declared", async () => {
|
|
36
|
+
const warnings = await writeHookConfigs(dir, ["claude"], []);
|
|
37
|
+
expect(warnings).toEqual([]);
|
|
38
|
+
expect(existsSync(join(dir, ".claude", "settings.json"))).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
it("writes claude .claude/settings.json", async () => {
|
|
41
|
+
await writeHookConfigs(dir, ["claude"], HOOKS);
|
|
42
|
+
const content = JSON.parse(await readFile(join(dir, ".claude", "settings.json"), "utf-8"));
|
|
43
|
+
expect(content.hooks.PreToolUse).toEqual([
|
|
44
|
+
{ matcher: "Bash", hooks: [{ type: "command", command: ".agents/hooks/block-rm.sh" }] },
|
|
45
|
+
]);
|
|
46
|
+
expect(content.hooks.Stop).toEqual([
|
|
47
|
+
{ hooks: [{ type: "command", command: ".agents/hooks/check-tests.sh" }] },
|
|
48
|
+
]);
|
|
49
|
+
});
|
|
50
|
+
it("writes cursor .cursor/hooks.json with version field", async () => {
|
|
51
|
+
await writeHookConfigs(dir, ["cursor"], HOOKS);
|
|
52
|
+
const content = JSON.parse(await readFile(join(dir, ".cursor", "hooks.json"), "utf-8"));
|
|
53
|
+
expect(content.version).toBe(1);
|
|
54
|
+
expect(content.hooks.beforeShellExecution).toEqual([
|
|
55
|
+
{ command: ".agents/hooks/block-rm.sh" },
|
|
56
|
+
]);
|
|
57
|
+
expect(content.hooks.beforeMCPExecution).toEqual([
|
|
58
|
+
{ command: ".agents/hooks/block-rm.sh" },
|
|
59
|
+
]);
|
|
60
|
+
expect(content.hooks.stop).toEqual([
|
|
61
|
+
{ command: ".agents/hooks/check-tests.sh" },
|
|
62
|
+
]);
|
|
63
|
+
});
|
|
64
|
+
it("cursor drops matcher", async () => {
|
|
65
|
+
await writeHookConfigs(dir, ["cursor"], HOOKS);
|
|
66
|
+
const content = JSON.parse(await readFile(join(dir, ".cursor", "hooks.json"), "utf-8"));
|
|
67
|
+
// Cursor hooks should not contain matcher
|
|
68
|
+
for (const entries of Object.values(content.hooks)) {
|
|
69
|
+
for (const entry of entries) {
|
|
70
|
+
expect(entry).not.toHaveProperty("matcher");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
it("writes vscode to same .claude/settings.json as claude", async () => {
|
|
75
|
+
await writeHookConfigs(dir, ["vscode"], HOOKS);
|
|
76
|
+
const content = JSON.parse(await readFile(join(dir, ".claude", "settings.json"), "utf-8"));
|
|
77
|
+
expect(content.hooks.PreToolUse).toBeDefined();
|
|
78
|
+
});
|
|
79
|
+
it("deduplicates shared file between claude and vscode", async () => {
|
|
80
|
+
await writeHookConfigs(dir, ["claude", "vscode"], HOOKS);
|
|
81
|
+
// Should only write once — both target .claude/settings.json
|
|
82
|
+
const content = JSON.parse(await readFile(join(dir, ".claude", "settings.json"), "utf-8"));
|
|
83
|
+
expect(content.hooks.PreToolUse).toHaveLength(1);
|
|
84
|
+
});
|
|
85
|
+
it("returns warnings for unsupported agents", async () => {
|
|
86
|
+
const warnings = await writeHookConfigs(dir, ["codex", "opencode"], HOOKS);
|
|
87
|
+
expect(warnings).toHaveLength(2);
|
|
88
|
+
expect(warnings[0].agent).toBe("codex");
|
|
89
|
+
expect(warnings[1].agent).toBe("opencode");
|
|
90
|
+
expect(warnings[0].message).toContain("does not support");
|
|
91
|
+
});
|
|
92
|
+
it("writes supported agents and warns for unsupported ones", async () => {
|
|
93
|
+
const warnings = await writeHookConfigs(dir, ["claude", "codex"], HOOKS);
|
|
94
|
+
expect(warnings).toHaveLength(1);
|
|
95
|
+
expect(warnings[0].agent).toBe("codex");
|
|
96
|
+
expect(existsSync(join(dir, ".claude", "settings.json"))).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
it("merges into existing shared config file", async () => {
|
|
99
|
+
const claudeDir = join(dir, ".claude");
|
|
100
|
+
await mkdir(claudeDir, { recursive: true });
|
|
101
|
+
await writeFile(join(claudeDir, "settings.json"), JSON.stringify({ permissions: { allow: ["Read"] } }, null, 2), "utf-8");
|
|
102
|
+
await writeHookConfigs(dir, ["claude"], HOOKS);
|
|
103
|
+
const content = JSON.parse(await readFile(join(claudeDir, "settings.json"), "utf-8"));
|
|
104
|
+
expect(content.permissions).toEqual({ allow: ["Read"] });
|
|
105
|
+
expect(content.hooks).toBeDefined();
|
|
106
|
+
});
|
|
107
|
+
it("is idempotent", async () => {
|
|
108
|
+
await writeHookConfigs(dir, ["claude"], HOOKS);
|
|
109
|
+
const first = await readFile(join(dir, ".claude", "settings.json"), "utf-8");
|
|
110
|
+
await writeHookConfigs(dir, ["claude"], HOOKS);
|
|
111
|
+
const second = await readFile(join(dir, ".claude", "settings.json"), "utf-8");
|
|
112
|
+
expect(first).toBe(second);
|
|
113
|
+
});
|
|
114
|
+
it("handles multiple agents including cursor", async () => {
|
|
115
|
+
await writeHookConfigs(dir, ["claude", "cursor"], HOOKS);
|
|
116
|
+
expect(existsSync(join(dir, ".claude", "settings.json"))).toBe(true);
|
|
117
|
+
expect(existsSync(join(dir, ".cursor", "hooks.json"))).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("verifyHookConfigs", () => {
|
|
121
|
+
let dir;
|
|
122
|
+
beforeEach(async () => {
|
|
123
|
+
dir = await mkdtemp(join(tmpdir(), "dotagents-hooks-verify-"));
|
|
124
|
+
});
|
|
125
|
+
afterEach(async () => {
|
|
126
|
+
await rm(dir, { recursive: true });
|
|
127
|
+
});
|
|
128
|
+
it("returns no issues when configs match", async () => {
|
|
129
|
+
await writeHookConfigs(dir, ["claude"], HOOKS);
|
|
130
|
+
const issues = await verifyHookConfigs(dir, ["claude"], HOOKS);
|
|
131
|
+
expect(issues).toEqual([]);
|
|
132
|
+
});
|
|
133
|
+
it("reports missing config file", async () => {
|
|
134
|
+
const issues = await verifyHookConfigs(dir, ["claude"], HOOKS);
|
|
135
|
+
expect(issues).toHaveLength(1);
|
|
136
|
+
expect(issues[0].issue).toContain("missing");
|
|
137
|
+
});
|
|
138
|
+
it("skips unsupported agents without reporting issues", async () => {
|
|
139
|
+
const issues = await verifyHookConfigs(dir, ["codex"], HOOKS);
|
|
140
|
+
expect(issues).toEqual([]);
|
|
141
|
+
});
|
|
142
|
+
it("returns empty when no hooks declared", async () => {
|
|
143
|
+
const issues = await verifyHookConfigs(dir, ["claude"], []);
|
|
144
|
+
expect(issues).toEqual([]);
|
|
145
|
+
});
|
|
146
|
+
it("reports missing hooks key", async () => {
|
|
147
|
+
const claudeDir = join(dir, ".claude");
|
|
148
|
+
await mkdir(claudeDir, { recursive: true });
|
|
149
|
+
await writeFile(join(claudeDir, "settings.json"), JSON.stringify({ permissions: {} }, null, 2), "utf-8");
|
|
150
|
+
const issues = await verifyHookConfigs(dir, ["claude"], HOOKS);
|
|
151
|
+
expect(issues).toHaveLength(1);
|
|
152
|
+
expect(issues[0].issue).toContain("hooks");
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=hook-writer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-writer.test.js","sourceRoot":"","sources":["../../src/agents/hook-writer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { getAgent, allAgentIds } from "./registry.js";
|
|
2
|
+
export { writeMcpConfigs, verifyMcpConfigs, toMcpDeclarations } from "./mcp-writer.js";
|
|
3
|
+
export { writeHookConfigs, verifyHookConfigs, toHookDeclarations } from "./hook-writer.js";
|
|
4
|
+
export { UnsupportedFeature } from "./errors.js";
|
|
5
|
+
export type { AgentDefinition, McpDeclaration, McpConfigSpec, McpSerializer, HookDeclaration, HookConfigSpec, HookSerializer, } from "./types.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { getAgent, allAgentIds } from "./registry.js";
|
|
2
|
+
export { writeMcpConfigs, verifyMcpConfigs, toMcpDeclarations } from "./mcp-writer.js";
|
|
3
|
+
export { writeHookConfigs, verifyHookConfigs, toHookDeclarations } from "./hook-writer.js";
|
|
4
|
+
export { UnsupportedFeature } from "./errors.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { McpDeclaration } from "./types.js";
|
|
2
|
+
import type { McpConfig } from "../config/schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* Convert McpConfig entries (from agents.toml) to universal McpDeclarations.
|
|
5
|
+
*/
|
|
6
|
+
export declare function toMcpDeclarations(configs: McpConfig[]): McpDeclaration[];
|
|
7
|
+
/**
|
|
8
|
+
* Write MCP config files for each agent.
|
|
9
|
+
* - Dedicated files (shared=false): written fresh each time.
|
|
10
|
+
* - Shared files (shared=true): read existing, merge dotagents servers under the root key, write back.
|
|
11
|
+
*/
|
|
12
|
+
export declare function writeMcpConfigs(projectRoot: string, agentIds: string[], servers: McpDeclaration[]): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Verify MCP configs exist and contain the expected servers.
|
|
15
|
+
* Returns a list of issues found.
|
|
16
|
+
*/
|
|
17
|
+
export declare function verifyMcpConfigs(projectRoot: string, agentIds: string[], servers: McpDeclaration[]): Promise<{
|
|
18
|
+
agent: string;
|
|
19
|
+
issue: string;
|
|
20
|
+
}[]>;
|
|
21
|
+
//# sourceMappingURL=mcp-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-writer.d.ts","sourceRoot":"","sources":["../../src/agents/mcp-writer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CASxE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAoC7C"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { stringify as tomlStringify, parse as parseTOML } from "smol-toml";
|
|
5
|
+
import { getAgent } from "./registry.js";
|
|
6
|
+
/**
|
|
7
|
+
* Convert McpConfig entries (from agents.toml) to universal McpDeclarations.
|
|
8
|
+
*/
|
|
9
|
+
export function toMcpDeclarations(configs) {
|
|
10
|
+
return configs.map((m) => ({
|
|
11
|
+
name: m.name,
|
|
12
|
+
...(m.command && { command: m.command }),
|
|
13
|
+
...(m.args && { args: m.args }),
|
|
14
|
+
...(m.url && { url: m.url }),
|
|
15
|
+
...(m.headers && { headers: m.headers }),
|
|
16
|
+
...(m.env.length > 0 && { env: m.env }),
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Write MCP config files for each agent.
|
|
21
|
+
* - Dedicated files (shared=false): written fresh each time.
|
|
22
|
+
* - Shared files (shared=true): read existing, merge dotagents servers under the root key, write back.
|
|
23
|
+
*/
|
|
24
|
+
export async function writeMcpConfigs(projectRoot, agentIds, servers) {
|
|
25
|
+
if (servers.length === 0)
|
|
26
|
+
return;
|
|
27
|
+
// Deduplicate by filePath so shared files aren't written twice
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
for (const id of agentIds) {
|
|
30
|
+
const agent = getAgent(id);
|
|
31
|
+
if (!agent)
|
|
32
|
+
continue;
|
|
33
|
+
const { mcp } = agent;
|
|
34
|
+
if (seen.has(mcp.filePath))
|
|
35
|
+
continue;
|
|
36
|
+
seen.add(mcp.filePath);
|
|
37
|
+
const serialized = {};
|
|
38
|
+
for (const server of servers) {
|
|
39
|
+
const [name, config] = agent.serializeServer(server);
|
|
40
|
+
serialized[name] = config;
|
|
41
|
+
}
|
|
42
|
+
const filePath = join(projectRoot, mcp.filePath);
|
|
43
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
44
|
+
if (mcp.shared) {
|
|
45
|
+
await mergeWrite(filePath, mcp, serialized);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
await freshWrite(filePath, mcp, serialized);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Verify MCP configs exist and contain the expected servers.
|
|
54
|
+
* Returns a list of issues found.
|
|
55
|
+
*/
|
|
56
|
+
export async function verifyMcpConfigs(projectRoot, agentIds, servers) {
|
|
57
|
+
if (servers.length === 0)
|
|
58
|
+
return [];
|
|
59
|
+
const issues = [];
|
|
60
|
+
const seen = new Set();
|
|
61
|
+
for (const id of agentIds) {
|
|
62
|
+
const agent = getAgent(id);
|
|
63
|
+
if (!agent)
|
|
64
|
+
continue;
|
|
65
|
+
const { mcp } = agent;
|
|
66
|
+
if (seen.has(mcp.filePath))
|
|
67
|
+
continue;
|
|
68
|
+
seen.add(mcp.filePath);
|
|
69
|
+
const filePath = join(projectRoot, mcp.filePath);
|
|
70
|
+
if (!existsSync(filePath)) {
|
|
71
|
+
issues.push({ agent: id, issue: `MCP config missing: ${mcp.filePath}` });
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Verify content has the expected servers
|
|
75
|
+
const expectedNames = servers.map((s) => s.name);
|
|
76
|
+
try {
|
|
77
|
+
const existing = await readExisting(filePath, mcp);
|
|
78
|
+
const existingServers = existing[mcp.rootKey];
|
|
79
|
+
for (const name of expectedNames) {
|
|
80
|
+
if (!existingServers || !(name in existingServers)) {
|
|
81
|
+
issues.push({ agent: id, issue: `MCP server "${name}" missing from ${mcp.filePath}` });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
issues.push({ agent: id, issue: `Failed to read MCP config: ${mcp.filePath}` });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return issues;
|
|
90
|
+
}
|
|
91
|
+
// --- Internal helpers ---
|
|
92
|
+
async function freshWrite(filePath, spec, servers) {
|
|
93
|
+
const doc = { [spec.rootKey]: servers };
|
|
94
|
+
await writeFile(filePath, serialize(doc, spec.format), "utf-8");
|
|
95
|
+
}
|
|
96
|
+
async function mergeWrite(filePath, spec, servers) {
|
|
97
|
+
const existing = existsSync(filePath) ? await readExisting(filePath, spec) : {};
|
|
98
|
+
const prev = (existing[spec.rootKey] ?? {});
|
|
99
|
+
existing[spec.rootKey] = { ...prev, ...servers };
|
|
100
|
+
await writeFile(filePath, serialize(existing, spec.format), "utf-8");
|
|
101
|
+
}
|
|
102
|
+
async function readExisting(filePath, spec) {
|
|
103
|
+
const raw = await readFile(filePath, "utf-8");
|
|
104
|
+
if (spec.format === "toml") {
|
|
105
|
+
return parseTOML(raw);
|
|
106
|
+
}
|
|
107
|
+
return JSON.parse(raw);
|
|
108
|
+
}
|
|
109
|
+
function serialize(doc, format) {
|
|
110
|
+
if (format === "toml") {
|
|
111
|
+
return tomlStringify(doc) + "\n";
|
|
112
|
+
}
|
|
113
|
+
return JSON.stringify(doc, null, 2) + "\n";
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=mcp-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-writer.js","sourceRoot":"","sources":["../../src/agents/mcp-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-writer.test.d.ts","sourceRoot":"","sources":["../../src/agents/mcp-writer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtemp, readFile, writeFile, rm } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import { writeMcpConfigs, verifyMcpConfigs } from "./mcp-writer.js";
|
|
7
|
+
const STDIO_SERVER = {
|
|
8
|
+
name: "github",
|
|
9
|
+
command: "npx",
|
|
10
|
+
args: ["-y", "@mcp/server-github"],
|
|
11
|
+
env: ["GITHUB_TOKEN"],
|
|
12
|
+
};
|
|
13
|
+
const HTTP_SERVER = {
|
|
14
|
+
name: "remote",
|
|
15
|
+
url: "https://mcp.example.com/sse",
|
|
16
|
+
headers: { Authorization: "Bearer tok" },
|
|
17
|
+
};
|
|
18
|
+
describe("writeMcpConfigs", () => {
|
|
19
|
+
let dir;
|
|
20
|
+
beforeEach(async () => {
|
|
21
|
+
dir = await mkdtemp(join(tmpdir(), "dotagents-mcp-"));
|
|
22
|
+
});
|
|
23
|
+
afterEach(async () => {
|
|
24
|
+
await rm(dir, { recursive: true });
|
|
25
|
+
});
|
|
26
|
+
it("skips when no servers declared", async () => {
|
|
27
|
+
await writeMcpConfigs(dir, ["claude"], []);
|
|
28
|
+
expect(existsSync(join(dir, ".mcp.json"))).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
it("writes claude .mcp.json", async () => {
|
|
31
|
+
await writeMcpConfigs(dir, ["claude"], [STDIO_SERVER]);
|
|
32
|
+
const content = JSON.parse(await readFile(join(dir, ".mcp.json"), "utf-8"));
|
|
33
|
+
expect(content.mcpServers.github).toEqual({
|
|
34
|
+
command: "npx",
|
|
35
|
+
args: ["-y", "@mcp/server-github"],
|
|
36
|
+
env: { GITHUB_TOKEN: "${GITHUB_TOKEN}" },
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it("writes cursor .cursor/mcp.json", async () => {
|
|
40
|
+
await writeMcpConfigs(dir, ["cursor"], [STDIO_SERVER]);
|
|
41
|
+
const content = JSON.parse(await readFile(join(dir, ".cursor", "mcp.json"), "utf-8"));
|
|
42
|
+
expect(content.mcpServers.github).toBeDefined();
|
|
43
|
+
});
|
|
44
|
+
it("writes vscode .vscode/mcp.json with input refs", async () => {
|
|
45
|
+
await writeMcpConfigs(dir, ["vscode"], [STDIO_SERVER]);
|
|
46
|
+
const content = JSON.parse(await readFile(join(dir, ".vscode", "mcp.json"), "utf-8"));
|
|
47
|
+
expect(content.servers.github).toEqual({
|
|
48
|
+
type: "stdio",
|
|
49
|
+
command: "npx",
|
|
50
|
+
args: ["-y", "@mcp/server-github"],
|
|
51
|
+
env: { GITHUB_TOKEN: "${input:GITHUB_TOKEN}" },
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
it("writes codex .codex/config.toml", async () => {
|
|
55
|
+
await writeMcpConfigs(dir, ["codex"], [STDIO_SERVER]);
|
|
56
|
+
const raw = await readFile(join(dir, ".codex", "config.toml"), "utf-8");
|
|
57
|
+
expect(raw).toContain("mcp_servers");
|
|
58
|
+
expect(raw).toContain("github");
|
|
59
|
+
});
|
|
60
|
+
it("writes opencode.json", async () => {
|
|
61
|
+
await writeMcpConfigs(dir, ["opencode"], [STDIO_SERVER]);
|
|
62
|
+
const content = JSON.parse(await readFile(join(dir, "opencode.json"), "utf-8"));
|
|
63
|
+
expect(content.mcp.github).toEqual({
|
|
64
|
+
type: "local",
|
|
65
|
+
command: ["npx", "-y", "@mcp/server-github"],
|
|
66
|
+
environment: { GITHUB_TOKEN: "${GITHUB_TOKEN}" },
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it("handles multiple agents", async () => {
|
|
70
|
+
await writeMcpConfigs(dir, ["claude", "cursor", "vscode"], [STDIO_SERVER]);
|
|
71
|
+
expect(existsSync(join(dir, ".mcp.json"))).toBe(true);
|
|
72
|
+
expect(existsSync(join(dir, ".cursor", "mcp.json"))).toBe(true);
|
|
73
|
+
expect(existsSync(join(dir, ".vscode", "mcp.json"))).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
it("handles multiple servers", async () => {
|
|
76
|
+
await writeMcpConfigs(dir, ["claude"], [STDIO_SERVER, HTTP_SERVER]);
|
|
77
|
+
const content = JSON.parse(await readFile(join(dir, ".mcp.json"), "utf-8"));
|
|
78
|
+
expect(Object.keys(content.mcpServers)).toHaveLength(2);
|
|
79
|
+
expect(content.mcpServers.github).toBeDefined();
|
|
80
|
+
expect(content.mcpServers.remote).toBeDefined();
|
|
81
|
+
});
|
|
82
|
+
it("merges into existing shared config file", async () => {
|
|
83
|
+
// Codex config.toml is shared — write something else first
|
|
84
|
+
const codexDir = join(dir, ".codex");
|
|
85
|
+
const { mkdir } = await import("node:fs/promises");
|
|
86
|
+
await mkdir(codexDir, { recursive: true });
|
|
87
|
+
await writeFile(join(codexDir, "config.toml"), 'model = "o3"\n', "utf-8");
|
|
88
|
+
await writeMcpConfigs(dir, ["codex"], [STDIO_SERVER]);
|
|
89
|
+
const raw = await readFile(join(codexDir, "config.toml"), "utf-8");
|
|
90
|
+
// Should preserve existing keys
|
|
91
|
+
expect(raw).toContain("model");
|
|
92
|
+
expect(raw).toContain("mcp_servers");
|
|
93
|
+
});
|
|
94
|
+
it("preserves user-configured servers in shared config files", async () => {
|
|
95
|
+
// OpenCode is shared — pre-populate with a user-added server
|
|
96
|
+
await writeFile(join(dir, "opencode.json"), JSON.stringify({ mcp: { "my-custom-server": { type: "local", command: ["my-tool"] } } }, null, 2), "utf-8");
|
|
97
|
+
await writeMcpConfigs(dir, ["opencode"], [STDIO_SERVER]);
|
|
98
|
+
const content = JSON.parse(await readFile(join(dir, "opencode.json"), "utf-8"));
|
|
99
|
+
// dotagents-managed server should be present
|
|
100
|
+
expect(content.mcp.github).toBeDefined();
|
|
101
|
+
// User's custom server should NOT be deleted
|
|
102
|
+
expect(content.mcp["my-custom-server"]).toEqual({ type: "local", command: ["my-tool"] });
|
|
103
|
+
});
|
|
104
|
+
it("is idempotent", async () => {
|
|
105
|
+
await writeMcpConfigs(dir, ["claude"], [STDIO_SERVER]);
|
|
106
|
+
const first = await readFile(join(dir, ".mcp.json"), "utf-8");
|
|
107
|
+
await writeMcpConfigs(dir, ["claude"], [STDIO_SERVER]);
|
|
108
|
+
const second = await readFile(join(dir, ".mcp.json"), "utf-8");
|
|
109
|
+
expect(first).toBe(second);
|
|
110
|
+
});
|
|
111
|
+
it("creates parent directories as needed", async () => {
|
|
112
|
+
await writeMcpConfigs(dir, ["cursor"], [STDIO_SERVER]);
|
|
113
|
+
expect(existsSync(join(dir, ".cursor", "mcp.json"))).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("verifyMcpConfigs", () => {
|
|
117
|
+
let dir;
|
|
118
|
+
beforeEach(async () => {
|
|
119
|
+
dir = await mkdtemp(join(tmpdir(), "dotagents-mcp-verify-"));
|
|
120
|
+
});
|
|
121
|
+
afterEach(async () => {
|
|
122
|
+
await rm(dir, { recursive: true });
|
|
123
|
+
});
|
|
124
|
+
it("returns no issues when configs match", async () => {
|
|
125
|
+
await writeMcpConfigs(dir, ["claude"], [STDIO_SERVER]);
|
|
126
|
+
const issues = await verifyMcpConfigs(dir, ["claude"], [STDIO_SERVER]);
|
|
127
|
+
expect(issues).toEqual([]);
|
|
128
|
+
});
|
|
129
|
+
it("reports missing config file", async () => {
|
|
130
|
+
const issues = await verifyMcpConfigs(dir, ["claude"], [STDIO_SERVER]);
|
|
131
|
+
expect(issues).toHaveLength(1);
|
|
132
|
+
expect(issues[0].issue).toContain("missing");
|
|
133
|
+
});
|
|
134
|
+
it("reports missing server in config", async () => {
|
|
135
|
+
// Write config with only one server
|
|
136
|
+
await writeMcpConfigs(dir, ["claude"], [STDIO_SERVER]);
|
|
137
|
+
// Verify expecting two servers
|
|
138
|
+
const issues = await verifyMcpConfigs(dir, ["claude"], [STDIO_SERVER, HTTP_SERVER]);
|
|
139
|
+
expect(issues.some((i) => i.issue.includes("remote"))).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
it("returns empty when no servers declared", async () => {
|
|
142
|
+
const issues = await verifyMcpConfigs(dir, ["claude"], []);
|
|
143
|
+
expect(issues).toEqual([]);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=mcp-writer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-writer.test.js","sourceRoot":"","sources":["../../src/agents/mcp-writer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAalD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEhE;AAED,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAEtC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import claude from "./definitions/claude.js";
|
|
2
|
+
import cursor from "./definitions/cursor.js";
|
|
3
|
+
import codex from "./definitions/codex.js";
|
|
4
|
+
import vscode from "./definitions/vscode.js";
|
|
5
|
+
import opencode from "./definitions/opencode.js";
|
|
6
|
+
const ALL_AGENTS = [claude, cursor, codex, vscode, opencode];
|
|
7
|
+
const AGENT_REGISTRY = new Map(ALL_AGENTS.map((a) => [a.id, a]));
|
|
8
|
+
export function getAgent(id) {
|
|
9
|
+
return AGENT_REGISTRY.get(id);
|
|
10
|
+
}
|
|
11
|
+
export function allAgentIds() {
|
|
12
|
+
return [...AGENT_REGISTRY.keys()];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,KAAK,MAAM,wBAAwB,CAAC;AAC3C,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AAEjD,MAAM,UAAU,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEhF,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,OAAO,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/agents/registry.test.ts"],"names":[],"mappings":""}
|