beth-copilot 1.0.17 → 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 (265) hide show
  1. package/CHANGELOG.md +41 -28
  2. package/README.md +87 -247
  3. package/bin/cli.js +115 -7
  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/init-logic.e2e.test.d.ts +37 -0
  39. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  40. package/dist/cli/commands/init-logic.e2e.test.js +305 -0
  41. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  42. package/dist/cli/commands/land.d.ts +142 -0
  43. package/dist/cli/commands/land.d.ts.map +1 -0
  44. package/dist/cli/commands/land.js +647 -0
  45. package/dist/cli/commands/land.js.map +1 -0
  46. package/dist/cli/commands/land.test.d.ts +20 -0
  47. package/dist/cli/commands/land.test.d.ts.map +1 -0
  48. package/dist/cli/commands/land.test.js +622 -0
  49. package/dist/cli/commands/land.test.js.map +1 -0
  50. package/dist/cli/commands/pipeline.e2e.test.js +1 -1
  51. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  52. package/dist/cli/commands/pre-push-guard.d.ts +84 -0
  53. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  54. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  55. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  56. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  57. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  58. package/dist/cli/commands/pre-push-guard.js +257 -0
  59. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  60. package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
  61. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  62. package/dist/cli/commands/pre-push-guard.test.js +397 -0
  63. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  64. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  65. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  66. package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
  67. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  68. package/dist/cli/commands/quickstart.test.js +40 -2
  69. package/dist/cli/commands/quickstart.test.js.map +1 -1
  70. package/dist/core/agents/suite.test.js +4 -2
  71. package/dist/core/agents/suite.test.js.map +1 -1
  72. package/dist/core/agents/tools.test.js +5 -1
  73. package/dist/core/agents/tools.test.js.map +1 -1
  74. package/dist/index.d.ts +3 -10
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5 -10
  77. package/dist/index.js.map +1 -1
  78. package/package.json +15 -9
  79. package/sbom.json +2011 -819
  80. package/templates/.github/agents/beth.agent.md +222 -45
  81. package/templates/.github/agents/developer.agent.md +37 -67
  82. package/templates/.github/agents/product-manager.agent.md +15 -57
  83. package/templates/.github/agents/researcher.agent.md +20 -60
  84. package/templates/.github/agents/security-reviewer.agent.md +29 -70
  85. package/templates/.github/agents/tester.agent.md +40 -58
  86. package/templates/.github/agents/ux-designer.agent.md +20 -63
  87. package/templates/.github/copilot-instructions.md +217 -204
  88. package/templates/AGENTS.md +108 -20
  89. package/dist/core/context.d.ts +0 -171
  90. package/dist/core/context.d.ts.map +0 -1
  91. package/dist/core/context.js +0 -353
  92. package/dist/core/context.js.map +0 -1
  93. package/dist/core/context.test.d.ts +0 -8
  94. package/dist/core/context.test.d.ts.map +0 -1
  95. package/dist/core/context.test.js +0 -253
  96. package/dist/core/context.test.js.map +0 -1
  97. package/dist/core/handoffs.d.ts +0 -151
  98. package/dist/core/handoffs.d.ts.map +0 -1
  99. package/dist/core/handoffs.js +0 -220
  100. package/dist/core/handoffs.js.map +0 -1
  101. package/dist/core/handoffs.test.d.ts +0 -8
  102. package/dist/core/handoffs.test.d.ts.map +0 -1
  103. package/dist/core/handoffs.test.js +0 -231
  104. package/dist/core/handoffs.test.js.map +0 -1
  105. package/dist/core/orchestrator.d.ts +0 -246
  106. package/dist/core/orchestrator.d.ts.map +0 -1
  107. package/dist/core/orchestrator.js +0 -514
  108. package/dist/core/orchestrator.js.map +0 -1
  109. package/dist/core/orchestrator.test.d.ts +0 -8
  110. package/dist/core/orchestrator.test.d.ts.map +0 -1
  111. package/dist/core/orchestrator.test.js +0 -517
  112. package/dist/core/orchestrator.test.js.map +0 -1
  113. package/dist/core/router.d.ts +0 -102
  114. package/dist/core/router.d.ts.map +0 -1
  115. package/dist/core/router.js +0 -178
  116. package/dist/core/router.js.map +0 -1
  117. package/dist/core/router.test.d.ts +0 -8
  118. package/dist/core/router.test.d.ts.map +0 -1
  119. package/dist/core/router.test.js +0 -215
  120. package/dist/core/router.test.js.map +0 -1
  121. package/dist/init.test.js +0 -288
  122. package/dist/providers/azure.d.ts +0 -147
  123. package/dist/providers/azure.d.ts.map +0 -1
  124. package/dist/providers/azure.js +0 -491
  125. package/dist/providers/azure.js.map +0 -1
  126. package/dist/providers/azure.test.d.ts +0 -11
  127. package/dist/providers/azure.test.d.ts.map +0 -1
  128. package/dist/providers/azure.test.js +0 -330
  129. package/dist/providers/azure.test.js.map +0 -1
  130. package/dist/providers/config.d.ts +0 -87
  131. package/dist/providers/config.d.ts.map +0 -1
  132. package/dist/providers/config.js +0 -193
  133. package/dist/providers/config.js.map +0 -1
  134. package/dist/providers/config.test.d.ts +0 -7
  135. package/dist/providers/config.test.d.ts.map +0 -1
  136. package/dist/providers/config.test.js +0 -370
  137. package/dist/providers/config.test.js.map +0 -1
  138. package/dist/providers/index.d.ts +0 -18
  139. package/dist/providers/index.d.ts.map +0 -1
  140. package/dist/providers/index.js +0 -14
  141. package/dist/providers/index.js.map +0 -1
  142. package/dist/providers/interface.d.ts +0 -191
  143. package/dist/providers/interface.d.ts.map +0 -1
  144. package/dist/providers/interface.js +0 -94
  145. package/dist/providers/interface.js.map +0 -1
  146. package/dist/providers/retry.d.ts +0 -128
  147. package/dist/providers/retry.d.ts.map +0 -1
  148. package/dist/providers/retry.js +0 -205
  149. package/dist/providers/retry.js.map +0 -1
  150. package/dist/providers/retry.test.d.ts +0 -7
  151. package/dist/providers/retry.test.d.ts.map +0 -1
  152. package/dist/providers/retry.test.js +0 -439
  153. package/dist/providers/retry.test.js.map +0 -1
  154. package/dist/providers/streaming.d.ts +0 -157
  155. package/dist/providers/streaming.d.ts.map +0 -1
  156. package/dist/providers/streaming.js +0 -233
  157. package/dist/providers/streaming.js.map +0 -1
  158. package/dist/providers/streaming.test.d.ts +0 -7
  159. package/dist/providers/streaming.test.d.ts.map +0 -1
  160. package/dist/providers/streaming.test.js +0 -372
  161. package/dist/providers/streaming.test.js.map +0 -1
  162. package/dist/providers/types.d.ts +0 -209
  163. package/dist/providers/types.d.ts.map +0 -1
  164. package/dist/providers/types.js +0 -53
  165. package/dist/providers/types.js.map +0 -1
  166. package/dist/providers/types.test.d.ts +0 -7
  167. package/dist/providers/types.test.d.ts.map +0 -1
  168. package/dist/providers/types.test.js +0 -141
  169. package/dist/providers/types.test.js.map +0 -1
  170. package/dist/tools/cli/beads.d.ts +0 -27
  171. package/dist/tools/cli/beads.d.ts.map +0 -1
  172. package/dist/tools/cli/beads.js +0 -172
  173. package/dist/tools/cli/beads.js.map +0 -1
  174. package/dist/tools/cli/beads.test.d.ts +0 -8
  175. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  176. package/dist/tools/cli/beads.test.js +0 -264
  177. package/dist/tools/cli/beads.test.js.map +0 -1
  178. package/dist/tools/cli/editFile.d.ts +0 -17
  179. package/dist/tools/cli/editFile.d.ts.map +0 -1
  180. package/dist/tools/cli/editFile.js +0 -125
  181. package/dist/tools/cli/editFile.js.map +0 -1
  182. package/dist/tools/cli/editFile.test.d.ts +0 -8
  183. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  184. package/dist/tools/cli/editFile.test.js +0 -177
  185. package/dist/tools/cli/editFile.test.js.map +0 -1
  186. package/dist/tools/cli/readFile.d.ts +0 -25
  187. package/dist/tools/cli/readFile.d.ts.map +0 -1
  188. package/dist/tools/cli/readFile.js +0 -118
  189. package/dist/tools/cli/readFile.js.map +0 -1
  190. package/dist/tools/cli/readFile.test.d.ts +0 -8
  191. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  192. package/dist/tools/cli/readFile.test.js +0 -194
  193. package/dist/tools/cli/readFile.test.js.map +0 -1
  194. package/dist/tools/cli/search.d.ts +0 -16
  195. package/dist/tools/cli/search.d.ts.map +0 -1
  196. package/dist/tools/cli/search.js +0 -261
  197. package/dist/tools/cli/search.js.map +0 -1
  198. package/dist/tools/cli/search.test.d.ts +0 -8
  199. package/dist/tools/cli/search.test.d.ts.map +0 -1
  200. package/dist/tools/cli/search.test.js +0 -172
  201. package/dist/tools/cli/search.test.js.map +0 -1
  202. package/dist/tools/cli/subagent.d.ts +0 -43
  203. package/dist/tools/cli/subagent.d.ts.map +0 -1
  204. package/dist/tools/cli/subagent.js +0 -99
  205. package/dist/tools/cli/subagent.js.map +0 -1
  206. package/dist/tools/cli/subagent.test.d.ts +0 -8
  207. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  208. package/dist/tools/cli/subagent.test.js +0 -190
  209. package/dist/tools/cli/subagent.test.js.map +0 -1
  210. package/dist/tools/cli/terminal.d.ts +0 -19
  211. package/dist/tools/cli/terminal.d.ts.map +0 -1
  212. package/dist/tools/cli/terminal.js +0 -164
  213. package/dist/tools/cli/terminal.js.map +0 -1
  214. package/dist/tools/cli/terminal.test.d.ts +0 -8
  215. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  216. package/dist/tools/cli/terminal.test.js +0 -161
  217. package/dist/tools/cli/terminal.test.js.map +0 -1
  218. package/dist/tools/index.d.ts +0 -25
  219. package/dist/tools/index.d.ts.map +0 -1
  220. package/dist/tools/index.js +0 -41
  221. package/dist/tools/index.js.map +0 -1
  222. package/dist/tools/interface.d.ts +0 -64
  223. package/dist/tools/interface.d.ts.map +0 -1
  224. package/dist/tools/interface.js +0 -37
  225. package/dist/tools/interface.js.map +0 -1
  226. package/dist/tools/interface.test.d.ts +0 -7
  227. package/dist/tools/interface.test.d.ts.map +0 -1
  228. package/dist/tools/interface.test.js +0 -179
  229. package/dist/tools/interface.test.js.map +0 -1
  230. package/dist/tools/mcp/bridge.d.ts +0 -48
  231. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  232. package/dist/tools/mcp/bridge.js +0 -128
  233. package/dist/tools/mcp/bridge.js.map +0 -1
  234. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  235. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  236. package/dist/tools/mcp/bridge.test.js +0 -300
  237. package/dist/tools/mcp/bridge.test.js.map +0 -1
  238. package/dist/tools/mcp/client.d.ts +0 -135
  239. package/dist/tools/mcp/client.d.ts.map +0 -1
  240. package/dist/tools/mcp/client.js +0 -263
  241. package/dist/tools/mcp/client.js.map +0 -1
  242. package/dist/tools/mcp/client.test.d.ts +0 -8
  243. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  244. package/dist/tools/mcp/client.test.js +0 -390
  245. package/dist/tools/mcp/client.test.js.map +0 -1
  246. package/dist/tools/registry.d.ts +0 -82
  247. package/dist/tools/registry.d.ts.map +0 -1
  248. package/dist/tools/registry.js +0 -99
  249. package/dist/tools/registry.js.map +0 -1
  250. package/dist/tools/registry.test.d.ts +0 -7
  251. package/dist/tools/registry.test.d.ts.map +0 -1
  252. package/dist/tools/registry.test.js +0 -199
  253. package/dist/tools/registry.test.js.map +0 -1
  254. package/dist/tools/suite.test.d.ts +0 -11
  255. package/dist/tools/suite.test.d.ts.map +0 -1
  256. package/dist/tools/suite.test.js +0 -119
  257. package/dist/tools/suite.test.js.map +0 -1
  258. package/dist/tools/types.d.ts +0 -75
  259. package/dist/tools/types.d.ts.map +0 -1
  260. package/dist/tools/types.js +0 -30
  261. package/dist/tools/types.js.map +0 -1
  262. package/dist/tools/types.test.d.ts +0 -7
  263. package/dist/tools/types.test.d.ts.map +0 -1
  264. package/dist/tools/types.test.js +0 -178
  265. package/dist/tools/types.test.js.map +0 -1
@@ -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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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * E2E tests for unknown command + version flag handling.
3
+ *
4
+ * beth-ywg.4: The default: case in bin/cli.js switch (unknown command → exit 1)
5
+ * was untested. This covers it.
6
+ *
7
+ * beth-ywg.5: No --version test existed. This verifies the behavior.
8
+ *
9
+ * Repro steps:
10
+ * 1. Run: npx vitest run src/cli/commands/cli-edge-cases.e2e.test.ts
11
+ *
12
+ * Test cases:
13
+ * Unknown commands:
14
+ * - 'banana' → exit 1, "Unknown command: banana"
15
+ * - 'Init' (wrong case) → exit 1 (commands are lowercase)
16
+ * - '' with unknown flag → handled gracefully
17
+ * - Very long unknown command → truncated in error (MAX_ARG_LENGTH = 50)
18
+ * - Multiple unknown commands → first one triggers error
19
+ *
20
+ * Version:
21
+ * - '--version' → either shows version or triggers unknown command
22
+ * - 'version' → either shows version or triggers unknown command
23
+ * - Version matches package.json if feature exists
24
+ *
25
+ * Flag validation:
26
+ * - Unknown flag --banana → exit 1 with error
27
+ * - Known flag on wrong command → accepted (flags are global)
28
+ *
29
+ * Expected outcomes documented inline per test case.
30
+ */
31
+ export {};
32
+ //# sourceMappingURL=cli-edge-cases.e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-edge-cases.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cli-edge-cases.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG"}