@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
@@ -16,8 +16,8 @@ export interface WorktreeInfo {
16
16
  branch: string | null;
17
17
  /** Short commit hash */
18
18
  commit: string;
19
- /** Type of worktree: 'main', 'pr', 'branch', or 'detached' */
20
- type: 'main' | 'pr' | 'branch' | 'detached';
19
+ /** Type of worktree: 'main', 'pr', 'branch', 'detached', or 'remote_pr' */
20
+ type: 'main' | 'pr' | 'branch' | 'detached' | 'remote_pr';
21
21
  /** PR number if this is a PR worktree */
22
22
  prNumber: number | null;
23
23
  /** PR state: 'OPEN', 'MERGED', 'CLOSED', or null if not a PR */
@@ -26,6 +26,10 @@ export interface WorktreeInfo {
26
26
  isDraft: boolean | null;
27
27
  /** Whether the worktree has uncommitted changes */
28
28
  hasChanges: boolean;
29
+ /** PR title (for remote PRs that have no local worktree) */
30
+ prTitle?: string;
31
+ /** PR URL (for remote PRs) */
32
+ prUrl?: string;
29
33
  }
30
34
  /**
31
35
  * Options for listing worktrees
@@ -44,9 +48,11 @@ export interface ListWorktreesResultData {
44
48
  worktrees: WorktreeInfo[];
45
49
  /** Total number of worktrees */
46
50
  total: number;
47
- /** Number of PR worktrees */
51
+ /** Number of local PR worktrees */
48
52
  prCount: number;
49
- /** Number of open PRs */
53
+ /** Number of remote PRs without local worktrees */
54
+ remotePrCount: number;
55
+ /** Number of open PRs (local and remote) */
50
56
  openCount: number;
51
57
  /** Number of worktrees with uncommitted changes */
52
58
  changesCount: number;
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/api/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EACL,KAAK,aAAa,EAInB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC5C,yCAAyC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gEAAgE;IAChE,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC7C,4DAA4D;IAC5D,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,wBAAwB;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;AAEzE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAiE9B"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/api/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EACL,KAAK,aAAa,EAInB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;IAC1D,yCAAyC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gEAAgE;IAChE,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC7C,4DAA4D;IAC5D,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,wBAAwB;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;AAEzE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAqE9B"}
package/dist/api/list.js CHANGED
@@ -47,7 +47,7 @@ export async function listWorktrees(options = {}) {
47
47
  // Gather worktree info
48
48
  const deps = createDefaultDeps();
49
49
  const worktreeDisplays = await gatherWorktreeInfo(repoRoot, listOptions, deps);
50
- // Map to our API type
50
+ // Map to our API type (include prTitle and prUrl for remote PRs)
51
51
  const worktrees = worktreeDisplays.map((wt) => ({
52
52
  path: wt.path,
53
53
  name: wt.name,
@@ -58,15 +58,19 @@ export async function listWorktrees(options = {}) {
58
58
  prState: wt.prState,
59
59
  isDraft: wt.isDraft,
60
60
  hasChanges: wt.hasChanges,
61
+ ...(wt.prTitle && { prTitle: wt.prTitle }),
62
+ ...(wt.prUrl && { prUrl: wt.prUrl }),
61
63
  }));
62
64
  // Calculate summary stats
63
65
  const prCount = worktrees.filter((w) => w.type === 'pr').length;
66
+ const remotePrCount = worktrees.filter((w) => w.type === 'remote_pr').length;
64
67
  const openCount = worktrees.filter((w) => w.prState === 'OPEN').length;
65
68
  const changesCount = worktrees.filter((w) => w.hasChanges).length;
66
69
  const data = {
67
70
  worktrees,
68
71
  total: worktrees.length,
69
72
  prCount,
73
+ remotePrCount,
70
74
  openCount,
71
75
  changesCount,
72
76
  };
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/api/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/api/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for the list worktrees API
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../src/api/list.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Tests for the list worktrees API
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { listWorktrees } from './list.js';
6
+ // Mock dependencies
7
+ vi.mock('../lib/git.js', () => ({
8
+ getRepoRoot: vi.fn(),
9
+ }));
10
+ vi.mock('../lib/github.js', () => ({
11
+ isGhInstalled: vi.fn(),
12
+ }));
13
+ vi.mock('../lib/lswt/index.js', () => ({
14
+ gatherWorktreeInfo: vi.fn(),
15
+ createDefaultDeps: vi.fn(() => ({})),
16
+ }));
17
+ import * as git from '../lib/git.js';
18
+ import * as github from '../lib/github.js';
19
+ import { gatherWorktreeInfo } from '../lib/lswt/index.js';
20
+ describe('api/list', () => {
21
+ beforeEach(() => {
22
+ vi.clearAllMocks();
23
+ });
24
+ describe('listWorktrees', () => {
25
+ it('returns error when not in a git repository', async () => {
26
+ vi.mocked(git.getRepoRoot).mockReturnValue(null);
27
+ const result = await listWorktrees();
28
+ expect(result.success).toBe(false);
29
+ expect(result.error?.code).toBe('NOT_GIT_REPO');
30
+ });
31
+ it('returns worktrees with basic fields', async () => {
32
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
33
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
34
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
35
+ {
36
+ path: '/test/repo',
37
+ name: 'repo',
38
+ branch: 'main',
39
+ commit: 'abc123',
40
+ type: 'main',
41
+ prNumber: null,
42
+ prState: null,
43
+ isDraft: null,
44
+ hasChanges: false,
45
+ },
46
+ ]);
47
+ const result = await listWorktrees({ showStatus: true });
48
+ expect(result.success).toBe(true);
49
+ expect(result.data?.worktrees).toHaveLength(1);
50
+ expect(result.data?.worktrees[0]).toEqual({
51
+ path: '/test/repo',
52
+ name: 'repo',
53
+ branch: 'main',
54
+ commit: 'abc123',
55
+ type: 'main',
56
+ prNumber: null,
57
+ prState: null,
58
+ isDraft: null,
59
+ hasChanges: false,
60
+ });
61
+ });
62
+ it('includes prTitle and prUrl for remote PRs', async () => {
63
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
64
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
65
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
66
+ {
67
+ path: '/test/repo',
68
+ name: 'repo',
69
+ branch: 'main',
70
+ commit: 'abc123',
71
+ type: 'main',
72
+ prNumber: null,
73
+ prState: null,
74
+ isDraft: null,
75
+ hasChanges: false,
76
+ },
77
+ {
78
+ path: '[remote]',
79
+ name: 'PR #42',
80
+ branch: 'feature/new-feature',
81
+ commit: 'def456',
82
+ type: 'remote_pr',
83
+ prNumber: 42,
84
+ prState: 'OPEN',
85
+ isDraft: false,
86
+ hasChanges: false,
87
+ prTitle: 'Add amazing new feature',
88
+ prUrl: 'https://github.com/test/repo/pull/42',
89
+ },
90
+ ]);
91
+ const result = await listWorktrees({ showStatus: true });
92
+ expect(result.success).toBe(true);
93
+ expect(result.data?.worktrees).toHaveLength(2);
94
+ const remotePr = result.data?.worktrees.find((w) => w.type === 'remote_pr');
95
+ expect(remotePr).toBeDefined();
96
+ expect(remotePr?.prTitle).toBe('Add amazing new feature');
97
+ expect(remotePr?.prUrl).toBe('https://github.com/test/repo/pull/42');
98
+ expect(remotePr?.prNumber).toBe(42);
99
+ expect(remotePr?.prState).toBe('OPEN');
100
+ });
101
+ it('does not include prTitle/prUrl when not present', async () => {
102
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
103
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
104
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
105
+ {
106
+ path: '/test/repo.pr42',
107
+ name: 'repo.pr42',
108
+ branch: 'feature/local-pr',
109
+ commit: 'abc123',
110
+ type: 'pr',
111
+ prNumber: 42,
112
+ prState: 'OPEN',
113
+ isDraft: false,
114
+ hasChanges: true,
115
+ // No prTitle or prUrl - these are only for remote PRs
116
+ },
117
+ ]);
118
+ const result = await listWorktrees({ showStatus: true });
119
+ expect(result.success).toBe(true);
120
+ const localPr = result.data?.worktrees[0];
121
+ expect(localPr?.type).toBe('pr');
122
+ expect(localPr).not.toHaveProperty('prTitle');
123
+ expect(localPr).not.toHaveProperty('prUrl');
124
+ });
125
+ describe('summary stats', () => {
126
+ it('calculates prCount for local PR worktrees only', async () => {
127
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
128
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
129
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
130
+ {
131
+ path: '/test/repo',
132
+ name: 'repo',
133
+ branch: 'main',
134
+ commit: 'abc123',
135
+ type: 'main',
136
+ prNumber: null,
137
+ prState: null,
138
+ isDraft: null,
139
+ hasChanges: false,
140
+ },
141
+ {
142
+ path: '/test/repo.pr1',
143
+ name: 'repo.pr1',
144
+ branch: 'feature/one',
145
+ commit: 'pr1abc',
146
+ type: 'pr',
147
+ prNumber: 1,
148
+ prState: 'OPEN',
149
+ isDraft: false,
150
+ hasChanges: false,
151
+ },
152
+ {
153
+ path: '/test/repo.pr2',
154
+ name: 'repo.pr2',
155
+ branch: 'feature/two',
156
+ commit: 'pr2abc',
157
+ type: 'pr',
158
+ prNumber: 2,
159
+ prState: 'MERGED',
160
+ isDraft: false,
161
+ hasChanges: false,
162
+ },
163
+ ]);
164
+ const result = await listWorktrees({ showStatus: true });
165
+ expect(result.success).toBe(true);
166
+ expect(result.data?.prCount).toBe(2);
167
+ });
168
+ it('calculates remotePrCount for remote PRs without local worktrees', async () => {
169
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
170
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
171
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
172
+ {
173
+ path: '/test/repo',
174
+ name: 'repo',
175
+ branch: 'main',
176
+ commit: 'abc123',
177
+ type: 'main',
178
+ prNumber: null,
179
+ prState: null,
180
+ isDraft: null,
181
+ hasChanges: false,
182
+ },
183
+ {
184
+ path: '[remote]',
185
+ name: 'PR #10',
186
+ branch: 'feature/remote-one',
187
+ commit: 'rem1abc',
188
+ type: 'remote_pr',
189
+ prNumber: 10,
190
+ prState: 'OPEN',
191
+ isDraft: false,
192
+ hasChanges: false,
193
+ prTitle: 'Remote PR One',
194
+ prUrl: 'https://github.com/test/repo/pull/10',
195
+ },
196
+ {
197
+ path: '[remote]',
198
+ name: 'PR #20',
199
+ branch: 'feature/remote-two',
200
+ commit: 'rem2abc',
201
+ type: 'remote_pr',
202
+ prNumber: 20,
203
+ prState: 'OPEN',
204
+ isDraft: true,
205
+ hasChanges: false,
206
+ prTitle: 'Remote PR Two',
207
+ prUrl: 'https://github.com/test/repo/pull/20',
208
+ },
209
+ ]);
210
+ const result = await listWorktrees({ showStatus: true });
211
+ expect(result.success).toBe(true);
212
+ expect(result.data?.remotePrCount).toBe(2);
213
+ expect(result.data?.prCount).toBe(0); // No local PR worktrees
214
+ });
215
+ it('calculates openCount including both local and remote PRs', async () => {
216
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
217
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
218
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
219
+ {
220
+ path: '/test/repo.pr1',
221
+ name: 'repo.pr1',
222
+ branch: 'feature/local',
223
+ commit: 'loc1abc',
224
+ type: 'pr',
225
+ prNumber: 1,
226
+ prState: 'OPEN',
227
+ isDraft: false,
228
+ hasChanges: false,
229
+ },
230
+ {
231
+ path: '/test/repo.pr2',
232
+ name: 'repo.pr2',
233
+ branch: 'feature/merged',
234
+ commit: 'loc2abc',
235
+ type: 'pr',
236
+ prNumber: 2,
237
+ prState: 'MERGED',
238
+ isDraft: false,
239
+ hasChanges: false,
240
+ },
241
+ {
242
+ path: '[remote]',
243
+ name: 'PR #10',
244
+ branch: 'feature/remote',
245
+ commit: 'rem1abc',
246
+ type: 'remote_pr',
247
+ prNumber: 10,
248
+ prState: 'OPEN',
249
+ isDraft: false,
250
+ hasChanges: false,
251
+ prTitle: 'Remote Open PR',
252
+ prUrl: 'https://github.com/test/repo/pull/10',
253
+ },
254
+ ]);
255
+ const result = await listWorktrees({ showStatus: true });
256
+ expect(result.success).toBe(true);
257
+ // 1 local open + 1 remote open = 2 open PRs
258
+ expect(result.data?.openCount).toBe(2);
259
+ expect(result.data?.prCount).toBe(2); // 2 local PR worktrees
260
+ expect(result.data?.remotePrCount).toBe(1); // 1 remote PR
261
+ });
262
+ it('calculates changesCount correctly', async () => {
263
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
264
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
265
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
266
+ {
267
+ path: '/test/repo',
268
+ name: 'repo',
269
+ branch: 'main',
270
+ commit: 'abc123',
271
+ type: 'main',
272
+ prNumber: null,
273
+ prState: null,
274
+ isDraft: null,
275
+ hasChanges: true,
276
+ },
277
+ {
278
+ path: '/test/repo.pr1',
279
+ name: 'repo.pr1',
280
+ branch: 'feature/dirty',
281
+ commit: 'pr1abc',
282
+ type: 'pr',
283
+ prNumber: 1,
284
+ prState: 'OPEN',
285
+ isDraft: false,
286
+ hasChanges: true,
287
+ },
288
+ {
289
+ path: '/test/repo.pr2',
290
+ name: 'repo.pr2',
291
+ branch: 'feature/clean',
292
+ commit: 'pr2abc',
293
+ type: 'pr',
294
+ prNumber: 2,
295
+ prState: 'OPEN',
296
+ isDraft: false,
297
+ hasChanges: false,
298
+ },
299
+ ]);
300
+ const result = await listWorktrees({ showStatus: true });
301
+ expect(result.success).toBe(true);
302
+ expect(result.data?.changesCount).toBe(2); // main + pr1 have changes
303
+ });
304
+ it('calculates total including all worktree types', async () => {
305
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
306
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
307
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([
308
+ {
309
+ path: '/test/repo',
310
+ name: 'repo',
311
+ branch: 'main',
312
+ commit: 'abc123',
313
+ type: 'main',
314
+ prNumber: null,
315
+ prState: null,
316
+ isDraft: null,
317
+ hasChanges: false,
318
+ },
319
+ {
320
+ path: '/test/repo.pr1',
321
+ name: 'repo.pr1',
322
+ branch: 'feature/local',
323
+ commit: 'pr1abc',
324
+ type: 'pr',
325
+ prNumber: 1,
326
+ prState: 'OPEN',
327
+ isDraft: false,
328
+ hasChanges: false,
329
+ },
330
+ {
331
+ path: '[remote]',
332
+ name: 'PR #10',
333
+ branch: 'feature/remote',
334
+ commit: 'rem1abc',
335
+ type: 'remote_pr',
336
+ prNumber: 10,
337
+ prState: 'OPEN',
338
+ isDraft: false,
339
+ hasChanges: false,
340
+ prTitle: 'Remote PR',
341
+ prUrl: 'https://github.com/test/repo/pull/10',
342
+ },
343
+ {
344
+ path: '/test/branch-wt',
345
+ name: 'branch-wt',
346
+ branch: 'feature/no-pr',
347
+ commit: 'branchabc',
348
+ type: 'branch',
349
+ prNumber: null,
350
+ prState: null,
351
+ isDraft: null,
352
+ hasChanges: false,
353
+ },
354
+ ]);
355
+ const result = await listWorktrees({ showStatus: true });
356
+ expect(result.success).toBe(true);
357
+ expect(result.data?.total).toBe(4); // main + pr + remote_pr + branch
358
+ });
359
+ });
360
+ describe('warnings', () => {
361
+ it('adds warning when gh is not installed but showStatus is requested', async () => {
362
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
363
+ vi.mocked(github.isGhInstalled).mockReturnValue(false);
364
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([]);
365
+ const result = await listWorktrees({ showStatus: true });
366
+ expect(result.success).toBe(true);
367
+ expect(result.warnings).toBeDefined();
368
+ expect(result.warnings).toContain('GitHub CLI (gh) not installed. PR status will not be shown.');
369
+ });
370
+ it('does not add warning when showStatus is false', async () => {
371
+ vi.mocked(git.getRepoRoot).mockReturnValue('/test/repo');
372
+ vi.mocked(github.isGhInstalled).mockReturnValue(false);
373
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([]);
374
+ const result = await listWorktrees({ showStatus: false });
375
+ expect(result.success).toBe(true);
376
+ expect(result.warnings).toBeUndefined();
377
+ });
378
+ });
379
+ describe('cwd option', () => {
380
+ it('passes cwd to getRepoRoot', async () => {
381
+ vi.mocked(git.getRepoRoot).mockReturnValue('/custom/path/repo');
382
+ vi.mocked(github.isGhInstalled).mockReturnValue(true);
383
+ vi.mocked(gatherWorktreeInfo).mockResolvedValue([]);
384
+ await listWorktrees({ cwd: '/custom/path' });
385
+ expect(git.getRepoRoot).toHaveBeenCalledWith('/custom/path');
386
+ });
387
+ });
388
+ });
389
+ });
390
+ //# sourceMappingURL=list.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../src/api/list.test.ts"],"names":[],"mappings":"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"}
package/dist/cli/newpr.js CHANGED
@@ -204,7 +204,13 @@ async function handleScenario(state, baseBranch, options) {
204
204
  // Prompt user for choice
205
205
  const choiceLabels = context.choices.map((c) => c.label);
206
206
  const choiceIndex = await promptChoiceIndex('How would you like to proceed?', choiceLabels);
207
- return context.choices[choiceIndex].action;
207
+ // promptChoiceIndex returns 1-based index, convert to 0-based for array access
208
+ const arrayIndex = choiceIndex - 1;
209
+ if (arrayIndex < 0 || arrayIndex >= context.choices.length) {
210
+ // Defensive check - should never happen as promptChoiceIndex validates input
211
+ return null;
212
+ }
213
+ return context.choices[arrayIndex].action;
208
214
  }
209
215
  /**
210
216
  * Setup worktree (symlinks, wtlink, deps)