@camaradesuk/git-worktree-tools 1.0.3

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +259 -0
  3. package/dist/cli/cleanpr.d.ts +13 -0
  4. package/dist/cli/cleanpr.d.ts.map +1 -0
  5. package/dist/cli/cleanpr.js +441 -0
  6. package/dist/cli/cleanpr.js.map +1 -0
  7. package/dist/cli/lswt.d.ts +11 -0
  8. package/dist/cli/lswt.d.ts.map +1 -0
  9. package/dist/cli/lswt.js +313 -0
  10. package/dist/cli/lswt.js.map +1 -0
  11. package/dist/cli/newpr.d.ts +11 -0
  12. package/dist/cli/newpr.d.ts.map +1 -0
  13. package/dist/cli/newpr.js +888 -0
  14. package/dist/cli/newpr.js.map +1 -0
  15. package/dist/cli/wtlink.d.ts +15 -0
  16. package/dist/cli/wtlink.d.ts.map +1 -0
  17. package/dist/cli/wtlink.js +124 -0
  18. package/dist/cli/wtlink.js.map +1 -0
  19. package/dist/e2e/cli.e2e.test.d.ts +2 -0
  20. package/dist/e2e/cli.e2e.test.d.ts.map +1 -0
  21. package/dist/e2e/cli.e2e.test.js +215 -0
  22. package/dist/e2e/cli.e2e.test.js.map +1 -0
  23. package/dist/index.d.ts +20 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +17 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/integration/git.integration.test.d.ts +2 -0
  28. package/dist/integration/git.integration.test.d.ts.map +1 -0
  29. package/dist/integration/git.integration.test.js +333 -0
  30. package/dist/integration/git.integration.test.js.map +1 -0
  31. package/dist/lib/colors.d.ts +59 -0
  32. package/dist/lib/colors.d.ts.map +1 -0
  33. package/dist/lib/colors.js +145 -0
  34. package/dist/lib/colors.js.map +1 -0
  35. package/dist/lib/colors.test.d.ts +2 -0
  36. package/dist/lib/colors.test.d.ts.map +1 -0
  37. package/dist/lib/colors.test.js +69 -0
  38. package/dist/lib/colors.test.js.map +1 -0
  39. package/dist/lib/config.d.ts +58 -0
  40. package/dist/lib/config.d.ts.map +1 -0
  41. package/dist/lib/config.js +91 -0
  42. package/dist/lib/config.js.map +1 -0
  43. package/dist/lib/config.test.d.ts +2 -0
  44. package/dist/lib/config.test.d.ts.map +1 -0
  45. package/dist/lib/config.test.js +84 -0
  46. package/dist/lib/config.test.js.map +1 -0
  47. package/dist/lib/constants.d.ts +37 -0
  48. package/dist/lib/constants.d.ts.map +1 -0
  49. package/dist/lib/constants.js +37 -0
  50. package/dist/lib/constants.js.map +1 -0
  51. package/dist/lib/errors.d.ts +88 -0
  52. package/dist/lib/errors.d.ts.map +1 -0
  53. package/dist/lib/errors.js +112 -0
  54. package/dist/lib/errors.js.map +1 -0
  55. package/dist/lib/errors.test.d.ts +2 -0
  56. package/dist/lib/errors.test.d.ts.map +1 -0
  57. package/dist/lib/errors.test.js +117 -0
  58. package/dist/lib/errors.test.js.map +1 -0
  59. package/dist/lib/git.d.ts +224 -0
  60. package/dist/lib/git.d.ts.map +1 -0
  61. package/dist/lib/git.js +524 -0
  62. package/dist/lib/git.js.map +1 -0
  63. package/dist/lib/git.test.d.ts +2 -0
  64. package/dist/lib/git.test.d.ts.map +1 -0
  65. package/dist/lib/git.test.js +402 -0
  66. package/dist/lib/git.test.js.map +1 -0
  67. package/dist/lib/github.d.ts +82 -0
  68. package/dist/lib/github.d.ts.map +1 -0
  69. package/dist/lib/github.js +254 -0
  70. package/dist/lib/github.js.map +1 -0
  71. package/dist/lib/github.test.d.ts +2 -0
  72. package/dist/lib/github.test.d.ts.map +1 -0
  73. package/dist/lib/github.test.js +258 -0
  74. package/dist/lib/github.test.js.map +1 -0
  75. package/dist/lib/prompts.d.ts +39 -0
  76. package/dist/lib/prompts.d.ts.map +1 -0
  77. package/dist/lib/prompts.js +213 -0
  78. package/dist/lib/prompts.js.map +1 -0
  79. package/dist/lib/prompts.test.d.ts +2 -0
  80. package/dist/lib/prompts.test.d.ts.map +1 -0
  81. package/dist/lib/prompts.test.js +250 -0
  82. package/dist/lib/prompts.test.js.map +1 -0
  83. package/dist/lib/state-detection.d.ts +65 -0
  84. package/dist/lib/state-detection.d.ts.map +1 -0
  85. package/dist/lib/state-detection.js +186 -0
  86. package/dist/lib/state-detection.js.map +1 -0
  87. package/dist/lib/state-detection.test.d.ts +2 -0
  88. package/dist/lib/state-detection.test.d.ts.map +1 -0
  89. package/dist/lib/state-detection.test.js +164 -0
  90. package/dist/lib/state-detection.test.js.map +1 -0
  91. package/dist/lib/wtlink/index.d.ts +5 -0
  92. package/dist/lib/wtlink/index.d.ts.map +1 -0
  93. package/dist/lib/wtlink/index.js +7 -0
  94. package/dist/lib/wtlink/index.js.map +1 -0
  95. package/dist/lib/wtlink/link-configs.d.ts +10 -0
  96. package/dist/lib/wtlink/link-configs.d.ts.map +1 -0
  97. package/dist/lib/wtlink/link-configs.js +411 -0
  98. package/dist/lib/wtlink/link-configs.js.map +1 -0
  99. package/dist/lib/wtlink/link-configs.test.d.ts +2 -0
  100. package/dist/lib/wtlink/link-configs.test.d.ts.map +1 -0
  101. package/dist/lib/wtlink/link-configs.test.js +179 -0
  102. package/dist/lib/wtlink/link-configs.test.js.map +1 -0
  103. package/dist/lib/wtlink/main-menu.d.ts +2 -0
  104. package/dist/lib/wtlink/main-menu.d.ts.map +1 -0
  105. package/dist/lib/wtlink/main-menu.js +149 -0
  106. package/dist/lib/wtlink/main-menu.js.map +1 -0
  107. package/dist/lib/wtlink/manage-manifest.d.ts +9 -0
  108. package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -0
  109. package/dist/lib/wtlink/manage-manifest.js +1262 -0
  110. package/dist/lib/wtlink/manage-manifest.js.map +1 -0
  111. package/dist/lib/wtlink/validate-manifest.d.ts +6 -0
  112. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -0
  113. package/dist/lib/wtlink/validate-manifest.js +51 -0
  114. package/dist/lib/wtlink/validate-manifest.js.map +1 -0
  115. package/dist/lib/wtlink/validate-manifest.test.d.ts +2 -0
  116. package/dist/lib/wtlink/validate-manifest.test.d.ts.map +1 -0
  117. package/dist/lib/wtlink/validate-manifest.test.js +115 -0
  118. package/dist/lib/wtlink/validate-manifest.test.js.map +1 -0
  119. package/package.json +84 -0
@@ -0,0 +1,402 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { execSync } from 'child_process';
3
+ import * as git from './git.js';
4
+ // Mock child_process
5
+ vi.mock('child_process', () => ({
6
+ execSync: vi.fn(),
7
+ }));
8
+ const mockExecSync = vi.mocked(execSync);
9
+ describe('git', () => {
10
+ beforeEach(() => {
11
+ vi.clearAllMocks();
12
+ });
13
+ describe('exec', () => {
14
+ it('executes git command and returns output with trailing whitespace trimmed', () => {
15
+ mockExecSync.mockReturnValue('output with trailing whitespace \n');
16
+ const result = git.exec(['status']);
17
+ // Leading whitespace is preserved (important for git status), trailing is trimmed
18
+ expect(result).toBe('output with trailing whitespace');
19
+ expect(mockExecSync).toHaveBeenCalledWith('git status', expect.any(Object));
20
+ });
21
+ it('preserves leading whitespace in output', () => {
22
+ // Leading spaces are significant in git status --porcelain output
23
+ mockExecSync.mockReturnValue(' M file.txt\n');
24
+ const result = git.exec(['status', '--porcelain']);
25
+ expect(result).toBe(' M file.txt');
26
+ });
27
+ it('passes cwd option correctly', () => {
28
+ mockExecSync.mockReturnValue('output');
29
+ git.exec(['status'], { cwd: '/some/path' });
30
+ expect(mockExecSync).toHaveBeenCalledWith('git status', expect.objectContaining({ cwd: '/some/path' }));
31
+ });
32
+ it('throws error with stderr message on failure', () => {
33
+ const error = new Error('Command failed');
34
+ error.stderr = Buffer.from('fatal: not a git repository');
35
+ mockExecSync.mockImplementation(() => {
36
+ throw error;
37
+ });
38
+ expect(() => git.exec(['status'])).toThrow('Git command failed');
39
+ });
40
+ });
41
+ describe('execSafe', () => {
42
+ it('returns output on success', () => {
43
+ mockExecSync.mockReturnValue('output');
44
+ const result = git.execSafe(['status']);
45
+ expect(result).toBe('output');
46
+ });
47
+ it('returns null on failure', () => {
48
+ mockExecSync.mockImplementation(() => {
49
+ throw new Error('Command failed');
50
+ });
51
+ const result = git.execSafe(['status']);
52
+ expect(result).toBeNull();
53
+ });
54
+ });
55
+ describe('getRepoRoot', () => {
56
+ it('returns normalized path from git rev-parse', () => {
57
+ mockExecSync.mockReturnValue('/home/user/repo\n');
58
+ const result = git.getRepoRoot();
59
+ expect(result).toContain('repo');
60
+ expect(mockExecSync).toHaveBeenCalledWith('git rev-parse --show-toplevel', expect.any(Object));
61
+ });
62
+ });
63
+ describe('getRepoName', () => {
64
+ it('extracts name from SSH remote URL', () => {
65
+ mockExecSync.mockReturnValue('git@github.com:org/my-repo.git');
66
+ const result = git.getRepoName('/repo');
67
+ expect(result).toBe('my-repo');
68
+ });
69
+ it('extracts name from HTTPS remote URL', () => {
70
+ mockExecSync.mockReturnValue('https://github.com/org/my-repo.git');
71
+ const result = git.getRepoName('/repo');
72
+ expect(result).toBe('my-repo');
73
+ });
74
+ it('extracts name from URL without .git suffix', () => {
75
+ mockExecSync.mockReturnValue('https://github.com/org/my-repo');
76
+ const result = git.getRepoName('/repo');
77
+ expect(result).toBe('my-repo');
78
+ });
79
+ it('falls back to directory name when no remote', () => {
80
+ mockExecSync.mockImplementation(() => {
81
+ throw new Error('No remote');
82
+ });
83
+ const result = git.getRepoName('/home/user/my-project');
84
+ expect(result).toBe('my-project');
85
+ });
86
+ });
87
+ describe('getCurrentBranch', () => {
88
+ it('returns branch name', () => {
89
+ mockExecSync.mockReturnValue('feature/my-branch');
90
+ const result = git.getCurrentBranch();
91
+ expect(result).toBe('feature/my-branch');
92
+ });
93
+ it('returns null for detached HEAD', () => {
94
+ mockExecSync.mockReturnValue('HEAD');
95
+ const result = git.getCurrentBranch();
96
+ expect(result).toBeNull();
97
+ });
98
+ });
99
+ describe('isDetachedHead', () => {
100
+ it('returns true when in detached HEAD state', () => {
101
+ mockExecSync.mockReturnValue('HEAD');
102
+ expect(git.isDetachedHead()).toBe(true);
103
+ });
104
+ it('returns false when on a branch', () => {
105
+ mockExecSync.mockReturnValue('main');
106
+ expect(git.isDetachedHead()).toBe(false);
107
+ });
108
+ });
109
+ describe('getWorkingTreeStatus', () => {
110
+ it('returns clean for empty status', () => {
111
+ mockExecSync.mockReturnValue('');
112
+ expect(git.getWorkingTreeStatus()).toBe('clean');
113
+ });
114
+ it('returns staged_only for staged changes', () => {
115
+ mockExecSync.mockReturnValue('M file.txt');
116
+ expect(git.getWorkingTreeStatus()).toBe('staged_only');
117
+ });
118
+ it('returns unstaged_only for unstaged changes', () => {
119
+ mockExecSync.mockReturnValue(' M file.txt');
120
+ expect(git.getWorkingTreeStatus()).toBe('unstaged_only');
121
+ });
122
+ it('returns unstaged_only for untracked files', () => {
123
+ mockExecSync.mockReturnValue('?? newfile.txt');
124
+ expect(git.getWorkingTreeStatus()).toBe('unstaged_only');
125
+ });
126
+ it('returns both for staged and unstaged changes', () => {
127
+ mockExecSync.mockReturnValue('MM file.txt');
128
+ expect(git.getWorkingTreeStatus()).toBe('both');
129
+ });
130
+ it('returns both for staged changes and untracked files', () => {
131
+ mockExecSync.mockReturnValue('M staged.txt\n?? untracked.txt');
132
+ expect(git.getWorkingTreeStatus()).toBe('both');
133
+ });
134
+ });
135
+ describe('getStagedFiles', () => {
136
+ it('returns list of staged files', () => {
137
+ mockExecSync.mockReturnValue('file1.txt\nfile2.txt\n');
138
+ const result = git.getStagedFiles();
139
+ expect(result).toEqual(['file1.txt', 'file2.txt']);
140
+ });
141
+ it('returns empty array when nothing staged', () => {
142
+ mockExecSync.mockImplementation(() => {
143
+ throw new Error('No staged files');
144
+ });
145
+ const result = git.getStagedFiles();
146
+ expect(result).toEqual([]);
147
+ });
148
+ });
149
+ describe('getUnstagedFiles', () => {
150
+ it('returns list of unstaged and untracked files', () => {
151
+ mockExecSync.mockReturnValue(' M modified.txt\n?? untracked.txt');
152
+ const result = git.getUnstagedFiles();
153
+ expect(result).toEqual(['modified.txt', 'untracked.txt']);
154
+ });
155
+ it('excludes staged-only files', () => {
156
+ mockExecSync.mockReturnValue('M staged.txt\n M both.txt');
157
+ const result = git.getUnstagedFiles();
158
+ expect(result).toEqual(['both.txt']);
159
+ });
160
+ it('returns empty array when working tree is clean', () => {
161
+ mockExecSync.mockReturnValue('');
162
+ const result = git.getUnstagedFiles();
163
+ expect(result).toEqual([]);
164
+ });
165
+ });
166
+ describe('listWorktrees', () => {
167
+ it('parses worktree list porcelain output', () => {
168
+ mockExecSync.mockReturnValue('worktree /home/user/repo\n' +
169
+ 'HEAD abc123def456\n' +
170
+ 'branch refs/heads/main\n' +
171
+ '\n' +
172
+ 'worktree /home/user/repo.pr42\n' +
173
+ 'HEAD def456abc123\n' +
174
+ 'branch refs/heads/feature/test\n' +
175
+ '\n');
176
+ const result = git.listWorktrees();
177
+ expect(result).toHaveLength(2);
178
+ expect(result[0]).toEqual({
179
+ path: '/home/user/repo',
180
+ commit: 'abc123def456',
181
+ branch: 'main',
182
+ isMain: true,
183
+ isBare: false,
184
+ isLocked: false,
185
+ isPrunable: false,
186
+ });
187
+ expect(result[1]).toEqual({
188
+ path: '/home/user/repo.pr42',
189
+ commit: 'def456abc123',
190
+ branch: 'feature/test',
191
+ isMain: false,
192
+ isBare: false,
193
+ isLocked: false,
194
+ isPrunable: false,
195
+ });
196
+ });
197
+ it('handles bare repository', () => {
198
+ mockExecSync.mockReturnValue('worktree /home/user/repo.git\n' + 'bare\n' + '\n');
199
+ const result = git.listWorktrees();
200
+ expect(result[0].isBare).toBe(true);
201
+ expect(result[0].isMain).toBe(true);
202
+ });
203
+ it('handles locked and prunable worktrees', () => {
204
+ mockExecSync.mockReturnValue('worktree /home/user/repo.pr1\n' +
205
+ 'HEAD abc123\n' +
206
+ 'branch refs/heads/test\n' +
207
+ 'locked\n' +
208
+ 'prunable\n' +
209
+ '\n');
210
+ const result = git.listWorktrees();
211
+ expect(result[0].isLocked).toBe(true);
212
+ expect(result[0].isPrunable).toBe(true);
213
+ });
214
+ it('handles detached HEAD in worktree', () => {
215
+ mockExecSync.mockReturnValue('worktree /home/user/repo\n' + 'HEAD abc123\n' + 'detached\n' + '\n');
216
+ const result = git.listWorktrees();
217
+ expect(result[0].branch).toBeNull();
218
+ });
219
+ });
220
+ describe('getCommitRelationship', () => {
221
+ it('returns same when HEAD equals base', () => {
222
+ mockExecSync
223
+ .mockReturnValueOnce('abc123') // getHeadCommit
224
+ .mockReturnValueOnce('abc123'); // getRefCommit
225
+ const result = git.getCommitRelationship('main');
226
+ expect(result).toBe('same');
227
+ });
228
+ it('returns divergent when base branch does not exist', () => {
229
+ mockExecSync
230
+ .mockReturnValueOnce('abc123') // getHeadCommit
231
+ .mockImplementationOnce(() => {
232
+ throw new Error('unknown revision');
233
+ }); // getRefCommit fails
234
+ const result = git.getCommitRelationship('main');
235
+ expect(result).toBe('divergent');
236
+ });
237
+ });
238
+ describe('getCommitsAhead', () => {
239
+ it('returns list of commits ahead of base', () => {
240
+ mockExecSync.mockReturnValue('abc123 First commit\ndef456 Second commit');
241
+ const result = git.getCommitsAhead('main');
242
+ expect(result).toEqual(['abc123 First commit', 'def456 Second commit']);
243
+ });
244
+ it('returns empty array when not ahead', () => {
245
+ mockExecSync.mockImplementation(() => {
246
+ throw new Error('No commits');
247
+ });
248
+ const result = git.getCommitsAhead('main');
249
+ expect(result).toEqual([]);
250
+ });
251
+ });
252
+ describe('addWorktree', () => {
253
+ it('creates worktree with existing branch', () => {
254
+ mockExecSync.mockReturnValue('');
255
+ git.addWorktree('/path/to/worktree', 'feature-branch');
256
+ expect(mockExecSync).toHaveBeenCalledWith('git worktree add /path/to/worktree feature-branch', expect.any(Object));
257
+ });
258
+ it('creates worktree with new branch', () => {
259
+ mockExecSync.mockReturnValue('');
260
+ git.addWorktree('/path/to/worktree', 'new-branch', { createBranch: true });
261
+ expect(mockExecSync).toHaveBeenCalledWith('git worktree add -b new-branch /path/to/worktree', expect.any(Object));
262
+ });
263
+ it('creates worktree with new branch from start point', () => {
264
+ mockExecSync.mockReturnValue('');
265
+ git.addWorktree('/path/to/worktree', 'new-branch', {
266
+ createBranch: true,
267
+ startPoint: 'origin/main',
268
+ });
269
+ expect(mockExecSync).toHaveBeenCalledWith('git worktree add -b new-branch /path/to/worktree origin/main', expect.any(Object));
270
+ });
271
+ });
272
+ describe('removeWorktree', () => {
273
+ it('removes worktree', () => {
274
+ mockExecSync.mockReturnValue('');
275
+ git.removeWorktree('/path/to/worktree');
276
+ expect(mockExecSync).toHaveBeenCalledWith('git worktree remove /path/to/worktree', expect.any(Object));
277
+ });
278
+ it('force removes worktree', () => {
279
+ mockExecSync.mockReturnValue('');
280
+ git.removeWorktree('/path/to/worktree', { force: true });
281
+ expect(mockExecSync).toHaveBeenCalledWith('git worktree remove --force /path/to/worktree', expect.any(Object));
282
+ });
283
+ });
284
+ describe('createBranch', () => {
285
+ it('creates branch from HEAD', () => {
286
+ mockExecSync.mockReturnValue('');
287
+ git.createBranch('new-branch');
288
+ expect(mockExecSync).toHaveBeenCalledWith('git branch new-branch', expect.any(Object));
289
+ });
290
+ it('creates branch from start point', () => {
291
+ mockExecSync.mockReturnValue('');
292
+ git.createBranch('new-branch', 'origin/main');
293
+ expect(mockExecSync).toHaveBeenCalledWith('git branch new-branch origin/main', expect.any(Object));
294
+ });
295
+ });
296
+ describe('deleteBranch', () => {
297
+ it('deletes branch with -d flag', () => {
298
+ mockExecSync.mockReturnValue('');
299
+ git.deleteBranch('old-branch');
300
+ expect(mockExecSync).toHaveBeenCalledWith('git branch -d old-branch', expect.any(Object));
301
+ });
302
+ it('force deletes branch with -D flag', () => {
303
+ mockExecSync.mockReturnValue('');
304
+ git.deleteBranch('old-branch', { force: true });
305
+ expect(mockExecSync).toHaveBeenCalledWith('git branch -D old-branch', expect.any(Object));
306
+ });
307
+ });
308
+ describe('commit', () => {
309
+ it('creates commit with message', () => {
310
+ mockExecSync
311
+ .mockReturnValueOnce('') // commit
312
+ .mockReturnValueOnce('abc123'); // getHeadCommit
313
+ const result = git.commit({ message: 'Test commit' });
314
+ expect(mockExecSync).toHaveBeenCalledWith('git commit -m "Test commit"', expect.any(Object));
315
+ expect(result).toBe('abc123');
316
+ });
317
+ it('creates commit with all flag', () => {
318
+ mockExecSync.mockReturnValueOnce('').mockReturnValueOnce('abc123');
319
+ git.commit({ message: 'Test commit', all: true });
320
+ expect(mockExecSync).toHaveBeenCalledWith('git commit -a -m "Test commit"', expect.any(Object));
321
+ });
322
+ it('creates empty commit when allowed', () => {
323
+ mockExecSync.mockReturnValueOnce('').mockReturnValueOnce('abc123');
324
+ git.commit({ message: 'Empty commit', allowEmpty: true });
325
+ expect(mockExecSync).toHaveBeenCalledWith('git commit --allow-empty -m "Empty commit"', expect.any(Object));
326
+ });
327
+ });
328
+ describe('push', () => {
329
+ it('pushes to remote', () => {
330
+ mockExecSync.mockReturnValue('');
331
+ git.push();
332
+ expect(mockExecSync).toHaveBeenCalledWith('git push', expect.any(Object));
333
+ });
334
+ it('pushes with upstream flag', () => {
335
+ mockExecSync.mockReturnValue('');
336
+ git.push({ setUpstream: true, remote: 'origin', branch: 'feature' });
337
+ expect(mockExecSync).toHaveBeenCalledWith('git push -u origin feature', expect.any(Object));
338
+ });
339
+ it('force pushes', () => {
340
+ mockExecSync.mockReturnValue('');
341
+ git.push({ force: true });
342
+ expect(mockExecSync).toHaveBeenCalledWith('git push --force', expect.any(Object));
343
+ });
344
+ });
345
+ describe('stash', () => {
346
+ it('creates stash and returns reference', () => {
347
+ mockExecSync.mockReturnValue('Saved working directory');
348
+ const result = git.stash();
349
+ expect(result).toBe('stash@{0}');
350
+ });
351
+ it('returns null when nothing to stash', () => {
352
+ mockExecSync.mockReturnValue('No local changes to save');
353
+ const result = git.stash();
354
+ expect(result).toBeNull();
355
+ });
356
+ it('stashes with keep-index flag', () => {
357
+ mockExecSync.mockReturnValue('Saved');
358
+ git.stash({ keepIndex: true });
359
+ expect(mockExecSync).toHaveBeenCalledWith('git stash push --keep-index', expect.any(Object));
360
+ });
361
+ it('stashes with message', () => {
362
+ mockExecSync.mockReturnValue('Saved');
363
+ git.stash({ message: 'WIP: feature' });
364
+ expect(mockExecSync).toHaveBeenCalledWith('git stash push -m "WIP: feature"', expect.any(Object));
365
+ });
366
+ it('stashes untracked files', () => {
367
+ mockExecSync.mockReturnValue('Saved');
368
+ git.stash({ includeUntracked: true });
369
+ expect(mockExecSync).toHaveBeenCalledWith('git stash push --include-untracked', expect.any(Object));
370
+ });
371
+ });
372
+ describe('branchExists', () => {
373
+ it('returns true when branch exists', () => {
374
+ mockExecSync.mockReturnValue('abc123');
375
+ expect(git.branchExists('main')).toBe(true);
376
+ });
377
+ it('returns false when branch does not exist', () => {
378
+ mockExecSync.mockImplementation(() => {
379
+ throw new Error('unknown revision');
380
+ });
381
+ expect(git.branchExists('nonexistent')).toBe(false);
382
+ });
383
+ });
384
+ describe('remoteBranchExists', () => {
385
+ it('returns true when remote branch exists', () => {
386
+ mockExecSync.mockReturnValue('abc123');
387
+ expect(git.remoteBranchExists('main')).toBe(true);
388
+ });
389
+ it('returns false when remote branch does not exist', () => {
390
+ mockExecSync.mockImplementation(() => {
391
+ throw new Error('unknown revision');
392
+ });
393
+ expect(git.remoteBranchExists('nonexistent')).toBe(false);
394
+ });
395
+ it('checks specific remote', () => {
396
+ mockExecSync.mockReturnValue('abc123');
397
+ git.remoteBranchExists('main', 'upstream');
398
+ expect(mockExecSync).toHaveBeenCalledWith('git rev-parse --verify refs/remotes/upstream/main', expect.any(Object));
399
+ });
400
+ });
401
+ });
402
+ //# sourceMappingURL=git.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.test.js","sourceRoot":"","sources":["../../src/lib/git.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * PR creation options
3
+ */
4
+ export interface CreatePrOptions {
5
+ title: string;
6
+ body?: string;
7
+ base?: string;
8
+ head?: string;
9
+ draft?: boolean;
10
+ repo?: string;
11
+ }
12
+ /**
13
+ * PR information
14
+ */
15
+ export interface PrInfo {
16
+ number: number;
17
+ title: string;
18
+ state: 'OPEN' | 'CLOSED' | 'MERGED';
19
+ url: string;
20
+ headBranch: string;
21
+ baseBranch: string;
22
+ isDraft: boolean;
23
+ }
24
+ /**
25
+ * Repository information
26
+ */
27
+ export interface RepoInfo {
28
+ owner: string;
29
+ name: string;
30
+ defaultBranch: string;
31
+ url: string;
32
+ }
33
+ /**
34
+ * Check if GitHub CLI is installed
35
+ */
36
+ export declare function isGhInstalled(): boolean;
37
+ /**
38
+ * Check if user is authenticated with GitHub CLI
39
+ */
40
+ export declare function isAuthenticated(): boolean;
41
+ /**
42
+ * Get repository information
43
+ */
44
+ export declare function getRepoInfo(cwd?: string): RepoInfo | null;
45
+ /**
46
+ * Create a pull request
47
+ */
48
+ export declare function createPr(options: CreatePrOptions, cwd?: string): PrInfo;
49
+ /**
50
+ * Get PR status by number
51
+ */
52
+ export declare function getPr(prNumber: number, cwd?: string): PrInfo | null;
53
+ /**
54
+ * Get PR by branch name
55
+ */
56
+ export declare function getPrByBranch(branch: string, cwd?: string): PrInfo | null;
57
+ /**
58
+ * List options for PRs
59
+ */
60
+ export interface ListPrsOptions {
61
+ state?: 'open' | 'closed' | 'merged' | 'all';
62
+ author?: string;
63
+ limit?: number;
64
+ }
65
+ /**
66
+ * List pull requests
67
+ */
68
+ export declare function listPrs(options?: ListPrsOptions, cwd?: string): PrInfo[];
69
+ /**
70
+ * Check out a PR by number
71
+ */
72
+ export declare function checkoutPr(prNumber: number, cwd?: string): void;
73
+ /**
74
+ * Get the current user's GitHub username
75
+ */
76
+ export declare function getCurrentUser(): string | null;
77
+ /**
78
+ * Extract PR number from branch name if it matches worktree pattern
79
+ * e.g., "repo.pr123" -> 123
80
+ */
81
+ export declare function extractPrNumberFromPath(worktreePath: string): number | null;
82
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/lib/github.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAuCD;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAOvC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAkBzD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAyDvE;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8BnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBzE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAqC5E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAG9C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3E"}