@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.
- package/README.md +307 -418
- package/dist/cli/cleanpr.test.js +2 -0
- package/dist/cli/cleanpr.test.js.map +1 -1
- package/dist/cli/newpr.js +48 -11
- package/dist/cli/newpr.js.map +1 -1
- package/dist/cli/newpr.test.js +33 -15
- package/dist/cli/newpr.test.js.map +1 -1
- package/dist/cli/wt/clean.d.ts +1 -0
- package/dist/cli/wt/clean.d.ts.map +1 -1
- package/dist/cli/wt/clean.js +11 -1
- package/dist/cli/wt/clean.js.map +1 -1
- package/dist/cli/wt/config.d.ts +1 -1
- package/dist/cli/wt/config.d.ts.map +1 -1
- package/dist/cli/wt/config.js +148 -13
- package/dist/cli/wt/config.js.map +1 -1
- package/dist/cli/wt/config.test.d.ts +5 -0
- package/dist/cli/wt/config.test.d.ts.map +1 -0
- package/dist/cli/wt/config.test.js +260 -0
- package/dist/cli/wt/config.test.js.map +1 -0
- package/dist/cli/wt/entry.test.js +11 -8
- package/dist/cli/wt/entry.test.js.map +1 -1
- package/dist/cli/wt/init.d.ts +14 -0
- package/dist/cli/wt/init.d.ts.map +1 -0
- package/dist/cli/wt/init.js +209 -0
- package/dist/cli/wt/init.js.map +1 -0
- package/dist/cli/wt/init.test.d.ts +5 -0
- package/dist/cli/wt/init.test.d.ts.map +1 -0
- package/dist/cli/wt/init.test.js +165 -0
- package/dist/cli/wt/init.test.js.map +1 -0
- package/dist/cli/wt/init.unit.test.d.ts +5 -0
- package/dist/cli/wt/init.unit.test.d.ts.map +1 -0
- package/dist/cli/wt/init.unit.test.js +432 -0
- package/dist/cli/wt/init.unit.test.js.map +1 -0
- package/dist/cli/wt/interactive-menu.d.ts +41 -0
- package/dist/cli/wt/interactive-menu.d.ts.map +1 -0
- package/dist/cli/wt/interactive-menu.js +639 -0
- package/dist/cli/wt/interactive-menu.js.map +1 -0
- package/dist/cli/wt/interactive-menu.test.d.ts +10 -0
- package/dist/cli/wt/interactive-menu.test.d.ts.map +1 -0
- package/dist/cli/wt/interactive-menu.test.js +711 -0
- package/dist/cli/wt/interactive-menu.test.js.map +1 -0
- package/dist/cli/wt/link.d.ts +9 -0
- package/dist/cli/wt/link.d.ts.map +1 -1
- package/dist/cli/wt/link.js +27 -0
- package/dist/cli/wt/link.js.map +1 -1
- package/dist/cli/wt/list.d.ts +2 -2
- package/dist/cli/wt/list.d.ts.map +1 -1
- package/dist/cli/wt/list.js +17 -17
- package/dist/cli/wt/list.js.map +1 -1
- package/dist/cli/wt/new.d.ts +7 -1
- package/dist/cli/wt/new.d.ts.map +1 -1
- package/dist/cli/wt/new.js +58 -6
- package/dist/cli/wt/new.js.map +1 -1
- package/dist/cli/wt/wt.test.js +159 -16
- package/dist/cli/wt/wt.test.js.map +1 -1
- package/dist/cli/wt.d.ts +2 -1
- package/dist/cli/wt.d.ts.map +1 -1
- package/dist/cli/wt.js +98 -3
- package/dist/cli/wt.js.map +1 -1
- package/dist/cli/wt.unit.test.d.ts +7 -0
- package/dist/cli/wt.unit.test.d.ts.map +1 -0
- package/dist/cli/wt.unit.test.js +182 -0
- package/dist/cli/wt.unit.test.js.map +1 -0
- package/dist/cli/wtconfig.js +18 -4
- package/dist/cli/wtconfig.js.map +1 -1
- package/dist/cli/wtconfig.test.js +18 -16
- package/dist/cli/wtconfig.test.js.map +1 -1
- package/dist/e2e/newpr/scenarios.e2e.test.js +7 -7
- package/dist/e2e/newpr/scenarios.e2e.test.js.map +1 -1
- package/dist/e2e/wt/wt.e2e.test.d.ts +9 -0
- package/dist/e2e/wt/wt.e2e.test.d.ts.map +1 -0
- package/dist/e2e/wt/wt.e2e.test.js +384 -0
- package/dist/e2e/wt/wt.e2e.test.js.map +1 -0
- package/dist/lib/ai/base-provider.d.ts +22 -0
- package/dist/lib/ai/base-provider.d.ts.map +1 -1
- package/dist/lib/ai/base-provider.js +180 -99
- package/dist/lib/ai/base-provider.js.map +1 -1
- package/dist/lib/ai/base-provider.test.js +13 -14
- package/dist/lib/ai/base-provider.test.js.map +1 -1
- package/dist/lib/ai/cli-provider.d.ts +11 -7
- package/dist/lib/ai/cli-provider.d.ts.map +1 -1
- package/dist/lib/ai/cli-provider.js +19 -49
- package/dist/lib/ai/cli-provider.js.map +1 -1
- package/dist/lib/ai/cli-provider.test.js +47 -49
- package/dist/lib/ai/cli-provider.test.js.map +1 -1
- package/dist/lib/ai/index.d.ts +2 -1
- package/dist/lib/ai/index.d.ts.map +1 -1
- package/dist/lib/ai/index.js +2 -0
- package/dist/lib/ai/index.js.map +1 -1
- package/dist/lib/ai/provider-manager.js +2 -2
- package/dist/lib/ai/provider-manager.js.map +1 -1
- package/dist/lib/ai/repo-docs.d.ts +43 -0
- package/dist/lib/ai/repo-docs.d.ts.map +1 -0
- package/dist/lib/ai/repo-docs.js +274 -0
- package/dist/lib/ai/repo-docs.js.map +1 -0
- package/dist/lib/ai/repo-docs.test.d.ts +5 -0
- package/dist/lib/ai/repo-docs.test.d.ts.map +1 -0
- package/dist/lib/ai/repo-docs.test.js +357 -0
- package/dist/lib/ai/repo-docs.test.js.map +1 -0
- package/dist/lib/ai/types.d.ts +18 -2
- package/dist/lib/ai/types.d.ts.map +1 -1
- package/dist/lib/ai/types.js.map +1 -1
- package/dist/lib/config-editor.d.ts +21 -0
- package/dist/lib/config-editor.d.ts.map +1 -0
- package/dist/lib/config-editor.js +729 -0
- package/dist/lib/config-editor.js.map +1 -0
- package/dist/lib/config-editor.test.d.ts +11 -0
- package/dist/lib/config-editor.test.d.ts.map +1 -0
- package/dist/lib/config-editor.test.js +526 -0
- package/dist/lib/config-editor.test.js.map +1 -0
- package/dist/lib/config-validation.d.ts +28 -0
- package/dist/lib/config-validation.d.ts.map +1 -0
- package/dist/lib/config-validation.js +534 -0
- package/dist/lib/config-validation.js.map +1 -0
- package/dist/lib/config-validation.test.d.ts +5 -0
- package/dist/lib/config-validation.test.d.ts.map +1 -0
- package/dist/lib/config-validation.test.js +398 -0
- package/dist/lib/config-validation.test.js.map +1 -0
- package/dist/lib/config.d.ts +115 -6
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +251 -55
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.js +2 -1
- package/dist/lib/config.test.js.map +1 -1
- package/dist/lib/constants.d.ts +50 -1
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +67 -1
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/constants.test.d.ts +5 -0
- package/dist/lib/constants.test.d.ts.map +1 -0
- package/dist/lib/constants.test.js +121 -0
- package/dist/lib/constants.test.js.map +1 -0
- package/dist/lib/git.d.ts +12 -0
- package/dist/lib/git.d.ts.map +1 -1
- package/dist/lib/git.js +26 -0
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/global-check.d.ts +38 -0
- package/dist/lib/global-check.d.ts.map +1 -0
- package/dist/lib/global-check.js +135 -0
- package/dist/lib/global-check.js.map +1 -0
- package/dist/lib/global-check.test.d.ts +5 -0
- package/dist/lib/global-check.test.d.ts.map +1 -0
- package/dist/lib/global-check.test.js +153 -0
- package/dist/lib/global-check.test.js.map +1 -0
- package/dist/lib/global-config.d.ts +102 -0
- package/dist/lib/global-config.d.ts.map +1 -0
- package/dist/lib/global-config.js +234 -0
- package/dist/lib/global-config.js.map +1 -0
- package/dist/lib/global-config.test.d.ts +5 -0
- package/dist/lib/global-config.test.d.ts.map +1 -0
- package/dist/lib/global-config.test.js +282 -0
- package/dist/lib/global-config.test.js.map +1 -0
- package/dist/lib/logger.d.ts +175 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +475 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/logger.test.d.ts +5 -0
- package/dist/lib/logger.test.d.ts.map +1 -0
- package/dist/lib/logger.test.js +292 -0
- package/dist/lib/logger.test.js.map +1 -0
- package/dist/lib/lswt/action-executors.test.js +2 -0
- package/dist/lib/lswt/action-executors.test.js.map +1 -1
- package/dist/lib/newpr/args.d.ts.map +1 -1
- package/dist/lib/newpr/args.js +9 -2
- package/dist/lib/newpr/args.js.map +1 -1
- package/dist/lib/newpr/args.test.js +1 -1
- package/dist/lib/newpr/args.test.js.map +1 -1
- package/dist/lib/newpr/types.d.ts +2 -0
- package/dist/lib/newpr/types.d.ts.map +1 -1
- package/dist/lib/prompts.d.ts +6 -0
- package/dist/lib/prompts.d.ts.map +1 -1
- package/dist/lib/prompts.js +31 -9
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/prompts.test.js +72 -1
- package/dist/lib/prompts.test.js.map +1 -1
- package/dist/lib/schema.test.d.ts +10 -0
- package/dist/lib/schema.test.d.ts.map +1 -0
- package/dist/lib/schema.test.js +309 -0
- package/dist/lib/schema.test.js.map +1 -0
- package/dist/lib/wtconfig/environment.d.ts.map +1 -1
- package/dist/lib/wtconfig/environment.js +6 -4
- package/dist/lib/wtconfig/environment.js.map +1 -1
- package/dist/lib/wtconfig/environment.test.js +2 -7
- package/dist/lib/wtconfig/environment.test.js.map +1 -1
- package/dist/lib/wtconfig/types.d.ts +3 -1
- package/dist/lib/wtconfig/types.d.ts.map +1 -1
- package/dist/lib/wtlink/manage-manifest.test.js +145 -7
- package/dist/lib/wtlink/manage-manifest.test.js.map +1 -1
- package/package.json +2 -1
- 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"}
|