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