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.
Files changed (104) hide show
  1. package/CHANGELOG.md +195 -170
  2. package/README.md +408 -185
  3. package/bin/cli.js +65 -4
  4. package/dist/cli/commands/doctor.e2e.test.d.ts +8 -0
  5. package/dist/cli/commands/doctor.e2e.test.d.ts.map +1 -0
  6. package/dist/cli/commands/doctor.e2e.test.js +428 -0
  7. package/dist/cli/commands/doctor.e2e.test.js.map +1 -0
  8. package/dist/cli/commands/doctor.test.js +1 -1
  9. package/dist/cli/commands/help.e2e.test.d.ts +9 -0
  10. package/dist/cli/commands/help.e2e.test.d.ts.map +1 -0
  11. package/dist/cli/commands/help.e2e.test.js +150 -0
  12. package/dist/cli/commands/help.e2e.test.js.map +1 -0
  13. package/dist/cli/commands/init.test.d.ts +6 -0
  14. package/dist/cli/commands/init.test.d.ts.map +1 -0
  15. package/dist/cli/commands/init.test.js +289 -0
  16. package/dist/cli/commands/init.test.js.map +1 -0
  17. package/dist/cli/commands/mcp.e2e.test.d.ts +9 -0
  18. package/dist/cli/commands/mcp.e2e.test.d.ts.map +1 -0
  19. package/dist/cli/commands/mcp.e2e.test.js +139 -0
  20. package/dist/cli/commands/mcp.e2e.test.js.map +1 -0
  21. package/dist/cli/commands/pipeline.e2e.test.d.ts +9 -0
  22. package/dist/cli/commands/pipeline.e2e.test.d.ts.map +1 -0
  23. package/dist/cli/commands/pipeline.e2e.test.js +192 -0
  24. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -0
  25. package/dist/cli/commands/quickstart.test.d.ts +6 -0
  26. package/dist/cli/commands/quickstart.test.d.ts.map +1 -0
  27. package/dist/cli/commands/quickstart.test.js +232 -0
  28. package/dist/cli/commands/quickstart.test.js.map +1 -0
  29. package/dist/core/agents/frontmatter.test.d.ts +8 -0
  30. package/dist/core/agents/frontmatter.test.d.ts.map +1 -0
  31. package/dist/core/agents/frontmatter.test.js +589 -0
  32. package/dist/core/agents/frontmatter.test.js.map +1 -0
  33. package/dist/core/agents/handoffs.test.d.ts +8 -0
  34. package/dist/core/agents/handoffs.test.d.ts.map +1 -0
  35. package/dist/core/agents/handoffs.test.js +320 -0
  36. package/dist/core/agents/handoffs.test.js.map +1 -0
  37. package/dist/core/agents/loader.test.js +1 -1
  38. package/dist/core/agents/suite.test.d.ts +8 -0
  39. package/dist/core/agents/suite.test.d.ts.map +1 -0
  40. package/dist/core/agents/suite.test.js +207 -0
  41. package/dist/core/agents/suite.test.js.map +1 -0
  42. package/dist/core/agents/tools.test.d.ts +8 -0
  43. package/dist/core/agents/tools.test.d.ts.map +1 -0
  44. package/dist/core/agents/tools.test.js +332 -0
  45. package/dist/core/agents/tools.test.js.map +1 -0
  46. package/dist/init.test.js +288 -0
  47. package/dist/providers/azure.d.ts +147 -0
  48. package/dist/providers/azure.d.ts.map +1 -0
  49. package/dist/providers/azure.js +491 -0
  50. package/dist/providers/azure.js.map +1 -0
  51. package/dist/providers/azure.test.d.ts +11 -0
  52. package/dist/providers/azure.test.d.ts.map +1 -0
  53. package/dist/providers/azure.test.js +330 -0
  54. package/dist/providers/azure.test.js.map +1 -0
  55. package/dist/providers/config.d.ts +87 -0
  56. package/dist/providers/config.d.ts.map +1 -0
  57. package/dist/providers/config.js +193 -0
  58. package/dist/providers/config.js.map +1 -0
  59. package/dist/providers/config.test.d.ts +7 -0
  60. package/dist/providers/config.test.d.ts.map +1 -0
  61. package/dist/providers/config.test.js +370 -0
  62. package/dist/providers/config.test.js.map +1 -0
  63. package/dist/providers/index.d.ts +18 -0
  64. package/dist/providers/index.d.ts.map +1 -0
  65. package/dist/providers/index.js +14 -0
  66. package/dist/providers/index.js.map +1 -0
  67. package/dist/providers/interface.d.ts +191 -0
  68. package/dist/providers/interface.d.ts.map +1 -0
  69. package/dist/providers/interface.js +94 -0
  70. package/dist/providers/interface.js.map +1 -0
  71. package/dist/providers/retry.d.ts +128 -0
  72. package/dist/providers/retry.d.ts.map +1 -0
  73. package/dist/providers/retry.js +205 -0
  74. package/dist/providers/retry.js.map +1 -0
  75. package/dist/providers/retry.test.d.ts +7 -0
  76. package/dist/providers/retry.test.d.ts.map +1 -0
  77. package/dist/providers/retry.test.js +439 -0
  78. package/dist/providers/retry.test.js.map +1 -0
  79. package/dist/providers/streaming.d.ts +157 -0
  80. package/dist/providers/streaming.d.ts.map +1 -0
  81. package/dist/providers/streaming.js +233 -0
  82. package/dist/providers/streaming.js.map +1 -0
  83. package/dist/providers/streaming.test.d.ts +7 -0
  84. package/dist/providers/streaming.test.d.ts.map +1 -0
  85. package/dist/providers/streaming.test.js +372 -0
  86. package/dist/providers/streaming.test.js.map +1 -0
  87. package/dist/providers/types.d.ts +209 -0
  88. package/dist/providers/types.d.ts.map +1 -0
  89. package/dist/providers/types.js +53 -0
  90. package/dist/providers/types.js.map +1 -0
  91. package/dist/providers/types.test.d.ts +7 -0
  92. package/dist/providers/types.test.d.ts.map +1 -0
  93. package/dist/providers/types.test.js +141 -0
  94. package/dist/providers/types.test.js.map +1 -0
  95. package/package.json +60 -56
  96. package/sbom.json +3302 -8
  97. package/templates/.github/agents/beth.agent.md +329 -329
  98. package/templates/.github/agents/developer.agent.md +572 -572
  99. package/templates/.github/agents/product-manager.agent.md +272 -272
  100. package/templates/.github/agents/researcher.agent.md +338 -338
  101. package/templates/.github/agents/security-reviewer.agent.md +465 -465
  102. package/templates/.github/agents/tester.agent.md +496 -496
  103. package/templates/.github/agents/ux-designer.agent.md +393 -393
  104. 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
- throw new Error(
741
- `Cannot copy directory: "${dest}" exists as a file, not a directory. ` +
742
- `Run with --force to overwrite, or remove the file manually.`
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
- await init(options);
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,8 @@
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
+ export {};
8
+ //# sourceMappingURL=doctor.e2e.test.d.ts.map
@@ -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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"}
@@ -46,7 +46,7 @@ describe('doctor command integration', () => {
46
46
  const agentContent = `---
47
47
  name: test-agent
48
48
  description: A test agent
49
- model: Claude Opus 4.5
49
+ model: Claude Opus 4.6
50
50
  tools:
51
51
  - readFile
52
52
  - editFiles
@@ -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"}