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
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Smoke Test — Vitest Infrastructure Verification
3
+ *
4
+ * Proves the new Vitest test infrastructure works correctly
5
+ * alongside the existing node:test-based tests.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { join } from 'node:path';
9
+ import { loadAgents } from '../core/agents/loader.js';
10
+ import { loadSkills } from '../core/skills/loader.js';
11
+ const TEMPLATES_AGENTS_DIR = join(process.cwd(), 'templates', '.github', 'agents');
12
+ const TEMPLATES_SKILLS_DIR = join(process.cwd(), 'templates', '.github', 'skills');
13
+ describe('Smoke Test: Agent Loader', () => {
14
+ it('should load agents from templates directory', () => {
15
+ const result = loadAgents(TEMPLATES_AGENTS_DIR);
16
+ expect(result.errors).toHaveLength(0);
17
+ expect(result.agents.length).toBeGreaterThanOrEqual(6);
18
+ const agentIds = result.agents.map((a) => a.id);
19
+ expect(agentIds).toContain('beth');
20
+ expect(agentIds).toContain('developer');
21
+ });
22
+ });
23
+ describe('Smoke Test: Skill Loader', () => {
24
+ it('should load skills from templates directory', () => {
25
+ const result = loadSkills(TEMPLATES_SKILLS_DIR);
26
+ expect(result.errors).toHaveLength(0);
27
+ expect(result.skills.length).toBeGreaterThanOrEqual(5);
28
+ const skillIds = result.skills.map((s) => s.id);
29
+ expect(skillIds).toContain('prd');
30
+ expect(skillIds).toContain('shadcn-ui');
31
+ });
32
+ });
33
+ describe('Smoke Test: Barrel Exports', () => {
34
+ it('should export agent loader functions', async () => {
35
+ const mod = await import('../index.js');
36
+ expect(mod.loadAgents).toBeDefined();
37
+ expect(typeof mod.loadAgents).toBe('function');
38
+ expect(mod.loadAgent).toBeDefined();
39
+ expect(typeof mod.loadAgent).toBe('function');
40
+ });
41
+ it('should export skill loader functions', async () => {
42
+ const mod = await import('../index.js');
43
+ expect(mod.loadSkills).toBeDefined();
44
+ expect(typeof mod.loadSkills).toBe('function');
45
+ expect(mod.loadSkill).toBeDefined();
46
+ expect(typeof mod.loadSkill).toBe('function');
47
+ });
48
+ });
49
+ //# sourceMappingURL=smoke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/smoke.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * E2E tests for beads (bd) CLI commands that Beth depends on.
3
+ *
4
+ * Tests the full lifecycle of bd commands: create, show, list, update,
5
+ * close, ready, dep, children, and epic workflows.
6
+ *
7
+ * These tests run against the REAL beads database. All test issues are
8
+ * cleaned up in afterAll. Uses --json for deterministic assertions.
9
+ *
10
+ * Run with: npx vitest run src/cli/commands/beads.e2e.test.ts
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=beads.e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beads.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/beads.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,526 @@
1
+ /**
2
+ * E2E tests for beads (bd) CLI commands that Beth depends on.
3
+ *
4
+ * Tests the full lifecycle of bd commands: create, show, list, update,
5
+ * close, ready, dep, children, and epic workflows.
6
+ *
7
+ * These tests run against the REAL beads database. All test issues are
8
+ * cleaned up in afterAll. Uses --json for deterministic assertions.
9
+ *
10
+ * Run with: npx vitest run src/cli/commands/beads.e2e.test.ts
11
+ */
12
+ import { describe, it, beforeAll, afterAll } from 'node:test';
13
+ import assert from 'node:assert';
14
+ import { execSync } from 'child_process';
15
+ const PROJECT_ROOT = process.cwd();
16
+ /** Track all issue IDs created during tests for cleanup */
17
+ const createdIssueIds = [];
18
+ /**
19
+ * Run a bd command and return stdout. Uses --sandbox to prevent auto-sync.
20
+ * Throws on non-zero exit unless expectFailure is true.
21
+ */
22
+ function bd(args, opts) {
23
+ const cmd = `bd ${args} --sandbox`;
24
+ try {
25
+ return execSync(cmd, {
26
+ cwd: PROJECT_ROOT,
27
+ encoding: 'utf-8',
28
+ stdio: ['pipe', 'pipe', 'pipe'],
29
+ env: { ...process.env, NO_COLOR: '1' },
30
+ timeout: 15000,
31
+ }).trim();
32
+ }
33
+ catch (error) {
34
+ if (opts?.expectFailure) {
35
+ const execError = error;
36
+ return (execError.stdout || '') + (execError.stderr || '');
37
+ }
38
+ throw error;
39
+ }
40
+ }
41
+ /**
42
+ * Run a bd command with --json and parse the result.
43
+ */
44
+ function bdJson(args) {
45
+ const output = bd(`${args} --json`);
46
+ return JSON.parse(output);
47
+ }
48
+ /**
49
+ * Create a test issue and track it for cleanup.
50
+ * Returns the issue ID extracted from bd create output.
51
+ */
52
+ function createTestIssue(args) {
53
+ const output = bd(`create ${args}`);
54
+ const match = output.match(/Created issue:\s+([\w.-]+)/);
55
+ assert.ok(match, `Expected issue ID in create output: ${output}`);
56
+ const id = match[1];
57
+ createdIssueIds.push(id);
58
+ return id;
59
+ }
60
+ // ============================================================================
61
+ // Preflight: verify bd is available
62
+ // ============================================================================
63
+ describe('beads CLI E2E tests', () => {
64
+ beforeAll(() => {
65
+ try {
66
+ const version = execSync('bd --version', { encoding: 'utf-8', timeout: 5000 });
67
+ assert.ok(version.includes('version'), 'bd CLI must be installed');
68
+ }
69
+ catch {
70
+ throw new Error('bd CLI is not installed. These tests require beads. Run: curl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash');
71
+ }
72
+ });
73
+ afterAll(() => {
74
+ // Clean up all test issues (reverse order to handle children first)
75
+ for (const id of [...createdIssueIds].reverse()) {
76
+ try {
77
+ // Force close first (in case it's open), then delete
78
+ execSync(`bd close ${id} --force --reason "test cleanup" --sandbox 2>/dev/null`, {
79
+ cwd: PROJECT_ROOT,
80
+ encoding: 'utf-8',
81
+ stdio: ['pipe', 'pipe', 'pipe'],
82
+ timeout: 10000,
83
+ });
84
+ }
85
+ catch {
86
+ // Already closed or doesn't exist — fine
87
+ }
88
+ try {
89
+ execSync(`bd delete ${id} --force --sandbox 2>/dev/null`, {
90
+ cwd: PROJECT_ROOT,
91
+ encoding: 'utf-8',
92
+ stdio: ['pipe', 'pipe', 'pipe'],
93
+ timeout: 10000,
94
+ });
95
+ }
96
+ catch {
97
+ // Already deleted — fine
98
+ }
99
+ }
100
+ });
101
+ // ==========================================================================
102
+ // bd create
103
+ // ==========================================================================
104
+ describe('bd create', () => {
105
+ it('creates a basic task with title', () => {
106
+ const id = createTestIssue('"E2E test: basic task"');
107
+ assert.ok(id.startsWith('beth-'), `Issue ID should start with project prefix: ${id}`);
108
+ });
109
+ it('creates with priority flag', () => {
110
+ const id = createTestIssue('"E2E test: priority task" -p 0');
111
+ const issues = bdJson(`show ${id}`);
112
+ assert.strictEqual(issues[0].priority, 0, 'Priority should be 0 (critical)');
113
+ });
114
+ it('creates with description', () => {
115
+ const id = createTestIssue('"E2E test: described task" -d "This is a test description"');
116
+ const issues = bdJson(`show ${id}`);
117
+ assert.ok(issues[0].description.includes('test description'), 'Description should be set');
118
+ });
119
+ it('creates with type flag', () => {
120
+ const id = createTestIssue('"E2E test: bug type" --type bug');
121
+ const issues = bdJson(`show ${id}`);
122
+ assert.strictEqual(issues[0].issue_type, 'bug', 'Type should be bug');
123
+ });
124
+ it('creates an epic', () => {
125
+ const id = createTestIssue('"E2E test: epic" --type epic -p 1');
126
+ const issues = bdJson(`show ${id}`);
127
+ assert.strictEqual(issues[0].issue_type, 'epic', 'Type should be epic');
128
+ assert.strictEqual(issues[0].priority, 1, 'Priority should be P1');
129
+ });
130
+ it('creates a child task with --parent', () => {
131
+ const epicId = createTestIssue('"E2E test: parent epic" --type epic');
132
+ const childId = createTestIssue(`"E2E test: child task" --parent ${epicId}`);
133
+ assert.ok(childId.includes('.'), `Child ID should be hierarchical (contain dot): ${childId}`);
134
+ });
135
+ it('creates with labels', () => {
136
+ const id = createTestIssue('"E2E test: labeled task" -l test-label,e2e');
137
+ const issues = bdJson(`show ${id}`);
138
+ const labels = issues[0].labels || [];
139
+ assert.ok(labels.includes('test-label'), 'Should have test-label');
140
+ assert.ok(labels.includes('e2e'), 'Should have e2e label');
141
+ });
142
+ it('creates with dependency', () => {
143
+ const blockerId = createTestIssue('"E2E test: blocker"');
144
+ const blockedId = createTestIssue(`"E2E test: blocked" --deps "${blockerId}"`);
145
+ const issues = bdJson(`show ${blockedId}`);
146
+ const deps = issues[0].dependencies || [];
147
+ const hasBlocker = deps.some(d => d.id === blockerId);
148
+ assert.ok(hasBlocker, `Should depend on ${blockerId}`);
149
+ });
150
+ });
151
+ // ==========================================================================
152
+ // bd show
153
+ // ==========================================================================
154
+ describe('bd show', () => {
155
+ it('shows issue details in JSON', () => {
156
+ const id = createTestIssue('"E2E test: show me" -d "Show test description"');
157
+ const issues = bdJson(`show ${id}`);
158
+ assert.strictEqual(issues.length, 1, 'Should return exactly one issue');
159
+ assert.strictEqual(issues[0].id, id);
160
+ assert.strictEqual(issues[0].title, 'E2E test: show me');
161
+ assert.strictEqual(issues[0].status, 'open');
162
+ assert.ok(issues[0].description.includes('Show test description'));
163
+ });
164
+ it('shows children with --children flag', () => {
165
+ const epicId = createTestIssue('"E2E test: parent for show" --type epic');
166
+ const child1 = createTestIssue(`"E2E test: child 1" --parent ${epicId}`);
167
+ const child2 = createTestIssue(`"E2E test: child 2" --parent ${epicId}`);
168
+ // bd children returns a JSON array; show --children returns { id: [...] }
169
+ const children = bdJson(`children ${epicId}`);
170
+ const childIds = children.map(c => c.id);
171
+ assert.ok(childIds.includes(child1), `Should include ${child1}`);
172
+ assert.ok(childIds.includes(child2), `Should include ${child2}`);
173
+ });
174
+ it('shows multiple issues at once', () => {
175
+ const id1 = createTestIssue('"E2E test: multi-show 1"');
176
+ const id2 = createTestIssue('"E2E test: multi-show 2"');
177
+ const issues = bdJson(`show ${id1} ${id2}`);
178
+ assert.strictEqual(issues.length, 2, 'Should return two issues');
179
+ });
180
+ });
181
+ // ==========================================================================
182
+ // bd list
183
+ // ==========================================================================
184
+ describe('bd list', () => {
185
+ it('lists open issues as JSON array', () => {
186
+ const issues = bdJson('list');
187
+ assert.ok(Array.isArray(issues), 'Should return an array');
188
+ // All listed issues should be open (default filter)
189
+ for (const issue of issues) {
190
+ assert.strictEqual(issue.status, 'open', `Listed issue ${issue.id} should be open`);
191
+ }
192
+ });
193
+ it('respects --limit flag', () => {
194
+ const issues = bdJson('list --limit 2');
195
+ assert.ok(issues.length <= 2, `Should return at most 2 issues, got ${issues.length}`);
196
+ });
197
+ it('filters by type', () => {
198
+ createTestIssue('"E2E test: list-by-type epic" --type epic');
199
+ const issues = bdJson('list --type epic');
200
+ for (const issue of issues) {
201
+ assert.strictEqual(issue.issue_type, 'epic', `All listed should be epics`);
202
+ }
203
+ });
204
+ it('filters by priority', () => {
205
+ createTestIssue('"E2E test: list-by-priority" -p 0');
206
+ const issues = bdJson('list --priority 0');
207
+ for (const issue of issues) {
208
+ assert.strictEqual(issue.priority, 0, `All listed should be P0`);
209
+ }
210
+ });
211
+ it('shows all including closed with --all', () => {
212
+ const id = createTestIssue('"E2E test: will close for list"');
213
+ bd(`close ${id} --reason "testing list --all"`);
214
+ const allIssues = bdJson('list --all --limit 50');
215
+ const closedOnes = allIssues.filter(i => i.status === 'closed');
216
+ assert.ok(closedOnes.length > 0, 'Should include closed issues');
217
+ });
218
+ });
219
+ // ==========================================================================
220
+ // bd update
221
+ // ==========================================================================
222
+ describe('bd update', () => {
223
+ it('updates title', () => {
224
+ const id = createTestIssue('"E2E test: original title"');
225
+ bd(`update ${id} --title "E2E test: updated title"`);
226
+ const issues = bdJson(`show ${id}`);
227
+ assert.strictEqual(issues[0].title, 'E2E test: updated title');
228
+ });
229
+ it('updates priority', () => {
230
+ const id = createTestIssue('"E2E test: update priority" -p 3');
231
+ bd(`update ${id} -p 0`);
232
+ const issues = bdJson(`show ${id}`);
233
+ assert.strictEqual(issues[0].priority, 0);
234
+ });
235
+ it('updates status', () => {
236
+ const id = createTestIssue('"E2E test: update status"');
237
+ bd(`update ${id} -s in_progress`);
238
+ const issues = bdJson(`show ${id}`);
239
+ assert.strictEqual(issues[0].status, 'in_progress');
240
+ });
241
+ it('claims an issue atomically', () => {
242
+ const id = createTestIssue('"E2E test: claimable"');
243
+ bd(`update ${id} --claim`);
244
+ const issues = bdJson(`show ${id}`);
245
+ assert.strictEqual(issues[0].status, 'in_progress', 'Claimed issue should be in_progress');
246
+ assert.ok(issues[0].owner, 'Claimed issue should have an owner');
247
+ });
248
+ it('adds and removes labels', () => {
249
+ const id = createTestIssue('"E2E test: label management"');
250
+ bd(`update ${id} --add-label foo,bar`);
251
+ let issues = bdJson(`show ${id}`);
252
+ assert.ok((issues[0].labels || []).includes('foo'), 'Should have foo label');
253
+ bd(`update ${id} --remove-label foo`);
254
+ issues = bdJson(`show ${id}`);
255
+ assert.ok(!(issues[0].labels || []).includes('foo'), 'foo label should be removed');
256
+ assert.ok((issues[0].labels || []).includes('bar'), 'bar label should remain');
257
+ });
258
+ it('updates description', () => {
259
+ const id = createTestIssue('"E2E test: update desc"');
260
+ bd(`update ${id} -d "New description content"`);
261
+ const issues = bdJson(`show ${id}`);
262
+ assert.ok(issues[0].description.includes('New description content'));
263
+ });
264
+ });
265
+ // ==========================================================================
266
+ // bd close
267
+ // ==========================================================================
268
+ describe('bd close', () => {
269
+ it('closes an issue', () => {
270
+ const id = createTestIssue('"E2E test: close me"');
271
+ bd(`close ${id}`);
272
+ const issues = bdJson(`show ${id}`);
273
+ assert.strictEqual(issues[0].status, 'closed');
274
+ });
275
+ it('closes with a reason', () => {
276
+ const id = createTestIssue('"E2E test: close with reason"');
277
+ bd(`close ${id} --reason "Work completed successfully"`);
278
+ const issues = bdJson(`show ${id}`);
279
+ assert.strictEqual(issues[0].status, 'closed');
280
+ });
281
+ it('closed issues disappear from default list', () => {
282
+ const id = createTestIssue('"E2E test: vanish from list"');
283
+ bd(`close ${id}`);
284
+ const openIssues = bdJson('list');
285
+ const found = openIssues.find(i => i.id === id);
286
+ assert.strictEqual(found, undefined, 'Closed issue should not appear in default list');
287
+ });
288
+ });
289
+ // ==========================================================================
290
+ // bd ready
291
+ // ==========================================================================
292
+ describe('bd ready', () => {
293
+ it('returns only unblocked open issues', () => {
294
+ const issues = bdJson('ready');
295
+ assert.ok(Array.isArray(issues), 'Should return an array');
296
+ for (const issue of issues) {
297
+ assert.strictEqual(issue.status, 'open', `Ready issue ${issue.id} should be open`);
298
+ }
299
+ });
300
+ it('excludes blocked issues', () => {
301
+ const blockerId = createTestIssue('"E2E test: ready-blocker"');
302
+ const blockedId = createTestIssue(`"E2E test: ready-blocked" --deps "${blockerId}"`);
303
+ const readyIssues = bdJson('ready --limit 50');
304
+ const readyIds = readyIssues.map(i => i.id);
305
+ assert.ok(!readyIds.includes(blockedId), `Blocked issue ${blockedId} should not be ready`);
306
+ assert.ok(readyIds.includes(blockerId), `Blocker ${blockerId} should be ready`);
307
+ });
308
+ it('unblocks issues after closing blocker', () => {
309
+ const blockerId = createTestIssue('"E2E test: unblock-blocker"');
310
+ const blockedId = createTestIssue(`"E2E test: unblock-blocked" --deps "${blockerId}"`);
311
+ // Before: blocked issue NOT ready
312
+ let readyIssues = bdJson('ready --limit 50');
313
+ assert.ok(!readyIssues.map(i => i.id).includes(blockedId), 'Should be blocked initially');
314
+ // Close the blocker
315
+ bd(`close ${blockerId}`);
316
+ // After: previously blocked issue IS now ready
317
+ readyIssues = bdJson('ready --limit 50');
318
+ assert.ok(readyIssues.map(i => i.id).includes(blockedId), 'Should become ready after blocker closes');
319
+ });
320
+ it('excludes in_progress issues', () => {
321
+ const id = createTestIssue('"E2E test: ready-in-progress"');
322
+ bd(`update ${id} --claim`);
323
+ const readyIssues = bdJson('ready --limit 50');
324
+ const readyIds = readyIssues.map(i => i.id);
325
+ assert.ok(!readyIds.includes(id), 'In-progress issue should not appear in ready');
326
+ });
327
+ });
328
+ // ==========================================================================
329
+ // bd dep (dependencies)
330
+ // ==========================================================================
331
+ describe('bd dep', () => {
332
+ it('adds a blocking dependency', () => {
333
+ const blockerId = createTestIssue('"E2E test: dep-blocker"');
334
+ const blockedId = createTestIssue('"E2E test: dep-blocked"');
335
+ bd(`dep ${blockerId} --blocks ${blockedId}`);
336
+ const issues = bdJson(`show ${blockedId}`);
337
+ const deps = issues[0].dependencies || [];
338
+ const hasBlocker = deps.some(d => d.id === blockerId);
339
+ assert.ok(hasBlocker, `${blockedId} should depend on ${blockerId}`);
340
+ });
341
+ it('shows dependency tree', () => {
342
+ const epicId = createTestIssue('"E2E test: dep-tree epic" --type epic');
343
+ const task1 = createTestIssue(`"E2E test: dep-tree t1" --parent ${epicId}`);
344
+ const task2 = createTestIssue(`"E2E test: dep-tree t2" --parent ${epicId} --deps "${task1}"`);
345
+ // dep tree for task2 shows task2 and its blocker task1
346
+ const tree = bd(`dep tree ${task2}`);
347
+ assert.ok(tree.includes(task2), 'Tree should include task 2');
348
+ assert.ok(tree.includes(task1) || tree.includes('dep-tree t1'), 'Tree should include blocker task 1');
349
+ });
350
+ it('detects dependency cycles', () => {
351
+ // bd dep cycles returns output about any cycles in the entire database
352
+ // This just verifies the command runs without crashing
353
+ const output = bd('dep cycles');
354
+ assert.ok(typeof output === 'string', 'dep cycles should return output');
355
+ });
356
+ it('removes a dependency', () => {
357
+ const blockerId = createTestIssue('"E2E test: dep-remove-blocker"');
358
+ const blockedId = createTestIssue(`"E2E test: dep-remove-blocked" --deps "${blockerId}"`);
359
+ // Verify dep exists
360
+ let issues = bdJson(`show ${blockedId}`);
361
+ assert.ok((issues[0].dependencies || []).some(d => d.id === blockerId), 'Dep should exist');
362
+ // Remove it
363
+ bd(`dep remove ${blockedId} ${blockerId}`);
364
+ // Verify dep is gone
365
+ issues = bdJson(`show ${blockedId}`);
366
+ const remaining = (issues[0].dependencies || []).filter(d => d.id === blockerId);
367
+ assert.strictEqual(remaining.length, 0, 'Dependency should be removed');
368
+ });
369
+ });
370
+ // ==========================================================================
371
+ // bd children
372
+ // ==========================================================================
373
+ describe('bd children', () => {
374
+ it('lists children of an epic', () => {
375
+ const epicId = createTestIssue('"E2E test: children-epic" --type epic');
376
+ const child1 = createTestIssue(`"E2E test: children-c1" --parent ${epicId}`);
377
+ const child2 = createTestIssue(`"E2E test: children-c2" --parent ${epicId}`);
378
+ const children = bdJson(`children ${epicId}`);
379
+ const childIds = children.map(c => c.id);
380
+ assert.ok(childIds.includes(child1), `Should include ${child1}`);
381
+ assert.ok(childIds.includes(child2), `Should include ${child2}`);
382
+ });
383
+ it('returns empty array for issue with no children', () => {
384
+ const id = createTestIssue('"E2E test: no-children"');
385
+ const children = bdJson(`children ${id}`);
386
+ assert.strictEqual(children.length, 0, 'Should have no children');
387
+ });
388
+ });
389
+ // ==========================================================================
390
+ // Epic lifecycle (full workflow)
391
+ // ==========================================================================
392
+ describe('epic lifecycle', () => {
393
+ it('runs the full Beth orchestration workflow', { timeout: 120000 }, () => {
394
+ // 1. Create an epic
395
+ const epicId = createTestIssue('"E2E test: lifecycle epic" --type epic -p 1');
396
+ // 2. Create subtasks with dependencies (sequential chain)
397
+ const task1 = createTestIssue(`"E2E test: lifecycle requirements" --parent ${epicId}`);
398
+ const task2 = createTestIssue(`"E2E test: lifecycle design" --parent ${epicId} --deps "${task1}"`);
399
+ const task3 = createTestIssue(`"E2E test: lifecycle implement" --parent ${epicId} --deps "${task2}"`);
400
+ // 3. Verify dependency chain — only task1 should be ready
401
+ let ready = bdJson('ready --limit 50');
402
+ let readyIds = ready.map(r => r.id);
403
+ assert.ok(readyIds.includes(task1), 'Task 1 should be ready (no blockers)');
404
+ assert.ok(!readyIds.includes(task2), 'Task 2 should be blocked by task 1');
405
+ assert.ok(!readyIds.includes(task3), 'Task 3 should be blocked by task 2');
406
+ // 4. Close task1 → task2 becomes ready
407
+ bd(`close ${task1} --reason "Requirements done"`);
408
+ ready = bdJson('ready --limit 50');
409
+ readyIds = ready.map(r => r.id);
410
+ assert.ok(readyIds.includes(task2), 'Task 2 should be ready after task 1 closed');
411
+ assert.ok(!readyIds.includes(task3), 'Task 3 should still be blocked');
412
+ // 5. Close task2 → task3 becomes ready
413
+ bd(`close ${task2} --reason "Design done"`);
414
+ ready = bdJson('ready --limit 50');
415
+ readyIds = ready.map(r => r.id);
416
+ assert.ok(readyIds.includes(task3), 'Task 3 should be ready after task 2 closed');
417
+ // 6. Close task3 → all children done
418
+ bd(`close ${task3} --reason "Implementation done"`);
419
+ // 7. Verify all children are closed
420
+ const children = bdJson(`children ${epicId}`);
421
+ for (const child of children) {
422
+ assert.strictEqual(child.status, 'closed', `Child ${child.id} should be closed`);
423
+ }
424
+ // 8. Close the epic
425
+ bd(`close ${epicId} --reason "All work complete"`);
426
+ const epicData = bdJson(`show ${epicId}`);
427
+ assert.strictEqual(epicData[0].status, 'closed', 'Epic should be closed');
428
+ });
429
+ it('supports parallel subtask pattern', () => {
430
+ // Create epic with tasks that can run in parallel
431
+ const epicId = createTestIssue('"E2E test: parallel epic" --type epic');
432
+ const implTask = createTestIssue(`"E2E test: parallel impl" --parent ${epicId}`);
433
+ // Security and test tasks depend on impl but NOT on each other
434
+ const secTask = createTestIssue(`"E2E test: parallel security" --parent ${epicId} --deps "${implTask}"`);
435
+ const testTask = createTestIssue(`"E2E test: parallel testing" --parent ${epicId} --deps "${implTask}"`);
436
+ // Only impl should be ready
437
+ let ready = bdJson('ready --limit 50');
438
+ let readyIds = ready.map(r => r.id);
439
+ assert.ok(readyIds.includes(implTask), 'Impl should be ready');
440
+ assert.ok(!readyIds.includes(secTask), 'Security should be blocked');
441
+ assert.ok(!readyIds.includes(testTask), 'Testing should be blocked');
442
+ // Close impl → BOTH security and testing become ready (parallel)
443
+ bd(`close ${implTask}`);
444
+ ready = bdJson('ready --limit 50');
445
+ readyIds = ready.map(r => r.id);
446
+ assert.ok(readyIds.includes(secTask), 'Security should be ready after impl closes');
447
+ assert.ok(readyIds.includes(testTask), 'Testing should be ready after impl closes (parallel)');
448
+ });
449
+ });
450
+ // ==========================================================================
451
+ // Error handling
452
+ // ==========================================================================
453
+ describe('error handling', () => {
454
+ it('fails gracefully on invalid issue ID', () => {
455
+ const output = bd('show nonexistent-999', { expectFailure: true });
456
+ assert.ok(output.length > 0, 'Should produce error output');
457
+ });
458
+ it('bd close on already-closed issue fails or is idempotent', () => {
459
+ const id = createTestIssue('"E2E test: double close"');
460
+ bd(`close ${id}`);
461
+ // Second close should either fail gracefully or be idempotent
462
+ const output = bd(`close ${id}`, { expectFailure: true });
463
+ assert.ok(typeof output === 'string', 'Should handle double-close');
464
+ });
465
+ it('bd create requires a title', () => {
466
+ const output = bd('create', { expectFailure: true });
467
+ assert.ok(output.length > 0, 'Should produce error when no title given');
468
+ });
469
+ });
470
+ // ==========================================================================
471
+ // bd reopen
472
+ // ==========================================================================
473
+ describe('bd reopen', () => {
474
+ it('reopens a closed issue', () => {
475
+ const id = createTestIssue('"E2E test: reopen me"');
476
+ bd(`close ${id}`);
477
+ let issues = bdJson(`show ${id}`);
478
+ assert.strictEqual(issues[0].status, 'closed');
479
+ bd(`reopen ${id}`);
480
+ issues = bdJson(`show ${id}`);
481
+ assert.strictEqual(issues[0].status, 'open', 'Reopened issue should be open');
482
+ });
483
+ });
484
+ // ==========================================================================
485
+ // bd blocked
486
+ // ==========================================================================
487
+ describe('bd blocked', () => {
488
+ it('shows blocked issues', () => {
489
+ const blockerId = createTestIssue('"E2E test: blocked-view-blocker"');
490
+ const blockedId = createTestIssue(`"E2E test: blocked-view-target" --deps "${blockerId}"`);
491
+ const output = bd('blocked');
492
+ assert.ok(output.includes(blockedId) || output.includes('blocked-view-target'), 'Blocked command should show the blocked issue');
493
+ });
494
+ });
495
+ // ==========================================================================
496
+ // bd search
497
+ // ==========================================================================
498
+ describe('bd search', () => {
499
+ it('finds issues by text query', () => {
500
+ const uniqueMarker = `e2e-search-${Date.now()}`;
501
+ createTestIssue(`"E2E test: ${uniqueMarker}"`);
502
+ const output = bd(`search "${uniqueMarker}"`);
503
+ assert.ok(output.includes(uniqueMarker), 'Search should find the issue by title text');
504
+ });
505
+ });
506
+ // ==========================================================================
507
+ // bd count
508
+ // ==========================================================================
509
+ describe('bd count', () => {
510
+ it('counts open issues', () => {
511
+ const output = bd('count');
512
+ // count outputs a number (possibly with label text)
513
+ assert.ok(/\d+/.test(output), 'Count should include a number');
514
+ });
515
+ });
516
+ // ==========================================================================
517
+ // bd status (database overview)
518
+ // ==========================================================================
519
+ describe('bd status', () => {
520
+ it('shows database overview', () => {
521
+ const output = bd('status');
522
+ assert.ok(output.length > 0, 'Status should produce output');
523
+ });
524
+ });
525
+ });
526
+ //# sourceMappingURL=beads.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beads.e2e.test.js","sourceRoot":"","sources":["../../../src/cli/commands/beads.e2e.test.ts"],"names":[],"mappings":"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"}