@camaradesuk/git-worktree-tools 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/api/list.d.ts +10 -4
  2. package/dist/api/list.d.ts.map +1 -1
  3. package/dist/api/list.js +5 -1
  4. package/dist/api/list.js.map +1 -1
  5. package/dist/api/list.test.d.ts +5 -0
  6. package/dist/api/list.test.d.ts.map +1 -0
  7. package/dist/api/list.test.js +390 -0
  8. package/dist/api/list.test.js.map +1 -0
  9. package/dist/cli/newpr.js +7 -1
  10. package/dist/cli/newpr.js.map +1 -1
  11. package/dist/cli/newpr.test.js +8 -8
  12. package/dist/cli/newpr.test.js.map +1 -1
  13. package/dist/e2e/cli.e2e.test.js +59 -0
  14. package/dist/e2e/cli.e2e.test.js.map +1 -1
  15. package/dist/e2e/newpr-full-flow.e2e.test.d.ts +2 -0
  16. package/dist/e2e/newpr-full-flow.e2e.test.d.ts.map +1 -0
  17. package/dist/e2e/newpr-full-flow.e2e.test.js +279 -0
  18. package/dist/e2e/newpr-full-flow.e2e.test.js.map +1 -0
  19. package/dist/integration/lswt-remote-pr.integration.test.d.ts +2 -0
  20. package/dist/integration/lswt-remote-pr.integration.test.d.ts.map +1 -0
  21. package/dist/integration/lswt-remote-pr.integration.test.js +222 -0
  22. package/dist/integration/lswt-remote-pr.integration.test.js.map +1 -0
  23. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts +2 -0
  24. package/dist/integration/newpr-branchfrom-head.integration.test.d.ts.map +1 -0
  25. package/dist/integration/newpr-branchfrom-head.integration.test.js +498 -0
  26. package/dist/integration/newpr-branchfrom-head.integration.test.js.map +1 -0
  27. package/dist/lib/git.d.ts +1 -0
  28. package/dist/lib/git.d.ts.map +1 -1
  29. package/dist/lib/git.js +17 -30
  30. package/dist/lib/git.js.map +1 -1
  31. package/dist/lib/git.test.js +154 -123
  32. package/dist/lib/git.test.js.map +1 -1
  33. package/dist/lib/github.d.ts +45 -0
  34. package/dist/lib/github.d.ts.map +1 -1
  35. package/dist/lib/github.js +172 -0
  36. package/dist/lib/github.js.map +1 -1
  37. package/dist/lib/github.test.js +127 -1
  38. package/dist/lib/github.test.js.map +1 -1
  39. package/dist/lib/lswt/action-executors.d.ts.map +1 -1
  40. package/dist/lib/lswt/action-executors.js +143 -35
  41. package/dist/lib/lswt/action-executors.js.map +1 -1
  42. package/dist/lib/lswt/action-executors.test.js +362 -0
  43. package/dist/lib/lswt/action-executors.test.js.map +1 -1
  44. package/dist/lib/lswt/actions.d.ts.map +1 -1
  45. package/dist/lib/lswt/actions.js +38 -0
  46. package/dist/lib/lswt/actions.js.map +1 -1
  47. package/dist/lib/lswt/actions.test.js +126 -0
  48. package/dist/lib/lswt/actions.test.js.map +1 -1
  49. package/dist/lib/lswt/environment.d.ts +4 -0
  50. package/dist/lib/lswt/environment.d.ts.map +1 -1
  51. package/dist/lib/lswt/environment.js +23 -0
  52. package/dist/lib/lswt/environment.js.map +1 -1
  53. package/dist/lib/lswt/environment.test.js +129 -2
  54. package/dist/lib/lswt/environment.test.js.map +1 -1
  55. package/dist/lib/lswt/formatters.d.ts +1 -1
  56. package/dist/lib/lswt/formatters.d.ts.map +1 -1
  57. package/dist/lib/lswt/formatters.js +21 -1
  58. package/dist/lib/lswt/formatters.js.map +1 -1
  59. package/dist/lib/lswt/formatters.test.js +64 -0
  60. package/dist/lib/lswt/formatters.test.js.map +1 -1
  61. package/dist/lib/lswt/index.d.ts +2 -1
  62. package/dist/lib/lswt/index.d.ts.map +1 -1
  63. package/dist/lib/lswt/index.js +1 -2
  64. package/dist/lib/lswt/index.js.map +1 -1
  65. package/dist/lib/lswt/interactive.d.ts +42 -4
  66. package/dist/lib/lswt/interactive.d.ts.map +1 -1
  67. package/dist/lib/lswt/interactive.js +309 -56
  68. package/dist/lib/lswt/interactive.js.map +1 -1
  69. package/dist/lib/lswt/interactive.test.js +454 -66
  70. package/dist/lib/lswt/interactive.test.js.map +1 -1
  71. package/dist/lib/lswt/types.d.ts +8 -2
  72. package/dist/lib/lswt/types.d.ts.map +1 -1
  73. package/dist/lib/lswt/worktree-info.d.ts +11 -0
  74. package/dist/lib/lswt/worktree-info.d.ts.map +1 -1
  75. package/dist/lib/lswt/worktree-info.js +48 -0
  76. package/dist/lib/lswt/worktree-info.js.map +1 -1
  77. package/dist/lib/lswt/worktree-info.test.js +169 -0
  78. package/dist/lib/lswt/worktree-info.test.js.map +1 -1
  79. package/dist/lib/newpr/scenario-handler.d.ts.map +1 -1
  80. package/dist/lib/newpr/scenario-handler.js +14 -5
  81. package/dist/lib/newpr/scenario-handler.js.map +1 -1
  82. package/dist/lib/newpr/scenario-handler.test.js +6 -0
  83. package/dist/lib/newpr/scenario-handler.test.js.map +1 -1
  84. package/dist/mcp/server.test.js +49 -0
  85. package/dist/mcp/server.test.js.map +1 -1
  86. package/package.json +1 -1
@@ -0,0 +1,279 @@
1
+ import { describe, it, expect, beforeAll, beforeEach, afterEach } from 'vitest';
2
+ import { spawnSync } from 'child_process';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ /**
7
+ * Full flow E2E tests for newpr CLI with uncommitted files.
8
+ *
9
+ * These tests verify the complete workflow:
10
+ * 1. User has uncommitted files in main worktree
11
+ * 2. User runs `newpr "description"` and selects option to commit files
12
+ * 3. Files are moved to new PR branch and worktree is created
13
+ *
14
+ * GitHub CLI calls are mocked via NEWPR_MOCK_GITHUB=1 environment variable.
15
+ */
16
+ const CLI_DIR = path.resolve(__dirname, '../../dist/cli');
17
+ // Helper to run a CLI command with simulated input
18
+ function runCli(command, args = [], options = {}) {
19
+ const scriptPath = path.join(CLI_DIR, `${command}.js`);
20
+ const result = spawnSync('node', [scriptPath, ...args], {
21
+ cwd: options.cwd || process.cwd(),
22
+ encoding: 'utf-8',
23
+ input: options.input,
24
+ env: {
25
+ ...process.env,
26
+ FORCE_COLOR: '0', // Disable colors for consistent output
27
+ NEWPR_MOCK_GITHUB: '1', // Enable GitHub mock mode
28
+ ...options.env,
29
+ },
30
+ });
31
+ return {
32
+ stdout: result.stdout || '',
33
+ stderr: result.stderr || '',
34
+ exitCode: result.status ?? 1,
35
+ };
36
+ }
37
+ // Helper to run git commands (using spawnSync for proper argument handling)
38
+ function git(args, cwd) {
39
+ const result = spawnSync('git', args, {
40
+ cwd,
41
+ encoding: 'utf-8',
42
+ stdio: ['pipe', 'pipe', 'pipe'],
43
+ });
44
+ if (result.status !== 0) {
45
+ throw new Error(`git ${args.join(' ')} failed: ${result.stderr}`);
46
+ }
47
+ return (result.stdout || '').trim();
48
+ }
49
+ // Normalize line endings for cross-platform comparison
50
+ function normalizeLineEndings(content) {
51
+ return content.replace(/\r\n/g, '\n');
52
+ }
53
+ // Read file with normalized line endings
54
+ function readFileNormalized(filePath) {
55
+ return normalizeLineEndings(fs.readFileSync(filePath, 'utf-8'));
56
+ }
57
+ describe('newpr full flow e2e tests', () => {
58
+ let tempDir;
59
+ let mainRepoDir;
60
+ let bareOriginDir;
61
+ beforeAll(() => {
62
+ // Ensure CLI is built
63
+ const newprPath = path.join(CLI_DIR, 'newpr.js');
64
+ if (!fs.existsSync(newprPath)) {
65
+ throw new Error('CLI not built. Run "npm run build" before running e2e tests.');
66
+ }
67
+ });
68
+ beforeEach(() => {
69
+ // Create fresh temp directory for each test
70
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'newpr-fullflow-'));
71
+ // Create bare origin repository (simulates GitHub remote)
72
+ // Name it 'main-repo.git' so getRepoName extracts 'main-repo'
73
+ bareOriginDir = path.join(tempDir, 'main-repo.git');
74
+ fs.mkdirSync(bareOriginDir);
75
+ git(['init', '--bare'], bareOriginDir);
76
+ // Create main repository
77
+ mainRepoDir = path.join(tempDir, 'main-repo');
78
+ fs.mkdirSync(mainRepoDir);
79
+ git(['init', '-b', 'main'], mainRepoDir);
80
+ git(['config', 'user.email', 'test@test.com'], mainRepoDir);
81
+ git(['config', 'user.name', 'Test User'], mainRepoDir);
82
+ // Add remote pointing to bare origin
83
+ git(['remote', 'add', 'origin', bareOriginDir], mainRepoDir);
84
+ // Create initial commit
85
+ fs.writeFileSync(path.join(mainRepoDir, 'README.md'), '# Test Repo\n');
86
+ git(['add', '.'], mainRepoDir);
87
+ git(['commit', '-m', 'Initial commit'], mainRepoDir);
88
+ // Push to origin and set up tracking
89
+ git(['push', '-u', 'origin', 'main'], mainRepoDir);
90
+ });
91
+ afterEach(() => {
92
+ // Clean up temp directory
93
+ if (tempDir) {
94
+ fs.rmSync(tempDir, { recursive: true, force: true });
95
+ }
96
+ });
97
+ describe('main_unstaged_same scenario', () => {
98
+ it('stages and commits uncommitted files when user selects option 1', () => {
99
+ // Create an uncommitted file
100
+ const featureFile = path.join(mainRepoDir, 'feature.ts');
101
+ fs.writeFileSync(featureFile, 'export const feature = () => "hello";\n');
102
+ // Verify initial state - file is untracked
103
+ const statusBefore = git(['status', '--porcelain'], mainRepoDir);
104
+ expect(statusBefore).toContain('?? feature.ts');
105
+ // Run newpr with simulated input "1\n" to select option 1
106
+ // Option 1 = "Stage all and commit to the new PR branch"
107
+ const result = runCli('newpr', ['my-new-feature'], {
108
+ cwd: mainRepoDir,
109
+ input: '1\n',
110
+ });
111
+ // Should succeed
112
+ expect(result.exitCode).toBe(0);
113
+ // Verify PR was "created" (mocked)
114
+ expect(result.stdout).toMatch(/PR #\d+/);
115
+ expect(result.stdout).toContain('worktree ready');
116
+ // Verify a worktree was created
117
+ const worktreePath = path.join(tempDir, 'main-repo.pr1');
118
+ expect(fs.existsSync(worktreePath)).toBe(true);
119
+ // Verify the feature file exists in the worktree
120
+ const worktreeFeatureFile = path.join(worktreePath, 'feature.ts');
121
+ expect(fs.existsSync(worktreeFeatureFile)).toBe(true);
122
+ expect(fs.readFileSync(worktreeFeatureFile, 'utf-8')).toContain('export const feature');
123
+ });
124
+ it('preserves file content through the entire workflow', () => {
125
+ // Create multiple uncommitted files
126
+ fs.mkdirSync(path.join(mainRepoDir, 'src'), { recursive: true });
127
+ fs.writeFileSync(path.join(mainRepoDir, 'src/index.ts'), 'export * from "./utils";\n');
128
+ fs.writeFileSync(path.join(mainRepoDir, 'src/utils.ts'), 'export const utils = { version: "1.0.0" };\n');
129
+ fs.writeFileSync(path.join(mainRepoDir, 'package.json'), JSON.stringify({ name: 'test', version: '1.0.0' }, null, 2));
130
+ // Run newpr with option 1
131
+ const result = runCli('newpr', ['add-utils-module'], {
132
+ cwd: mainRepoDir,
133
+ input: '1\n',
134
+ });
135
+ expect(result.exitCode).toBe(0);
136
+ // Verify all files exist in the worktree with correct content
137
+ const worktreePath = path.join(tempDir, 'main-repo.pr1');
138
+ const indexContent = readFileNormalized(path.join(worktreePath, 'src/index.ts'));
139
+ expect(indexContent).toBe('export * from "./utils";\n');
140
+ const utilsContent = readFileNormalized(path.join(worktreePath, 'src/utils.ts'));
141
+ expect(utilsContent).toBe('export const utils = { version: "1.0.0" };\n');
142
+ const pkgContent = JSON.parse(fs.readFileSync(path.join(worktreePath, 'package.json'), 'utf-8'));
143
+ expect(pkgContent.name).toBe('test');
144
+ });
145
+ });
146
+ describe('main_staged_same scenario', () => {
147
+ it('commits already staged files when user selects option 1', () => {
148
+ // Create and stage a file
149
+ const featureFile = path.join(mainRepoDir, 'staged-feature.ts');
150
+ fs.writeFileSync(featureFile, 'export const staged = true;\n');
151
+ git(['add', 'staged-feature.ts'], mainRepoDir);
152
+ // Verify file is staged
153
+ const statusBefore = git(['status', '--porcelain'], mainRepoDir);
154
+ expect(statusBefore).toContain('A staged-feature.ts');
155
+ // Run newpr with option 1
156
+ // Option 1 for staged = "Commit staged changes to the new PR branch"
157
+ const result = runCli('newpr', ['staged-feature'], {
158
+ cwd: mainRepoDir,
159
+ input: '1\n',
160
+ });
161
+ expect(result.exitCode).toBe(0);
162
+ // Verify worktree has the file
163
+ const worktreePath = path.join(tempDir, 'main-repo.pr1');
164
+ const worktreeFile = path.join(worktreePath, 'staged-feature.ts');
165
+ expect(fs.existsSync(worktreeFile)).toBe(true);
166
+ expect(readFileNormalized(worktreeFile)).toBe('export const staged = true;\n');
167
+ });
168
+ });
169
+ describe('main_both_same scenario', () => {
170
+ it('stages all and commits when user selects option 2', () => {
171
+ // Create one staged file
172
+ const stagedFile = path.join(mainRepoDir, 'staged.ts');
173
+ fs.writeFileSync(stagedFile, 'export const staged = 1;\n');
174
+ git(['add', 'staged.ts'], mainRepoDir);
175
+ // Create one unstaged file
176
+ const unstagedFile = path.join(mainRepoDir, 'unstaged.ts');
177
+ fs.writeFileSync(unstagedFile, 'export const unstaged = 2;\n');
178
+ // Verify initial state
179
+ const statusBefore = git(['status', '--porcelain'], mainRepoDir);
180
+ expect(statusBefore).toContain('A staged.ts');
181
+ expect(statusBefore).toContain('?? unstaged.ts');
182
+ // Run newpr with option 2 ("Stage all and commit everything to the new PR branch")
183
+ // Options for main_both_same:
184
+ // 1. Commit staged to PR branch, move unstaged to new worktree
185
+ // 2. Stage all and commit everything to the new PR branch
186
+ // 3. Leave all changes here and continue with empty initial commit
187
+ // 4. Stash all changes (will restore after)
188
+ // 5. Cancel
189
+ const result = runCli('newpr', ['both-changes'], {
190
+ cwd: mainRepoDir,
191
+ input: '2\n',
192
+ });
193
+ expect(result.exitCode).toBe(0);
194
+ // Verify both files exist in worktree
195
+ const worktreePath = path.join(tempDir, 'main-repo.pr1');
196
+ expect(fs.existsSync(path.join(worktreePath, 'staged.ts'))).toBe(true);
197
+ expect(fs.existsSync(path.join(worktreePath, 'unstaged.ts'))).toBe(true);
198
+ });
199
+ });
200
+ describe('origin/main ahead scenario (bug regression)', () => {
201
+ it('preserves staged changes when origin/main has moved ahead', () => {
202
+ // Push an upstream commit (simulating origin/main moving ahead)
203
+ const tempClone = path.join(tempDir, 'temp-clone');
204
+ git(['clone', '-b', 'main', bareOriginDir, 'temp-clone'], tempDir);
205
+ git(['config', 'user.email', 'upstream@test.com'], tempClone);
206
+ git(['config', 'user.name', 'Upstream User'], tempClone);
207
+ fs.writeFileSync(path.join(tempClone, 'upstream-change.txt'), 'upstream content\n');
208
+ git(['add', '.'], tempClone);
209
+ git(['commit', '-m', 'Upstream commit'], tempClone);
210
+ git(['push', 'origin', 'main'], tempClone);
211
+ fs.rmSync(tempClone, { recursive: true, force: true });
212
+ // Fetch in main repo so origin/main is ahead
213
+ git(['fetch', 'origin'], mainRepoDir);
214
+ // Verify origin/main is ahead
215
+ const localHead = git(['rev-parse', 'HEAD'], mainRepoDir);
216
+ const originHead = git(['rev-parse', 'origin/main'], mainRepoDir);
217
+ expect(localHead).not.toBe(originHead);
218
+ // Create an uncommitted file in main repo
219
+ const featureFile = path.join(mainRepoDir, 'my-feature.ts');
220
+ fs.writeFileSync(featureFile, 'export const myFeature = () => {};\n');
221
+ // Run newpr with option 1
222
+ const result = runCli('newpr', ['feature-with-origin-ahead'], {
223
+ cwd: mainRepoDir,
224
+ input: '1\n',
225
+ });
226
+ expect(result.exitCode).toBe(0);
227
+ // KEY ASSERTION: The file should exist in the worktree
228
+ // This verifies the fix for branchFrom: 'head' instead of 'origin_main'
229
+ const worktreePath = path.join(tempDir, 'main-repo.pr1');
230
+ const worktreeFeatureFile = path.join(worktreePath, 'my-feature.ts');
231
+ expect(fs.existsSync(worktreeFeatureFile)).toBe(true);
232
+ expect(fs.readFileSync(worktreeFeatureFile, 'utf-8')).toContain('myFeature');
233
+ });
234
+ });
235
+ describe('running from subdirectory', () => {
236
+ it('stages all files when run from a subdirectory', () => {
237
+ // Create files in different directories
238
+ fs.mkdirSync(path.join(mainRepoDir, 'src'), { recursive: true });
239
+ fs.mkdirSync(path.join(mainRepoDir, 'docs'), { recursive: true });
240
+ fs.writeFileSync(path.join(mainRepoDir, 'src/code.ts'), 'export const code = 1;\n');
241
+ fs.writeFileSync(path.join(mainRepoDir, 'docs/README.md'), '# Docs\n');
242
+ fs.writeFileSync(path.join(mainRepoDir, 'root-file.txt'), 'root content\n');
243
+ // Run newpr from src/ subdirectory
244
+ const srcDir = path.join(mainRepoDir, 'src');
245
+ const result = runCli('newpr', ['subdir-test'], {
246
+ cwd: srcDir, // Running from subdirectory!
247
+ input: '1\n',
248
+ });
249
+ expect(result.exitCode).toBe(0);
250
+ // Verify ALL files exist in worktree (not just files in src/)
251
+ const worktreePath = path.join(tempDir, 'main-repo.pr1');
252
+ expect(fs.existsSync(path.join(worktreePath, 'src/code.ts'))).toBe(true);
253
+ expect(fs.existsSync(path.join(worktreePath, 'docs/README.md'))).toBe(true);
254
+ expect(fs.existsSync(path.join(worktreePath, 'root-file.txt'))).toBe(true);
255
+ });
256
+ });
257
+ describe('error handling', () => {
258
+ it('handles cancel option gracefully', () => {
259
+ // Create uncommitted file
260
+ fs.writeFileSync(path.join(mainRepoDir, 'test.ts'), 'test\n');
261
+ // Run newpr and select the cancel option (last option)
262
+ // For main_unstaged_same, options are:
263
+ // 1. Stage all and commit to the new PR branch
264
+ // 2. Leave changes here and continue with empty initial commit
265
+ // 3. Stash changes (will restore after)
266
+ // 4. Cancel
267
+ const result = runCli('newpr', ['cancel-test'], {
268
+ cwd: mainRepoDir,
269
+ input: '4\n', // Select cancel (option 4)
270
+ });
271
+ // Should exit with error (aborted by user)
272
+ expect(result.exitCode).toBe(1);
273
+ // Abort message may be in stdout or stderr
274
+ const output = (result.stdout + result.stderr).toLowerCase();
275
+ expect(output).toContain('abort');
276
+ });
277
+ });
278
+ });
279
+ //# sourceMappingURL=newpr-full-flow.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newpr-full-flow.e2e.test.js","sourceRoot":"","sources":["../../src/e2e/newpr-full-flow.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lswt-remote-pr.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lswt-remote-pr.integration.test.d.ts","sourceRoot":"","sources":["../../src/integration/lswt-remote-pr.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,222 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
+ import { execSync } from 'child_process';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ import { gatherWorktreeInfo, createDefaultDeps, } from '../lib/lswt/worktree-info.js';
7
+ /**
8
+ * Integration tests for lswt remote PR functionality.
9
+ * These tests create a real git repository and test worktree gathering
10
+ * with mocked GitHub PR data.
11
+ */
12
+ /**
13
+ * Normalize a path for cross-platform comparison.
14
+ */
15
+ function normalizePath(p) {
16
+ try {
17
+ return path.normalize(fs.realpathSync.native(p)).toLowerCase();
18
+ }
19
+ catch {
20
+ return path.normalize(p).toLowerCase();
21
+ }
22
+ }
23
+ describe('lswt remote PR integration', () => {
24
+ let tempDir;
25
+ let repoDir;
26
+ let worktreeDir;
27
+ const defaultOptions = {
28
+ json: false,
29
+ verbose: false,
30
+ showStatus: true, // Enable to get remote PRs
31
+ interactive: false,
32
+ };
33
+ // Create temp directory and git repo before all tests
34
+ beforeAll(() => {
35
+ tempDir = fs.realpathSync.native(fs.mkdtempSync(path.join(os.tmpdir(), 'lswt-remote-pr-test-')));
36
+ repoDir = path.join(tempDir, 'test-repo');
37
+ fs.mkdirSync(repoDir);
38
+ // Initialize git repo
39
+ execSync('git init', { cwd: repoDir });
40
+ execSync('git config user.email "test@test.com"', { cwd: repoDir });
41
+ execSync('git config user.name "Test User"', { cwd: repoDir });
42
+ // Create initial commit
43
+ fs.writeFileSync(path.join(repoDir, 'README.md'), '# Test Repo\n');
44
+ execSync('git add .', { cwd: repoDir });
45
+ execSync('git commit -m "Initial commit"', { cwd: repoDir });
46
+ // Create a branch that we'll use for a "local PR"
47
+ execSync('git checkout -b feat/local-pr-1', { cwd: repoDir });
48
+ fs.writeFileSync(path.join(repoDir, 'feature1.txt'), 'Feature 1\n');
49
+ execSync('git add .', { cwd: repoDir });
50
+ execSync('git commit -m "Add feature 1"', { cwd: repoDir });
51
+ // Go back to main/master before creating worktree
52
+ execSync('git checkout master', { cwd: repoDir });
53
+ // Create worktree directory for the branch
54
+ worktreeDir = path.join(tempDir, 'test-repo.pr1');
55
+ execSync(`git worktree add "${worktreeDir}" feat/local-pr-1`, { cwd: repoDir });
56
+ });
57
+ // Clean up after all tests
58
+ afterAll(() => {
59
+ // Remove worktrees first
60
+ try {
61
+ execSync('git worktree prune', { cwd: repoDir, stdio: 'ignore' });
62
+ }
63
+ catch {
64
+ // Ignore errors
65
+ }
66
+ // Remove temp directory
67
+ fs.rmSync(tempDir, { recursive: true, force: true });
68
+ });
69
+ describe('gatherWorktreeInfo with remote PRs', () => {
70
+ it('lists local worktrees correctly', async () => {
71
+ const deps = createDefaultDeps();
72
+ const worktrees = await gatherWorktreeInfo(repoDir, defaultOptions, deps);
73
+ expect(worktrees.length).toBeGreaterThanOrEqual(2); // main + PR worktree
74
+ // Find main worktree
75
+ const main = worktrees.find((w) => normalizePath(w.path) === normalizePath(repoDir));
76
+ expect(main).toBeDefined();
77
+ expect(main?.type).toBe('main');
78
+ // Find PR worktree
79
+ const prWorktree = worktrees.find((w) => normalizePath(w.path) === normalizePath(worktreeDir));
80
+ expect(prWorktree).toBeDefined();
81
+ // It could be 'pr' or 'branch' depending on whether status was fetched
82
+ });
83
+ it('includes remote PRs when listOpenPrs returns data', async () => {
84
+ // Create deps with mocked listOpenPrs
85
+ const deps = {
86
+ ...createDefaultDeps(),
87
+ listOpenPrs: async () => [
88
+ {
89
+ number: 42,
90
+ title: 'Remote PR Feature',
91
+ headBranch: 'feat/remote-feature',
92
+ url: 'https://github.com/test/repo/pull/42',
93
+ isDraft: false,
94
+ },
95
+ {
96
+ number: 99,
97
+ title: 'Another Remote PR',
98
+ headBranch: 'fix/remote-fix',
99
+ url: 'https://github.com/test/repo/pull/99',
100
+ isDraft: true,
101
+ },
102
+ ],
103
+ };
104
+ const worktrees = await gatherWorktreeInfo(repoDir, defaultOptions, deps);
105
+ // Should have local worktrees + remote PRs
106
+ expect(worktrees.length).toBeGreaterThanOrEqual(4); // main + local PR + 2 remote PRs
107
+ // Find remote PRs
108
+ const remotePrs = worktrees.filter((w) => w.type === 'remote_pr');
109
+ expect(remotePrs.length).toBe(2);
110
+ // Check remote PR properties
111
+ const remotePr42 = remotePrs.find((w) => w.prNumber === 42);
112
+ expect(remotePr42).toBeDefined();
113
+ expect(remotePr42?.prTitle).toBe('Remote PR Feature');
114
+ expect(remotePr42?.branch).toBe('feat/remote-feature');
115
+ expect(remotePr42?.isDraft).toBe(false);
116
+ const remotePr99 = remotePrs.find((w) => w.prNumber === 99);
117
+ expect(remotePr99).toBeDefined();
118
+ expect(remotePr99?.prTitle).toBe('Another Remote PR');
119
+ expect(remotePr99?.isDraft).toBe(true);
120
+ });
121
+ it('filters out remote PRs that have local worktrees', async () => {
122
+ // Create deps with mocked listOpenPrs that includes a PR that has a local worktree
123
+ const deps = {
124
+ ...createDefaultDeps(),
125
+ listOpenPrs: async () => [
126
+ {
127
+ // This should be filtered out because we have a worktree for feat/local-pr-1
128
+ number: 1,
129
+ title: 'Local PR Feature',
130
+ headBranch: 'feat/local-pr-1',
131
+ url: 'https://github.com/test/repo/pull/1',
132
+ isDraft: false,
133
+ },
134
+ {
135
+ // This should be included
136
+ number: 42,
137
+ title: 'Remote Only PR',
138
+ headBranch: 'feat/remote-only',
139
+ url: 'https://github.com/test/repo/pull/42',
140
+ isDraft: false,
141
+ },
142
+ ],
143
+ };
144
+ const worktrees = await gatherWorktreeInfo(repoDir, defaultOptions, deps);
145
+ // Find remote PRs
146
+ const remotePrs = worktrees.filter((w) => w.type === 'remote_pr');
147
+ // Should only have remote PRs for branches without local worktrees
148
+ expect(remotePrs.length).toBe(1);
149
+ expect(remotePrs[0].prNumber).toBe(42);
150
+ expect(remotePrs[0].branch).toBe('feat/remote-only');
151
+ });
152
+ it('does not include remote PRs when showStatus is false', async () => {
153
+ const deps = {
154
+ ...createDefaultDeps(),
155
+ listOpenPrs: async () => [
156
+ {
157
+ number: 42,
158
+ title: 'Remote PR Feature',
159
+ headBranch: 'feat/remote-feature',
160
+ url: 'https://github.com/test/repo/pull/42',
161
+ isDraft: false,
162
+ },
163
+ ],
164
+ };
165
+ const optionsWithoutStatus = { ...defaultOptions, showStatus: false };
166
+ const worktrees = await gatherWorktreeInfo(repoDir, optionsWithoutStatus, deps);
167
+ // Should only have local worktrees
168
+ const remotePrs = worktrees.filter((w) => w.type === 'remote_pr');
169
+ expect(remotePrs.length).toBe(0);
170
+ });
171
+ it('handles listOpenPrs errors gracefully', async () => {
172
+ const deps = {
173
+ ...createDefaultDeps(),
174
+ listOpenPrs: async () => {
175
+ throw new Error('GitHub API error');
176
+ },
177
+ };
178
+ const worktrees = await gatherWorktreeInfo(repoDir, defaultOptions, deps);
179
+ // Should still return local worktrees
180
+ expect(worktrees.length).toBeGreaterThanOrEqual(2);
181
+ // Should have no remote PRs (error handled gracefully)
182
+ const remotePrs = worktrees.filter((w) => w.type === 'remote_pr');
183
+ expect(remotePrs.length).toBe(0);
184
+ });
185
+ it('correctly sorts worktrees with remote PRs', async () => {
186
+ const deps = {
187
+ ...createDefaultDeps(),
188
+ listOpenPrs: async () => [
189
+ {
190
+ number: 99,
191
+ title: 'Remote PR 99',
192
+ headBranch: 'feat/remote-99',
193
+ url: 'https://github.com/test/repo/pull/99',
194
+ isDraft: false,
195
+ },
196
+ {
197
+ number: 42,
198
+ title: 'Remote PR 42',
199
+ headBranch: 'feat/remote-42',
200
+ url: 'https://github.com/test/repo/pull/42',
201
+ isDraft: false,
202
+ },
203
+ ],
204
+ };
205
+ const worktrees = await gatherWorktreeInfo(repoDir, defaultOptions, deps);
206
+ // Get remote PRs
207
+ const remotePrs = worktrees.filter((w) => w.type === 'remote_pr');
208
+ expect(remotePrs.length).toBe(2);
209
+ // Remote PRs should be sorted by PR number
210
+ expect(remotePrs[0].prNumber).toBe(42);
211
+ expect(remotePrs[1].prNumber).toBe(99);
212
+ // Main should be first
213
+ expect(worktrees[0].type).toBe('main');
214
+ // Remote PRs should come after local worktrees but be in order
215
+ const remotePrIndices = worktrees
216
+ .map((w, i) => (w.type === 'remote_pr' ? i : -1))
217
+ .filter((i) => i >= 0);
218
+ expect(remotePrIndices[0]).toBeLessThan(remotePrIndices[1]);
219
+ });
220
+ });
221
+ });
222
+ //# sourceMappingURL=lswt-remote-pr.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lswt-remote-pr.integration.test.js","sourceRoot":"","sources":["../../src/integration/lswt-remote-pr.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=newpr-branchfrom-head.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"newpr-branchfrom-head.integration.test.d.ts","sourceRoot":"","sources":["../../src/integration/newpr-branchfrom-head.integration.test.ts"],"names":[],"mappings":""}