@camaradesuk/git-worktree-tools 1.6.0 → 1.7.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 (190) hide show
  1. package/README.md +307 -418
  2. package/dist/cli/cleanpr.test.js +2 -0
  3. package/dist/cli/cleanpr.test.js.map +1 -1
  4. package/dist/cli/newpr.js +48 -11
  5. package/dist/cli/newpr.js.map +1 -1
  6. package/dist/cli/newpr.test.js +33 -15
  7. package/dist/cli/newpr.test.js.map +1 -1
  8. package/dist/cli/wt/clean.d.ts +1 -0
  9. package/dist/cli/wt/clean.d.ts.map +1 -1
  10. package/dist/cli/wt/clean.js +11 -1
  11. package/dist/cli/wt/clean.js.map +1 -1
  12. package/dist/cli/wt/config.d.ts +1 -1
  13. package/dist/cli/wt/config.d.ts.map +1 -1
  14. package/dist/cli/wt/config.js +148 -13
  15. package/dist/cli/wt/config.js.map +1 -1
  16. package/dist/cli/wt/config.test.d.ts +5 -0
  17. package/dist/cli/wt/config.test.d.ts.map +1 -0
  18. package/dist/cli/wt/config.test.js +260 -0
  19. package/dist/cli/wt/config.test.js.map +1 -0
  20. package/dist/cli/wt/entry.test.js +11 -8
  21. package/dist/cli/wt/entry.test.js.map +1 -1
  22. package/dist/cli/wt/init.d.ts +14 -0
  23. package/dist/cli/wt/init.d.ts.map +1 -0
  24. package/dist/cli/wt/init.js +209 -0
  25. package/dist/cli/wt/init.js.map +1 -0
  26. package/dist/cli/wt/init.test.d.ts +5 -0
  27. package/dist/cli/wt/init.test.d.ts.map +1 -0
  28. package/dist/cli/wt/init.test.js +165 -0
  29. package/dist/cli/wt/init.test.js.map +1 -0
  30. package/dist/cli/wt/init.unit.test.d.ts +5 -0
  31. package/dist/cli/wt/init.unit.test.d.ts.map +1 -0
  32. package/dist/cli/wt/init.unit.test.js +432 -0
  33. package/dist/cli/wt/init.unit.test.js.map +1 -0
  34. package/dist/cli/wt/interactive-menu.d.ts +41 -0
  35. package/dist/cli/wt/interactive-menu.d.ts.map +1 -0
  36. package/dist/cli/wt/interactive-menu.js +639 -0
  37. package/dist/cli/wt/interactive-menu.js.map +1 -0
  38. package/dist/cli/wt/interactive-menu.test.d.ts +10 -0
  39. package/dist/cli/wt/interactive-menu.test.d.ts.map +1 -0
  40. package/dist/cli/wt/interactive-menu.test.js +711 -0
  41. package/dist/cli/wt/interactive-menu.test.js.map +1 -0
  42. package/dist/cli/wt/link.d.ts +9 -0
  43. package/dist/cli/wt/link.d.ts.map +1 -1
  44. package/dist/cli/wt/link.js +27 -0
  45. package/dist/cli/wt/link.js.map +1 -1
  46. package/dist/cli/wt/list.d.ts +2 -2
  47. package/dist/cli/wt/list.d.ts.map +1 -1
  48. package/dist/cli/wt/list.js +17 -17
  49. package/dist/cli/wt/list.js.map +1 -1
  50. package/dist/cli/wt/new.d.ts +7 -1
  51. package/dist/cli/wt/new.d.ts.map +1 -1
  52. package/dist/cli/wt/new.js +58 -6
  53. package/dist/cli/wt/new.js.map +1 -1
  54. package/dist/cli/wt/wt.test.js +159 -16
  55. package/dist/cli/wt/wt.test.js.map +1 -1
  56. package/dist/cli/wt.d.ts +2 -1
  57. package/dist/cli/wt.d.ts.map +1 -1
  58. package/dist/cli/wt.js +98 -3
  59. package/dist/cli/wt.js.map +1 -1
  60. package/dist/cli/wt.unit.test.d.ts +7 -0
  61. package/dist/cli/wt.unit.test.d.ts.map +1 -0
  62. package/dist/cli/wt.unit.test.js +182 -0
  63. package/dist/cli/wt.unit.test.js.map +1 -0
  64. package/dist/cli/wtconfig.js +18 -4
  65. package/dist/cli/wtconfig.js.map +1 -1
  66. package/dist/cli/wtconfig.test.js +18 -16
  67. package/dist/cli/wtconfig.test.js.map +1 -1
  68. package/dist/e2e/newpr/scenarios.e2e.test.js +7 -7
  69. package/dist/e2e/newpr/scenarios.e2e.test.js.map +1 -1
  70. package/dist/e2e/wt/wt.e2e.test.d.ts +9 -0
  71. package/dist/e2e/wt/wt.e2e.test.d.ts.map +1 -0
  72. package/dist/e2e/wt/wt.e2e.test.js +384 -0
  73. package/dist/e2e/wt/wt.e2e.test.js.map +1 -0
  74. package/dist/lib/ai/base-provider.d.ts +22 -0
  75. package/dist/lib/ai/base-provider.d.ts.map +1 -1
  76. package/dist/lib/ai/base-provider.js +180 -99
  77. package/dist/lib/ai/base-provider.js.map +1 -1
  78. package/dist/lib/ai/base-provider.test.js +13 -14
  79. package/dist/lib/ai/base-provider.test.js.map +1 -1
  80. package/dist/lib/ai/cli-provider.d.ts +11 -7
  81. package/dist/lib/ai/cli-provider.d.ts.map +1 -1
  82. package/dist/lib/ai/cli-provider.js +19 -49
  83. package/dist/lib/ai/cli-provider.js.map +1 -1
  84. package/dist/lib/ai/cli-provider.test.js +47 -49
  85. package/dist/lib/ai/cli-provider.test.js.map +1 -1
  86. package/dist/lib/ai/index.d.ts +2 -1
  87. package/dist/lib/ai/index.d.ts.map +1 -1
  88. package/dist/lib/ai/index.js +2 -0
  89. package/dist/lib/ai/index.js.map +1 -1
  90. package/dist/lib/ai/provider-manager.js +2 -2
  91. package/dist/lib/ai/provider-manager.js.map +1 -1
  92. package/dist/lib/ai/repo-docs.d.ts +43 -0
  93. package/dist/lib/ai/repo-docs.d.ts.map +1 -0
  94. package/dist/lib/ai/repo-docs.js +274 -0
  95. package/dist/lib/ai/repo-docs.js.map +1 -0
  96. package/dist/lib/ai/repo-docs.test.d.ts +5 -0
  97. package/dist/lib/ai/repo-docs.test.d.ts.map +1 -0
  98. package/dist/lib/ai/repo-docs.test.js +357 -0
  99. package/dist/lib/ai/repo-docs.test.js.map +1 -0
  100. package/dist/lib/ai/types.d.ts +18 -2
  101. package/dist/lib/ai/types.d.ts.map +1 -1
  102. package/dist/lib/ai/types.js.map +1 -1
  103. package/dist/lib/config-editor.d.ts +21 -0
  104. package/dist/lib/config-editor.d.ts.map +1 -0
  105. package/dist/lib/config-editor.js +729 -0
  106. package/dist/lib/config-editor.js.map +1 -0
  107. package/dist/lib/config-editor.test.d.ts +11 -0
  108. package/dist/lib/config-editor.test.d.ts.map +1 -0
  109. package/dist/lib/config-editor.test.js +526 -0
  110. package/dist/lib/config-editor.test.js.map +1 -0
  111. package/dist/lib/config-validation.d.ts +28 -0
  112. package/dist/lib/config-validation.d.ts.map +1 -0
  113. package/dist/lib/config-validation.js +534 -0
  114. package/dist/lib/config-validation.js.map +1 -0
  115. package/dist/lib/config-validation.test.d.ts +5 -0
  116. package/dist/lib/config-validation.test.d.ts.map +1 -0
  117. package/dist/lib/config-validation.test.js +398 -0
  118. package/dist/lib/config-validation.test.js.map +1 -0
  119. package/dist/lib/config.d.ts +115 -6
  120. package/dist/lib/config.d.ts.map +1 -1
  121. package/dist/lib/config.js +251 -55
  122. package/dist/lib/config.js.map +1 -1
  123. package/dist/lib/config.test.js +2 -1
  124. package/dist/lib/config.test.js.map +1 -1
  125. package/dist/lib/constants.d.ts +50 -1
  126. package/dist/lib/constants.d.ts.map +1 -1
  127. package/dist/lib/constants.js +67 -1
  128. package/dist/lib/constants.js.map +1 -1
  129. package/dist/lib/constants.test.d.ts +5 -0
  130. package/dist/lib/constants.test.d.ts.map +1 -0
  131. package/dist/lib/constants.test.js +121 -0
  132. package/dist/lib/constants.test.js.map +1 -0
  133. package/dist/lib/git.d.ts +12 -0
  134. package/dist/lib/git.d.ts.map +1 -1
  135. package/dist/lib/git.js +26 -0
  136. package/dist/lib/git.js.map +1 -1
  137. package/dist/lib/global-check.d.ts +38 -0
  138. package/dist/lib/global-check.d.ts.map +1 -0
  139. package/dist/lib/global-check.js +135 -0
  140. package/dist/lib/global-check.js.map +1 -0
  141. package/dist/lib/global-check.test.d.ts +5 -0
  142. package/dist/lib/global-check.test.d.ts.map +1 -0
  143. package/dist/lib/global-check.test.js +153 -0
  144. package/dist/lib/global-check.test.js.map +1 -0
  145. package/dist/lib/global-config.d.ts +102 -0
  146. package/dist/lib/global-config.d.ts.map +1 -0
  147. package/dist/lib/global-config.js +234 -0
  148. package/dist/lib/global-config.js.map +1 -0
  149. package/dist/lib/global-config.test.d.ts +5 -0
  150. package/dist/lib/global-config.test.d.ts.map +1 -0
  151. package/dist/lib/global-config.test.js +282 -0
  152. package/dist/lib/global-config.test.js.map +1 -0
  153. package/dist/lib/logger.d.ts +175 -0
  154. package/dist/lib/logger.d.ts.map +1 -0
  155. package/dist/lib/logger.js +475 -0
  156. package/dist/lib/logger.js.map +1 -0
  157. package/dist/lib/logger.test.d.ts +5 -0
  158. package/dist/lib/logger.test.d.ts.map +1 -0
  159. package/dist/lib/logger.test.js +292 -0
  160. package/dist/lib/logger.test.js.map +1 -0
  161. package/dist/lib/lswt/action-executors.test.js +2 -0
  162. package/dist/lib/lswt/action-executors.test.js.map +1 -1
  163. package/dist/lib/newpr/args.d.ts.map +1 -1
  164. package/dist/lib/newpr/args.js +9 -2
  165. package/dist/lib/newpr/args.js.map +1 -1
  166. package/dist/lib/newpr/args.test.js +1 -1
  167. package/dist/lib/newpr/args.test.js.map +1 -1
  168. package/dist/lib/newpr/types.d.ts +2 -0
  169. package/dist/lib/newpr/types.d.ts.map +1 -1
  170. package/dist/lib/prompts.d.ts +6 -0
  171. package/dist/lib/prompts.d.ts.map +1 -1
  172. package/dist/lib/prompts.js +31 -9
  173. package/dist/lib/prompts.js.map +1 -1
  174. package/dist/lib/prompts.test.js +72 -1
  175. package/dist/lib/prompts.test.js.map +1 -1
  176. package/dist/lib/schema.test.d.ts +10 -0
  177. package/dist/lib/schema.test.d.ts.map +1 -0
  178. package/dist/lib/schema.test.js +309 -0
  179. package/dist/lib/schema.test.js.map +1 -0
  180. package/dist/lib/wtconfig/environment.d.ts.map +1 -1
  181. package/dist/lib/wtconfig/environment.js +6 -4
  182. package/dist/lib/wtconfig/environment.js.map +1 -1
  183. package/dist/lib/wtconfig/environment.test.js +2 -7
  184. package/dist/lib/wtconfig/environment.test.js.map +1 -1
  185. package/dist/lib/wtconfig/types.d.ts +3 -1
  186. package/dist/lib/wtconfig/types.d.ts.map +1 -1
  187. package/dist/lib/wtlink/manage-manifest.test.js +145 -7
  188. package/dist/lib/wtlink/manage-manifest.test.js.map +1 -1
  189. package/package.json +2 -1
  190. package/schemas/worktreerc.schema.json +416 -0
@@ -0,0 +1,639 @@
1
+ /**
2
+ * Interactive main menu for `wt` command
3
+ *
4
+ * Provides a complete TUI experience for all worktree operations.
5
+ * Each menu option gathers required inputs before executing.
6
+ */
7
+ import { promptChoice, promptInput, promptConfirm, UserNavigatedBack, } from '../../lib/prompts.js';
8
+ import { bold, dim, cyan, red } from '../../lib/colors.js';
9
+ import { runSubcommand } from './run-command.js';
10
+ import { loadConfig } from '../../lib/config.js';
11
+ import * as git from '../../lib/git.js';
12
+ /**
13
+ * Cancelled flow result
14
+ */
15
+ const CANCELLED = { completed: false, returnToMenu: true };
16
+ /**
17
+ * Completed flow result (exit to shell)
18
+ */
19
+ const COMPLETED_EXIT = { completed: true, returnToMenu: false };
20
+ /**
21
+ * Get the display name for the preferred editor
22
+ */
23
+ function getEditorDisplayName(preferredEditor) {
24
+ switch (preferredEditor) {
25
+ case 'cursor':
26
+ return 'Cursor';
27
+ case 'auto':
28
+ return 'editor';
29
+ case 'vscode':
30
+ default:
31
+ return 'VS Code';
32
+ }
33
+ }
34
+ const mainMenuOptions = [
35
+ {
36
+ label: 'List worktrees',
37
+ description: 'View all worktrees with PR status',
38
+ value: 'list',
39
+ },
40
+ {
41
+ label: 'Create new PR',
42
+ description: 'Create a new PR with a dedicated worktree',
43
+ value: 'new-pr',
44
+ },
45
+ {
46
+ label: 'Clean up PRs',
47
+ description: 'Remove merged/closed PR worktrees',
48
+ value: 'clean',
49
+ },
50
+ {
51
+ label: 'Link config files',
52
+ description: 'Manage config file linking between worktrees',
53
+ value: 'link',
54
+ },
55
+ {
56
+ label: 'Show state',
57
+ description: 'Query current git worktree state',
58
+ value: 'state',
59
+ },
60
+ {
61
+ label: 'Configure settings',
62
+ description: 'View and edit .worktreerc configuration',
63
+ value: 'config',
64
+ },
65
+ {
66
+ label: 'Exit',
67
+ description: 'Return to shell',
68
+ value: 'exit',
69
+ },
70
+ ];
71
+ /**
72
+ * Display the interactive main menu
73
+ */
74
+ export async function showMainMenu() {
75
+ // Loop to allow returning to menu after actions
76
+ while (true) {
77
+ console.log();
78
+ console.log(bold(cyan('Git Worktree Tools')));
79
+ console.log(dim('Manage git worktrees and PRs'));
80
+ console.log();
81
+ try {
82
+ const choice = await promptChoice('What would you like to do?', mainMenuOptions);
83
+ let result;
84
+ switch (choice) {
85
+ case 'exit':
86
+ return;
87
+ case 'list':
88
+ result = await handleListWorktrees();
89
+ break;
90
+ case 'new-pr':
91
+ result = await handleNewPR();
92
+ break;
93
+ case 'clean':
94
+ result = await handleCleanPRs();
95
+ break;
96
+ case 'link':
97
+ result = await handleLinkConfig();
98
+ break;
99
+ case 'state':
100
+ result = await handleShowState();
101
+ break;
102
+ case 'config':
103
+ result = await handleConfigure();
104
+ break;
105
+ default:
106
+ result = CANCELLED;
107
+ }
108
+ // If flow says don't return to menu, exit
109
+ if (!result.returnToMenu) {
110
+ return;
111
+ }
112
+ // Otherwise loop back to main menu
113
+ }
114
+ catch (error) {
115
+ // User cancelled (Ctrl+C or 'q') or navigated back (left arrow)
116
+ if (error instanceof Error && error.message === 'User cancelled') {
117
+ return;
118
+ }
119
+ if (error instanceof UserNavigatedBack) {
120
+ return;
121
+ }
122
+ throw error;
123
+ }
124
+ }
125
+ }
126
+ // ============================================================================
127
+ // List Worktrees Flow
128
+ // ============================================================================
129
+ async function handleListWorktrees() {
130
+ console.log();
131
+ runSubcommand('lswt', []);
132
+ return COMPLETED_EXIT; // lswt exits the process
133
+ }
134
+ const newPROptions = [
135
+ {
136
+ label: 'New feature/fix',
137
+ description: 'Create a new PR from a description',
138
+ value: 'from-description',
139
+ },
140
+ {
141
+ label: 'From existing PR',
142
+ description: 'Create worktree for an existing PR number',
143
+ value: 'from-pr',
144
+ },
145
+ {
146
+ label: 'From existing branch',
147
+ description: 'Create PR for an existing local branch',
148
+ value: 'from-branch',
149
+ },
150
+ {
151
+ label: '← Back',
152
+ description: 'Return to main menu',
153
+ value: 'back',
154
+ },
155
+ ];
156
+ async function handleNewPR() {
157
+ console.log();
158
+ console.log(bold('Create New PR'));
159
+ console.log();
160
+ try {
161
+ const action = await promptChoice('How would you like to create the PR?', newPROptions);
162
+ switch (action) {
163
+ case 'back':
164
+ return CANCELLED;
165
+ case 'from-description':
166
+ return await handleNewPRFromDescription();
167
+ case 'from-pr':
168
+ return await handleNewPRFromExisting();
169
+ case 'from-branch':
170
+ return await handleNewPRFromBranch();
171
+ default:
172
+ return CANCELLED;
173
+ }
174
+ }
175
+ catch (error) {
176
+ if (error instanceof Error && error.message === 'User cancelled') {
177
+ return CANCELLED;
178
+ }
179
+ if (error instanceof UserNavigatedBack) {
180
+ return CANCELLED;
181
+ }
182
+ throw error;
183
+ }
184
+ }
185
+ async function handleNewPRFromDescription() {
186
+ console.log();
187
+ try {
188
+ // Check if we're in a git repository first
189
+ let repoRoot;
190
+ try {
191
+ repoRoot = git.getRepoRoot();
192
+ }
193
+ catch {
194
+ console.log(red('Not in a git repository'));
195
+ console.log(dim('Please run this command from within a git repository.'));
196
+ return CANCELLED;
197
+ }
198
+ // Required: description
199
+ const description = await promptInput('PR description (what are you building?)');
200
+ if (!description) {
201
+ console.log(red('Description is required'));
202
+ return CANCELLED;
203
+ }
204
+ // Load config for defaults
205
+ const config = loadConfig(repoRoot);
206
+ // Optional: base branch
207
+ const baseBranch = await promptInput('Base branch', config.baseBranch || 'main');
208
+ // Optional: draft or ready
209
+ const draftOptions = [
210
+ { label: 'Draft PR', description: 'Can be marked ready later', value: true },
211
+ { label: 'Ready for review', description: 'Immediately reviewable', value: false },
212
+ ];
213
+ const isDraft = await promptChoice('PR status', draftOptions);
214
+ // Optional: install dependencies
215
+ const shouldInstall = await promptConfirm('Install dependencies after setup?', false);
216
+ // Optional: open in editor
217
+ const editorName = getEditorDisplayName(config.preferredEditor);
218
+ const shouldOpenEditor = await promptConfirm(`Open in ${editorName}?`, false);
219
+ // Build args
220
+ const args = [description];
221
+ if (baseBranch && baseBranch !== 'main') {
222
+ args.push('--base', baseBranch);
223
+ }
224
+ if (!isDraft) {
225
+ args.push('--ready');
226
+ }
227
+ if (shouldInstall) {
228
+ args.push('--install');
229
+ }
230
+ if (shouldOpenEditor) {
231
+ args.push('--code');
232
+ }
233
+ console.log();
234
+ console.log(dim('Creating PR...'));
235
+ runSubcommand('newpr', args);
236
+ return COMPLETED_EXIT;
237
+ }
238
+ catch (error) {
239
+ if (error instanceof Error && error.message === 'User cancelled') {
240
+ return CANCELLED;
241
+ }
242
+ if (error instanceof UserNavigatedBack) {
243
+ return CANCELLED;
244
+ }
245
+ throw error;
246
+ }
247
+ }
248
+ async function handleNewPRFromExisting() {
249
+ console.log();
250
+ try {
251
+ // Required: PR number
252
+ const prNumberStr = await promptInput('PR number');
253
+ if (!prNumberStr) {
254
+ console.log(red('PR number is required'));
255
+ return CANCELLED;
256
+ }
257
+ const prNumber = parseInt(prNumberStr, 10);
258
+ if (isNaN(prNumber) || prNumber <= 0) {
259
+ console.log(red('Invalid PR number'));
260
+ return CANCELLED;
261
+ }
262
+ // Load config for editor preference
263
+ let editorName = 'VS Code';
264
+ try {
265
+ const repoRoot = git.getRepoRoot();
266
+ const config = loadConfig(repoRoot);
267
+ editorName = getEditorDisplayName(config.preferredEditor);
268
+ }
269
+ catch {
270
+ // Not in a repo, use default
271
+ }
272
+ // Optional: install dependencies
273
+ const shouldInstall = await promptConfirm('Install dependencies after setup?', false);
274
+ // Optional: open in editor
275
+ const shouldOpenEditor = await promptConfirm(`Open in ${editorName}?`, false);
276
+ // Build args
277
+ const args = ['--pr', String(prNumber)];
278
+ if (shouldInstall) {
279
+ args.push('--install');
280
+ }
281
+ if (shouldOpenEditor) {
282
+ args.push('--code');
283
+ }
284
+ console.log();
285
+ console.log(dim(`Creating worktree for PR #${prNumber}...`));
286
+ runSubcommand('newpr', args);
287
+ return COMPLETED_EXIT;
288
+ }
289
+ catch (error) {
290
+ if (error instanceof Error && error.message === 'User cancelled') {
291
+ return CANCELLED;
292
+ }
293
+ if (error instanceof UserNavigatedBack) {
294
+ return CANCELLED;
295
+ }
296
+ throw error;
297
+ }
298
+ }
299
+ async function handleNewPRFromBranch() {
300
+ console.log();
301
+ try {
302
+ // Check if we're in a git repository first
303
+ let repoRoot;
304
+ let branches;
305
+ try {
306
+ repoRoot = git.getRepoRoot();
307
+ // Get list of local branches (excluding main/master)
308
+ branches = git
309
+ .listLocalBranches()
310
+ .filter((b) => !['main', 'master', 'develop'].includes(b) && !b.startsWith('origin/'));
311
+ }
312
+ catch {
313
+ console.log(red('Not in a git repository'));
314
+ console.log(dim('Please run this command from within a git repository.'));
315
+ return CANCELLED;
316
+ }
317
+ let branchName;
318
+ if (branches.length > 0) {
319
+ // Let user select from list or type custom
320
+ const branchOptions = [
321
+ ...branches.slice(0, 10).map((b) => ({ label: b, value: b })),
322
+ { label: '↳ Type branch name...', value: '__custom__' },
323
+ ];
324
+ const selected = await promptChoice('Select branch', branchOptions);
325
+ if (selected === '__custom__') {
326
+ branchName = await promptInput('Branch name');
327
+ }
328
+ else {
329
+ branchName = selected;
330
+ }
331
+ }
332
+ else {
333
+ branchName = await promptInput('Branch name');
334
+ }
335
+ if (!branchName) {
336
+ console.log(red('Branch name is required'));
337
+ return CANCELLED;
338
+ }
339
+ // Load config for defaults
340
+ const config = loadConfig(repoRoot);
341
+ // Optional: base branch
342
+ const baseBranch = await promptInput('Base branch', config.baseBranch || 'main');
343
+ // Optional: draft or ready
344
+ const draftOptions = [
345
+ { label: 'Draft PR', description: 'Can be marked ready later', value: true },
346
+ { label: 'Ready for review', description: 'Immediately reviewable', value: false },
347
+ ];
348
+ const isDraft = await promptChoice('PR status', draftOptions);
349
+ // Build args
350
+ const args = ['--branch', branchName];
351
+ if (baseBranch && baseBranch !== 'main') {
352
+ args.push('--base', baseBranch);
353
+ }
354
+ if (!isDraft) {
355
+ args.push('--ready');
356
+ }
357
+ console.log();
358
+ console.log(dim(`Creating PR for branch ${branchName}...`));
359
+ runSubcommand('newpr', args);
360
+ return COMPLETED_EXIT;
361
+ }
362
+ catch (error) {
363
+ if (error instanceof Error && error.message === 'User cancelled') {
364
+ return CANCELLED;
365
+ }
366
+ if (error instanceof UserNavigatedBack) {
367
+ return CANCELLED;
368
+ }
369
+ throw error;
370
+ }
371
+ }
372
+ const cleanOptions = [
373
+ {
374
+ label: 'Clean all merged/closed',
375
+ description: 'Remove all worktrees for merged or closed PRs',
376
+ value: 'clean-all',
377
+ },
378
+ {
379
+ label: 'Clean specific PR',
380
+ description: 'Remove worktree for a specific PR number',
381
+ value: 'clean-specific',
382
+ },
383
+ {
384
+ label: 'Preview (dry run)',
385
+ description: 'See what would be cleaned without removing',
386
+ value: 'dry-run',
387
+ },
388
+ {
389
+ label: '← Back',
390
+ description: 'Return to main menu',
391
+ value: 'back',
392
+ },
393
+ ];
394
+ async function handleCleanPRs() {
395
+ console.log();
396
+ console.log(bold('Clean Up PRs'));
397
+ console.log();
398
+ try {
399
+ const action = await promptChoice('What would you like to clean?', cleanOptions);
400
+ switch (action) {
401
+ case 'back':
402
+ return CANCELLED;
403
+ case 'clean-all': {
404
+ const confirmed = await promptConfirm('This will remove all worktrees for merged/closed PRs. Continue?', false);
405
+ if (!confirmed) {
406
+ return CANCELLED;
407
+ }
408
+ console.log();
409
+ runSubcommand('cleanpr', ['--all']);
410
+ return COMPLETED_EXIT;
411
+ }
412
+ case 'clean-specific': {
413
+ const prNumberStr = await promptInput('PR number to clean');
414
+ if (!prNumberStr) {
415
+ console.log(red('PR number is required'));
416
+ return CANCELLED;
417
+ }
418
+ const prNumber = parseInt(prNumberStr, 10);
419
+ if (isNaN(prNumber) || prNumber <= 0) {
420
+ console.log(red('Invalid PR number'));
421
+ return CANCELLED;
422
+ }
423
+ console.log();
424
+ runSubcommand('cleanpr', [String(prNumber)]);
425
+ return COMPLETED_EXIT;
426
+ }
427
+ case 'dry-run':
428
+ console.log();
429
+ runSubcommand('cleanpr', ['--dry-run']);
430
+ return COMPLETED_EXIT;
431
+ default:
432
+ return CANCELLED;
433
+ }
434
+ }
435
+ catch (error) {
436
+ if (error instanceof Error && error.message === 'User cancelled') {
437
+ return CANCELLED;
438
+ }
439
+ if (error instanceof UserNavigatedBack) {
440
+ return CANCELLED;
441
+ }
442
+ throw error;
443
+ }
444
+ }
445
+ const linkOptions = [
446
+ {
447
+ label: 'View linked files',
448
+ description: 'Show current link manifest',
449
+ value: 'view',
450
+ },
451
+ {
452
+ label: 'Sync links',
453
+ description: 'Synchronize all linked files to worktrees',
454
+ value: 'sync',
455
+ },
456
+ {
457
+ label: 'Add file to manifest',
458
+ description: 'Add a new file to be linked',
459
+ value: 'add',
460
+ },
461
+ {
462
+ label: 'Remove file from manifest',
463
+ description: 'Remove a file from linking',
464
+ value: 'remove',
465
+ },
466
+ {
467
+ label: 'Validate manifest',
468
+ description: 'Check manifest for issues',
469
+ value: 'validate',
470
+ },
471
+ {
472
+ label: '← Back',
473
+ description: 'Return to main menu',
474
+ value: 'back',
475
+ },
476
+ ];
477
+ async function handleLinkConfig() {
478
+ console.log();
479
+ console.log(bold('Link Config Files'));
480
+ console.log();
481
+ try {
482
+ const action = await promptChoice('What would you like to do?', linkOptions);
483
+ switch (action) {
484
+ case 'back':
485
+ return CANCELLED;
486
+ case 'view':
487
+ console.log();
488
+ runSubcommand('wtlink', ['list']);
489
+ return COMPLETED_EXIT;
490
+ case 'sync':
491
+ console.log();
492
+ runSubcommand('wtlink', ['sync']);
493
+ return COMPLETED_EXIT;
494
+ case 'add': {
495
+ const filePath = await promptInput('File path to add (relative to repo root)');
496
+ if (!filePath) {
497
+ console.log(red('File path is required'));
498
+ return CANCELLED;
499
+ }
500
+ console.log();
501
+ runSubcommand('wtlink', ['add', filePath]);
502
+ return COMPLETED_EXIT;
503
+ }
504
+ case 'remove': {
505
+ const filePath = await promptInput('File path to remove');
506
+ if (!filePath) {
507
+ console.log(red('File path is required'));
508
+ return CANCELLED;
509
+ }
510
+ console.log();
511
+ runSubcommand('wtlink', ['remove', filePath]);
512
+ return COMPLETED_EXIT;
513
+ }
514
+ case 'validate':
515
+ console.log();
516
+ runSubcommand('wtlink', ['validate']);
517
+ return COMPLETED_EXIT;
518
+ default:
519
+ return CANCELLED;
520
+ }
521
+ }
522
+ catch (error) {
523
+ if (error instanceof Error && error.message === 'User cancelled') {
524
+ return CANCELLED;
525
+ }
526
+ if (error instanceof UserNavigatedBack) {
527
+ return CANCELLED;
528
+ }
529
+ throw error;
530
+ }
531
+ }
532
+ // ============================================================================
533
+ // Show State Flow
534
+ // ============================================================================
535
+ async function handleShowState() {
536
+ console.log();
537
+ runSubcommand('wtstate', []);
538
+ return COMPLETED_EXIT;
539
+ }
540
+ const configOptions = [
541
+ {
542
+ label: 'View current config',
543
+ description: 'Display .worktreerc settings',
544
+ value: 'view',
545
+ },
546
+ {
547
+ label: 'Initialize config',
548
+ description: 'Create a new .worktreerc file',
549
+ value: 'init',
550
+ },
551
+ {
552
+ label: 'Edit setting',
553
+ description: 'Change a specific configuration value',
554
+ value: 'edit',
555
+ },
556
+ {
557
+ label: '← Back',
558
+ description: 'Return to main menu',
559
+ value: 'back',
560
+ },
561
+ ];
562
+ async function handleConfigure() {
563
+ console.log();
564
+ console.log(bold('Configure Settings'));
565
+ console.log();
566
+ try {
567
+ const action = await promptChoice('What would you like to do?', configOptions);
568
+ switch (action) {
569
+ case 'back':
570
+ return CANCELLED;
571
+ case 'view':
572
+ console.log();
573
+ runSubcommand('wtconfig', ['show']);
574
+ return COMPLETED_EXIT;
575
+ case 'init': {
576
+ const confirmed = await promptConfirm('Create .worktreerc in current directory?', true);
577
+ if (!confirmed) {
578
+ return CANCELLED;
579
+ }
580
+ console.log();
581
+ runSubcommand('wtconfig', ['init']);
582
+ return COMPLETED_EXIT;
583
+ }
584
+ case 'edit': {
585
+ // Show available settings
586
+ const settingOptions = [
587
+ { label: 'baseBranch', description: 'Default base branch for PRs', value: 'baseBranch' },
588
+ { label: 'draftPr', description: 'Create PRs as drafts by default', value: 'draftPr' },
589
+ { label: 'branchPrefix', description: 'Prefix for new branches', value: 'branchPrefix' },
590
+ {
591
+ label: 'worktreePattern',
592
+ description: 'Pattern for worktree directory names',
593
+ value: 'worktreePattern',
594
+ },
595
+ {
596
+ label: 'worktreeParent',
597
+ description: 'Parent directory for worktrees',
598
+ value: 'worktreeParent',
599
+ },
600
+ ];
601
+ const setting = await promptChoice('Which setting?', settingOptions);
602
+ const value = await promptInput(`New value for ${setting}`);
603
+ if (!value) {
604
+ console.log(red('Value is required'));
605
+ return CANCELLED;
606
+ }
607
+ console.log();
608
+ runSubcommand('wtconfig', ['set', setting, value]);
609
+ return COMPLETED_EXIT;
610
+ }
611
+ default:
612
+ return CANCELLED;
613
+ }
614
+ }
615
+ catch (error) {
616
+ if (error instanceof Error && error.message === 'User cancelled') {
617
+ return CANCELLED;
618
+ }
619
+ if (error instanceof UserNavigatedBack) {
620
+ return CANCELLED;
621
+ }
622
+ throw error;
623
+ }
624
+ }
625
+ // ============================================================================
626
+ // Exported flow handlers for testing
627
+ // ============================================================================
628
+ export const flows = {
629
+ handleListWorktrees,
630
+ handleNewPR,
631
+ handleNewPRFromDescription,
632
+ handleNewPRFromExisting,
633
+ handleNewPRFromBranch,
634
+ handleCleanPRs,
635
+ handleLinkConfig,
636
+ handleShowState,
637
+ handleConfigure,
638
+ };
639
+ //# sourceMappingURL=interactive-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-menu.js","sourceRoot":"","sources":["../../../src/cli/wt/interactive-menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Integration tests for interactive menu flows
3
+ *
4
+ * These tests verify that each menu flow:
5
+ * 1. Gathers the correct user inputs
6
+ * 2. Passes the correct arguments to subcommands
7
+ * 3. Handles cancellation and back navigation correctly
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=interactive-menu.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-menu.test.d.ts","sourceRoot":"","sources":["../../../src/cli/wt/interactive-menu.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}