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.
- package/CHANGELOG.md +41 -28
- package/README.md +87 -247
- package/bin/cli.js +115 -7
- package/dist/__tests__/smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +49 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
- package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/beads.e2e.test.js +526 -0
- package/dist/cli/commands/beads.e2e.test.js.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.d.ts +89 -0
- package/dist/cli/commands/close.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.d.ts +27 -0
- package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.js +252 -0
- package/dist/cli/commands/close.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.js +309 -0
- package/dist/cli/commands/close.js.map +1 -0
- package/dist/cli/commands/close.test.d.ts +15 -0
- package/dist/cli/commands/close.test.d.ts.map +1 -0
- package/dist/cli/commands/close.test.js +634 -0
- package/dist/cli/commands/close.test.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +23 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +93 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/doctor.test.js +209 -0
- package/dist/cli/commands/doctor.test.js.map +1 -1
- package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
- package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
- package/dist/cli/commands/framework-isolation.test.js +119 -0
- package/dist/cli/commands/framework-isolation.test.js.map +1 -0
- package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
- package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/init-logic.e2e.test.js +305 -0
- package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
- package/dist/cli/commands/land.d.ts +142 -0
- package/dist/cli/commands/land.d.ts.map +1 -0
- package/dist/cli/commands/land.js +647 -0
- package/dist/cli/commands/land.js.map +1 -0
- package/dist/cli/commands/land.test.d.ts +20 -0
- package/dist/cli/commands/land.test.d.ts.map +1 -0
- package/dist/cli/commands/land.test.js +622 -0
- package/dist/cli/commands/land.test.js.map +1 -0
- package/dist/cli/commands/pipeline.e2e.test.js +1 -1
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.d.ts +84 -0
- package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.js +257 -0
- package/dist/cli/commands/pre-push-guard.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.js +397 -0
- package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
- package/dist/cli/commands/quickstart.test.js +40 -2
- package/dist/cli/commands/quickstart.test.js.map +1 -1
- package/dist/core/agents/suite.test.js +4 -2
- package/dist/core/agents/suite.test.js.map +1 -1
- package/dist/core/agents/tools.test.js +5 -1
- package/dist/core/agents/tools.test.js.map +1 -1
- package/dist/index.d.ts +3 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -10
- package/dist/index.js.map +1 -1
- package/package.json +15 -9
- package/sbom.json +2011 -819
- package/templates/.github/agents/beth.agent.md +222 -45
- package/templates/.github/agents/developer.agent.md +37 -67
- package/templates/.github/agents/product-manager.agent.md +15 -57
- package/templates/.github/agents/researcher.agent.md +20 -60
- package/templates/.github/agents/security-reviewer.agent.md +29 -70
- package/templates/.github/agents/tester.agent.md +40 -58
- package/templates/.github/agents/ux-designer.agent.md +20 -63
- package/templates/.github/copilot-instructions.md +217 -204
- package/templates/AGENTS.md +108 -20
- package/dist/core/context.d.ts +0 -171
- package/dist/core/context.d.ts.map +0 -1
- package/dist/core/context.js +0 -353
- package/dist/core/context.js.map +0 -1
- package/dist/core/context.test.d.ts +0 -8
- package/dist/core/context.test.d.ts.map +0 -1
- package/dist/core/context.test.js +0 -253
- package/dist/core/context.test.js.map +0 -1
- package/dist/core/handoffs.d.ts +0 -151
- package/dist/core/handoffs.d.ts.map +0 -1
- package/dist/core/handoffs.js +0 -220
- package/dist/core/handoffs.js.map +0 -1
- package/dist/core/handoffs.test.d.ts +0 -8
- package/dist/core/handoffs.test.d.ts.map +0 -1
- package/dist/core/handoffs.test.js +0 -231
- package/dist/core/handoffs.test.js.map +0 -1
- package/dist/core/orchestrator.d.ts +0 -246
- package/dist/core/orchestrator.d.ts.map +0 -1
- package/dist/core/orchestrator.js +0 -514
- package/dist/core/orchestrator.js.map +0 -1
- package/dist/core/orchestrator.test.d.ts +0 -8
- package/dist/core/orchestrator.test.d.ts.map +0 -1
- package/dist/core/orchestrator.test.js +0 -517
- package/dist/core/orchestrator.test.js.map +0 -1
- package/dist/core/router.d.ts +0 -102
- package/dist/core/router.d.ts.map +0 -1
- package/dist/core/router.js +0 -178
- package/dist/core/router.js.map +0 -1
- package/dist/core/router.test.d.ts +0 -8
- package/dist/core/router.test.d.ts.map +0 -1
- package/dist/core/router.test.js +0 -215
- package/dist/core/router.test.js.map +0 -1
- package/dist/init.test.js +0 -288
- package/dist/providers/azure.d.ts +0 -147
- package/dist/providers/azure.d.ts.map +0 -1
- package/dist/providers/azure.js +0 -491
- package/dist/providers/azure.js.map +0 -1
- package/dist/providers/azure.test.d.ts +0 -11
- package/dist/providers/azure.test.d.ts.map +0 -1
- package/dist/providers/azure.test.js +0 -330
- package/dist/providers/azure.test.js.map +0 -1
- package/dist/providers/config.d.ts +0 -87
- package/dist/providers/config.d.ts.map +0 -1
- package/dist/providers/config.js +0 -193
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/config.test.d.ts +0 -7
- package/dist/providers/config.test.d.ts.map +0 -1
- package/dist/providers/config.test.js +0 -370
- package/dist/providers/config.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -18
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -14
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/interface.d.ts +0 -191
- package/dist/providers/interface.d.ts.map +0 -1
- package/dist/providers/interface.js +0 -94
- package/dist/providers/interface.js.map +0 -1
- package/dist/providers/retry.d.ts +0 -128
- package/dist/providers/retry.d.ts.map +0 -1
- package/dist/providers/retry.js +0 -205
- package/dist/providers/retry.js.map +0 -1
- package/dist/providers/retry.test.d.ts +0 -7
- package/dist/providers/retry.test.d.ts.map +0 -1
- package/dist/providers/retry.test.js +0 -439
- package/dist/providers/retry.test.js.map +0 -1
- package/dist/providers/streaming.d.ts +0 -157
- package/dist/providers/streaming.d.ts.map +0 -1
- package/dist/providers/streaming.js +0 -233
- package/dist/providers/streaming.js.map +0 -1
- package/dist/providers/streaming.test.d.ts +0 -7
- package/dist/providers/streaming.test.d.ts.map +0 -1
- package/dist/providers/streaming.test.js +0 -372
- package/dist/providers/streaming.test.js.map +0 -1
- package/dist/providers/types.d.ts +0 -209
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -53
- package/dist/providers/types.js.map +0 -1
- package/dist/providers/types.test.d.ts +0 -7
- package/dist/providers/types.test.d.ts.map +0 -1
- package/dist/providers/types.test.js +0 -141
- package/dist/providers/types.test.js.map +0 -1
- package/dist/tools/cli/beads.d.ts +0 -27
- package/dist/tools/cli/beads.d.ts.map +0 -1
- package/dist/tools/cli/beads.js +0 -172
- package/dist/tools/cli/beads.js.map +0 -1
- package/dist/tools/cli/beads.test.d.ts +0 -8
- package/dist/tools/cli/beads.test.d.ts.map +0 -1
- package/dist/tools/cli/beads.test.js +0 -264
- package/dist/tools/cli/beads.test.js.map +0 -1
- package/dist/tools/cli/editFile.d.ts +0 -17
- package/dist/tools/cli/editFile.d.ts.map +0 -1
- package/dist/tools/cli/editFile.js +0 -125
- package/dist/tools/cli/editFile.js.map +0 -1
- package/dist/tools/cli/editFile.test.d.ts +0 -8
- package/dist/tools/cli/editFile.test.d.ts.map +0 -1
- package/dist/tools/cli/editFile.test.js +0 -177
- package/dist/tools/cli/editFile.test.js.map +0 -1
- package/dist/tools/cli/readFile.d.ts +0 -25
- package/dist/tools/cli/readFile.d.ts.map +0 -1
- package/dist/tools/cli/readFile.js +0 -118
- package/dist/tools/cli/readFile.js.map +0 -1
- package/dist/tools/cli/readFile.test.d.ts +0 -8
- package/dist/tools/cli/readFile.test.d.ts.map +0 -1
- package/dist/tools/cli/readFile.test.js +0 -194
- package/dist/tools/cli/readFile.test.js.map +0 -1
- package/dist/tools/cli/search.d.ts +0 -16
- package/dist/tools/cli/search.d.ts.map +0 -1
- package/dist/tools/cli/search.js +0 -261
- package/dist/tools/cli/search.js.map +0 -1
- package/dist/tools/cli/search.test.d.ts +0 -8
- package/dist/tools/cli/search.test.d.ts.map +0 -1
- package/dist/tools/cli/search.test.js +0 -172
- package/dist/tools/cli/search.test.js.map +0 -1
- package/dist/tools/cli/subagent.d.ts +0 -43
- package/dist/tools/cli/subagent.d.ts.map +0 -1
- package/dist/tools/cli/subagent.js +0 -99
- package/dist/tools/cli/subagent.js.map +0 -1
- package/dist/tools/cli/subagent.test.d.ts +0 -8
- package/dist/tools/cli/subagent.test.d.ts.map +0 -1
- package/dist/tools/cli/subagent.test.js +0 -190
- package/dist/tools/cli/subagent.test.js.map +0 -1
- package/dist/tools/cli/terminal.d.ts +0 -19
- package/dist/tools/cli/terminal.d.ts.map +0 -1
- package/dist/tools/cli/terminal.js +0 -164
- package/dist/tools/cli/terminal.js.map +0 -1
- package/dist/tools/cli/terminal.test.d.ts +0 -8
- package/dist/tools/cli/terminal.test.d.ts.map +0 -1
- package/dist/tools/cli/terminal.test.js +0 -161
- package/dist/tools/cli/terminal.test.js.map +0 -1
- package/dist/tools/index.d.ts +0 -25
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -41
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/interface.d.ts +0 -64
- package/dist/tools/interface.d.ts.map +0 -1
- package/dist/tools/interface.js +0 -37
- package/dist/tools/interface.js.map +0 -1
- package/dist/tools/interface.test.d.ts +0 -7
- package/dist/tools/interface.test.d.ts.map +0 -1
- package/dist/tools/interface.test.js +0 -179
- package/dist/tools/interface.test.js.map +0 -1
- package/dist/tools/mcp/bridge.d.ts +0 -48
- package/dist/tools/mcp/bridge.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.js +0 -128
- package/dist/tools/mcp/bridge.js.map +0 -1
- package/dist/tools/mcp/bridge.test.d.ts +0 -8
- package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.test.js +0 -300
- package/dist/tools/mcp/bridge.test.js.map +0 -1
- package/dist/tools/mcp/client.d.ts +0 -135
- package/dist/tools/mcp/client.d.ts.map +0 -1
- package/dist/tools/mcp/client.js +0 -263
- package/dist/tools/mcp/client.js.map +0 -1
- package/dist/tools/mcp/client.test.d.ts +0 -8
- package/dist/tools/mcp/client.test.d.ts.map +0 -1
- package/dist/tools/mcp/client.test.js +0 -390
- package/dist/tools/mcp/client.test.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -82
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -99
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/registry.test.d.ts +0 -7
- package/dist/tools/registry.test.d.ts.map +0 -1
- package/dist/tools/registry.test.js +0 -199
- package/dist/tools/registry.test.js.map +0 -1
- package/dist/tools/suite.test.d.ts +0 -11
- package/dist/tools/suite.test.d.ts.map +0 -1
- package/dist/tools/suite.test.js +0 -119
- package/dist/tools/suite.test.js.map +0 -1
- package/dist/tools/types.d.ts +0 -75
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -30
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/types.test.d.ts +0 -7
- package/dist/tools/types.test.d.ts.map +0 -1
- package/dist/tools/types.test.js +0 -178
- 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"}
|