beth-copilot 1.0.12 → 1.0.14

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 (79) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +173 -32
  3. package/bin/cli.js +111 -193
  4. package/dist/cli/commands/doctor.d.ts +25 -0
  5. package/dist/cli/commands/doctor.d.ts.map +1 -0
  6. package/dist/cli/commands/doctor.js +238 -0
  7. package/dist/cli/commands/doctor.js.map +1 -0
  8. package/dist/cli/commands/doctor.test.d.ts +6 -0
  9. package/dist/cli/commands/doctor.test.d.ts.map +1 -0
  10. package/dist/cli/commands/doctor.test.js +137 -0
  11. package/dist/cli/commands/doctor.test.js.map +1 -0
  12. package/dist/cli/commands/index.d.ts +7 -0
  13. package/dist/cli/commands/index.d.ts.map +1 -0
  14. package/dist/cli/commands/index.js +10 -0
  15. package/dist/cli/commands/index.js.map +1 -0
  16. package/dist/cli/commands/quickstart.d.ts +18 -0
  17. package/dist/cli/commands/quickstart.d.ts.map +1 -0
  18. package/dist/cli/commands/quickstart.js +141 -0
  19. package/dist/cli/commands/quickstart.js.map +1 -0
  20. package/dist/core/agents/index.d.ts +6 -0
  21. package/dist/core/agents/index.d.ts.map +1 -0
  22. package/dist/core/agents/index.js +6 -0
  23. package/dist/core/agents/index.js.map +1 -0
  24. package/dist/core/agents/loader.d.ts +49 -0
  25. package/dist/core/agents/loader.d.ts.map +1 -0
  26. package/dist/core/agents/loader.js +217 -0
  27. package/dist/core/agents/loader.js.map +1 -0
  28. package/dist/core/agents/loader.test.d.ts +7 -0
  29. package/dist/core/agents/loader.test.d.ts.map +1 -0
  30. package/dist/core/agents/loader.test.js +144 -0
  31. package/dist/core/agents/loader.test.js.map +1 -0
  32. package/dist/core/agents/types.d.ts +77 -0
  33. package/dist/core/agents/types.d.ts.map +1 -0
  34. package/dist/core/agents/types.js +8 -0
  35. package/dist/core/agents/types.js.map +1 -0
  36. package/dist/core/agents/types.test.d.ts +6 -0
  37. package/dist/core/agents/types.test.d.ts.map +1 -0
  38. package/dist/core/agents/types.test.js +254 -0
  39. package/dist/core/agents/types.test.js.map +1 -0
  40. package/dist/core/skills/index.d.ts +6 -0
  41. package/dist/core/skills/index.d.ts.map +1 -0
  42. package/dist/core/skills/index.js +6 -0
  43. package/dist/core/skills/index.js.map +1 -0
  44. package/dist/core/skills/loader.d.ts +69 -0
  45. package/dist/core/skills/loader.d.ts.map +1 -0
  46. package/dist/core/skills/loader.js +243 -0
  47. package/dist/core/skills/loader.js.map +1 -0
  48. package/dist/core/skills/loader.test.d.ts +7 -0
  49. package/dist/core/skills/loader.test.d.ts.map +1 -0
  50. package/dist/core/skills/loader.test.js +184 -0
  51. package/dist/core/skills/loader.test.js.map +1 -0
  52. package/dist/core/skills/types.d.ts +58 -0
  53. package/dist/core/skills/types.d.ts.map +1 -0
  54. package/dist/core/skills/types.js +8 -0
  55. package/dist/core/skills/types.js.map +1 -0
  56. package/dist/index.d.ts +10 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +14 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/lib/index.d.ts +7 -0
  61. package/dist/lib/index.d.ts.map +1 -0
  62. package/dist/lib/index.js +7 -0
  63. package/dist/lib/index.js.map +1 -0
  64. package/dist/lib/pathValidation.d.ts +69 -0
  65. package/dist/lib/pathValidation.d.ts.map +1 -0
  66. package/dist/lib/pathValidation.js +185 -0
  67. package/dist/lib/pathValidation.js.map +1 -0
  68. package/dist/lib/pathValidation.test.d.ts +9 -0
  69. package/dist/lib/pathValidation.test.d.ts.map +1 -0
  70. package/dist/lib/pathValidation.test.js +195 -0
  71. package/dist/lib/pathValidation.test.js.map +1 -0
  72. package/package.json +15 -3
  73. package/templates/.github/agents/developer.agent.md +9 -0
  74. package/templates/.github/agents/product-manager.agent.md +9 -0
  75. package/templates/.github/agents/researcher.agent.md +9 -0
  76. package/templates/.github/agents/security-reviewer.agent.md +9 -2
  77. package/templates/.github/agents/tester.agent.md +9 -0
  78. package/templates/.github/agents/ux-designer.agent.md +9 -0
  79. package/templates/.github/copilot-instructions.md +3 -3
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Doctor Command
3
+ *
4
+ * Checks system health and verifies Beth installation requirements:
5
+ * - Node.js version (≥18)
6
+ * - beads CLI available
7
+ * - backlog.md CLI available
8
+ * - .github/agents/ exists with valid frontmatter
9
+ * - .github/skills/ exists
10
+ */
11
+ interface DoctorOptions {
12
+ verbose?: boolean;
13
+ }
14
+ /**
15
+ * Main doctor command
16
+ * @param options - Command options
17
+ * @param exitOnFailure - If false, returns result instead of calling process.exit
18
+ */
19
+ export declare function doctor(options?: DoctorOptions, exitOnFailure?: boolean): Promise<{
20
+ passed: number;
21
+ warned: number;
22
+ failed: number;
23
+ }>;
24
+ export {};
25
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkBH,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA6MD;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,EAAE,aAAa,UAAO,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA4C3I"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Doctor Command
3
+ *
4
+ * Checks system health and verifies Beth installation requirements:
5
+ * - Node.js version (≥18)
6
+ * - beads CLI available
7
+ * - backlog.md CLI available
8
+ * - .github/agents/ exists with valid frontmatter
9
+ * - .github/skills/ exists
10
+ */
11
+ import { execSync } from 'child_process';
12
+ import { existsSync, readdirSync, readFileSync } from 'fs';
13
+ import { join } from 'path';
14
+ import matter from 'gray-matter';
15
+ // Colors for terminal output
16
+ const COLORS = {
17
+ reset: '\x1b[0m',
18
+ bright: '\x1b[1m',
19
+ dim: '\x1b[2m',
20
+ red: '\x1b[31m',
21
+ green: '\x1b[32m',
22
+ yellow: '\x1b[33m',
23
+ cyan: '\x1b[36m',
24
+ };
25
+ function log(message, color = '') {
26
+ console.log(`${color}${message}${COLORS.reset}`);
27
+ }
28
+ function logResult(result, verbose) {
29
+ const icon = result.status === 'pass' ? '✓' : result.status === 'warn' ? '⚠' : '✗';
30
+ const color = result.status === 'pass' ? COLORS.green : result.status === 'warn' ? COLORS.yellow : COLORS.red;
31
+ log(`${icon} ${result.name}: ${result.message}`, color);
32
+ if (verbose && result.details) {
33
+ log(` ${result.details}`, COLORS.dim);
34
+ }
35
+ }
36
+ /**
37
+ * Check Node.js version
38
+ */
39
+ function checkNodeVersion() {
40
+ const version = process.version;
41
+ const major = parseInt(version.slice(1).split('.')[0], 10);
42
+ if (major >= 18) {
43
+ return {
44
+ name: 'Node.js',
45
+ status: 'pass',
46
+ message: `${version} (≥18 required)`,
47
+ };
48
+ }
49
+ return {
50
+ name: 'Node.js',
51
+ status: 'fail',
52
+ message: `${version} (≥18 required)`,
53
+ details: 'Upgrade Node.js: https://nodejs.org/',
54
+ };
55
+ }
56
+ /**
57
+ * Check if a CLI tool is available
58
+ */
59
+ function checkCli(name, command, installHint) {
60
+ try {
61
+ const output = execSync(`${command} --version`, {
62
+ encoding: 'utf-8',
63
+ stdio: ['pipe', 'pipe', 'pipe'],
64
+ }).trim();
65
+ return {
66
+ name,
67
+ status: 'pass',
68
+ message: `installed (${output.split('\n')[0]})`,
69
+ };
70
+ }
71
+ catch {
72
+ return {
73
+ name,
74
+ status: 'fail',
75
+ message: 'not found',
76
+ details: `Install: ${installHint}`,
77
+ };
78
+ }
79
+ }
80
+ /**
81
+ * Check .github/agents/ directory and validate frontmatter
82
+ */
83
+ function checkAgents(cwd) {
84
+ const agentsDir = join(cwd, '.github', 'agents');
85
+ if (!existsSync(agentsDir)) {
86
+ return {
87
+ name: 'Agents',
88
+ status: 'fail',
89
+ message: '.github/agents/ not found',
90
+ details: 'Run: npx beth-copilot init',
91
+ };
92
+ }
93
+ const agentFiles = readdirSync(agentsDir).filter(f => f.endsWith('.agent.md'));
94
+ if (agentFiles.length === 0) {
95
+ return {
96
+ name: 'Agents',
97
+ status: 'fail',
98
+ message: 'no .agent.md files found',
99
+ details: 'Run: npx beth-copilot init --force',
100
+ };
101
+ }
102
+ // Validate frontmatter for each agent
103
+ const errors = [];
104
+ for (const file of agentFiles) {
105
+ try {
106
+ const content = readFileSync(join(agentsDir, file), 'utf-8');
107
+ const { data } = matter(content);
108
+ if (!data.name) {
109
+ errors.push(`${file}: missing 'name' in frontmatter`);
110
+ }
111
+ }
112
+ catch (e) {
113
+ errors.push(`${file}: failed to parse - ${e instanceof Error ? e.message : 'unknown error'}`);
114
+ }
115
+ }
116
+ if (errors.length > 0) {
117
+ return {
118
+ name: 'Agents',
119
+ status: 'warn',
120
+ message: `${agentFiles.length} agents, ${errors.length} with issues`,
121
+ details: errors.join('; '),
122
+ };
123
+ }
124
+ return {
125
+ name: 'Agents',
126
+ status: 'pass',
127
+ message: `${agentFiles.length} agents configured`,
128
+ };
129
+ }
130
+ /**
131
+ * Check .github/skills/ directory
132
+ */
133
+ function checkSkills(cwd) {
134
+ const skillsDir = join(cwd, '.github', 'skills');
135
+ if (!existsSync(skillsDir)) {
136
+ return {
137
+ name: 'Skills',
138
+ status: 'fail',
139
+ message: '.github/skills/ not found',
140
+ details: 'Run: npx beth-copilot init',
141
+ };
142
+ }
143
+ const skillDirs = readdirSync(skillsDir, { withFileTypes: true })
144
+ .filter(d => d.isDirectory())
145
+ .map(d => d.name);
146
+ if (skillDirs.length === 0) {
147
+ return {
148
+ name: 'Skills',
149
+ status: 'warn',
150
+ message: 'no skill directories found',
151
+ };
152
+ }
153
+ // Check each skill has a SKILL.md
154
+ const missingSkillMd = [];
155
+ for (const dir of skillDirs) {
156
+ const skillMd = join(skillsDir, dir, 'SKILL.md');
157
+ if (!existsSync(skillMd)) {
158
+ missingSkillMd.push(dir);
159
+ }
160
+ }
161
+ if (missingSkillMd.length > 0) {
162
+ return {
163
+ name: 'Skills',
164
+ status: 'warn',
165
+ message: `${skillDirs.length} skills, ${missingSkillMd.length} missing SKILL.md`,
166
+ details: `Missing: ${missingSkillMd.join(', ')}`,
167
+ };
168
+ }
169
+ return {
170
+ name: 'Skills',
171
+ status: 'pass',
172
+ message: `${skillDirs.length} skills configured`,
173
+ };
174
+ }
175
+ /**
176
+ * Check if beads is initialized in the project
177
+ */
178
+ function checkBeadsInit(cwd) {
179
+ const beadsDir = join(cwd, '.beads');
180
+ if (existsSync(beadsDir)) {
181
+ return {
182
+ name: 'Beads Init',
183
+ status: 'pass',
184
+ message: '.beads/ directory present',
185
+ };
186
+ }
187
+ return {
188
+ name: 'Beads Init',
189
+ status: 'warn',
190
+ message: '.beads/ not initialized',
191
+ details: 'Run: bd init',
192
+ };
193
+ }
194
+ /**
195
+ * Main doctor command
196
+ * @param options - Command options
197
+ * @param exitOnFailure - If false, returns result instead of calling process.exit
198
+ */
199
+ export async function doctor(options = {}, exitOnFailure = true) {
200
+ const { verbose = false } = options;
201
+ const cwd = process.cwd();
202
+ console.log('');
203
+ log('Beth Doctor - System Health Check', COLORS.bright);
204
+ log('─'.repeat(40), COLORS.dim);
205
+ console.log('');
206
+ const results = [
207
+ checkNodeVersion(),
208
+ checkCli('beads', 'bd', 'curl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash'),
209
+ checkAgents(cwd),
210
+ checkSkills(cwd),
211
+ checkBeadsInit(cwd),
212
+ ];
213
+ // Display results
214
+ for (const result of results) {
215
+ logResult(result, verbose);
216
+ }
217
+ console.log('');
218
+ log('─'.repeat(40), COLORS.dim);
219
+ // Summary
220
+ const passed = results.filter(r => r.status === 'pass').length;
221
+ const warned = results.filter(r => r.status === 'warn').length;
222
+ const failed = results.filter(r => r.status === 'fail').length;
223
+ if (failed > 0) {
224
+ log(`\n${failed} check(s) failed. Fix issues above and run doctor again.`, COLORS.red);
225
+ if (exitOnFailure) {
226
+ process.exit(1);
227
+ }
228
+ }
229
+ else if (warned > 0) {
230
+ log(`\n${passed}/${results.length} passed, ${warned} warning(s)`, COLORS.yellow);
231
+ }
232
+ else {
233
+ log(`\nAll ${results.length} checks passed! Beth is ready.`, COLORS.green);
234
+ }
235
+ console.log('');
236
+ return { passed, warned, failed };
237
+ }
238
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Unit tests for doctor command.
3
+ * Run with: node --test dist/cli/commands/doctor.test.js
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=doctor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Unit tests for doctor command.
3
+ * Run with: node --test dist/cli/commands/doctor.test.js
4
+ */
5
+ import { describe, it, beforeEach, afterEach } from 'node:test';
6
+ import assert from 'node:assert';
7
+ import { execSync } from 'child_process';
8
+ import { existsSync, mkdirSync, writeFileSync, rmSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { tmpdir } from 'os';
11
+ // Test utilities - we can't import the private functions from doctor.ts
12
+ // but we can test the overall behavior
13
+ describe('doctor command integration', () => {
14
+ let testDir;
15
+ beforeEach(() => {
16
+ // Create a temp directory for testing
17
+ testDir = join(tmpdir(), `beth-test-${Date.now()}`);
18
+ mkdirSync(testDir, { recursive: true });
19
+ });
20
+ afterEach(() => {
21
+ // Clean up temp directory
22
+ if (existsSync(testDir)) {
23
+ rmSync(testDir, { recursive: true, force: true });
24
+ }
25
+ });
26
+ describe('Node.js version check', () => {
27
+ it('should pass with current Node.js version', () => {
28
+ const version = process.version;
29
+ const major = parseInt(version.slice(1).split('.')[0], 10);
30
+ assert.ok(major >= 18, `Node.js ${version} should be >= 18`);
31
+ });
32
+ });
33
+ describe('agents directory validation', () => {
34
+ it('should detect missing .github/agents directory', () => {
35
+ const agentsDir = join(testDir, '.github', 'agents');
36
+ assert.strictEqual(existsSync(agentsDir), false);
37
+ });
38
+ it('should detect existing .github/agents directory', () => {
39
+ const agentsDir = join(testDir, '.github', 'agents');
40
+ mkdirSync(agentsDir, { recursive: true });
41
+ assert.strictEqual(existsSync(agentsDir), true);
42
+ });
43
+ it('should detect valid agent files', () => {
44
+ const agentsDir = join(testDir, '.github', 'agents');
45
+ mkdirSync(agentsDir, { recursive: true });
46
+ const agentContent = `---
47
+ name: test-agent
48
+ description: A test agent
49
+ model: Claude Opus 4.5
50
+ tools:
51
+ - readFile
52
+ - editFiles
53
+ ---
54
+
55
+ # Test Agent
56
+
57
+ This is a test agent.
58
+ `;
59
+ writeFileSync(join(agentsDir, 'test.agent.md'), agentContent);
60
+ const files = existsSync(agentsDir);
61
+ assert.strictEqual(files, true);
62
+ });
63
+ it('should detect agent files missing name in frontmatter', () => {
64
+ const agentsDir = join(testDir, '.github', 'agents');
65
+ mkdirSync(agentsDir, { recursive: true });
66
+ // Agent file without name field
67
+ const agentContent = `---
68
+ description: A test agent without name
69
+ ---
70
+
71
+ # Test Agent
72
+ `;
73
+ writeFileSync(join(agentsDir, 'invalid.agent.md'), agentContent);
74
+ // We'd need to import gray-matter to actually parse this
75
+ // For now, just verify file was created
76
+ assert.strictEqual(existsSync(join(agentsDir, 'invalid.agent.md')), true);
77
+ });
78
+ });
79
+ describe('skills directory validation', () => {
80
+ it('should detect missing .github/skills directory', () => {
81
+ const skillsDir = join(testDir, '.github', 'skills');
82
+ assert.strictEqual(existsSync(skillsDir), false);
83
+ });
84
+ it('should detect skill directories with SKILL.md', () => {
85
+ const skillDir = join(testDir, '.github', 'skills', 'test-skill');
86
+ mkdirSync(skillDir, { recursive: true });
87
+ writeFileSync(join(skillDir, 'SKILL.md'), '# Test Skill\n\nThis is a test skill.');
88
+ assert.strictEqual(existsSync(join(skillDir, 'SKILL.md')), true);
89
+ });
90
+ it('should detect skill directories missing SKILL.md', () => {
91
+ const skillDir = join(testDir, '.github', 'skills', 'incomplete-skill');
92
+ mkdirSync(skillDir, { recursive: true });
93
+ // Create directory but no SKILL.md
94
+ assert.strictEqual(existsSync(skillDir), true);
95
+ assert.strictEqual(existsSync(join(skillDir, 'SKILL.md')), false);
96
+ });
97
+ });
98
+ describe('beads initialization check', () => {
99
+ it('should detect missing .beads directory', () => {
100
+ const beadsDir = join(testDir, '.beads');
101
+ assert.strictEqual(existsSync(beadsDir), false);
102
+ });
103
+ it('should detect existing .beads directory', () => {
104
+ const beadsDir = join(testDir, '.beads');
105
+ mkdirSync(beadsDir, { recursive: true });
106
+ assert.strictEqual(existsSync(beadsDir), true);
107
+ });
108
+ });
109
+ });
110
+ describe('CLI availability checks', () => {
111
+ it('should detect beads CLI if installed', () => {
112
+ try {
113
+ const output = execSync('bd --version', {
114
+ encoding: 'utf-8',
115
+ stdio: ['pipe', 'pipe', 'pipe'],
116
+ });
117
+ assert.ok(output.includes('version'), 'bd --version should return version info');
118
+ }
119
+ catch {
120
+ // bd not installed - this is not a failure, just skip
121
+ assert.ok(true, 'bd CLI not installed, skipping');
122
+ }
123
+ });
124
+ it('should handle missing CLI gracefully', () => {
125
+ try {
126
+ execSync('nonexistent-cli-tool-12345 --version', {
127
+ encoding: 'utf-8',
128
+ stdio: ['pipe', 'pipe', 'pipe'],
129
+ });
130
+ assert.fail('Should have thrown for non-existent CLI');
131
+ }
132
+ catch (error) {
133
+ assert.ok(true, 'Correctly threw for missing CLI');
134
+ }
135
+ });
136
+ });
137
+ //# sourceMappingURL=doctor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CLI Commands
3
+ *
4
+ * Command implementations for the Beth CLI.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CLI Commands
3
+ *
4
+ * Command implementations for the Beth CLI.
5
+ */
6
+ export {};
7
+ // Commands will be exported here as they're implemented
8
+ // export { doctor } from './doctor.js';
9
+ // export { quickstart } from './quickstart.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAEH,wDAAwD;AACxD,wCAAwC;AACxC,gDAAgD"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Quickstart Command
3
+ *
4
+ * Streamlined setup for Beth:
5
+ * - Checks if Beth is already initialized
6
+ * - Runs doctor to validate setup
7
+ * - Initializes beads if needed
8
+ * - Prints "what's next" guidance
9
+ */
10
+ interface QuickstartOptions {
11
+ verbose?: boolean;
12
+ }
13
+ /**
14
+ * Main quickstart command
15
+ */
16
+ export declare function quickstart(options?: QuickstartOptions): Promise<void>;
17
+ export {};
18
+ //# sourceMappingURL=quickstart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickstart.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/quickstart.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE/E"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Quickstart Command
3
+ *
4
+ * Streamlined setup for Beth:
5
+ * - Checks if Beth is already initialized
6
+ * - Runs doctor to validate setup
7
+ * - Initializes beads if needed
8
+ * - Prints "what's next" guidance
9
+ */
10
+ import { execSync, spawnSync } from 'child_process';
11
+ import { existsSync } from 'fs';
12
+ import { join } from 'path';
13
+ import { doctor } from './doctor.js';
14
+ // Colors for terminal output
15
+ const COLORS = {
16
+ reset: '\x1b[0m',
17
+ bright: '\x1b[1m',
18
+ dim: '\x1b[2m',
19
+ red: '\x1b[31m',
20
+ green: '\x1b[32m',
21
+ yellow: '\x1b[33m',
22
+ cyan: '\x1b[36m',
23
+ };
24
+ function log(message, color = '') {
25
+ console.log(`${color}${message}${COLORS.reset}`);
26
+ }
27
+ function logSuccess(message) {
28
+ log(`✓ ${message}`, COLORS.green);
29
+ }
30
+ function logWarning(message) {
31
+ log(`⚠ ${message}`, COLORS.yellow);
32
+ }
33
+ function logError(message) {
34
+ log(`✗ ${message}`, COLORS.red);
35
+ }
36
+ function logInfo(message) {
37
+ log(` ${message}`, COLORS.cyan);
38
+ }
39
+ /**
40
+ * Check if Beth is initialized in the project
41
+ */
42
+ function isBethInitialized(cwd) {
43
+ const agentsDir = join(cwd, '.github', 'agents');
44
+ return existsSync(agentsDir);
45
+ }
46
+ /**
47
+ * Check if beads is initialized in the project
48
+ */
49
+ function isBeadsInitialized(cwd) {
50
+ const beadsDir = join(cwd, '.beads');
51
+ return existsSync(beadsDir);
52
+ }
53
+ /**
54
+ * Check if beads CLI is available
55
+ */
56
+ function isBeadsAvailable() {
57
+ try {
58
+ execSync('bd --version', { stdio: 'ignore' });
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ /**
66
+ * Initialize beads in the project
67
+ */
68
+ function initializeBeads(cwd) {
69
+ log('\nInitializing beads...', COLORS.cyan);
70
+ const result = spawnSync('bd', ['init'], {
71
+ cwd,
72
+ stdio: 'inherit',
73
+ shell: true,
74
+ });
75
+ return result.status === 0;
76
+ }
77
+ /**
78
+ * Main quickstart command
79
+ */
80
+ export async function quickstart(options = {}) {
81
+ const { verbose = false } = options;
82
+ const cwd = process.cwd();
83
+ console.log('');
84
+ log('Beth Quickstart', COLORS.bright);
85
+ log('─'.repeat(40), COLORS.dim);
86
+ // Step 1: Check if Beth is initialized
87
+ if (!isBethInitialized(cwd)) {
88
+ console.log('');
89
+ logWarning('Beth not initialized in this project.');
90
+ logInfo('Run: npx beth-copilot init');
91
+ console.log('');
92
+ logInfo('Then run: npx beth-copilot quickstart');
93
+ console.log('');
94
+ process.exit(1);
95
+ }
96
+ logSuccess('Beth is initialized');
97
+ // Step 2: Check if beads CLI is available
98
+ if (!isBeadsAvailable()) {
99
+ console.log('');
100
+ logError('beads CLI not found.');
101
+ logInfo('Install: npm install -g @beads/bd');
102
+ logInfo('Or: curl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash');
103
+ console.log('');
104
+ process.exit(1);
105
+ }
106
+ // Step 3: Initialize beads if needed
107
+ if (!isBeadsInitialized(cwd)) {
108
+ const initialized = initializeBeads(cwd);
109
+ if (!initialized) {
110
+ logError('Failed to initialize beads.');
111
+ logInfo('Run manually: bd init');
112
+ process.exit(1);
113
+ }
114
+ logSuccess('beads initialized');
115
+ }
116
+ else {
117
+ logSuccess('beads already initialized');
118
+ }
119
+ // Step 4: Run doctor (don't exit on failure, we still want to show next steps)
120
+ console.log('');
121
+ log('Running health check...', COLORS.cyan);
122
+ await doctor({ verbose }, false);
123
+ // Step 5: Print next steps
124
+ console.log('');
125
+ log('─'.repeat(40), COLORS.dim);
126
+ log('\nQuick Start Guide:', COLORS.bright);
127
+ console.log('');
128
+ log('1. Open this project in VS Code', COLORS.cyan);
129
+ log('2. Open Copilot Chat (Ctrl+Alt+I / Cmd+Alt+I)', COLORS.cyan);
130
+ log('3. Type @Beth to start working', COLORS.cyan);
131
+ console.log('');
132
+ log('Pro tip:', COLORS.bright);
133
+ logInfo('Start every session with @Beth and let her route work to specialists.');
134
+ console.log('');
135
+ log('Documentation:', COLORS.bright);
136
+ logInfo('https://github.com/stephschofield/beth');
137
+ console.log('');
138
+ log('"They broke my wings and forgot I had claws."', COLORS.cyan);
139
+ console.log('');
140
+ }
141
+ //# sourceMappingURL=quickstart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickstart.js","sourceRoot":"","sources":["../../../src/cli/commands/quickstart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Agents module exports
3
+ */
4
+ export * from './types.js';
5
+ export * from './loader.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Agents module exports
3
+ */
4
+ export * from './types.js';
5
+ export * from './loader.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agents/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}