beth-copilot 1.1.0 → 2.0.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.
Files changed (223) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/README.md +51 -62
  3. package/assets/beth-questioning.png +0 -0
  4. package/assets/yellowstone-beth.png +0 -0
  5. package/bin/cli.js +19 -410
  6. package/dist/__tests__/inject-skills.test.d.ts +9 -0
  7. package/dist/__tests__/inject-skills.test.d.ts.map +1 -0
  8. package/dist/__tests__/inject-skills.test.js +143 -0
  9. package/dist/__tests__/inject-skills.test.js.map +1 -0
  10. package/dist/__tests__/skills/disambiguation.test.d.ts +10 -0
  11. package/dist/__tests__/skills/disambiguation.test.d.ts.map +1 -0
  12. package/dist/__tests__/skills/disambiguation.test.js +192 -0
  13. package/dist/__tests__/skills/disambiguation.test.js.map +1 -0
  14. package/dist/__tests__/skills/hook-injection.test.d.ts +11 -0
  15. package/dist/__tests__/skills/hook-injection.test.d.ts.map +1 -0
  16. package/dist/__tests__/skills/hook-injection.test.js +173 -0
  17. package/dist/__tests__/skills/hook-injection.test.js.map +1 -0
  18. package/dist/__tests__/skills/mapping-completeness.test.d.ts +17 -0
  19. package/dist/__tests__/skills/mapping-completeness.test.d.ts.map +1 -0
  20. package/dist/__tests__/skills/mapping-completeness.test.js +281 -0
  21. package/dist/__tests__/skills/mapping-completeness.test.js.map +1 -0
  22. package/dist/__tests__/skills/pipeline-integration.test.d.ts +18 -0
  23. package/dist/__tests__/skills/pipeline-integration.test.d.ts.map +1 -0
  24. package/dist/__tests__/skills/pipeline-integration.test.js +234 -0
  25. package/dist/__tests__/skills/pipeline-integration.test.js.map +1 -0
  26. package/dist/__tests__/skills/skill-routing.test.d.ts +15 -0
  27. package/dist/__tests__/skills/skill-routing.test.d.ts.map +1 -0
  28. package/dist/__tests__/skills/skill-routing.test.js +723 -0
  29. package/dist/__tests__/skills/skill-routing.test.js.map +1 -0
  30. package/dist/__tests__/skills/trigger-coverage.test.d.ts +24 -0
  31. package/dist/__tests__/skills/trigger-coverage.test.d.ts.map +1 -0
  32. package/dist/__tests__/skills/trigger-coverage.test.js +746 -0
  33. package/dist/__tests__/skills/trigger-coverage.test.js.map +1 -0
  34. package/dist/__tests__/smoke.test.js +13 -0
  35. package/dist/__tests__/smoke.test.js.map +1 -1
  36. package/dist/__tests__/verify-skills.test.d.ts +9 -0
  37. package/dist/__tests__/verify-skills.test.d.ts.map +1 -0
  38. package/dist/__tests__/verify-skills.test.js +78 -0
  39. package/dist/__tests__/verify-skills.test.js.map +1 -0
  40. package/dist/cli/commands/beads.e2e.test.d.ts +4 -2
  41. package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -1
  42. package/dist/cli/commands/beads.e2e.test.js +97 -38
  43. package/dist/cli/commands/beads.e2e.test.js.map +1 -1
  44. package/dist/cli/commands/cli-edge-cases.e2e.test.js +1 -1
  45. package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -1
  46. package/dist/cli/commands/close.d.ts +11 -46
  47. package/dist/cli/commands/close.d.ts.map +1 -1
  48. package/dist/cli/commands/close.e2e.test.d.ts +4 -20
  49. package/dist/cli/commands/close.e2e.test.d.ts.map +1 -1
  50. package/dist/cli/commands/close.e2e.test.js +23 -204
  51. package/dist/cli/commands/close.e2e.test.js.map +1 -1
  52. package/dist/cli/commands/close.js +26 -240
  53. package/dist/cli/commands/close.js.map +1 -1
  54. package/dist/cli/commands/close.test.d.ts +7 -9
  55. package/dist/cli/commands/close.test.d.ts.map +1 -1
  56. package/dist/cli/commands/close.test.js +44 -424
  57. package/dist/cli/commands/close.test.js.map +1 -1
  58. package/dist/cli/commands/doctor.d.ts +5 -22
  59. package/dist/cli/commands/doctor.d.ts.map +1 -1
  60. package/dist/cli/commands/doctor.e2e.test.js +3 -59
  61. package/dist/cli/commands/doctor.e2e.test.js.map +1 -1
  62. package/dist/cli/commands/doctor.js +38 -111
  63. package/dist/cli/commands/doctor.js.map +1 -1
  64. package/dist/cli/commands/doctor.test.js +32 -234
  65. package/dist/cli/commands/doctor.test.js.map +1 -1
  66. package/dist/cli/commands/framework-isolation.test.d.ts +1 -1
  67. package/dist/cli/commands/framework-isolation.test.js +2 -3
  68. package/dist/cli/commands/framework-isolation.test.js.map +1 -1
  69. package/dist/cli/commands/help.e2e.test.js +1 -5
  70. package/dist/cli/commands/help.e2e.test.js.map +1 -1
  71. package/dist/cli/commands/init-logic.e2e.test.js +12 -2
  72. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -1
  73. package/dist/cli/commands/init.test.js +4 -21
  74. package/dist/cli/commands/init.test.js.map +1 -1
  75. package/dist/cli/commands/land.d.ts +3 -15
  76. package/dist/cli/commands/land.d.ts.map +1 -1
  77. package/dist/cli/commands/land.js +13 -68
  78. package/dist/cli/commands/land.js.map +1 -1
  79. package/dist/cli/commands/land.test.d.ts +0 -1
  80. package/dist/cli/commands/land.test.d.ts.map +1 -1
  81. package/dist/cli/commands/land.test.js +2 -57
  82. package/dist/cli/commands/land.test.js.map +1 -1
  83. package/dist/cli/commands/mcp.e2e.test.js +3 -3
  84. package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
  85. package/dist/cli/commands/pipeline.e2e.test.js +23 -26
  86. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  87. package/dist/cli/commands/pre-push-guard.d.ts +2 -12
  88. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -1
  89. package/dist/cli/commands/pre-push-guard.e2e.test.js +1 -1
  90. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -1
  91. package/dist/cli/commands/pre-push-guard.js +2 -47
  92. package/dist/cli/commands/pre-push-guard.js.map +1 -1
  93. package/dist/cli/commands/pre-push-guard.test.d.ts +0 -1
  94. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -1
  95. package/dist/cli/commands/pre-push-guard.test.js +15 -98
  96. package/dist/cli/commands/pre-push-guard.test.js.map +1 -1
  97. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +1 -1
  98. package/dist/cli/commands/quickstart-expanded.e2e.test.js +3 -30
  99. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -1
  100. package/dist/cli/commands/quickstart.d.ts +0 -1
  101. package/dist/cli/commands/quickstart.d.ts.map +1 -1
  102. package/dist/cli/commands/quickstart.js +2 -60
  103. package/dist/cli/commands/quickstart.js.map +1 -1
  104. package/dist/cli/commands/quickstart.test.js +10 -104
  105. package/dist/cli/commands/quickstart.test.js.map +1 -1
  106. package/dist/cli/commands/update.d.ts +35 -0
  107. package/dist/cli/commands/update.d.ts.map +1 -0
  108. package/dist/cli/commands/update.e2e.test.d.ts +24 -0
  109. package/dist/cli/commands/update.e2e.test.d.ts.map +1 -0
  110. package/dist/cli/commands/update.e2e.test.js +240 -0
  111. package/dist/cli/commands/update.e2e.test.js.map +1 -0
  112. package/dist/cli/commands/update.js +255 -0
  113. package/dist/cli/commands/update.js.map +1 -0
  114. package/dist/core/agents/frontmatter.test.js +1 -1
  115. package/dist/core/agents/frontmatter.test.js.map +1 -1
  116. package/dist/core/agents/handoffs.test.js +1 -1
  117. package/dist/core/agents/handoffs.test.js.map +1 -1
  118. package/dist/core/agents/loader.d.ts +4 -2
  119. package/dist/core/agents/loader.d.ts.map +1 -1
  120. package/dist/core/agents/loader.js +5 -3
  121. package/dist/core/agents/loader.js.map +1 -1
  122. package/dist/core/agents/loader.test.js +42 -4
  123. package/dist/core/agents/loader.test.js.map +1 -1
  124. package/dist/core/agents/suite.test.js +8 -7
  125. package/dist/core/agents/suite.test.js.map +1 -1
  126. package/dist/core/agents/tools.test.js +10 -8
  127. package/dist/core/agents/tools.test.js.map +1 -1
  128. package/dist/core/agents/types.test.js +1 -1
  129. package/dist/core/agents/types.test.js.map +1 -1
  130. package/dist/core/skills/loader.test.js +1 -1
  131. package/dist/core/skills/loader.test.js.map +1 -1
  132. package/dist/index.d.ts +0 -1
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +0 -2
  135. package/dist/index.js.map +1 -1
  136. package/dist/lib/pathValidation.d.ts +0 -5
  137. package/dist/lib/pathValidation.d.ts.map +1 -1
  138. package/dist/lib/pathValidation.js +0 -11
  139. package/dist/lib/pathValidation.js.map +1 -1
  140. package/dist/lib/pathValidation.test.js +2 -14
  141. package/dist/lib/pathValidation.test.js.map +1 -1
  142. package/package.json +3 -6
  143. package/sbom.json +259 -371
  144. package/templates/.github/agents/beth.agent.md +194 -122
  145. package/templates/.github/agents/developer.agent.md +30 -22
  146. package/templates/.github/agents/product-manager.agent.md +15 -6
  147. package/templates/.github/agents/researcher.agent.md +10 -7
  148. package/templates/.github/agents/security-reviewer.agent.md +16 -7
  149. package/templates/.github/agents/tester.agent.md +16 -8
  150. package/templates/.github/agents/ux-designer.agent.md +12 -9
  151. package/templates/.github/copilot-instructions.md +33 -4
  152. package/templates/.github/copilot-mcp-config.json +12 -0
  153. package/templates/.github/dependabot.yml +68 -0
  154. package/templates/.github/hooks/scripts/inject-skills.mjs +139 -0
  155. package/templates/.github/hooks/scripts/verify-skills.mjs +47 -0
  156. package/templates/.github/hooks/skill-enforcement.json +18 -0
  157. package/templates/.github/pull_request_template.md +48 -0
  158. package/templates/.github/skills/framer-components/SKILL.md +0 -0
  159. package/templates/.github/skills/prd/SKILL.md +0 -0
  160. package/templates/.github/skills/security-analysis/SKILL.md +798 -798
  161. package/templates/.github/skills/shadcn-ui/SKILL.md +561 -561
  162. package/templates/.github/skills/vercel-react-best-practices/AGENTS.md +0 -0
  163. package/templates/.github/skills/vercel-react-best-practices/SKILL.md +0 -0
  164. package/templates/.github/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -0
  165. package/templates/.github/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -0
  166. package/templates/.github/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -0
  167. package/templates/.github/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -0
  168. package/templates/.github/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -0
  169. package/templates/.github/skills/vercel-react-best-practices/rules/async-parallel.md +0 -0
  170. package/templates/.github/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -0
  171. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -0
  172. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -0
  173. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -0
  174. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -0
  175. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -0
  176. package/templates/.github/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -0
  177. package/templates/.github/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -0
  178. package/templates/.github/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -0
  179. package/templates/.github/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -0
  180. package/templates/.github/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -0
  181. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -0
  182. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -0
  183. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -0
  184. package/templates/.github/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -0
  185. package/templates/.github/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -0
  186. package/templates/.github/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -0
  187. package/templates/.github/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -0
  188. package/templates/.github/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -0
  189. package/templates/.github/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -0
  190. package/templates/.github/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -0
  191. package/templates/.github/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -0
  192. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -0
  193. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -0
  194. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -0
  195. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -0
  196. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -0
  197. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -0
  198. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -0
  199. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -0
  200. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -0
  201. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -0
  202. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -0
  203. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -0
  204. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -0
  205. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -0
  206. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -0
  207. package/templates/.github/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -0
  208. package/templates/.github/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -0
  209. package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -0
  210. package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -0
  211. package/templates/.github/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -0
  212. package/templates/.github/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -0
  213. package/templates/.github/skills/vercel-react-best-practices/rules/server-serialization.md +0 -0
  214. package/templates/.github/skills/web-design-guidelines/SKILL.md +0 -0
  215. package/templates/.vscode/settings.json +16 -16
  216. package/templates/AGENTS.md +59 -98
  217. package/templates/Backlog.md +80 -80
  218. package/assets/beth-portrait-small.txt +0 -13
  219. package/assets/beth-portrait.txt +0 -60
  220. package/bin/beth-animation.sh +0 -155
  221. package/bin/lib/animation.js +0 -189
  222. package/bin/lib/pathValidation.js +0 -233
  223. package/bin/lib/pathValidation.test.js +0 -280
@@ -2,29 +2,14 @@
2
2
  * E2E tests for quickstart command.
3
3
  * Run with: node --test dist/cli/commands/quickstart.test.js
4
4
  */
5
- import { describe, it, beforeEach, afterEach } from 'node:test';
6
- import { beforeAll } from 'vitest';
5
+ import { describe, it, beforeEach, afterEach } from 'vitest';
7
6
  import assert from 'node:assert';
8
- import { execSync, spawnSync } from 'child_process';
9
- import { existsSync, mkdirSync, writeFileSync, rmSync, readdirSync } from 'fs';
10
- import { join, resolve, basename } from 'path';
7
+ import { spawnSync } from 'child_process';
8
+ import { existsSync, mkdirSync, writeFileSync, rmSync } from 'fs';
9
+ import { join, resolve } from 'path';
11
10
  import { tmpdir } from 'os';
12
11
  // Path to CLI
13
12
  const CLI_PATH = resolve(join(import.meta.dirname, '../../../bin/cli.js'));
14
- // Check if beads CLI is available for conditional tests
15
- function isBeadsInstalled() {
16
- try {
17
- execSync('bd --version', { stdio: 'ignore' });
18
- return true;
19
- }
20
- catch {
21
- return false;
22
- }
23
- }
24
- const BEADS_AVAILABLE = isBeadsInstalled();
25
- // Skip reason for tests requiring beads
26
- const SKIP_NO_BEADS = !BEADS_AVAILABLE ? 'beads CLI not installed' : false;
27
- const SKIP_BEADS_INSTALLED = BEADS_AVAILABLE ? 'beads CLI is installed, cannot test missing CLI' : false;
28
13
  /**
29
14
  * Run quickstart command in a directory
30
15
  */
@@ -67,60 +52,14 @@ function createSkillsDir(dir) {
67
52
  mkdirSync(skillsDir, { recursive: true });
68
53
  writeFileSync(join(skillsDir, 'SKILL.md'), '# Test Skill');
69
54
  }
70
- /**
71
- * Simulate beads initialization by creating .beads directory
72
- */
73
- function simulateBeadsInit(dir) {
74
- const beadsDir = join(dir, '.beads');
75
- mkdirSync(beadsDir, { recursive: true });
76
- // Create minimal beads structure
77
- writeFileSync(join(beadsDir, 'config.json'), JSON.stringify({ version: '1.0' }));
78
- }
79
55
  describe('quickstart command E2E', () => {
80
56
  let testDir;
81
- /**
82
- * Clean up orphaned Dolt databases from previous test runs.
83
- * When quickstart runs `bd init` in a temp directory, it creates a Dolt database
84
- * on the shared server (127.0.0.1:3307). If the test crashes or afterEach doesn't
85
- * run, these databases accumulate and can destabilize the server.
86
- */
87
- beforeAll(() => {
88
- if (!BEADS_AVAILABLE)
89
- return;
90
- try {
91
- const doltDir = join(process.cwd(), '.beads', 'dolt');
92
- if (!existsSync(doltDir))
93
- return;
94
- const orphans = readdirSync(doltDir).filter(d => d.startsWith('beth_quickstart_test_'));
95
- if (orphans.length === 0)
96
- return;
97
- for (const db of orphans) {
98
- try {
99
- rmSync(join(doltDir, db), { recursive: true, force: true });
100
- }
101
- catch { /* best effort */ }
102
- }
103
- }
104
- catch { /* not critical */ }
105
- });
106
57
  beforeEach(() => {
107
58
  // Create a temp directory for testing
108
59
  testDir = join(tmpdir(), `beth-quickstart-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
109
60
  mkdirSync(testDir, { recursive: true });
110
61
  });
111
62
  afterEach(() => {
112
- // Clean up Dolt database created by `bd init` during the test.
113
- // The database name is derived from the temp dir name (hyphens → underscores).
114
- if (BEADS_AVAILABLE && testDir) {
115
- try {
116
- const dbName = basename(testDir).replace(/-/g, '_');
117
- const dbPath = join(process.cwd(), '.beads', 'dolt', dbName);
118
- if (existsSync(dbPath)) {
119
- rmSync(dbPath, { recursive: true, force: true });
120
- }
121
- }
122
- catch { /* best effort cleanup */ }
123
- }
124
63
  // Clean up temp directory
125
64
  if (existsSync(testDir)) {
126
65
  rmSync(testDir, { recursive: true, force: true });
@@ -136,44 +75,15 @@ describe('quickstart command E2E', () => {
136
75
  });
137
76
  it('should detect Beth is initialized when .github/agents exists', () => {
138
77
  createBethProject(testDir);
139
- // Even if beads is missing, it should pass the Beth check first
140
78
  const result = runQuickstart(testDir);
141
- // Should show Beth is initialized (may fail later for beads)
79
+ // Should show Beth is initialized
142
80
  assert.ok(result.stdout.includes('Beth is initialized') || result.stdout.includes('✓'), 'Should confirm Beth is initialized');
143
81
  });
144
82
  });
145
- describe('beads CLI detection', () => {
146
- it('should detect missing beads CLI', { skip: SKIP_BEADS_INSTALLED }, () => {
147
- createBethProject(testDir);
148
- const result = runQuickstart(testDir);
149
- assert.strictEqual(result.status, 1, 'Should exit with status 1 when beads missing');
150
- assert.ok(result.stdout.includes('beads CLI not found') || result.stdout.includes('not found'), 'Should indicate beads CLI is not found');
151
- });
152
- });
153
- describe('beads initialization', () => {
154
- it('should detect uninitialized beads (no .beads directory)', { skip: SKIP_NO_BEADS }, () => {
155
- createBethProject(testDir);
156
- // Verify .beads doesn't exist initially
157
- assert.strictEqual(existsSync(join(testDir, '.beads')), false);
158
- // Note: quickstart will try to run `bd init` which may or may not succeed
159
- // depending on the environment. We're testing detection, not initialization.
160
- const result = runQuickstart(testDir);
161
- // The command should attempt to initialize beads or indicate it's not initialized
162
- assert.ok(result.stdout.includes('beads') || result.stdout.includes('Initializing'), 'Should mention beads in output');
163
- });
164
- it('should recognize existing beads initialization', { skip: SKIP_NO_BEADS }, () => {
165
- createBethProject(testDir);
166
- simulateBeadsInit(testDir);
167
- const result = runQuickstart(testDir);
168
- assert.ok(result.stdout.includes('beads already initialized') ||
169
- result.stdout.includes('already initialized'), 'Should indicate beads is already initialized');
170
- });
171
- });
172
83
  describe('Quick Start Guide output', () => {
173
- it('should show Quick Start Guide with VS Code instructions', { skip: SKIP_NO_BEADS }, () => {
84
+ it('should show Quick Start Guide with VS Code instructions', () => {
174
85
  createBethProject(testDir);
175
86
  createSkillsDir(testDir);
176
- simulateBeadsInit(testDir);
177
87
  const result = runQuickstart(testDir);
178
88
  // Check for Quick Start Guide section
179
89
  assert.ok(result.stdout.includes('Quick Start Guide'), 'Should show Quick Start Guide heading');
@@ -184,20 +94,18 @@ describe('quickstart command E2E', () => {
184
94
  // Check for @Beth instruction
185
95
  assert.ok(result.stdout.includes('@Beth'), 'Should mention @Beth');
186
96
  });
187
- it('should show Beth tagline quote', { skip: SKIP_NO_BEADS }, () => {
97
+ it('should show Beth tagline quote', () => {
188
98
  createBethProject(testDir);
189
99
  createSkillsDir(testDir);
190
- simulateBeadsInit(testDir);
191
100
  const result = runQuickstart(testDir);
192
101
  // Check for the tagline quote
193
102
  assert.ok(result.stdout.includes('They broke my wings and forgot I had claws'), 'Should show Beth tagline quote');
194
103
  });
195
104
  });
196
105
  describe('doctor integration', () => {
197
- it('should run doctor check and show results', { skip: SKIP_NO_BEADS }, () => {
106
+ it('should run doctor check and show results', () => {
198
107
  createBethProject(testDir);
199
108
  createSkillsDir(testDir);
200
- simulateBeadsInit(testDir);
201
109
  const result = runQuickstart(testDir);
202
110
  // Should show health check is running
203
111
  assert.ok(result.stdout.includes('health check') || result.stdout.includes('Running'), 'Should indicate health check is running');
@@ -206,10 +114,9 @@ describe('quickstart command E2E', () => {
206
114
  result.stdout.includes('agents') ||
207
115
  result.stdout.includes('✓'), 'Should show doctor check results');
208
116
  });
209
- it('should pass --verbose flag through to doctor command', { skip: SKIP_NO_BEADS }, () => {
117
+ it('should pass --verbose flag through to doctor command', () => {
210
118
  createBethProject(testDir);
211
119
  createSkillsDir(testDir);
212
- simulateBeadsInit(testDir);
213
120
  // Run with verbose flag
214
121
  const verboseResult = runQuickstart(testDir, ['--verbose']);
215
122
  // Verbose output should be longer or contain more details
@@ -220,11 +127,10 @@ describe('quickstart command E2E', () => {
220
127
  });
221
128
  });
222
129
  describe('full success scenario', () => {
223
- it('should succeed in fully initialized project', { skip: SKIP_NO_BEADS }, () => {
130
+ it('should succeed in fully initialized project', () => {
224
131
  // Create complete project structure
225
132
  createBethProject(testDir);
226
133
  createSkillsDir(testDir);
227
- simulateBeadsInit(testDir);
228
134
  // Also create AGENTS.md and Backlog.md
229
135
  writeFileSync(join(testDir, 'AGENTS.md'), '# Agent Instructions');
230
136
  writeFileSync(join(testDir, 'Backlog.md'), '# Backlog');
@@ -1 +1 @@
1
- {"version":3,"file":"quickstart.test.js","sourceRoot":"","sources":["../../../src/cli/commands/quickstart.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,cAAc;AACd,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAE3E,wDAAwD;AACxD,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAG,gBAAgB,EAAE,CAAC;AAE3C,wCAAwC;AACxC,MAAM,aAAa,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3E,MAAM,oBAAoB,GAAG,eAAe,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC,KAAK,CAAC;AAEzG;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW,EAAE,OAAiB,EAAE;IACrD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,EAAE;QAClE,GAAG;QACH,QAAQ,EAAE,OAAO;QACjB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE;KAC1C,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,mCAAmC;IACnC,MAAM,SAAS,GAAG;;;;;;;;;CASnB,CAAC;IACA,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC/D,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,iCAAiC;IACjC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,OAAe,CAAC;IAEpB;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe;YAAE,OAAO;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,OAAO;YACjC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACjC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,sCAAsC;QACtC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,wBAAwB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtG,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,+DAA+D;QAC/D,+EAA+E;QAC/E,IAAI,eAAe,IAAI,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC7D,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACvC,CAAC;QACD,0BAA0B;QAC1B,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,oCAAoC;YACpC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,2BAA2B,CAAC,CAAC;YAClE,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAC3F,yCAAyC,CAC1C,CAAC;YACF,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAC/C,qCAAqC,CACtC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,gEAAgE;YAChE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,6DAA6D;YAC7D,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC5E,oCAAoC,CACrC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,iCAAiC,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,GAAG,EAAE;YACzE,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,8CAA8C,CAAC,CAAC;YACrF,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EACpF,wCAAwC,CACzC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,yDAAyD,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE;YAC1F,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,wCAAwC;YACxC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAE/D,0EAA0E;YAC1E,6EAA6E;YAC7E,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,kFAAkF;YAClF,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EACzE,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE;YACjF,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAC;gBACnD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAC7C,8CAA8C,CAC/C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,yDAAyD,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE;YAC1F,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,sCAAsC;YACtC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAC3C,uCAAuC,CACxC,CAAC;YAEF,iCAAiC;YACjC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAChF,wBAAwB,CACzB,CAAC;YAEF,qCAAqC;YACrC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC9E,sCAAsC,CACvC,CAAC;YAEF,8BAA8B;YAC9B,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC/B,sBAAsB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE;YACjE,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,8BAA8B;YAC9B,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,4CAA4C,CAAC,EACpE,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,0CAA0C,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE;YAC3E,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,sCAAsC;YACtC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC3E,yCAAyC,CAC1C,CAAC;YAEF,2CAA2C;YAC3C,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAChC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC3B,kCAAkC,CACnC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE;YACvF,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,wBAAwB;YACxB,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;YAE5D,0DAA0D;YAC1D,kCAAkC;YAClC,MAAM,CAAC,EAAE,CACP,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAChF,yCAAyC,CAC1C,CAAC;YAEF,sDAAsD;YACtD,+CAA+C;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,6CAA6C,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE;YAC9E,oCAAoC;YACpC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,eAAe,CAAC,OAAO,CAAC,CAAC;YACzB,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE3B,yCAAyC;YACzC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAClE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,CAAC;YAExD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,yBAAyB;YACzB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,2BAA2B,CAAC,CAAC;YAElE,iCAAiC;YACjC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAC5E,gCAAgC,CACjC,CAAC;YAEF,yCAAyC;YACzC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAC3C,sCAAsC,CACvC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,wDAAwD;YACxD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YAEtC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,kCAAkC,CAAC,CAAC;YACnE,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAC3E,kCAAkC,CACnC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EACzC,oCAAoC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAEtC,wCAAwC;QACxC,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC1D,6BAA6B,CAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"quickstart.test.js","sourceRoot":"","sources":["../../../src/cli/commands/quickstart.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Update Command
3
+ *
4
+ * Updates project files to the latest Beth templates.
5
+ * Compares installed files against the package templates and
6
+ * copies new or updated files into the project.
7
+ *
8
+ * Behavior:
9
+ * - New files (exist in template but not in project) → always installed
10
+ * - Unchanged files (content matches template) → skipped
11
+ * - User-modified files (content differs from template):
12
+ * - Without --force → skipped with warning
13
+ * - With --force → overwritten
14
+ * - --check-only → reports status without modifying anything
15
+ * - --verbose → shows per-file detail
16
+ *
17
+ * Options:
18
+ * --check-only Report update status without modifying files
19
+ * --force Overwrite user-modified files with template versions
20
+ * --verbose Show per-file detail
21
+ */
22
+ export interface UpdateOptions {
23
+ checkOnly?: boolean;
24
+ force?: boolean;
25
+ verbose?: boolean;
26
+ }
27
+ /**
28
+ * Parse update command arguments from raw argv.
29
+ */
30
+ export declare function parseUpdateArgs(rawArgs: string[]): UpdateOptions;
31
+ /**
32
+ * Main update command.
33
+ */
34
+ export declare function update(rawArgs: string[]): Promise<void>;
35
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAgBH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAYD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,CAQhE;AA+DD;;GAEG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJ7D"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * E2E tests for the update command.
3
+ * Run with: npx vitest run src/cli/commands/update.e2e.test.ts
4
+ *
5
+ * beth-r08.6: Validates `npx beth-copilot update` behavior end-to-end.
6
+ *
7
+ * Test scenarios:
8
+ * 1. Command is recognized (not rejected as unknown)
9
+ * 2. Listed in help output
10
+ * 3. --check-only reports version status without modifying files
11
+ * 4. Reports "already up to date" when templates match
12
+ * 5. Shows update summary with --verbose
13
+ * 6. --force overwrites existing files
14
+ * 7. Does not overwrite user-modified files without --force
15
+ * 8. Handles network errors gracefully (npm registry unreachable)
16
+ * 9. Exits with code 0 on success, non-zero on failure
17
+ * 10. Installs new agent/skill files that did not exist before
18
+ *
19
+ * These tests exercise the real CLI binary in temp directories.
20
+ * They do NOT hit the npm registry — network calls are tested
21
+ * separately or mocked via env vars.
22
+ */
23
+ export {};
24
+ //# sourceMappingURL=update.e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
@@ -0,0 +1,240 @@
1
+ /**
2
+ * E2E tests for the update command.
3
+ * Run with: npx vitest run src/cli/commands/update.e2e.test.ts
4
+ *
5
+ * beth-r08.6: Validates `npx beth-copilot update` behavior end-to-end.
6
+ *
7
+ * Test scenarios:
8
+ * 1. Command is recognized (not rejected as unknown)
9
+ * 2. Listed in help output
10
+ * 3. --check-only reports version status without modifying files
11
+ * 4. Reports "already up to date" when templates match
12
+ * 5. Shows update summary with --verbose
13
+ * 6. --force overwrites existing files
14
+ * 7. Does not overwrite user-modified files without --force
15
+ * 8. Handles network errors gracefully (npm registry unreachable)
16
+ * 9. Exits with code 0 on success, non-zero on failure
17
+ * 10. Installs new agent/skill files that did not exist before
18
+ *
19
+ * These tests exercise the real CLI binary in temp directories.
20
+ * They do NOT hit the npm registry — network calls are tested
21
+ * separately or mocked via env vars.
22
+ */
23
+ import { describe, it, beforeEach, afterEach } from 'vitest';
24
+ import assert from 'node:assert';
25
+ import { execSync } from 'child_process';
26
+ import { existsSync, mkdirSync, writeFileSync, rmSync, readFileSync, readdirSync, } from 'fs';
27
+ import { join, resolve } from 'path';
28
+ import { tmpdir } from 'os';
29
+ const CLI_PATH = resolve(join(import.meta.dirname, '..', '..', '..', 'bin', 'cli.js'));
30
+ /**
31
+ * Run a CLI command and capture output.
32
+ */
33
+ function runCli(args, options = {}) {
34
+ try {
35
+ const stdout = execSync(`node "${CLI_PATH}" ${args}`, {
36
+ cwd: options.cwd,
37
+ encoding: 'utf-8',
38
+ env: { ...process.env, NO_COLOR: '1', ...options.env },
39
+ stdio: ['pipe', 'pipe', 'pipe'],
40
+ timeout: 30000,
41
+ });
42
+ return { stdout, stderr: '', code: 0 };
43
+ }
44
+ catch (error) {
45
+ const e = error;
46
+ return { stdout: e.stdout || '', stderr: e.stderr || '', code: e.status || 1 };
47
+ }
48
+ }
49
+ /**
50
+ * Initialize a temp directory with a minimal beth installation
51
+ * (simulates a project that previously ran `init`).
52
+ */
53
+ function setupInstalledProject(dir) {
54
+ // Create .github/agents with a sample agent
55
+ const agentsDir = join(dir, '.github', 'agents');
56
+ mkdirSync(agentsDir, { recursive: true });
57
+ writeFileSync(join(agentsDir, 'beth.agent.md'), `---
58
+ name: Beth
59
+ description: Orchestrator
60
+ model: Claude Opus 4.6
61
+ tools:
62
+ - runSubagent
63
+ ---
64
+
65
+ # Beth
66
+ `);
67
+ // Create .github/skills with a sample skill
68
+ const skillDir = join(dir, '.github', 'skills', 'prd');
69
+ mkdirSync(skillDir, { recursive: true });
70
+ writeFileSync(join(skillDir, 'SKILL.md'), '# PRD Skill\n');
71
+ // Create AGENTS.md
72
+ writeFileSync(join(dir, 'AGENTS.md'), '# Agent Instructions\n');
73
+ // Create package.json (needed for version detection)
74
+ writeFileSync(join(dir, 'package.json'), JSON.stringify({ name: 'test-project', version: '1.0.0' }, null, 2));
75
+ }
76
+ // ─────────────────────────────────────────────────────────
77
+ // Test suites
78
+ // ─────────────────────────────────────────────────────────
79
+ // Skipped: update command not yet implemented in bin/cli.js (beth-r08).
80
+ // Unskip once `case 'update'` is wired into the CLI entrypoint.
81
+ describe.skip('update command E2E', () => {
82
+ let testDir;
83
+ beforeEach(() => {
84
+ testDir = join(tmpdir(), `beth-update-e2e-${Date.now()}-${Math.random().toString(36).slice(2)}`);
85
+ mkdirSync(testDir, { recursive: true });
86
+ });
87
+ afterEach(() => {
88
+ if (existsSync(testDir)) {
89
+ rmSync(testDir, { recursive: true, force: true });
90
+ }
91
+ });
92
+ // ── 1. Command recognition ──────────────────────────────
93
+ describe('command recognition', () => {
94
+ it('should accept "update" as a valid command (not rejected as unknown)', () => {
95
+ // When update is implemented, this should NOT return the
96
+ // "Unknown command" error that unrecognized commands get.
97
+ const result = runCli('update --check-only', { cwd: testDir });
98
+ // The command should either succeed or fail for a reason
99
+ // OTHER than "unknown command" or "unknown flag". Without this
100
+ // dual check, the test passes vacuously when the CLI rejects
101
+ // --check-only as an unknown flag before it ever dispatches.
102
+ const combined = result.stdout + result.stderr;
103
+ const isRejected = /unknown (command|flag)/i.test(combined);
104
+ assert.strictEqual(isRejected, false, '"update --check-only" should be recognized — not rejected as unknown command or unknown flag');
105
+ });
106
+ });
107
+ // ── 2. Help integration ─────────────────────────────────
108
+ describe('help integration', () => {
109
+ it('should list the update command in help output', () => {
110
+ const result = runCli('help');
111
+ assert.ok(result.stdout.includes('update'), 'Help output should mention the update command');
112
+ });
113
+ });
114
+ // ── 3. --check-only flag ────────────────────────────────
115
+ describe('--check-only flag', () => {
116
+ it('should report version status without modifying any files', () => {
117
+ setupInstalledProject(testDir);
118
+ // Snapshot file state before
119
+ const agentBefore = readFileSync(join(testDir, '.github', 'agents', 'beth.agent.md'), 'utf-8');
120
+ const result = runCli('update --check-only', { cwd: testDir });
121
+ // File should be unchanged
122
+ const agentAfter = readFileSync(join(testDir, '.github', 'agents', 'beth.agent.md'), 'utf-8');
123
+ assert.strictEqual(agentBefore, agentAfter, '--check-only should not modify any files');
124
+ // Should output version information
125
+ assert.ok(result.stdout.includes('version') ||
126
+ result.stdout.includes('up to date') ||
127
+ result.stdout.includes('available'), '--check-only should report version status');
128
+ });
129
+ it('should exit with code 0 when check succeeds', () => {
130
+ setupInstalledProject(testDir);
131
+ const result = runCli('update --check-only', { cwd: testDir });
132
+ assert.strictEqual(result.code, 0, '--check-only should exit 0 on success');
133
+ });
134
+ });
135
+ // ── 4. Already up to date ───────────────────────────────
136
+ describe('already up to date', () => {
137
+ it('should report when no update is available', () => {
138
+ setupInstalledProject(testDir);
139
+ // Run update (templates should match since they came from the same version)
140
+ const result = runCli('update', { cwd: testDir });
141
+ // Should indicate that things are current or that update completed
142
+ const indicatesStatus = result.stdout.includes('up to date') ||
143
+ result.stdout.includes('already') ||
144
+ result.stdout.includes('Updated') ||
145
+ result.stdout.includes('installed');
146
+ assert.ok(indicatesStatus, 'Should report update status');
147
+ });
148
+ });
149
+ // ── 5. --verbose flag ──────────────────────────────────
150
+ describe('--verbose flag', () => {
151
+ it('should show additional detail with --verbose', () => {
152
+ setupInstalledProject(testDir);
153
+ const normal = runCli('update --check-only', { cwd: testDir });
154
+ const verbose = runCli('update --check-only --verbose', { cwd: testDir });
155
+ // Verbose output should be equal or longer than normal output
156
+ assert.ok(verbose.stdout.length >= normal.stdout.length, '--verbose should produce equal or more output than default');
157
+ });
158
+ });
159
+ // ── 6. --force flag ────────────────────────────────────
160
+ describe('--force flag', () => {
161
+ it('should overwrite existing files when --force is used', () => {
162
+ setupInstalledProject(testDir);
163
+ // Modify a file to simulate user customization
164
+ const agentPath = join(testDir, '.github', 'agents', 'beth.agent.md');
165
+ writeFileSync(agentPath, 'USER CUSTOMIZED CONTENT');
166
+ runCli('update --force', { cwd: testDir });
167
+ // With --force, the file should be overwritten with the template version
168
+ const afterContent = readFileSync(agentPath, 'utf-8');
169
+ assert.notStrictEqual(afterContent, 'USER CUSTOMIZED CONTENT', '--force should overwrite user-modified files with template versions');
170
+ });
171
+ });
172
+ // ── 7. Preserve user modifications ──────────────────────
173
+ describe('preserve user modifications', () => {
174
+ it('should not overwrite user-modified files without --force', () => {
175
+ setupInstalledProject(testDir);
176
+ // Modify a file to simulate user customization
177
+ const agentPath = join(testDir, '.github', 'agents', 'beth.agent.md');
178
+ writeFileSync(agentPath, 'USER CUSTOMIZED CONTENT');
179
+ const result = runCli('update', { cwd: testDir });
180
+ // Without --force, the user's customization should be preserved
181
+ const afterContent = readFileSync(agentPath, 'utf-8');
182
+ assert.strictEqual(afterContent, 'USER CUSTOMIZED CONTENT', 'Should preserve user-modified files without --force');
183
+ // Should warn the user that files were skipped
184
+ const mentionsSkipped = result.stdout.includes('skip') ||
185
+ result.stdout.includes('Skip') ||
186
+ result.stdout.includes('modified') ||
187
+ result.stdout.includes('preserved');
188
+ assert.ok(mentionsSkipped, 'Should mention that user-modified files were skipped');
189
+ });
190
+ });
191
+ // ── 8. Network error handling ───────────────────────────
192
+ describe('network error handling', () => {
193
+ it('should handle npm registry being unreachable gracefully', () => {
194
+ setupInstalledProject(testDir);
195
+ // Use a bogus registry URL to simulate network failure
196
+ const result = runCli('update --check-only', {
197
+ cwd: testDir,
198
+ env: { npm_config_registry: 'http://localhost:1' },
199
+ });
200
+ // Should not crash — either succeeds with cached data or
201
+ // reports the error cleanly
202
+ const crashed = result.stderr.includes('Unhandled') ||
203
+ result.stderr.includes('FATAL');
204
+ assert.strictEqual(crashed, false, 'Should handle network errors without crashing');
205
+ });
206
+ });
207
+ // ── 9. Exit codes ──────────────────────────────────────
208
+ describe('exit codes', () => {
209
+ it('should exit with code 0 on successful update', () => {
210
+ setupInstalledProject(testDir);
211
+ const result = runCli('update', { cwd: testDir });
212
+ assert.strictEqual(result.code, 0, 'Successful update should exit with code 0');
213
+ });
214
+ });
215
+ // ── 10. New files added by update ───────────────────────
216
+ describe('new template files', () => {
217
+ it('should install new agent files that did not exist before', () => {
218
+ setupInstalledProject(testDir);
219
+ // Setup creates only beth.agent.md — update should add more
220
+ const agentsDir = join(testDir, '.github', 'agents');
221
+ const beforeCount = readdirSync(agentsDir).filter(f => f.endsWith('.agent.md')).length;
222
+ runCli('update', { cwd: testDir });
223
+ const afterCount = readdirSync(agentsDir).filter(f => f.endsWith('.agent.md')).length;
224
+ assert.ok(afterCount > beforeCount, `Update should install new agent files. Before: ${beforeCount}, after: ${afterCount}`);
225
+ });
226
+ it('should install new skill directories that did not exist before', () => {
227
+ setupInstalledProject(testDir);
228
+ // Setup creates only prd/ — update should add more
229
+ const skillsDir = join(testDir, '.github', 'skills');
230
+ const beforeCount = readdirSync(skillsDir, { withFileTypes: true })
231
+ .filter(d => d.isDirectory()).length;
232
+ runCli('update', { cwd: testDir });
233
+ assert.ok(existsSync(skillsDir), 'Skills directory should exist after update');
234
+ const afterCount = readdirSync(skillsDir, { withFileTypes: true })
235
+ .filter(d => d.isDirectory()).length;
236
+ assert.ok(afterCount > beforeCount, `Update should install new skill dirs. Before: ${beforeCount}, after: ${afterCount}`);
237
+ });
238
+ });
239
+ });
240
+ //# sourceMappingURL=update.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.e2e.test.js","sourceRoot":"","sources":["../../../src/cli/commands/update.e2e.test.ts"],"names":[],"mappings":"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"}