@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.
- package/LICENSE +21 -0
- package/README.md +259 -0
- package/dist/cli/cleanpr.d.ts +13 -0
- package/dist/cli/cleanpr.d.ts.map +1 -0
- package/dist/cli/cleanpr.js +441 -0
- package/dist/cli/cleanpr.js.map +1 -0
- package/dist/cli/lswt.d.ts +11 -0
- package/dist/cli/lswt.d.ts.map +1 -0
- package/dist/cli/lswt.js +313 -0
- package/dist/cli/lswt.js.map +1 -0
- package/dist/cli/newpr.d.ts +11 -0
- package/dist/cli/newpr.d.ts.map +1 -0
- package/dist/cli/newpr.js +888 -0
- package/dist/cli/newpr.js.map +1 -0
- package/dist/cli/wtlink.d.ts +15 -0
- package/dist/cli/wtlink.d.ts.map +1 -0
- package/dist/cli/wtlink.js +124 -0
- package/dist/cli/wtlink.js.map +1 -0
- package/dist/e2e/cli.e2e.test.d.ts +2 -0
- package/dist/e2e/cli.e2e.test.d.ts.map +1 -0
- package/dist/e2e/cli.e2e.test.js +215 -0
- package/dist/e2e/cli.e2e.test.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/git.integration.test.d.ts +2 -0
- package/dist/integration/git.integration.test.d.ts.map +1 -0
- package/dist/integration/git.integration.test.js +333 -0
- package/dist/integration/git.integration.test.js.map +1 -0
- package/dist/lib/colors.d.ts +59 -0
- package/dist/lib/colors.d.ts.map +1 -0
- package/dist/lib/colors.js +145 -0
- package/dist/lib/colors.js.map +1 -0
- package/dist/lib/colors.test.d.ts +2 -0
- package/dist/lib/colors.test.d.ts.map +1 -0
- package/dist/lib/colors.test.js +69 -0
- package/dist/lib/colors.test.js.map +1 -0
- package/dist/lib/config.d.ts +58 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +91 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/config.test.d.ts +2 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +84 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/constants.d.ts +37 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +37 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/errors.d.ts +88 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +112 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/errors.test.d.ts +2 -0
- package/dist/lib/errors.test.d.ts.map +1 -0
- package/dist/lib/errors.test.js +117 -0
- package/dist/lib/errors.test.js.map +1 -0
- package/dist/lib/git.d.ts +224 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +524 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/git.test.d.ts +2 -0
- package/dist/lib/git.test.d.ts.map +1 -0
- package/dist/lib/git.test.js +402 -0
- package/dist/lib/git.test.js.map +1 -0
- package/dist/lib/github.d.ts +82 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +254 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/github.test.d.ts +2 -0
- package/dist/lib/github.test.d.ts.map +1 -0
- package/dist/lib/github.test.js +258 -0
- package/dist/lib/github.test.js.map +1 -0
- package/dist/lib/prompts.d.ts +39 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +213 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/prompts.test.d.ts +2 -0
- package/dist/lib/prompts.test.d.ts.map +1 -0
- package/dist/lib/prompts.test.js +250 -0
- package/dist/lib/prompts.test.js.map +1 -0
- package/dist/lib/state-detection.d.ts +65 -0
- package/dist/lib/state-detection.d.ts.map +1 -0
- package/dist/lib/state-detection.js +186 -0
- package/dist/lib/state-detection.js.map +1 -0
- package/dist/lib/state-detection.test.d.ts +2 -0
- package/dist/lib/state-detection.test.d.ts.map +1 -0
- package/dist/lib/state-detection.test.js +164 -0
- package/dist/lib/state-detection.test.js.map +1 -0
- package/dist/lib/wtlink/index.d.ts +5 -0
- package/dist/lib/wtlink/index.d.ts.map +1 -0
- package/dist/lib/wtlink/index.js +7 -0
- package/dist/lib/wtlink/index.js.map +1 -0
- package/dist/lib/wtlink/link-configs.d.ts +10 -0
- package/dist/lib/wtlink/link-configs.d.ts.map +1 -0
- package/dist/lib/wtlink/link-configs.js +411 -0
- package/dist/lib/wtlink/link-configs.js.map +1 -0
- package/dist/lib/wtlink/link-configs.test.d.ts +2 -0
- package/dist/lib/wtlink/link-configs.test.d.ts.map +1 -0
- package/dist/lib/wtlink/link-configs.test.js +179 -0
- package/dist/lib/wtlink/link-configs.test.js.map +1 -0
- package/dist/lib/wtlink/main-menu.d.ts +2 -0
- package/dist/lib/wtlink/main-menu.d.ts.map +1 -0
- package/dist/lib/wtlink/main-menu.js +149 -0
- package/dist/lib/wtlink/main-menu.js.map +1 -0
- package/dist/lib/wtlink/manage-manifest.d.ts +9 -0
- package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -0
- package/dist/lib/wtlink/manage-manifest.js +1262 -0
- package/dist/lib/wtlink/manage-manifest.js.map +1 -0
- package/dist/lib/wtlink/validate-manifest.d.ts +6 -0
- package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -0
- package/dist/lib/wtlink/validate-manifest.js +51 -0
- package/dist/lib/wtlink/validate-manifest.js.map +1 -0
- package/dist/lib/wtlink/validate-manifest.test.d.ts +2 -0
- package/dist/lib/wtlink/validate-manifest.test.d.ts.map +1 -0
- package/dist/lib/wtlink/validate-manifest.test.js +115 -0
- package/dist/lib/wtlink/validate-manifest.test.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import readline from 'readline';
|
|
2
|
+
import { yellow, dim, cyan, red, bold } from './colors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create a readline interface for prompts
|
|
5
|
+
*/
|
|
6
|
+
function createInterface() {
|
|
7
|
+
return readline.createInterface({
|
|
8
|
+
input: process.stdin,
|
|
9
|
+
output: process.stdout,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Prompt user to select from a list of simple string options
|
|
14
|
+
* Returns 1-based index of selected option
|
|
15
|
+
*/
|
|
16
|
+
export async function promptChoiceIndex(prompt, options) {
|
|
17
|
+
const rl = createInterface();
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
// Display prompt and options
|
|
20
|
+
console.log(`\n${yellow(prompt)}\n`);
|
|
21
|
+
options.forEach((opt, i) => {
|
|
22
|
+
const num = `${i + 1})`;
|
|
23
|
+
console.log(` ${cyan(num)} ${opt}`);
|
|
24
|
+
});
|
|
25
|
+
console.log();
|
|
26
|
+
const ask = () => {
|
|
27
|
+
rl.question(`Enter choice [1-${options.length}]: `, (answer) => {
|
|
28
|
+
const trimmed = answer.trim();
|
|
29
|
+
// Handle empty input
|
|
30
|
+
if (!trimmed) {
|
|
31
|
+
ask();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Handle 'q' or 'quit' to cancel
|
|
35
|
+
if (trimmed.toLowerCase() === 'q' || trimmed.toLowerCase() === 'quit') {
|
|
36
|
+
rl.close();
|
|
37
|
+
reject(new Error('User cancelled'));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const choice = parseInt(trimmed, 10);
|
|
41
|
+
if (isNaN(choice) || choice < 1 || choice > options.length) {
|
|
42
|
+
console.log(red(`Invalid choice. Please enter a number between 1 and ${options.length}.`));
|
|
43
|
+
ask();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
rl.close();
|
|
47
|
+
resolve(choice);
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
// Handle Ctrl+C
|
|
51
|
+
rl.on('close', () => {
|
|
52
|
+
// Interface closed without answer
|
|
53
|
+
});
|
|
54
|
+
rl.on('SIGINT', () => {
|
|
55
|
+
rl.close();
|
|
56
|
+
reject(new Error('User cancelled'));
|
|
57
|
+
});
|
|
58
|
+
ask();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Prompt user to select from a list of options with values
|
|
63
|
+
* Returns the value of the selected option
|
|
64
|
+
*/
|
|
65
|
+
export async function promptChoice(prompt, options) {
|
|
66
|
+
const rl = createInterface();
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
// Display prompt and options
|
|
69
|
+
console.log(`\n${yellow(prompt)}\n`);
|
|
70
|
+
options.forEach((opt, i) => {
|
|
71
|
+
const num = `${i + 1})`;
|
|
72
|
+
console.log(` ${cyan(num)} ${opt.label}`);
|
|
73
|
+
if (opt.description) {
|
|
74
|
+
console.log(` ${dim(opt.description)}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
console.log();
|
|
78
|
+
const ask = () => {
|
|
79
|
+
rl.question(`Enter choice [1-${options.length}]: `, (answer) => {
|
|
80
|
+
const trimmed = answer.trim();
|
|
81
|
+
// Handle empty input
|
|
82
|
+
if (!trimmed) {
|
|
83
|
+
ask();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Handle 'q' or 'quit' to cancel
|
|
87
|
+
if (trimmed.toLowerCase() === 'q' || trimmed.toLowerCase() === 'quit') {
|
|
88
|
+
rl.close();
|
|
89
|
+
reject(new Error('User cancelled'));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const choice = parseInt(trimmed, 10);
|
|
93
|
+
if (isNaN(choice) || choice < 1 || choice > options.length) {
|
|
94
|
+
console.log(red(`Invalid choice. Please enter a number between 1 and ${options.length}.`));
|
|
95
|
+
ask();
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
rl.close();
|
|
99
|
+
resolve(options[choice - 1].value);
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
// Handle Ctrl+C
|
|
103
|
+
rl.on('close', () => {
|
|
104
|
+
// Interface closed without answer
|
|
105
|
+
});
|
|
106
|
+
rl.on('SIGINT', () => {
|
|
107
|
+
rl.close();
|
|
108
|
+
reject(new Error('User cancelled'));
|
|
109
|
+
});
|
|
110
|
+
ask();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Prompt user for yes/no confirmation
|
|
115
|
+
*/
|
|
116
|
+
export async function promptConfirm(prompt, defaultValue = false) {
|
|
117
|
+
const rl = createInterface();
|
|
118
|
+
const hint = defaultValue ? '[Y/n]' : '[y/N]';
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
rl.question(`${prompt} ${dim(hint)} `, (answer) => {
|
|
121
|
+
rl.close();
|
|
122
|
+
const trimmed = answer.trim().toLowerCase();
|
|
123
|
+
if (!trimmed) {
|
|
124
|
+
resolve(defaultValue);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (trimmed === 'y' || trimmed === 'yes') {
|
|
128
|
+
resolve(true);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (trimmed === 'n' || trimmed === 'no') {
|
|
132
|
+
resolve(false);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Invalid input, use default
|
|
136
|
+
resolve(defaultValue);
|
|
137
|
+
});
|
|
138
|
+
rl.on('SIGINT', () => {
|
|
139
|
+
rl.close();
|
|
140
|
+
reject(new Error('User cancelled'));
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Prompt user for text input
|
|
146
|
+
*/
|
|
147
|
+
export async function promptInput(prompt, defaultValue) {
|
|
148
|
+
const rl = createInterface();
|
|
149
|
+
const hint = defaultValue ? dim(` [${defaultValue}]`) : '';
|
|
150
|
+
return new Promise((resolve, reject) => {
|
|
151
|
+
rl.question(`${prompt}${hint}: `, (answer) => {
|
|
152
|
+
rl.close();
|
|
153
|
+
const trimmed = answer.trim();
|
|
154
|
+
if (!trimmed && defaultValue !== undefined) {
|
|
155
|
+
resolve(defaultValue);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
resolve(trimmed);
|
|
159
|
+
});
|
|
160
|
+
rl.on('SIGINT', () => {
|
|
161
|
+
rl.close();
|
|
162
|
+
reject(new Error('User cancelled'));
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Display a spinner while an async operation runs
|
|
168
|
+
*/
|
|
169
|
+
export async function withSpinner(message, operation) {
|
|
170
|
+
const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
171
|
+
let frameIndex = 0;
|
|
172
|
+
let interval = null;
|
|
173
|
+
// Only show spinner if stdout is a TTY
|
|
174
|
+
const showSpinner = process.stdout.isTTY ?? false;
|
|
175
|
+
if (showSpinner) {
|
|
176
|
+
interval = setInterval(() => {
|
|
177
|
+
process.stdout.write(`\r${cyan(frames[frameIndex])} ${message}`);
|
|
178
|
+
frameIndex = (frameIndex + 1) % frames.length;
|
|
179
|
+
}, 80);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(message);
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
const result = await operation();
|
|
186
|
+
if (interval) {
|
|
187
|
+
clearInterval(interval);
|
|
188
|
+
process.stdout.write('\r' + ' '.repeat(message.length + 3) + '\r');
|
|
189
|
+
}
|
|
190
|
+
return result;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (interval) {
|
|
194
|
+
clearInterval(interval);
|
|
195
|
+
process.stdout.write('\r' + ' '.repeat(message.length + 3) + '\r');
|
|
196
|
+
}
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Print a formatted section header
|
|
202
|
+
*/
|
|
203
|
+
export function printHeader(text) {
|
|
204
|
+
console.log(`\n${bold(cyan(text))}\n`);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Print a formatted list item
|
|
208
|
+
*/
|
|
209
|
+
export function printListItem(text, indent = 0) {
|
|
210
|
+
const spaces = ' '.repeat(indent);
|
|
211
|
+
console.log(`${spaces}• ${text}`);
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.test.d.ts","sourceRoot":"","sources":["../../src/lib/prompts.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import readline from 'readline';
|
|
3
|
+
import { promptChoiceIndex, promptChoice, promptConfirm, promptInput, printHeader, printListItem, } from './prompts.js';
|
|
4
|
+
// Mock readline
|
|
5
|
+
vi.mock('readline', () => ({
|
|
6
|
+
default: {
|
|
7
|
+
createInterface: vi.fn(),
|
|
8
|
+
},
|
|
9
|
+
}));
|
|
10
|
+
// Mock console.log
|
|
11
|
+
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
12
|
+
describe('prompts', () => {
|
|
13
|
+
let mockRl;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.clearAllMocks();
|
|
16
|
+
mockRl = {
|
|
17
|
+
question: vi.fn(),
|
|
18
|
+
close: vi.fn(),
|
|
19
|
+
on: vi.fn(),
|
|
20
|
+
};
|
|
21
|
+
vi.mocked(readline.createInterface).mockReturnValue(mockRl);
|
|
22
|
+
});
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
consoleSpy.mockClear();
|
|
25
|
+
});
|
|
26
|
+
describe('promptChoiceIndex', () => {
|
|
27
|
+
it('displays prompt and options', async () => {
|
|
28
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
29
|
+
callback('1');
|
|
30
|
+
});
|
|
31
|
+
await promptChoiceIndex('Choose an option:', ['Option A', 'Option B', 'Option C']);
|
|
32
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Choose an option:'));
|
|
33
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Option A'));
|
|
34
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Option B'));
|
|
35
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Option C'));
|
|
36
|
+
});
|
|
37
|
+
it('returns 1-based index of selected option', async () => {
|
|
38
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
39
|
+
callback('2');
|
|
40
|
+
});
|
|
41
|
+
const result = await promptChoiceIndex('Choose:', ['A', 'B', 'C']);
|
|
42
|
+
expect(result).toBe(2);
|
|
43
|
+
expect(mockRl.close).toHaveBeenCalled();
|
|
44
|
+
});
|
|
45
|
+
it('re-prompts on invalid input', async () => {
|
|
46
|
+
let callCount = 0;
|
|
47
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
48
|
+
callCount++;
|
|
49
|
+
if (callCount === 1) {
|
|
50
|
+
callback('invalid');
|
|
51
|
+
}
|
|
52
|
+
else if (callCount === 2) {
|
|
53
|
+
callback('5'); // out of range
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
callback('1'); // valid
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const result = await promptChoiceIndex('Choose:', ['A', 'B']);
|
|
60
|
+
expect(result).toBe(1);
|
|
61
|
+
expect(mockRl.question).toHaveBeenCalledTimes(3);
|
|
62
|
+
});
|
|
63
|
+
it('re-prompts on empty input', async () => {
|
|
64
|
+
let callCount = 0;
|
|
65
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
66
|
+
callCount++;
|
|
67
|
+
if (callCount === 1) {
|
|
68
|
+
callback('');
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
callback('1');
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
const result = await promptChoiceIndex('Choose:', ['A']);
|
|
75
|
+
expect(result).toBe(1);
|
|
76
|
+
expect(mockRl.question).toHaveBeenCalledTimes(2);
|
|
77
|
+
});
|
|
78
|
+
it('rejects on quit command', async () => {
|
|
79
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
80
|
+
callback('q');
|
|
81
|
+
});
|
|
82
|
+
await expect(promptChoiceIndex('Choose:', ['A', 'B'])).rejects.toThrow('User cancelled');
|
|
83
|
+
});
|
|
84
|
+
it('rejects on quit word', async () => {
|
|
85
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
86
|
+
callback('quit');
|
|
87
|
+
});
|
|
88
|
+
await expect(promptChoiceIndex('Choose:', ['A'])).rejects.toThrow('User cancelled');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('promptChoice', () => {
|
|
92
|
+
it('returns value of selected option', async () => {
|
|
93
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
94
|
+
callback('2');
|
|
95
|
+
});
|
|
96
|
+
const result = await promptChoice('Choose:', [
|
|
97
|
+
{ label: 'First', value: 'first-value' },
|
|
98
|
+
{ label: 'Second', value: 'second-value' },
|
|
99
|
+
{ label: 'Third', value: 'third-value' },
|
|
100
|
+
]);
|
|
101
|
+
expect(result).toBe('second-value');
|
|
102
|
+
});
|
|
103
|
+
it('displays descriptions when provided', async () => {
|
|
104
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
105
|
+
callback('1');
|
|
106
|
+
});
|
|
107
|
+
await promptChoice('Choose:', [
|
|
108
|
+
{ label: 'Option', description: 'A helpful description', value: 'opt' },
|
|
109
|
+
]);
|
|
110
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('A helpful description'));
|
|
111
|
+
});
|
|
112
|
+
it('works with typed values', async () => {
|
|
113
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
114
|
+
callback('1');
|
|
115
|
+
});
|
|
116
|
+
const result = await promptChoice('Choose:', [
|
|
117
|
+
{ label: 'Item 1', value: { id: 1, name: 'One' } },
|
|
118
|
+
{ label: 'Item 2', value: { id: 2, name: 'Two' } },
|
|
119
|
+
]);
|
|
120
|
+
expect(result).toEqual({ id: 1, name: 'One' });
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe('promptConfirm', () => {
|
|
124
|
+
it('returns true for y input', async () => {
|
|
125
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
126
|
+
callback('y');
|
|
127
|
+
});
|
|
128
|
+
const result = await promptConfirm('Continue?');
|
|
129
|
+
expect(result).toBe(true);
|
|
130
|
+
});
|
|
131
|
+
it('returns true for yes input', async () => {
|
|
132
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
133
|
+
callback('yes');
|
|
134
|
+
});
|
|
135
|
+
const result = await promptConfirm('Continue?');
|
|
136
|
+
expect(result).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
it('returns true for Y input (case insensitive)', async () => {
|
|
139
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
140
|
+
callback('Y');
|
|
141
|
+
});
|
|
142
|
+
const result = await promptConfirm('Continue?');
|
|
143
|
+
expect(result).toBe(true);
|
|
144
|
+
});
|
|
145
|
+
it('returns false for n input', async () => {
|
|
146
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
147
|
+
callback('n');
|
|
148
|
+
});
|
|
149
|
+
const result = await promptConfirm('Continue?');
|
|
150
|
+
expect(result).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
it('returns false for no input', async () => {
|
|
153
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
154
|
+
callback('no');
|
|
155
|
+
});
|
|
156
|
+
const result = await promptConfirm('Continue?');
|
|
157
|
+
expect(result).toBe(false);
|
|
158
|
+
});
|
|
159
|
+
it('returns default false for empty input', async () => {
|
|
160
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
161
|
+
callback('');
|
|
162
|
+
});
|
|
163
|
+
const result = await promptConfirm('Continue?');
|
|
164
|
+
expect(result).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
it('returns default true when specified', async () => {
|
|
167
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
168
|
+
callback('');
|
|
169
|
+
});
|
|
170
|
+
const result = await promptConfirm('Continue?', true);
|
|
171
|
+
expect(result).toBe(true);
|
|
172
|
+
});
|
|
173
|
+
it('returns default for invalid input', async () => {
|
|
174
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
175
|
+
callback('maybe');
|
|
176
|
+
});
|
|
177
|
+
const result = await promptConfirm('Continue?', true);
|
|
178
|
+
expect(result).toBe(true);
|
|
179
|
+
});
|
|
180
|
+
it('displays correct hint for default false', async () => {
|
|
181
|
+
mockRl.question.mockImplementation((question, callback) => {
|
|
182
|
+
expect(question).toContain('[y/N]');
|
|
183
|
+
callback('');
|
|
184
|
+
});
|
|
185
|
+
await promptConfirm('Continue?', false);
|
|
186
|
+
});
|
|
187
|
+
it('displays correct hint for default true', async () => {
|
|
188
|
+
mockRl.question.mockImplementation((question, callback) => {
|
|
189
|
+
expect(question).toContain('[Y/n]');
|
|
190
|
+
callback('');
|
|
191
|
+
});
|
|
192
|
+
await promptConfirm('Continue?', true);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe('promptInput', () => {
|
|
196
|
+
it('returns user input', async () => {
|
|
197
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
198
|
+
callback('user input');
|
|
199
|
+
});
|
|
200
|
+
const result = await promptInput('Enter value:');
|
|
201
|
+
expect(result).toBe('user input');
|
|
202
|
+
});
|
|
203
|
+
it('trims whitespace', async () => {
|
|
204
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
205
|
+
callback(' trimmed ');
|
|
206
|
+
});
|
|
207
|
+
const result = await promptInput('Enter value:');
|
|
208
|
+
expect(result).toBe('trimmed');
|
|
209
|
+
});
|
|
210
|
+
it('returns default for empty input', async () => {
|
|
211
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
212
|
+
callback('');
|
|
213
|
+
});
|
|
214
|
+
const result = await promptInput('Enter value:', 'default');
|
|
215
|
+
expect(result).toBe('default');
|
|
216
|
+
});
|
|
217
|
+
it('returns empty string if no default and empty input', async () => {
|
|
218
|
+
mockRl.question.mockImplementation((_, callback) => {
|
|
219
|
+
callback('');
|
|
220
|
+
});
|
|
221
|
+
const result = await promptInput('Enter value:');
|
|
222
|
+
expect(result).toBe('');
|
|
223
|
+
});
|
|
224
|
+
it('displays default value hint', async () => {
|
|
225
|
+
mockRl.question.mockImplementation((question, callback) => {
|
|
226
|
+
expect(question).toContain('[default-value]');
|
|
227
|
+
callback('');
|
|
228
|
+
});
|
|
229
|
+
await promptInput('Enter:', 'default-value');
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
describe('printHeader', () => {
|
|
233
|
+
it('prints formatted header', () => {
|
|
234
|
+
printHeader('Test Header');
|
|
235
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Test Header'));
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
describe('printListItem', () => {
|
|
239
|
+
it('prints bullet point item', () => {
|
|
240
|
+
printListItem('List item');
|
|
241
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('•'));
|
|
242
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('List item'));
|
|
243
|
+
});
|
|
244
|
+
it('prints indented item', () => {
|
|
245
|
+
printListItem('Indented item', 2);
|
|
246
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringMatching(/^\s{4}•/));
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=prompts.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../../src/lib/prompts.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { CommitRelationship, WorkingTreeStatus } from './git.js';
|
|
2
|
+
/**
|
|
3
|
+
* Worktree type based on directory naming pattern
|
|
4
|
+
*/
|
|
5
|
+
export type WorktreeType = 'main_worktree' | 'pr_worktree' | 'other';
|
|
6
|
+
/**
|
|
7
|
+
* Branch type classification
|
|
8
|
+
*/
|
|
9
|
+
export type BranchType = 'main' | 'other' | 'detached';
|
|
10
|
+
/**
|
|
11
|
+
* Complete git state analysis
|
|
12
|
+
*/
|
|
13
|
+
export interface GitState {
|
|
14
|
+
worktreeType: WorktreeType;
|
|
15
|
+
branchType: BranchType;
|
|
16
|
+
currentBranch: string | null;
|
|
17
|
+
commitRelationship: CommitRelationship;
|
|
18
|
+
workingTreeStatus: WorkingTreeStatus;
|
|
19
|
+
localCommits: string[];
|
|
20
|
+
stagedFiles: string[];
|
|
21
|
+
unstagedFiles: string[];
|
|
22
|
+
repoRoot: string;
|
|
23
|
+
repoName: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Scenario identifiers for state handling
|
|
27
|
+
*/
|
|
28
|
+
export type Scenario = 'main_clean_same' | 'main_staged_same' | 'main_unstaged_same' | 'main_both_same' | 'main_clean_ahead' | 'main_changes_ahead' | 'branch_same_as_main' | 'branch_ancestor' | 'branch_divergent' | 'branch_with_changes' | 'detached_head' | 'pr_worktree';
|
|
29
|
+
/**
|
|
30
|
+
* Detect worktree type based on directory path pattern
|
|
31
|
+
*/
|
|
32
|
+
export declare function detectWorktreeType(repoRoot: string): WorktreeType;
|
|
33
|
+
/**
|
|
34
|
+
* Detect branch type
|
|
35
|
+
*/
|
|
36
|
+
export declare function detectBranchType(baseBranch: string, cwd?: string): BranchType;
|
|
37
|
+
/**
|
|
38
|
+
* Analyze complete git state
|
|
39
|
+
*/
|
|
40
|
+
export declare function analyzeGitState(baseBranch?: string, cwd?: string): GitState;
|
|
41
|
+
/**
|
|
42
|
+
* Detect scenario from git state
|
|
43
|
+
*/
|
|
44
|
+
export declare function detectScenario(state: GitState): Scenario;
|
|
45
|
+
/**
|
|
46
|
+
* Get human-readable description of scenario
|
|
47
|
+
*/
|
|
48
|
+
export declare function getScenarioDescription(scenario: Scenario): string;
|
|
49
|
+
/**
|
|
50
|
+
* Check if state has any uncommitted changes
|
|
51
|
+
*/
|
|
52
|
+
export declare function hasChanges(state: GitState): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Check if state has local commits not pushed
|
|
55
|
+
*/
|
|
56
|
+
export declare function hasLocalCommits(state: GitState): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Format file list for display
|
|
59
|
+
*/
|
|
60
|
+
export declare function formatFileList(files: string[], prefix?: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Format commit list for display
|
|
63
|
+
*/
|
|
64
|
+
export declare function formatCommitList(commits: string[]): string;
|
|
65
|
+
//# sourceMappingURL=state-detection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-detection.d.ts","sourceRoot":"","sources":["../../src/lib/state-detection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGtE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,aAAa,GAAG,OAAO,CAAC;AAErE;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,oBAAoB,GACpB,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,qBAAqB,GACrB,iBAAiB,GACjB,kBAAkB,GAClB,qBAAqB,GACrB,eAAe,GACf,aAAa,CAAC;AAElB;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAoBjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAW7E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,GAAE,MAA4B,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAyBhG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CA8DxD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA2BjE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAM3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAM1D"}
|