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,309 @@
1
+ /**
2
+ * Close Command — Enforced bd close
3
+ *
4
+ * Wraps `bd close` with dependency enforcement:
5
+ * - Refuses to close issues that have open children
6
+ * - Refuses to close issues that have open blockers (unresolved dependencies)
7
+ * - Refuses to close epics that lack mandatory test subtasks
8
+ * - Validates issue ID format to prevent injection
9
+ * - Passes through to `bd close` when all checks pass
10
+ * - --force bypasses enforcement checks
11
+ */
12
+ import { execFileSync } from 'child_process';
13
+ const COLORS = {
14
+ reset: '\x1b[0m',
15
+ bright: '\x1b[1m',
16
+ red: '\x1b[31m',
17
+ green: '\x1b[32m',
18
+ yellow: '\x1b[33m',
19
+ cyan: '\x1b[36m',
20
+ };
21
+ // Beads issue ID: <rig>-<hash> or <rig>-<hash>.<N>
22
+ // e.g. beth-cip, beth-cip.1, beth-abc123, hq-xyz.42
23
+ const ISSUE_ID_PATTERN = /^[a-z]+-[a-z0-9]{2,10}(\.\d+)?$/;
24
+ // Test subtask title patterns — at least one of each category required for epics
25
+ const TEST_PATTERNS = {
26
+ unit: /\bunit\s+test/i,
27
+ e2e: /\b(e2e|end.to.end|integration)\s+test/i,
28
+ security: /\bsecurity\s+test/i,
29
+ };
30
+ /**
31
+ * Validate a beads issue ID format.
32
+ * Strict pattern prevents injection via execFileSync args.
33
+ */
34
+ export function validateIssueId(id) {
35
+ return ISSUE_ID_PATTERN.test(id);
36
+ }
37
+ /**
38
+ * Get issue metadata (id, title, status, issue_type) via `bd show --json`.
39
+ * Returns null if issue not found or bd unavailable.
40
+ */
41
+ export function getIssueInfo(issueId) {
42
+ try {
43
+ const output = execFileSync('bd', ['show', issueId, '--json'], {
44
+ encoding: 'utf-8',
45
+ timeout: 10000,
46
+ stdio: ['pipe', 'pipe', 'pipe'],
47
+ });
48
+ const parsed = JSON.parse(output);
49
+ // bd show --json returns an array with one item
50
+ if (Array.isArray(parsed) && parsed.length > 0) {
51
+ const item = parsed[0];
52
+ if (typeof item === 'object' &&
53
+ item !== null &&
54
+ 'id' in item &&
55
+ 'issue_type' in item) {
56
+ return item;
57
+ }
58
+ }
59
+ return null;
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ /**
66
+ * Get open children for an issue via `bd children --json`.
67
+ * Returns empty array if issue has no children or bd is unavailable.
68
+ */
69
+ export function getOpenChildren(issueId) {
70
+ try {
71
+ const output = execFileSync('bd', ['children', issueId, '--json'], {
72
+ encoding: 'utf-8',
73
+ timeout: 10000,
74
+ stdio: ['pipe', 'pipe', 'pipe'],
75
+ });
76
+ const parsed = JSON.parse(output);
77
+ // bd children --json returns an array (only open children by default)
78
+ if (!Array.isArray(parsed)) {
79
+ return [];
80
+ }
81
+ return parsed
82
+ .filter((item) => typeof item === 'object' &&
83
+ item !== null &&
84
+ 'id' in item &&
85
+ 'title' in item &&
86
+ 'status' in item)
87
+ .filter((child) => child.status !== 'closed');
88
+ }
89
+ catch {
90
+ // bd not available, no children, or parse error — allow close
91
+ return [];
92
+ }
93
+ }
94
+ /**
95
+ * Get ALL children (including closed) for test subtask validation.
96
+ * Uses bd show --json which includes dependents.
97
+ */
98
+ export function getAllChildren(issueId) {
99
+ try {
100
+ // bd show returns dependents array with all children
101
+ const output = execFileSync('bd', ['show', issueId, '--json'], {
102
+ encoding: 'utf-8',
103
+ timeout: 10000,
104
+ stdio: ['pipe', 'pipe', 'pipe'],
105
+ });
106
+ const parsed = JSON.parse(output);
107
+ if (!Array.isArray(parsed) || parsed.length === 0) {
108
+ return [];
109
+ }
110
+ const issue = parsed[0];
111
+ if (typeof issue !== 'object' ||
112
+ issue === null ||
113
+ !('dependents' in issue)) {
114
+ return [];
115
+ }
116
+ const dependents = issue.dependents;
117
+ if (!Array.isArray(dependents)) {
118
+ return [];
119
+ }
120
+ return dependents.filter((item) => typeof item === 'object' &&
121
+ item !== null &&
122
+ 'id' in item &&
123
+ 'title' in item &&
124
+ 'status' in item);
125
+ }
126
+ catch {
127
+ return [];
128
+ }
129
+ }
130
+ /**
131
+ * Get open blockers for an issue via `bd dep list --json`.
132
+ * Returns only non-parent-child dependencies that are still open.
133
+ */
134
+ export function getOpenBlockers(issueId) {
135
+ try {
136
+ const output = execFileSync('bd', ['dep', 'list', issueId, '--json'], {
137
+ encoding: 'utf-8',
138
+ timeout: 10000,
139
+ stdio: ['pipe', 'pipe', 'pipe'],
140
+ });
141
+ const parsed = JSON.parse(output);
142
+ if (!Array.isArray(parsed)) {
143
+ return [];
144
+ }
145
+ return parsed
146
+ .filter((item) => typeof item === 'object' &&
147
+ item !== null &&
148
+ 'id' in item &&
149
+ 'title' in item &&
150
+ 'status' in item &&
151
+ 'dependency_type' in item)
152
+ .filter((dep) => dep.dependency_type !== 'parent-child' && dep.status !== 'closed');
153
+ }
154
+ catch {
155
+ return [];
156
+ }
157
+ }
158
+ /**
159
+ * Check if an epic has the mandatory test subtasks.
160
+ * Returns list of missing test categories.
161
+ */
162
+ export function getMissingTestSubtasks(children) {
163
+ const found = {
164
+ unit: false,
165
+ e2e: false,
166
+ security: false,
167
+ };
168
+ for (const child of children) {
169
+ if (TEST_PATTERNS.unit.test(child.title))
170
+ found.unit = true;
171
+ if (TEST_PATTERNS.e2e.test(child.title))
172
+ found.e2e = true;
173
+ if (TEST_PATTERNS.security.test(child.title))
174
+ found.security = true;
175
+ }
176
+ const missing = [];
177
+ if (!found.unit)
178
+ missing.push('Unit tests');
179
+ if (!found.e2e)
180
+ missing.push('E2E/Integration tests');
181
+ if (!found.security)
182
+ missing.push('Security tests');
183
+ return missing;
184
+ }
185
+ /**
186
+ * Parse close command arguments.
187
+ * Returns issue IDs, reason, and flags.
188
+ */
189
+ export function parseCloseArgs(rawArgs) {
190
+ const issueIds = [];
191
+ let reason;
192
+ let force = false;
193
+ for (let i = 0; i < rawArgs.length; i++) {
194
+ const arg = rawArgs[i];
195
+ if (arg === '--force' || arg === '-f') {
196
+ force = true;
197
+ }
198
+ else if (arg === '--reason' || arg === '-r') {
199
+ // Next arg is the reason text
200
+ reason = rawArgs[++i];
201
+ }
202
+ else if (arg.startsWith('--reason=')) {
203
+ reason = arg.slice('--reason='.length);
204
+ }
205
+ else if (!arg.startsWith('-')) {
206
+ issueIds.push(arg);
207
+ }
208
+ // Skip other flags (--json, --verbose, etc.)
209
+ }
210
+ return { issueIds, reason, force };
211
+ }
212
+ /**
213
+ * Execute enforced close for a single issue.
214
+ * Checks: ID format → open blockers → open children → test subtasks (epics) → bd close
215
+ */
216
+ export function closeIssue(issueId, options) {
217
+ // Validate issue ID format
218
+ if (!validateIssueId(issueId)) {
219
+ console.error(`${COLORS.red}✗ Invalid issue ID: "${issueId}"${COLORS.reset}`);
220
+ console.error(` Expected format: <rig>-<hash>[.<number>] (e.g. beth-abc123, beth-abc123.1)`);
221
+ return { success: false };
222
+ }
223
+ if (!options.force) {
224
+ // 1. Check for open blockers (non-parent dependencies)
225
+ const openBlockers = getOpenBlockers(issueId);
226
+ if (openBlockers.length > 0) {
227
+ console.error(`\n${COLORS.red}✗ Cannot close ${COLORS.bright}${issueId}${COLORS.reset}${COLORS.red} — ${openBlockers.length} unresolved blocker${openBlockers.length === 1 ? '' : 's'}:${COLORS.reset}\n`);
228
+ for (const blocker of openBlockers) {
229
+ console.error(` ● ${COLORS.cyan}${blocker.id}${COLORS.reset}: ${blocker.title} [${blocker.status}] (${blocker.dependency_type})`);
230
+ }
231
+ console.error(`\n${COLORS.yellow}Resolve blockers first, or use --force to override.${COLORS.reset}\n`);
232
+ return { success: false, blockers: openBlockers };
233
+ }
234
+ // 2. Check for open children
235
+ const openChildren = getOpenChildren(issueId);
236
+ if (openChildren.length > 0) {
237
+ console.error(`\n${COLORS.red}✗ Cannot close ${COLORS.bright}${issueId}${COLORS.reset}${COLORS.red} — ${openChildren.length} open child${openChildren.length === 1 ? '' : 'ren'}:${COLORS.reset}\n`);
238
+ for (const child of openChildren) {
239
+ console.error(` ○ ${COLORS.cyan}${child.id}${COLORS.reset}: ${child.title} [${child.status}]`);
240
+ }
241
+ console.error(`\n${COLORS.yellow}Close all children first, or use --force to override.${COLORS.reset}\n`);
242
+ return { success: false, blocked: openChildren };
243
+ }
244
+ // 3. For epics: verify mandatory test subtasks exist
245
+ const issueInfo = getIssueInfo(issueId);
246
+ if (issueInfo && issueInfo.issue_type === 'epic') {
247
+ // Prefer children/dependents from the existing bd show response for this epic,
248
+ // falling back to getAllChildren(issueId) only if necessary.
249
+ const allChildren = (Array.isArray(issueInfo.dependents) &&
250
+ issueInfo.dependents.length > 0
251
+ ? issueInfo.dependents
252
+ : getAllChildren(issueId));
253
+ const missingTests = getMissingTestSubtasks(allChildren);
254
+ if (missingTests.length > 0) {
255
+ console.error(`\n${COLORS.red}✗ Cannot close epic ${COLORS.bright}${issueId}${COLORS.reset}${COLORS.red} — missing mandatory test subtasks:${COLORS.reset}\n`);
256
+ for (const missing of missingTests) {
257
+ console.error(` ✗ ${COLORS.yellow}${missing}${COLORS.reset}`);
258
+ }
259
+ console.error(`\n${COLORS.yellow}Create test subtasks with: bd create "<type> tests for <feature>" --parent ${issueId}${COLORS.reset}`);
260
+ console.error(`${COLORS.yellow}Or use --force to override.${COLORS.reset}\n`);
261
+ return { success: false, missingTests };
262
+ }
263
+ }
264
+ }
265
+ // Build bd close args
266
+ const bdArgs = ['close', issueId];
267
+ if (options.reason) {
268
+ bdArgs.push('--reason', options.reason);
269
+ }
270
+ if (options.force) {
271
+ bdArgs.push('--force');
272
+ }
273
+ // Execute bd close (no shell — execFileSync is injection-safe)
274
+ try {
275
+ execFileSync('bd', bdArgs, {
276
+ encoding: 'utf-8',
277
+ timeout: 10000,
278
+ stdio: 'inherit',
279
+ });
280
+ return { success: true };
281
+ }
282
+ catch {
283
+ return { success: false };
284
+ }
285
+ }
286
+ /**
287
+ * Main close command entry point.
288
+ * Called from CLI routing with raw args after 'close'.
289
+ */
290
+ export async function close(rawArgs) {
291
+ const { issueIds, reason, force } = parseCloseArgs(rawArgs);
292
+ if (issueIds.length === 0) {
293
+ console.error(`${COLORS.red}✗ No issue ID provided${COLORS.reset}`);
294
+ console.error(`\n Usage: npx beth-copilot close <issue-id> [--reason "text"] [--force]`);
295
+ console.error(` Example: npx beth-copilot close beth-abc123.1 --reason "Done"`);
296
+ process.exit(1);
297
+ }
298
+ let allSucceeded = true;
299
+ for (const id of issueIds) {
300
+ const result = closeIssue(id, { reason, force });
301
+ if (!result.success) {
302
+ allSucceeded = false;
303
+ }
304
+ }
305
+ if (!allSucceeded) {
306
+ process.exit(1);
307
+ }
308
+ }
309
+ //# sourceMappingURL=close.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.js","sourceRoot":"","sources":["../../../src/cli/commands/close.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Close Command Tests
3
+ *
4
+ * Tests dependency enforcement on bd close:
5
+ * - Issue ID validation
6
+ * - Open children detection
7
+ * - Open blocker detection
8
+ * - Epic test subtask enforcement
9
+ * - Issue type awareness
10
+ * - Arg parsing
11
+ * - Blocked close behavior
12
+ * - Force bypass
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=close.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/close.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}