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,190 +0,0 @@
1
- /**
2
- * Subagent Tool Tests
3
- *
4
- * Tests for the subagent tool (Phase 3 stub).
5
- * Uses node:test and node:assert.
6
- */
7
- import { describe, it } from 'node:test';
8
- import assert from 'node:assert';
9
- import { subagentTool, isSubagentRequest } from './subagent.js';
10
- import { ToolError } from '../types.js';
11
- /** Create a ToolContext with sensible defaults */
12
- function createContext(overrides) {
13
- return {
14
- workingDir: '/tmp/test',
15
- permissions: overrides?.permissions ?? {
16
- allowFileRead: false,
17
- allowFileWrite: false,
18
- allowTerminal: false,
19
- allowNetwork: true,
20
- },
21
- signal: overrides?.signal,
22
- };
23
- }
24
- describe('subagent tool', () => {
25
- describe('metadata', () => {
26
- it('should have name "subagent"', () => {
27
- assert.strictEqual(subagentTool.name, 'subagent');
28
- });
29
- it('should have a description', () => {
30
- assert.ok(subagentTool.description.length > 0);
31
- });
32
- it('should have an inputSchema with agentName and prompt required', () => {
33
- assert.strictEqual(subagentTool.inputSchema.type, 'object');
34
- assert.ok(Array.isArray(subagentTool.inputSchema.required));
35
- const required = subagentTool.inputSchema.required;
36
- assert.ok(required.includes('agentName'));
37
- assert.ok(required.includes('prompt'));
38
- });
39
- });
40
- describe('successful invocation', () => {
41
- it('should return pending result with correct metadata', async () => {
42
- const result = await subagentTool.execute({ agentName: 'developer', prompt: 'Implement login page', description: 'Login UI' }, createContext());
43
- assert.strictEqual(result.success, true);
44
- assert.strictEqual(result.metadata?.agentName, 'developer');
45
- assert.strictEqual(result.metadata?.prompt, 'Implement login page');
46
- assert.strictEqual(result.metadata?.description, 'Login UI');
47
- assert.strictEqual(result.metadata?.status, 'pending');
48
- });
49
- it('should handle missing description', async () => {
50
- const result = await subagentTool.execute({ agentName: 'tester', prompt: 'Write tests for auth' }, createContext());
51
- assert.strictEqual(result.success, true);
52
- assert.strictEqual(result.metadata?.agentName, 'tester');
53
- assert.strictEqual(result.metadata?.description, undefined);
54
- assert.strictEqual(result.metadata?.status, 'pending');
55
- });
56
- it('should trim agentName and prompt', async () => {
57
- const result = await subagentTool.execute({ agentName: ' developer ', prompt: ' Build it ' }, createContext());
58
- assert.strictEqual(result.metadata?.agentName, 'developer');
59
- assert.strictEqual(result.metadata?.prompt, 'Build it');
60
- });
61
- it('should include agentName in output message', async () => {
62
- const result = await subagentTool.execute({ agentName: 'developer', prompt: 'Do stuff' }, createContext());
63
- assert.ok(result.output.includes('developer'));
64
- });
65
- });
66
- describe('input validation', () => {
67
- it('should reject empty agentName', async () => {
68
- await assert.rejects(() => subagentTool.execute({ agentName: '', prompt: 'Do stuff' }, createContext()), (err) => {
69
- assert.ok(err instanceof ToolError);
70
- assert.strictEqual(err.code, 'INVALID_INPUT');
71
- assert.ok(err.message.includes('agentName'));
72
- return true;
73
- });
74
- });
75
- it('should reject whitespace-only agentName', async () => {
76
- await assert.rejects(() => subagentTool.execute({ agentName: ' ', prompt: 'Do stuff' }, createContext()), (err) => {
77
- assert.ok(err instanceof ToolError);
78
- assert.strictEqual(err.code, 'INVALID_INPUT');
79
- return true;
80
- });
81
- });
82
- it('should reject non-string agentName', async () => {
83
- await assert.rejects(() => subagentTool.execute({ agentName: 42, prompt: 'Do stuff' }, createContext()), (err) => {
84
- assert.ok(err instanceof ToolError);
85
- assert.strictEqual(err.code, 'INVALID_INPUT');
86
- return true;
87
- });
88
- });
89
- it('should reject empty prompt', async () => {
90
- await assert.rejects(() => subagentTool.execute({ agentName: 'developer', prompt: '' }, createContext()), (err) => {
91
- assert.ok(err instanceof ToolError);
92
- assert.strictEqual(err.code, 'INVALID_INPUT');
93
- assert.ok(err.message.includes('prompt'));
94
- return true;
95
- });
96
- });
97
- it('should reject non-string prompt', async () => {
98
- await assert.rejects(() => subagentTool.execute({ agentName: 'developer', prompt: 123 }, createContext()), (err) => {
99
- assert.ok(err instanceof ToolError);
100
- assert.strictEqual(err.code, 'INVALID_INPUT');
101
- return true;
102
- });
103
- });
104
- });
105
- describe('permissions', () => {
106
- it('should throw PERMISSION_DENIED when allowNetwork is false', async () => {
107
- const ctx = createContext({
108
- permissions: {
109
- allowFileRead: false,
110
- allowFileWrite: false,
111
- allowTerminal: false,
112
- allowNetwork: false,
113
- },
114
- });
115
- await assert.rejects(() => subagentTool.execute({ agentName: 'developer', prompt: 'Do stuff' }, ctx), (err) => {
116
- assert.ok(err instanceof ToolError);
117
- assert.strictEqual(err.code, 'PERMISSION_DENIED');
118
- return true;
119
- });
120
- });
121
- });
122
- });
123
- describe('isSubagentRequest', () => {
124
- it('should return true for valid pending subagent result', () => {
125
- const result = {
126
- success: true,
127
- output: 'queued',
128
- metadata: {
129
- agentName: 'developer',
130
- prompt: 'Build it',
131
- status: 'pending',
132
- },
133
- };
134
- assert.strictEqual(isSubagentRequest(result), true);
135
- });
136
- it('should return false when success is false', () => {
137
- const result = {
138
- success: false,
139
- output: 'failed',
140
- metadata: {
141
- agentName: 'developer',
142
- prompt: 'Build it',
143
- status: 'pending',
144
- },
145
- };
146
- assert.strictEqual(isSubagentRequest(result), false);
147
- });
148
- it('should return false when metadata is missing', () => {
149
- const result = {
150
- success: true,
151
- output: 'ok',
152
- };
153
- assert.strictEqual(isSubagentRequest(result), false);
154
- });
155
- it('should return false when status is not pending', () => {
156
- const result = {
157
- success: true,
158
- output: 'ok',
159
- metadata: {
160
- agentName: 'developer',
161
- prompt: 'Build it',
162
- status: 'completed',
163
- },
164
- };
165
- assert.strictEqual(isSubagentRequest(result), false);
166
- });
167
- it('should return false when agentName is missing', () => {
168
- const result = {
169
- success: true,
170
- output: 'ok',
171
- metadata: {
172
- prompt: 'Build it',
173
- status: 'pending',
174
- },
175
- };
176
- assert.strictEqual(isSubagentRequest(result), false);
177
- });
178
- it('should return false when prompt is missing', () => {
179
- const result = {
180
- success: true,
181
- output: 'ok',
182
- metadata: {
183
- agentName: 'developer',
184
- status: 'pending',
185
- },
186
- };
187
- assert.strictEqual(isSubagentRequest(result), false);
188
- });
189
- });
190
- //# sourceMappingURL=subagent.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent.test.js","sourceRoot":"","sources":["../../../src/tools/cli/subagent.test.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Terminal Tool
3
- *
4
- * Executes shell commands in a controlled environment.
5
- * Uses execFile with /bin/sh to maintain a single controlled shell entry point.
6
- * Validates working directory and enforces timeouts and output limits.
7
- */
8
- import type { Tool } from '../interface.js';
9
- /**
10
- * Terminal tool implementation.
11
- *
12
- * Executes shell commands using execFile with /bin/sh for a controlled
13
- * shell entry point. Captures stdout/stderr, enforces timeouts, and
14
- * truncates large output.
15
- *
16
- * SECURITY: Uses execFile('/bin/sh', ['-c', command]) — never exec with shell:true.
17
- */
18
- export declare const terminalTool: Tool;
19
- //# sourceMappingURL=terminal.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../../src/tools/cli/terminal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAoE5C;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,EAAE,IAsH1B,CAAC"}
@@ -1,164 +0,0 @@
1
- /**
2
- * Terminal Tool
3
- *
4
- * Executes shell commands in a controlled environment.
5
- * Uses execFile with /bin/sh to maintain a single controlled shell entry point.
6
- * Validates working directory and enforces timeouts and output limits.
7
- */
8
- import { execFile } from 'node:child_process';
9
- import { resolve } from 'node:path';
10
- import { containsTraversal } from '../../lib/pathValidation.js';
11
- import { ToolError } from '../types.js';
12
- /** Default timeout in milliseconds (30 seconds) */
13
- const DEFAULT_TIMEOUT = 30_000;
14
- /** Maximum output size in bytes (50KB) */
15
- const MAX_OUTPUT_BYTES = 50 * 1024;
16
- /** Input schema for the terminal tool */
17
- const inputSchema = {
18
- type: 'object',
19
- properties: {
20
- command: {
21
- type: 'string',
22
- description: 'Shell command to execute',
23
- },
24
- cwd: {
25
- type: 'string',
26
- description: 'Working directory for the command (defaults to context workingDir)',
27
- },
28
- timeout: {
29
- type: 'number',
30
- description: 'Timeout in milliseconds (default: 30000)',
31
- },
32
- },
33
- required: ['command'],
34
- };
35
- /**
36
- * Validate and resolve the working directory, ensuring it stays within workingDir.
37
- *
38
- * @param cwd - User-provided working directory
39
- * @param workingDir - The allowed root directory
40
- * @param toolName - Name of the calling tool (for error reporting)
41
- * @returns The resolved absolute path
42
- * @throws {ToolError} If the path escapes workingDir or contains traversal
43
- */
44
- function validateCwd(cwd, workingDir, toolName) {
45
- if (containsTraversal(cwd)) {
46
- throw new ToolError('Working directory contains directory traversal sequences', 'INVALID_INPUT', toolName);
47
- }
48
- const resolved = resolve(workingDir, cwd);
49
- const normalizedWorking = resolve(workingDir);
50
- if (!resolved.startsWith(normalizedWorking)) {
51
- throw new ToolError('Working directory is outside the allowed directory', 'INVALID_INPUT', toolName);
52
- }
53
- return resolved;
54
- }
55
- /**
56
- * Truncate output to the maximum allowed size, appending a notice if truncated.
57
- */
58
- function truncateOutput(output) {
59
- const bytes = Buffer.byteLength(output, 'utf-8');
60
- if (bytes <= MAX_OUTPUT_BYTES) {
61
- return output;
62
- }
63
- // Truncate by bytes, then trim to last complete character
64
- const truncated = Buffer.from(output, 'utf-8').subarray(0, MAX_OUTPUT_BYTES).toString('utf-8');
65
- return truncated + '\n\n[Output truncated — exceeded 50KB limit]';
66
- }
67
- /**
68
- * Terminal tool implementation.
69
- *
70
- * Executes shell commands using execFile with /bin/sh for a controlled
71
- * shell entry point. Captures stdout/stderr, enforces timeouts, and
72
- * truncates large output.
73
- *
74
- * SECURITY: Uses execFile('/bin/sh', ['-c', command]) — never exec with shell:true.
75
- */
76
- export const terminalTool = {
77
- name: 'terminal',
78
- description: 'Execute a shell command and return its output',
79
- inputSchema,
80
- async execute(input, context) {
81
- // Check permission
82
- if (!context.permissions.allowTerminal) {
83
- throw new ToolError('Terminal permission denied', 'PERMISSION_DENIED', 'terminal');
84
- }
85
- // Validate command
86
- const command = input.command;
87
- if (typeof command !== 'string' || command.trim().length === 0) {
88
- throw new ToolError('command is required and must be a non-empty string', 'INVALID_INPUT', 'terminal');
89
- }
90
- // Resolve and validate cwd
91
- const rawCwd = typeof input.cwd === 'string' ? input.cwd : context.workingDir;
92
- const cwd = validateCwd(rawCwd, context.workingDir, 'terminal');
93
- // Resolve timeout
94
- const timeout = typeof input.timeout === 'number' && input.timeout > 0
95
- ? input.timeout
96
- : DEFAULT_TIMEOUT;
97
- return new Promise((resolvePromise, rejectPromise) => {
98
- const child = execFile('/bin/sh', ['-c', command], {
99
- cwd,
100
- timeout,
101
- maxBuffer: MAX_OUTPUT_BYTES * 2, // Allow extra buffer, we truncate ourselves
102
- signal: context.signal,
103
- }, (error, stdout, stderr) => {
104
- // Combine stdout and stderr
105
- let combined = '';
106
- if (stdout)
107
- combined += stdout;
108
- if (stderr) {
109
- if (combined.length > 0 && !combined.endsWith('\n'))
110
- combined += '\n';
111
- if (stderr.length > 0)
112
- combined += stderr;
113
- }
114
- const output = truncateOutput(combined);
115
- if (error) {
116
- // Timeout: killed is true when the timeout fires
117
- if (error.killed) {
118
- rejectPromise(new ToolError(`Command timed out after ${timeout}ms`, 'TIMEOUT', 'terminal', { cause: error }));
119
- return;
120
- }
121
- const nodeErr = error;
122
- // Spawn/exec failure (not a non-zero exit code)
123
- if (nodeErr.code === 'ENOENT' || nodeErr.code === 'EACCES') {
124
- rejectPromise(new ToolError(`Failed to execute command: ${nodeErr.message}`, 'EXECUTION_FAILED', 'terminal', { cause: error }));
125
- return;
126
- }
127
- // Abort signal
128
- if (nodeErr.code === 'ABORT_ERR' || nodeErr.name === 'AbortError') {
129
- rejectPromise(new ToolError('Command was aborted', 'EXECUTION_FAILED', 'terminal', { cause: error }));
130
- return;
131
- }
132
- // Non-zero exit code: still success=true, include exit code in metadata
133
- const exitCode = typeof error.code === 'number'
134
- ? error.code
135
- : 1;
136
- resolvePromise({
137
- success: true,
138
- output,
139
- metadata: {
140
- exitCode,
141
- cwd,
142
- },
143
- });
144
- return;
145
- }
146
- resolvePromise({
147
- success: true,
148
- output,
149
- metadata: {
150
- exitCode: 0,
151
- cwd,
152
- },
153
- });
154
- });
155
- // Ensure child process is cleaned up on abort
156
- if (context.signal) {
157
- context.signal.addEventListener('abort', () => {
158
- child.kill();
159
- }, { once: true });
160
- }
161
- });
162
- },
163
- };
164
- //# sourceMappingURL=terminal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../src/tools/cli/terminal.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Terminal Tool Tests
3
- *
4
- * Tests for the terminal tool implementation.
5
- * Uses node:test and node:assert with real command execution via tmpdir.
6
- */
7
- export {};
8
- //# sourceMappingURL=terminal.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal.test.d.ts","sourceRoot":"","sources":["../../../src/tools/cli/terminal.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,161 +0,0 @@
1
- /**
2
- * Terminal Tool Tests
3
- *
4
- * Tests for the terminal tool implementation.
5
- * Uses node:test and node:assert with real command execution via tmpdir.
6
- */
7
- import { describe, it, beforeEach, afterEach } from 'node:test';
8
- import assert from 'node:assert';
9
- import { mkdtempSync, rmSync } from 'node:fs';
10
- import { join } from 'node:path';
11
- import { tmpdir } from 'node:os';
12
- import { terminalTool } from './terminal.js';
13
- import { ToolError } from '../types.js';
14
- /** Create a ToolContext with sensible defaults */
15
- function createContext(overrides) {
16
- return {
17
- workingDir: overrides?.workingDir ?? '/tmp',
18
- permissions: overrides?.permissions ?? {
19
- allowFileRead: false,
20
- allowFileWrite: false,
21
- allowTerminal: true,
22
- allowNetwork: false,
23
- },
24
- signal: overrides?.signal,
25
- };
26
- }
27
- describe('terminal tool', () => {
28
- let tempDir;
29
- beforeEach(() => {
30
- tempDir = mkdtempSync(join(tmpdir(), 'beth-terminal-'));
31
- });
32
- afterEach(() => {
33
- rmSync(tempDir, { recursive: true, force: true });
34
- });
35
- describe('metadata', () => {
36
- it('should have name "terminal"', () => {
37
- assert.strictEqual(terminalTool.name, 'terminal');
38
- });
39
- it('should have a description', () => {
40
- assert.ok(terminalTool.description.length > 0);
41
- });
42
- it('should have an inputSchema with command required', () => {
43
- assert.strictEqual(terminalTool.inputSchema.type, 'object');
44
- assert.ok(Array.isArray(terminalTool.inputSchema.required));
45
- assert.ok(terminalTool.inputSchema.required.includes('command'));
46
- });
47
- });
48
- describe('command execution', () => {
49
- it('should run a simple command', async () => {
50
- const result = await terminalTool.execute({ command: 'echo "hello"' }, createContext({ workingDir: tempDir }));
51
- assert.strictEqual(result.success, true);
52
- assert.ok(result.output.includes('hello'));
53
- assert.strictEqual(result.metadata?.exitCode, 0);
54
- });
55
- it('should capture stdout', async () => {
56
- const result = await terminalTool.execute({ command: 'echo "stdout output"' }, createContext({ workingDir: tempDir }));
57
- assert.strictEqual(result.success, true);
58
- assert.ok(result.output.includes('stdout output'));
59
- });
60
- it('should capture stderr', async () => {
61
- const result = await terminalTool.execute({ command: 'echo "error output" >&2' }, createContext({ workingDir: tempDir }));
62
- assert.strictEqual(result.success, true);
63
- assert.ok(result.output.includes('error output'));
64
- });
65
- it('should capture both stdout and stderr', async () => {
66
- const result = await terminalTool.execute({ command: 'echo "out" && echo "err" >&2' }, createContext({ workingDir: tempDir }));
67
- assert.strictEqual(result.success, true);
68
- assert.ok(result.output.includes('out'));
69
- assert.ok(result.output.includes('err'));
70
- });
71
- it('should return exit code in metadata', async () => {
72
- const result = await terminalTool.execute({ command: 'exit 0' }, createContext({ workingDir: tempDir }));
73
- assert.strictEqual(result.metadata?.exitCode, 0);
74
- });
75
- });
76
- describe('non-zero exit codes', () => {
77
- it('should return success=true with exit code for command failure', async () => {
78
- const result = await terminalTool.execute({ command: 'exit 42' }, createContext({ workingDir: tempDir }));
79
- assert.strictEqual(result.success, true);
80
- assert.strictEqual(result.metadata?.exitCode, 42);
81
- });
82
- it('should include output from failed commands', async () => {
83
- const result = await terminalTool.execute({ command: 'echo "before fail" && exit 1' }, createContext({ workingDir: tempDir }));
84
- assert.strictEqual(result.success, true);
85
- assert.ok(result.output.includes('before fail'));
86
- assert.strictEqual(result.metadata?.exitCode, 1);
87
- });
88
- });
89
- describe('timeout', () => {
90
- it('should throw TIMEOUT for long-running commands', async () => {
91
- await assert.rejects(() => terminalTool.execute({ command: 'sleep 60', timeout: 500 }, createContext({ workingDir: tempDir })), (err) => {
92
- assert.ok(err instanceof ToolError);
93
- assert.strictEqual(err.code, 'TIMEOUT');
94
- return true;
95
- });
96
- });
97
- });
98
- describe('permissions', () => {
99
- it('should return PERMISSION_DENIED when allowTerminal is false', async () => {
100
- const ctx = createContext({
101
- workingDir: tempDir,
102
- permissions: {
103
- allowFileRead: false,
104
- allowFileWrite: false,
105
- allowTerminal: false,
106
- allowNetwork: false,
107
- },
108
- });
109
- await assert.rejects(() => terminalTool.execute({ command: 'echo hi' }, ctx), (err) => {
110
- assert.ok(err instanceof ToolError);
111
- assert.strictEqual(err.code, 'PERMISSION_DENIED');
112
- return true;
113
- });
114
- });
115
- });
116
- describe('cwd validation', () => {
117
- it('should use workingDir as default cwd', async () => {
118
- const result = await terminalTool.execute({ command: 'pwd' }, createContext({ workingDir: tempDir }));
119
- assert.strictEqual(result.success, true);
120
- assert.ok(result.output.includes(tempDir));
121
- assert.strictEqual(result.metadata?.cwd, tempDir);
122
- });
123
- it('should reject cwd with traversal sequences', async () => {
124
- await assert.rejects(() => terminalTool.execute({ command: 'echo hi', cwd: '../../../etc' }, createContext({ workingDir: tempDir })), (err) => {
125
- assert.ok(err instanceof ToolError);
126
- assert.strictEqual(err.code, 'INVALID_INPUT');
127
- assert.ok(err.message.includes('traversal'));
128
- return true;
129
- });
130
- });
131
- });
132
- describe('input validation', () => {
133
- it('should reject empty command', async () => {
134
- await assert.rejects(() => terminalTool.execute({ command: '' }, createContext({ workingDir: tempDir })), (err) => {
135
- assert.ok(err instanceof ToolError);
136
- assert.strictEqual(err.code, 'INVALID_INPUT');
137
- return true;
138
- });
139
- });
140
- it('should reject non-string command', async () => {
141
- await assert.rejects(() => terminalTool.execute({ command: 123 }, createContext({ workingDir: tempDir })), (err) => {
142
- assert.ok(err instanceof ToolError);
143
- assert.strictEqual(err.code, 'INVALID_INPUT');
144
- return true;
145
- });
146
- });
147
- });
148
- describe('output truncation', () => {
149
- it('should truncate output exceeding 50KB', async () => {
150
- // Generate ~60KB of output
151
- const result = await terminalTool.execute({ command: 'seq 1 10000' }, createContext({ workingDir: tempDir }));
152
- assert.strictEqual(result.success, true);
153
- // Output should either be under limit or include truncation notice
154
- const outputBytes = Buffer.byteLength(result.output, 'utf-8');
155
- if (outputBytes > 50 * 1024) {
156
- assert.ok(result.output.includes('[Output truncated'));
157
- }
158
- });
159
- });
160
- });
161
- //# sourceMappingURL=terminal.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal.test.js","sourceRoot":"","sources":["../../../src/tools/cli/terminal.test.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Tool Abstraction Module
3
- *
4
- * Barrel exports for the tool abstraction layer.
5
- * Provides a uniform interface for agent tools regardless of
6
- * runtime environment (CLI, Copilot, MCP).
7
- */
8
- import { ToolRegistry } from './registry.js';
9
- export type { ToolErrorCode, ToolPermissions, ToolContext, ToolResult, ToolInputSchema, } from './types.js';
10
- export { ToolError } from './types.js';
11
- export type { Tool } from './interface.js';
12
- export { toToolDefinition } from './interface.js';
13
- export { ToolRegistry } from './registry.js';
14
- export { readFileTool } from './cli/readFile.js';
15
- export { editFileTool } from './cli/editFile.js';
16
- export { searchTool } from './cli/search.js';
17
- export { terminalTool } from './cli/terminal.js';
18
- export { beadsTool } from './cli/beads.js';
19
- export { subagentTool, isSubagentRequest } from './cli/subagent.js';
20
- export { MCPClient } from './mcp/client.js';
21
- export type { MCPServerConfig, MCPToolInfo } from './mcp/client.js';
22
- export { parseMCPConfig, createMCPTools, loadAllMCPTools } from './mcp/bridge.js';
23
- /** Create a ToolRegistry pre-loaded with all built-in CLI tools */
24
- export declare function createDefaultRegistry(): ToolRegistry;
25
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,YAAY,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,YAAY,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlF,mEAAmE;AACnE,wBAAgB,qBAAqB,IAAI,YAAY,CASpD"}