@gilbert_oliveira/commit-wizard 1.2.2 → 2.0.1

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/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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"}