@camaradesuk/git-worktree-tools 1.0.4 → 1.1.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 (168) hide show
  1. package/README.md +4 -0
  2. package/dist/cli/cleanpr.d.ts +1 -6
  3. package/dist/cli/cleanpr.d.ts.map +1 -1
  4. package/dist/cli/cleanpr.js +110 -302
  5. package/dist/cli/cleanpr.js.map +1 -1
  6. package/dist/cli/cleanpr.test.d.ts +2 -0
  7. package/dist/cli/cleanpr.test.d.ts.map +1 -0
  8. package/dist/cli/cleanpr.test.js +225 -0
  9. package/dist/cli/cleanpr.test.js.map +1 -0
  10. package/dist/cli/lswt.d.ts +1 -4
  11. package/dist/cli/lswt.d.ts.map +1 -1
  12. package/dist/cli/lswt.js +32 -251
  13. package/dist/cli/lswt.js.map +1 -1
  14. package/dist/cli/lswt.test.d.ts +2 -0
  15. package/dist/cli/lswt.test.d.ts.map +1 -0
  16. package/dist/cli/lswt.test.js +165 -0
  17. package/dist/cli/lswt.test.js.map +1 -0
  18. package/dist/cli/newpr.d.ts +1 -4
  19. package/dist/cli/newpr.d.ts.map +1 -1
  20. package/dist/cli/newpr.js +98 -493
  21. package/dist/cli/newpr.js.map +1 -1
  22. package/dist/cli/newpr.test.d.ts +2 -0
  23. package/dist/cli/newpr.test.d.ts.map +1 -0
  24. package/dist/cli/newpr.test.js +329 -0
  25. package/dist/cli/newpr.test.js.map +1 -0
  26. package/dist/cli/wtlink.test.d.ts +2 -0
  27. package/dist/cli/wtlink.test.d.ts.map +1 -0
  28. package/dist/cli/wtlink.test.js +148 -0
  29. package/dist/cli/wtlink.test.js.map +1 -0
  30. package/dist/e2e/cli.e2e.test.js +44 -1
  31. package/dist/e2e/cli.e2e.test.js.map +1 -1
  32. package/dist/integration/git.integration.test.js.map +1 -1
  33. package/dist/lib/cleanpr/args.d.ts +14 -0
  34. package/dist/lib/cleanpr/args.d.ts.map +1 -0
  35. package/dist/lib/cleanpr/args.js +82 -0
  36. package/dist/lib/cleanpr/args.js.map +1 -0
  37. package/dist/lib/cleanpr/args.test.d.ts +2 -0
  38. package/dist/lib/cleanpr/args.test.d.ts.map +1 -0
  39. package/dist/lib/cleanpr/args.test.js +192 -0
  40. package/dist/lib/cleanpr/args.test.js.map +1 -0
  41. package/dist/lib/cleanpr/cleanup.d.ts +61 -0
  42. package/dist/lib/cleanpr/cleanup.d.ts.map +1 -0
  43. package/dist/lib/cleanpr/cleanup.js +97 -0
  44. package/dist/lib/cleanpr/cleanup.js.map +1 -0
  45. package/dist/lib/cleanpr/cleanup.test.d.ts +2 -0
  46. package/dist/lib/cleanpr/cleanup.test.d.ts.map +1 -0
  47. package/dist/lib/cleanpr/cleanup.test.js +264 -0
  48. package/dist/lib/cleanpr/cleanup.test.js.map +1 -0
  49. package/dist/lib/cleanpr/index.d.ts +10 -0
  50. package/dist/lib/cleanpr/index.d.ts.map +1 -0
  51. package/dist/lib/cleanpr/index.js +8 -0
  52. package/dist/lib/cleanpr/index.js.map +1 -0
  53. package/dist/lib/cleanpr/types.d.ts +49 -0
  54. package/dist/lib/cleanpr/types.d.ts.map +1 -0
  55. package/dist/lib/cleanpr/types.js +5 -0
  56. package/dist/lib/cleanpr/types.js.map +1 -0
  57. package/dist/lib/cleanpr/worktree-info.d.ts +27 -0
  58. package/dist/lib/cleanpr/worktree-info.d.ts.map +1 -0
  59. package/dist/lib/cleanpr/worktree-info.js +95 -0
  60. package/dist/lib/cleanpr/worktree-info.js.map +1 -0
  61. package/dist/lib/cleanpr/worktree-info.test.d.ts +2 -0
  62. package/dist/lib/cleanpr/worktree-info.test.d.ts.map +1 -0
  63. package/dist/lib/cleanpr/worktree-info.test.js +160 -0
  64. package/dist/lib/cleanpr/worktree-info.test.js.map +1 -0
  65. package/dist/lib/colors.test.js +73 -0
  66. package/dist/lib/colors.test.js.map +1 -1
  67. package/dist/lib/config.test.js +79 -2
  68. package/dist/lib/config.test.js.map +1 -1
  69. package/dist/lib/git.d.ts.map +1 -1
  70. package/dist/lib/git.js +4 -3
  71. package/dist/lib/git.js.map +1 -1
  72. package/dist/lib/git.test.js +7 -7
  73. package/dist/lib/git.test.js.map +1 -1
  74. package/dist/lib/github.d.ts.map +1 -1
  75. package/dist/lib/github.js +4 -3
  76. package/dist/lib/github.js.map +1 -1
  77. package/dist/lib/github.test.js +2 -2
  78. package/dist/lib/github.test.js.map +1 -1
  79. package/dist/lib/lswt/args.d.ts +14 -0
  80. package/dist/lib/lswt/args.d.ts.map +1 -0
  81. package/dist/lib/lswt/args.js +67 -0
  82. package/dist/lib/lswt/args.js.map +1 -0
  83. package/dist/lib/lswt/args.test.d.ts +2 -0
  84. package/dist/lib/lswt/args.test.d.ts.map +1 -0
  85. package/dist/lib/lswt/args.test.js +135 -0
  86. package/dist/lib/lswt/args.test.js.map +1 -0
  87. package/dist/lib/lswt/formatters.d.ts +29 -0
  88. package/dist/lib/lswt/formatters.d.ts.map +1 -0
  89. package/dist/lib/lswt/formatters.js +113 -0
  90. package/dist/lib/lswt/formatters.js.map +1 -0
  91. package/dist/lib/lswt/formatters.test.d.ts +2 -0
  92. package/dist/lib/lswt/formatters.test.d.ts.map +1 -0
  93. package/dist/lib/lswt/formatters.test.js +233 -0
  94. package/dist/lib/lswt/formatters.test.js.map +1 -0
  95. package/dist/lib/lswt/index.d.ts +9 -0
  96. package/dist/lib/lswt/index.d.ts.map +1 -0
  97. package/dist/lib/lswt/index.js +9 -0
  98. package/dist/lib/lswt/index.js.map +1 -0
  99. package/dist/lib/lswt/types.d.ts +44 -0
  100. package/dist/lib/lswt/types.d.ts.map +1 -0
  101. package/dist/lib/lswt/types.js +5 -0
  102. package/dist/lib/lswt/types.js.map +1 -0
  103. package/dist/lib/lswt/worktree-info.d.ts +23 -0
  104. package/dist/lib/lswt/worktree-info.d.ts.map +1 -0
  105. package/dist/lib/lswt/worktree-info.js +81 -0
  106. package/dist/lib/lswt/worktree-info.js.map +1 -0
  107. package/dist/lib/lswt/worktree-info.test.d.ts +2 -0
  108. package/dist/lib/lswt/worktree-info.test.d.ts.map +1 -0
  109. package/dist/lib/lswt/worktree-info.test.js +190 -0
  110. package/dist/lib/lswt/worktree-info.test.js.map +1 -0
  111. package/dist/lib/newpr/actions.d.ts +56 -0
  112. package/dist/lib/newpr/actions.d.ts.map +1 -0
  113. package/dist/lib/newpr/actions.js +130 -0
  114. package/dist/lib/newpr/actions.js.map +1 -0
  115. package/dist/lib/newpr/actions.test.d.ts +2 -0
  116. package/dist/lib/newpr/actions.test.d.ts.map +1 -0
  117. package/dist/lib/newpr/actions.test.js +254 -0
  118. package/dist/lib/newpr/actions.test.js.map +1 -0
  119. package/dist/lib/newpr/args.d.ts +17 -0
  120. package/dist/lib/newpr/args.d.ts.map +1 -0
  121. package/dist/lib/newpr/args.js +123 -0
  122. package/dist/lib/newpr/args.js.map +1 -0
  123. package/dist/lib/newpr/args.test.d.ts +2 -0
  124. package/dist/lib/newpr/args.test.d.ts.map +1 -0
  125. package/dist/lib/newpr/args.test.js +271 -0
  126. package/dist/lib/newpr/args.test.js.map +1 -0
  127. package/dist/lib/newpr/index.d.ts +10 -0
  128. package/dist/lib/newpr/index.d.ts.map +1 -0
  129. package/dist/lib/newpr/index.js +8 -0
  130. package/dist/lib/newpr/index.js.map +1 -0
  131. package/dist/lib/newpr/scenario-handler.d.ts +40 -0
  132. package/dist/lib/newpr/scenario-handler.d.ts.map +1 -0
  133. package/dist/lib/newpr/scenario-handler.js +261 -0
  134. package/dist/lib/newpr/scenario-handler.js.map +1 -0
  135. package/dist/lib/newpr/scenario-handler.test.d.ts +2 -0
  136. package/dist/lib/newpr/scenario-handler.test.d.ts.map +1 -0
  137. package/dist/lib/newpr/scenario-handler.test.js +250 -0
  138. package/dist/lib/newpr/scenario-handler.test.js.map +1 -0
  139. package/dist/lib/newpr/types.d.ts +76 -0
  140. package/dist/lib/newpr/types.d.ts.map +1 -0
  141. package/dist/lib/newpr/types.js +5 -0
  142. package/dist/lib/newpr/types.js.map +1 -0
  143. package/dist/lib/state-detection.d.ts.map +1 -1
  144. package/dist/lib/state-detection.js +12 -3
  145. package/dist/lib/state-detection.js.map +1 -1
  146. package/dist/lib/state-detection.test.js +253 -2
  147. package/dist/lib/state-detection.test.js.map +1 -1
  148. package/dist/lib/wtlink/link-configs.d.ts +40 -0
  149. package/dist/lib/wtlink/link-configs.d.ts.map +1 -1
  150. package/dist/lib/wtlink/link-configs.js +126 -11
  151. package/dist/lib/wtlink/link-configs.js.map +1 -1
  152. package/dist/lib/wtlink/link-configs.test.js +237 -84
  153. package/dist/lib/wtlink/link-configs.test.js.map +1 -1
  154. package/dist/lib/wtlink/manage-manifest.d.ts +86 -0
  155. package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -1
  156. package/dist/lib/wtlink/manage-manifest.js +18 -15
  157. package/dist/lib/wtlink/manage-manifest.js.map +1 -1
  158. package/dist/lib/wtlink/manage-manifest.test.d.ts +2 -0
  159. package/dist/lib/wtlink/manage-manifest.test.d.ts.map +1 -0
  160. package/dist/lib/wtlink/manage-manifest.test.js +383 -0
  161. package/dist/lib/wtlink/manage-manifest.test.js.map +1 -0
  162. package/dist/lib/wtlink/validate-manifest.d.ts +27 -0
  163. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -1
  164. package/dist/lib/wtlink/validate-manifest.js +103 -28
  165. package/dist/lib/wtlink/validate-manifest.js.map +1 -1
  166. package/dist/lib/wtlink/validate-manifest.test.js +170 -65
  167. package/dist/lib/wtlink/validate-manifest.test.js.map +1 -1
  168. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/newpr/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=args.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.test.d.ts","sourceRoot":"","sources":["../../../src/lib/newpr/args.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,271 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseArgs, getHelpText, getDefaultOptions } from './args.js';
3
+ describe('newpr/args', () => {
4
+ describe('getDefaultOptions', () => {
5
+ it('returns default options', () => {
6
+ const defaults = getDefaultOptions();
7
+ expect(defaults.mode).toBe('new');
8
+ expect(defaults.baseBranch).toBe('main');
9
+ expect(defaults.draft).toBe(true);
10
+ expect(defaults.installDeps).toBe(false);
11
+ expect(defaults.openEditor).toBe(false);
12
+ expect(defaults.runWtlink).toBe(true);
13
+ });
14
+ });
15
+ describe('parseArgs', () => {
16
+ describe('help flag', () => {
17
+ it('returns help for -h', () => {
18
+ const result = parseArgs(['-h']);
19
+ expect(result.kind).toBe('help');
20
+ });
21
+ it('returns help for --help', () => {
22
+ const result = parseArgs(['--help']);
23
+ expect(result.kind).toBe('help');
24
+ });
25
+ });
26
+ describe('new mode (default)', () => {
27
+ it('parses description as positional argument', () => {
28
+ const result = parseArgs(['Add new feature']);
29
+ expect(result.kind).toBe('success');
30
+ if (result.kind === 'success') {
31
+ expect(result.options.mode).toBe('new');
32
+ expect(result.options.description).toBe('Add new feature');
33
+ }
34
+ });
35
+ it('returns error when no description provided', () => {
36
+ const result = parseArgs([]);
37
+ expect(result.kind).toBe('error');
38
+ if (result.kind === 'error') {
39
+ expect(result.message).toContain('Description required');
40
+ }
41
+ });
42
+ it('returns error for unexpected positional argument', () => {
43
+ const result = parseArgs(['first desc', 'second desc']);
44
+ expect(result.kind).toBe('error');
45
+ if (result.kind === 'error') {
46
+ expect(result.message).toContain('Unexpected argument');
47
+ }
48
+ });
49
+ });
50
+ describe('pr mode', () => {
51
+ it('parses --pr with number', () => {
52
+ const result = parseArgs(['--pr', '123']);
53
+ expect(result.kind).toBe('success');
54
+ if (result.kind === 'success') {
55
+ expect(result.options.mode).toBe('pr');
56
+ expect(result.options.prNumber).toBe(123);
57
+ }
58
+ });
59
+ it('parses -p with number', () => {
60
+ const result = parseArgs(['-p', '456']);
61
+ expect(result.kind).toBe('success');
62
+ if (result.kind === 'success') {
63
+ expect(result.options.mode).toBe('pr');
64
+ expect(result.options.prNumber).toBe(456);
65
+ }
66
+ });
67
+ it('returns error when --pr has no value', () => {
68
+ const result = parseArgs(['--pr']);
69
+ expect(result.kind).toBe('error');
70
+ if (result.kind === 'error') {
71
+ expect(result.message).toContain('--pr requires a PR number');
72
+ }
73
+ });
74
+ it('returns error when --pr value starts with dash', () => {
75
+ const result = parseArgs(['--pr', '-h']);
76
+ expect(result.kind).toBe('error');
77
+ if (result.kind === 'error') {
78
+ expect(result.message).toContain('--pr requires a PR number');
79
+ }
80
+ });
81
+ it('returns error when PR number is not numeric', () => {
82
+ const result = parseArgs(['--pr', 'abc']);
83
+ expect(result.kind).toBe('error');
84
+ if (result.kind === 'error') {
85
+ expect(result.message).toContain('PR number must be numeric');
86
+ }
87
+ });
88
+ });
89
+ describe('branch mode', () => {
90
+ it('parses --branch with name', () => {
91
+ const result = parseArgs(['--branch', 'feat/my-feature']);
92
+ expect(result.kind).toBe('success');
93
+ if (result.kind === 'success') {
94
+ expect(result.options.mode).toBe('branch');
95
+ expect(result.options.branchName).toBe('feat/my-feature');
96
+ }
97
+ });
98
+ it('parses -B with name', () => {
99
+ const result = parseArgs(['-B', 'fix/bug']);
100
+ expect(result.kind).toBe('success');
101
+ if (result.kind === 'success') {
102
+ expect(result.options.mode).toBe('branch');
103
+ expect(result.options.branchName).toBe('fix/bug');
104
+ }
105
+ });
106
+ it('returns error when --branch has no value', () => {
107
+ const result = parseArgs(['--branch']);
108
+ expect(result.kind).toBe('error');
109
+ if (result.kind === 'error') {
110
+ expect(result.message).toContain('--branch requires a branch name');
111
+ }
112
+ });
113
+ it('returns error when --branch value starts with dash', () => {
114
+ const result = parseArgs(['--branch', '-h']);
115
+ expect(result.kind).toBe('error');
116
+ if (result.kind === 'error') {
117
+ expect(result.message).toContain('--branch requires a branch name');
118
+ }
119
+ });
120
+ });
121
+ describe('base branch option', () => {
122
+ it('parses --base with branch name', () => {
123
+ const result = parseArgs(['--base', 'develop', 'My feature']);
124
+ expect(result.kind).toBe('success');
125
+ if (result.kind === 'success') {
126
+ expect(result.options.baseBranch).toBe('develop');
127
+ }
128
+ });
129
+ it('parses -b with branch name', () => {
130
+ const result = parseArgs(['-b', 'release', 'My feature']);
131
+ expect(result.kind).toBe('success');
132
+ if (result.kind === 'success') {
133
+ expect(result.options.baseBranch).toBe('release');
134
+ }
135
+ });
136
+ it('returns error when --base has no value', () => {
137
+ const result = parseArgs(['--base']);
138
+ expect(result.kind).toBe('error');
139
+ if (result.kind === 'error') {
140
+ expect(result.message).toContain('--base requires a branch name');
141
+ }
142
+ });
143
+ it('returns error when --base value starts with dash', () => {
144
+ const result = parseArgs(['--base', '-h']);
145
+ expect(result.kind).toBe('error');
146
+ if (result.kind === 'error') {
147
+ expect(result.message).toContain('--base requires a branch name');
148
+ }
149
+ });
150
+ });
151
+ describe('boolean flags', () => {
152
+ it('parses --install', () => {
153
+ const result = parseArgs(['--install', 'My feature']);
154
+ expect(result.kind).toBe('success');
155
+ if (result.kind === 'success') {
156
+ expect(result.options.installDeps).toBe(true);
157
+ }
158
+ });
159
+ it('parses -i', () => {
160
+ const result = parseArgs(['-i', 'My feature']);
161
+ expect(result.kind).toBe('success');
162
+ if (result.kind === 'success') {
163
+ expect(result.options.installDeps).toBe(true);
164
+ }
165
+ });
166
+ it('parses --code', () => {
167
+ const result = parseArgs(['--code', 'My feature']);
168
+ expect(result.kind).toBe('success');
169
+ if (result.kind === 'success') {
170
+ expect(result.options.openEditor).toBe(true);
171
+ }
172
+ });
173
+ it('parses -c', () => {
174
+ const result = parseArgs(['-c', 'My feature']);
175
+ expect(result.kind).toBe('success');
176
+ if (result.kind === 'success') {
177
+ expect(result.options.openEditor).toBe(true);
178
+ }
179
+ });
180
+ it('parses --ready', () => {
181
+ const result = parseArgs(['--ready', 'My feature']);
182
+ expect(result.kind).toBe('success');
183
+ if (result.kind === 'success') {
184
+ expect(result.options.draft).toBe(false);
185
+ }
186
+ });
187
+ it('parses -r', () => {
188
+ const result = parseArgs(['-r', 'My feature']);
189
+ expect(result.kind).toBe('success');
190
+ if (result.kind === 'success') {
191
+ expect(result.options.draft).toBe(false);
192
+ }
193
+ });
194
+ it('parses --no-wtlink', () => {
195
+ const result = parseArgs(['--no-wtlink', 'My feature']);
196
+ expect(result.kind).toBe('success');
197
+ if (result.kind === 'success') {
198
+ expect(result.options.runWtlink).toBe(false);
199
+ }
200
+ });
201
+ });
202
+ describe('unknown options', () => {
203
+ it('returns error for unknown option', () => {
204
+ const result = parseArgs(['--unknown', 'My feature']);
205
+ expect(result.kind).toBe('error');
206
+ if (result.kind === 'error') {
207
+ expect(result.message).toContain('Unknown option: --unknown');
208
+ }
209
+ });
210
+ it('returns error for unknown short option', () => {
211
+ const result = parseArgs(['-x', 'My feature']);
212
+ expect(result.kind).toBe('error');
213
+ if (result.kind === 'error') {
214
+ expect(result.message).toContain('Unknown option: -x');
215
+ }
216
+ });
217
+ });
218
+ describe('complex argument combinations', () => {
219
+ it('parses multiple flags with description', () => {
220
+ const result = parseArgs(['--install', '--code', '--ready', 'Add auth feature']);
221
+ expect(result.kind).toBe('success');
222
+ if (result.kind === 'success') {
223
+ expect(result.options.mode).toBe('new');
224
+ expect(result.options.description).toBe('Add auth feature');
225
+ expect(result.options.installDeps).toBe(true);
226
+ expect(result.options.openEditor).toBe(true);
227
+ expect(result.options.draft).toBe(false);
228
+ }
229
+ });
230
+ it('parses base branch with flags', () => {
231
+ const result = parseArgs(['-b', 'develop', '-i', 'My feature']);
232
+ expect(result.kind).toBe('success');
233
+ if (result.kind === 'success') {
234
+ expect(result.options.baseBranch).toBe('develop');
235
+ expect(result.options.installDeps).toBe(true);
236
+ expect(result.options.description).toBe('My feature');
237
+ }
238
+ });
239
+ it('parses pr mode with base branch', () => {
240
+ const result = parseArgs(['--pr', '123', '--base', 'develop']);
241
+ expect(result.kind).toBe('success');
242
+ if (result.kind === 'success') {
243
+ expect(result.options.mode).toBe('pr');
244
+ expect(result.options.prNumber).toBe(123);
245
+ expect(result.options.baseBranch).toBe('develop');
246
+ }
247
+ });
248
+ });
249
+ });
250
+ describe('getHelpText', () => {
251
+ it('returns help text string', () => {
252
+ const help = getHelpText();
253
+ expect(help).toContain('newpr');
254
+ expect(help).toContain('Usage:');
255
+ expect(help).toContain('Options:');
256
+ expect(help).toContain('Examples:');
257
+ });
258
+ it('includes all option descriptions', () => {
259
+ const help = getHelpText();
260
+ expect(help).toContain('--pr');
261
+ expect(help).toContain('--branch');
262
+ expect(help).toContain('--base');
263
+ expect(help).toContain('--install');
264
+ expect(help).toContain('--code');
265
+ expect(help).toContain('--ready');
266
+ expect(help).toContain('--no-wtlink');
267
+ expect(help).toContain('--help');
268
+ });
269
+ });
270
+ });
271
+ //# sourceMappingURL=args.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.test.js","sourceRoot":"","sources":["../../../src/lib/newpr/args.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * newpr library - public API exports
3
+ */
4
+ export type { Mode, Options, BranchFrom, ActionType, StateAction, ParseResult, ActionResult, ScenarioChoice, ScenarioResult, } from './types.js';
5
+ export { parseArgs, getHelpText, getDefaultOptions } from './args.js';
6
+ export type { ScenarioContext } from './scenario-handler.js';
7
+ export { getScenarioContext, isPrWorktreeScenario, isExistingBranchAction, shouldBranchFromHead, getScenarioMessageLevel, } from './scenario-handler.js';
8
+ export type { ActionDeps } from './actions.js';
9
+ export { executeStateAction, getBranchPoint, requiresStageAll, involvesStashing, needsPushToMain, commitsToCurrentBranch, getActionDescription, } from './actions.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/newpr/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,IAAI,EACJ,OAAO,EACP,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGtE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * newpr library - public API exports
3
+ */
4
+ // Argument parsing
5
+ export { parseArgs, getHelpText, getDefaultOptions } from './args.js';
6
+ export { getScenarioContext, isPrWorktreeScenario, isExistingBranchAction, shouldBranchFromHead, getScenarioMessageLevel, } from './scenario-handler.js';
7
+ export { executeStateAction, getBranchPoint, requiresStageAll, involvesStashing, needsPushToMain, commitsToCurrentBranch, getActionDescription, } from './actions.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/newpr/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAItE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * newpr scenario handler - pure functions for scenario decision logic
3
+ *
4
+ * Separates the "what choices to present" logic from the interactive prompts.
5
+ * CLI layer handles the actual prompting; this module provides the choices.
6
+ */
7
+ import type { StateAction, ScenarioChoice } from './types.js';
8
+ import type { GitState, Scenario } from '../state-detection.js';
9
+ /**
10
+ * Scenario context with message and available choices
11
+ */
12
+ export interface ScenarioContext {
13
+ message: string;
14
+ subMessage?: string;
15
+ choices: ScenarioChoice[];
16
+ }
17
+ /**
18
+ * Get scenario context with message and choices - pure function
19
+ * Returns null for scenarios that need special handling (pr_worktree delegates)
20
+ */
21
+ export declare function getScenarioContext(scenario: Scenario, state: GitState, _baseBranch: string): ScenarioContext | null;
22
+ /**
23
+ * Check if a scenario is the pr_worktree scenario that needs delegation
24
+ */
25
+ export declare function isPrWorktreeScenario(scenario: Scenario): boolean;
26
+ /**
27
+ * Check if an action is for creating PR for existing branch
28
+ * These actions need special handling in the workflow
29
+ */
30
+ export declare function isExistingBranchAction(action: StateAction): boolean;
31
+ /**
32
+ * Check if action should branch from HEAD instead of origin/main
33
+ */
34
+ export declare function shouldBranchFromHead(action: StateAction): boolean;
35
+ /**
36
+ * Get the display message for a scenario warning level
37
+ */
38
+ export type MessageLevel = 'info' | 'warning' | 'error';
39
+ export declare function getScenarioMessageLevel(scenario: Scenario): MessageLevel;
40
+ //# sourceMappingURL=scenario-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/newpr/scenario-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAiBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,MAAM,GAClB,eAAe,GAAG,IAAI,CA0NxB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAEhE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAMnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAExD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAYxE"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * newpr scenario handler - pure functions for scenario decision logic
3
+ *
4
+ * Separates the "what choices to present" logic from the interactive prompts.
5
+ * CLI layer handles the actual prompting; this module provides the choices.
6
+ */
7
+ /**
8
+ * Create a StateAction with defaults
9
+ */
10
+ function action(actionType, overrides = {}) {
11
+ return {
12
+ action: actionType,
13
+ branchFrom: 'origin_main',
14
+ stashUnstaged: false,
15
+ ...overrides,
16
+ };
17
+ }
18
+ /**
19
+ * Get scenario context with message and choices - pure function
20
+ * Returns null for scenarios that need special handling (pr_worktree delegates)
21
+ */
22
+ export function getScenarioContext(scenario, state, _baseBranch) {
23
+ switch (scenario) {
24
+ case 'main_clean_same':
25
+ return {
26
+ message: 'No changes detected from main branch.',
27
+ subMessage: "You are on 'main' with no local commits or uncommitted changes.\nA PR requires at least one commit difference from the base branch.",
28
+ choices: [
29
+ { label: 'Continue with empty initial commit', action: action('empty_commit') },
30
+ { label: "Cancel - I'll make some changes first", action: null },
31
+ ],
32
+ };
33
+ case 'main_staged_same':
34
+ return {
35
+ message: 'You have staged changes ready to commit.',
36
+ choices: [
37
+ { label: 'Commit staged changes to the new PR branch', action: action('commit_staged') },
38
+ {
39
+ label: 'Leave changes here and continue with empty initial commit',
40
+ action: action('empty_commit'),
41
+ },
42
+ { label: 'Cancel', action: null },
43
+ ],
44
+ };
45
+ case 'main_unstaged_same':
46
+ return {
47
+ message: 'You have unstaged changes.',
48
+ choices: [
49
+ { label: 'Stage all and commit to the new PR branch', action: action('commit_all') },
50
+ {
51
+ label: 'Leave changes here and continue with empty initial commit',
52
+ action: action('empty_commit'),
53
+ },
54
+ { label: 'Stash changes (will restore after)', action: action('stash_and_empty') },
55
+ { label: 'Cancel', action: null },
56
+ ],
57
+ };
58
+ case 'main_both_same':
59
+ return {
60
+ message: 'You have both staged and unstaged changes.',
61
+ choices: [
62
+ {
63
+ label: 'Commit staged to PR branch, move unstaged to new worktree',
64
+ action: action('commit_staged', { stashUnstaged: true }),
65
+ },
66
+ {
67
+ label: 'Stage all and commit everything to the new PR branch',
68
+ action: action('commit_all'),
69
+ },
70
+ {
71
+ label: 'Leave all changes here and continue with empty initial commit',
72
+ action: action('empty_commit'),
73
+ },
74
+ { label: 'Stash all changes (will restore after)', action: action('stash_and_empty') },
75
+ { label: 'Cancel', action: null },
76
+ ],
77
+ };
78
+ case 'main_clean_ahead':
79
+ return {
80
+ message: "You have local commits on 'main' not yet pushed.",
81
+ subMessage: 'These commits will NOT be included in the new PR branch by default.',
82
+ choices: [
83
+ {
84
+ label: 'Use these commits for the PR (create branch from HEAD)',
85
+ action: action('use_commits', { branchFrom: 'head' }),
86
+ },
87
+ {
88
+ label: 'Push commits to origin/main first, then create PR branch',
89
+ action: action('push_then_branch'),
90
+ },
91
+ {
92
+ label: 'Start fresh from origin/main (ignore local commits)',
93
+ action: action('empty_commit'),
94
+ },
95
+ { label: 'Cancel', action: null },
96
+ ],
97
+ };
98
+ case 'main_changes_ahead':
99
+ return {
100
+ message: 'You have local commits AND uncommitted changes.',
101
+ choices: [
102
+ {
103
+ label: 'Include commits + commit uncommitted changes to PR branch',
104
+ action: action('use_commits_and_commit_all', { branchFrom: 'head' }),
105
+ },
106
+ {
107
+ label: 'Include commits only, stash uncommitted changes',
108
+ action: action('use_commits_and_stash', { branchFrom: 'head' }),
109
+ },
110
+ {
111
+ label: 'Start fresh from origin/main (ignore all local work)',
112
+ action: action('empty_commit'),
113
+ },
114
+ { label: 'Cancel', action: null },
115
+ ],
116
+ };
117
+ case 'branch_same_as_main': {
118
+ const branch = state.currentBranch || 'unknown';
119
+ return {
120
+ message: `Branch '${branch}' is at the same commit as main.`,
121
+ subMessage: 'No divergent commits detected. A PR requires at least one commit difference.',
122
+ choices: [
123
+ {
124
+ label: 'Continue with empty initial commit (new branch from main)',
125
+ action: action('empty_commit'),
126
+ },
127
+ { label: 'Cancel', action: null },
128
+ ],
129
+ };
130
+ }
131
+ case 'branch_ancestor': {
132
+ const branch = state.currentBranch || 'unknown';
133
+ return {
134
+ message: `Branch '${branch}' appears to be already merged into main.`,
135
+ subMessage: 'Creating a PR would result in no changes.',
136
+ choices: [
137
+ {
138
+ label: 'Continue with empty initial commit (new branch from main)',
139
+ action: action('empty_commit'),
140
+ },
141
+ { label: "Cancel - I'll check the branch status first", action: null },
142
+ ],
143
+ };
144
+ }
145
+ case 'branch_divergent': {
146
+ const branch = state.currentBranch || 'unknown';
147
+ return {
148
+ message: `You are on branch '${branch}' with commits not in main.`,
149
+ choices: [
150
+ {
151
+ label: `Create PR for THIS branch (${branch} → main)`,
152
+ action: action('create_pr_for_branch', { branchFrom: 'head' }),
153
+ },
154
+ {
155
+ label: "Create NEW branch from main (ignore current branch's commits)",
156
+ action: action('empty_commit'),
157
+ },
158
+ { label: 'Cancel', action: null },
159
+ ],
160
+ };
161
+ }
162
+ case 'branch_with_changes': {
163
+ const branch = state.currentBranch || 'unknown';
164
+ const hasDivergent = state.localCommits.length > 0;
165
+ if (hasDivergent) {
166
+ return {
167
+ message: `You are on branch '${branch}' with uncommitted changes.`,
168
+ subMessage: 'Branch also has commits not in main.',
169
+ choices: [
170
+ {
171
+ label: 'Create PR for THIS branch, commit changes first',
172
+ action: action('pr_for_branch_commit_all', { branchFrom: 'head' }),
173
+ },
174
+ {
175
+ label: 'Create PR for THIS branch, stash uncommitted changes',
176
+ action: action('pr_for_branch_stash', { branchFrom: 'head' }),
177
+ },
178
+ {
179
+ label: 'Create NEW branch from main (ignore current branch)',
180
+ action: action('empty_commit'),
181
+ },
182
+ { label: 'Cancel', action: null },
183
+ ],
184
+ };
185
+ }
186
+ else {
187
+ return {
188
+ message: `You are on branch '${branch}' with uncommitted changes.`,
189
+ choices: [
190
+ { label: 'Stage all and commit to a new PR branch', action: action('commit_all') },
191
+ {
192
+ label: 'Leave changes and continue with empty initial commit',
193
+ action: action('empty_commit'),
194
+ },
195
+ { label: 'Stash changes (will restore after)', action: action('stash_and_empty') },
196
+ { label: 'Cancel', action: null },
197
+ ],
198
+ };
199
+ }
200
+ }
201
+ case 'detached_head':
202
+ return {
203
+ message: 'You are in detached HEAD state.',
204
+ choices: [
205
+ {
206
+ label: 'Create branch from this commit',
207
+ action: action('branch_from_detached', { branchFrom: 'head' }),
208
+ },
209
+ { label: 'Create branch from origin/main', action: action('empty_commit') },
210
+ { label: 'Cancel', action: null },
211
+ ],
212
+ };
213
+ case 'pr_worktree':
214
+ // This scenario requires special handling - delegate back to CLI
215
+ // The CLI should analyze actual state and call getScenarioContext again
216
+ return null;
217
+ default:
218
+ // Default case for any unhandled scenarios
219
+ return {
220
+ message: 'Ready to create PR.',
221
+ choices: [
222
+ { label: 'Continue with empty initial commit', action: action('empty_commit') },
223
+ { label: 'Cancel', action: null },
224
+ ],
225
+ };
226
+ }
227
+ }
228
+ /**
229
+ * Check if a scenario is the pr_worktree scenario that needs delegation
230
+ */
231
+ export function isPrWorktreeScenario(scenario) {
232
+ return scenario === 'pr_worktree';
233
+ }
234
+ /**
235
+ * Check if an action is for creating PR for existing branch
236
+ * These actions need special handling in the workflow
237
+ */
238
+ export function isExistingBranchAction(action) {
239
+ return (action.action === 'create_pr_for_branch' ||
240
+ action.action === 'pr_for_branch_commit_all' ||
241
+ action.action === 'pr_for_branch_stash');
242
+ }
243
+ /**
244
+ * Check if action should branch from HEAD instead of origin/main
245
+ */
246
+ export function shouldBranchFromHead(action) {
247
+ return action.branchFrom === 'head';
248
+ }
249
+ export function getScenarioMessageLevel(scenario) {
250
+ switch (scenario) {
251
+ case 'main_clean_same':
252
+ case 'branch_same_as_main':
253
+ case 'branch_ancestor':
254
+ case 'detached_head':
255
+ case 'pr_worktree':
256
+ return 'warning';
257
+ default:
258
+ return 'info';
259
+ }
260
+ }
261
+ //# sourceMappingURL=scenario-handler.js.map