@gilbert_oliveira/commit-wizard 1.2.2 → 2.0.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/.commit-wizardrc +17 -0
- package/LICENSE +3 -3
- package/README.md +374 -211
- package/bin/commit-wizard.ts +51 -0
- package/dist/commit-wizard.js +195 -0
- package/package.json +71 -64
- package/src/config/index.ts +237 -0
- package/src/core/cache.ts +210 -0
- package/src/core/index.ts +381 -0
- package/src/core/openai.ts +336 -0
- package/src/core/smart-split.ts +698 -0
- package/src/git/index.ts +177 -0
- package/src/ui/index.ts +204 -0
- package/src/ui/smart-split.ts +141 -0
- package/src/utils/args.ts +56 -0
- package/src/utils/polyfill.ts +82 -0
- package/dist/ai-service.d.ts +0 -44
- package/dist/ai-service.js +0 -287
- package/dist/ai-service.js.map +0 -1
- package/dist/commit-splitter.d.ts +0 -48
- package/dist/commit-splitter.js +0 -227
- package/dist/commit-splitter.js.map +0 -1
- package/dist/config.d.ts +0 -22
- package/dist/config.js +0 -84
- package/dist/config.js.map +0 -1
- package/dist/diff-processor.d.ts +0 -39
- package/dist/diff-processor.js +0 -156
- package/dist/diff-processor.js.map +0 -1
- package/dist/git-utils.d.ts +0 -72
- package/dist/git-utils.js +0 -373
- package/dist/git-utils.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -486
- package/dist/index.js.map +0 -1
package/dist/index.js
DELETED
|
@@ -1,486 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
|
-
import os from 'os';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import fs from 'fs';
|
|
7
|
-
import { execSync } from 'child_process';
|
|
8
|
-
import ora from 'ora';
|
|
9
|
-
import { loadConfig, saveConfig, createConfigExample } from './config.js';
|
|
10
|
-
import { AIService } from './ai-service.js';
|
|
11
|
-
import { GitUtils } from './git-utils.js';
|
|
12
|
-
import { DiffProcessor } from './diff-processor.js';
|
|
13
|
-
import { CommitSplitter } from './commit-splitter.js';
|
|
14
|
-
// 🛑 Tratamento de interrupção (Ctrl+C)
|
|
15
|
-
process.on('SIGINT', () => {
|
|
16
|
-
console.log(chalk.yellow('\n\n👋 Processo interrompido pelo usuário. Até mais!'));
|
|
17
|
-
process.exit(0);
|
|
18
|
-
});
|
|
19
|
-
process.on('SIGTERM', () => {
|
|
20
|
-
console.log(chalk.yellow('\n\n🛑 Processo terminado. Até mais!'));
|
|
21
|
-
process.exit(0);
|
|
22
|
-
});
|
|
23
|
-
/**
|
|
24
|
-
* Exibe informações sobre o sistema e configuração
|
|
25
|
-
*/
|
|
26
|
-
function displaySystemInfo(config, gitUtils) {
|
|
27
|
-
console.log(chalk.cyan.bold('\n📊 Informações do Sistema:'));
|
|
28
|
-
console.log(chalk.white(`• Modelo AI: ${config.model}`));
|
|
29
|
-
console.log(chalk.white(`• Linguagem: ${config.language}`));
|
|
30
|
-
console.log(chalk.white(`• Temperatura: ${config.temperature}`));
|
|
31
|
-
console.log(chalk.white(`• Tokens máximos: ${config.maxTokens}`));
|
|
32
|
-
console.log(chalk.white(`• Auto commit: ${config.autoCommit ? '✅' : '❌'}`));
|
|
33
|
-
console.log(chalk.white(`• Emojis: ${config.includeEmoji ? '✅' : '❌'}`));
|
|
34
|
-
if (gitUtils.isGitRepository()) {
|
|
35
|
-
const branches = gitUtils.getBranches();
|
|
36
|
-
console.log(chalk.white(`• Branch atual: ${branches.current}`));
|
|
37
|
-
console.log(chalk.white(`• Alterações pendentes: ${gitUtils.hasUncommittedChanges() ? '⚠️' : '✅'}`));
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Menu interativo para configuração
|
|
42
|
-
*/
|
|
43
|
-
async function configurationMenu() {
|
|
44
|
-
const currentConfig = loadConfig();
|
|
45
|
-
console.log(chalk.blue.bold('\n⚙️ Menu de Configuração'));
|
|
46
|
-
const { action } = await inquirer.prompt([
|
|
47
|
-
{
|
|
48
|
-
type: 'list',
|
|
49
|
-
name: 'action',
|
|
50
|
-
message: 'O que você gostaria de configurar?',
|
|
51
|
-
choices: [
|
|
52
|
-
{ name: '🤖 Modelo de IA', value: 'model' },
|
|
53
|
-
{ name: '🌍 Idioma', value: 'language' },
|
|
54
|
-
{ name: '🎛️ Temperatura', value: 'temperature' },
|
|
55
|
-
{ name: '📊 Tokens máximos', value: 'maxTokens' },
|
|
56
|
-
{ name: '😀 Incluir emojis', value: 'includeEmoji' },
|
|
57
|
-
{ name: '🚀 Auto commit', value: 'autoCommit' },
|
|
58
|
-
{ name: '🚫 Padrões de exclusão', value: 'excludePatterns' },
|
|
59
|
-
{ name: '📄 Criar arquivo exemplo', value: 'createExample' },
|
|
60
|
-
{ name: '💾 Salvar configuração global', value: 'saveGlobal' },
|
|
61
|
-
{ name: '🔙 Voltar', value: 'back' },
|
|
62
|
-
],
|
|
63
|
-
},
|
|
64
|
-
]);
|
|
65
|
-
if (action === 'back')
|
|
66
|
-
return;
|
|
67
|
-
if (action === 'createExample') {
|
|
68
|
-
createConfigExample();
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const newConfig = {};
|
|
72
|
-
switch (action) {
|
|
73
|
-
case 'model': {
|
|
74
|
-
const { model } = await inquirer.prompt([
|
|
75
|
-
{
|
|
76
|
-
type: 'list',
|
|
77
|
-
name: 'model',
|
|
78
|
-
message: 'Escolha o modelo de IA:',
|
|
79
|
-
choices: [
|
|
80
|
-
{ name: 'GPT-4o (Mais recente)', value: 'gpt-4o' },
|
|
81
|
-
{ name: 'GPT-4o Mini (Mais rápido e barato)', value: 'gpt-4o-mini' },
|
|
82
|
-
{ name: 'GPT-4 Turbo', value: 'gpt-4-turbo' },
|
|
83
|
-
{ name: 'GPT-3.5 Turbo', value: 'gpt-3.5-turbo' },
|
|
84
|
-
],
|
|
85
|
-
default: currentConfig.model,
|
|
86
|
-
},
|
|
87
|
-
]);
|
|
88
|
-
newConfig.model = model;
|
|
89
|
-
break;
|
|
90
|
-
}
|
|
91
|
-
case 'language': {
|
|
92
|
-
const { language } = await inquirer.prompt([
|
|
93
|
-
{
|
|
94
|
-
type: 'list',
|
|
95
|
-
name: 'language',
|
|
96
|
-
message: 'Escolha o idioma:',
|
|
97
|
-
choices: [
|
|
98
|
-
{ name: 'Português', value: 'pt' },
|
|
99
|
-
{ name: 'English', value: 'en' },
|
|
100
|
-
],
|
|
101
|
-
default: currentConfig.language,
|
|
102
|
-
},
|
|
103
|
-
]);
|
|
104
|
-
newConfig.language = language;
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
case 'temperature': {
|
|
108
|
-
const { temperature } = await inquirer.prompt([
|
|
109
|
-
{
|
|
110
|
-
type: 'input',
|
|
111
|
-
name: 'temperature',
|
|
112
|
-
message: 'Digite a temperatura (0.0 - 1.0):',
|
|
113
|
-
default: currentConfig.temperature.toString(),
|
|
114
|
-
validate: (input) => {
|
|
115
|
-
const num = parseFloat(input);
|
|
116
|
-
return !isNaN(num) && num >= 0 && num <= 1 ? true : 'Digite um número entre 0.0 e 1.0';
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
]);
|
|
120
|
-
newConfig.temperature = parseFloat(temperature);
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
case 'maxTokens': {
|
|
124
|
-
const { maxTokens } = await inquirer.prompt([
|
|
125
|
-
{
|
|
126
|
-
type: 'input',
|
|
127
|
-
name: 'maxTokens',
|
|
128
|
-
message: 'Digite o número máximo de tokens:',
|
|
129
|
-
default: currentConfig.maxTokens.toString(),
|
|
130
|
-
validate: (input) => {
|
|
131
|
-
const num = parseInt(input);
|
|
132
|
-
return !isNaN(num) && num > 0 ? true : 'Digite um número positivo';
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
]);
|
|
136
|
-
newConfig.maxTokens = parseInt(maxTokens);
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
case 'includeEmoji': {
|
|
140
|
-
const { includeEmoji } = await inquirer.prompt([
|
|
141
|
-
{
|
|
142
|
-
type: 'confirm',
|
|
143
|
-
name: 'includeEmoji',
|
|
144
|
-
message: 'Incluir emojis nas mensagens de commit?',
|
|
145
|
-
default: currentConfig.includeEmoji,
|
|
146
|
-
},
|
|
147
|
-
]);
|
|
148
|
-
newConfig.includeEmoji = includeEmoji;
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
case 'autoCommit': {
|
|
152
|
-
const { autoCommit } = await inquirer.prompt([
|
|
153
|
-
{
|
|
154
|
-
type: 'confirm',
|
|
155
|
-
name: 'autoCommit',
|
|
156
|
-
message: 'Fazer commit automaticamente sem confirmação?',
|
|
157
|
-
default: currentConfig.autoCommit,
|
|
158
|
-
},
|
|
159
|
-
]);
|
|
160
|
-
newConfig.autoCommit = autoCommit;
|
|
161
|
-
break;
|
|
162
|
-
}
|
|
163
|
-
case 'excludePatterns': {
|
|
164
|
-
const { excludePatterns } = await inquirer.prompt([
|
|
165
|
-
{
|
|
166
|
-
type: 'input',
|
|
167
|
-
name: 'excludePatterns',
|
|
168
|
-
message: 'Padrões de exclusão (separados por vírgula):',
|
|
169
|
-
default: currentConfig.excludePatterns.join(', '),
|
|
170
|
-
},
|
|
171
|
-
]);
|
|
172
|
-
newConfig.excludePatterns = excludePatterns.split(',').map((p) => p.trim());
|
|
173
|
-
break;
|
|
174
|
-
}
|
|
175
|
-
case 'saveGlobal':
|
|
176
|
-
saveConfig(currentConfig, true);
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
if (Object.keys(newConfig).length > 0) {
|
|
180
|
-
saveConfig(newConfig);
|
|
181
|
-
console.log(chalk.green('✅ Configuração atualizada com sucesso!'));
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Função principal do commit wizard
|
|
186
|
-
*/
|
|
187
|
-
async function runCommitWizard() {
|
|
188
|
-
const config = loadConfig();
|
|
189
|
-
if (!config.apiKey) {
|
|
190
|
-
console.log(chalk.redBright('\n🚨 Erro: A variável de ambiente ') +
|
|
191
|
-
chalk.yellow('OPENAI_API_KEY') +
|
|
192
|
-
chalk.redBright(' não está definida.\n'));
|
|
193
|
-
console.log(chalk.white('→ Defina sua chave com: ') +
|
|
194
|
-
chalk.cyan('export OPENAI_API_KEY="sua-chave"') +
|
|
195
|
-
chalk.white(' ou configure no seu ') +
|
|
196
|
-
chalk.cyan('.bashrc') +
|
|
197
|
-
chalk.white(' ou ') +
|
|
198
|
-
chalk.cyan('.zshrc\n'));
|
|
199
|
-
process.exit(1);
|
|
200
|
-
}
|
|
201
|
-
const gitUtils = new GitUtils(config.excludePatterns);
|
|
202
|
-
const aiService = new AIService(config);
|
|
203
|
-
const diffProcessor = new DiffProcessor(aiService, config.maxTokens);
|
|
204
|
-
// Verifica se é um repositório Git
|
|
205
|
-
if (!gitUtils.isGitRepository()) {
|
|
206
|
-
console.error(chalk.red('❌ Este diretório não é um repositório git.'));
|
|
207
|
-
process.exit(1);
|
|
208
|
-
}
|
|
209
|
-
// Obtém status dos arquivos staged
|
|
210
|
-
const gitStatus = gitUtils.getStagedStatus();
|
|
211
|
-
if (!gitStatus.hasStagedFiles) {
|
|
212
|
-
console.log(chalk.yellow('⚠️ Não há alterações staged para o commit.'));
|
|
213
|
-
console.log(chalk.cyan('💡 Dica: Use ') +
|
|
214
|
-
chalk.white('git add <arquivos>') +
|
|
215
|
-
chalk.cyan(' para adicionar arquivos ao stage.'));
|
|
216
|
-
process.exit(0);
|
|
217
|
-
}
|
|
218
|
-
// Analisa complexidade do diff
|
|
219
|
-
const complexity = diffProcessor.analyzeDiffComplexity(gitStatus.diff);
|
|
220
|
-
const stats = diffProcessor.extractDiffStats(gitStatus.diff);
|
|
221
|
-
const hasBreakingChanges = diffProcessor.detectBreakingChanges(gitStatus.diff);
|
|
222
|
-
console.log(chalk.cyan.bold('\n📈 Análise do Diff:'));
|
|
223
|
-
console.log(chalk.white(`• Arquivos alterados: ${stats.files.length}`));
|
|
224
|
-
console.log(chalk.white(`• Linhas adicionadas: ${chalk.green(`+${stats.additions}`)}`));
|
|
225
|
-
console.log(chalk.white(`• Linhas removidas: ${chalk.red(`-${stats.deletions}`)}`));
|
|
226
|
-
console.log(chalk.white(`• Tokens estimados: ${complexity.tokenCount}`));
|
|
227
|
-
console.log(chalk.white(`• Complexidade: ${complexity.complexity === 'simple' ? '🟢 Simples' : complexity.complexity === 'moderate' ? '🟡 Moderada' : '🔴 Complexa'}`));
|
|
228
|
-
if (hasBreakingChanges) {
|
|
229
|
-
console.log(chalk.yellow('⚠️ Possíveis breaking changes detectadas!'));
|
|
230
|
-
}
|
|
231
|
-
// Processa o diff
|
|
232
|
-
console.log(chalk.cyan('\n🔍 Iniciando análise...'));
|
|
233
|
-
try {
|
|
234
|
-
const processedDiff = await diffProcessor.processLargeDiff(gitStatus.diff);
|
|
235
|
-
// Debug: mostra se há problemas no diff processado
|
|
236
|
-
if (processedDiff.includes('|') && processedDiff.includes('%')) {
|
|
237
|
-
console.log(chalk.yellow('⚠️ Detectado possível conteúdo estranho no diff processado'));
|
|
238
|
-
}
|
|
239
|
-
// Gera mensagem de commit
|
|
240
|
-
const generateSpinner = ora('🤖 Gerando mensagem de commit com IA...').start();
|
|
241
|
-
const response = await aiService.generateCommitMessage(processedDiff);
|
|
242
|
-
generateSpinner.succeed('✨ Mensagem de commit gerada com sucesso.');
|
|
243
|
-
if (response.usage) {
|
|
244
|
-
console.log(chalk.dim(`\n💰 Tokens utilizados: ${response.usage.totalTokens} (prompt: ${response.usage.promptTokens}, resposta: ${response.usage.completionTokens})`));
|
|
245
|
-
}
|
|
246
|
-
// Valida se a mensagem está limpa
|
|
247
|
-
if (response.content.includes('|') && response.content.includes('%')) {
|
|
248
|
-
console.log(chalk.red('🚨 AVISO: Mensagem de commit contém dados estranhos!'));
|
|
249
|
-
console.log(chalk.yellow('Tentando fazer limpeza adicional...'));
|
|
250
|
-
}
|
|
251
|
-
console.log(chalk.greenBright('\n✨ Mensagem de commit gerada:'));
|
|
252
|
-
console.log(chalk.yellowBright(response.content));
|
|
253
|
-
// Se auto commit estiver ativado, faz o commit diretamente
|
|
254
|
-
if (config.autoCommit) {
|
|
255
|
-
console.log(chalk.blue('\n🚀 Auto commit ativado, realizando commit...'));
|
|
256
|
-
gitUtils.commit(response.content);
|
|
257
|
-
console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
// Menu de ações
|
|
261
|
-
const { action } = await inquirer.prompt([
|
|
262
|
-
{
|
|
263
|
-
type: 'list',
|
|
264
|
-
name: 'action',
|
|
265
|
-
message: chalk.blue.bold('O que deseja fazer com a mensagem de commit?'),
|
|
266
|
-
choices: [
|
|
267
|
-
{ name: '📌 Confirmar e commitar', value: 'confirm' },
|
|
268
|
-
{ name: '📝 Editar a mensagem antes de commitar', value: 'edit' },
|
|
269
|
-
{ name: '🔄 Regenerar mensagem', value: 'regenerate' },
|
|
270
|
-
{ name: '📋 Copiar para clipboard', value: 'copy' },
|
|
271
|
-
{ name: '🚫 Cancelar o commit', value: 'cancel' },
|
|
272
|
-
],
|
|
273
|
-
},
|
|
274
|
-
]);
|
|
275
|
-
if (action === 'regenerate') {
|
|
276
|
-
// Recursão para regenerar
|
|
277
|
-
return runCommitWizard();
|
|
278
|
-
}
|
|
279
|
-
if (action === 'copy') {
|
|
280
|
-
try {
|
|
281
|
-
execSync(`echo "${response.content}" | pbcopy`, { stdio: 'ignore' });
|
|
282
|
-
console.log(chalk.green('📋 Mensagem copiada para o clipboard!'));
|
|
283
|
-
}
|
|
284
|
-
catch {
|
|
285
|
-
console.log(chalk.yellow('⚠️ Não foi possível copiar para o clipboard. Mensagem:'));
|
|
286
|
-
console.log(response.content);
|
|
287
|
-
}
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
if (action === 'cancel') {
|
|
291
|
-
console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
let finalMessage = response.content;
|
|
295
|
-
if (action === 'edit') {
|
|
296
|
-
const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
|
|
297
|
-
fs.writeFileSync(tempFilePath, response.content);
|
|
298
|
-
console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
|
|
299
|
-
const editor = process.env.EDITOR || 'nano';
|
|
300
|
-
try {
|
|
301
|
-
execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' });
|
|
302
|
-
finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim();
|
|
303
|
-
fs.unlinkSync(tempFilePath);
|
|
304
|
-
if (!finalMessage) {
|
|
305
|
-
console.error(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
catch (error) {
|
|
310
|
-
console.error(chalk.red('❌ Erro ao abrir o editor:'), error);
|
|
311
|
-
fs.unlinkSync(tempFilePath);
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
// Realiza o commit
|
|
316
|
-
const additionalArgs = process.argv
|
|
317
|
-
.slice(2)
|
|
318
|
-
.filter(arg => !['--config', '--info'].includes(arg));
|
|
319
|
-
gitUtils.commit(finalMessage, additionalArgs);
|
|
320
|
-
console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
|
|
321
|
-
// Mostra informações do commit criado
|
|
322
|
-
try {
|
|
323
|
-
const commitInfo = gitUtils.getLastCommitInfo();
|
|
324
|
-
console.log(chalk.dim(`\n📝 Commit ${commitInfo.hash.substring(0, 7)}: ${commitInfo.message}`));
|
|
325
|
-
}
|
|
326
|
-
catch {
|
|
327
|
-
// Ignora erros ao obter info do commit
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
catch (error) {
|
|
331
|
-
console.error(chalk.red('❌ Erro durante o commit:'), error);
|
|
332
|
-
process.exit(1);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Função para multi-commit inteligente
|
|
337
|
-
*/
|
|
338
|
-
async function runMultiCommit() {
|
|
339
|
-
const config = loadConfig();
|
|
340
|
-
if (!config.apiKey) {
|
|
341
|
-
console.log(chalk.redBright('\n🚨 Erro: A variável de ambiente ') +
|
|
342
|
-
chalk.yellow('OPENAI_API_KEY') +
|
|
343
|
-
chalk.redBright(' não está definida.\n'));
|
|
344
|
-
process.exit(1);
|
|
345
|
-
}
|
|
346
|
-
const gitUtils = new GitUtils(config.excludePatterns);
|
|
347
|
-
const aiService = new AIService(config);
|
|
348
|
-
const commitSplitter = new CommitSplitter(gitUtils, config);
|
|
349
|
-
// Verifica se é um repositório Git
|
|
350
|
-
if (!gitUtils.isGitRepository()) {
|
|
351
|
-
console.error(chalk.red('❌ Este diretório não é um repositório git.'));
|
|
352
|
-
process.exit(1);
|
|
353
|
-
}
|
|
354
|
-
// Obtém status dos arquivos staged
|
|
355
|
-
const gitStatus = gitUtils.getStagedStatus();
|
|
356
|
-
if (!gitStatus.hasStagedFiles) {
|
|
357
|
-
console.log(chalk.yellow('⚠️ Não há alterações staged para o commit.'));
|
|
358
|
-
console.log(chalk.cyan('💡 Dica: Use ') +
|
|
359
|
-
chalk.white('git add <arquivos>') +
|
|
360
|
-
chalk.cyan(' para adicionar arquivos ao stage.'));
|
|
361
|
-
process.exit(0);
|
|
362
|
-
}
|
|
363
|
-
console.log(chalk.blue.bold('\n🎯 Multi-Commit Inteligente'));
|
|
364
|
-
console.log(chalk.gray('Dividindo alterações em commits organizados por contexto...\n'));
|
|
365
|
-
try {
|
|
366
|
-
// Analisa e divide o diff
|
|
367
|
-
const splitResult = await commitSplitter.analyzeAndSplit();
|
|
368
|
-
if (splitResult.groups.length <= 1) {
|
|
369
|
-
console.log(chalk.yellow('📝 Apenas um contexto detectado. Fazendo commit normal...'));
|
|
370
|
-
return runCommitWizard();
|
|
371
|
-
}
|
|
372
|
-
// Exibe preview dos grupos propostos
|
|
373
|
-
console.log(chalk.cyan.bold(`\n📋 ${splitResult.groups.length} commits propostos:`));
|
|
374
|
-
for (let i = 0; i < splitResult.groups.length; i++) {
|
|
375
|
-
const group = splitResult.groups[i];
|
|
376
|
-
console.log(chalk.white(`\n${i + 1}. ${group.emoji} ${group.type}: ${group.description}`));
|
|
377
|
-
console.log(chalk.gray(` Arquivos (${group.files.length}): ${group.files.join(', ')}`));
|
|
378
|
-
}
|
|
379
|
-
// Confirma se quer prosseguir
|
|
380
|
-
const { proceed } = await inquirer.prompt([
|
|
381
|
-
{
|
|
382
|
-
type: 'confirm',
|
|
383
|
-
name: 'proceed',
|
|
384
|
-
message: 'Deseja prosseguir com estes commits?',
|
|
385
|
-
default: true,
|
|
386
|
-
},
|
|
387
|
-
]);
|
|
388
|
-
if (!proceed) {
|
|
389
|
-
console.log(chalk.yellow('🚫 Multi-commit cancelado pelo usuário.'));
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
// Executa commits sequencialmente
|
|
393
|
-
let successCount = 0;
|
|
394
|
-
const totalCommits = splitResult.groups.length;
|
|
395
|
-
for (let i = 0; i < splitResult.groups.length; i++) {
|
|
396
|
-
const group = splitResult.groups[i];
|
|
397
|
-
console.log(chalk.blue(`\n[${i + 1}/${totalCommits}] Processando: ${group.emoji} ${group.type}`));
|
|
398
|
-
try {
|
|
399
|
-
// Remove todos os arquivos do stage
|
|
400
|
-
execSync('git reset HEAD .');
|
|
401
|
-
// Adiciona apenas os arquivos deste grupo
|
|
402
|
-
for (const file of group.files) {
|
|
403
|
-
execSync(`git add "${file}"`);
|
|
404
|
-
}
|
|
405
|
-
// Gera mensagem de commit específica para este grupo
|
|
406
|
-
const response = await aiService.generateCommitMessage(group.diff);
|
|
407
|
-
let commitMessage = response.content;
|
|
408
|
-
// Adiciona emoji se configurado
|
|
409
|
-
if (config.includeEmoji && !commitMessage.startsWith(group.emoji)) {
|
|
410
|
-
commitMessage = `${group.emoji} ${commitMessage}`;
|
|
411
|
-
}
|
|
412
|
-
// Realiza o commit
|
|
413
|
-
gitUtils.commit(commitMessage);
|
|
414
|
-
console.log(chalk.green(`✅ Commit ${i + 1}: ${commitMessage.split('\n')[0]}`));
|
|
415
|
-
successCount++;
|
|
416
|
-
}
|
|
417
|
-
catch (error) {
|
|
418
|
-
console.error(chalk.red(`❌ Erro no commit ${i + 1}:`), error);
|
|
419
|
-
const { continueOnError } = await inquirer.prompt([
|
|
420
|
-
{
|
|
421
|
-
type: 'confirm',
|
|
422
|
-
name: 'continueOnError',
|
|
423
|
-
message: 'Deseja continuar com os próximos commits?',
|
|
424
|
-
default: false,
|
|
425
|
-
},
|
|
426
|
-
]);
|
|
427
|
-
if (!continueOnError) {
|
|
428
|
-
break;
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
// Resultado final
|
|
433
|
-
console.log(chalk.cyan.bold(`\n🎉 Multi-commit concluído!`));
|
|
434
|
-
console.log(chalk.white(`• Commits realizados: ${successCount}/${totalCommits}`));
|
|
435
|
-
if (successCount > 0) {
|
|
436
|
-
console.log(chalk.green('✨ Histórico organizado com sucesso!'));
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
catch (error) {
|
|
440
|
-
console.error(chalk.red('❌ Erro durante o multi-commit:'), error);
|
|
441
|
-
process.exit(1);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
/**
|
|
445
|
-
* Função principal
|
|
446
|
-
*/
|
|
447
|
-
async function main() {
|
|
448
|
-
const args = process.argv.slice(2);
|
|
449
|
-
// Verifica argumentos de linha de comando
|
|
450
|
-
if (args.includes('--help') || args.includes('-h')) {
|
|
451
|
-
console.log(chalk.blue.bold('\n🧙♂️ Commit Wizard - Gerador de commits com IA\n'));
|
|
452
|
-
console.log(chalk.white('Uso: commit-wizard [opções]\n'));
|
|
453
|
-
console.log(chalk.white('Opções:'));
|
|
454
|
-
console.log(chalk.white(' --config, -c Abrir menu de configuração'));
|
|
455
|
-
console.log(chalk.white(' --info, -i Mostrar informações do sistema'));
|
|
456
|
-
console.log(chalk.white(' --split, -s Dividir em múltiplos commits por contexto'));
|
|
457
|
-
console.log(chalk.white(' --help, -h Mostrar esta ajuda'));
|
|
458
|
-
console.log(chalk.white('\nExemplos:'));
|
|
459
|
-
console.log(chalk.cyan(' commit-wizard # Gerar commit normal'));
|
|
460
|
-
console.log(chalk.cyan(' commit-wizard --split # Multi-commit por contexto'));
|
|
461
|
-
console.log(chalk.cyan(' commit-wizard --config # Configurar o wizard'));
|
|
462
|
-
console.log(chalk.cyan(' commit-wizard --info # Ver informações do sistema'));
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
if (args.includes('--config') || args.includes('-c')) {
|
|
466
|
-
await configurationMenu();
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
if (args.includes('--info') || args.includes('-i')) {
|
|
470
|
-
const config = loadConfig();
|
|
471
|
-
const gitUtils = new GitUtils(config.excludePatterns);
|
|
472
|
-
displaySystemInfo(config, gitUtils);
|
|
473
|
-
return;
|
|
474
|
-
}
|
|
475
|
-
if (args.includes('--split') || args.includes('-s')) {
|
|
476
|
-
await runMultiCommit();
|
|
477
|
-
return;
|
|
478
|
-
}
|
|
479
|
-
// Executa o wizard principal
|
|
480
|
-
await runCommitWizard();
|
|
481
|
-
}
|
|
482
|
-
main().catch(err => {
|
|
483
|
-
console.error(chalk.red('❌ Erro durante execução:'), err);
|
|
484
|
-
process.exit(1);
|
|
485
|
-
});
|
|
486
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|