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,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Client Configuration Persistence and Detection
|
|
3
|
-
*
|
|
4
|
-
* Persists the user's AI client selection (VS Code, Copilot CLI, Claude Code)
|
|
5
|
-
* to `.github/.beth-client.json` so other commands can detect which client
|
|
6
|
-
* was chosen during `init`.
|
|
7
|
-
*
|
|
8
|
-
* Falls back to marker file detection when no config file exists.
|
|
9
|
-
*/
|
|
10
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
11
|
-
import { join } from 'path';
|
|
12
|
-
export const CLIENT_CONFIG_FILE = '.beth-client.json';
|
|
13
|
-
export const CLIENT_CONFIG_DIR = '.github';
|
|
14
|
-
/**
|
|
15
|
-
* Persist the client selection to `.github/.beth-client.json`.
|
|
16
|
-
* Creates the `.github/` directory if it doesn't exist.
|
|
17
|
-
* Overwrites any existing config file.
|
|
18
|
-
*/
|
|
19
|
-
export function persistClientConfig(cwd, clients) {
|
|
20
|
-
const dir = join(cwd, CLIENT_CONFIG_DIR);
|
|
21
|
-
if (!existsSync(dir)) {
|
|
22
|
-
mkdirSync(dir, { recursive: true });
|
|
23
|
-
}
|
|
24
|
-
const filePath = join(dir, CLIENT_CONFIG_FILE);
|
|
25
|
-
writeFileSync(filePath, JSON.stringify(clients, null, 2) + '\n', 'utf-8');
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Detect the client configuration.
|
|
29
|
-
*
|
|
30
|
-
* 1. Tries to read `.github/.beth-client.json`
|
|
31
|
-
* 2. Falls back to marker file detection if config is missing or invalid
|
|
32
|
-
* 3. Defaults to `{ vscode: true, copilotCli: false, claudeCode: false }` if nothing detected
|
|
33
|
-
*/
|
|
34
|
-
export function detectClientConfig(cwd) {
|
|
35
|
-
// Try reading persisted config first
|
|
36
|
-
const filePath = join(cwd, CLIENT_CONFIG_DIR, CLIENT_CONFIG_FILE);
|
|
37
|
-
if (existsSync(filePath)) {
|
|
38
|
-
try {
|
|
39
|
-
const raw = readFileSync(filePath, 'utf-8');
|
|
40
|
-
const parsed = JSON.parse(raw);
|
|
41
|
-
if (isValidClientSelection(parsed)) {
|
|
42
|
-
return parsed;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
// Invalid JSON — fall through to marker detection
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// Marker file detection
|
|
50
|
-
return detectFromMarkers(cwd);
|
|
51
|
-
}
|
|
52
|
-
function isValidClientSelection(value) {
|
|
53
|
-
if (typeof value !== 'object' || value === null)
|
|
54
|
-
return false;
|
|
55
|
-
const obj = value;
|
|
56
|
-
return (typeof obj.vscode === 'boolean' &&
|
|
57
|
-
typeof obj.copilotCli === 'boolean' &&
|
|
58
|
-
typeof obj.claudeCode === 'boolean');
|
|
59
|
-
}
|
|
60
|
-
function detectFromMarkers(cwd) {
|
|
61
|
-
const hasAgentsDir = existsSync(join(cwd, '.github', 'agents'));
|
|
62
|
-
const hasClaudeMd = existsSync(join(cwd, 'CLAUDE.md'));
|
|
63
|
-
const hasCopilotInstructions = existsSync(join(cwd, '.github', 'copilot-instructions.md'));
|
|
64
|
-
const vscode = hasAgentsDir;
|
|
65
|
-
const claudeCode = hasClaudeMd;
|
|
66
|
-
const copilotCli = hasCopilotInstructions && !hasAgentsDir;
|
|
67
|
-
// If nothing detected, default to vscode
|
|
68
|
-
if (!vscode && !copilotCli && !claudeCode) {
|
|
69
|
-
return { vscode: true, copilotCli: false, claudeCode: false };
|
|
70
|
-
}
|
|
71
|
-
return { vscode, copilotCli, claudeCode };
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=client-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-config.js","sourceRoot":"","sources":["../../../src/cli/commands/client-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,OAAwB;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC/C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,qCAAqC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAClE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,MAAM,KAAK,SAAS;QAC/B,OAAO,GAAG,CAAC,UAAU,KAAK,SAAS;QACnC,OAAO,GAAG,CAAC,UAAU,KAAK,SAAS,CACpC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IACvD,MAAM,sBAAsB,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAE3F,MAAM,MAAM,GAAG,YAAY,CAAC;IAC5B,MAAM,UAAU,GAAG,WAAW,CAAC;IAC/B,MAAM,UAAU,GAAG,sBAAsB,IAAI,CAAC,YAAY,CAAC;IAE3D,yCAAyC;IACzC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAChE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-config.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/client-config.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for client-config module.
|
|
3
|
-
* Run with: node --test dist/cli/commands/client-config.test.js
|
|
4
|
-
*/
|
|
5
|
-
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
6
|
-
import assert from 'node:assert';
|
|
7
|
-
import { existsSync, mkdirSync, mkdtempSync, writeFileSync, rmSync, readFileSync } from 'fs';
|
|
8
|
-
import { join } from 'path';
|
|
9
|
-
import { tmpdir } from 'os';
|
|
10
|
-
import { persistClientConfig, detectClientConfig, CLIENT_CONFIG_FILE, CLIENT_CONFIG_DIR, } from './client-config.js';
|
|
11
|
-
describe('client-config', () => {
|
|
12
|
-
let testDir;
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
testDir = mkdtempSync(join(tmpdir(), 'beth-client-config-'));
|
|
15
|
-
});
|
|
16
|
-
afterEach(() => {
|
|
17
|
-
if (existsSync(testDir)) {
|
|
18
|
-
rmSync(testDir, { recursive: true, force: true });
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
describe('persistClientConfig', () => {
|
|
22
|
-
it('should write config file to .github/.beth-client.json', () => {
|
|
23
|
-
const selection = { vscode: true, copilotCli: false, claudeCode: false };
|
|
24
|
-
persistClientConfig(testDir, selection);
|
|
25
|
-
const filePath = join(testDir, CLIENT_CONFIG_DIR, CLIENT_CONFIG_FILE);
|
|
26
|
-
assert.ok(existsSync(filePath), 'config file should exist');
|
|
27
|
-
const content = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
28
|
-
assert.deepStrictEqual(content, selection);
|
|
29
|
-
});
|
|
30
|
-
it('should create .github directory if it does not exist', () => {
|
|
31
|
-
const selection = { vscode: false, copilotCli: true, claudeCode: false };
|
|
32
|
-
persistClientConfig(testDir, selection);
|
|
33
|
-
assert.ok(existsSync(join(testDir, CLIENT_CONFIG_DIR)), '.github dir should exist');
|
|
34
|
-
});
|
|
35
|
-
it('should overwrite existing config file', () => {
|
|
36
|
-
const first = { vscode: true, copilotCli: false, claudeCode: false };
|
|
37
|
-
const second = { vscode: false, copilotCli: false, claudeCode: true };
|
|
38
|
-
persistClientConfig(testDir, first);
|
|
39
|
-
persistClientConfig(testDir, second);
|
|
40
|
-
const filePath = join(testDir, CLIENT_CONFIG_DIR, CLIENT_CONFIG_FILE);
|
|
41
|
-
const content = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
42
|
-
assert.deepStrictEqual(content, second);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
describe('detectClientConfig — round-trip', () => {
|
|
46
|
-
it('should round-trip vscode-only config', () => {
|
|
47
|
-
const selection = { vscode: true, copilotCli: false, claudeCode: false };
|
|
48
|
-
persistClientConfig(testDir, selection);
|
|
49
|
-
assert.deepStrictEqual(detectClientConfig(testDir), selection);
|
|
50
|
-
});
|
|
51
|
-
it('should round-trip copilotCli-only config', () => {
|
|
52
|
-
const selection = { vscode: false, copilotCli: true, claudeCode: false };
|
|
53
|
-
persistClientConfig(testDir, selection);
|
|
54
|
-
assert.deepStrictEqual(detectClientConfig(testDir), selection);
|
|
55
|
-
});
|
|
56
|
-
it('should round-trip claudeCode-only config', () => {
|
|
57
|
-
const selection = { vscode: false, copilotCli: false, claudeCode: true };
|
|
58
|
-
persistClientConfig(testDir, selection);
|
|
59
|
-
assert.deepStrictEqual(detectClientConfig(testDir), selection);
|
|
60
|
-
});
|
|
61
|
-
it('should round-trip multiple clients selected', () => {
|
|
62
|
-
const selection = { vscode: true, copilotCli: false, claudeCode: true };
|
|
63
|
-
persistClientConfig(testDir, selection);
|
|
64
|
-
assert.deepStrictEqual(detectClientConfig(testDir), selection);
|
|
65
|
-
});
|
|
66
|
-
it('should round-trip all clients selected', () => {
|
|
67
|
-
const selection = { vscode: true, copilotCli: true, claudeCode: true };
|
|
68
|
-
persistClientConfig(testDir, selection);
|
|
69
|
-
assert.deepStrictEqual(detectClientConfig(testDir), selection);
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
describe('detectClientConfig — marker fallback', () => {
|
|
73
|
-
it('should detect vscode from .github/agents/ directory', () => {
|
|
74
|
-
mkdirSync(join(testDir, '.github', 'agents'), { recursive: true });
|
|
75
|
-
const result = detectClientConfig(testDir);
|
|
76
|
-
assert.strictEqual(result.vscode, true);
|
|
77
|
-
});
|
|
78
|
-
it('should detect claudeCode from CLAUDE.md', () => {
|
|
79
|
-
writeFileSync(join(testDir, 'CLAUDE.md'), '# Claude');
|
|
80
|
-
const result = detectClientConfig(testDir);
|
|
81
|
-
assert.strictEqual(result.claudeCode, true);
|
|
82
|
-
});
|
|
83
|
-
it('should detect copilotCli from copilot-instructions.md without agents dir', () => {
|
|
84
|
-
mkdirSync(join(testDir, '.github'), { recursive: true });
|
|
85
|
-
writeFileSync(join(testDir, '.github', 'copilot-instructions.md'), '# Instructions');
|
|
86
|
-
const result = detectClientConfig(testDir);
|
|
87
|
-
assert.strictEqual(result.copilotCli, true);
|
|
88
|
-
assert.strictEqual(result.vscode, false);
|
|
89
|
-
});
|
|
90
|
-
it('should NOT detect copilotCli when agents dir also exists', () => {
|
|
91
|
-
mkdirSync(join(testDir, '.github', 'agents'), { recursive: true });
|
|
92
|
-
writeFileSync(join(testDir, '.github', 'copilot-instructions.md'), '# Instructions');
|
|
93
|
-
const result = detectClientConfig(testDir);
|
|
94
|
-
assert.strictEqual(result.copilotCli, false);
|
|
95
|
-
assert.strictEqual(result.vscode, true);
|
|
96
|
-
});
|
|
97
|
-
it('should detect both vscode and claudeCode from markers', () => {
|
|
98
|
-
mkdirSync(join(testDir, '.github', 'agents'), { recursive: true });
|
|
99
|
-
writeFileSync(join(testDir, 'CLAUDE.md'), '# Claude');
|
|
100
|
-
const result = detectClientConfig(testDir);
|
|
101
|
-
assert.strictEqual(result.vscode, true);
|
|
102
|
-
assert.strictEqual(result.claudeCode, true);
|
|
103
|
-
assert.strictEqual(result.copilotCli, false);
|
|
104
|
-
});
|
|
105
|
-
it('should default to vscode when nothing detected', () => {
|
|
106
|
-
const result = detectClientConfig(testDir);
|
|
107
|
-
assert.deepStrictEqual(result, { vscode: true, copilotCli: false, claudeCode: false });
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
describe('detectClientConfig — invalid config file', () => {
|
|
111
|
-
it('should fall back to markers when JSON is invalid', () => {
|
|
112
|
-
mkdirSync(join(testDir, CLIENT_CONFIG_DIR), { recursive: true });
|
|
113
|
-
writeFileSync(join(testDir, CLIENT_CONFIG_DIR, CLIENT_CONFIG_FILE), 'not json{{{');
|
|
114
|
-
mkdirSync(join(testDir, '.github', 'agents'), { recursive: true });
|
|
115
|
-
const result = detectClientConfig(testDir);
|
|
116
|
-
assert.strictEqual(result.vscode, true);
|
|
117
|
-
});
|
|
118
|
-
it('should fall back to markers when config has wrong shape', () => {
|
|
119
|
-
mkdirSync(join(testDir, CLIENT_CONFIG_DIR), { recursive: true });
|
|
120
|
-
writeFileSync(join(testDir, CLIENT_CONFIG_DIR, CLIENT_CONFIG_FILE), JSON.stringify({ vscode: 'yes', copilotCli: 0 }));
|
|
121
|
-
writeFileSync(join(testDir, 'CLAUDE.md'), '# Claude');
|
|
122
|
-
const result = detectClientConfig(testDir);
|
|
123
|
-
assert.strictEqual(result.claudeCode, true);
|
|
124
|
-
});
|
|
125
|
-
it('should fall back to defaults when config is invalid and no markers exist', () => {
|
|
126
|
-
mkdirSync(join(testDir, CLIENT_CONFIG_DIR), { recursive: true });
|
|
127
|
-
writeFileSync(join(testDir, CLIENT_CONFIG_DIR, CLIENT_CONFIG_FILE), '{}');
|
|
128
|
-
const result = detectClientConfig(testDir);
|
|
129
|
-
assert.deepStrictEqual(result, { vscode: true, copilotCli: false, claudeCode: false });
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
//# sourceMappingURL=client-config.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-config.test.js","sourceRoot":"","sources":["../../../src/cli/commands/client-config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E tests for the init → quickstart pipeline.
|
|
3
|
-
*
|
|
4
|
-
* Verifies that running `init --client <mode>` persists the correct
|
|
5
|
-
* `.github/.beth-client.json` and that `quickstart` reads it to show
|
|
6
|
-
* client-specific getting-started guidance.
|
|
7
|
-
*
|
|
8
|
-
* Run with: node --test dist/cli/commands/init-quickstart.e2e.test.js
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=init-quickstart.e2e.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-quickstart.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init-quickstart.e2e.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E tests for the init → quickstart pipeline.
|
|
3
|
-
*
|
|
4
|
-
* Verifies that running `init --client <mode>` persists the correct
|
|
5
|
-
* `.github/.beth-client.json` and that `quickstart` reads it to show
|
|
6
|
-
* client-specific getting-started guidance.
|
|
7
|
-
*
|
|
8
|
-
* Run with: node --test dist/cli/commands/init-quickstart.e2e.test.js
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
11
|
-
import assert from 'node:assert';
|
|
12
|
-
import { execSync } from 'child_process';
|
|
13
|
-
import { existsSync, mkdirSync, rmSync, readFileSync, writeFileSync, } from 'fs';
|
|
14
|
-
import { join, resolve } from 'path';
|
|
15
|
-
import { tmpdir } from 'os';
|
|
16
|
-
const CLI_PATH = resolve(join(import.meta.dirname, '..', '..', '..', 'bin', 'cli.js'));
|
|
17
|
-
// Check if beads CLI is available — quickstart requires it
|
|
18
|
-
function isBeadsInstalled() {
|
|
19
|
-
try {
|
|
20
|
-
execSync('bd --version', { stdio: 'ignore' });
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
const BEADS_AVAILABLE = isBeadsInstalled();
|
|
28
|
-
const SKIP_NO_BEADS = !BEADS_AVAILABLE ? 'beads CLI not installed' : false;
|
|
29
|
-
/**
|
|
30
|
-
* Run a CLI command in a directory.
|
|
31
|
-
*/
|
|
32
|
-
function runCli(cwd, command, flags = []) {
|
|
33
|
-
const argStr = flags.length > 0 ? ` ${flags.join(' ')}` : '';
|
|
34
|
-
try {
|
|
35
|
-
const stdout = execSync(`node "${CLI_PATH}" ${command}${argStr}`, {
|
|
36
|
-
cwd,
|
|
37
|
-
encoding: 'utf-8',
|
|
38
|
-
env: { ...process.env, NO_COLOR: '1', FORCE_COLOR: '0' },
|
|
39
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
40
|
-
});
|
|
41
|
-
return { stdout, stderr: '', code: 0 };
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
const e = error;
|
|
45
|
-
return { stdout: e.stdout || '', stderr: e.stderr || '', code: e.status || 1 };
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Ensure the project has .github/agents/ with a minimal agent file
|
|
50
|
-
* so quickstart's `isBethInitialized` check passes.
|
|
51
|
-
* (Non-vscode init modes don't create this directory.)
|
|
52
|
-
*/
|
|
53
|
-
function ensureAgentsDir(dir) {
|
|
54
|
-
const agentsDir = join(dir, '.github', 'agents');
|
|
55
|
-
if (!existsSync(agentsDir)) {
|
|
56
|
-
mkdirSync(agentsDir, { recursive: true });
|
|
57
|
-
writeFileSync(join(agentsDir, 'beth.agent.md'), `---\nname: Beth\ndescription: Orchestrator\nmodel: gpt-4\ntools:\n - readFile\n---\n\n# Beth\n`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Simulate beads initialization so quickstart doesn't try to run `bd init`.
|
|
62
|
-
*/
|
|
63
|
-
function simulateBeadsInit(dir) {
|
|
64
|
-
const beadsDir = join(dir, '.beads');
|
|
65
|
-
if (!existsSync(beadsDir)) {
|
|
66
|
-
mkdirSync(beadsDir, { recursive: true });
|
|
67
|
-
writeFileSync(join(beadsDir, 'config.json'), JSON.stringify({ version: '1.0' }));
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
71
|
-
// .beth-client.json PERSISTENCE
|
|
72
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
73
|
-
describe('init persists .github/.beth-client.json', () => {
|
|
74
|
-
let testDir;
|
|
75
|
-
beforeEach(() => {
|
|
76
|
-
testDir = join(tmpdir(), `beth-iq-persist-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
77
|
-
mkdirSync(testDir, { recursive: true });
|
|
78
|
-
});
|
|
79
|
-
afterEach(() => {
|
|
80
|
-
if (existsSync(testDir)) {
|
|
81
|
-
rmSync(testDir, { recursive: true, force: true });
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
it('--client vscode writes valid .beth-client.json with vscode: true', () => {
|
|
85
|
-
const result = runCli(testDir, 'init', ['--client', 'vscode', '--force', '--skip-beads']);
|
|
86
|
-
assert.strictEqual(result.code, 0, `Init failed: ${result.stdout}`);
|
|
87
|
-
const configPath = join(testDir, '.github', '.beth-client.json');
|
|
88
|
-
assert.ok(existsSync(configPath), '.github/.beth-client.json should exist');
|
|
89
|
-
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
90
|
-
assert.strictEqual(config.vscode, true, 'vscode should be true');
|
|
91
|
-
assert.strictEqual(config.copilotCli, false, 'copilotCli should be false');
|
|
92
|
-
assert.strictEqual(config.claudeCode, false, 'claudeCode should be false');
|
|
93
|
-
});
|
|
94
|
-
it('--client claude-code writes valid .beth-client.json with claudeCode: true', () => {
|
|
95
|
-
const result = runCli(testDir, 'init', ['--client', 'claude-code', '--force', '--skip-beads']);
|
|
96
|
-
assert.strictEqual(result.code, 0, `Init failed: ${result.stdout}`);
|
|
97
|
-
const configPath = join(testDir, '.github', '.beth-client.json');
|
|
98
|
-
assert.ok(existsSync(configPath), '.github/.beth-client.json should exist');
|
|
99
|
-
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
100
|
-
assert.strictEqual(config.vscode, false, 'vscode should be false');
|
|
101
|
-
assert.strictEqual(config.copilotCli, false, 'copilotCli should be false');
|
|
102
|
-
assert.strictEqual(config.claudeCode, true, 'claudeCode should be true');
|
|
103
|
-
});
|
|
104
|
-
it('--client copilot-cli writes valid .beth-client.json with copilotCli: true', () => {
|
|
105
|
-
const result = runCli(testDir, 'init', ['--client', 'copilot-cli', '--force', '--skip-beads']);
|
|
106
|
-
assert.strictEqual(result.code, 0, `Init failed: ${result.stdout}`);
|
|
107
|
-
const configPath = join(testDir, '.github', '.beth-client.json');
|
|
108
|
-
assert.ok(existsSync(configPath), '.github/.beth-client.json should exist');
|
|
109
|
-
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
110
|
-
assert.strictEqual(config.vscode, false, 'vscode should be false');
|
|
111
|
-
assert.strictEqual(config.copilotCli, true, 'copilotCli should be true');
|
|
112
|
-
assert.strictEqual(config.claudeCode, false, 'claudeCode should be false');
|
|
113
|
-
});
|
|
114
|
-
it('--client all writes valid .beth-client.json with all flags true', () => {
|
|
115
|
-
const result = runCli(testDir, 'init', ['--client', 'all', '--force', '--skip-beads']);
|
|
116
|
-
assert.strictEqual(result.code, 0, `Init failed: ${result.stdout}`);
|
|
117
|
-
const configPath = join(testDir, '.github', '.beth-client.json');
|
|
118
|
-
assert.ok(existsSync(configPath), '.github/.beth-client.json should exist');
|
|
119
|
-
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
120
|
-
assert.strictEqual(config.vscode, true, 'vscode should be true');
|
|
121
|
-
assert.strictEqual(config.copilotCli, true, 'copilotCli should be true');
|
|
122
|
-
assert.strictEqual(config.claudeCode, true, 'claudeCode should be true');
|
|
123
|
-
});
|
|
124
|
-
it('.beth-client.json is valid JSON with expected schema', () => {
|
|
125
|
-
runCli(testDir, 'init', ['--client', 'vscode', '--force', '--skip-beads']);
|
|
126
|
-
const configPath = join(testDir, '.github', '.beth-client.json');
|
|
127
|
-
const raw = readFileSync(configPath, 'utf-8');
|
|
128
|
-
let config;
|
|
129
|
-
assert.doesNotThrow(() => {
|
|
130
|
-
config = JSON.parse(raw);
|
|
131
|
-
}, '.beth-client.json should be valid JSON');
|
|
132
|
-
const obj = config;
|
|
133
|
-
assert.strictEqual(typeof obj.vscode, 'boolean', 'vscode field should be boolean');
|
|
134
|
-
assert.strictEqual(typeof obj.copilotCli, 'boolean', 'copilotCli field should be boolean');
|
|
135
|
-
assert.strictEqual(typeof obj.claudeCode, 'boolean', 'claudeCode field should be boolean');
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
139
|
-
// INIT → QUICKSTART: CLIENT-SPECIFIC GUIDANCE
|
|
140
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
141
|
-
describe('init → quickstart pipeline: client-specific guidance', () => {
|
|
142
|
-
let testDir;
|
|
143
|
-
beforeEach(() => {
|
|
144
|
-
testDir = join(tmpdir(), `beth-iq-guide-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
145
|
-
mkdirSync(testDir, { recursive: true });
|
|
146
|
-
});
|
|
147
|
-
afterEach(() => {
|
|
148
|
-
if (existsSync(testDir)) {
|
|
149
|
-
rmSync(testDir, { recursive: true, force: true });
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
it('--client vscode → quickstart shows VS Code / Copilot Chat guidance', { skip: SKIP_NO_BEADS }, () => {
|
|
153
|
-
// Step 1: Run init
|
|
154
|
-
const initResult = runCli(testDir, 'init', ['--client', 'vscode', '--force', '--skip-beads']);
|
|
155
|
-
assert.strictEqual(initResult.code, 0, `Init failed: ${initResult.stdout}`);
|
|
156
|
-
// Step 2: Prepare for quickstart (beads dir)
|
|
157
|
-
simulateBeadsInit(testDir);
|
|
158
|
-
// Step 3: Run quickstart
|
|
159
|
-
const qsResult = runCli(testDir, 'quickstart');
|
|
160
|
-
// Step 4: Verify VS Code guidance
|
|
161
|
-
assert.ok(qsResult.stdout.includes('Copilot Chat'), `Quickstart should mention Copilot Chat for vscode client. Output:\n${qsResult.stdout}`);
|
|
162
|
-
assert.ok(qsResult.stdout.includes('@Beth'), `Quickstart should mention @Beth for vscode client.`);
|
|
163
|
-
});
|
|
164
|
-
it('--client claude-code → quickstart shows Claude Code guidance', { skip: SKIP_NO_BEADS }, () => {
|
|
165
|
-
// Step 1: Run init
|
|
166
|
-
const initResult = runCli(testDir, 'init', ['--client', 'claude-code', '--force', '--skip-beads']);
|
|
167
|
-
assert.strictEqual(initResult.code, 0, `Init failed: ${initResult.stdout}`);
|
|
168
|
-
// Step 2: Ensure agents dir exists (claude-code init doesn't create it)
|
|
169
|
-
ensureAgentsDir(testDir);
|
|
170
|
-
simulateBeadsInit(testDir);
|
|
171
|
-
// Step 3: Run quickstart
|
|
172
|
-
const qsResult = runCli(testDir, 'quickstart');
|
|
173
|
-
// Step 4: Verify Claude Code guidance
|
|
174
|
-
assert.ok(qsResult.stdout.includes('CLAUDE.md'), `Quickstart should mention CLAUDE.md for claude-code client. Output:\n${qsResult.stdout}`);
|
|
175
|
-
assert.ok(qsResult.stdout.includes('Claude Code'), `Quickstart should show Claude Code section.`);
|
|
176
|
-
});
|
|
177
|
-
it('--client copilot-cli → quickstart shows Copilot CLI guidance', { skip: SKIP_NO_BEADS }, () => {
|
|
178
|
-
// Step 1: Run init
|
|
179
|
-
const initResult = runCli(testDir, 'init', ['--client', 'copilot-cli', '--force', '--skip-beads']);
|
|
180
|
-
assert.strictEqual(initResult.code, 0, `Init failed: ${initResult.stdout}`);
|
|
181
|
-
// Step 2: Ensure agents dir exists (copilot-cli init doesn't create it)
|
|
182
|
-
ensureAgentsDir(testDir);
|
|
183
|
-
simulateBeadsInit(testDir);
|
|
184
|
-
// Step 3: Run quickstart
|
|
185
|
-
const qsResult = runCli(testDir, 'quickstart');
|
|
186
|
-
// Step 4: Verify Copilot CLI guidance
|
|
187
|
-
assert.ok(qsResult.stdout.includes('copilot-instructions.md'), `Quickstart should mention copilot-instructions.md for copilot-cli client. Output:\n${qsResult.stdout}`);
|
|
188
|
-
assert.ok(qsResult.stdout.includes('Copilot CLI'), `Quickstart should show Copilot CLI section.`);
|
|
189
|
-
});
|
|
190
|
-
it('--client all → quickstart shows all three client sections', { skip: SKIP_NO_BEADS }, () => {
|
|
191
|
-
// Step 1: Run init
|
|
192
|
-
const initResult = runCli(testDir, 'init', ['--client', 'all', '--force', '--skip-beads']);
|
|
193
|
-
assert.strictEqual(initResult.code, 0, `Init failed: ${initResult.stdout}`);
|
|
194
|
-
// Step 2: Prepare for quickstart
|
|
195
|
-
simulateBeadsInit(testDir);
|
|
196
|
-
// Step 3: Run quickstart
|
|
197
|
-
const qsResult = runCli(testDir, 'quickstart');
|
|
198
|
-
// Step 4: Verify all three sections appear
|
|
199
|
-
assert.ok(qsResult.stdout.includes('Copilot Chat'), `Quickstart should show VS Code / Copilot Chat section for --client all. Output:\n${qsResult.stdout}`);
|
|
200
|
-
assert.ok(qsResult.stdout.includes('Copilot CLI'), `Quickstart should show Copilot CLI section for --client all.`);
|
|
201
|
-
assert.ok(qsResult.stdout.includes('Claude Code'), `Quickstart should show Claude Code section for --client all.`);
|
|
202
|
-
});
|
|
203
|
-
it('quickstart reads .beth-client.json written by init (not marker fallback)', { skip: SKIP_NO_BEADS }, () => {
|
|
204
|
-
// Run init --client claude-code
|
|
205
|
-
runCli(testDir, 'init', ['--client', 'claude-code', '--force', '--skip-beads']);
|
|
206
|
-
// Ensure quickstart prereqs
|
|
207
|
-
ensureAgentsDir(testDir);
|
|
208
|
-
simulateBeadsInit(testDir);
|
|
209
|
-
// Verify the config file exists and quickstart uses it
|
|
210
|
-
const configPath = join(testDir, '.github', '.beth-client.json');
|
|
211
|
-
assert.ok(existsSync(configPath), '.beth-client.json should have been written by init');
|
|
212
|
-
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
213
|
-
assert.strictEqual(config.claudeCode, true, 'Config should have claudeCode: true');
|
|
214
|
-
const qsResult = runCli(testDir, 'quickstart');
|
|
215
|
-
// Should show Claude Code guidance (proves config was read, not marker fallback)
|
|
216
|
-
assert.ok(qsResult.stdout.includes('Claude Code'), 'Quickstart should use persisted config, not fallback to marker detection');
|
|
217
|
-
// Should NOT show VS Code guidance (marker fallback sees .github/agents/ → vscode)
|
|
218
|
-
assert.ok(!qsResult.stdout.includes('Copilot Chat'), 'Quickstart should NOT show VS Code guidance for claude-code config');
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
//# sourceMappingURL=init-quickstart.e2e.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-quickstart.e2e.test.js","sourceRoot":"","sources":["../../../src/cli/commands/init-quickstart.e2e.test.ts"],"names":[],"mappings":"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"}
|