beth-copilot 1.0.18 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +41 -28
- package/README.md +87 -247
- package/bin/cli.js +158 -358
- package/dist/__tests__/smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +49 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
- package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/beads.e2e.test.js +526 -0
- package/dist/cli/commands/beads.e2e.test.js.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.d.ts +89 -0
- package/dist/cli/commands/close.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.d.ts +27 -0
- package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.js +252 -0
- package/dist/cli/commands/close.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.js +309 -0
- package/dist/cli/commands/close.js.map +1 -0
- package/dist/cli/commands/close.test.d.ts +15 -0
- package/dist/cli/commands/close.test.d.ts.map +1 -0
- package/dist/cli/commands/close.test.js +634 -0
- package/dist/cli/commands/close.test.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +23 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +93 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/doctor.test.js +209 -0
- package/dist/cli/commands/doctor.test.js.map +1 -1
- package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
- package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
- package/dist/cli/commands/framework-isolation.test.js +119 -0
- package/dist/cli/commands/framework-isolation.test.js.map +1 -0
- package/dist/cli/commands/help.e2e.test.js +4 -4
- package/dist/cli/commands/help.e2e.test.js.map +1 -1
- package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
- package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/init-logic.e2e.test.js +305 -0
- package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
- package/dist/cli/commands/land.d.ts +142 -0
- package/dist/cli/commands/land.d.ts.map +1 -0
- package/dist/cli/commands/land.js +647 -0
- package/dist/cli/commands/land.js.map +1 -0
- package/dist/cli/commands/land.test.d.ts +20 -0
- package/dist/cli/commands/land.test.d.ts.map +1 -0
- package/dist/cli/commands/land.test.js +622 -0
- package/dist/cli/commands/land.test.js.map +1 -0
- package/dist/cli/commands/mcp.e2e.test.js +22 -29
- package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
- package/dist/cli/commands/pipeline.e2e.test.js +20 -20
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.d.ts +84 -0
- package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.js +257 -0
- package/dist/cli/commands/pre-push-guard.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.js +397 -0
- package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
- package/dist/cli/commands/quickstart.d.ts.map +1 -1
- package/dist/cli/commands/quickstart.js +7 -23
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/quickstart.test.js +40 -67
- package/dist/cli/commands/quickstart.test.js.map +1 -1
- package/dist/core/agents/suite.test.js +4 -2
- package/dist/core/agents/suite.test.js.map +1 -1
- package/dist/core/agents/tools.test.js +5 -1
- package/dist/core/agents/tools.test.js.map +1 -1
- package/dist/index.d.ts +3 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -10
- package/dist/index.js.map +1 -1
- package/package.json +15 -9
- package/sbom.json +2011 -819
- package/templates/.github/agents/beth.agent.md +220 -66
- package/templates/.github/agents/developer.agent.md +53 -90
- package/templates/.github/agents/product-manager.agent.md +15 -68
- package/templates/.github/agents/researcher.agent.md +20 -71
- package/templates/.github/agents/security-reviewer.agent.md +29 -81
- package/templates/.github/agents/tester.agent.md +40 -69
- package/templates/.github/agents/ux-designer.agent.md +20 -74
- package/templates/.github/copilot-instructions.md +217 -225
- package/templates/AGENTS.md +108 -20
- package/templates/mcp.json.example +0 -3
- package/dist/cli/commands/client-config.d.ts +0 -31
- package/dist/cli/commands/client-config.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
- package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.js +0 -556
- package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
- package/dist/cli/commands/client-config.js +0 -73
- package/dist/cli/commands/client-config.js.map +0 -1
- package/dist/cli/commands/client-config.test.d.ts +0 -6
- package/dist/cli/commands/client-config.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.test.js +0 -133
- package/dist/cli/commands/client-config.test.js.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
- package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
- package/dist/core/context.d.ts +0 -171
- package/dist/core/context.d.ts.map +0 -1
- package/dist/core/context.js +0 -353
- package/dist/core/context.js.map +0 -1
- package/dist/core/context.test.d.ts +0 -8
- package/dist/core/context.test.d.ts.map +0 -1
- package/dist/core/context.test.js +0 -253
- package/dist/core/context.test.js.map +0 -1
- package/dist/core/handoffs.d.ts +0 -151
- package/dist/core/handoffs.d.ts.map +0 -1
- package/dist/core/handoffs.js +0 -220
- package/dist/core/handoffs.js.map +0 -1
- package/dist/core/handoffs.test.d.ts +0 -8
- package/dist/core/handoffs.test.d.ts.map +0 -1
- package/dist/core/handoffs.test.js +0 -231
- package/dist/core/handoffs.test.js.map +0 -1
- package/dist/core/orchestrator.d.ts +0 -246
- package/dist/core/orchestrator.d.ts.map +0 -1
- package/dist/core/orchestrator.js +0 -514
- package/dist/core/orchestrator.js.map +0 -1
- package/dist/core/orchestrator.test.d.ts +0 -8
- package/dist/core/orchestrator.test.d.ts.map +0 -1
- package/dist/core/orchestrator.test.js +0 -517
- package/dist/core/orchestrator.test.js.map +0 -1
- package/dist/core/router.d.ts +0 -102
- package/dist/core/router.d.ts.map +0 -1
- package/dist/core/router.js +0 -178
- package/dist/core/router.js.map +0 -1
- package/dist/core/router.test.d.ts +0 -8
- package/dist/core/router.test.d.ts.map +0 -1
- package/dist/core/router.test.js +0 -215
- package/dist/core/router.test.js.map +0 -1
- package/dist/init.test.js +0 -288
- package/dist/providers/azure.d.ts +0 -147
- package/dist/providers/azure.d.ts.map +0 -1
- package/dist/providers/azure.js +0 -491
- package/dist/providers/azure.js.map +0 -1
- package/dist/providers/azure.test.d.ts +0 -11
- package/dist/providers/azure.test.d.ts.map +0 -1
- package/dist/providers/azure.test.js +0 -330
- package/dist/providers/azure.test.js.map +0 -1
- package/dist/providers/config.d.ts +0 -87
- package/dist/providers/config.d.ts.map +0 -1
- package/dist/providers/config.js +0 -193
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/config.test.d.ts +0 -7
- package/dist/providers/config.test.d.ts.map +0 -1
- package/dist/providers/config.test.js +0 -370
- package/dist/providers/config.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -18
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -14
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/interface.d.ts +0 -191
- package/dist/providers/interface.d.ts.map +0 -1
- package/dist/providers/interface.js +0 -94
- package/dist/providers/interface.js.map +0 -1
- package/dist/providers/retry.d.ts +0 -128
- package/dist/providers/retry.d.ts.map +0 -1
- package/dist/providers/retry.js +0 -205
- package/dist/providers/retry.js.map +0 -1
- package/dist/providers/retry.test.d.ts +0 -7
- package/dist/providers/retry.test.d.ts.map +0 -1
- package/dist/providers/retry.test.js +0 -439
- package/dist/providers/retry.test.js.map +0 -1
- package/dist/providers/streaming.d.ts +0 -157
- package/dist/providers/streaming.d.ts.map +0 -1
- package/dist/providers/streaming.js +0 -233
- package/dist/providers/streaming.js.map +0 -1
- package/dist/providers/streaming.test.d.ts +0 -7
- package/dist/providers/streaming.test.d.ts.map +0 -1
- package/dist/providers/streaming.test.js +0 -372
- package/dist/providers/streaming.test.js.map +0 -1
- package/dist/providers/types.d.ts +0 -209
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -53
- package/dist/providers/types.js.map +0 -1
- package/dist/providers/types.test.d.ts +0 -7
- package/dist/providers/types.test.d.ts.map +0 -1
- package/dist/providers/types.test.js +0 -141
- package/dist/providers/types.test.js.map +0 -1
- package/dist/tools/cli/beads.d.ts +0 -27
- package/dist/tools/cli/beads.d.ts.map +0 -1
- package/dist/tools/cli/beads.js +0 -172
- package/dist/tools/cli/beads.js.map +0 -1
- package/dist/tools/cli/beads.test.d.ts +0 -8
- package/dist/tools/cli/beads.test.d.ts.map +0 -1
- package/dist/tools/cli/beads.test.js +0 -264
- package/dist/tools/cli/beads.test.js.map +0 -1
- package/dist/tools/cli/editFile.d.ts +0 -17
- package/dist/tools/cli/editFile.d.ts.map +0 -1
- package/dist/tools/cli/editFile.js +0 -125
- package/dist/tools/cli/editFile.js.map +0 -1
- package/dist/tools/cli/editFile.test.d.ts +0 -8
- package/dist/tools/cli/editFile.test.d.ts.map +0 -1
- package/dist/tools/cli/editFile.test.js +0 -177
- package/dist/tools/cli/editFile.test.js.map +0 -1
- package/dist/tools/cli/readFile.d.ts +0 -25
- package/dist/tools/cli/readFile.d.ts.map +0 -1
- package/dist/tools/cli/readFile.js +0 -118
- package/dist/tools/cli/readFile.js.map +0 -1
- package/dist/tools/cli/readFile.test.d.ts +0 -8
- package/dist/tools/cli/readFile.test.d.ts.map +0 -1
- package/dist/tools/cli/readFile.test.js +0 -194
- package/dist/tools/cli/readFile.test.js.map +0 -1
- package/dist/tools/cli/search.d.ts +0 -16
- package/dist/tools/cli/search.d.ts.map +0 -1
- package/dist/tools/cli/search.js +0 -261
- package/dist/tools/cli/search.js.map +0 -1
- package/dist/tools/cli/search.test.d.ts +0 -8
- package/dist/tools/cli/search.test.d.ts.map +0 -1
- package/dist/tools/cli/search.test.js +0 -172
- package/dist/tools/cli/search.test.js.map +0 -1
- package/dist/tools/cli/subagent.d.ts +0 -43
- package/dist/tools/cli/subagent.d.ts.map +0 -1
- package/dist/tools/cli/subagent.js +0 -99
- package/dist/tools/cli/subagent.js.map +0 -1
- package/dist/tools/cli/subagent.test.d.ts +0 -8
- package/dist/tools/cli/subagent.test.d.ts.map +0 -1
- package/dist/tools/cli/subagent.test.js +0 -190
- package/dist/tools/cli/subagent.test.js.map +0 -1
- package/dist/tools/cli/terminal.d.ts +0 -19
- package/dist/tools/cli/terminal.d.ts.map +0 -1
- package/dist/tools/cli/terminal.js +0 -164
- package/dist/tools/cli/terminal.js.map +0 -1
- package/dist/tools/cli/terminal.test.d.ts +0 -8
- package/dist/tools/cli/terminal.test.d.ts.map +0 -1
- package/dist/tools/cli/terminal.test.js +0 -161
- package/dist/tools/cli/terminal.test.js.map +0 -1
- package/dist/tools/index.d.ts +0 -25
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -41
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/interface.d.ts +0 -64
- package/dist/tools/interface.d.ts.map +0 -1
- package/dist/tools/interface.js +0 -37
- package/dist/tools/interface.js.map +0 -1
- package/dist/tools/interface.test.d.ts +0 -7
- package/dist/tools/interface.test.d.ts.map +0 -1
- package/dist/tools/interface.test.js +0 -179
- package/dist/tools/interface.test.js.map +0 -1
- package/dist/tools/mcp/bridge.d.ts +0 -48
- package/dist/tools/mcp/bridge.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.js +0 -128
- package/dist/tools/mcp/bridge.js.map +0 -1
- package/dist/tools/mcp/bridge.test.d.ts +0 -8
- package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.test.js +0 -300
- package/dist/tools/mcp/bridge.test.js.map +0 -1
- package/dist/tools/mcp/client.d.ts +0 -135
- package/dist/tools/mcp/client.d.ts.map +0 -1
- package/dist/tools/mcp/client.js +0 -263
- package/dist/tools/mcp/client.js.map +0 -1
- package/dist/tools/mcp/client.test.d.ts +0 -8
- package/dist/tools/mcp/client.test.d.ts.map +0 -1
- package/dist/tools/mcp/client.test.js +0 -390
- package/dist/tools/mcp/client.test.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -82
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -99
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/registry.test.d.ts +0 -7
- package/dist/tools/registry.test.d.ts.map +0 -1
- package/dist/tools/registry.test.js +0 -199
- package/dist/tools/registry.test.js.map +0 -1
- package/dist/tools/suite.test.d.ts +0 -11
- package/dist/tools/suite.test.d.ts.map +0 -1
- package/dist/tools/suite.test.js +0 -119
- package/dist/tools/suite.test.js.map +0 -1
- package/dist/tools/types.d.ts +0 -75
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -30
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/types.test.d.ts +0 -7
- package/dist/tools/types.test.d.ts.map +0 -1
- package/dist/tools/types.test.js +0 -178
- package/dist/tools/types.test.js.map +0 -1
- package/templates/.vscode/mcp.json +0 -20
- package/templates/CLAUDE.md +0 -129
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Bridge Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for config parsing, tool wrapping, and the MCP-to-Beth
|
|
5
|
-
* tool bridge. Uses mock MCPClient rather than real servers.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it } from 'node:test';
|
|
8
|
-
import assert from 'node:assert';
|
|
9
|
-
import { writeFileSync, mkdtempSync, rmSync } from 'node:fs';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
-
import { tmpdir } from 'node:os';
|
|
12
|
-
import { parseMCPConfig, createMCPTools } from './bridge.js';
|
|
13
|
-
// =============================================================================
|
|
14
|
-
// Test Helpers
|
|
15
|
-
// =============================================================================
|
|
16
|
-
/**
|
|
17
|
-
* Create a temporary directory with an mcp.json file.
|
|
18
|
-
* Returns the path to the config file and a cleanup function.
|
|
19
|
-
*/
|
|
20
|
-
function writeTempConfig(content) {
|
|
21
|
-
const dir = mkdtempSync(join(tmpdir(), 'beth-mcp-test-'));
|
|
22
|
-
const configPath = join(dir, 'mcp.json');
|
|
23
|
-
writeFileSync(configPath, content, 'utf-8');
|
|
24
|
-
return {
|
|
25
|
-
configPath,
|
|
26
|
-
cleanup: () => rmSync(dir, { recursive: true, force: true }),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Create a mock MCPClient for bridge testing.
|
|
31
|
-
*/
|
|
32
|
-
function createMockClient(name, tools, callToolResult, callToolError) {
|
|
33
|
-
return {
|
|
34
|
-
name,
|
|
35
|
-
connected: true,
|
|
36
|
-
listTools: async () => tools,
|
|
37
|
-
callTool: async () => {
|
|
38
|
-
if (callToolError)
|
|
39
|
-
throw callToolError;
|
|
40
|
-
return callToolResult ?? { content: [{ type: 'text', text: 'ok' }] };
|
|
41
|
-
},
|
|
42
|
-
connect: async () => { },
|
|
43
|
-
disconnect: async () => { },
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Create a minimal ToolContext for testing.
|
|
48
|
-
*/
|
|
49
|
-
function createMockContext() {
|
|
50
|
-
return {
|
|
51
|
-
workingDir: '/test',
|
|
52
|
-
permissions: {
|
|
53
|
-
allowFileRead: true,
|
|
54
|
-
allowFileWrite: false,
|
|
55
|
-
allowTerminal: false,
|
|
56
|
-
allowNetwork: true,
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
// =============================================================================
|
|
61
|
-
// parseMCPConfig Tests
|
|
62
|
-
// =============================================================================
|
|
63
|
-
describe('parseMCPConfig', () => {
|
|
64
|
-
it('should parse stdio server configs', () => {
|
|
65
|
-
const { configPath, cleanup } = writeTempConfig(JSON.stringify({
|
|
66
|
-
servers: {
|
|
67
|
-
shadcn: {
|
|
68
|
-
command: 'npx',
|
|
69
|
-
args: ['shadcn@3.7.0', 'mcp'],
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
}));
|
|
73
|
-
try {
|
|
74
|
-
const configs = parseMCPConfig(configPath);
|
|
75
|
-
assert.strictEqual(configs.size, 1);
|
|
76
|
-
assert.ok(configs.has('shadcn'));
|
|
77
|
-
const shadcn = configs.get('shadcn');
|
|
78
|
-
assert.strictEqual(shadcn.command, 'npx');
|
|
79
|
-
assert.deepStrictEqual(shadcn.args, ['shadcn@3.7.0', 'mcp']);
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
cleanup();
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
it('should parse server env variables', () => {
|
|
86
|
-
const { configPath, cleanup } = writeTempConfig(JSON.stringify({
|
|
87
|
-
servers: {
|
|
88
|
-
myserver: {
|
|
89
|
-
command: 'node',
|
|
90
|
-
args: ['server.js'],
|
|
91
|
-
env: { API_KEY: 'test-key', DEBUG: 'true' },
|
|
92
|
-
},
|
|
93
|
-
},
|
|
94
|
-
}));
|
|
95
|
-
try {
|
|
96
|
-
const configs = parseMCPConfig(configPath);
|
|
97
|
-
const server = configs.get('myserver');
|
|
98
|
-
assert.deepStrictEqual(server.env, { API_KEY: 'test-key', DEBUG: 'true' });
|
|
99
|
-
}
|
|
100
|
-
finally {
|
|
101
|
-
cleanup();
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
it('should skip HTTP-based servers (no command)', () => {
|
|
105
|
-
const { configPath, cleanup } = writeTempConfig(JSON.stringify({
|
|
106
|
-
servers: {
|
|
107
|
-
deepwiki: {
|
|
108
|
-
type: 'http',
|
|
109
|
-
url: 'https://mcp.deepwiki.com/mcp',
|
|
110
|
-
},
|
|
111
|
-
shadcn: {
|
|
112
|
-
command: 'npx',
|
|
113
|
-
args: ['shadcn@3.7.0', 'mcp'],
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
}));
|
|
117
|
-
try {
|
|
118
|
-
const configs = parseMCPConfig(configPath);
|
|
119
|
-
assert.strictEqual(configs.size, 1);
|
|
120
|
-
assert.ok(!configs.has('deepwiki'));
|
|
121
|
-
assert.ok(configs.has('shadcn'));
|
|
122
|
-
}
|
|
123
|
-
finally {
|
|
124
|
-
cleanup();
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
it('should handle JSONC with line comments', () => {
|
|
128
|
-
const { configPath, cleanup } = writeTempConfig(`{
|
|
129
|
-
// This is a comment
|
|
130
|
-
"servers": {
|
|
131
|
-
// Another comment
|
|
132
|
-
"test": {
|
|
133
|
-
"command": "node", // Inline comment
|
|
134
|
-
"args": ["server.js"]
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}`);
|
|
138
|
-
try {
|
|
139
|
-
const configs = parseMCPConfig(configPath);
|
|
140
|
-
assert.strictEqual(configs.size, 1);
|
|
141
|
-
assert.ok(configs.has('test'));
|
|
142
|
-
}
|
|
143
|
-
finally {
|
|
144
|
-
cleanup();
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
it('should handle JSONC with block comments', () => {
|
|
148
|
-
const { configPath, cleanup } = writeTempConfig(`{
|
|
149
|
-
/* Block comment */
|
|
150
|
-
"servers": {
|
|
151
|
-
"test": {
|
|
152
|
-
"command": "node",
|
|
153
|
-
"args": [/* inline block */ "server.js"]
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}`);
|
|
157
|
-
try {
|
|
158
|
-
const configs = parseMCPConfig(configPath);
|
|
159
|
-
assert.strictEqual(configs.size, 1);
|
|
160
|
-
}
|
|
161
|
-
finally {
|
|
162
|
-
cleanup();
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
it('should return empty map when no servers defined', () => {
|
|
166
|
-
const { configPath, cleanup } = writeTempConfig(JSON.stringify({
|
|
167
|
-
"$schema": "https://example.com/schema",
|
|
168
|
-
}));
|
|
169
|
-
try {
|
|
170
|
-
const configs = parseMCPConfig(configPath);
|
|
171
|
-
assert.strictEqual(configs.size, 0);
|
|
172
|
-
}
|
|
173
|
-
finally {
|
|
174
|
-
cleanup();
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
it('should parse multiple servers', () => {
|
|
178
|
-
const { configPath, cleanup } = writeTempConfig(JSON.stringify({
|
|
179
|
-
servers: {
|
|
180
|
-
server1: { command: 'cmd1', args: ['a'] },
|
|
181
|
-
server2: { command: 'cmd2', args: ['b', 'c'] },
|
|
182
|
-
server3: { command: 'cmd3', args: [] },
|
|
183
|
-
},
|
|
184
|
-
}));
|
|
185
|
-
try {
|
|
186
|
-
const configs = parseMCPConfig(configPath);
|
|
187
|
-
assert.strictEqual(configs.size, 3);
|
|
188
|
-
assert.strictEqual(configs.get('server1').command, 'cmd1');
|
|
189
|
-
assert.strictEqual(configs.get('server2').command, 'cmd2');
|
|
190
|
-
assert.strictEqual(configs.get('server3').command, 'cmd3');
|
|
191
|
-
}
|
|
192
|
-
finally {
|
|
193
|
-
cleanup();
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
it('should handle missing args gracefully', () => {
|
|
197
|
-
const { configPath, cleanup } = writeTempConfig(JSON.stringify({
|
|
198
|
-
servers: {
|
|
199
|
-
test: { command: 'node' },
|
|
200
|
-
},
|
|
201
|
-
}));
|
|
202
|
-
try {
|
|
203
|
-
const configs = parseMCPConfig(configPath);
|
|
204
|
-
const server = configs.get('test');
|
|
205
|
-
assert.deepStrictEqual(server.args, []);
|
|
206
|
-
}
|
|
207
|
-
finally {
|
|
208
|
-
cleanup();
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
// =============================================================================
|
|
213
|
-
// createMCPTools Tests
|
|
214
|
-
// =============================================================================
|
|
215
|
-
describe('createMCPTools', () => {
|
|
216
|
-
it('should wrap MCP tools with namespaced names', async () => {
|
|
217
|
-
const client = createMockClient('shadcn', [
|
|
218
|
-
{
|
|
219
|
-
name: 'search',
|
|
220
|
-
description: 'Search for components',
|
|
221
|
-
inputSchema: { type: 'object', properties: { query: { type: 'string' } } },
|
|
222
|
-
},
|
|
223
|
-
]);
|
|
224
|
-
const tools = await createMCPTools(client);
|
|
225
|
-
assert.strictEqual(tools.length, 1);
|
|
226
|
-
assert.strictEqual(tools[0].name, 'mcp_shadcn_search');
|
|
227
|
-
});
|
|
228
|
-
it('should preserve tool description', async () => {
|
|
229
|
-
const client = createMockClient('myserver', [
|
|
230
|
-
{
|
|
231
|
-
name: 'list',
|
|
232
|
-
description: 'List available items',
|
|
233
|
-
inputSchema: {},
|
|
234
|
-
},
|
|
235
|
-
]);
|
|
236
|
-
const tools = await createMCPTools(client);
|
|
237
|
-
assert.strictEqual(tools[0].description, 'List available items');
|
|
238
|
-
});
|
|
239
|
-
it('should preserve tool inputSchema', async () => {
|
|
240
|
-
const schema = {
|
|
241
|
-
type: 'object',
|
|
242
|
-
properties: {
|
|
243
|
-
name: { type: 'string', description: 'Component name' },
|
|
244
|
-
},
|
|
245
|
-
required: ['name'],
|
|
246
|
-
};
|
|
247
|
-
const client = createMockClient('test', [
|
|
248
|
-
{ name: 'install', description: 'Install', inputSchema: schema },
|
|
249
|
-
]);
|
|
250
|
-
const tools = await createMCPTools(client);
|
|
251
|
-
assert.deepStrictEqual(tools[0].inputSchema, schema);
|
|
252
|
-
});
|
|
253
|
-
it('should create tools that delegate to client.callTool', async () => {
|
|
254
|
-
const expectedResult = { content: [{ type: 'text', text: 'found 3 results' }] };
|
|
255
|
-
const client = createMockClient('shadcn', [
|
|
256
|
-
{ name: 'search', description: 'Search', inputSchema: {} },
|
|
257
|
-
], expectedResult);
|
|
258
|
-
const tools = await createMCPTools(client);
|
|
259
|
-
const result = await tools[0].execute({ query: 'button' }, createMockContext());
|
|
260
|
-
assert.strictEqual(result.success, true);
|
|
261
|
-
assert.strictEqual(result.output, JSON.stringify(expectedResult));
|
|
262
|
-
assert.strictEqual(result.metadata?.mcpServer, 'shadcn');
|
|
263
|
-
assert.strictEqual(result.metadata?.mcpTool, 'search');
|
|
264
|
-
});
|
|
265
|
-
it('should return string output directly', async () => {
|
|
266
|
-
const client = createMockClient('test', [
|
|
267
|
-
{ name: 'echo', description: 'Echo', inputSchema: {} },
|
|
268
|
-
], 'hello world');
|
|
269
|
-
const tools = await createMCPTools(client);
|
|
270
|
-
const result = await tools[0].execute({}, createMockContext());
|
|
271
|
-
assert.strictEqual(result.success, true);
|
|
272
|
-
assert.strictEqual(result.output, 'hello world');
|
|
273
|
-
});
|
|
274
|
-
it('should handle tool execution errors gracefully', async () => {
|
|
275
|
-
const client = createMockClient('test', [{ name: 'fail', description: 'Fails', inputSchema: {} }], undefined, new Error('Server crashed'));
|
|
276
|
-
const tools = await createMCPTools(client);
|
|
277
|
-
const result = await tools[0].execute({}, createMockContext());
|
|
278
|
-
assert.strictEqual(result.success, false);
|
|
279
|
-
assert.strictEqual(result.error, 'Server crashed');
|
|
280
|
-
assert.strictEqual(result.output, '');
|
|
281
|
-
});
|
|
282
|
-
it('should handle multiple tools from one server', async () => {
|
|
283
|
-
const client = createMockClient('shadcn', [
|
|
284
|
-
{ name: 'search', description: 'Search', inputSchema: {} },
|
|
285
|
-
{ name: 'install', description: 'Install', inputSchema: {} },
|
|
286
|
-
{ name: 'list', description: 'List', inputSchema: {} },
|
|
287
|
-
]);
|
|
288
|
-
const tools = await createMCPTools(client);
|
|
289
|
-
assert.strictEqual(tools.length, 3);
|
|
290
|
-
assert.strictEqual(tools[0].name, 'mcp_shadcn_search');
|
|
291
|
-
assert.strictEqual(tools[1].name, 'mcp_shadcn_install');
|
|
292
|
-
assert.strictEqual(tools[2].name, 'mcp_shadcn_list');
|
|
293
|
-
});
|
|
294
|
-
it('should return empty array when server has no tools', async () => {
|
|
295
|
-
const client = createMockClient('empty', []);
|
|
296
|
-
const tools = await createMCPTools(client);
|
|
297
|
-
assert.deepStrictEqual(tools, []);
|
|
298
|
-
});
|
|
299
|
-
});
|
|
300
|
-
//# sourceMappingURL=bridge.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.test.js","sourceRoot":"","sources":["../../../src/tools/mcp/bridge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Client
|
|
3
|
-
*
|
|
4
|
-
* Minimal Model Context Protocol client that communicates with
|
|
5
|
-
* MCP servers over stdio transport using JSON-RPC 2.0.
|
|
6
|
-
*/
|
|
7
|
-
import { spawn } from 'node:child_process';
|
|
8
|
-
/**
|
|
9
|
-
* Configuration for connecting to an MCP server.
|
|
10
|
-
*/
|
|
11
|
-
export interface MCPServerConfig {
|
|
12
|
-
/** Command to launch the server (e.g., "npx") */
|
|
13
|
-
command: string;
|
|
14
|
-
/** Arguments to pass to the command (e.g., ["-y", "@anthropic/mcp-server"]) */
|
|
15
|
-
args: string[];
|
|
16
|
-
/** Optional environment variables for the server process */
|
|
17
|
-
env?: Record<string, string>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Tool information returned by an MCP server.
|
|
21
|
-
*/
|
|
22
|
-
export interface MCPToolInfo {
|
|
23
|
-
/** Tool name */
|
|
24
|
-
name: string;
|
|
25
|
-
/** Human-readable description */
|
|
26
|
-
description: string;
|
|
27
|
-
/** JSON Schema for the tool's input */
|
|
28
|
-
inputSchema: Record<string, unknown>;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Function signature for spawning a child process.
|
|
32
|
-
* Defaults to `child_process.spawn` but can be replaced in tests.
|
|
33
|
-
*/
|
|
34
|
-
export type SpawnFn = typeof spawn;
|
|
35
|
-
/**
|
|
36
|
-
* MCP protocol client for stdio-based MCP servers.
|
|
37
|
-
*
|
|
38
|
-
* Handles the JSON-RPC 2.0 transport, initialization handshake,
|
|
39
|
-
* tool listing, and tool invocation.
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```typescript
|
|
43
|
-
* const client = new MCPClient('shadcn', {
|
|
44
|
-
* command: 'npx',
|
|
45
|
-
* args: ['shadcn@3.7.0', 'mcp'],
|
|
46
|
-
* });
|
|
47
|
-
* await client.connect();
|
|
48
|
-
* const tools = await client.listTools();
|
|
49
|
-
* const result = await client.callTool('search', { query: 'button' });
|
|
50
|
-
* await client.disconnect();
|
|
51
|
-
* ```
|
|
52
|
-
*/
|
|
53
|
-
export declare class MCPClient {
|
|
54
|
-
/** Server name (for logging/namespacing) */
|
|
55
|
-
readonly name: string;
|
|
56
|
-
/** Server configuration */
|
|
57
|
-
private readonly config;
|
|
58
|
-
/** Spawn function (injectable for testing) */
|
|
59
|
-
private readonly spawnFn;
|
|
60
|
-
/** Request timeout in milliseconds */
|
|
61
|
-
private readonly timeoutMs;
|
|
62
|
-
/** The spawned server process */
|
|
63
|
-
private process;
|
|
64
|
-
/** Readline interface for reading stdout line by line */
|
|
65
|
-
private reader;
|
|
66
|
-
/** Incrementing request ID counter */
|
|
67
|
-
private nextId;
|
|
68
|
-
/** Whether the initialization handshake has completed */
|
|
69
|
-
private initialized;
|
|
70
|
-
/** Pending request resolvers keyed by request ID */
|
|
71
|
-
private readonly pending;
|
|
72
|
-
constructor(name: string, config: MCPServerConfig, options?: {
|
|
73
|
-
spawnFn?: SpawnFn;
|
|
74
|
-
timeoutMs?: number;
|
|
75
|
-
});
|
|
76
|
-
/**
|
|
77
|
-
* Whether the client is connected and initialized.
|
|
78
|
-
*/
|
|
79
|
-
get connected(): boolean;
|
|
80
|
-
/**
|
|
81
|
-
* Start the MCP server process and perform the initialization handshake.
|
|
82
|
-
*
|
|
83
|
-
* @throws Error if the process fails to start or initialization times out
|
|
84
|
-
*/
|
|
85
|
-
connect(): Promise<void>;
|
|
86
|
-
/**
|
|
87
|
-
* List available tools from the MCP server.
|
|
88
|
-
*
|
|
89
|
-
* @returns Array of tool information
|
|
90
|
-
* @throws Error if not connected
|
|
91
|
-
*/
|
|
92
|
-
listTools(): Promise<MCPToolInfo[]>;
|
|
93
|
-
/**
|
|
94
|
-
* Call a tool on the MCP server.
|
|
95
|
-
*
|
|
96
|
-
* @param toolName - Name of the tool to call
|
|
97
|
-
* @param args - Arguments to pass to the tool
|
|
98
|
-
* @returns Tool execution result
|
|
99
|
-
* @throws Error if not connected or the tool call fails
|
|
100
|
-
*/
|
|
101
|
-
callTool(toolName: string, args: Record<string, unknown>): Promise<unknown>;
|
|
102
|
-
/**
|
|
103
|
-
* Shut down the MCP server process.
|
|
104
|
-
*/
|
|
105
|
-
disconnect(): Promise<void>;
|
|
106
|
-
/**
|
|
107
|
-
* Send a JSON-RPC request and wait for the matching response.
|
|
108
|
-
*/
|
|
109
|
-
private sendRequest;
|
|
110
|
-
/**
|
|
111
|
-
* Send a JSON-RPC notification (no response expected).
|
|
112
|
-
*/
|
|
113
|
-
private sendNotification;
|
|
114
|
-
/**
|
|
115
|
-
* Write a line-delimited JSON message to the process stdin.
|
|
116
|
-
*/
|
|
117
|
-
private writeMessage;
|
|
118
|
-
/**
|
|
119
|
-
* Handle a line of JSON from the server's stdout.
|
|
120
|
-
*/
|
|
121
|
-
private handleLine;
|
|
122
|
-
/**
|
|
123
|
-
* Assert that the client is connected.
|
|
124
|
-
*/
|
|
125
|
-
private ensureConnected;
|
|
126
|
-
/**
|
|
127
|
-
* Reject all pending requests.
|
|
128
|
-
*/
|
|
129
|
-
private rejectAllPending;
|
|
130
|
-
/**
|
|
131
|
-
* Clean up the process and reader.
|
|
132
|
-
*/
|
|
133
|
-
private cleanup;
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/tools/mcp/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAO9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAEhB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IAEb,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IAEpB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAgDD;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC;AAMnC;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,SAAS;IACpB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,iCAAiC;IACjC,OAAO,CAAC,OAAO,CAA6B;IAE5C,yDAAyD;IACzD,OAAO,CAAC,MAAM,CAAkC;IAEhD,sCAAsC;IACtC,OAAO,CAAC,MAAM,CAAK;IAEnB,yDAAyD;IACzD,OAAO,CAAC,WAAW,CAAS;IAE5B,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGnB;gBAGH,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAQH;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C9B;;;;;OAKG;IACG,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAiBzC;;;;;;;OAOG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IASjF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,UAAU;IA6BlB;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,OAAO;CAchB"}
|