git-smart-flow 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +21 -0
  3. package/README.md +130 -0
  4. package/bin/git-smart-flow.js +2 -0
  5. package/bin/gsf.js +2 -0
  6. package/bin/gsfc.js +3 -0
  7. package/bin/gsfm.js +3 -0
  8. package/bin/gsfp.js +3 -0
  9. package/bin/gsfpr.js +3 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +214 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/commands/aliases.d.ts +2 -0
  14. package/dist/commands/aliases.js +37 -0
  15. package/dist/commands/aliases.js.map +1 -0
  16. package/dist/commands/branch.d.ts +2 -0
  17. package/dist/commands/branch.js +414 -0
  18. package/dist/commands/branch.js.map +1 -0
  19. package/dist/commands/commit-message.d.ts +7 -0
  20. package/dist/commands/commit-message.js +95 -0
  21. package/dist/commands/commit-message.js.map +1 -0
  22. package/dist/commands/commit.d.ts +3 -0
  23. package/dist/commands/commit.js +597 -0
  24. package/dist/commands/commit.js.map +1 -0
  25. package/dist/commands/config.d.ts +2 -0
  26. package/dist/commands/config.js +88 -0
  27. package/dist/commands/config.js.map +1 -0
  28. package/dist/commands/doctor.d.ts +2 -0
  29. package/dist/commands/doctor.js +246 -0
  30. package/dist/commands/doctor.js.map +1 -0
  31. package/dist/commands/info.d.ts +2 -0
  32. package/dist/commands/info.js +155 -0
  33. package/dist/commands/info.js.map +1 -0
  34. package/dist/commands/install-hooks.d.ts +2 -0
  35. package/dist/commands/install-hooks.js +66 -0
  36. package/dist/commands/install-hooks.js.map +1 -0
  37. package/dist/commands/log.d.ts +2 -0
  38. package/dist/commands/log.js +101 -0
  39. package/dist/commands/log.js.map +1 -0
  40. package/dist/commands/menu.d.ts +2 -0
  41. package/dist/commands/menu.js +297 -0
  42. package/dist/commands/menu.js.map +1 -0
  43. package/dist/commands/merge.d.ts +6 -0
  44. package/dist/commands/merge.js +128 -0
  45. package/dist/commands/merge.js.map +1 -0
  46. package/dist/commands/pr.d.ts +2 -0
  47. package/dist/commands/pr.js +731 -0
  48. package/dist/commands/pr.js.map +1 -0
  49. package/dist/commands/push.d.ts +7 -0
  50. package/dist/commands/push.js +225 -0
  51. package/dist/commands/push.js.map +1 -0
  52. package/dist/commands/reflog.d.ts +2 -0
  53. package/dist/commands/reflog.js +162 -0
  54. package/dist/commands/reflog.js.map +1 -0
  55. package/dist/commands/repo-init.d.ts +2 -0
  56. package/dist/commands/repo-init.js +466 -0
  57. package/dist/commands/repo-init.js.map +1 -0
  58. package/dist/commands/revert.d.ts +7 -0
  59. package/dist/commands/revert.js +694 -0
  60. package/dist/commands/revert.js.map +1 -0
  61. package/dist/commands/setup.d.ts +2 -0
  62. package/dist/commands/setup.js +86 -0
  63. package/dist/commands/setup.js.map +1 -0
  64. package/dist/commands/stash.d.ts +2 -0
  65. package/dist/commands/stash.js +130 -0
  66. package/dist/commands/stash.js.map +1 -0
  67. package/dist/commands/sync.d.ts +2 -0
  68. package/dist/commands/sync.js +335 -0
  69. package/dist/commands/sync.js.map +1 -0
  70. package/dist/commands/tag.d.ts +2 -0
  71. package/dist/commands/tag.js +163 -0
  72. package/dist/commands/tag.js.map +1 -0
  73. package/dist/commands/validate.d.ts +2 -0
  74. package/dist/commands/validate.js +203 -0
  75. package/dist/commands/validate.js.map +1 -0
  76. package/dist/config/config.d.ts +10 -0
  77. package/dist/config/config.js +126 -0
  78. package/dist/config/config.js.map +1 -0
  79. package/dist/git/ai-context-builder.d.ts +11 -0
  80. package/dist/git/ai-context-builder.js +112 -0
  81. package/dist/git/ai-context-builder.js.map +1 -0
  82. package/dist/git/convention-detector.d.ts +3 -0
  83. package/dist/git/convention-detector.js +211 -0
  84. package/dist/git/convention-detector.js.map +1 -0
  85. package/dist/git/ensure-repo.d.ts +7 -0
  86. package/dist/git/ensure-repo.js +141 -0
  87. package/dist/git/ensure-repo.js.map +1 -0
  88. package/dist/git/gitignore.d.ts +8 -0
  89. package/dist/git/gitignore.js +261 -0
  90. package/dist/git/gitignore.js.map +1 -0
  91. package/dist/git/remote-setup.d.ts +2 -0
  92. package/dist/git/remote-setup.js +129 -0
  93. package/dist/git/remote-setup.js.map +1 -0
  94. package/dist/git/repo.d.ts +73 -0
  95. package/dist/git/repo.js +308 -0
  96. package/dist/git/repo.js.map +1 -0
  97. package/dist/git/validate.d.ts +36 -0
  98. package/dist/git/validate.js +113 -0
  99. package/dist/git/validate.js.map +1 -0
  100. package/dist/providers/base.provider.d.ts +10 -0
  101. package/dist/providers/base.provider.js +40 -0
  102. package/dist/providers/base.provider.js.map +1 -0
  103. package/dist/providers/claude.provider.d.ts +14 -0
  104. package/dist/providers/claude.provider.js +85 -0
  105. package/dist/providers/claude.provider.js.map +1 -0
  106. package/dist/providers/copilot.provider.d.ts +12 -0
  107. package/dist/providers/copilot.provider.js +88 -0
  108. package/dist/providers/copilot.provider.js.map +1 -0
  109. package/dist/providers/heuristic.provider.d.ts +9 -0
  110. package/dist/providers/heuristic.provider.js +163 -0
  111. package/dist/providers/heuristic.provider.js.map +1 -0
  112. package/dist/providers/ollama.provider.d.ts +14 -0
  113. package/dist/providers/ollama.provider.js +83 -0
  114. package/dist/providers/ollama.provider.js.map +1 -0
  115. package/dist/providers/openai.provider.d.ts +14 -0
  116. package/dist/providers/openai.provider.js +84 -0
  117. package/dist/providers/openai.provider.js.map +1 -0
  118. package/dist/providers/provider.factory.d.ts +5 -0
  119. package/dist/providers/provider.factory.js +51 -0
  120. package/dist/providers/provider.factory.js.map +1 -0
  121. package/dist/security/scanner.d.ts +13 -0
  122. package/dist/security/scanner.js +138 -0
  123. package/dist/security/scanner.js.map +1 -0
  124. package/dist/types/index.d.ts +146 -0
  125. package/dist/types/index.js +2 -0
  126. package/dist/types/index.js.map +1 -0
  127. package/dist/ux/components/BranchTree.d.ts +8 -0
  128. package/dist/ux/components/BranchTree.js +57 -0
  129. package/dist/ux/components/BranchTree.js.map +1 -0
  130. package/dist/ux/components/CommitProposal.d.ts +13 -0
  131. package/dist/ux/components/CommitProposal.js +127 -0
  132. package/dist/ux/components/CommitProposal.js.map +1 -0
  133. package/dist/ux/components/DiagnosticReport.d.ts +18 -0
  134. package/dist/ux/components/DiagnosticReport.js +19 -0
  135. package/dist/ux/components/DiagnosticReport.js.map +1 -0
  136. package/dist/ux/components/ErrorBox.d.ts +7 -0
  137. package/dist/ux/components/ErrorBox.js +9 -0
  138. package/dist/ux/components/ErrorBox.js.map +1 -0
  139. package/dist/ux/components/FileSelector.d.ts +14 -0
  140. package/dist/ux/components/FileSelector.js +87 -0
  141. package/dist/ux/components/FileSelector.js.map +1 -0
  142. package/dist/ux/components/Logo.d.ts +6 -0
  143. package/dist/ux/components/Logo.js +21 -0
  144. package/dist/ux/components/Logo.js.map +1 -0
  145. package/dist/ux/components/RepoContext.d.ts +8 -0
  146. package/dist/ux/components/RepoContext.js +17 -0
  147. package/dist/ux/components/RepoContext.js.map +1 -0
  148. package/dist/ux/components/SecurityAlert.d.ts +9 -0
  149. package/dist/ux/components/SecurityAlert.js +16 -0
  150. package/dist/ux/components/SecurityAlert.js.map +1 -0
  151. package/dist/ux/components/StatusDashboard.d.ts +14 -0
  152. package/dist/ux/components/StatusDashboard.js +36 -0
  153. package/dist/ux/components/StatusDashboard.js.map +1 -0
  154. package/dist/ux/components/SuccessBox.d.ts +7 -0
  155. package/dist/ux/components/SuccessBox.js +9 -0
  156. package/dist/ux/components/SuccessBox.js.map +1 -0
  157. package/dist/ux/components/ValidationReport.d.ts +16 -0
  158. package/dist/ux/components/ValidationReport.js +19 -0
  159. package/dist/ux/components/ValidationReport.js.map +1 -0
  160. package/dist/ux/components/WarningBox.d.ts +7 -0
  161. package/dist/ux/components/WarningBox.js +9 -0
  162. package/dist/ux/components/WarningBox.js.map +1 -0
  163. package/dist/ux/display.d.ts +21 -0
  164. package/dist/ux/display.js +96 -0
  165. package/dist/ux/display.js.map +1 -0
  166. package/dist/ux/hooks/useActivation.d.ts +8 -0
  167. package/dist/ux/hooks/useActivation.js +16 -0
  168. package/dist/ux/hooks/useActivation.js.map +1 -0
  169. package/dist/ux/hooks/useSpinner.d.ts +2 -0
  170. package/dist/ux/hooks/useSpinner.js +13 -0
  171. package/dist/ux/hooks/useSpinner.js.map +1 -0
  172. package/dist/ux/menu.d.ts +7 -0
  173. package/dist/ux/menu.js +56 -0
  174. package/dist/ux/menu.js.map +1 -0
  175. package/dist/ux/prompt.d.ts +7 -0
  176. package/dist/ux/prompt.js +361 -0
  177. package/dist/ux/prompt.js.map +1 -0
  178. package/dist/ux/renderer.d.ts +9 -0
  179. package/dist/ux/renderer.js +45 -0
  180. package/dist/ux/renderer.js.map +1 -0
  181. package/dist/ux/spinner.d.ts +6 -0
  182. package/dist/ux/spinner.js +42 -0
  183. package/dist/ux/spinner.js.map +1 -0
  184. package/dist/ux/statusbar.d.ts +2 -0
  185. package/dist/ux/statusbar.js +44 -0
  186. package/dist/ux/statusbar.js.map +1 -0
  187. package/dist/ux/theme.d.ts +37 -0
  188. package/dist/ux/theme.js +55 -0
  189. package/dist/ux/theme.js.map +1 -0
  190. package/package.json +125 -0
@@ -0,0 +1,414 @@
1
+ import { spawnSync } from 'child_process';
2
+ import { getConfig } from '../config/config.js';
3
+ import { ensureGitRepo } from '../git/ensure-repo.js';
4
+ import { validateBranchName } from '../git/validate.js';
5
+ import { branchExists, createBranch, deleteBranch, deleteRemoteBranch, getCurrentBranch, getCommitsSinceBase, getUpstream, hasUncommittedChanges, isProtectedBranch, listBranches, refExists, renameBranch, resetHard, stashPop, stashSave, switchBranch, } from '../git/repo.js';
6
+ import { blank, error, info, keyValue, section, success, warning } from '../ux/display.js';
7
+ import { confirmPrompt, inputPrompt, selectPrompt } from '../ux/prompt.js';
8
+ import { showMenu } from '../ux/menu.js';
9
+ // Branch type prefixes that follow common conventions
10
+ const BRANCH_TYPES = [
11
+ { prefix: 'feat', label: 'feat — new feature' },
12
+ { prefix: 'fix', label: 'fix — bug fix' },
13
+ { prefix: 'hotfix', label: 'hotfix — urgent production fix' },
14
+ { prefix: 'chore', label: 'chore — maintenance, tooling' },
15
+ { prefix: 'docs', label: 'docs — documentation' },
16
+ { prefix: 'refactor', label: 'refactor — code restructuring' },
17
+ { prefix: 'test', label: 'test — tests only' },
18
+ { prefix: 'release', label: 'release — release preparation' },
19
+ { prefix: 'custom', label: 'custom — type it manually' },
20
+ ];
21
+ export async function runBranch() {
22
+ const cwd = process.cwd();
23
+ if (!(await ensureGitRepo(cwd)))
24
+ return;
25
+ const current = getCurrentBranch(cwd);
26
+ await showMenu(`Branch Manager (current: ${current})`, [
27
+ { key: '1', label: 'Create new branch', action: () => createBranchFlow(cwd) },
28
+ { key: '2', label: 'Switch branch', action: () => switchBranchFlow(cwd) },
29
+ { key: '3', label: 'List branches', action: () => listBranchesFlow(cwd) },
30
+ { key: '4', label: 'Delete branch', action: () => deleteBranchFlow(cwd) },
31
+ { key: '5', label: 'Rename current branch', action: () => renameBranchFlow(cwd) },
32
+ { key: '6', label: 'Rescue commits → new branch', action: () => rescueCommitsFlow(cwd) },
33
+ { key: '7', label: 'Clean merged branches', action: () => cleanMergedBranchesFlow(cwd) },
34
+ { key: '0', label: 'Back', action: async () => { } },
35
+ ]);
36
+ }
37
+ // ── Create ─────────────────────────────────────────────────────────────────
38
+ async function createBranchFlow(cwd) {
39
+ const config = getConfig();
40
+ section('Create New Branch');
41
+ // 1. Type
42
+ const typeChoice = await selectPrompt('Branch type:', BRANCH_TYPES.map((t) => t.label));
43
+ const matched = BRANCH_TYPES.find((t) => typeChoice.startsWith(t.prefix));
44
+ let prefix = matched?.prefix ?? 'feat';
45
+ if (prefix === 'custom') {
46
+ prefix = await inputPrompt('Custom prefix (e.g. "experiment")');
47
+ }
48
+ // 2. Optional ticket
49
+ const ticketPattern = new RegExp(config.commit.ticketPattern);
50
+ const ticketHint = config.commit.requireTicket === true ? ' (required)' : ' (optional, e.g. PROJ-123)';
51
+ const ticket = await inputPrompt(`Ticket / issue number${ticketHint}`, '');
52
+ if (config.commit.requireTicket === true && ticket && !ticketPattern.test(ticket)) {
53
+ warning(`Ticket "${ticket}" doesn't match pattern ${config.commit.ticketPattern}`);
54
+ }
55
+ // 3. Description → slug (optional)
56
+ const description = await inputPrompt('Short description (optional, e.g. "add login page")', '');
57
+ const slug = toSlug(description);
58
+ // 4. Compose branch name
59
+ const middle = slug ? (ticket ? `${ticket}-${slug}` : slug) : ticket;
60
+ const parts = middle ? [prefix, middle] : [prefix];
61
+ const suggested = parts.join('/');
62
+ const branchName = await inputPrompt('Branch name', suggested);
63
+ if (!branchName.trim()) {
64
+ info('Cancelled.');
65
+ return;
66
+ }
67
+ // 5. Validate
68
+ const vnCreate = validateBranchName(branchName);
69
+ if (!vnCreate.valid) {
70
+ error(`"${branchName}" is not a valid Git branch name: ${vnCreate.reason}`);
71
+ return;
72
+ }
73
+ if (branchExists(branchName, cwd)) {
74
+ error(`Branch "${branchName}" already exists.`);
75
+ return;
76
+ }
77
+ // 6. Base branch
78
+ const currentBranch = getCurrentBranch(cwd);
79
+ const baseCandidates = [
80
+ ...config.git.defaultBaseBranches.filter((b) => branchExists(b, cwd)),
81
+ currentBranch,
82
+ ];
83
+ const uniqueBases = [...new Set(baseCandidates)];
84
+ const baseChoice = await selectPrompt('Base branch (branch off from):', uniqueBases);
85
+ // 7. Create
86
+ try {
87
+ createBranch(branchName, baseChoice, cwd);
88
+ success(`Created and switched to branch "${branchName}" from "${baseChoice}".`);
89
+ blank();
90
+ keyValue('Branch', branchName);
91
+ keyValue('Based on', baseChoice);
92
+ if (ticket)
93
+ keyValue('Ticket', ticket);
94
+ }
95
+ catch (e) {
96
+ error(`Failed to create branch: ${e.message}`);
97
+ }
98
+ }
99
+ // ── Switch ─────────────────────────────────────────────────────────────────
100
+ async function switchBranchFlow(cwd) {
101
+ section('Switch Branch');
102
+ if (hasUncommittedChanges(cwd)) {
103
+ warning('You have uncommitted changes. They will carry over to the new branch.');
104
+ const proceed = await confirmPrompt('Continue anyway?', false);
105
+ if (!proceed) {
106
+ info('Cancelled.');
107
+ return;
108
+ }
109
+ }
110
+ const branches = listBranches(false, cwd);
111
+ const current = getCurrentBranch(cwd);
112
+ const others = branches.filter((b) => !b.current && !b.remote);
113
+ if (others.length === 0) {
114
+ info('No other local branches available.');
115
+ return;
116
+ }
117
+ const choices = others.map((b) => `${b.name}${b.merged ? ' (merged)' : ''}`);
118
+ const choice = await selectPrompt('Switch to:', choices);
119
+ const target = choice.split(' ')[0] ?? choice;
120
+ if (target === current) {
121
+ info('Already on that branch.');
122
+ return;
123
+ }
124
+ try {
125
+ switchBranch(target, cwd);
126
+ success(`Switched to "${target}".`);
127
+ }
128
+ catch (e) {
129
+ error(`Failed to switch: ${e.message}`);
130
+ }
131
+ }
132
+ // ── List ───────────────────────────────────────────────────────────────────
133
+ async function listBranchesFlow(cwd) {
134
+ const includeRemote = await confirmPrompt('Include remote branches?', false);
135
+ const branches = listBranches(includeRemote, cwd);
136
+ section(`Branches (${branches.length})`);
137
+ for (const b of branches) {
138
+ const markers = [];
139
+ if (b.current)
140
+ markers.push('current');
141
+ if (b.merged)
142
+ markers.push('merged');
143
+ if (b.remote)
144
+ markers.push('remote');
145
+ const suffix = markers.length ? ` [${markers.join(', ')}]` : '';
146
+ console.log(` ${b.current ? '▶' : ' '} ${b.name}${suffix}`);
147
+ }
148
+ blank();
149
+ }
150
+ // ── Delete ─────────────────────────────────────────────────────────────────
151
+ async function deleteBranchFlow(cwd) {
152
+ const config = getConfig();
153
+ section('Delete Branch');
154
+ const branches = listBranches(false, cwd);
155
+ const deletable = branches.filter((b) => !b.current && !b.remote);
156
+ if (deletable.length === 0) {
157
+ info('No branches available to delete (cannot delete the current branch).');
158
+ return;
159
+ }
160
+ const choices = deletable.map((b) => `${b.name}${b.merged ? ' (merged)' : ' (NOT merged)'}`);
161
+ const choice = await selectPrompt('Branch to delete:', [...choices, 'Cancel']);
162
+ if (choice === 'Cancel')
163
+ return;
164
+ const target = choice.split(' ')[0] ?? choice;
165
+ if (isProtectedBranch(target, config.git.protectedBranches)) {
166
+ error(`"${target}" is a protected branch — deletion blocked.`);
167
+ return;
168
+ }
169
+ const targetInfo = deletable.find((b) => b.name === target);
170
+ if (!targetInfo?.merged) {
171
+ warning(`"${target}" has unmerged commits.`);
172
+ const force = await confirmPrompt('Force delete anyway?', false);
173
+ if (!force) {
174
+ info('Cancelled.');
175
+ return;
176
+ }
177
+ try {
178
+ deleteBranch(target, true, cwd);
179
+ success(`Force deleted "${target}".`);
180
+ }
181
+ catch (e) {
182
+ error(`Failed: ${e.message}`);
183
+ }
184
+ return;
185
+ }
186
+ const confirmed = await confirmPrompt(`Delete branch "${target}"?`, false);
187
+ if (!confirmed) {
188
+ info('Cancelled.');
189
+ return;
190
+ }
191
+ try {
192
+ deleteBranch(target, false, cwd);
193
+ success(`Deleted "${target}".`);
194
+ // Offer to delete remote tracking branch too
195
+ const upstream = getUpstream(cwd);
196
+ if (upstream) {
197
+ const remote = upstream.split('/')[0] ?? '';
198
+ const deleteRemote = await confirmPrompt(`Also delete remote tracking branch "${remote}/${target}"?`, false);
199
+ if (deleteRemote) {
200
+ try {
201
+ deleteRemoteBranch(remote, target, cwd);
202
+ success(`Deleted remote branch "${remote}/${target}".`);
203
+ }
204
+ catch {
205
+ warning('Could not delete remote branch — you may not have push permissions.');
206
+ }
207
+ }
208
+ }
209
+ }
210
+ catch (e) {
211
+ error(`Failed: ${e.message}`);
212
+ }
213
+ }
214
+ // ── Rename ─────────────────────────────────────────────────────────────────
215
+ async function renameBranchFlow(cwd) {
216
+ const config = getConfig();
217
+ const current = getCurrentBranch(cwd);
218
+ section('Rename Current Branch');
219
+ if (isProtectedBranch(current, config.git.protectedBranches)) {
220
+ error(`"${current}" is a protected branch — renaming blocked.`);
221
+ return;
222
+ }
223
+ const newName = await inputPrompt(`New name for "${current}"`);
224
+ if (!newName.trim()) {
225
+ info('Cancelled.');
226
+ return;
227
+ }
228
+ const vnRename = validateBranchName(newName);
229
+ if (!vnRename.valid) {
230
+ error(`"${newName}" is not a valid Git branch name: ${vnRename.reason}`);
231
+ return;
232
+ }
233
+ if (branchExists(newName, cwd)) {
234
+ error(`Branch "${newName}" already exists.`);
235
+ return;
236
+ }
237
+ const confirmed = await confirmPrompt(`Rename "${current}" → "${newName}"?`);
238
+ if (!confirmed) {
239
+ info('Cancelled.');
240
+ return;
241
+ }
242
+ try {
243
+ renameBranch(newName, cwd);
244
+ success(`Renamed "${current}" → "${newName}".`);
245
+ warning('If this branch was already pushed, update the remote with:\n git push origin --delete ' +
246
+ current +
247
+ '\n git push -u origin ' +
248
+ newName);
249
+ }
250
+ catch (e) {
251
+ error(`Failed: ${e.message}`);
252
+ }
253
+ }
254
+ // ── Rescue ─────────────────────────────────────────────────────────────────
255
+ async function rescueCommitsFlow(cwd) {
256
+ section('Rescue Commits → Nueva Rama');
257
+ const current = getCurrentBranch(cwd);
258
+ // Determine the base reference to reset the current branch to after rescue
259
+ const upstream = getUpstream(cwd);
260
+ let rescueBase = upstream;
261
+ if (!rescueBase) {
262
+ for (const candidate of [`origin/${current}`, 'origin/main', 'origin/master']) {
263
+ if (refExists(candidate, cwd)) {
264
+ rescueBase = candidate;
265
+ break;
266
+ }
267
+ }
268
+ }
269
+ // Get commits ahead of the base
270
+ const commits = rescueBase ? getCommitsSinceBase(rescueBase, cwd) : [];
271
+ if (commits.length === 0) {
272
+ info(`"${current}" no tiene commits pendientes de rescatar.`);
273
+ return;
274
+ }
275
+ info(`${commits.length} commit(s) en "${current}" que se moverán:`);
276
+ for (const c of commits)
277
+ console.log(` ● ${c}`);
278
+ blank();
279
+ if (!rescueBase) {
280
+ warning('No se encontró rama base en el remoto. Se creará la rama pero no se reseteará la original.');
281
+ }
282
+ // New branch name
283
+ const newBranch = await inputPrompt('Nombre de la nueva rama (ej. feature/mi-cambio)');
284
+ if (!newBranch.trim()) {
285
+ info('Cancelado.');
286
+ return;
287
+ }
288
+ const vnRescue = validateBranchName(newBranch);
289
+ if (!vnRescue.valid) {
290
+ error(`"${newBranch}" no es un nombre de rama Git válido: ${vnRescue.reason}`);
291
+ return;
292
+ }
293
+ if (branchExists(newBranch, cwd)) {
294
+ error(`La rama "${newBranch}" ya existe.`);
295
+ return;
296
+ }
297
+ // Create branch from current HEAD — carries all pending commits
298
+ try {
299
+ createBranch(newBranch, undefined, cwd);
300
+ success(`Rama "${newBranch}" creada con ${commits.length} commit(s).`);
301
+ }
302
+ catch (e) {
303
+ error(`Error al crear la rama: ${e.message}`);
304
+ return;
305
+ }
306
+ // Offer to reset the original branch back to its base
307
+ if (rescueBase) {
308
+ blank();
309
+ const resetOriginal = await confirmPrompt(`¿Resetear "${current}" a "${rescueBase}"? (borra los commits de esa rama)`, false);
310
+ if (resetOriginal) {
311
+ const hasChanges = hasUncommittedChanges(cwd);
312
+ if (hasChanges) {
313
+ info('Guardando cambios sin commitear...');
314
+ stashSave('gsf-rescue-temp', cwd);
315
+ }
316
+ try {
317
+ switchBranch(current, cwd);
318
+ resetHard(rescueBase, cwd);
319
+ success(`"${current}" reseteada a "${rescueBase}".`);
320
+ }
321
+ catch (e) {
322
+ error(`Error al resetear: ${e.message}`);
323
+ }
324
+ if (hasChanges) {
325
+ stashPop(cwd);
326
+ info('Cambios sin commitear restaurados.');
327
+ }
328
+ switchBranch(newBranch, cwd);
329
+ }
330
+ }
331
+ blank();
332
+ keyValue('Nueva rama', newBranch);
333
+ keyValue('Commits rescatados', String(commits.length));
334
+ if (rescueBase)
335
+ keyValue('Base', rescueBase);
336
+ blank();
337
+ info('Ejecuta gsf push para subir la nueva rama al remoto.');
338
+ }
339
+ // ── Clean merged branches ──────────────────────────────────────────────────
340
+ async function cleanMergedBranchesFlow(cwd) {
341
+ const config = getConfig();
342
+ section('Clean Merged Branches');
343
+ const base = config.git.defaultBaseBranches[0] ?? 'main';
344
+ const r = spawnSync('git', ['branch', '--merged', base], { cwd, encoding: 'utf-8' });
345
+ if (r.status !== 0) {
346
+ error('Could not get merged branches. Is "' + base + '" a valid branch?');
347
+ return;
348
+ }
349
+ const current = getCurrentBranch(cwd);
350
+ const merged = (r.stdout ?? '')
351
+ .split('\n')
352
+ .map((b) => b.replace(/^\*?\s+/, '').trim())
353
+ .filter((b) => b && b !== current && !isProtectedBranch(b, config.git.protectedBranches));
354
+ if (merged.length === 0) {
355
+ info(`No hay ramas mergeadas en "${base}" que se puedan limpiar.`);
356
+ blank();
357
+ info('Las ramas protegidas y la rama actual no se muestran.');
358
+ return;
359
+ }
360
+ section(`Ramas mergeadas en "${base}"`);
361
+ merged.forEach((b) => info(' ' + b));
362
+ blank();
363
+ const confirmed = await confirmPrompt(`¿Eliminar estas ${merged.length} ramas localmente?`, false);
364
+ if (!confirmed) {
365
+ info('Operación cancelada.');
366
+ return;
367
+ }
368
+ let deleted = 0;
369
+ let failed = 0;
370
+ for (const branch of merged) {
371
+ const del = spawnSync('git', ['branch', '-d', branch], { cwd, encoding: 'utf-8' });
372
+ if (del.status === 0) {
373
+ success(`Eliminada: ${branch}`);
374
+ deleted++;
375
+ }
376
+ else {
377
+ warning(`No se pudo eliminar: ${branch} — ${(del.stderr ?? '').trim()}`);
378
+ failed++;
379
+ }
380
+ }
381
+ blank();
382
+ keyValue('Eliminadas', String(deleted));
383
+ if (failed > 0)
384
+ keyValue('Fallidas', String(failed));
385
+ if (deleted > 0) {
386
+ const remote = await confirmPrompt('¿Eliminar también del remoto (origin)?', false);
387
+ if (remote) {
388
+ for (const branch of merged) {
389
+ const rDel = spawnSync('git', ['push', 'origin', '--delete', branch], {
390
+ cwd,
391
+ encoding: 'utf-8',
392
+ stdio: 'pipe',
393
+ });
394
+ if (rDel.status === 0) {
395
+ success(`Remote eliminado: ${branch}`);
396
+ }
397
+ else {
398
+ info(`Remote: ${branch} — ${(rDel.stderr ?? '').trim() || 'no encontrado o ya eliminado'}`);
399
+ }
400
+ }
401
+ }
402
+ }
403
+ }
404
+ // ── Helpers ────────────────────────────────────────────────────────────────
405
+ function toSlug(text) {
406
+ return text
407
+ .toLowerCase()
408
+ .trim()
409
+ .replace(/[^a-z0-9\s-]/g, '')
410
+ .replace(/\s+/g, '-')
411
+ .replace(/-+/g, '-')
412
+ .slice(0, 50);
413
+ }
414
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/commands/branch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface CommitMessageOptions {
2
+ ai?: boolean;
3
+ showPrompt?: boolean;
4
+ outputOnly?: boolean;
5
+ }
6
+ export declare function runCommitMessage(options?: CommitMessageOptions): Promise<void>;
7
+ //# sourceMappingURL=commit-message.d.ts.map
@@ -0,0 +1,95 @@
1
+ import { getConfig } from '../config/config.js';
2
+ import { buildAIContext } from '../git/ai-context-builder.js';
3
+ import { detectConvention } from '../git/convention-detector.js';
4
+ import { ensureGitRepo } from '../git/ensure-repo.js';
5
+ import { extractTicketFromBranch, getCurrentBranch, getRepoName, getStagedFiles, isGitRepo, } from '../git/repo.js';
6
+ import { scanFiles } from '../security/scanner.js';
7
+ import { createProviderWithFallback } from '../providers/provider.factory.js';
8
+ import { HeuristicProvider } from '../providers/heuristic.provider.js';
9
+ import { blank, error, info, keyValue, section, warning } from '../ux/display.js';
10
+ import { confirmPrompt } from '../ux/prompt.js';
11
+ import { startSpinner, succeedSpinner, failSpinner } from '../ux/spinner.js';
12
+ import { guidedMessageBuilder } from './commit.js';
13
+ export async function runCommitMessage(options = {}) {
14
+ const cwd = process.cwd();
15
+ const forceHeuristic = options.ai === false;
16
+ const outputOnly = options.outputOnly === true;
17
+ if (!isGitRepo(cwd)) {
18
+ if (outputOnly) {
19
+ process.stdout.write('chore: update files\n');
20
+ return;
21
+ }
22
+ if (!(await ensureGitRepo(cwd)))
23
+ return;
24
+ }
25
+ const config = getConfig();
26
+ const convention = await detectConvention(cwd);
27
+ const branch = getCurrentBranch(cwd);
28
+ const repoName = getRepoName(cwd);
29
+ const staged = getStagedFiles(cwd);
30
+ const ticket = extractTicketFromBranch(branch, config.commit.ticketPattern);
31
+ if (staged.length === 0 && !outputOnly) {
32
+ warning('No staged files found.');
33
+ const manual = await confirmPrompt('Build message manually with guided builder?', true);
34
+ if (manual) {
35
+ const built = await guidedMessageBuilder();
36
+ if (built) {
37
+ section('Commit Message');
38
+ console.log('\n ' + built.split('\n').join('\n ') + '\n');
39
+ }
40
+ return;
41
+ }
42
+ info('Stage files with "git add <file>" before generating a commit message.');
43
+ return;
44
+ }
45
+ const scanResult = scanFiles(staged.map((f) => ({ path: f.path })), config.security.blockedFiles);
46
+ if (!scanResult.clean && config.security.blockOnSecrets) {
47
+ if (outputOnly) {
48
+ process.stdout.write('chore: update files\n');
49
+ return;
50
+ }
51
+ error('Security issues detected: ' + scanResult.summary);
52
+ process.exit(1);
53
+ }
54
+ const aiContext = buildAIContext({
55
+ repoName,
56
+ branch,
57
+ ticket,
58
+ convention,
59
+ stagedFiles: staged,
60
+ allowRawDiff: config.ai.allowRawDiff,
61
+ });
62
+ if (options.showPrompt && !outputOnly) {
63
+ section('AI Context (what will be sent)');
64
+ console.log(JSON.stringify(aiContext, null, 2));
65
+ blank();
66
+ }
67
+ const provider = forceHeuristic
68
+ ? new HeuristicProvider()
69
+ : await createProviderWithFallback(config);
70
+ if (!outputOnly) {
71
+ startSpinner(`Generating commit message with ${provider.name}...`);
72
+ }
73
+ let message;
74
+ try {
75
+ message = await provider.generateCommitMessage(aiContext);
76
+ if (!outputOnly)
77
+ succeedSpinner(`Generated with ${provider.name}`);
78
+ }
79
+ catch {
80
+ if (!outputOnly)
81
+ failSpinner('Generation failed');
82
+ message = 'chore: update files';
83
+ }
84
+ if (outputOnly) {
85
+ process.stdout.write(message + '\n');
86
+ return;
87
+ }
88
+ section('Proposed Commit Message');
89
+ console.log('\n ' + message + '\n');
90
+ keyValue('Provider', provider.name);
91
+ if (ticket)
92
+ keyValue('Ticket', ticket);
93
+ blank();
94
+ }
95
+ //# sourceMappingURL=commit-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-message.js","sourceRoot":"","sources":["../../src/commands/commit-message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function guidedMessageBuilder(current?: string): Promise<string | null>;
2
+ export declare function runCommit(): Promise<void>;
3
+ //# sourceMappingURL=commit.d.ts.map