@camaradesuk/git-worktree-tools 1.3.0 → 1.4.1
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/README.md +290 -3
- package/dist/api/clean.d.ts +65 -0
- package/dist/api/clean.d.ts.map +1 -0
- package/dist/api/clean.js +209 -0
- package/dist/api/clean.js.map +1 -0
- package/dist/api/create.d.ts +88 -0
- package/dist/api/create.d.ts.map +1 -0
- package/dist/api/create.js +373 -0
- package/dist/api/create.js.map +1 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +19 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/list.d.ts +74 -0
- package/dist/api/list.d.ts.map +1 -0
- package/dist/api/list.js +80 -0
- package/dist/api/list.js.map +1 -0
- package/dist/api/state.d.ts +43 -0
- package/dist/api/state.d.ts.map +1 -0
- package/dist/api/state.js +70 -0
- package/dist/api/state.js.map +1 -0
- package/dist/cli/cleanpr.js +171 -28
- package/dist/cli/cleanpr.js.map +1 -1
- package/dist/cli/cleanpr.test.js +459 -7
- package/dist/cli/cleanpr.test.js.map +1 -1
- package/dist/cli/newpr.js +189 -28
- package/dist/cli/newpr.js.map +1 -1
- package/dist/cli/newpr.test.js +349 -0
- package/dist/cli/newpr.test.js.map +1 -1
- package/dist/cli/wtconfig.d.ts +14 -0
- package/dist/cli/wtconfig.d.ts.map +1 -0
- package/dist/cli/wtconfig.js +948 -0
- package/dist/cli/wtconfig.js.map +1 -0
- package/dist/cli/wtconfig.test.d.ts +5 -0
- package/dist/cli/wtconfig.test.d.ts.map +1 -0
- package/dist/cli/wtconfig.test.js +1281 -0
- package/dist/cli/wtconfig.test.js.map +1 -0
- package/dist/cli/wtlink.js +5 -0
- package/dist/cli/wtlink.js.map +1 -1
- package/dist/cli/wtstate.d.ts +8 -0
- package/dist/cli/wtstate.d.ts.map +1 -0
- package/dist/cli/wtstate.js +83 -0
- package/dist/cli/wtstate.js.map +1 -0
- package/dist/cli/wtstate.test.d.ts +5 -0
- package/dist/cli/wtstate.test.d.ts.map +1 -0
- package/dist/cli/wtstate.test.js +193 -0
- package/dist/cli/wtstate.test.js.map +1 -0
- package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts +2 -0
- package/dist/e2e/cleanpr/cleanpr.e2e.test.d.ts.map +1 -0
- package/dist/e2e/cleanpr/cleanpr.e2e.test.js +326 -0
- package/dist/e2e/cleanpr/cleanpr.e2e.test.js.map +1 -0
- package/dist/e2e/helpers/cli-runner.d.ts +103 -0
- package/dist/e2e/helpers/cli-runner.d.ts.map +1 -0
- package/dist/e2e/helpers/cli-runner.js +200 -0
- package/dist/e2e/helpers/cli-runner.js.map +1 -0
- package/dist/e2e/helpers/gh-mock.d.ts +87 -0
- package/dist/e2e/helpers/gh-mock.d.ts.map +1 -0
- package/dist/e2e/helpers/gh-mock.js +384 -0
- package/dist/e2e/helpers/gh-mock.js.map +1 -0
- package/dist/e2e/helpers/index.d.ts +12 -0
- package/dist/e2e/helpers/index.d.ts.map +1 -0
- package/dist/e2e/helpers/index.js +16 -0
- package/dist/e2e/helpers/index.js.map +1 -0
- package/dist/e2e/helpers/pty-wrapper.d.ts +118 -0
- package/dist/e2e/helpers/pty-wrapper.d.ts.map +1 -0
- package/dist/e2e/helpers/pty-wrapper.js +276 -0
- package/dist/e2e/helpers/pty-wrapper.js.map +1 -0
- package/dist/e2e/helpers/scenario-harness.d.ts +55 -0
- package/dist/e2e/helpers/scenario-harness.d.ts.map +1 -0
- package/dist/e2e/helpers/scenario-harness.js +360 -0
- package/dist/e2e/helpers/scenario-harness.js.map +1 -0
- package/dist/e2e/helpers/test-context.d.ts +120 -0
- package/dist/e2e/helpers/test-context.d.ts.map +1 -0
- package/dist/e2e/helpers/test-context.js +263 -0
- package/dist/e2e/helpers/test-context.js.map +1 -0
- package/dist/e2e/lswt/lswt.e2e.test.d.ts +2 -0
- package/dist/e2e/lswt/lswt.e2e.test.d.ts.map +1 -0
- package/dist/e2e/lswt/lswt.e2e.test.js +328 -0
- package/dist/e2e/lswt/lswt.e2e.test.js.map +1 -0
- package/dist/e2e/newpr/newpr.e2e.test.d.ts +2 -0
- package/dist/e2e/newpr/newpr.e2e.test.d.ts.map +1 -0
- package/dist/e2e/newpr/newpr.e2e.test.js +286 -0
- package/dist/e2e/newpr/newpr.e2e.test.js.map +1 -0
- package/dist/e2e/newpr/scenarios.e2e.test.d.ts +2 -0
- package/dist/e2e/newpr/scenarios.e2e.test.d.ts.map +1 -0
- package/dist/e2e/newpr/scenarios.e2e.test.js +426 -0
- package/dist/e2e/newpr/scenarios.e2e.test.js.map +1 -0
- package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts +2 -0
- package/dist/e2e/workflows/pr-lifecycle.e2e.test.d.ts.map +1 -0
- package/dist/e2e/workflows/pr-lifecycle.e2e.test.js +298 -0
- package/dist/e2e/workflows/pr-lifecycle.e2e.test.js.map +1 -0
- package/dist/e2e/wtlink/wtlink.e2e.test.d.ts +2 -0
- package/dist/e2e/wtlink/wtlink.e2e.test.d.ts.map +1 -0
- package/dist/e2e/wtlink/wtlink.e2e.test.js +364 -0
- package/dist/e2e/wtlink/wtlink.e2e.test.js.map +1 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/base-provider.d.ts +58 -0
- package/dist/lib/ai/base-provider.d.ts.map +1 -0
- package/dist/lib/ai/base-provider.js +246 -0
- package/dist/lib/ai/base-provider.js.map +1 -0
- package/dist/lib/ai/base-provider.test.d.ts +7 -0
- package/dist/lib/ai/base-provider.test.d.ts.map +1 -0
- package/dist/lib/ai/base-provider.test.js +320 -0
- package/dist/lib/ai/base-provider.test.js.map +1 -0
- package/dist/lib/ai/cli-provider.d.ts +87 -0
- package/dist/lib/ai/cli-provider.d.ts.map +1 -0
- package/dist/lib/ai/cli-provider.js +280 -0
- package/dist/lib/ai/cli-provider.js.map +1 -0
- package/dist/lib/ai/cli-provider.test.d.ts +5 -0
- package/dist/lib/ai/cli-provider.test.d.ts.map +1 -0
- package/dist/lib/ai/cli-provider.test.js +462 -0
- package/dist/lib/ai/cli-provider.test.js.map +1 -0
- package/dist/lib/ai/fallback-provider.d.ts +20 -0
- package/dist/lib/ai/fallback-provider.d.ts.map +1 -0
- package/dist/lib/ai/fallback-provider.js +125 -0
- package/dist/lib/ai/fallback-provider.js.map +1 -0
- package/dist/lib/ai/fallback-provider.test.d.ts +7 -0
- package/dist/lib/ai/fallback-provider.test.d.ts.map +1 -0
- package/dist/lib/ai/fallback-provider.test.js +165 -0
- package/dist/lib/ai/fallback-provider.test.js.map +1 -0
- package/dist/lib/ai/generation-service.d.ts +44 -0
- package/dist/lib/ai/generation-service.d.ts.map +1 -0
- package/dist/lib/ai/generation-service.js +107 -0
- package/dist/lib/ai/generation-service.js.map +1 -0
- package/dist/lib/ai/generation-service.test.d.ts +7 -0
- package/dist/lib/ai/generation-service.test.d.ts.map +1 -0
- package/dist/lib/ai/generation-service.test.js +213 -0
- package/dist/lib/ai/generation-service.test.js.map +1 -0
- package/dist/lib/ai/index.d.ts +19 -0
- package/dist/lib/ai/index.d.ts.map +1 -0
- package/dist/lib/ai/index.js +22 -0
- package/dist/lib/ai/index.js.map +1 -0
- package/dist/lib/ai/provider-manager.d.ts +109 -0
- package/dist/lib/ai/provider-manager.d.ts.map +1 -0
- package/dist/lib/ai/provider-manager.js +270 -0
- package/dist/lib/ai/provider-manager.js.map +1 -0
- package/dist/lib/ai/provider-manager.test.d.ts +5 -0
- package/dist/lib/ai/provider-manager.test.d.ts.map +1 -0
- package/dist/lib/ai/provider-manager.test.js +312 -0
- package/dist/lib/ai/provider-manager.test.js.map +1 -0
- package/dist/lib/ai/types.d.ts +166 -0
- package/dist/lib/ai/types.d.ts.map +1 -0
- package/dist/lib/ai/types.js +19 -0
- package/dist/lib/ai/types.js.map +1 -0
- package/dist/lib/cleanpr/args.d.ts.map +1 -1
- package/dist/lib/cleanpr/args.js +18 -0
- package/dist/lib/cleanpr/args.js.map +1 -1
- package/dist/lib/cleanpr/args.test.js +88 -11
- package/dist/lib/cleanpr/args.test.js.map +1 -1
- package/dist/lib/cleanpr/cleanup.d.ts +2 -0
- package/dist/lib/cleanpr/cleanup.d.ts.map +1 -1
- package/dist/lib/cleanpr/cleanup.js +30 -2
- package/dist/lib/cleanpr/cleanup.js.map +1 -1
- package/dist/lib/cleanpr/cleanup.test.js +37 -5
- package/dist/lib/cleanpr/cleanup.test.js.map +1 -1
- package/dist/lib/cleanpr/types.d.ts +10 -0
- package/dist/lib/cleanpr/types.d.ts.map +1 -1
- package/dist/lib/cleanpr/worktree-info.test.js +72 -1
- package/dist/lib/cleanpr/worktree-info.test.js.map +1 -1
- package/dist/lib/config.d.ts +170 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +129 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.js +406 -2
- package/dist/lib/config.test.js.map +1 -1
- package/dist/lib/hooks/executor.d.ts +35 -0
- package/dist/lib/hooks/executor.d.ts.map +1 -0
- package/dist/lib/hooks/executor.js +401 -0
- package/dist/lib/hooks/executor.js.map +1 -0
- package/dist/lib/hooks/executor.test.d.ts +5 -0
- package/dist/lib/hooks/executor.test.d.ts.map +1 -0
- package/dist/lib/hooks/executor.test.js +648 -0
- package/dist/lib/hooks/executor.test.js.map +1 -0
- package/dist/lib/hooks/index.d.ts +25 -0
- package/dist/lib/hooks/index.d.ts.map +1 -0
- package/dist/lib/hooks/index.js +26 -0
- package/dist/lib/hooks/index.js.map +1 -0
- package/dist/lib/hooks/templates.d.ts +74 -0
- package/dist/lib/hooks/templates.d.ts.map +1 -0
- package/dist/lib/hooks/templates.js +270 -0
- package/dist/lib/hooks/templates.js.map +1 -0
- package/dist/lib/hooks/templates.test.d.ts +5 -0
- package/dist/lib/hooks/templates.test.d.ts.map +1 -0
- package/dist/lib/hooks/templates.test.js +163 -0
- package/dist/lib/hooks/templates.test.js.map +1 -0
- package/dist/lib/hooks/types.d.ts +161 -0
- package/dist/lib/hooks/types.d.ts.map +1 -0
- package/dist/lib/hooks/types.js +73 -0
- package/dist/lib/hooks/types.js.map +1 -0
- package/dist/lib/hooks/types.test.d.ts +5 -0
- package/dist/lib/hooks/types.test.d.ts.map +1 -0
- package/dist/lib/hooks/types.test.js +132 -0
- package/dist/lib/hooks/types.test.js.map +1 -0
- package/dist/lib/json-output.d.ts +172 -0
- package/dist/lib/json-output.d.ts.map +1 -0
- package/dist/lib/json-output.js +134 -0
- package/dist/lib/json-output.js.map +1 -0
- package/dist/lib/json-output.test.d.ts +5 -0
- package/dist/lib/json-output.test.d.ts.map +1 -0
- package/dist/lib/json-output.test.js +259 -0
- package/dist/lib/json-output.test.js.map +1 -0
- package/dist/lib/lswt/action-executors.test.js +6 -0
- package/dist/lib/lswt/action-executors.test.js.map +1 -1
- package/dist/lib/newpr/action-deps.d.ts +15 -0
- package/dist/lib/newpr/action-deps.d.ts.map +1 -0
- package/dist/lib/newpr/action-deps.js +22 -0
- package/dist/lib/newpr/action-deps.js.map +1 -0
- package/dist/lib/newpr/args.d.ts.map +1 -1
- package/dist/lib/newpr/args.js +56 -0
- package/dist/lib/newpr/args.js.map +1 -1
- package/dist/lib/newpr/hook-runner.d.ts +80 -0
- package/dist/lib/newpr/hook-runner.d.ts.map +1 -0
- package/dist/lib/newpr/hook-runner.js +182 -0
- package/dist/lib/newpr/hook-runner.js.map +1 -0
- package/dist/lib/newpr/hook-runner.test.d.ts +7 -0
- package/dist/lib/newpr/hook-runner.test.d.ts.map +1 -0
- package/dist/lib/newpr/hook-runner.test.js +301 -0
- package/dist/lib/newpr/hook-runner.test.js.map +1 -0
- package/dist/lib/newpr/index.d.ts +3 -0
- package/dist/lib/newpr/index.d.ts.map +1 -1
- package/dist/lib/newpr/index.js +3 -0
- package/dist/lib/newpr/index.js.map +1 -1
- package/dist/lib/newpr/types.d.ts +9 -0
- package/dist/lib/newpr/types.d.ts.map +1 -1
- package/dist/lib/wtconfig/config-manager.d.ts +72 -0
- package/dist/lib/wtconfig/config-manager.d.ts.map +1 -0
- package/dist/lib/wtconfig/config-manager.js +408 -0
- package/dist/lib/wtconfig/config-manager.js.map +1 -0
- package/dist/lib/wtconfig/config-manager.test.d.ts +5 -0
- package/dist/lib/wtconfig/config-manager.test.d.ts.map +1 -0
- package/dist/lib/wtconfig/config-manager.test.js +501 -0
- package/dist/lib/wtconfig/config-manager.test.js.map +1 -0
- package/dist/lib/wtconfig/environment.d.ts +23 -0
- package/dist/lib/wtconfig/environment.d.ts.map +1 -0
- package/dist/lib/wtconfig/environment.js +242 -0
- package/dist/lib/wtconfig/environment.js.map +1 -0
- package/dist/lib/wtconfig/environment.test.d.ts +5 -0
- package/dist/lib/wtconfig/environment.test.d.ts.map +1 -0
- package/dist/lib/wtconfig/environment.test.js +246 -0
- package/dist/lib/wtconfig/environment.test.js.map +1 -0
- package/dist/lib/wtconfig/index.d.ts +7 -0
- package/dist/lib/wtconfig/index.d.ts.map +1 -0
- package/dist/lib/wtconfig/index.js +8 -0
- package/dist/lib/wtconfig/index.js.map +1 -0
- package/dist/lib/wtconfig/types.d.ts +97 -0
- package/dist/lib/wtconfig/types.d.ts.map +1 -0
- package/dist/lib/wtconfig/types.js +5 -0
- package/dist/lib/wtconfig/types.js.map +1 -0
- package/dist/lib/wtstate/analyze.d.ts +13 -0
- package/dist/lib/wtstate/analyze.d.ts.map +1 -0
- package/dist/lib/wtstate/analyze.js +165 -0
- package/dist/lib/wtstate/analyze.js.map +1 -0
- package/dist/lib/wtstate/analyze.test.d.ts +5 -0
- package/dist/lib/wtstate/analyze.test.d.ts.map +1 -0
- package/dist/lib/wtstate/analyze.test.js +282 -0
- package/dist/lib/wtstate/analyze.test.js.map +1 -0
- package/dist/lib/wtstate/args.d.ts +17 -0
- package/dist/lib/wtstate/args.d.ts.map +1 -0
- package/dist/lib/wtstate/args.js +91 -0
- package/dist/lib/wtstate/args.js.map +1 -0
- package/dist/lib/wtstate/args.test.d.ts +5 -0
- package/dist/lib/wtstate/args.test.d.ts.map +1 -0
- package/dist/lib/wtstate/args.test.js +120 -0
- package/dist/lib/wtstate/args.test.js.map +1 -0
- package/dist/lib/wtstate/index.d.ts +7 -0
- package/dist/lib/wtstate/index.d.ts.map +1 -0
- package/dist/lib/wtstate/index.js +8 -0
- package/dist/lib/wtstate/index.js.map +1 -0
- package/dist/lib/wtstate/types.d.ts +64 -0
- package/dist/lib/wtstate/types.d.ts.map +1 -0
- package/dist/lib/wtstate/types.js +5 -0
- package/dist/lib/wtstate/types.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +339 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/server.test.d.ts +9 -0
- package/dist/mcp/server.test.d.ts.map +1 -0
- package/dist/mcp/server.test.js +390 -0
- package/dist/mcp/server.test.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
const DEFAULT_OPTIONS = {
|
|
6
|
+
baseBranch: 'main',
|
|
7
|
+
userEmail: 'test@test.com',
|
|
8
|
+
userName: 'Test User',
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Execute a git command in a directory
|
|
12
|
+
*/
|
|
13
|
+
function git(args, cwd, options = {}) {
|
|
14
|
+
try {
|
|
15
|
+
return execSync(`git ${args}`, {
|
|
16
|
+
cwd,
|
|
17
|
+
encoding: 'utf8',
|
|
18
|
+
stdio: options.stdio || 'pipe',
|
|
19
|
+
}).trim();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (options.stdio === 'ignore') {
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create base repository structure with origin
|
|
30
|
+
*/
|
|
31
|
+
function createBaseRepo(tempDir, options) {
|
|
32
|
+
const originPath = path.join(tempDir, 'origin.git');
|
|
33
|
+
const repoPath = path.join(tempDir, 'main-repo');
|
|
34
|
+
// Create bare origin
|
|
35
|
+
fs.mkdirSync(originPath);
|
|
36
|
+
git('init --bare', originPath);
|
|
37
|
+
// Create working repo
|
|
38
|
+
fs.mkdirSync(repoPath);
|
|
39
|
+
git('init', repoPath);
|
|
40
|
+
git(`config user.email "${options.userEmail}"`, repoPath);
|
|
41
|
+
git(`config user.name "${options.userName}"`, repoPath);
|
|
42
|
+
// Create initial commit
|
|
43
|
+
fs.writeFileSync(path.join(repoPath, 'README.md'), '# Test Repository\n');
|
|
44
|
+
git('add .', repoPath);
|
|
45
|
+
git('commit -m "Initial commit"', repoPath);
|
|
46
|
+
// Rename to main branch
|
|
47
|
+
git(`branch -M ${options.baseBranch}`, repoPath, { stdio: 'ignore' });
|
|
48
|
+
// Add origin and push
|
|
49
|
+
git(`remote add origin "${originPath}"`, repoPath);
|
|
50
|
+
git(`push -u origin ${options.baseBranch}`, repoPath, { stdio: 'ignore' });
|
|
51
|
+
return { repoPath, originPath };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create Scenario 1: main_clean_same
|
|
55
|
+
* On main, same as origin/main, clean working tree
|
|
56
|
+
*/
|
|
57
|
+
function createMainCleanSame(tempDir, options) {
|
|
58
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
59
|
+
return {
|
|
60
|
+
scenario: 'main_clean_same',
|
|
61
|
+
repoPath,
|
|
62
|
+
originPath,
|
|
63
|
+
tempDir,
|
|
64
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create Scenario 2a: main_staged_same
|
|
69
|
+
* On main, same as origin/main, has staged changes
|
|
70
|
+
*/
|
|
71
|
+
function createMainStagedSame(tempDir, options) {
|
|
72
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
73
|
+
// Create and stage a new file
|
|
74
|
+
fs.writeFileSync(path.join(repoPath, 'staged-file.ts'), 'export const x = 1;\n');
|
|
75
|
+
git('add staged-file.ts', repoPath);
|
|
76
|
+
return {
|
|
77
|
+
scenario: 'main_staged_same',
|
|
78
|
+
repoPath,
|
|
79
|
+
originPath,
|
|
80
|
+
tempDir,
|
|
81
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create Scenario 2b: main_unstaged_same
|
|
86
|
+
* On main, same as origin/main, has unstaged changes
|
|
87
|
+
*/
|
|
88
|
+
function createMainUnstagedSame(tempDir, options) {
|
|
89
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
90
|
+
// Create an untracked file
|
|
91
|
+
fs.mkdirSync(path.join(repoPath, 'docs'), { recursive: true });
|
|
92
|
+
fs.writeFileSync(path.join(repoPath, 'docs', 'new-file.md'), '# New documentation\n');
|
|
93
|
+
return {
|
|
94
|
+
scenario: 'main_unstaged_same',
|
|
95
|
+
repoPath,
|
|
96
|
+
originPath,
|
|
97
|
+
tempDir,
|
|
98
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create Scenario 2c: main_both_same
|
|
103
|
+
* On main, same as origin/main, has both staged and unstaged changes
|
|
104
|
+
*/
|
|
105
|
+
function createMainBothSame(tempDir, options) {
|
|
106
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
107
|
+
// Create and stage one file
|
|
108
|
+
fs.writeFileSync(path.join(repoPath, 'staged-file.ts'), 'export const staged = true;\n');
|
|
109
|
+
git('add staged-file.ts', repoPath);
|
|
110
|
+
// Create an untracked file
|
|
111
|
+
fs.writeFileSync(path.join(repoPath, 'unstaged-file.ts'), 'export const unstaged = true;\n');
|
|
112
|
+
return {
|
|
113
|
+
scenario: 'main_both_same',
|
|
114
|
+
repoPath,
|
|
115
|
+
originPath,
|
|
116
|
+
tempDir,
|
|
117
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create Scenario 3: main_clean_ahead
|
|
122
|
+
* On main, ahead of origin/main, clean working tree
|
|
123
|
+
*/
|
|
124
|
+
function createMainCleanAhead(tempDir, options) {
|
|
125
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
126
|
+
// Create a local commit (not pushed)
|
|
127
|
+
fs.writeFileSync(path.join(repoPath, 'local-feature.ts'), 'export const feature = 1;\n');
|
|
128
|
+
git('add .', repoPath);
|
|
129
|
+
git('commit -m "Add local feature"', repoPath);
|
|
130
|
+
return {
|
|
131
|
+
scenario: 'main_clean_ahead',
|
|
132
|
+
repoPath,
|
|
133
|
+
originPath,
|
|
134
|
+
tempDir,
|
|
135
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Create Scenario 4: main_changes_ahead
|
|
140
|
+
* On main, ahead of origin/main, has uncommitted changes
|
|
141
|
+
*/
|
|
142
|
+
function createMainChangesAhead(tempDir, options) {
|
|
143
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
144
|
+
// Create a local commit (not pushed)
|
|
145
|
+
fs.writeFileSync(path.join(repoPath, 'local-feature.ts'), 'export const feature = 1;\n');
|
|
146
|
+
git('add .', repoPath);
|
|
147
|
+
git('commit -m "Add local feature"', repoPath);
|
|
148
|
+
// Create uncommitted changes
|
|
149
|
+
fs.writeFileSync(path.join(repoPath, 'work-in-progress.ts'), 'export const wip = true;\n');
|
|
150
|
+
return {
|
|
151
|
+
scenario: 'main_changes_ahead',
|
|
152
|
+
repoPath,
|
|
153
|
+
originPath,
|
|
154
|
+
tempDir,
|
|
155
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Create Scenario 5: branch_same_as_main
|
|
160
|
+
* On feature branch at same commit as main, clean
|
|
161
|
+
*/
|
|
162
|
+
function createBranchSameAsMain(tempDir, options) {
|
|
163
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
164
|
+
// Create a branch at the same commit as main
|
|
165
|
+
git('checkout -b feature-branch', repoPath);
|
|
166
|
+
return {
|
|
167
|
+
scenario: 'branch_same_as_main',
|
|
168
|
+
repoPath,
|
|
169
|
+
originPath,
|
|
170
|
+
tempDir,
|
|
171
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create Scenario 6: branch_ancestor
|
|
176
|
+
* On feature branch that is already merged into main (ancestor)
|
|
177
|
+
*/
|
|
178
|
+
function createBranchAncestor(tempDir, options) {
|
|
179
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
180
|
+
// Create a feature branch
|
|
181
|
+
git('checkout -b old-feature', repoPath);
|
|
182
|
+
// Go back to main and add commits that include this branch's point
|
|
183
|
+
git(`checkout ${options.baseBranch}`, repoPath);
|
|
184
|
+
fs.writeFileSync(path.join(repoPath, 'new-main-feature.ts'), 'export const newer = 1;\n');
|
|
185
|
+
git('add .', repoPath);
|
|
186
|
+
git('commit -m "Add newer feature on main"', repoPath);
|
|
187
|
+
// Go back to the old feature branch (which is now an ancestor of main)
|
|
188
|
+
git('checkout old-feature', repoPath);
|
|
189
|
+
return {
|
|
190
|
+
scenario: 'branch_ancestor',
|
|
191
|
+
repoPath,
|
|
192
|
+
originPath,
|
|
193
|
+
tempDir,
|
|
194
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Create Scenario 7: branch_divergent
|
|
199
|
+
* On feature branch with commits not in main
|
|
200
|
+
*/
|
|
201
|
+
function createBranchDivergent(tempDir, options) {
|
|
202
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
203
|
+
// Create a feature branch with unique commits
|
|
204
|
+
git('checkout -b divergent-feature', repoPath);
|
|
205
|
+
fs.writeFileSync(path.join(repoPath, 'feature.ts'), 'export const feature = 1;\n');
|
|
206
|
+
git('add .', repoPath);
|
|
207
|
+
git('commit -m "Add feature"', repoPath);
|
|
208
|
+
return {
|
|
209
|
+
scenario: 'branch_divergent',
|
|
210
|
+
repoPath,
|
|
211
|
+
originPath,
|
|
212
|
+
tempDir,
|
|
213
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Create Scenario 8: branch_with_changes
|
|
218
|
+
* On feature branch with uncommitted changes
|
|
219
|
+
*/
|
|
220
|
+
function createBranchWithChanges(tempDir, options) {
|
|
221
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
222
|
+
// Create a feature branch with a commit
|
|
223
|
+
git('checkout -b feature-with-changes', repoPath);
|
|
224
|
+
fs.writeFileSync(path.join(repoPath, 'feature.ts'), 'export const feature = 1;\n');
|
|
225
|
+
git('add .', repoPath);
|
|
226
|
+
git('commit -m "Add feature"', repoPath);
|
|
227
|
+
// Add uncommitted changes
|
|
228
|
+
fs.writeFileSync(path.join(repoPath, 'wip.ts'), 'export const wip = true;\n');
|
|
229
|
+
return {
|
|
230
|
+
scenario: 'branch_with_changes',
|
|
231
|
+
repoPath,
|
|
232
|
+
originPath,
|
|
233
|
+
tempDir,
|
|
234
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Create Scenario 9: detached_head
|
|
239
|
+
* In detached HEAD state
|
|
240
|
+
*/
|
|
241
|
+
function createDetachedHead(tempDir, options) {
|
|
242
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
243
|
+
// Get current commit SHA
|
|
244
|
+
const sha = git('rev-parse HEAD', repoPath);
|
|
245
|
+
// Checkout the SHA directly (detached HEAD)
|
|
246
|
+
git(`checkout ${sha}`, repoPath, { stdio: 'ignore' });
|
|
247
|
+
return {
|
|
248
|
+
scenario: 'detached_head',
|
|
249
|
+
repoPath,
|
|
250
|
+
originPath,
|
|
251
|
+
tempDir,
|
|
252
|
+
cleanup: () => fs.rmSync(tempDir, { recursive: true, force: true }),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create Scenario 10: pr_worktree
|
|
257
|
+
* Running from a PR worktree
|
|
258
|
+
*/
|
|
259
|
+
function createPrWorktree(tempDir, options) {
|
|
260
|
+
const { repoPath, originPath } = createBaseRepo(tempDir, options);
|
|
261
|
+
// Create a feature branch
|
|
262
|
+
git('checkout -b pr-feature', repoPath);
|
|
263
|
+
fs.writeFileSync(path.join(repoPath, 'feature.ts'), 'export const feature = 1;\n');
|
|
264
|
+
git('add .', repoPath);
|
|
265
|
+
git('commit -m "Add feature"', repoPath);
|
|
266
|
+
// Go back to main
|
|
267
|
+
git(`checkout ${options.baseBranch}`, repoPath);
|
|
268
|
+
// Create a worktree with PR naming pattern
|
|
269
|
+
const worktreePath = path.join(tempDir, 'main-repo.pr42');
|
|
270
|
+
git(`worktree add "${worktreePath}" pr-feature`, repoPath);
|
|
271
|
+
return {
|
|
272
|
+
scenario: 'pr_worktree',
|
|
273
|
+
repoPath,
|
|
274
|
+
originPath,
|
|
275
|
+
tempDir,
|
|
276
|
+
worktreePath,
|
|
277
|
+
cleanup: () => {
|
|
278
|
+
// Remove worktree first
|
|
279
|
+
try {
|
|
280
|
+
git('worktree prune', repoPath, { stdio: 'ignore' });
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
// Ignore
|
|
284
|
+
}
|
|
285
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Create a git repository in a specific scenario state
|
|
291
|
+
*
|
|
292
|
+
* @param scenario - The scenario to create
|
|
293
|
+
* @param options - Configuration options
|
|
294
|
+
* @returns Setup information with cleanup function
|
|
295
|
+
*/
|
|
296
|
+
export function createScenario(scenario, options = {}) {
|
|
297
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
298
|
+
// Create temp directory with proper path resolution for cross-platform
|
|
299
|
+
const tempDir = fs.realpathSync.native(fs.mkdtempSync(path.join(os.tmpdir(), `e2e-scenario-${scenario}-`)));
|
|
300
|
+
const creators = {
|
|
301
|
+
main_clean_same: createMainCleanSame,
|
|
302
|
+
main_staged_same: createMainStagedSame,
|
|
303
|
+
main_unstaged_same: createMainUnstagedSame,
|
|
304
|
+
main_both_same: createMainBothSame,
|
|
305
|
+
main_clean_ahead: createMainCleanAhead,
|
|
306
|
+
main_changes_ahead: createMainChangesAhead,
|
|
307
|
+
branch_same_as_main: createBranchSameAsMain,
|
|
308
|
+
branch_ancestor: createBranchAncestor,
|
|
309
|
+
branch_divergent: createBranchDivergent,
|
|
310
|
+
branch_with_changes: createBranchWithChanges,
|
|
311
|
+
detached_head: createDetachedHead,
|
|
312
|
+
pr_worktree: createPrWorktree,
|
|
313
|
+
};
|
|
314
|
+
const creator = creators[scenario];
|
|
315
|
+
if (!creator) {
|
|
316
|
+
throw new Error(`Unknown scenario: ${scenario}`);
|
|
317
|
+
}
|
|
318
|
+
return creator(tempDir, opts);
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* All available scenarios
|
|
322
|
+
*/
|
|
323
|
+
export const ALL_SCENARIOS = [
|
|
324
|
+
'main_clean_same',
|
|
325
|
+
'main_staged_same',
|
|
326
|
+
'main_unstaged_same',
|
|
327
|
+
'main_both_same',
|
|
328
|
+
'main_clean_ahead',
|
|
329
|
+
'main_changes_ahead',
|
|
330
|
+
'branch_same_as_main',
|
|
331
|
+
'branch_ancestor',
|
|
332
|
+
'branch_divergent',
|
|
333
|
+
'branch_with_changes',
|
|
334
|
+
'detached_head',
|
|
335
|
+
'pr_worktree',
|
|
336
|
+
];
|
|
337
|
+
/**
|
|
338
|
+
* Create all scenarios at once (useful for parallel testing)
|
|
339
|
+
*
|
|
340
|
+
* @param options - Configuration options
|
|
341
|
+
* @returns Map of scenario to setup
|
|
342
|
+
*/
|
|
343
|
+
export function createAllScenarios(options = {}) {
|
|
344
|
+
const setups = new Map();
|
|
345
|
+
for (const scenario of ALL_SCENARIOS) {
|
|
346
|
+
setups.set(scenario, createScenario(scenario, options));
|
|
347
|
+
}
|
|
348
|
+
return setups;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Clean up all scenarios from a map
|
|
352
|
+
*
|
|
353
|
+
* @param setups - Map of scenario setups to clean
|
|
354
|
+
*/
|
|
355
|
+
export function cleanupAllScenarios(setups) {
|
|
356
|
+
for (const setup of setups.values()) {
|
|
357
|
+
setup.cleanup();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=scenario-harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-harness.js","sourceRoot":"","sources":["../../../src/e2e/helpers/scenario-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { Scenario } from '../../lib/state-detection.js';
|
|
2
|
+
import { type GhMockSetup, type GhMockOptions } from './gh-mock.js';
|
|
3
|
+
import { type ScenarioOptions } from './scenario-harness.js';
|
|
4
|
+
/**
|
|
5
|
+
* Options for creating a test context
|
|
6
|
+
*/
|
|
7
|
+
export interface TestContextOptions {
|
|
8
|
+
/** Scenario to create (if provided, creates a scenario-specific repo) */
|
|
9
|
+
scenario?: Scenario;
|
|
10
|
+
/** Options for the scenario */
|
|
11
|
+
scenarioOptions?: ScenarioOptions;
|
|
12
|
+
/** Options for the gh mock */
|
|
13
|
+
ghMockOptions?: GhMockOptions;
|
|
14
|
+
/** Skip the gh mock (for tests that don't need it) */
|
|
15
|
+
skipGhMock?: boolean;
|
|
16
|
+
/** Create a bare minimum repo instead of a full scenario */
|
|
17
|
+
minimalRepo?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Test context containing all test resources
|
|
21
|
+
*/
|
|
22
|
+
export interface TestContext {
|
|
23
|
+
/** Temp directory containing all test resources */
|
|
24
|
+
tempDir: string;
|
|
25
|
+
/** Path to the test repository */
|
|
26
|
+
repoDir: string;
|
|
27
|
+
/** Path to the origin (bare) repository */
|
|
28
|
+
originDir?: string;
|
|
29
|
+
/** Path to worktree (if created) */
|
|
30
|
+
worktreeDir?: string;
|
|
31
|
+
/** The scenario that was created (if any) */
|
|
32
|
+
scenario?: Scenario;
|
|
33
|
+
/** The gh mock setup */
|
|
34
|
+
ghMock?: GhMockSetup;
|
|
35
|
+
/** Environment variables to use when running CLI commands */
|
|
36
|
+
env: NodeJS.ProcessEnv;
|
|
37
|
+
/** Clean up all resources */
|
|
38
|
+
cleanup: () => void;
|
|
39
|
+
/** Reset the repo to a clean state */
|
|
40
|
+
reset: () => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a test context with isolated resources
|
|
44
|
+
*
|
|
45
|
+
* @param options - Context options
|
|
46
|
+
* @returns Test context with cleanup
|
|
47
|
+
*/
|
|
48
|
+
export declare function createTestContext(options?: TestContextOptions): TestContext;
|
|
49
|
+
/**
|
|
50
|
+
* Vitest fixture factory for test contexts
|
|
51
|
+
*
|
|
52
|
+
* Usage:
|
|
53
|
+
* ```typescript
|
|
54
|
+
* describe('my tests', () => {
|
|
55
|
+
* let ctx: TestContext;
|
|
56
|
+
*
|
|
57
|
+
* beforeAll(() => {
|
|
58
|
+
* ctx = createTestContext({ scenario: 'main_clean_same' });
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* afterAll(() => {
|
|
62
|
+
* ctx.cleanup();
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* beforeEach(() => {
|
|
66
|
+
* ctx.reset();
|
|
67
|
+
* });
|
|
68
|
+
* });
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function useTestContext(options?: TestContextOptions): {
|
|
72
|
+
create: () => TestContext;
|
|
73
|
+
cleanup: (ctx: TestContext) => void;
|
|
74
|
+
reset: (ctx: TestContext) => void;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Create multiple test contexts for different scenarios
|
|
78
|
+
*
|
|
79
|
+
* @param scenarios - List of scenarios to create
|
|
80
|
+
* @param options - Common options for all contexts
|
|
81
|
+
* @returns Map of scenario to context
|
|
82
|
+
*/
|
|
83
|
+
export declare function createMultiScenarioContexts(scenarios: Scenario[], options?: Omit<TestContextOptions, 'scenario'>): Map<Scenario, TestContext>;
|
|
84
|
+
/**
|
|
85
|
+
* Clean up all contexts from a map
|
|
86
|
+
*
|
|
87
|
+
* @param contexts - Map of contexts to clean up
|
|
88
|
+
*/
|
|
89
|
+
export declare function cleanupAllContexts(contexts: Map<Scenario, TestContext>): void;
|
|
90
|
+
/**
|
|
91
|
+
* Helper to add a file to the test repo
|
|
92
|
+
*/
|
|
93
|
+
export declare function addFile(ctx: TestContext, relativePath: string, content: string, options?: {
|
|
94
|
+
stage?: boolean;
|
|
95
|
+
commit?: boolean;
|
|
96
|
+
message?: string;
|
|
97
|
+
}): void;
|
|
98
|
+
/**
|
|
99
|
+
* Helper to create a branch in the test repo
|
|
100
|
+
*/
|
|
101
|
+
export declare function createBranch(ctx: TestContext, branchName: string, options?: {
|
|
102
|
+
checkout?: boolean;
|
|
103
|
+
from?: string;
|
|
104
|
+
}): void;
|
|
105
|
+
/**
|
|
106
|
+
* Helper to create a worktree in the test repo
|
|
107
|
+
*/
|
|
108
|
+
export declare function createWorktree(ctx: TestContext, worktreePath: string, branchName: string, options?: {
|
|
109
|
+
create?: boolean;
|
|
110
|
+
}): string;
|
|
111
|
+
/**
|
|
112
|
+
* Helper to get git status info
|
|
113
|
+
*/
|
|
114
|
+
export declare function getGitStatus(ctx: TestContext): {
|
|
115
|
+
branch: string;
|
|
116
|
+
staged: string[];
|
|
117
|
+
unstaged: string[];
|
|
118
|
+
untracked: string[];
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=test-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-context.d.ts","sourceRoot":"","sources":["../../../src/e2e/helpers/test-context.ts"],"names":[],"mappings":"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"}
|