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.
- package/CHANGELOG.md +39 -1
- package/README.md +51 -62
- package/assets/beth-questioning.png +0 -0
- package/assets/yellowstone-beth.png +0 -0
- package/bin/cli.js +19 -410
- package/dist/__tests__/inject-skills.test.d.ts +9 -0
- package/dist/__tests__/inject-skills.test.d.ts.map +1 -0
- package/dist/__tests__/inject-skills.test.js +143 -0
- package/dist/__tests__/inject-skills.test.js.map +1 -0
- package/dist/__tests__/skills/disambiguation.test.d.ts +10 -0
- package/dist/__tests__/skills/disambiguation.test.d.ts.map +1 -0
- package/dist/__tests__/skills/disambiguation.test.js +192 -0
- package/dist/__tests__/skills/disambiguation.test.js.map +1 -0
- package/dist/__tests__/skills/hook-injection.test.d.ts +11 -0
- package/dist/__tests__/skills/hook-injection.test.d.ts.map +1 -0
- package/dist/__tests__/skills/hook-injection.test.js +173 -0
- package/dist/__tests__/skills/hook-injection.test.js.map +1 -0
- package/dist/__tests__/skills/mapping-completeness.test.d.ts +17 -0
- package/dist/__tests__/skills/mapping-completeness.test.d.ts.map +1 -0
- package/dist/__tests__/skills/mapping-completeness.test.js +281 -0
- package/dist/__tests__/skills/mapping-completeness.test.js.map +1 -0
- package/dist/__tests__/skills/pipeline-integration.test.d.ts +18 -0
- package/dist/__tests__/skills/pipeline-integration.test.d.ts.map +1 -0
- package/dist/__tests__/skills/pipeline-integration.test.js +234 -0
- package/dist/__tests__/skills/pipeline-integration.test.js.map +1 -0
- package/dist/__tests__/skills/skill-routing.test.d.ts +15 -0
- package/dist/__tests__/skills/skill-routing.test.d.ts.map +1 -0
- package/dist/__tests__/skills/skill-routing.test.js +723 -0
- package/dist/__tests__/skills/skill-routing.test.js.map +1 -0
- package/dist/__tests__/skills/trigger-coverage.test.d.ts +24 -0
- package/dist/__tests__/skills/trigger-coverage.test.d.ts.map +1 -0
- package/dist/__tests__/skills/trigger-coverage.test.js +746 -0
- package/dist/__tests__/skills/trigger-coverage.test.js.map +1 -0
- package/dist/__tests__/smoke.test.js +13 -0
- package/dist/__tests__/smoke.test.js.map +1 -1
- package/dist/__tests__/verify-skills.test.d.ts +9 -0
- package/dist/__tests__/verify-skills.test.d.ts.map +1 -0
- package/dist/__tests__/verify-skills.test.js +78 -0
- package/dist/__tests__/verify-skills.test.js.map +1 -0
- package/dist/cli/commands/beads.e2e.test.d.ts +4 -2
- package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -1
- package/dist/cli/commands/beads.e2e.test.js +97 -38
- package/dist/cli/commands/beads.e2e.test.js.map +1 -1
- package/dist/cli/commands/cli-edge-cases.e2e.test.js +1 -1
- package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -1
- package/dist/cli/commands/close.d.ts +11 -46
- package/dist/cli/commands/close.d.ts.map +1 -1
- package/dist/cli/commands/close.e2e.test.d.ts +4 -20
- package/dist/cli/commands/close.e2e.test.d.ts.map +1 -1
- package/dist/cli/commands/close.e2e.test.js +23 -204
- package/dist/cli/commands/close.e2e.test.js.map +1 -1
- package/dist/cli/commands/close.js +26 -240
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/close.test.d.ts +7 -9
- package/dist/cli/commands/close.test.d.ts.map +1 -1
- package/dist/cli/commands/close.test.js +44 -424
- package/dist/cli/commands/close.test.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +5 -22
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.e2e.test.js +3 -59
- package/dist/cli/commands/doctor.e2e.test.js.map +1 -1
- package/dist/cli/commands/doctor.js +38 -111
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/doctor.test.js +32 -234
- package/dist/cli/commands/doctor.test.js.map +1 -1
- package/dist/cli/commands/framework-isolation.test.d.ts +1 -1
- package/dist/cli/commands/framework-isolation.test.js +2 -3
- package/dist/cli/commands/framework-isolation.test.js.map +1 -1
- package/dist/cli/commands/help.e2e.test.js +1 -5
- package/dist/cli/commands/help.e2e.test.js.map +1 -1
- package/dist/cli/commands/init-logic.e2e.test.js +12 -2
- package/dist/cli/commands/init-logic.e2e.test.js.map +1 -1
- package/dist/cli/commands/init.test.js +4 -21
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/land.d.ts +3 -15
- package/dist/cli/commands/land.d.ts.map +1 -1
- package/dist/cli/commands/land.js +13 -68
- package/dist/cli/commands/land.js.map +1 -1
- package/dist/cli/commands/land.test.d.ts +0 -1
- package/dist/cli/commands/land.test.d.ts.map +1 -1
- package/dist/cli/commands/land.test.js +2 -57
- package/dist/cli/commands/land.test.js.map +1 -1
- package/dist/cli/commands/mcp.e2e.test.js +3 -3
- package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
- package/dist/cli/commands/pipeline.e2e.test.js +23 -26
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.d.ts +2 -12
- package/dist/cli/commands/pre-push-guard.d.ts.map +1 -1
- package/dist/cli/commands/pre-push-guard.e2e.test.js +1 -1
- package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.js +2 -47
- package/dist/cli/commands/pre-push-guard.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.test.d.ts +0 -1
- package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -1
- package/dist/cli/commands/pre-push-guard.test.js +15 -98
- package/dist/cli/commands/pre-push-guard.test.js.map +1 -1
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +1 -1
- package/dist/cli/commands/quickstart-expanded.e2e.test.js +3 -30
- package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -1
- package/dist/cli/commands/quickstart.d.ts +0 -1
- package/dist/cli/commands/quickstart.d.ts.map +1 -1
- package/dist/cli/commands/quickstart.js +2 -60
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/quickstart.test.js +10 -104
- package/dist/cli/commands/quickstart.test.js.map +1 -1
- package/dist/cli/commands/update.d.ts +35 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.e2e.test.d.ts +24 -0
- package/dist/cli/commands/update.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/update.e2e.test.js +240 -0
- package/dist/cli/commands/update.e2e.test.js.map +1 -0
- package/dist/cli/commands/update.js +255 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/core/agents/frontmatter.test.js +1 -1
- package/dist/core/agents/frontmatter.test.js.map +1 -1
- package/dist/core/agents/handoffs.test.js +1 -1
- package/dist/core/agents/handoffs.test.js.map +1 -1
- package/dist/core/agents/loader.d.ts +4 -2
- package/dist/core/agents/loader.d.ts.map +1 -1
- package/dist/core/agents/loader.js +5 -3
- package/dist/core/agents/loader.js.map +1 -1
- package/dist/core/agents/loader.test.js +42 -4
- package/dist/core/agents/loader.test.js.map +1 -1
- package/dist/core/agents/suite.test.js +8 -7
- package/dist/core/agents/suite.test.js.map +1 -1
- package/dist/core/agents/tools.test.js +10 -8
- package/dist/core/agents/tools.test.js.map +1 -1
- package/dist/core/agents/types.test.js +1 -1
- package/dist/core/agents/types.test.js.map +1 -1
- package/dist/core/skills/loader.test.js +1 -1
- package/dist/core/skills/loader.test.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/pathValidation.d.ts +0 -5
- package/dist/lib/pathValidation.d.ts.map +1 -1
- package/dist/lib/pathValidation.js +0 -11
- package/dist/lib/pathValidation.js.map +1 -1
- package/dist/lib/pathValidation.test.js +2 -14
- package/dist/lib/pathValidation.test.js.map +1 -1
- package/package.json +3 -6
- package/sbom.json +259 -371
- package/templates/.github/agents/beth.agent.md +194 -122
- package/templates/.github/agents/developer.agent.md +30 -22
- package/templates/.github/agents/product-manager.agent.md +15 -6
- package/templates/.github/agents/researcher.agent.md +10 -7
- package/templates/.github/agents/security-reviewer.agent.md +16 -7
- package/templates/.github/agents/tester.agent.md +16 -8
- package/templates/.github/agents/ux-designer.agent.md +12 -9
- package/templates/.github/copilot-instructions.md +33 -4
- package/templates/.github/copilot-mcp-config.json +12 -0
- package/templates/.github/dependabot.yml +68 -0
- package/templates/.github/hooks/scripts/inject-skills.mjs +139 -0
- package/templates/.github/hooks/scripts/verify-skills.mjs +47 -0
- package/templates/.github/hooks/skill-enforcement.json +18 -0
- package/templates/.github/pull_request_template.md +48 -0
- package/templates/.github/skills/framer-components/SKILL.md +0 -0
- package/templates/.github/skills/prd/SKILL.md +0 -0
- package/templates/.github/skills/security-analysis/SKILL.md +798 -798
- package/templates/.github/skills/shadcn-ui/SKILL.md +561 -561
- package/templates/.github/skills/vercel-react-best-practices/AGENTS.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/SKILL.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-parallel.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -0
- package/templates/.github/skills/vercel-react-best-practices/rules/server-serialization.md +0 -0
- package/templates/.github/skills/web-design-guidelines/SKILL.md +0 -0
- package/templates/.vscode/settings.json +16 -16
- package/templates/AGENTS.md +59 -98
- package/templates/Backlog.md +80 -80
- package/assets/beth-portrait-small.txt +0 -13
- package/assets/beth-portrait.txt +0 -60
- package/bin/beth-animation.sh +0 -155
- package/bin/lib/animation.js +0 -189
- package/bin/lib/pathValidation.js +0 -233
- 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 '
|
|
6
|
-
import { beforeAll } from 'vitest';
|
|
5
|
+
import { describe, it, beforeEach, afterEach } from 'vitest';
|
|
7
6
|
import assert from 'node:assert';
|
|
8
|
-
import {
|
|
9
|
-
import { existsSync, mkdirSync, writeFileSync, rmSync
|
|
10
|
-
import { join, resolve
|
|
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
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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":"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"}
|
|
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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"}
|