beth-copilot 1.0.13 → 1.0.15
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 +195 -170
- package/README.md +408 -185
- package/bin/cli.js +65 -4
- package/dist/cli/commands/doctor.e2e.test.d.ts +8 -0
- package/dist/cli/commands/doctor.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/doctor.e2e.test.js +428 -0
- package/dist/cli/commands/doctor.e2e.test.js.map +1 -0
- package/dist/cli/commands/doctor.test.js +1 -1
- package/dist/cli/commands/help.e2e.test.d.ts +9 -0
- package/dist/cli/commands/help.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/help.e2e.test.js +150 -0
- package/dist/cli/commands/help.e2e.test.js.map +1 -0
- package/dist/cli/commands/init.test.d.ts +6 -0
- package/dist/cli/commands/init.test.d.ts.map +1 -0
- package/dist/cli/commands/init.test.js +289 -0
- package/dist/cli/commands/init.test.js.map +1 -0
- package/dist/cli/commands/mcp.e2e.test.d.ts +9 -0
- package/dist/cli/commands/mcp.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/mcp.e2e.test.js +139 -0
- package/dist/cli/commands/mcp.e2e.test.js.map +1 -0
- package/dist/cli/commands/pipeline.e2e.test.d.ts +9 -0
- package/dist/cli/commands/pipeline.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/pipeline.e2e.test.js +192 -0
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -0
- package/dist/cli/commands/quickstart.test.d.ts +6 -0
- package/dist/cli/commands/quickstart.test.d.ts.map +1 -0
- package/dist/cli/commands/quickstart.test.js +232 -0
- package/dist/cli/commands/quickstart.test.js.map +1 -0
- package/dist/core/agents/frontmatter.test.d.ts +8 -0
- package/dist/core/agents/frontmatter.test.d.ts.map +1 -0
- package/dist/core/agents/frontmatter.test.js +589 -0
- package/dist/core/agents/frontmatter.test.js.map +1 -0
- package/dist/core/agents/handoffs.test.d.ts +8 -0
- package/dist/core/agents/handoffs.test.d.ts.map +1 -0
- package/dist/core/agents/handoffs.test.js +320 -0
- package/dist/core/agents/handoffs.test.js.map +1 -0
- package/dist/core/agents/loader.test.js +1 -1
- package/dist/core/agents/suite.test.d.ts +8 -0
- package/dist/core/agents/suite.test.d.ts.map +1 -0
- package/dist/core/agents/suite.test.js +207 -0
- package/dist/core/agents/suite.test.js.map +1 -0
- package/dist/core/agents/tools.test.d.ts +8 -0
- package/dist/core/agents/tools.test.d.ts.map +1 -0
- package/dist/core/agents/tools.test.js +332 -0
- package/dist/core/agents/tools.test.js.map +1 -0
- package/dist/init.test.js +288 -0
- package/dist/providers/azure.d.ts +147 -0
- package/dist/providers/azure.d.ts.map +1 -0
- package/dist/providers/azure.js +491 -0
- package/dist/providers/azure.js.map +1 -0
- package/dist/providers/azure.test.d.ts +11 -0
- package/dist/providers/azure.test.d.ts.map +1 -0
- package/dist/providers/azure.test.js +330 -0
- package/dist/providers/azure.test.js.map +1 -0
- package/dist/providers/config.d.ts +87 -0
- package/dist/providers/config.d.ts.map +1 -0
- package/dist/providers/config.js +193 -0
- package/dist/providers/config.js.map +1 -0
- package/dist/providers/config.test.d.ts +7 -0
- package/dist/providers/config.test.d.ts.map +1 -0
- package/dist/providers/config.test.js +370 -0
- package/dist/providers/config.test.js.map +1 -0
- package/dist/providers/index.d.ts +18 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +14 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/interface.d.ts +191 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +94 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/providers/retry.d.ts +128 -0
- package/dist/providers/retry.d.ts.map +1 -0
- package/dist/providers/retry.js +205 -0
- package/dist/providers/retry.js.map +1 -0
- package/dist/providers/retry.test.d.ts +7 -0
- package/dist/providers/retry.test.d.ts.map +1 -0
- package/dist/providers/retry.test.js +439 -0
- package/dist/providers/retry.test.js.map +1 -0
- package/dist/providers/streaming.d.ts +157 -0
- package/dist/providers/streaming.d.ts.map +1 -0
- package/dist/providers/streaming.js +233 -0
- package/dist/providers/streaming.js.map +1 -0
- package/dist/providers/streaming.test.d.ts +7 -0
- package/dist/providers/streaming.test.d.ts.map +1 -0
- package/dist/providers/streaming.test.js +372 -0
- package/dist/providers/streaming.test.js.map +1 -0
- package/dist/providers/types.d.ts +209 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +53 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/types.test.d.ts +7 -0
- package/dist/providers/types.test.d.ts.map +1 -0
- package/dist/providers/types.test.js +141 -0
- package/dist/providers/types.test.js.map +1 -0
- package/package.json +60 -56
- package/sbom.json +3302 -8
- package/templates/.github/agents/beth.agent.md +329 -329
- package/templates/.github/agents/developer.agent.md +572 -572
- package/templates/.github/agents/product-manager.agent.md +272 -272
- package/templates/.github/agents/researcher.agent.md +338 -338
- package/templates/.github/agents/security-reviewer.agent.md +465 -465
- package/templates/.github/agents/tester.agent.md +496 -496
- package/templates/.github/agents/ux-designer.agent.md +393 -393
- package/templates/mcp.json.example +4 -0
package/bin/cli.js
CHANGED
|
@@ -409,6 +409,54 @@ function logError(message) {
|
|
|
409
409
|
log(`✗ ${message}`, COLORS.red);
|
|
410
410
|
}
|
|
411
411
|
|
|
412
|
+
/**
|
|
413
|
+
* User-facing error with actionable fix instructions
|
|
414
|
+
*/
|
|
415
|
+
class UserError extends Error {
|
|
416
|
+
constructor(message, { problem, fix, command } = {}) {
|
|
417
|
+
super(message);
|
|
418
|
+
this.name = 'UserError';
|
|
419
|
+
this.problem = problem;
|
|
420
|
+
this.fix = fix;
|
|
421
|
+
this.command = command;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Display a user-friendly error with fix instructions
|
|
427
|
+
*/
|
|
428
|
+
function showUserError(error) {
|
|
429
|
+
console.log('');
|
|
430
|
+
console.log(`${COLORS.red}╔════════════════════════════════════════════════════════════╗${COLORS.reset}`);
|
|
431
|
+
console.log(`${COLORS.red}║${COLORS.reset} ${COLORS.bright}${COLORS.red}Installation Error${COLORS.reset} ${COLORS.red}║${COLORS.reset}`);
|
|
432
|
+
console.log(`${COLORS.red}╚════════════════════════════════════════════════════════════╝${COLORS.reset}`);
|
|
433
|
+
console.log('');
|
|
434
|
+
|
|
435
|
+
if (error.problem) {
|
|
436
|
+
console.log(`${COLORS.bright}Problem:${COLORS.reset}`);
|
|
437
|
+
console.log(` ${error.problem}`);
|
|
438
|
+
console.log('');
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
if (error.fix) {
|
|
442
|
+
console.log(`${COLORS.bright}Fix:${COLORS.reset}`);
|
|
443
|
+
console.log(` ${error.fix}`);
|
|
444
|
+
console.log('');
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
if (error.command) {
|
|
448
|
+
console.log(`${COLORS.bright}Run this command:${COLORS.reset}`);
|
|
449
|
+
console.log(` ${COLORS.cyan}${error.command}${COLORS.reset}`);
|
|
450
|
+
console.log('');
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
if (globalThis.VERBOSE) {
|
|
454
|
+
console.log(`${COLORS.dim}Stack trace:${COLORS.reset}`);
|
|
455
|
+
console.log(`${COLORS.dim}${error.stack}${COLORS.reset}`);
|
|
456
|
+
console.log('');
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
412
460
|
function logInfo(message) {
|
|
413
461
|
log(` ${message}`, COLORS.cyan);
|
|
414
462
|
}
|
|
@@ -737,9 +785,14 @@ function copyDirRecursive(src, dest, options = {}) {
|
|
|
737
785
|
unlinkSync(dest);
|
|
738
786
|
mkdirSync(dest, { recursive: true });
|
|
739
787
|
} else {
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
`
|
|
788
|
+
const relativePath = relative(process.cwd(), dest);
|
|
789
|
+
throw new UserError(
|
|
790
|
+
`Path conflict: ${relativePath}`,
|
|
791
|
+
{
|
|
792
|
+
problem: `"${relativePath}" exists as a file, but Beth needs it to be a directory.`,
|
|
793
|
+
fix: 'Either remove the file manually, or use --force to let Beth handle it.',
|
|
794
|
+
command: 'npx beth-copilot@latest init --force'
|
|
795
|
+
}
|
|
743
796
|
);
|
|
744
797
|
}
|
|
745
798
|
}
|
|
@@ -1075,7 +1128,15 @@ if (unknownFlags.length > 0) {
|
|
|
1075
1128
|
|
|
1076
1129
|
switch (command) {
|
|
1077
1130
|
case 'init':
|
|
1078
|
-
|
|
1131
|
+
try {
|
|
1132
|
+
await init(options);
|
|
1133
|
+
} catch (error) {
|
|
1134
|
+
if (error instanceof UserError) {
|
|
1135
|
+
showUserError(error);
|
|
1136
|
+
process.exit(1);
|
|
1137
|
+
}
|
|
1138
|
+
throw error;
|
|
1139
|
+
}
|
|
1079
1140
|
break;
|
|
1080
1141
|
case 'doctor':
|
|
1081
1142
|
{
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E tests for doctor command.
|
|
3
|
+
* Run with: node --test dist/cli/commands/doctor.e2e.test.js
|
|
4
|
+
*
|
|
5
|
+
* These tests run the actual CLI binary and validate stdout output.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
8
|
+
import assert from 'node:assert';
|
|
9
|
+
import { execFileSync } from 'child_process';
|
|
10
|
+
import { existsSync, mkdirSync, writeFileSync, rmSync } from 'fs';
|
|
11
|
+
import { join, dirname } from 'path';
|
|
12
|
+
import { tmpdir } from 'os';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
// Path to CLI binary (relative to dist/ after build)
|
|
17
|
+
const CLI_PATH = join(__dirname, '..', '..', '..', 'bin', 'cli.js');
|
|
18
|
+
/**
|
|
19
|
+
* Run the doctor command in a specific directory and capture output.
|
|
20
|
+
* @param cwd - Directory to run the command in
|
|
21
|
+
* @param args - Additional arguments (e.g., '--verbose')
|
|
22
|
+
* @returns Object with stdout, stderr, and exit code
|
|
23
|
+
*/
|
|
24
|
+
function runDoctor(cwd, args = []) {
|
|
25
|
+
try {
|
|
26
|
+
const cliArgs = [CLI_PATH, 'doctor', ...args];
|
|
27
|
+
const stdout = execFileSync('node', cliArgs, {
|
|
28
|
+
cwd,
|
|
29
|
+
encoding: 'utf-8',
|
|
30
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
31
|
+
env: { ...process.env, NO_COLOR: '1' }, // Disable colors for easier parsing
|
|
32
|
+
});
|
|
33
|
+
return { stdout, stderr: '', code: 0 };
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const execError = error;
|
|
37
|
+
return {
|
|
38
|
+
stdout: execError.stdout || '',
|
|
39
|
+
stderr: execError.stderr || '',
|
|
40
|
+
code: execError.status || 1,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create a valid agent file with proper frontmatter.
|
|
46
|
+
*/
|
|
47
|
+
function createValidAgentFile(dir, name) {
|
|
48
|
+
const content = `---
|
|
49
|
+
name: ${name}
|
|
50
|
+
description: A test agent
|
|
51
|
+
model: Claude Opus 4.5
|
|
52
|
+
tools:
|
|
53
|
+
- readFile
|
|
54
|
+
- editFiles
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
# ${name}
|
|
58
|
+
|
|
59
|
+
This is a test agent.
|
|
60
|
+
`;
|
|
61
|
+
writeFileSync(join(dir, `${name}.agent.md`), content);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create an invalid agent file (missing name in frontmatter).
|
|
65
|
+
*/
|
|
66
|
+
function createInvalidAgentFile(dir, filename) {
|
|
67
|
+
const content = `---
|
|
68
|
+
description: A test agent without name
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
# Invalid Agent
|
|
72
|
+
|
|
73
|
+
This agent has no name field.
|
|
74
|
+
`;
|
|
75
|
+
writeFileSync(join(dir, filename), content);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a skill directory with SKILL.md.
|
|
79
|
+
*/
|
|
80
|
+
function createValidSkill(skillsDir, name) {
|
|
81
|
+
const skillDir = join(skillsDir, name);
|
|
82
|
+
mkdirSync(skillDir, { recursive: true });
|
|
83
|
+
writeFileSync(join(skillDir, 'SKILL.md'), `# ${name}\n\nThis is a test skill.`);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a skill directory without SKILL.md.
|
|
87
|
+
*/
|
|
88
|
+
function createIncompleteSkill(skillsDir, name) {
|
|
89
|
+
const skillDir = join(skillsDir, name);
|
|
90
|
+
mkdirSync(skillDir, { recursive: true });
|
|
91
|
+
// No SKILL.md created
|
|
92
|
+
}
|
|
93
|
+
describe('doctor command E2E', () => {
|
|
94
|
+
let testDir;
|
|
95
|
+
beforeEach(() => {
|
|
96
|
+
// Create a unique temp directory for each test
|
|
97
|
+
testDir = join(tmpdir(), `beth-e2e-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
98
|
+
mkdirSync(testDir, { recursive: true });
|
|
99
|
+
});
|
|
100
|
+
afterEach(() => {
|
|
101
|
+
// Clean up temp directory
|
|
102
|
+
if (existsSync(testDir)) {
|
|
103
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
describe('healthy project', () => {
|
|
107
|
+
it('should exit 0 when all checks pass', () => {
|
|
108
|
+
// Setup: Create a fully healthy project
|
|
109
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
110
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
111
|
+
const beadsDir = join(testDir, '.beads');
|
|
112
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
113
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
114
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
115
|
+
// Create valid agents
|
|
116
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
117
|
+
createValidAgentFile(agentsDir, 'another-agent');
|
|
118
|
+
// Create valid skills
|
|
119
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
120
|
+
createValidSkill(skillsDir, 'another-skill');
|
|
121
|
+
// Run doctor
|
|
122
|
+
const result = runDoctor(testDir);
|
|
123
|
+
// Verify exit code (may be 1 if bd CLI not installed, but agents/skills pass)
|
|
124
|
+
// Check that agents and skills pass
|
|
125
|
+
assert.ok(result.stdout.includes('✓') && result.stdout.includes('agents'), 'Should show passing agent check');
|
|
126
|
+
assert.ok(result.stdout.includes('2 agents configured') || result.stdout.includes('agents'), 'Should report agent count');
|
|
127
|
+
});
|
|
128
|
+
it('should show "All checks passed" message when healthy', () => {
|
|
129
|
+
// Setup: Create healthy project
|
|
130
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
131
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
132
|
+
const beadsDir = join(testDir, '.beads');
|
|
133
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
134
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
135
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
136
|
+
createValidAgentFile(agentsDir, 'beth');
|
|
137
|
+
createValidSkill(skillsDir, 'prd');
|
|
138
|
+
const result = runDoctor(testDir);
|
|
139
|
+
// Should contain pass indicators
|
|
140
|
+
assert.ok(result.stdout.includes('✓'), 'Should have pass indicators');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('missing .github/agents', () => {
|
|
144
|
+
it('should show failure for missing .github/agents directory', () => {
|
|
145
|
+
// Setup: Only create skills, no agents
|
|
146
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
147
|
+
const beadsDir = join(testDir, '.beads');
|
|
148
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
149
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
150
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
151
|
+
const result = runDoctor(testDir);
|
|
152
|
+
// Should show failure for agents
|
|
153
|
+
assert.ok(result.stdout.includes('✗') || result.stdout.includes('not found'), 'Should indicate agents check failed');
|
|
154
|
+
assert.ok(result.stdout.toLowerCase().includes('agents'), 'Should mention agents in output');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe('missing .github/skills', () => {
|
|
158
|
+
it('should show failure for missing .github/skills directory', () => {
|
|
159
|
+
// Setup: Only create agents, no skills
|
|
160
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
161
|
+
const beadsDir = join(testDir, '.beads');
|
|
162
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
163
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
164
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
165
|
+
const result = runDoctor(testDir);
|
|
166
|
+
// Should show failure for skills
|
|
167
|
+
assert.ok(result.stdout.includes('✗') || result.stdout.includes('not found'), 'Should indicate skills check failed');
|
|
168
|
+
assert.ok(result.stdout.toLowerCase().includes('skill'), 'Should mention skills in output');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe('agent frontmatter validation', () => {
|
|
172
|
+
it('should show warning for agent missing name in frontmatter', () => {
|
|
173
|
+
// Setup: Create agent without name field
|
|
174
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
175
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
176
|
+
const beadsDir = join(testDir, '.beads');
|
|
177
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
178
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
179
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
180
|
+
createInvalidAgentFile(agentsDir, 'invalid.agent.md');
|
|
181
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
182
|
+
const result = runDoctor(testDir);
|
|
183
|
+
// Should show warning for invalid frontmatter
|
|
184
|
+
assert.ok(result.stdout.includes('⚠') || result.stdout.includes('issues') || result.stdout.includes('missing'), 'Should indicate agent has issues');
|
|
185
|
+
});
|
|
186
|
+
it('should show count of agents with issues', () => {
|
|
187
|
+
// Setup: Create mix of valid and invalid agents
|
|
188
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
189
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
190
|
+
const beadsDir = join(testDir, '.beads');
|
|
191
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
192
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
193
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
194
|
+
createValidAgentFile(agentsDir, 'valid-agent');
|
|
195
|
+
createInvalidAgentFile(agentsDir, 'invalid1.agent.md');
|
|
196
|
+
createInvalidAgentFile(agentsDir, 'invalid2.agent.md');
|
|
197
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
198
|
+
const result = runDoctor(testDir);
|
|
199
|
+
// Should report issues count
|
|
200
|
+
assert.ok(result.stdout.includes('3 agents') || result.stdout.includes('agents'), 'Should mention total agent count');
|
|
201
|
+
assert.ok(result.stdout.includes('2 with issues') || result.stdout.includes('issues') || result.stdout.includes('⚠'), 'Should indicate agents have issues');
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe('skill directory validation', () => {
|
|
205
|
+
it('should show warning for skill directories missing SKILL.md', () => {
|
|
206
|
+
// Setup: Create skill directory without SKILL.md
|
|
207
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
208
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
209
|
+
const beadsDir = join(testDir, '.beads');
|
|
210
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
211
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
212
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
213
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
214
|
+
createIncompleteSkill(skillsDir, 'incomplete-skill');
|
|
215
|
+
const result = runDoctor(testDir);
|
|
216
|
+
// Should show warning for missing SKILL.md
|
|
217
|
+
assert.ok(result.stdout.includes('⚠') || result.stdout.includes('missing SKILL.md'), 'Should indicate skill is missing SKILL.md');
|
|
218
|
+
});
|
|
219
|
+
it('should list skills missing SKILL.md in details', () => {
|
|
220
|
+
// Setup: Create multiple incomplete skills
|
|
221
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
222
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
223
|
+
const beadsDir = join(testDir, '.beads');
|
|
224
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
225
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
226
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
227
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
228
|
+
createValidSkill(skillsDir, 'complete-skill');
|
|
229
|
+
createIncompleteSkill(skillsDir, 'broken-skill-one');
|
|
230
|
+
createIncompleteSkill(skillsDir, 'broken-skill-two');
|
|
231
|
+
const result = runDoctor(testDir, ['--verbose']);
|
|
232
|
+
// Should report number of skills with issues
|
|
233
|
+
assert.ok(result.stdout.includes('2 missing') || result.stdout.includes('missing SKILL.md'), 'Should report skills missing SKILL.md');
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
describe('beads initialization check', () => {
|
|
237
|
+
it('should show warning when .beads directory is missing', () => {
|
|
238
|
+
// Setup: Create project without .beads
|
|
239
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
240
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
241
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
242
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
243
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
244
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
245
|
+
const result = runDoctor(testDir);
|
|
246
|
+
// Should show warning for missing beads init
|
|
247
|
+
assert.ok(result.stdout.includes('⚠') || result.stdout.includes('not initialized'), 'Should indicate beads is not initialized');
|
|
248
|
+
assert.ok(result.stdout.toLowerCase().includes('beads') || result.stdout.toLowerCase().includes('.beads'), 'Should mention beads');
|
|
249
|
+
});
|
|
250
|
+
it('should pass when .beads directory exists', () => {
|
|
251
|
+
// Setup: Create project with .beads
|
|
252
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
253
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
254
|
+
const beadsDir = join(testDir, '.beads');
|
|
255
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
256
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
257
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
258
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
259
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
260
|
+
const result = runDoctor(testDir);
|
|
261
|
+
// Should pass beads init check
|
|
262
|
+
assert.ok(result.stdout.includes('Beads Init') || result.stdout.includes('.beads'), 'Should check beads initialization');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('--verbose flag', () => {
|
|
266
|
+
it('should show additional details with --verbose flag', () => {
|
|
267
|
+
// Setup: Create project with some issues
|
|
268
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
269
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
270
|
+
const beadsDir = join(testDir, '.beads');
|
|
271
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
272
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
273
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
274
|
+
// Create agent with missing name to trigger warning details
|
|
275
|
+
createInvalidAgentFile(agentsDir, 'bad-agent.agent.md');
|
|
276
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
277
|
+
// Run without verbose
|
|
278
|
+
const resultNormal = runDoctor(testDir);
|
|
279
|
+
// Run with verbose
|
|
280
|
+
const resultVerbose = runDoctor(testDir, ['--verbose']);
|
|
281
|
+
// Verbose should have more detailed output
|
|
282
|
+
// Check that verbose output includes "missing 'name'" detail
|
|
283
|
+
assert.ok(resultVerbose.stdout.includes("missing 'name'") ||
|
|
284
|
+
resultVerbose.stdout.includes('frontmatter') ||
|
|
285
|
+
resultVerbose.stdout.length >= resultNormal.stdout.length, 'Verbose should show more details than normal');
|
|
286
|
+
});
|
|
287
|
+
it('should show install hints in verbose mode', () => {
|
|
288
|
+
// Setup: Create minimal project (missing agents for clear failure)
|
|
289
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
290
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
291
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
292
|
+
const result = runDoctor(testDir, ['--verbose']);
|
|
293
|
+
// Should include remediation hints
|
|
294
|
+
assert.ok(result.stdout.includes('Run:') || result.stdout.includes('npx'), 'Verbose output should include fix commands');
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
describe('output formatting', () => {
|
|
298
|
+
it('should use ✓ for passing checks', () => {
|
|
299
|
+
// Setup: Create healthy project components
|
|
300
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
301
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
302
|
+
const beadsDir = join(testDir, '.beads');
|
|
303
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
304
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
305
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
306
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
307
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
308
|
+
const result = runDoctor(testDir);
|
|
309
|
+
// Should contain checkmarks for passing tests
|
|
310
|
+
assert.ok(result.stdout.includes('✓'), 'Should use ✓ for passing checks');
|
|
311
|
+
});
|
|
312
|
+
it('should use ⚠ for warning checks', () => {
|
|
313
|
+
// Setup: Create project with warnings (missing .beads, but valid agents/skills)
|
|
314
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
315
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
316
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
317
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
318
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
319
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
320
|
+
const result = runDoctor(testDir);
|
|
321
|
+
// Should contain warning indicators
|
|
322
|
+
assert.ok(result.stdout.includes('⚠'), 'Should use ⚠ for warnings');
|
|
323
|
+
});
|
|
324
|
+
it('should use ✗ for failing checks', () => {
|
|
325
|
+
// Setup: Create empty project (no .github directory)
|
|
326
|
+
// This should fail the agents and skills checks
|
|
327
|
+
const result = runDoctor(testDir);
|
|
328
|
+
// Should contain failure indicators
|
|
329
|
+
assert.ok(result.stdout.includes('✗'), 'Should use ✗ for failures');
|
|
330
|
+
});
|
|
331
|
+
it('should show summary line with pass/warn/fail counts', () => {
|
|
332
|
+
// Setup: Create project with mixed results
|
|
333
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
334
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
335
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
336
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
337
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
338
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
339
|
+
const result = runDoctor(testDir);
|
|
340
|
+
// Should contain summary with counts
|
|
341
|
+
assert.ok(result.stdout.includes('passed') ||
|
|
342
|
+
result.stdout.includes('warning') ||
|
|
343
|
+
result.stdout.includes('check'), 'Should show summary with check results');
|
|
344
|
+
});
|
|
345
|
+
it('should show "Beth Doctor - System Health Check" header', () => {
|
|
346
|
+
const result = runDoctor(testDir);
|
|
347
|
+
assert.ok(result.stdout.includes('Beth Doctor') || result.stdout.includes('System Health Check'), 'Should show doctor header');
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
describe('exit codes', () => {
|
|
351
|
+
it('should exit with code 1 when checks fail', () => {
|
|
352
|
+
// Empty directory - agents and skills will fail
|
|
353
|
+
const result = runDoctor(testDir);
|
|
354
|
+
assert.strictEqual(result.code, 1, 'Should exit with code 1 on failure');
|
|
355
|
+
});
|
|
356
|
+
it('should exit with code 0 when no failures (only warnings allowed)', () => {
|
|
357
|
+
// Setup: Create project with all required components
|
|
358
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
359
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
360
|
+
const beadsDir = join(testDir, '.beads');
|
|
361
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
362
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
363
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
364
|
+
createValidAgentFile(agentsDir, 'test-agent');
|
|
365
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
366
|
+
const result = runDoctor(testDir);
|
|
367
|
+
// If beads CLI is installed, this should pass
|
|
368
|
+
// If beads CLI is not installed, it will fail - we check the agent/skill parts passed
|
|
369
|
+
const hasAgentPass = result.stdout.includes('✓') && result.stdout.includes('Agent');
|
|
370
|
+
const hasSkillPass = result.stdout.includes('✓') && result.stdout.includes('Skill');
|
|
371
|
+
// At minimum, agents and skills checks should pass
|
|
372
|
+
assert.ok(hasAgentPass || hasSkillPass || result.stdout.includes('1 agents configured'), 'Agent or skill check should pass');
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
describe('Node.js version check', () => {
|
|
376
|
+
it('should always pass Node.js check on current version', () => {
|
|
377
|
+
const result = runDoctor(testDir);
|
|
378
|
+
// Node.js check should pass (we're running on Node.js 18+)
|
|
379
|
+
assert.ok(result.stdout.includes('Node.js') && result.stdout.includes('✓'), 'Node.js version check should pass');
|
|
380
|
+
});
|
|
381
|
+
it('should show Node.js version in output', () => {
|
|
382
|
+
const result = runDoctor(testDir);
|
|
383
|
+
// Should include version number
|
|
384
|
+
assert.ok(result.stdout.includes(process.version) || result.stdout.includes('≥18'), 'Should show Node.js version info');
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
describe('empty agent files handled gracefully', () => {
|
|
388
|
+
it('should handle empty .agent.md files without crashing', () => {
|
|
389
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
390
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
391
|
+
const beadsDir = join(testDir, '.beads');
|
|
392
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
393
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
394
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
395
|
+
// Create empty agent file
|
|
396
|
+
writeFileSync(join(agentsDir, 'empty.agent.md'), '');
|
|
397
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
398
|
+
const result = runDoctor(testDir);
|
|
399
|
+
// Should not crash, should show warning
|
|
400
|
+
assert.ok(result.stdout.includes('Agents') || result.stdout.includes('agents'), 'Should process empty agent file without crash');
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
describe('malformed YAML frontmatter', () => {
|
|
404
|
+
it('should handle malformed YAML without crashing', () => {
|
|
405
|
+
const agentsDir = join(testDir, '.github', 'agents');
|
|
406
|
+
const skillsDir = join(testDir, '.github', 'skills');
|
|
407
|
+
const beadsDir = join(testDir, '.beads');
|
|
408
|
+
mkdirSync(agentsDir, { recursive: true });
|
|
409
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
410
|
+
mkdirSync(beadsDir, { recursive: true });
|
|
411
|
+
// Create agent with malformed YAML
|
|
412
|
+
const badYaml = `---
|
|
413
|
+
name: test
|
|
414
|
+
broken: indentation
|
|
415
|
+
very: bad
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
# Broken Agent
|
|
419
|
+
`;
|
|
420
|
+
writeFileSync(join(agentsDir, 'broken.agent.md'), badYaml);
|
|
421
|
+
createValidSkill(skillsDir, 'test-skill');
|
|
422
|
+
const result = runDoctor(testDir);
|
|
423
|
+
// Should handle gracefully without crashing
|
|
424
|
+
assert.ok(result.stdout.includes('Agents') || result.stdout.includes('✗') || result.stdout.includes('⚠'), 'Should handle malformed YAML gracefully');
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
//# sourceMappingURL=doctor.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.e2e.test.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E tests for the help command.
|
|
3
|
+
* Run with: node --test dist/cli/commands/help.e2e.test.js
|
|
4
|
+
*
|
|
5
|
+
* Validates that `npx beth-copilot help` shows all available commands,
|
|
6
|
+
* options, and what gets installed.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=help.e2e.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/help.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|