beth-copilot 1.0.18 → 1.1.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 +41 -28
- package/README.md +87 -247
- package/bin/cli.js +158 -358
- package/dist/__tests__/smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke.test.js +49 -0
- package/dist/__tests__/smoke.test.js.map +1 -0
- package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
- package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/beads.e2e.test.js +526 -0
- package/dist/cli/commands/beads.e2e.test.js.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
- package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.d.ts +89 -0
- package/dist/cli/commands/close.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.d.ts +27 -0
- package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/close.e2e.test.js +252 -0
- package/dist/cli/commands/close.e2e.test.js.map +1 -0
- package/dist/cli/commands/close.js +309 -0
- package/dist/cli/commands/close.js.map +1 -0
- package/dist/cli/commands/close.test.d.ts +15 -0
- package/dist/cli/commands/close.test.d.ts.map +1 -0
- package/dist/cli/commands/close.test.js +634 -0
- package/dist/cli/commands/close.test.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +23 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +93 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/doctor.test.js +209 -0
- package/dist/cli/commands/doctor.test.js.map +1 -1
- package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
- package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
- package/dist/cli/commands/framework-isolation.test.js +119 -0
- package/dist/cli/commands/framework-isolation.test.js.map +1 -0
- package/dist/cli/commands/help.e2e.test.js +4 -4
- package/dist/cli/commands/help.e2e.test.js.map +1 -1
- package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
- package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/init-logic.e2e.test.js +305 -0
- package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
- package/dist/cli/commands/land.d.ts +142 -0
- package/dist/cli/commands/land.d.ts.map +1 -0
- package/dist/cli/commands/land.js +647 -0
- package/dist/cli/commands/land.js.map +1 -0
- package/dist/cli/commands/land.test.d.ts +20 -0
- package/dist/cli/commands/land.test.d.ts.map +1 -0
- package/dist/cli/commands/land.test.js +622 -0
- package/dist/cli/commands/land.test.js.map +1 -0
- package/dist/cli/commands/mcp.e2e.test.js +22 -29
- package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
- package/dist/cli/commands/pipeline.e2e.test.js +20 -20
- package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
- package/dist/cli/commands/pre-push-guard.d.ts +84 -0
- package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
- package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.js +257 -0
- package/dist/cli/commands/pre-push-guard.js.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
- package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
- package/dist/cli/commands/pre-push-guard.test.js +397 -0
- package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
- package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
- package/dist/cli/commands/quickstart.d.ts.map +1 -1
- package/dist/cli/commands/quickstart.js +7 -23
- package/dist/cli/commands/quickstart.js.map +1 -1
- package/dist/cli/commands/quickstart.test.js +40 -67
- package/dist/cli/commands/quickstart.test.js.map +1 -1
- package/dist/core/agents/suite.test.js +4 -2
- package/dist/core/agents/suite.test.js.map +1 -1
- package/dist/core/agents/tools.test.js +5 -1
- package/dist/core/agents/tools.test.js.map +1 -1
- package/dist/index.d.ts +3 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -10
- package/dist/index.js.map +1 -1
- package/package.json +15 -9
- package/sbom.json +2011 -819
- package/templates/.github/agents/beth.agent.md +220 -66
- package/templates/.github/agents/developer.agent.md +53 -90
- package/templates/.github/agents/product-manager.agent.md +15 -68
- package/templates/.github/agents/researcher.agent.md +20 -71
- package/templates/.github/agents/security-reviewer.agent.md +29 -81
- package/templates/.github/agents/tester.agent.md +40 -69
- package/templates/.github/agents/ux-designer.agent.md +20 -74
- package/templates/.github/copilot-instructions.md +217 -225
- package/templates/AGENTS.md +108 -20
- package/templates/mcp.json.example +0 -3
- package/dist/cli/commands/client-config.d.ts +0 -31
- package/dist/cli/commands/client-config.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
- package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.e2e.test.js +0 -556
- package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
- package/dist/cli/commands/client-config.js +0 -73
- package/dist/cli/commands/client-config.js.map +0 -1
- package/dist/cli/commands/client-config.test.d.ts +0 -6
- package/dist/cli/commands/client-config.test.d.ts.map +0 -1
- package/dist/cli/commands/client-config.test.js +0 -133
- package/dist/cli/commands/client-config.test.js.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
- package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
- package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
- package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
- package/dist/core/context.d.ts +0 -171
- package/dist/core/context.d.ts.map +0 -1
- package/dist/core/context.js +0 -353
- package/dist/core/context.js.map +0 -1
- package/dist/core/context.test.d.ts +0 -8
- package/dist/core/context.test.d.ts.map +0 -1
- package/dist/core/context.test.js +0 -253
- package/dist/core/context.test.js.map +0 -1
- package/dist/core/handoffs.d.ts +0 -151
- package/dist/core/handoffs.d.ts.map +0 -1
- package/dist/core/handoffs.js +0 -220
- package/dist/core/handoffs.js.map +0 -1
- package/dist/core/handoffs.test.d.ts +0 -8
- package/dist/core/handoffs.test.d.ts.map +0 -1
- package/dist/core/handoffs.test.js +0 -231
- package/dist/core/handoffs.test.js.map +0 -1
- package/dist/core/orchestrator.d.ts +0 -246
- package/dist/core/orchestrator.d.ts.map +0 -1
- package/dist/core/orchestrator.js +0 -514
- package/dist/core/orchestrator.js.map +0 -1
- package/dist/core/orchestrator.test.d.ts +0 -8
- package/dist/core/orchestrator.test.d.ts.map +0 -1
- package/dist/core/orchestrator.test.js +0 -517
- package/dist/core/orchestrator.test.js.map +0 -1
- package/dist/core/router.d.ts +0 -102
- package/dist/core/router.d.ts.map +0 -1
- package/dist/core/router.js +0 -178
- package/dist/core/router.js.map +0 -1
- package/dist/core/router.test.d.ts +0 -8
- package/dist/core/router.test.d.ts.map +0 -1
- package/dist/core/router.test.js +0 -215
- package/dist/core/router.test.js.map +0 -1
- package/dist/init.test.js +0 -288
- package/dist/providers/azure.d.ts +0 -147
- package/dist/providers/azure.d.ts.map +0 -1
- package/dist/providers/azure.js +0 -491
- package/dist/providers/azure.js.map +0 -1
- package/dist/providers/azure.test.d.ts +0 -11
- package/dist/providers/azure.test.d.ts.map +0 -1
- package/dist/providers/azure.test.js +0 -330
- package/dist/providers/azure.test.js.map +0 -1
- package/dist/providers/config.d.ts +0 -87
- package/dist/providers/config.d.ts.map +0 -1
- package/dist/providers/config.js +0 -193
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/config.test.d.ts +0 -7
- package/dist/providers/config.test.d.ts.map +0 -1
- package/dist/providers/config.test.js +0 -370
- package/dist/providers/config.test.js.map +0 -1
- package/dist/providers/index.d.ts +0 -18
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -14
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/interface.d.ts +0 -191
- package/dist/providers/interface.d.ts.map +0 -1
- package/dist/providers/interface.js +0 -94
- package/dist/providers/interface.js.map +0 -1
- package/dist/providers/retry.d.ts +0 -128
- package/dist/providers/retry.d.ts.map +0 -1
- package/dist/providers/retry.js +0 -205
- package/dist/providers/retry.js.map +0 -1
- package/dist/providers/retry.test.d.ts +0 -7
- package/dist/providers/retry.test.d.ts.map +0 -1
- package/dist/providers/retry.test.js +0 -439
- package/dist/providers/retry.test.js.map +0 -1
- package/dist/providers/streaming.d.ts +0 -157
- package/dist/providers/streaming.d.ts.map +0 -1
- package/dist/providers/streaming.js +0 -233
- package/dist/providers/streaming.js.map +0 -1
- package/dist/providers/streaming.test.d.ts +0 -7
- package/dist/providers/streaming.test.d.ts.map +0 -1
- package/dist/providers/streaming.test.js +0 -372
- package/dist/providers/streaming.test.js.map +0 -1
- package/dist/providers/types.d.ts +0 -209
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -53
- package/dist/providers/types.js.map +0 -1
- package/dist/providers/types.test.d.ts +0 -7
- package/dist/providers/types.test.d.ts.map +0 -1
- package/dist/providers/types.test.js +0 -141
- package/dist/providers/types.test.js.map +0 -1
- package/dist/tools/cli/beads.d.ts +0 -27
- package/dist/tools/cli/beads.d.ts.map +0 -1
- package/dist/tools/cli/beads.js +0 -172
- package/dist/tools/cli/beads.js.map +0 -1
- package/dist/tools/cli/beads.test.d.ts +0 -8
- package/dist/tools/cli/beads.test.d.ts.map +0 -1
- package/dist/tools/cli/beads.test.js +0 -264
- package/dist/tools/cli/beads.test.js.map +0 -1
- package/dist/tools/cli/editFile.d.ts +0 -17
- package/dist/tools/cli/editFile.d.ts.map +0 -1
- package/dist/tools/cli/editFile.js +0 -125
- package/dist/tools/cli/editFile.js.map +0 -1
- package/dist/tools/cli/editFile.test.d.ts +0 -8
- package/dist/tools/cli/editFile.test.d.ts.map +0 -1
- package/dist/tools/cli/editFile.test.js +0 -177
- package/dist/tools/cli/editFile.test.js.map +0 -1
- package/dist/tools/cli/readFile.d.ts +0 -25
- package/dist/tools/cli/readFile.d.ts.map +0 -1
- package/dist/tools/cli/readFile.js +0 -118
- package/dist/tools/cli/readFile.js.map +0 -1
- package/dist/tools/cli/readFile.test.d.ts +0 -8
- package/dist/tools/cli/readFile.test.d.ts.map +0 -1
- package/dist/tools/cli/readFile.test.js +0 -194
- package/dist/tools/cli/readFile.test.js.map +0 -1
- package/dist/tools/cli/search.d.ts +0 -16
- package/dist/tools/cli/search.d.ts.map +0 -1
- package/dist/tools/cli/search.js +0 -261
- package/dist/tools/cli/search.js.map +0 -1
- package/dist/tools/cli/search.test.d.ts +0 -8
- package/dist/tools/cli/search.test.d.ts.map +0 -1
- package/dist/tools/cli/search.test.js +0 -172
- package/dist/tools/cli/search.test.js.map +0 -1
- package/dist/tools/cli/subagent.d.ts +0 -43
- package/dist/tools/cli/subagent.d.ts.map +0 -1
- package/dist/tools/cli/subagent.js +0 -99
- package/dist/tools/cli/subagent.js.map +0 -1
- package/dist/tools/cli/subagent.test.d.ts +0 -8
- package/dist/tools/cli/subagent.test.d.ts.map +0 -1
- package/dist/tools/cli/subagent.test.js +0 -190
- package/dist/tools/cli/subagent.test.js.map +0 -1
- package/dist/tools/cli/terminal.d.ts +0 -19
- package/dist/tools/cli/terminal.d.ts.map +0 -1
- package/dist/tools/cli/terminal.js +0 -164
- package/dist/tools/cli/terminal.js.map +0 -1
- package/dist/tools/cli/terminal.test.d.ts +0 -8
- package/dist/tools/cli/terminal.test.d.ts.map +0 -1
- package/dist/tools/cli/terminal.test.js +0 -161
- package/dist/tools/cli/terminal.test.js.map +0 -1
- package/dist/tools/index.d.ts +0 -25
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -41
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/interface.d.ts +0 -64
- package/dist/tools/interface.d.ts.map +0 -1
- package/dist/tools/interface.js +0 -37
- package/dist/tools/interface.js.map +0 -1
- package/dist/tools/interface.test.d.ts +0 -7
- package/dist/tools/interface.test.d.ts.map +0 -1
- package/dist/tools/interface.test.js +0 -179
- package/dist/tools/interface.test.js.map +0 -1
- package/dist/tools/mcp/bridge.d.ts +0 -48
- package/dist/tools/mcp/bridge.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.js +0 -128
- package/dist/tools/mcp/bridge.js.map +0 -1
- package/dist/tools/mcp/bridge.test.d.ts +0 -8
- package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
- package/dist/tools/mcp/bridge.test.js +0 -300
- package/dist/tools/mcp/bridge.test.js.map +0 -1
- package/dist/tools/mcp/client.d.ts +0 -135
- package/dist/tools/mcp/client.d.ts.map +0 -1
- package/dist/tools/mcp/client.js +0 -263
- package/dist/tools/mcp/client.js.map +0 -1
- package/dist/tools/mcp/client.test.d.ts +0 -8
- package/dist/tools/mcp/client.test.d.ts.map +0 -1
- package/dist/tools/mcp/client.test.js +0 -390
- package/dist/tools/mcp/client.test.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -82
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -99
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/registry.test.d.ts +0 -7
- package/dist/tools/registry.test.d.ts.map +0 -1
- package/dist/tools/registry.test.js +0 -199
- package/dist/tools/registry.test.js.map +0 -1
- package/dist/tools/suite.test.d.ts +0 -11
- package/dist/tools/suite.test.d.ts.map +0 -1
- package/dist/tools/suite.test.js +0 -119
- package/dist/tools/suite.test.js.map +0 -1
- package/dist/tools/types.d.ts +0 -75
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -30
- package/dist/tools/types.js.map +0 -1
- package/dist/tools/types.test.d.ts +0 -7
- package/dist/tools/types.test.d.ts.map +0 -1
- package/dist/tools/types.test.js +0 -178
- package/dist/tools/types.test.js.map +0 -1
- package/templates/.vscode/mcp.json +0 -20
- package/templates/CLAUDE.md +0 -129
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E tests for each Beth client configuration.
|
|
3
|
-
*
|
|
4
|
-
* Tests the three supported client modes:
|
|
5
|
-
* - VS Code GitHub Copilot Chat (--client vscode)
|
|
6
|
-
* - GitHub Copilot CLI (--client copilot-cli)
|
|
7
|
-
* - Claude Code (--client claude-code)
|
|
8
|
-
*
|
|
9
|
-
* Each configuration installs a different set of files. These tests verify
|
|
10
|
-
* that each mode installs exactly what it should — and nothing extra.
|
|
11
|
-
*
|
|
12
|
-
* Run with: node --test dist/cli/commands/client-config.e2e.test.js
|
|
13
|
-
*/
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=client-config.e2e.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-config.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/client-config.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -1,556 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E tests for each Beth client configuration.
|
|
3
|
-
*
|
|
4
|
-
* Tests the three supported client modes:
|
|
5
|
-
* - VS Code GitHub Copilot Chat (--client vscode)
|
|
6
|
-
* - GitHub Copilot CLI (--client copilot-cli)
|
|
7
|
-
* - Claude Code (--client claude-code)
|
|
8
|
-
*
|
|
9
|
-
* Each configuration installs a different set of files. These tests verify
|
|
10
|
-
* that each mode installs exactly what it should — and nothing extra.
|
|
11
|
-
*
|
|
12
|
-
* Run with: node --test dist/cli/commands/client-config.e2e.test.js
|
|
13
|
-
*/
|
|
14
|
-
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
15
|
-
import assert from 'node:assert';
|
|
16
|
-
import { execSync } from 'child_process';
|
|
17
|
-
import { existsSync, mkdirSync, rmSync, readFileSync, readdirSync, writeFileSync, } from 'fs';
|
|
18
|
-
import { join, resolve } from 'path';
|
|
19
|
-
import { tmpdir } from 'os';
|
|
20
|
-
const CLI_PATH = resolve(join(import.meta.dirname, '..', '..', '..', 'bin', 'cli.js'));
|
|
21
|
-
// Expected template contents
|
|
22
|
-
const EXPECTED_AGENTS = [
|
|
23
|
-
'beth.agent.md',
|
|
24
|
-
'developer.agent.md',
|
|
25
|
-
'product-manager.agent.md',
|
|
26
|
-
'researcher.agent.md',
|
|
27
|
-
'security-reviewer.agent.md',
|
|
28
|
-
'tester.agent.md',
|
|
29
|
-
'ux-designer.agent.md',
|
|
30
|
-
];
|
|
31
|
-
const EXPECTED_SKILLS = [
|
|
32
|
-
'framer-components',
|
|
33
|
-
'prd',
|
|
34
|
-
'security-analysis',
|
|
35
|
-
'shadcn-ui',
|
|
36
|
-
'vercel-react-best-practices',
|
|
37
|
-
'web-design-guidelines',
|
|
38
|
-
];
|
|
39
|
-
/**
|
|
40
|
-
* Run the CLI init command with a specific --client flag.
|
|
41
|
-
*/
|
|
42
|
-
function runInit(cwd, clientMode, extraFlags = []) {
|
|
43
|
-
const flags = ['--skip-beads', '--client', clientMode, ...extraFlags];
|
|
44
|
-
const command = `node "${CLI_PATH}" init ${flags.join(' ')}`;
|
|
45
|
-
try {
|
|
46
|
-
const stdout = execSync(command, {
|
|
47
|
-
cwd,
|
|
48
|
-
encoding: 'utf-8',
|
|
49
|
-
env: { ...process.env, NO_COLOR: '1' },
|
|
50
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
51
|
-
});
|
|
52
|
-
return { stdout, stderr: '', code: 0 };
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
const e = error;
|
|
56
|
-
return { stdout: e.stdout || '', stderr: e.stderr || '', code: e.status || 1 };
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Run the CLI doctor command.
|
|
61
|
-
*/
|
|
62
|
-
function runDoctor(cwd) {
|
|
63
|
-
try {
|
|
64
|
-
const stdout = execSync(`node "${CLI_PATH}" doctor`, {
|
|
65
|
-
cwd,
|
|
66
|
-
encoding: 'utf-8',
|
|
67
|
-
env: { ...process.env, NO_COLOR: '1' },
|
|
68
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
69
|
-
});
|
|
70
|
-
return { stdout, stderr: '', code: 0 };
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
const e = error;
|
|
74
|
-
return { stdout: e.stdout || '', stderr: e.stderr || '', code: e.status || 1 };
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
78
|
-
// VS CODE + GITHUB COPILOT CHAT
|
|
79
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
80
|
-
describe('--client vscode (VS Code + GitHub Copilot Chat)', () => {
|
|
81
|
-
let testDir;
|
|
82
|
-
beforeEach(() => {
|
|
83
|
-
testDir = join(tmpdir(), `beth-vscode-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
84
|
-
mkdirSync(testDir, { recursive: true });
|
|
85
|
-
});
|
|
86
|
-
afterEach(() => {
|
|
87
|
-
if (existsSync(testDir)) {
|
|
88
|
-
rmSync(testDir, { recursive: true, force: true });
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
describe('installed file structure', () => {
|
|
92
|
-
it('should exit 0', () => {
|
|
93
|
-
const result = runInit(testDir, 'vscode');
|
|
94
|
-
assert.strictEqual(result.code, 0, `Init failed: ${result.stdout}\n${result.stderr}`);
|
|
95
|
-
});
|
|
96
|
-
it('should install all 7 agent definition files', () => {
|
|
97
|
-
runInit(testDir, 'vscode');
|
|
98
|
-
const agentsDir = join(testDir, '.github', 'agents');
|
|
99
|
-
assert.ok(existsSync(agentsDir), '.github/agents/ should exist');
|
|
100
|
-
const files = readdirSync(agentsDir).filter(f => f.endsWith('.agent.md')).sort();
|
|
101
|
-
assert.deepStrictEqual(files, EXPECTED_AGENTS, 'Should have all 7 agents');
|
|
102
|
-
});
|
|
103
|
-
it('should install all 6 skill directories with SKILL.md or AGENTS.md', () => {
|
|
104
|
-
runInit(testDir, 'vscode');
|
|
105
|
-
const skillsDir = join(testDir, '.github', 'skills');
|
|
106
|
-
assert.ok(existsSync(skillsDir), '.github/skills/ should exist');
|
|
107
|
-
const dirs = readdirSync(skillsDir)
|
|
108
|
-
.filter(f => {
|
|
109
|
-
const skillMd = join(skillsDir, f, 'SKILL.md');
|
|
110
|
-
const agentsMd = join(skillsDir, f, 'AGENTS.md');
|
|
111
|
-
return existsSync(skillMd) || existsSync(agentsMd);
|
|
112
|
-
})
|
|
113
|
-
.sort();
|
|
114
|
-
assert.deepStrictEqual(dirs, EXPECTED_SKILLS, 'Should have all 6 skills');
|
|
115
|
-
});
|
|
116
|
-
it('should install copilot-instructions.md', () => {
|
|
117
|
-
runInit(testDir, 'vscode');
|
|
118
|
-
const filepath = join(testDir, '.github', 'copilot-instructions.md');
|
|
119
|
-
assert.ok(existsSync(filepath), '.github/copilot-instructions.md should exist');
|
|
120
|
-
const content = readFileSync(filepath, 'utf-8');
|
|
121
|
-
assert.ok(content.includes('Agent'), 'copilot-instructions.md should reference agents');
|
|
122
|
-
});
|
|
123
|
-
it('should install .vscode/settings.json with required settings', () => {
|
|
124
|
-
runInit(testDir, 'vscode');
|
|
125
|
-
const settingsPath = join(testDir, '.vscode', 'settings.json');
|
|
126
|
-
assert.ok(existsSync(settingsPath), '.vscode/settings.json should exist');
|
|
127
|
-
const content = readFileSync(settingsPath, 'utf-8');
|
|
128
|
-
// Strip JSONC comments
|
|
129
|
-
const stripped = content.replace(/\/\/.*$/gm, '').replace(/\/\*[\s\S]*?\*\//g, '');
|
|
130
|
-
const settings = JSON.parse(stripped);
|
|
131
|
-
assert.strictEqual(settings['chat.customAgentInSubagent.enabled'], true, 'Should enable subagent delegation');
|
|
132
|
-
assert.strictEqual(settings['chat.agent.enabled'], true, 'Should enable agent mode');
|
|
133
|
-
});
|
|
134
|
-
it('should install .vscode/mcp.json with MCP server definitions', () => {
|
|
135
|
-
runInit(testDir, 'vscode');
|
|
136
|
-
const mcpPath = join(testDir, '.vscode', 'mcp.json');
|
|
137
|
-
assert.ok(existsSync(mcpPath), '.vscode/mcp.json should exist');
|
|
138
|
-
const mcp = JSON.parse(readFileSync(mcpPath, 'utf-8'));
|
|
139
|
-
assert.ok(mcp.servers, 'mcp.json should have servers object');
|
|
140
|
-
assert.ok(mcp.servers.shadcn, 'Should have shadcn MCP server configured');
|
|
141
|
-
});
|
|
142
|
-
it('should install AGENTS.md in project root', () => {
|
|
143
|
-
runInit(testDir, 'vscode');
|
|
144
|
-
assert.ok(existsSync(join(testDir, 'AGENTS.md')), 'AGENTS.md should exist');
|
|
145
|
-
});
|
|
146
|
-
it('should install Backlog.md in project root', () => {
|
|
147
|
-
runInit(testDir, 'vscode');
|
|
148
|
-
assert.ok(existsSync(join(testDir, 'Backlog.md')), 'Backlog.md should exist');
|
|
149
|
-
});
|
|
150
|
-
it('should NOT install CLAUDE.md (VS Code mode is not Claude Code)', () => {
|
|
151
|
-
runInit(testDir, 'vscode');
|
|
152
|
-
assert.strictEqual(existsSync(join(testDir, 'CLAUDE.md')), false, 'CLAUDE.md should NOT exist for vscode mode');
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
describe('agent frontmatter validation', () => {
|
|
156
|
-
it('all agent files should have valid YAML frontmatter with name field', () => {
|
|
157
|
-
runInit(testDir, 'vscode');
|
|
158
|
-
const agentsDir = join(testDir, '.github', 'agents');
|
|
159
|
-
const files = readdirSync(agentsDir).filter(f => f.endsWith('.agent.md'));
|
|
160
|
-
for (const file of files) {
|
|
161
|
-
const content = readFileSync(join(agentsDir, file), 'utf-8');
|
|
162
|
-
assert.ok(content.startsWith('---'), `${file} should start with frontmatter delimiter`);
|
|
163
|
-
assert.ok(content.includes('name:'), `${file} should have name field`);
|
|
164
|
-
assert.ok(content.includes('description:'), `${file} should have description field`);
|
|
165
|
-
assert.ok(content.includes('tools:'), `${file} should have tools field`);
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
it('beth.agent.md should have runSubagent tool and handoffs', () => {
|
|
169
|
-
runInit(testDir, 'vscode');
|
|
170
|
-
const content = readFileSync(join(testDir, '.github', 'agents', 'beth.agent.md'), 'utf-8');
|
|
171
|
-
assert.ok(content.includes('runSubagent'), 'Beth agent should have runSubagent tool');
|
|
172
|
-
assert.ok(content.includes('handoffs:'), 'Beth agent should define handoffs');
|
|
173
|
-
assert.ok(content.includes('infer: true'), 'Beth agent should be inferable as subagent');
|
|
174
|
-
});
|
|
175
|
-
it('developer.agent.md should have editing tools', () => {
|
|
176
|
-
runInit(testDir, 'vscode');
|
|
177
|
-
const content = readFileSync(join(testDir, '.github', 'agents', 'developer.agent.md'), 'utf-8');
|
|
178
|
-
assert.ok(content.includes('editFiles'), 'Developer should have editFiles tool');
|
|
179
|
-
assert.ok(content.includes('readFile'), 'Developer should have readFile tool');
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
describe('init → doctor pipeline', () => {
|
|
183
|
-
it('doctor should recognize all agents installed by init --client vscode', () => {
|
|
184
|
-
runInit(testDir, 'vscode');
|
|
185
|
-
const doctorResult = runDoctor(testDir);
|
|
186
|
-
assert.ok(doctorResult.stdout.includes('7 agents'), `Doctor should find 7 agents. Output:\n${doctorResult.stdout}`);
|
|
187
|
-
});
|
|
188
|
-
it('doctor should recognize all skills installed by init --client vscode', () => {
|
|
189
|
-
runInit(testDir, 'vscode');
|
|
190
|
-
const doctorResult = runDoctor(testDir);
|
|
191
|
-
assert.ok(doctorResult.stdout.includes('6 skills'), `Doctor should find 6 skills. Output:\n${doctorResult.stdout}`);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
describe('--skip-mcp flag', () => {
|
|
195
|
-
it('should not install .vscode/mcp.json when --skip-mcp is used', () => {
|
|
196
|
-
runInit(testDir, 'vscode', ['--skip-mcp']);
|
|
197
|
-
assert.strictEqual(existsSync(join(testDir, '.vscode', 'mcp.json')), false, '.vscode/mcp.json should NOT exist with --skip-mcp');
|
|
198
|
-
});
|
|
199
|
-
it('should still install .vscode/settings.json when --skip-mcp is used', () => {
|
|
200
|
-
runInit(testDir, 'vscode', ['--skip-mcp']);
|
|
201
|
-
assert.ok(existsSync(join(testDir, '.vscode', 'settings.json')), '.vscode/settings.json should still exist with --skip-mcp');
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
describe('--force flag', () => {
|
|
205
|
-
it('should overwrite existing agent files with --force', () => {
|
|
206
|
-
// First init
|
|
207
|
-
runInit(testDir, 'vscode');
|
|
208
|
-
// Corrupt an agent
|
|
209
|
-
const bethAgent = join(testDir, '.github', 'agents', 'beth.agent.md');
|
|
210
|
-
writeFileSync(bethAgent, 'corrupted');
|
|
211
|
-
// Re-init with force
|
|
212
|
-
runInit(testDir, 'vscode', ['--force']);
|
|
213
|
-
const content = readFileSync(bethAgent, 'utf-8');
|
|
214
|
-
assert.ok(content.startsWith('---'), 'Forced re-init should restore valid agent file');
|
|
215
|
-
assert.ok(content.includes('name: Beth'), 'Forced re-init should restore Beth agent');
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
describe('output messaging', () => {
|
|
219
|
-
it('should mention VS Code in the output', () => {
|
|
220
|
-
const result = runInit(testDir, 'vscode');
|
|
221
|
-
assert.ok(result.stdout.includes('VS Code') || result.stdout.includes('vscode') || result.stdout.includes('Copilot'), 'Output should reference VS Code or Copilot');
|
|
222
|
-
});
|
|
223
|
-
it('should report configuring for VS Code', () => {
|
|
224
|
-
const result = runInit(testDir, 'vscode');
|
|
225
|
-
assert.ok(result.stdout.includes('Configuring for') || result.stdout.includes('Installing'), 'Output should confirm which client is being configured');
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
230
|
-
// GITHUB COPILOT CLI
|
|
231
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
232
|
-
describe('--client copilot-cli (GitHub Copilot CLI)', () => {
|
|
233
|
-
let testDir;
|
|
234
|
-
beforeEach(() => {
|
|
235
|
-
testDir = join(tmpdir(), `beth-copilot-cli-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
236
|
-
mkdirSync(testDir, { recursive: true });
|
|
237
|
-
});
|
|
238
|
-
afterEach(() => {
|
|
239
|
-
if (existsSync(testDir)) {
|
|
240
|
-
rmSync(testDir, { recursive: true, force: true });
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
describe('installed file structure', () => {
|
|
244
|
-
it('should exit 0', () => {
|
|
245
|
-
const result = runInit(testDir, 'copilot-cli');
|
|
246
|
-
assert.strictEqual(result.code, 0, `Init failed: ${result.stdout}\n${result.stderr}`);
|
|
247
|
-
});
|
|
248
|
-
it('should install copilot-instructions.md', () => {
|
|
249
|
-
runInit(testDir, 'copilot-cli');
|
|
250
|
-
const filepath = join(testDir, '.github', 'copilot-instructions.md');
|
|
251
|
-
assert.ok(existsSync(filepath), '.github/copilot-instructions.md should exist');
|
|
252
|
-
const content = readFileSync(filepath, 'utf-8');
|
|
253
|
-
assert.ok(content.includes('Agent'), 'copilot-instructions.md should reference agents');
|
|
254
|
-
});
|
|
255
|
-
it('should install all 6 skill directories (shared knowledge)', () => {
|
|
256
|
-
runInit(testDir, 'copilot-cli');
|
|
257
|
-
const skillsDir = join(testDir, '.github', 'skills');
|
|
258
|
-
assert.ok(existsSync(skillsDir), '.github/skills/ should exist');
|
|
259
|
-
const dirs = readdirSync(skillsDir)
|
|
260
|
-
.filter(f => {
|
|
261
|
-
const skillMd = join(skillsDir, f, 'SKILL.md');
|
|
262
|
-
const agentsMd = join(skillsDir, f, 'AGENTS.md');
|
|
263
|
-
return existsSync(skillMd) || existsSync(agentsMd);
|
|
264
|
-
})
|
|
265
|
-
.sort();
|
|
266
|
-
assert.deepStrictEqual(dirs, EXPECTED_SKILLS, 'Should have all 6 skills');
|
|
267
|
-
});
|
|
268
|
-
it('should install AGENTS.md in project root', () => {
|
|
269
|
-
runInit(testDir, 'copilot-cli');
|
|
270
|
-
assert.ok(existsSync(join(testDir, 'AGENTS.md')), 'AGENTS.md should exist');
|
|
271
|
-
});
|
|
272
|
-
it('should install Backlog.md in project root', () => {
|
|
273
|
-
runInit(testDir, 'copilot-cli');
|
|
274
|
-
assert.ok(existsSync(join(testDir, 'Backlog.md')), 'Backlog.md should exist');
|
|
275
|
-
});
|
|
276
|
-
it('should NOT install .github/agents/ (no VS Code agent frontmatter needed)', () => {
|
|
277
|
-
runInit(testDir, 'copilot-cli');
|
|
278
|
-
assert.strictEqual(existsSync(join(testDir, '.github', 'agents')), false, '.github/agents/ should NOT exist for copilot-cli mode');
|
|
279
|
-
});
|
|
280
|
-
it('should NOT install .vscode/ directory', () => {
|
|
281
|
-
runInit(testDir, 'copilot-cli');
|
|
282
|
-
assert.strictEqual(existsSync(join(testDir, '.vscode')), false, '.vscode/ should NOT exist for copilot-cli mode');
|
|
283
|
-
});
|
|
284
|
-
it('should NOT install CLAUDE.md', () => {
|
|
285
|
-
runInit(testDir, 'copilot-cli');
|
|
286
|
-
assert.strictEqual(existsSync(join(testDir, 'CLAUDE.md')), false, 'CLAUDE.md should NOT exist for copilot-cli mode');
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
describe('output messaging', () => {
|
|
290
|
-
it('should mention Copilot CLI in the output', () => {
|
|
291
|
-
const result = runInit(testDir, 'copilot-cli');
|
|
292
|
-
assert.ok(result.stdout.includes('Copilot CLI') || result.stdout.includes('copilot-cli'), 'Output should reference Copilot CLI');
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
describe('skip flags work in copilot-cli mode', () => {
|
|
296
|
-
it('should not install Backlog.md with --skip-backlog', () => {
|
|
297
|
-
runInit(testDir, 'copilot-cli', ['--skip-backlog']);
|
|
298
|
-
assert.strictEqual(existsSync(join(testDir, 'Backlog.md')), false, 'Backlog.md should not exist with --skip-backlog');
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
303
|
-
// CLAUDE CODE
|
|
304
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
305
|
-
describe('--client claude-code (Claude Code)', () => {
|
|
306
|
-
let testDir;
|
|
307
|
-
beforeEach(() => {
|
|
308
|
-
testDir = join(tmpdir(), `beth-claude-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
309
|
-
mkdirSync(testDir, { recursive: true });
|
|
310
|
-
});
|
|
311
|
-
afterEach(() => {
|
|
312
|
-
if (existsSync(testDir)) {
|
|
313
|
-
rmSync(testDir, { recursive: true, force: true });
|
|
314
|
-
}
|
|
315
|
-
});
|
|
316
|
-
describe('installed file structure', () => {
|
|
317
|
-
it('should exit 0', () => {
|
|
318
|
-
const result = runInit(testDir, 'claude-code');
|
|
319
|
-
assert.strictEqual(result.code, 0, `Init failed: ${result.stdout}\n${result.stderr}`);
|
|
320
|
-
});
|
|
321
|
-
it('should install CLAUDE.md in project root', () => {
|
|
322
|
-
runInit(testDir, 'claude-code');
|
|
323
|
-
const claudeMd = join(testDir, 'CLAUDE.md');
|
|
324
|
-
assert.ok(existsSync(claudeMd), 'CLAUDE.md should exist');
|
|
325
|
-
const content = readFileSync(claudeMd, 'utf-8');
|
|
326
|
-
assert.ok(content.includes('Beth'), 'CLAUDE.md should reference Beth');
|
|
327
|
-
assert.ok(content.includes('Seven') || content.includes('agent') || content.includes('Role'), 'CLAUDE.md should describe the agent roles');
|
|
328
|
-
});
|
|
329
|
-
it('should install all 6 skill directories (shared knowledge)', () => {
|
|
330
|
-
runInit(testDir, 'claude-code');
|
|
331
|
-
const skillsDir = join(testDir, '.github', 'skills');
|
|
332
|
-
assert.ok(existsSync(skillsDir), '.github/skills/ should exist');
|
|
333
|
-
const dirs = readdirSync(skillsDir)
|
|
334
|
-
.filter(f => {
|
|
335
|
-
const skillMd = join(skillsDir, f, 'SKILL.md');
|
|
336
|
-
const agentsMd = join(skillsDir, f, 'AGENTS.md');
|
|
337
|
-
return existsSync(skillMd) || existsSync(agentsMd);
|
|
338
|
-
})
|
|
339
|
-
.sort();
|
|
340
|
-
assert.deepStrictEqual(dirs, EXPECTED_SKILLS, 'Should have all 6 skills');
|
|
341
|
-
});
|
|
342
|
-
it('should install AGENTS.md in project root', () => {
|
|
343
|
-
runInit(testDir, 'claude-code');
|
|
344
|
-
assert.ok(existsSync(join(testDir, 'AGENTS.md')), 'AGENTS.md should exist');
|
|
345
|
-
});
|
|
346
|
-
it('should install Backlog.md in project root', () => {
|
|
347
|
-
runInit(testDir, 'claude-code');
|
|
348
|
-
assert.ok(existsSync(join(testDir, 'Backlog.md')), 'Backlog.md should exist');
|
|
349
|
-
});
|
|
350
|
-
it('should NOT install .github/agents/ (no VS Code frontmatter agents)', () => {
|
|
351
|
-
runInit(testDir, 'claude-code');
|
|
352
|
-
assert.strictEqual(existsSync(join(testDir, '.github', 'agents')), false, '.github/agents/ should NOT exist for claude-code mode');
|
|
353
|
-
});
|
|
354
|
-
it('should NOT install .vscode/ directory', () => {
|
|
355
|
-
runInit(testDir, 'claude-code');
|
|
356
|
-
assert.strictEqual(existsSync(join(testDir, '.vscode')), false, '.vscode/ should NOT exist for claude-code mode');
|
|
357
|
-
});
|
|
358
|
-
it('should NOT install copilot-instructions.md', () => {
|
|
359
|
-
runInit(testDir, 'claude-code');
|
|
360
|
-
assert.strictEqual(existsSync(join(testDir, '.github', 'copilot-instructions.md')), false, 'copilot-instructions.md should NOT exist for claude-code mode');
|
|
361
|
-
});
|
|
362
|
-
});
|
|
363
|
-
describe('CLAUDE.md content validation', () => {
|
|
364
|
-
it('should contain Beth personality and role descriptions', () => {
|
|
365
|
-
runInit(testDir, 'claude-code');
|
|
366
|
-
const content = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
|
|
367
|
-
assert.ok(content.includes('Beth'), 'Should reference Beth');
|
|
368
|
-
assert.ok(content.includes('Developer') || content.includes('developer'), 'Should mention developer role');
|
|
369
|
-
assert.ok(content.includes('Tester') || content.includes('tester'), 'Should mention tester role');
|
|
370
|
-
});
|
|
371
|
-
it('should contain skill references', () => {
|
|
372
|
-
runInit(testDir, 'claude-code');
|
|
373
|
-
const content = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
|
|
374
|
-
assert.ok(content.includes('skills'), 'Should reference skills system');
|
|
375
|
-
assert.ok(content.includes('SKILL.md'), 'Should reference SKILL.md files');
|
|
376
|
-
});
|
|
377
|
-
it('should contain beads integration instructions', () => {
|
|
378
|
-
runInit(testDir, 'claude-code');
|
|
379
|
-
const content = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
|
|
380
|
-
assert.ok(content.includes('beads') || content.includes('bd'), 'Should reference beads/bd');
|
|
381
|
-
});
|
|
382
|
-
});
|
|
383
|
-
describe('output messaging', () => {
|
|
384
|
-
it('should mention Claude Code in the output', () => {
|
|
385
|
-
const result = runInit(testDir, 'claude-code');
|
|
386
|
-
assert.ok(result.stdout.includes('Claude') || result.stdout.includes('claude'), 'Output should reference Claude Code');
|
|
387
|
-
});
|
|
388
|
-
});
|
|
389
|
-
describe('skip flags work in claude-code mode', () => {
|
|
390
|
-
it('should not install Backlog.md with --skip-backlog', () => {
|
|
391
|
-
runInit(testDir, 'claude-code', ['--skip-backlog']);
|
|
392
|
-
assert.strictEqual(existsSync(join(testDir, 'Backlog.md')), false, 'Backlog.md should not exist with --skip-backlog');
|
|
393
|
-
});
|
|
394
|
-
});
|
|
395
|
-
describe('--force flag', () => {
|
|
396
|
-
it('should overwrite existing CLAUDE.md with --force', () => {
|
|
397
|
-
writeFileSync(join(testDir, 'CLAUDE.md'), 'ORIGINAL');
|
|
398
|
-
runInit(testDir, 'claude-code');
|
|
399
|
-
let content = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
|
|
400
|
-
assert.strictEqual(content, 'ORIGINAL', 'Should not overwrite without --force');
|
|
401
|
-
runInit(testDir, 'claude-code', ['--force']);
|
|
402
|
-
content = readFileSync(join(testDir, 'CLAUDE.md'), 'utf-8');
|
|
403
|
-
assert.notStrictEqual(content, 'ORIGINAL', 'Should overwrite with --force');
|
|
404
|
-
assert.ok(content.includes('Beth'), 'Restored CLAUDE.md should contain Beth');
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
});
|
|
408
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
409
|
-
// CROSS-CONFIGURATION TESTS
|
|
410
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
411
|
-
describe('cross-configuration behavior', () => {
|
|
412
|
-
let testDir;
|
|
413
|
-
beforeEach(() => {
|
|
414
|
-
testDir = join(tmpdir(), `beth-cross-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
415
|
-
mkdirSync(testDir, { recursive: true });
|
|
416
|
-
});
|
|
417
|
-
afterEach(() => {
|
|
418
|
-
if (existsSync(testDir)) {
|
|
419
|
-
rmSync(testDir, { recursive: true, force: true });
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
describe('--client all installs everything', () => {
|
|
423
|
-
it('should install VS Code agents, Claude Code CLAUDE.md, and copilot-instructions', () => {
|
|
424
|
-
runInit(testDir, 'all');
|
|
425
|
-
// VS Code files
|
|
426
|
-
assert.ok(existsSync(join(testDir, '.github', 'agents')), 'agents/ should exist for --client all');
|
|
427
|
-
assert.ok(existsSync(join(testDir, '.vscode', 'settings.json')), 'settings.json should exist');
|
|
428
|
-
assert.ok(existsSync(join(testDir, '.vscode', 'mcp.json')), 'mcp.json should exist');
|
|
429
|
-
// Copilot CLI files
|
|
430
|
-
assert.ok(existsSync(join(testDir, '.github', 'copilot-instructions.md')), 'copilot-instructions.md should exist');
|
|
431
|
-
// Claude Code files
|
|
432
|
-
assert.ok(existsSync(join(testDir, 'CLAUDE.md')), 'CLAUDE.md should exist');
|
|
433
|
-
// Shared files
|
|
434
|
-
assert.ok(existsSync(join(testDir, '.github', 'skills')), 'skills/ should exist');
|
|
435
|
-
assert.ok(existsSync(join(testDir, 'AGENTS.md')), 'AGENTS.md should exist');
|
|
436
|
-
assert.ok(existsSync(join(testDir, 'Backlog.md')), 'Backlog.md should exist');
|
|
437
|
-
});
|
|
438
|
-
it('should install all 7 agents', () => {
|
|
439
|
-
runInit(testDir, 'all');
|
|
440
|
-
const agentsDir = join(testDir, '.github', 'agents');
|
|
441
|
-
const files = readdirSync(agentsDir).filter(f => f.endsWith('.agent.md')).sort();
|
|
442
|
-
assert.deepStrictEqual(files, EXPECTED_AGENTS, 'All mode should install all 7 agents');
|
|
443
|
-
});
|
|
444
|
-
it('should install all 6 skills', () => {
|
|
445
|
-
runInit(testDir, 'all');
|
|
446
|
-
const skillsDir = join(testDir, '.github', 'skills');
|
|
447
|
-
const dirs = readdirSync(skillsDir)
|
|
448
|
-
.filter(f => {
|
|
449
|
-
const skillMd = join(skillsDir, f, 'SKILL.md');
|
|
450
|
-
const agentsMd = join(skillsDir, f, 'AGENTS.md');
|
|
451
|
-
return existsSync(skillMd) || existsSync(agentsMd);
|
|
452
|
-
})
|
|
453
|
-
.sort();
|
|
454
|
-
assert.deepStrictEqual(dirs, EXPECTED_SKILLS, 'All mode should install all 6 skills');
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
describe('shared files are consistent across modes', () => {
|
|
458
|
-
it('skills/ content should be identical regardless of client mode', () => {
|
|
459
|
-
// Install for each mode in separate directories
|
|
460
|
-
const vsDir = join(testDir, 'vscode');
|
|
461
|
-
const cliDir = join(testDir, 'copilot-cli');
|
|
462
|
-
const claudeDir = join(testDir, 'claude-code');
|
|
463
|
-
mkdirSync(vsDir, { recursive: true });
|
|
464
|
-
mkdirSync(cliDir, { recursive: true });
|
|
465
|
-
mkdirSync(claudeDir, { recursive: true });
|
|
466
|
-
runInit(vsDir, 'vscode');
|
|
467
|
-
runInit(cliDir, 'copilot-cli');
|
|
468
|
-
runInit(claudeDir, 'claude-code');
|
|
469
|
-
// Each should have the same skills
|
|
470
|
-
const vsSkills = readdirSync(join(vsDir, '.github', 'skills')).sort();
|
|
471
|
-
const cliSkills = readdirSync(join(cliDir, '.github', 'skills')).sort();
|
|
472
|
-
const claudeSkills = readdirSync(join(claudeDir, '.github', 'skills')).sort();
|
|
473
|
-
assert.deepStrictEqual(vsSkills, cliSkills, 'VS Code and CLI skills should match');
|
|
474
|
-
assert.deepStrictEqual(cliSkills, claudeSkills, 'CLI and Claude skills should match');
|
|
475
|
-
});
|
|
476
|
-
it('AGENTS.md should be identical regardless of client mode', () => {
|
|
477
|
-
const vsDir = join(testDir, 'vscode');
|
|
478
|
-
const cliDir = join(testDir, 'copilot-cli');
|
|
479
|
-
const claudeDir = join(testDir, 'claude-code');
|
|
480
|
-
mkdirSync(vsDir, { recursive: true });
|
|
481
|
-
mkdirSync(cliDir, { recursive: true });
|
|
482
|
-
mkdirSync(claudeDir, { recursive: true });
|
|
483
|
-
runInit(vsDir, 'vscode');
|
|
484
|
-
runInit(cliDir, 'copilot-cli');
|
|
485
|
-
runInit(claudeDir, 'claude-code');
|
|
486
|
-
const vsContent = readFileSync(join(vsDir, 'AGENTS.md'), 'utf-8');
|
|
487
|
-
const cliContent = readFileSync(join(cliDir, 'AGENTS.md'), 'utf-8');
|
|
488
|
-
const claudeContent = readFileSync(join(claudeDir, 'AGENTS.md'), 'utf-8');
|
|
489
|
-
assert.strictEqual(vsContent, cliContent, 'VS Code and CLI AGENTS.md should match');
|
|
490
|
-
assert.strictEqual(cliContent, claudeContent, 'CLI and Claude AGENTS.md should match');
|
|
491
|
-
});
|
|
492
|
-
});
|
|
493
|
-
describe('mode exclusivity', () => {
|
|
494
|
-
it('vscode mode should NOT produce claude-code or copilot-cli exclusive files', () => {
|
|
495
|
-
runInit(testDir, 'vscode');
|
|
496
|
-
// CLAUDE.md is claude-code exclusive
|
|
497
|
-
assert.strictEqual(existsSync(join(testDir, 'CLAUDE.md')), false, 'No CLAUDE.md in vscode mode');
|
|
498
|
-
});
|
|
499
|
-
it('copilot-cli mode should NOT produce vscode or claude-code exclusive files', () => {
|
|
500
|
-
runInit(testDir, 'copilot-cli');
|
|
501
|
-
// .github/agents/ is vscode exclusive
|
|
502
|
-
assert.strictEqual(existsSync(join(testDir, '.github', 'agents')), false, 'No agents/ in copilot-cli mode');
|
|
503
|
-
// .vscode/ is vscode exclusive
|
|
504
|
-
assert.strictEqual(existsSync(join(testDir, '.vscode')), false, 'No .vscode/ in copilot-cli mode');
|
|
505
|
-
// CLAUDE.md is claude-code exclusive
|
|
506
|
-
assert.strictEqual(existsSync(join(testDir, 'CLAUDE.md')), false, 'No CLAUDE.md in copilot-cli mode');
|
|
507
|
-
});
|
|
508
|
-
it('claude-code mode should NOT produce vscode or copilot-cli exclusive files', () => {
|
|
509
|
-
runInit(testDir, 'claude-code');
|
|
510
|
-
// .github/agents/ is vscode exclusive
|
|
511
|
-
assert.strictEqual(existsSync(join(testDir, '.github', 'agents')), false, 'No agents/ in claude-code mode');
|
|
512
|
-
// .vscode/ is vscode exclusive
|
|
513
|
-
assert.strictEqual(existsSync(join(testDir, '.vscode')), false, 'No .vscode/ in claude-code mode');
|
|
514
|
-
// copilot-instructions.md is vscode/copilot-cli exclusive
|
|
515
|
-
assert.strictEqual(existsSync(join(testDir, '.github', 'copilot-instructions.md')), false, 'No copilot-instructions.md in claude-code mode');
|
|
516
|
-
});
|
|
517
|
-
});
|
|
518
|
-
describe('sequential init with different clients', () => {
|
|
519
|
-
it('should layer vscode on top of claude-code without conflict', () => {
|
|
520
|
-
// First: Claude Code
|
|
521
|
-
runInit(testDir, 'claude-code');
|
|
522
|
-
assert.ok(existsSync(join(testDir, 'CLAUDE.md')), 'CLAUDE.md from first init');
|
|
523
|
-
assert.strictEqual(existsSync(join(testDir, '.github', 'agents')), false, 'No agents yet');
|
|
524
|
-
// Second: VS Code (without force — should add its files)
|
|
525
|
-
runInit(testDir, 'vscode');
|
|
526
|
-
assert.ok(existsSync(join(testDir, 'CLAUDE.md')), 'CLAUDE.md preserved from first init');
|
|
527
|
-
assert.ok(existsSync(join(testDir, '.github', 'agents')), 'agents/ added by second init');
|
|
528
|
-
assert.ok(existsSync(join(testDir, '.vscode', 'settings.json')), 'settings.json added by second init');
|
|
529
|
-
});
|
|
530
|
-
it('should layer claude-code on top of vscode without conflict', () => {
|
|
531
|
-
// First: VS Code
|
|
532
|
-
runInit(testDir, 'vscode');
|
|
533
|
-
assert.ok(existsSync(join(testDir, '.github', 'agents')), 'agents/ from first init');
|
|
534
|
-
// Second: Claude Code
|
|
535
|
-
runInit(testDir, 'claude-code');
|
|
536
|
-
assert.ok(existsSync(join(testDir, '.github', 'agents')), 'agents/ preserved from first init');
|
|
537
|
-
assert.ok(existsSync(join(testDir, 'CLAUDE.md')), 'CLAUDE.md added by second init');
|
|
538
|
-
});
|
|
539
|
-
it('doctor should pass after layering vscode + claude-code', () => {
|
|
540
|
-
runInit(testDir, 'vscode');
|
|
541
|
-
runInit(testDir, 'claude-code');
|
|
542
|
-
// Simulate beads init
|
|
543
|
-
mkdirSync(join(testDir, '.beads'), { recursive: true });
|
|
544
|
-
const doctorResult = runDoctor(testDir);
|
|
545
|
-
assert.ok(doctorResult.stdout.includes('7 agents'), `Doctor should find 7 agents after layered init. Output:\n${doctorResult.stdout}`);
|
|
546
|
-
});
|
|
547
|
-
});
|
|
548
|
-
describe('invalid --client value', () => {
|
|
549
|
-
it('should reject invalid client values', () => {
|
|
550
|
-
const result = runInit(testDir, 'invalid-client');
|
|
551
|
-
assert.notStrictEqual(result.code, 0, 'Should exit non-zero for invalid client');
|
|
552
|
-
assert.ok(result.stdout.includes('Invalid client') || result.stderr.includes('Invalid client'), 'Should report invalid client');
|
|
553
|
-
});
|
|
554
|
-
});
|
|
555
|
-
});
|
|
556
|
-
//# sourceMappingURL=client-config.e2e.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-config.e2e.test.js","sourceRoot":"","sources":["../../../src/cli/commands/client-config.e2e.test.ts"],"names":[],"mappings":"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"}
|