@camaradesuk/git-worktree-tools 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +259 -0
  3. package/dist/cli/cleanpr.d.ts +13 -0
  4. package/dist/cli/cleanpr.d.ts.map +1 -0
  5. package/dist/cli/cleanpr.js +441 -0
  6. package/dist/cli/cleanpr.js.map +1 -0
  7. package/dist/cli/lswt.d.ts +11 -0
  8. package/dist/cli/lswt.d.ts.map +1 -0
  9. package/dist/cli/lswt.js +313 -0
  10. package/dist/cli/lswt.js.map +1 -0
  11. package/dist/cli/newpr.d.ts +11 -0
  12. package/dist/cli/newpr.d.ts.map +1 -0
  13. package/dist/cli/newpr.js +888 -0
  14. package/dist/cli/newpr.js.map +1 -0
  15. package/dist/cli/wtlink.d.ts +15 -0
  16. package/dist/cli/wtlink.d.ts.map +1 -0
  17. package/dist/cli/wtlink.js +124 -0
  18. package/dist/cli/wtlink.js.map +1 -0
  19. package/dist/e2e/cli.e2e.test.d.ts +2 -0
  20. package/dist/e2e/cli.e2e.test.d.ts.map +1 -0
  21. package/dist/e2e/cli.e2e.test.js +215 -0
  22. package/dist/e2e/cli.e2e.test.js.map +1 -0
  23. package/dist/index.d.ts +20 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +17 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/integration/git.integration.test.d.ts +2 -0
  28. package/dist/integration/git.integration.test.d.ts.map +1 -0
  29. package/dist/integration/git.integration.test.js +333 -0
  30. package/dist/integration/git.integration.test.js.map +1 -0
  31. package/dist/lib/colors.d.ts +59 -0
  32. package/dist/lib/colors.d.ts.map +1 -0
  33. package/dist/lib/colors.js +145 -0
  34. package/dist/lib/colors.js.map +1 -0
  35. package/dist/lib/colors.test.d.ts +2 -0
  36. package/dist/lib/colors.test.d.ts.map +1 -0
  37. package/dist/lib/colors.test.js +69 -0
  38. package/dist/lib/colors.test.js.map +1 -0
  39. package/dist/lib/config.d.ts +58 -0
  40. package/dist/lib/config.d.ts.map +1 -0
  41. package/dist/lib/config.js +91 -0
  42. package/dist/lib/config.js.map +1 -0
  43. package/dist/lib/config.test.d.ts +2 -0
  44. package/dist/lib/config.test.d.ts.map +1 -0
  45. package/dist/lib/config.test.js +84 -0
  46. package/dist/lib/config.test.js.map +1 -0
  47. package/dist/lib/constants.d.ts +37 -0
  48. package/dist/lib/constants.d.ts.map +1 -0
  49. package/dist/lib/constants.js +37 -0
  50. package/dist/lib/constants.js.map +1 -0
  51. package/dist/lib/errors.d.ts +88 -0
  52. package/dist/lib/errors.d.ts.map +1 -0
  53. package/dist/lib/errors.js +112 -0
  54. package/dist/lib/errors.js.map +1 -0
  55. package/dist/lib/errors.test.d.ts +2 -0
  56. package/dist/lib/errors.test.d.ts.map +1 -0
  57. package/dist/lib/errors.test.js +117 -0
  58. package/dist/lib/errors.test.js.map +1 -0
  59. package/dist/lib/git.d.ts +224 -0
  60. package/dist/lib/git.d.ts.map +1 -0
  61. package/dist/lib/git.js +524 -0
  62. package/dist/lib/git.js.map +1 -0
  63. package/dist/lib/git.test.d.ts +2 -0
  64. package/dist/lib/git.test.d.ts.map +1 -0
  65. package/dist/lib/git.test.js +402 -0
  66. package/dist/lib/git.test.js.map +1 -0
  67. package/dist/lib/github.d.ts +82 -0
  68. package/dist/lib/github.d.ts.map +1 -0
  69. package/dist/lib/github.js +254 -0
  70. package/dist/lib/github.js.map +1 -0
  71. package/dist/lib/github.test.d.ts +2 -0
  72. package/dist/lib/github.test.d.ts.map +1 -0
  73. package/dist/lib/github.test.js +258 -0
  74. package/dist/lib/github.test.js.map +1 -0
  75. package/dist/lib/prompts.d.ts +39 -0
  76. package/dist/lib/prompts.d.ts.map +1 -0
  77. package/dist/lib/prompts.js +213 -0
  78. package/dist/lib/prompts.js.map +1 -0
  79. package/dist/lib/prompts.test.d.ts +2 -0
  80. package/dist/lib/prompts.test.d.ts.map +1 -0
  81. package/dist/lib/prompts.test.js +250 -0
  82. package/dist/lib/prompts.test.js.map +1 -0
  83. package/dist/lib/state-detection.d.ts +65 -0
  84. package/dist/lib/state-detection.d.ts.map +1 -0
  85. package/dist/lib/state-detection.js +186 -0
  86. package/dist/lib/state-detection.js.map +1 -0
  87. package/dist/lib/state-detection.test.d.ts +2 -0
  88. package/dist/lib/state-detection.test.d.ts.map +1 -0
  89. package/dist/lib/state-detection.test.js +164 -0
  90. package/dist/lib/state-detection.test.js.map +1 -0
  91. package/dist/lib/wtlink/index.d.ts +5 -0
  92. package/dist/lib/wtlink/index.d.ts.map +1 -0
  93. package/dist/lib/wtlink/index.js +7 -0
  94. package/dist/lib/wtlink/index.js.map +1 -0
  95. package/dist/lib/wtlink/link-configs.d.ts +10 -0
  96. package/dist/lib/wtlink/link-configs.d.ts.map +1 -0
  97. package/dist/lib/wtlink/link-configs.js +411 -0
  98. package/dist/lib/wtlink/link-configs.js.map +1 -0
  99. package/dist/lib/wtlink/link-configs.test.d.ts +2 -0
  100. package/dist/lib/wtlink/link-configs.test.d.ts.map +1 -0
  101. package/dist/lib/wtlink/link-configs.test.js +179 -0
  102. package/dist/lib/wtlink/link-configs.test.js.map +1 -0
  103. package/dist/lib/wtlink/main-menu.d.ts +2 -0
  104. package/dist/lib/wtlink/main-menu.d.ts.map +1 -0
  105. package/dist/lib/wtlink/main-menu.js +149 -0
  106. package/dist/lib/wtlink/main-menu.js.map +1 -0
  107. package/dist/lib/wtlink/manage-manifest.d.ts +9 -0
  108. package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -0
  109. package/dist/lib/wtlink/manage-manifest.js +1262 -0
  110. package/dist/lib/wtlink/manage-manifest.js.map +1 -0
  111. package/dist/lib/wtlink/validate-manifest.d.ts +6 -0
  112. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -0
  113. package/dist/lib/wtlink/validate-manifest.js +51 -0
  114. package/dist/lib/wtlink/validate-manifest.js.map +1 -0
  115. package/dist/lib/wtlink/validate-manifest.test.d.ts +2 -0
  116. package/dist/lib/wtlink/validate-manifest.test.d.ts.map +1 -0
  117. package/dist/lib/wtlink/validate-manifest.test.js +115 -0
  118. package/dist/lib/wtlink/validate-manifest.test.js.map +1 -0
  119. package/package.json +84 -0
@@ -0,0 +1,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prompts.test.d.ts.map
@@ -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"}