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.
- package/CHANGELOG.md +33 -0
- package/LICENSE +21 -0
- package/README.md +130 -0
- package/bin/git-smart-flow.js +2 -0
- package/bin/gsf.js +2 -0
- package/bin/gsfc.js +3 -0
- package/bin/gsfm.js +3 -0
- package/bin/gsfp.js +3 -0
- package/bin/gsfpr.js +3 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +214 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/aliases.d.ts +2 -0
- package/dist/commands/aliases.js +37 -0
- package/dist/commands/aliases.js.map +1 -0
- package/dist/commands/branch.d.ts +2 -0
- package/dist/commands/branch.js +414 -0
- package/dist/commands/branch.js.map +1 -0
- package/dist/commands/commit-message.d.ts +7 -0
- package/dist/commands/commit-message.js +95 -0
- package/dist/commands/commit-message.js.map +1 -0
- package/dist/commands/commit.d.ts +3 -0
- package/dist/commands/commit.js +597 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +88 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +246 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/info.d.ts +2 -0
- package/dist/commands/info.js +155 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/install-hooks.d.ts +2 -0
- package/dist/commands/install-hooks.js +66 -0
- package/dist/commands/install-hooks.js.map +1 -0
- package/dist/commands/log.d.ts +2 -0
- package/dist/commands/log.js +101 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/menu.d.ts +2 -0
- package/dist/commands/menu.js +297 -0
- package/dist/commands/menu.js.map +1 -0
- package/dist/commands/merge.d.ts +6 -0
- package/dist/commands/merge.js +128 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/pr.d.ts +2 -0
- package/dist/commands/pr.js +731 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/push.d.ts +7 -0
- package/dist/commands/push.js +225 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/reflog.d.ts +2 -0
- package/dist/commands/reflog.js +162 -0
- package/dist/commands/reflog.js.map +1 -0
- package/dist/commands/repo-init.d.ts +2 -0
- package/dist/commands/repo-init.js +466 -0
- package/dist/commands/repo-init.js.map +1 -0
- package/dist/commands/revert.d.ts +7 -0
- package/dist/commands/revert.js +694 -0
- package/dist/commands/revert.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.js +86 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/stash.d.ts +2 -0
- package/dist/commands/stash.js +130 -0
- package/dist/commands/stash.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.js +335 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/tag.d.ts +2 -0
- package/dist/commands/tag.js +163 -0
- package/dist/commands/tag.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.js +203 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.js +126 -0
- package/dist/config/config.js.map +1 -0
- package/dist/git/ai-context-builder.d.ts +11 -0
- package/dist/git/ai-context-builder.js +112 -0
- package/dist/git/ai-context-builder.js.map +1 -0
- package/dist/git/convention-detector.d.ts +3 -0
- package/dist/git/convention-detector.js +211 -0
- package/dist/git/convention-detector.js.map +1 -0
- package/dist/git/ensure-repo.d.ts +7 -0
- package/dist/git/ensure-repo.js +141 -0
- package/dist/git/ensure-repo.js.map +1 -0
- package/dist/git/gitignore.d.ts +8 -0
- package/dist/git/gitignore.js +261 -0
- package/dist/git/gitignore.js.map +1 -0
- package/dist/git/remote-setup.d.ts +2 -0
- package/dist/git/remote-setup.js +129 -0
- package/dist/git/remote-setup.js.map +1 -0
- package/dist/git/repo.d.ts +73 -0
- package/dist/git/repo.js +308 -0
- package/dist/git/repo.js.map +1 -0
- package/dist/git/validate.d.ts +36 -0
- package/dist/git/validate.js +113 -0
- package/dist/git/validate.js.map +1 -0
- package/dist/providers/base.provider.d.ts +10 -0
- package/dist/providers/base.provider.js +40 -0
- package/dist/providers/base.provider.js.map +1 -0
- package/dist/providers/claude.provider.d.ts +14 -0
- package/dist/providers/claude.provider.js +85 -0
- package/dist/providers/claude.provider.js.map +1 -0
- package/dist/providers/copilot.provider.d.ts +12 -0
- package/dist/providers/copilot.provider.js +88 -0
- package/dist/providers/copilot.provider.js.map +1 -0
- package/dist/providers/heuristic.provider.d.ts +9 -0
- package/dist/providers/heuristic.provider.js +163 -0
- package/dist/providers/heuristic.provider.js.map +1 -0
- package/dist/providers/ollama.provider.d.ts +14 -0
- package/dist/providers/ollama.provider.js +83 -0
- package/dist/providers/ollama.provider.js.map +1 -0
- package/dist/providers/openai.provider.d.ts +14 -0
- package/dist/providers/openai.provider.js +84 -0
- package/dist/providers/openai.provider.js.map +1 -0
- package/dist/providers/provider.factory.d.ts +5 -0
- package/dist/providers/provider.factory.js +51 -0
- package/dist/providers/provider.factory.js.map +1 -0
- package/dist/security/scanner.d.ts +13 -0
- package/dist/security/scanner.js +138 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/types/index.d.ts +146 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ux/components/BranchTree.d.ts +8 -0
- package/dist/ux/components/BranchTree.js +57 -0
- package/dist/ux/components/BranchTree.js.map +1 -0
- package/dist/ux/components/CommitProposal.d.ts +13 -0
- package/dist/ux/components/CommitProposal.js +127 -0
- package/dist/ux/components/CommitProposal.js.map +1 -0
- package/dist/ux/components/DiagnosticReport.d.ts +18 -0
- package/dist/ux/components/DiagnosticReport.js +19 -0
- package/dist/ux/components/DiagnosticReport.js.map +1 -0
- package/dist/ux/components/ErrorBox.d.ts +7 -0
- package/dist/ux/components/ErrorBox.js +9 -0
- package/dist/ux/components/ErrorBox.js.map +1 -0
- package/dist/ux/components/FileSelector.d.ts +14 -0
- package/dist/ux/components/FileSelector.js +87 -0
- package/dist/ux/components/FileSelector.js.map +1 -0
- package/dist/ux/components/Logo.d.ts +6 -0
- package/dist/ux/components/Logo.js +21 -0
- package/dist/ux/components/Logo.js.map +1 -0
- package/dist/ux/components/RepoContext.d.ts +8 -0
- package/dist/ux/components/RepoContext.js +17 -0
- package/dist/ux/components/RepoContext.js.map +1 -0
- package/dist/ux/components/SecurityAlert.d.ts +9 -0
- package/dist/ux/components/SecurityAlert.js +16 -0
- package/dist/ux/components/SecurityAlert.js.map +1 -0
- package/dist/ux/components/StatusDashboard.d.ts +14 -0
- package/dist/ux/components/StatusDashboard.js +36 -0
- package/dist/ux/components/StatusDashboard.js.map +1 -0
- package/dist/ux/components/SuccessBox.d.ts +7 -0
- package/dist/ux/components/SuccessBox.js +9 -0
- package/dist/ux/components/SuccessBox.js.map +1 -0
- package/dist/ux/components/ValidationReport.d.ts +16 -0
- package/dist/ux/components/ValidationReport.js +19 -0
- package/dist/ux/components/ValidationReport.js.map +1 -0
- package/dist/ux/components/WarningBox.d.ts +7 -0
- package/dist/ux/components/WarningBox.js +9 -0
- package/dist/ux/components/WarningBox.js.map +1 -0
- package/dist/ux/display.d.ts +21 -0
- package/dist/ux/display.js +96 -0
- package/dist/ux/display.js.map +1 -0
- package/dist/ux/hooks/useActivation.d.ts +8 -0
- package/dist/ux/hooks/useActivation.js +16 -0
- package/dist/ux/hooks/useActivation.js.map +1 -0
- package/dist/ux/hooks/useSpinner.d.ts +2 -0
- package/dist/ux/hooks/useSpinner.js +13 -0
- package/dist/ux/hooks/useSpinner.js.map +1 -0
- package/dist/ux/menu.d.ts +7 -0
- package/dist/ux/menu.js +56 -0
- package/dist/ux/menu.js.map +1 -0
- package/dist/ux/prompt.d.ts +7 -0
- package/dist/ux/prompt.js +361 -0
- package/dist/ux/prompt.js.map +1 -0
- package/dist/ux/renderer.d.ts +9 -0
- package/dist/ux/renderer.js +45 -0
- package/dist/ux/renderer.js.map +1 -0
- package/dist/ux/spinner.d.ts +6 -0
- package/dist/ux/spinner.js +42 -0
- package/dist/ux/spinner.js.map +1 -0
- package/dist/ux/statusbar.d.ts +2 -0
- package/dist/ux/statusbar.js +44 -0
- package/dist/ux/statusbar.js.map +1 -0
- package/dist/ux/theme.d.ts +37 -0
- package/dist/ux/theme.js +55 -0
- package/dist/ux/theme.js.map +1 -0
- package/package.json +125 -0
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
import { execSync, spawnSync } from 'child_process';
|
|
2
|
+
import { getConfig } from '../config/config.js';
|
|
3
|
+
import { buildAIContext } from '../git/ai-context-builder.js';
|
|
4
|
+
import { detectConvention } from '../git/convention-detector.js';
|
|
5
|
+
import { ensureGitRepo } from '../git/ensure-repo.js';
|
|
6
|
+
import { extractTicketFromBranch, getAheadBehindCount, getCurrentBranch, getLastCommit, getRepoName, getStagedFiles, getUnstagedFiles, getUntrackedFiles, getUpstream, hasCommits, isProtectedBranch, stageFiles, unstageAll, } from '../git/repo.js';
|
|
7
|
+
import { scanFiles } from '../security/scanner.js';
|
|
8
|
+
import { createProviderWithFallback } from '../providers/provider.factory.js';
|
|
9
|
+
import { blank, error, info, keyValue, section, success, warning } from '../ux/display.js';
|
|
10
|
+
import { confirmPrompt, inputPrompt, selectPrompt, smartFileSelectPrompt } from '../ux/prompt.js';
|
|
11
|
+
import { failSpinner, startSpinner, succeedSpinner } from '../ux/spinner.js';
|
|
12
|
+
import { isCI } from '../ux/renderer.js';
|
|
13
|
+
// ── Conventional commit types ──────────────────────────────────────────────
|
|
14
|
+
const TYPE_OPTIONS = [
|
|
15
|
+
{ type: 'feat', label: 'feat — new feature or enhancement' },
|
|
16
|
+
{ type: 'fix', label: 'fix — bug fix' },
|
|
17
|
+
{ type: 'docs', label: 'docs — documentation only' },
|
|
18
|
+
{ type: 'style', label: 'style — formatting, no logic change' },
|
|
19
|
+
{ type: 'refactor', label: 'refactor — code restructuring, no feature/fix' },
|
|
20
|
+
{ type: 'test', label: 'test — adding or correcting tests' },
|
|
21
|
+
{ type: 'chore', label: 'chore — maintenance, tooling, dependencies' },
|
|
22
|
+
{ type: 'ci', label: 'ci — CI/CD configuration' },
|
|
23
|
+
{ type: 'perf', label: 'perf — performance improvement' },
|
|
24
|
+
{ type: 'build', label: 'build — build system or external deps' },
|
|
25
|
+
{ type: 'revert', label: 'revert — revert a previous commit' },
|
|
26
|
+
];
|
|
27
|
+
function parseConventionalMessage(msg) {
|
|
28
|
+
const match = msg.match(/^(\w+)(?:\(([^)]*)\))?(!)?\s*:\s*(.+)/);
|
|
29
|
+
if (match) {
|
|
30
|
+
const [, type = 'feat', scope = '', excl, desc = ''] = match;
|
|
31
|
+
const lines = msg.split('\n');
|
|
32
|
+
const body = lines
|
|
33
|
+
.slice(1)
|
|
34
|
+
.join('\n')
|
|
35
|
+
.replace(/BREAKING CHANGE:.*/gs, '')
|
|
36
|
+
.trim();
|
|
37
|
+
return {
|
|
38
|
+
type,
|
|
39
|
+
scope,
|
|
40
|
+
desc: desc.trim(),
|
|
41
|
+
body,
|
|
42
|
+
breaking: !!excl || /BREAKING CHANGE:/m.test(msg),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return { type: 'feat', scope: '', desc: msg.trim(), body: '', breaking: false };
|
|
46
|
+
}
|
|
47
|
+
export async function guidedMessageBuilder(current) {
|
|
48
|
+
section('Commit Message Builder');
|
|
49
|
+
const pre = current
|
|
50
|
+
? parseConventionalMessage(current)
|
|
51
|
+
: { type: 'feat', scope: '', desc: '', body: '', breaking: false };
|
|
52
|
+
const typeLabels = TYPE_OPTIONS.map((t) => t.label);
|
|
53
|
+
const typeChoice = await selectPrompt('Commit type:', typeLabels);
|
|
54
|
+
const matchedType = TYPE_OPTIONS.find((t) => typeChoice.startsWith(t.type));
|
|
55
|
+
const type = matchedType?.type ?? pre.type;
|
|
56
|
+
const scope = await inputPrompt('Scope (optional — e.g. "auth", "api")', pre.scope || undefined);
|
|
57
|
+
const desc = await inputPrompt('Short description (imperative)', pre.desc || undefined);
|
|
58
|
+
if (!desc.trim()) {
|
|
59
|
+
info('Cancelled — no description provided.');
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const body = await inputPrompt('Body (optional — press Enter to skip)', pre.body || undefined);
|
|
63
|
+
const isBreaking = await confirmPrompt('Is this a breaking change?', false);
|
|
64
|
+
let breakingNote = '';
|
|
65
|
+
if (isBreaking) {
|
|
66
|
+
breakingNote = await inputPrompt('Describe the breaking change');
|
|
67
|
+
}
|
|
68
|
+
const header = `${type}${scope.trim() ? `(${scope.trim()})` : ''}${isBreaking ? '!' : ''}: ${desc.trim()}`;
|
|
69
|
+
const parts = [header];
|
|
70
|
+
if (body.trim())
|
|
71
|
+
parts.push('\n' + body.trim());
|
|
72
|
+
if (isBreaking && breakingNote.trim())
|
|
73
|
+
parts.push('\nBREAKING CHANGE: ' + breakingNote.trim());
|
|
74
|
+
return parts.join('\n');
|
|
75
|
+
}
|
|
76
|
+
// ── Amend last commit flow ─────────────────────────────────────────────────
|
|
77
|
+
async function amendFlow(cwd) {
|
|
78
|
+
const lastCommit = getLastCommit(cwd);
|
|
79
|
+
if (!lastCommit) {
|
|
80
|
+
info('No hay commits anteriores para enmendar.');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const upstream = getUpstream(cwd);
|
|
84
|
+
if (upstream) {
|
|
85
|
+
const { ahead } = getAheadBehindCount(upstream, cwd);
|
|
86
|
+
if (ahead === 0) {
|
|
87
|
+
warning('⚠️ Este commit ya está publicado en el remoto.');
|
|
88
|
+
console.log(' Enmendarlo reescribirá la historia y requerirá --force-with-lease.');
|
|
89
|
+
const proceed = await confirmPrompt('¿Continuar de todas formas?', false);
|
|
90
|
+
if (!proceed) {
|
|
91
|
+
info('Amend cancelado.');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
section(`Último commit: ${lastCommit.shortSha} — ${lastCommit.message}`);
|
|
97
|
+
const amendChoice = await selectPrompt('¿Qué quieres enmendar?', [
|
|
98
|
+
'Solo el mensaje del commit',
|
|
99
|
+
'Añadir ficheros staged + cambiar mensaje',
|
|
100
|
+
'Solo añadir ficheros staged (mantener mensaje)',
|
|
101
|
+
'Cancelar',
|
|
102
|
+
]);
|
|
103
|
+
if (amendChoice === 'Cancelar') {
|
|
104
|
+
info('Amend cancelado.');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const changeMessage = amendChoice === 'Solo el mensaje del commit' ||
|
|
108
|
+
amendChoice === 'Añadir ficheros staged + cambiar mensaje';
|
|
109
|
+
const addFiles = amendChoice === 'Añadir ficheros staged + cambiar mensaje' ||
|
|
110
|
+
amendChoice === 'Solo añadir ficheros staged (mantener mensaje)';
|
|
111
|
+
if (addFiles) {
|
|
112
|
+
const unstaged = getUnstagedFiles(cwd);
|
|
113
|
+
const untracked = getUntrackedFiles(cwd);
|
|
114
|
+
const available = [...unstaged, ...untracked];
|
|
115
|
+
if (available.length === 0) {
|
|
116
|
+
info('No hay ficheros sin stagear para añadir.');
|
|
117
|
+
if (!changeMessage)
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const toStage = await smartFileSelectPrompt('Selecciona ficheros para añadir al amend', available);
|
|
122
|
+
if (toStage.length > 0) {
|
|
123
|
+
stageFiles(toStage, cwd);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (changeMessage) {
|
|
128
|
+
const newMessage = await guidedMessageBuilder(lastCommit.message);
|
|
129
|
+
if (!newMessage) {
|
|
130
|
+
info('Amend cancelado — no se proporcionó mensaje.');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const result = spawnSync('git', ['commit', '--amend', '-m', newMessage], {
|
|
134
|
+
cwd,
|
|
135
|
+
stdio: 'inherit',
|
|
136
|
+
});
|
|
137
|
+
if (result.status !== 0) {
|
|
138
|
+
error('git commit --amend falló.');
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
const result = spawnSync('git', ['commit', '--amend', '--no-edit'], { cwd, stdio: 'inherit' });
|
|
144
|
+
if (result.status !== 0) {
|
|
145
|
+
error('git commit --amend falló.');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
success('Commit enmendado correctamente.');
|
|
150
|
+
}
|
|
151
|
+
// ── Ink-based commit flow (TTY) ────────────────────────────────────────────
|
|
152
|
+
async function runInkCommit() {
|
|
153
|
+
const React = (await import('react')).default;
|
|
154
|
+
const { useState, useEffect } = await import('react');
|
|
155
|
+
const { Box, Text, useApp } = await import('ink');
|
|
156
|
+
const { Spinner } = await import('@inkjs/ui');
|
|
157
|
+
const { renderInteractive } = await import('../ux/renderer.js');
|
|
158
|
+
const { CommitProposalView } = await import('../ux/components/CommitProposal.js');
|
|
159
|
+
const { FileSelector } = await import('../ux/components/FileSelector.js');
|
|
160
|
+
const { SecurityAlert } = await import('../ux/components/SecurityAlert.js');
|
|
161
|
+
const { SuccessBox } = await import('../ux/components/SuccessBox.js');
|
|
162
|
+
const { ErrorBox } = await import('../ux/components/ErrorBox.js');
|
|
163
|
+
const { WarningBox } = await import('../ux/components/WarningBox.js');
|
|
164
|
+
const { theme } = await import('../ux/theme.js');
|
|
165
|
+
const cwd = process.cwd();
|
|
166
|
+
const config = getConfig();
|
|
167
|
+
const convention = await detectConvention(cwd);
|
|
168
|
+
const branch = getCurrentBranch(cwd);
|
|
169
|
+
const repoName = getRepoName(cwd);
|
|
170
|
+
const ticket = extractTicketFromBranch(branch, config.commit.ticketPattern);
|
|
171
|
+
const VALID_COMMIT_TYPES = new Set([
|
|
172
|
+
'feat',
|
|
173
|
+
'fix',
|
|
174
|
+
'docs',
|
|
175
|
+
'style',
|
|
176
|
+
'refactor',
|
|
177
|
+
'test',
|
|
178
|
+
'chore',
|
|
179
|
+
'ci',
|
|
180
|
+
'perf',
|
|
181
|
+
'build',
|
|
182
|
+
'revert',
|
|
183
|
+
]);
|
|
184
|
+
const branchPrefix = branch.split('/')[0] ?? '';
|
|
185
|
+
const branchType = VALID_COMMIT_TYPES.has(branchPrefix) ? branchPrefix : undefined;
|
|
186
|
+
const isProtected = isProtectedBranch(branch, config.git.protectedBranches);
|
|
187
|
+
const initialPhase = isProtected ? 'check-protected' : 'file-select';
|
|
188
|
+
const initialStaged = getStagedFiles(cwd);
|
|
189
|
+
function CommitFlow({ onDone }) {
|
|
190
|
+
const { exit } = useApp();
|
|
191
|
+
const [state, setState] = useState({
|
|
192
|
+
phase: initialPhase,
|
|
193
|
+
staged: initialStaged,
|
|
194
|
+
message: '',
|
|
195
|
+
errorMsg: '',
|
|
196
|
+
commitSha: '',
|
|
197
|
+
});
|
|
198
|
+
const finish = () => {
|
|
199
|
+
exit();
|
|
200
|
+
onDone();
|
|
201
|
+
};
|
|
202
|
+
// Generate message when entering 'generating' phase
|
|
203
|
+
useEffect(() => {
|
|
204
|
+
if (state.phase !== 'generating')
|
|
205
|
+
return;
|
|
206
|
+
let cancelled = false;
|
|
207
|
+
void (async () => {
|
|
208
|
+
try {
|
|
209
|
+
const provider = await createProviderWithFallback(config);
|
|
210
|
+
const aiContext = buildAIContext({
|
|
211
|
+
repoName,
|
|
212
|
+
branch,
|
|
213
|
+
ticket,
|
|
214
|
+
convention,
|
|
215
|
+
stagedFiles: state.staged,
|
|
216
|
+
allowRawDiff: config.ai.allowRawDiff,
|
|
217
|
+
});
|
|
218
|
+
const msg = await provider.generateCommitMessage(aiContext);
|
|
219
|
+
if (!cancelled)
|
|
220
|
+
setState((s) => ({ ...s, phase: 'proposal', message: msg }));
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
if (!cancelled)
|
|
224
|
+
setState((s) => ({
|
|
225
|
+
...s,
|
|
226
|
+
phase: 'proposal',
|
|
227
|
+
message: `feat: update ${state.staged.map((f) => f.path.split('/').pop()).join(', ')}`,
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
})();
|
|
231
|
+
return () => {
|
|
232
|
+
cancelled = true;
|
|
233
|
+
};
|
|
234
|
+
}, [state.phase]);
|
|
235
|
+
// Execute commit when entering 'committing' phase
|
|
236
|
+
useEffect(() => {
|
|
237
|
+
if (state.phase !== 'committing')
|
|
238
|
+
return;
|
|
239
|
+
try {
|
|
240
|
+
execSync(`git commit -m ${JSON.stringify(state.message)}`, { cwd });
|
|
241
|
+
const sha = execSync('git rev-parse --short HEAD', { cwd }).toString().trim();
|
|
242
|
+
setState((s) => ({ ...s, phase: 'success', commitSha: sha }));
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
246
|
+
setState((s) => ({ ...s, phase: 'error', errorMsg: msg }));
|
|
247
|
+
}
|
|
248
|
+
}, [state.phase]);
|
|
249
|
+
if (state.phase === 'check-protected') {
|
|
250
|
+
return React.createElement(Box, { flexDirection: 'column', paddingX: 1 }, React.createElement(WarningBox, {
|
|
251
|
+
title: '⚠️ Rama protegida',
|
|
252
|
+
messages: [`Estás en la rama: ${branch}`, 'Los commits aquí afectan a producción.'],
|
|
253
|
+
}), React.createElement(Box, { marginTop: 1 }, React.createElement(Text, { color: theme.muted }, '¿Continuar? (S/n): ')));
|
|
254
|
+
}
|
|
255
|
+
if (state.phase === 'file-select') {
|
|
256
|
+
const unstaged = getUnstagedFiles(cwd);
|
|
257
|
+
const untracked = getUntrackedFiles(cwd);
|
|
258
|
+
const allFiles = [
|
|
259
|
+
...state.staged.map((f) => ({ path: f.path, status: f.status })),
|
|
260
|
+
...unstaged.map((p) => ({ path: p, status: 'unstaged' })),
|
|
261
|
+
...untracked.map((p) => ({ path: p, status: 'untracked' })),
|
|
262
|
+
];
|
|
263
|
+
if (allFiles.length === 0) {
|
|
264
|
+
return React.createElement(Box, { paddingX: 1 }, React.createElement(ErrorBox, {
|
|
265
|
+
title: 'Sin cambios',
|
|
266
|
+
messages: 'No hay archivos para commitear.',
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
return React.createElement(Box, { paddingX: 1 }, React.createElement(FileSelector, {
|
|
270
|
+
files: allFiles,
|
|
271
|
+
blockedFiles: config.security.blockedFiles,
|
|
272
|
+
onSelect: (paths) => {
|
|
273
|
+
if (paths.length === 0) {
|
|
274
|
+
finish();
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
stageFiles(paths, cwd);
|
|
278
|
+
const newStaged = getStagedFiles(cwd);
|
|
279
|
+
const scan = scanFiles(newStaged.map((f) => ({ path: f.path })), config.security.blockedFiles);
|
|
280
|
+
if (!scan.clean && config.security.blockOnSecrets) {
|
|
281
|
+
setState((s) => ({ ...s, staged: newStaged, phase: 'security-alert' }));
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
setState((s) => ({ ...s, staged: newStaged, phase: 'generating' }));
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
}));
|
|
288
|
+
}
|
|
289
|
+
if (state.phase === 'security-alert') {
|
|
290
|
+
const scan = scanFiles(state.staged.map((f) => ({ path: f.path })), config.security.blockedFiles);
|
|
291
|
+
return React.createElement(Box, { paddingX: 1 }, React.createElement(SecurityAlert, {
|
|
292
|
+
scan,
|
|
293
|
+
onChoice: (choice) => {
|
|
294
|
+
if (choice === 'cancel' || choice === 'review') {
|
|
295
|
+
finish();
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
setState((s) => ({ ...s, phase: 'generating' }));
|
|
299
|
+
},
|
|
300
|
+
}));
|
|
301
|
+
}
|
|
302
|
+
if (state.phase === 'generating') {
|
|
303
|
+
return React.createElement(Box, { paddingX: 1, flexDirection: 'column' }, React.createElement(Spinner, { label: `Analizando cambios con ${config.ai.provider}...` }), React.createElement(Text, { color: theme.muted }, ` ${state.staged.length} archivo(s) staged`));
|
|
304
|
+
}
|
|
305
|
+
if (state.phase === 'proposal') {
|
|
306
|
+
const validation = {
|
|
307
|
+
valid: true,
|
|
308
|
+
errors: [],
|
|
309
|
+
warnings: [],
|
|
310
|
+
};
|
|
311
|
+
const header = state.message.split('\n')[0] ?? '';
|
|
312
|
+
if (header.length > convention.maxHeaderLength) {
|
|
313
|
+
validation.warnings.push(`Header demasiado largo (${header.length}/${convention.maxHeaderLength})`);
|
|
314
|
+
}
|
|
315
|
+
const proposalObj = {
|
|
316
|
+
message: state.message,
|
|
317
|
+
validation,
|
|
318
|
+
provider: config.ai.provider,
|
|
319
|
+
};
|
|
320
|
+
return React.createElement(Box, { paddingX: 1 }, React.createElement(CommitProposalView, {
|
|
321
|
+
key: state.message,
|
|
322
|
+
proposal: proposalObj,
|
|
323
|
+
stagedCount: state.staged.length,
|
|
324
|
+
branchType,
|
|
325
|
+
onAction: (action, extra) => {
|
|
326
|
+
if (action === 'accept') {
|
|
327
|
+
setState((s) => ({ ...s, phase: 'committing' }));
|
|
328
|
+
}
|
|
329
|
+
else if (action === 'edit') {
|
|
330
|
+
if (extra)
|
|
331
|
+
setState((s) => ({ ...s, message: extra, phase: 'proposal' }));
|
|
332
|
+
}
|
|
333
|
+
else if (action === 'regenerate') {
|
|
334
|
+
setState((s) => ({ ...s, phase: 'generating' }));
|
|
335
|
+
}
|
|
336
|
+
else if (action === 'context') {
|
|
337
|
+
// show AI context - for now just log
|
|
338
|
+
console.log('\n' +
|
|
339
|
+
JSON.stringify(buildAIContext({
|
|
340
|
+
repoName,
|
|
341
|
+
branch,
|
|
342
|
+
ticket,
|
|
343
|
+
convention,
|
|
344
|
+
stagedFiles: state.staged,
|
|
345
|
+
allowRawDiff: config.ai.allowRawDiff,
|
|
346
|
+
}), null, 2));
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
finish();
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
}));
|
|
353
|
+
}
|
|
354
|
+
if (state.phase === 'committing') {
|
|
355
|
+
return React.createElement(Box, { paddingX: 1 }, React.createElement(Spinner, { label: 'Creando commit...' }));
|
|
356
|
+
}
|
|
357
|
+
if (state.phase === 'success') {
|
|
358
|
+
return React.createElement(Box, { paddingX: 1, flexDirection: 'column' }, React.createElement(SuccessBox, {
|
|
359
|
+
title: '✅ Commit creado',
|
|
360
|
+
messages: [
|
|
361
|
+
state.message.split('\n')[0] ?? '',
|
|
362
|
+
`${state.commitSha} · ${ticket ?? branch} · ahora`,
|
|
363
|
+
],
|
|
364
|
+
}), React.createElement(Box, { marginTop: 1 }, React.createElement(Text, { color: theme.muted }, ` Ejecuta gsf push cuando estés listo.`)));
|
|
365
|
+
}
|
|
366
|
+
if (state.phase === 'error') {
|
|
367
|
+
return React.createElement(Box, { paddingX: 1 }, React.createElement(ErrorBox, { title: 'Error al commitear', messages: state.errorMsg }));
|
|
368
|
+
}
|
|
369
|
+
return React.createElement(Box, null);
|
|
370
|
+
}
|
|
371
|
+
// Handle "check-protected" phase with a readline confirm since mixing ink select
|
|
372
|
+
// with the protected-branch check is complex. Use plain confirm for this guard.
|
|
373
|
+
if (isProtected) {
|
|
374
|
+
warning(`Estás en una rama protegida: "${branch}"`);
|
|
375
|
+
const { confirmPrompt: cp } = await import('../ux/prompt.js');
|
|
376
|
+
const proceed = await cp('¿Seguro que quieres commitear aquí?', false);
|
|
377
|
+
if (!proceed) {
|
|
378
|
+
info('Commit cancelado.');
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// If there are no files whatsoever, offer amend before entering Ink
|
|
383
|
+
{
|
|
384
|
+
const unstaged = getUnstagedFiles(cwd);
|
|
385
|
+
const untracked = getUntrackedFiles(cwd);
|
|
386
|
+
if (initialStaged.length === 0 && unstaged.length === 0 && untracked.length === 0) {
|
|
387
|
+
if (hasCommits(cwd)) {
|
|
388
|
+
info('No hay ficheros staged.');
|
|
389
|
+
blank();
|
|
390
|
+
const noStagedChoice = await selectPrompt('¿Qué quieres hacer?', [
|
|
391
|
+
'Seleccionar ficheros para nuevo commit',
|
|
392
|
+
'Enmendar el último commit',
|
|
393
|
+
'Cancelar',
|
|
394
|
+
]);
|
|
395
|
+
if (noStagedChoice === 'Enmendar el último commit') {
|
|
396
|
+
await amendFlow(cwd);
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
if (noStagedChoice === 'Cancelar') {
|
|
400
|
+
info('Commit cancelado.');
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
info('No hay ficheros disponibles para stagear.');
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
await renderInteractive((resolve) => React.createElement(CommitFlow, { onDone: resolve }));
|
|
409
|
+
}
|
|
410
|
+
// ── Plain commit flow (CI / no-TTY) ───────────────────────────────────────
|
|
411
|
+
async function runPlainCommit() {
|
|
412
|
+
const cwd = process.cwd();
|
|
413
|
+
const config = getConfig();
|
|
414
|
+
const convention = await detectConvention(cwd);
|
|
415
|
+
const branch = getCurrentBranch(cwd);
|
|
416
|
+
const repoName = getRepoName(cwd);
|
|
417
|
+
if (isProtectedBranch(branch, config.git.protectedBranches)) {
|
|
418
|
+
warning(`You are on a protected branch: "${branch}"`);
|
|
419
|
+
const proceed = await confirmPrompt('Are you sure you want to commit here?', false);
|
|
420
|
+
if (!proceed) {
|
|
421
|
+
info('Commit cancelled.');
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
let staged = getStagedFiles(cwd);
|
|
426
|
+
const unstaged = getUnstagedFiles(cwd);
|
|
427
|
+
const untracked = getUntrackedFiles(cwd);
|
|
428
|
+
if (staged.length > 0) {
|
|
429
|
+
section(`Currently Staged (${staged.length} file(s))`);
|
|
430
|
+
for (const f of staged)
|
|
431
|
+
console.log(` ${f.status.charAt(0).toUpperCase()} ${f.path}`);
|
|
432
|
+
blank();
|
|
433
|
+
const stagingChoice = await selectPrompt('How do you want to proceed?', [
|
|
434
|
+
`Continue with these ${staged.length} staged file(s)`,
|
|
435
|
+
'Add more files to staging',
|
|
436
|
+
'Unstage all and re-select',
|
|
437
|
+
'Cancel',
|
|
438
|
+
]);
|
|
439
|
+
if (stagingChoice === 'Cancel') {
|
|
440
|
+
info('Commit cancelled.');
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
if (stagingChoice.startsWith('Unstage')) {
|
|
444
|
+
unstageAll(cwd);
|
|
445
|
+
staged = [];
|
|
446
|
+
}
|
|
447
|
+
else if (stagingChoice.startsWith('Add more')) {
|
|
448
|
+
const available = [...unstaged, ...untracked];
|
|
449
|
+
if (available.length > 0) {
|
|
450
|
+
const toAdd = await smartFileSelectPrompt('Select additional files to stage', available);
|
|
451
|
+
if (toAdd.length > 0) {
|
|
452
|
+
stageFiles(toAdd, cwd);
|
|
453
|
+
staged = getStagedFiles(cwd);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (staged.length === 0) {
|
|
459
|
+
const available = [...unstaged, ...untracked];
|
|
460
|
+
if (available.length === 0) {
|
|
461
|
+
if (hasCommits(cwd)) {
|
|
462
|
+
info('No hay ficheros staged.');
|
|
463
|
+
blank();
|
|
464
|
+
const noStagedChoice = await selectPrompt('¿Qué quieres hacer?', [
|
|
465
|
+
'Seleccionar ficheros para nuevo commit',
|
|
466
|
+
'Enmendar el último commit',
|
|
467
|
+
'Cancelar',
|
|
468
|
+
]);
|
|
469
|
+
if (noStagedChoice === 'Enmendar el último commit') {
|
|
470
|
+
await amendFlow(cwd);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
if (noStagedChoice === 'Cancelar') {
|
|
474
|
+
info('Commit cancelado.');
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
info('No hay ficheros disponibles para stagear.');
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
info('No changes to commit.');
|
|
481
|
+
}
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
const toStage = await smartFileSelectPrompt('Select files to stage', available);
|
|
485
|
+
if (toStage.length === 0) {
|
|
486
|
+
info('Nothing selected. Commit cancelled.');
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
stageFiles(toStage, cwd);
|
|
490
|
+
staged = getStagedFiles(cwd);
|
|
491
|
+
}
|
|
492
|
+
if (staged.length === 0) {
|
|
493
|
+
info('No files staged. Commit cancelled.');
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
const scanResult = scanFiles(staged.map((f) => ({ path: f.path })), config.security.blockedFiles);
|
|
497
|
+
if (!scanResult.clean) {
|
|
498
|
+
if (scanResult.blockedFiles.length > 0)
|
|
499
|
+
error(`Sensitive files staged: ${scanResult.blockedFiles.join(', ')}`);
|
|
500
|
+
if (scanResult.detectedSecrets.length > 0)
|
|
501
|
+
warning(`Potential secrets detected: ${scanResult.summary}`);
|
|
502
|
+
if (config.security.blockOnSecrets) {
|
|
503
|
+
error('Commit blocked due to security issues.');
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
const ticket = extractTicketFromBranch(branch, config.commit.ticketPattern);
|
|
508
|
+
const aiContext = buildAIContext({
|
|
509
|
+
repoName,
|
|
510
|
+
branch,
|
|
511
|
+
ticket,
|
|
512
|
+
convention,
|
|
513
|
+
stagedFiles: staged,
|
|
514
|
+
allowRawDiff: config.ai.allowRawDiff,
|
|
515
|
+
});
|
|
516
|
+
const provider = await createProviderWithFallback(config);
|
|
517
|
+
startSpinner(`Generating commit message with ${provider.name}...`);
|
|
518
|
+
let message;
|
|
519
|
+
try {
|
|
520
|
+
message = await provider.generateCommitMessage(aiContext);
|
|
521
|
+
succeedSpinner();
|
|
522
|
+
}
|
|
523
|
+
catch {
|
|
524
|
+
failSpinner('Generation failed — falling back to guided builder');
|
|
525
|
+
const built = await guidedMessageBuilder();
|
|
526
|
+
if (!built) {
|
|
527
|
+
info('Commit cancelled.');
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
message = built;
|
|
531
|
+
}
|
|
532
|
+
let done = false;
|
|
533
|
+
while (!done) {
|
|
534
|
+
section('Proposed Commit Message');
|
|
535
|
+
console.log(`\n ${message.split('\n').join('\n ')}\n`);
|
|
536
|
+
keyValue('Provider', provider.name);
|
|
537
|
+
blank();
|
|
538
|
+
const choice = await selectPrompt('What do you want to do?', [
|
|
539
|
+
'Accept and commit',
|
|
540
|
+
'Edit message (guided)',
|
|
541
|
+
'Regenerate',
|
|
542
|
+
'View AI context',
|
|
543
|
+
'Cancel',
|
|
544
|
+
]);
|
|
545
|
+
if (choice === 'Accept and commit') {
|
|
546
|
+
const confirmed = await confirmPrompt(`Commit with message: "${message.split('\n')[0]}"?`);
|
|
547
|
+
if (!confirmed) {
|
|
548
|
+
info('Commit cancelled.');
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
try {
|
|
552
|
+
execSync(`git commit -m ${JSON.stringify(message)}`, { cwd, stdio: 'inherit' });
|
|
553
|
+
success('Commit created successfully.');
|
|
554
|
+
}
|
|
555
|
+
catch {
|
|
556
|
+
error('git commit failed.');
|
|
557
|
+
}
|
|
558
|
+
done = true;
|
|
559
|
+
}
|
|
560
|
+
else if (choice === 'Edit message (guided)') {
|
|
561
|
+
const edited = await guidedMessageBuilder(message);
|
|
562
|
+
if (edited)
|
|
563
|
+
message = edited;
|
|
564
|
+
}
|
|
565
|
+
else if (choice === 'Regenerate') {
|
|
566
|
+
startSpinner('Regenerating...');
|
|
567
|
+
try {
|
|
568
|
+
message = await provider.generateCommitMessage(aiContext);
|
|
569
|
+
succeedSpinner();
|
|
570
|
+
}
|
|
571
|
+
catch {
|
|
572
|
+
failSpinner();
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
else if (choice === 'View AI context') {
|
|
576
|
+
section('AI Context');
|
|
577
|
+
console.log(JSON.stringify(aiContext, null, 2));
|
|
578
|
+
}
|
|
579
|
+
else {
|
|
580
|
+
info('Commit cancelled.');
|
|
581
|
+
done = true;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
// ── Entry point ────────────────────────────────────────────────────────────
|
|
586
|
+
export async function runCommit() {
|
|
587
|
+
const cwd = process.cwd();
|
|
588
|
+
if (!(await ensureGitRepo(cwd)))
|
|
589
|
+
return;
|
|
590
|
+
if (isCI()) {
|
|
591
|
+
await runPlainCommit();
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
await runInkCommit();
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
|