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.
Files changed (291) hide show
  1. package/CHANGELOG.md +41 -28
  2. package/README.md +87 -247
  3. package/bin/cli.js +158 -358
  4. package/dist/__tests__/smoke.test.d.ts +8 -0
  5. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  6. package/dist/__tests__/smoke.test.js +49 -0
  7. package/dist/__tests__/smoke.test.js.map +1 -0
  8. package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
  9. package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
  10. package/dist/cli/commands/beads.e2e.test.js +526 -0
  11. package/dist/cli/commands/beads.e2e.test.js.map +1 -0
  12. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
  13. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
  14. package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
  15. package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
  16. package/dist/cli/commands/close.d.ts +89 -0
  17. package/dist/cli/commands/close.d.ts.map +1 -0
  18. package/dist/cli/commands/close.e2e.test.d.ts +27 -0
  19. package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
  20. package/dist/cli/commands/close.e2e.test.js +252 -0
  21. package/dist/cli/commands/close.e2e.test.js.map +1 -0
  22. package/dist/cli/commands/close.js +309 -0
  23. package/dist/cli/commands/close.js.map +1 -0
  24. package/dist/cli/commands/close.test.d.ts +15 -0
  25. package/dist/cli/commands/close.test.d.ts.map +1 -0
  26. package/dist/cli/commands/close.test.js +634 -0
  27. package/dist/cli/commands/close.test.js.map +1 -0
  28. package/dist/cli/commands/doctor.d.ts +23 -0
  29. package/dist/cli/commands/doctor.d.ts.map +1 -1
  30. package/dist/cli/commands/doctor.js +93 -0
  31. package/dist/cli/commands/doctor.js.map +1 -1
  32. package/dist/cli/commands/doctor.test.js +209 -0
  33. package/dist/cli/commands/doctor.test.js.map +1 -1
  34. package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
  35. package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
  36. package/dist/cli/commands/framework-isolation.test.js +119 -0
  37. package/dist/cli/commands/framework-isolation.test.js.map +1 -0
  38. package/dist/cli/commands/help.e2e.test.js +4 -4
  39. package/dist/cli/commands/help.e2e.test.js.map +1 -1
  40. package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
  41. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  42. package/dist/cli/commands/init-logic.e2e.test.js +305 -0
  43. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  44. package/dist/cli/commands/land.d.ts +142 -0
  45. package/dist/cli/commands/land.d.ts.map +1 -0
  46. package/dist/cli/commands/land.js +647 -0
  47. package/dist/cli/commands/land.js.map +1 -0
  48. package/dist/cli/commands/land.test.d.ts +20 -0
  49. package/dist/cli/commands/land.test.d.ts.map +1 -0
  50. package/dist/cli/commands/land.test.js +622 -0
  51. package/dist/cli/commands/land.test.js.map +1 -0
  52. package/dist/cli/commands/mcp.e2e.test.js +22 -29
  53. package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
  54. package/dist/cli/commands/pipeline.e2e.test.js +20 -20
  55. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  56. package/dist/cli/commands/pre-push-guard.d.ts +84 -0
  57. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  58. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  59. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  60. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  61. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  62. package/dist/cli/commands/pre-push-guard.js +257 -0
  63. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  64. package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
  65. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  66. package/dist/cli/commands/pre-push-guard.test.js +397 -0
  67. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  68. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  69. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  70. package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
  71. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  72. package/dist/cli/commands/quickstart.d.ts.map +1 -1
  73. package/dist/cli/commands/quickstart.js +7 -23
  74. package/dist/cli/commands/quickstart.js.map +1 -1
  75. package/dist/cli/commands/quickstart.test.js +40 -67
  76. package/dist/cli/commands/quickstart.test.js.map +1 -1
  77. package/dist/core/agents/suite.test.js +4 -2
  78. package/dist/core/agents/suite.test.js.map +1 -1
  79. package/dist/core/agents/tools.test.js +5 -1
  80. package/dist/core/agents/tools.test.js.map +1 -1
  81. package/dist/index.d.ts +3 -10
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +5 -10
  84. package/dist/index.js.map +1 -1
  85. package/package.json +15 -9
  86. package/sbom.json +2011 -819
  87. package/templates/.github/agents/beth.agent.md +220 -66
  88. package/templates/.github/agents/developer.agent.md +53 -90
  89. package/templates/.github/agents/product-manager.agent.md +15 -68
  90. package/templates/.github/agents/researcher.agent.md +20 -71
  91. package/templates/.github/agents/security-reviewer.agent.md +29 -81
  92. package/templates/.github/agents/tester.agent.md +40 -69
  93. package/templates/.github/agents/ux-designer.agent.md +20 -74
  94. package/templates/.github/copilot-instructions.md +217 -225
  95. package/templates/AGENTS.md +108 -20
  96. package/templates/mcp.json.example +0 -3
  97. package/dist/cli/commands/client-config.d.ts +0 -31
  98. package/dist/cli/commands/client-config.d.ts.map +0 -1
  99. package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
  100. package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
  101. package/dist/cli/commands/client-config.e2e.test.js +0 -556
  102. package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
  103. package/dist/cli/commands/client-config.js +0 -73
  104. package/dist/cli/commands/client-config.js.map +0 -1
  105. package/dist/cli/commands/client-config.test.d.ts +0 -6
  106. package/dist/cli/commands/client-config.test.d.ts.map +0 -1
  107. package/dist/cli/commands/client-config.test.js +0 -133
  108. package/dist/cli/commands/client-config.test.js.map +0 -1
  109. package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
  110. package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
  111. package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
  112. package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
  113. package/dist/core/context.d.ts +0 -171
  114. package/dist/core/context.d.ts.map +0 -1
  115. package/dist/core/context.js +0 -353
  116. package/dist/core/context.js.map +0 -1
  117. package/dist/core/context.test.d.ts +0 -8
  118. package/dist/core/context.test.d.ts.map +0 -1
  119. package/dist/core/context.test.js +0 -253
  120. package/dist/core/context.test.js.map +0 -1
  121. package/dist/core/handoffs.d.ts +0 -151
  122. package/dist/core/handoffs.d.ts.map +0 -1
  123. package/dist/core/handoffs.js +0 -220
  124. package/dist/core/handoffs.js.map +0 -1
  125. package/dist/core/handoffs.test.d.ts +0 -8
  126. package/dist/core/handoffs.test.d.ts.map +0 -1
  127. package/dist/core/handoffs.test.js +0 -231
  128. package/dist/core/handoffs.test.js.map +0 -1
  129. package/dist/core/orchestrator.d.ts +0 -246
  130. package/dist/core/orchestrator.d.ts.map +0 -1
  131. package/dist/core/orchestrator.js +0 -514
  132. package/dist/core/orchestrator.js.map +0 -1
  133. package/dist/core/orchestrator.test.d.ts +0 -8
  134. package/dist/core/orchestrator.test.d.ts.map +0 -1
  135. package/dist/core/orchestrator.test.js +0 -517
  136. package/dist/core/orchestrator.test.js.map +0 -1
  137. package/dist/core/router.d.ts +0 -102
  138. package/dist/core/router.d.ts.map +0 -1
  139. package/dist/core/router.js +0 -178
  140. package/dist/core/router.js.map +0 -1
  141. package/dist/core/router.test.d.ts +0 -8
  142. package/dist/core/router.test.d.ts.map +0 -1
  143. package/dist/core/router.test.js +0 -215
  144. package/dist/core/router.test.js.map +0 -1
  145. package/dist/init.test.js +0 -288
  146. package/dist/providers/azure.d.ts +0 -147
  147. package/dist/providers/azure.d.ts.map +0 -1
  148. package/dist/providers/azure.js +0 -491
  149. package/dist/providers/azure.js.map +0 -1
  150. package/dist/providers/azure.test.d.ts +0 -11
  151. package/dist/providers/azure.test.d.ts.map +0 -1
  152. package/dist/providers/azure.test.js +0 -330
  153. package/dist/providers/azure.test.js.map +0 -1
  154. package/dist/providers/config.d.ts +0 -87
  155. package/dist/providers/config.d.ts.map +0 -1
  156. package/dist/providers/config.js +0 -193
  157. package/dist/providers/config.js.map +0 -1
  158. package/dist/providers/config.test.d.ts +0 -7
  159. package/dist/providers/config.test.d.ts.map +0 -1
  160. package/dist/providers/config.test.js +0 -370
  161. package/dist/providers/config.test.js.map +0 -1
  162. package/dist/providers/index.d.ts +0 -18
  163. package/dist/providers/index.d.ts.map +0 -1
  164. package/dist/providers/index.js +0 -14
  165. package/dist/providers/index.js.map +0 -1
  166. package/dist/providers/interface.d.ts +0 -191
  167. package/dist/providers/interface.d.ts.map +0 -1
  168. package/dist/providers/interface.js +0 -94
  169. package/dist/providers/interface.js.map +0 -1
  170. package/dist/providers/retry.d.ts +0 -128
  171. package/dist/providers/retry.d.ts.map +0 -1
  172. package/dist/providers/retry.js +0 -205
  173. package/dist/providers/retry.js.map +0 -1
  174. package/dist/providers/retry.test.d.ts +0 -7
  175. package/dist/providers/retry.test.d.ts.map +0 -1
  176. package/dist/providers/retry.test.js +0 -439
  177. package/dist/providers/retry.test.js.map +0 -1
  178. package/dist/providers/streaming.d.ts +0 -157
  179. package/dist/providers/streaming.d.ts.map +0 -1
  180. package/dist/providers/streaming.js +0 -233
  181. package/dist/providers/streaming.js.map +0 -1
  182. package/dist/providers/streaming.test.d.ts +0 -7
  183. package/dist/providers/streaming.test.d.ts.map +0 -1
  184. package/dist/providers/streaming.test.js +0 -372
  185. package/dist/providers/streaming.test.js.map +0 -1
  186. package/dist/providers/types.d.ts +0 -209
  187. package/dist/providers/types.d.ts.map +0 -1
  188. package/dist/providers/types.js +0 -53
  189. package/dist/providers/types.js.map +0 -1
  190. package/dist/providers/types.test.d.ts +0 -7
  191. package/dist/providers/types.test.d.ts.map +0 -1
  192. package/dist/providers/types.test.js +0 -141
  193. package/dist/providers/types.test.js.map +0 -1
  194. package/dist/tools/cli/beads.d.ts +0 -27
  195. package/dist/tools/cli/beads.d.ts.map +0 -1
  196. package/dist/tools/cli/beads.js +0 -172
  197. package/dist/tools/cli/beads.js.map +0 -1
  198. package/dist/tools/cli/beads.test.d.ts +0 -8
  199. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  200. package/dist/tools/cli/beads.test.js +0 -264
  201. package/dist/tools/cli/beads.test.js.map +0 -1
  202. package/dist/tools/cli/editFile.d.ts +0 -17
  203. package/dist/tools/cli/editFile.d.ts.map +0 -1
  204. package/dist/tools/cli/editFile.js +0 -125
  205. package/dist/tools/cli/editFile.js.map +0 -1
  206. package/dist/tools/cli/editFile.test.d.ts +0 -8
  207. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  208. package/dist/tools/cli/editFile.test.js +0 -177
  209. package/dist/tools/cli/editFile.test.js.map +0 -1
  210. package/dist/tools/cli/readFile.d.ts +0 -25
  211. package/dist/tools/cli/readFile.d.ts.map +0 -1
  212. package/dist/tools/cli/readFile.js +0 -118
  213. package/dist/tools/cli/readFile.js.map +0 -1
  214. package/dist/tools/cli/readFile.test.d.ts +0 -8
  215. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  216. package/dist/tools/cli/readFile.test.js +0 -194
  217. package/dist/tools/cli/readFile.test.js.map +0 -1
  218. package/dist/tools/cli/search.d.ts +0 -16
  219. package/dist/tools/cli/search.d.ts.map +0 -1
  220. package/dist/tools/cli/search.js +0 -261
  221. package/dist/tools/cli/search.js.map +0 -1
  222. package/dist/tools/cli/search.test.d.ts +0 -8
  223. package/dist/tools/cli/search.test.d.ts.map +0 -1
  224. package/dist/tools/cli/search.test.js +0 -172
  225. package/dist/tools/cli/search.test.js.map +0 -1
  226. package/dist/tools/cli/subagent.d.ts +0 -43
  227. package/dist/tools/cli/subagent.d.ts.map +0 -1
  228. package/dist/tools/cli/subagent.js +0 -99
  229. package/dist/tools/cli/subagent.js.map +0 -1
  230. package/dist/tools/cli/subagent.test.d.ts +0 -8
  231. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  232. package/dist/tools/cli/subagent.test.js +0 -190
  233. package/dist/tools/cli/subagent.test.js.map +0 -1
  234. package/dist/tools/cli/terminal.d.ts +0 -19
  235. package/dist/tools/cli/terminal.d.ts.map +0 -1
  236. package/dist/tools/cli/terminal.js +0 -164
  237. package/dist/tools/cli/terminal.js.map +0 -1
  238. package/dist/tools/cli/terminal.test.d.ts +0 -8
  239. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  240. package/dist/tools/cli/terminal.test.js +0 -161
  241. package/dist/tools/cli/terminal.test.js.map +0 -1
  242. package/dist/tools/index.d.ts +0 -25
  243. package/dist/tools/index.d.ts.map +0 -1
  244. package/dist/tools/index.js +0 -41
  245. package/dist/tools/index.js.map +0 -1
  246. package/dist/tools/interface.d.ts +0 -64
  247. package/dist/tools/interface.d.ts.map +0 -1
  248. package/dist/tools/interface.js +0 -37
  249. package/dist/tools/interface.js.map +0 -1
  250. package/dist/tools/interface.test.d.ts +0 -7
  251. package/dist/tools/interface.test.d.ts.map +0 -1
  252. package/dist/tools/interface.test.js +0 -179
  253. package/dist/tools/interface.test.js.map +0 -1
  254. package/dist/tools/mcp/bridge.d.ts +0 -48
  255. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  256. package/dist/tools/mcp/bridge.js +0 -128
  257. package/dist/tools/mcp/bridge.js.map +0 -1
  258. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  259. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  260. package/dist/tools/mcp/bridge.test.js +0 -300
  261. package/dist/tools/mcp/bridge.test.js.map +0 -1
  262. package/dist/tools/mcp/client.d.ts +0 -135
  263. package/dist/tools/mcp/client.d.ts.map +0 -1
  264. package/dist/tools/mcp/client.js +0 -263
  265. package/dist/tools/mcp/client.js.map +0 -1
  266. package/dist/tools/mcp/client.test.d.ts +0 -8
  267. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  268. package/dist/tools/mcp/client.test.js +0 -390
  269. package/dist/tools/mcp/client.test.js.map +0 -1
  270. package/dist/tools/registry.d.ts +0 -82
  271. package/dist/tools/registry.d.ts.map +0 -1
  272. package/dist/tools/registry.js +0 -99
  273. package/dist/tools/registry.js.map +0 -1
  274. package/dist/tools/registry.test.d.ts +0 -7
  275. package/dist/tools/registry.test.d.ts.map +0 -1
  276. package/dist/tools/registry.test.js +0 -199
  277. package/dist/tools/registry.test.js.map +0 -1
  278. package/dist/tools/suite.test.d.ts +0 -11
  279. package/dist/tools/suite.test.d.ts.map +0 -1
  280. package/dist/tools/suite.test.js +0 -119
  281. package/dist/tools/suite.test.js.map +0 -1
  282. package/dist/tools/types.d.ts +0 -75
  283. package/dist/tools/types.d.ts.map +0 -1
  284. package/dist/tools/types.js +0 -30
  285. package/dist/tools/types.js.map +0 -1
  286. package/dist/tools/types.test.d.ts +0 -7
  287. package/dist/tools/types.test.d.ts.map +0 -1
  288. package/dist/tools/types.test.js +0 -178
  289. package/dist/tools/types.test.js.map +0 -1
  290. package/templates/.vscode/mcp.json +0 -20
  291. 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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAI7D,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF;;;GAGG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACzC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO;QACL,UAAU;QACV,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,IAAY,EACZ,KAAoB,EACpB,cAAwB,EACxB,aAAqB;IAErB,OAAO;QACL,IAAI;QACJ,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;QAC5B,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,aAAa;gBAAE,MAAM,aAAa,CAAC;YACvC,OAAO,cAAc,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACvE,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACvB,UAAU,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACH,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IACxB,OAAO;QACL,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE;YACX,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;YACpB,YAAY,EAAE,IAAI;SACnB;KACF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7D,OAAO,EAAE;gBACP,MAAM,EAAE;oBACN,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC;iBAC9B;aACF;SACF,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YACtC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7D,OAAO,EAAE;gBACP,QAAQ,EAAE;oBACR,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,WAAW,CAAC;oBACnB,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;iBAC5C;aACF;SACF,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YAExC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7D,OAAO,EAAE;gBACP,QAAQ,EAAE;oBACR,IAAI,EAAE,MAAM;oBACZ,GAAG,EAAE,8BAA8B;iBACpC;gBACD,MAAM,EAAE;oBACN,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC;iBAC9B;aACF;SACF,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnC,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC;;;;;;;;;MAS9C,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC;;;;;;;;MAQ9C,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7D,SAAS,EAAE,4BAA4B;SACxC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7D,OAAO,EAAE;gBACP,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;gBACzC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;gBAC9C,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;aACvC;SACF,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAE3C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7D,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;aAC1B;SACF,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YAEpC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE;YACxC;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uBAAuB;gBACpC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;aAC3E;SACF,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE;YAC1C;gBACE,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,sBAAsB;gBACnC,WAAW,EAAE,EAAE;aAChB;SACF,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;aACxD;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB,CAAC;QAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE;YACtC,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE;SACjE,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,cAAc,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;QAChF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE;YACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;SAC3D,EAAE,cAAc,CAAC,CAAC;QAEnB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEhF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE;YACtC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;SACvD,EAAE,aAAa,CAAC,CAAC;QAElB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,gBAAgB,CAC7B,MAAM,EACN,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,EACzD,SAAS,EACT,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAC5B,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE;YACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;YAC1D,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE;YAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;SACvD,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE7C,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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"}