@gilbert_oliveira/commit-wizard 1.0.26 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env ts-node
1
+ #!/usr/bin/env node
2
2
  import chalk from 'chalk';
3
3
  import inquirer from 'inquirer';
4
4
  import os from 'os';
@@ -6,241 +6,356 @@ import path from 'path';
6
6
  import fs from 'fs';
7
7
  import { execSync } from 'child_process';
8
8
  import ora from 'ora';
9
- import { encode, decode } from 'gpt-tokenizer';
10
- const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
11
- if (!OPENAI_API_KEY) {
12
- console.log(chalk.redBright('\n🚨 Erro: A variável de ambiente ') +
13
- chalk.yellow('OPENAI_API_KEY') +
14
- chalk.redBright(' não está definida.\n'));
15
- console.log(chalk.white(' Defina sua chave com: ') +
16
- chalk.cyan('export OPENAI_API_KEY="sua-chave"') +
17
- chalk.white(' ou configure no seu ') +
18
- chalk.cyan('.bashrc') +
19
- chalk.white(' ou ') +
20
- chalk.cyan('.zshrc\n'));
21
- process.exit(1);
22
- }
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
+ // 🛑 Tratamento de interrupção (Ctrl+C)
14
+ process.on('SIGINT', () => {
15
+ console.log(chalk.yellow('\n\n👋 Processo interrompido pelo usuário. Até mais!'));
16
+ process.exit(0);
17
+ });
18
+ process.on('SIGTERM', () => {
19
+ console.log(chalk.yellow('\n\n🛑 Processo terminado. Até mais!'));
20
+ process.exit(0);
21
+ });
23
22
  /**
24
- * Realiza a chamada à API do OpenAI.
25
- * @param prompt Texto que será enviado como mensagem do usuário.
26
- * @param mode Define o contexto: 'commit' para gerar mensagem de commit ou outro valor para resumo.
27
- * @returns Resposta da API (string com a mensagem ou o resumo).
23
+ * Exibe informações sobre o sistema e configuração
28
24
  */
29
- export async function callOpenAI(prompt, mode = 'commit') {
30
- const url = 'https://api.openai.com/v1/chat/completions';
31
- // Escolhe o prompt inicial de acordo com o modo.
32
- const systemPrompt = mode === 'commit'
33
- ? "Você é um assistente que gera mensagens de commit seguindo a convenção do Conventional Commits."
34
- : "Você é um assistente que resume alterações de código de forma breve, usando linguagem imperativa em português.";
35
- const body = {
36
- model: "gpt-4-turbo",
37
- messages: [
38
- { role: "system", content: systemPrompt },
39
- { role: "user", content: prompt }
40
- ],
41
- temperature: 0.2
42
- };
43
- const response = await fetch(url, {
44
- method: "POST",
45
- headers: {
46
- "Content-Type": "application/json",
47
- "Authorization": `Bearer ${OPENAI_API_KEY}`
48
- },
49
- body: JSON.stringify(body)
50
- });
51
- if (!response.ok) {
52
- throw new Error(`Erro na API OpenAI: ${response.statusText}`);
25
+ function displaySystemInfo(config, gitUtils) {
26
+ console.log(chalk.cyan.bold('\n📊 Informações do Sistema:'));
27
+ console.log(chalk.white(`• Modelo AI: ${config.model}`));
28
+ console.log(chalk.white(`• Linguagem: ${config.language}`));
29
+ console.log(chalk.white(`• Temperatura: ${config.temperature}`));
30
+ console.log(chalk.white(`• Tokens máximos: ${config.maxTokens}`));
31
+ console.log(chalk.white(`• Auto commit: ${config.autoCommit ? '✅' : '❌'}`));
32
+ console.log(chalk.white(`• Emojis: ${config.includeEmoji ? '✅' : '❌'}`));
33
+ if (gitUtils.isGitRepository()) {
34
+ const branches = gitUtils.getBranches();
35
+ console.log(chalk.white(`• Branch atual: ${branches.current}`));
36
+ console.log(chalk.white(`• Alterações pendentes: ${gitUtils.hasUncommittedChanges() ? '⚠️' : '✅'}`));
53
37
  }
54
- const data = await response.json();
55
- // Retorna a resposta do primeiro "choice".
56
- return data.choices[0].message.content.trim();
57
38
  }
58
39
  /**
59
- * Divide o diff em chunks menores com base na contagem de tokens.
60
- * Utiliza o gpt-tokenizer para garantir que cada chunk não exceda o limite de tokens.
61
- * @param diff O diff completo em formato de string.
62
- * @param maxTokens Quantidade máxima de tokens permitida para cada chunk (padrão: 1000 tokens).
63
- * @returns Array de strings, cada uma representando um chunk.
40
+ * Menu interativo para configuração
64
41
  */
65
- export function chunkDiff(diff, maxTokens = 1000) {
66
- // Codifica o diff para obter o array de tokens.
67
- const tokens = encode(diff);
68
- // Se o diff couber em um único chunk, retorna-o diretamente.
69
- if (tokens.length <= maxTokens) {
70
- return [diff];
42
+ async function configurationMenu() {
43
+ const currentConfig = loadConfig();
44
+ console.log(chalk.blue.bold('\n⚙️ Menu de Configuração'));
45
+ const { action } = await inquirer.prompt([
46
+ {
47
+ type: 'list',
48
+ name: 'action',
49
+ message: 'O que você gostaria de configurar?',
50
+ choices: [
51
+ { name: '🤖 Modelo de IA', value: 'model' },
52
+ { name: '🌍 Idioma', value: 'language' },
53
+ { name: '🎛️ Temperatura', value: 'temperature' },
54
+ { name: '📊 Tokens máximos', value: 'maxTokens' },
55
+ { name: '😀 Incluir emojis', value: 'includeEmoji' },
56
+ { name: '🚀 Auto commit', value: 'autoCommit' },
57
+ { name: '🚫 Padrões de exclusão', value: 'excludePatterns' },
58
+ { name: '📄 Criar arquivo exemplo', value: 'createExample' },
59
+ { name: '💾 Salvar configuração global', value: 'saveGlobal' },
60
+ { name: '🔙 Voltar', value: 'back' },
61
+ ],
62
+ },
63
+ ]);
64
+ if (action === 'back')
65
+ return;
66
+ if (action === 'createExample') {
67
+ createConfigExample();
68
+ return;
69
+ }
70
+ const newConfig = {};
71
+ switch (action) {
72
+ case 'model': {
73
+ const { model } = await inquirer.prompt([
74
+ {
75
+ type: 'list',
76
+ name: 'model',
77
+ message: 'Escolha o modelo de IA:',
78
+ choices: [
79
+ { name: 'GPT-4o (Mais recente)', value: 'gpt-4o' },
80
+ { name: 'GPT-4o Mini (Mais rápido e barato)', value: 'gpt-4o-mini' },
81
+ { name: 'GPT-4 Turbo', value: 'gpt-4-turbo' },
82
+ { name: 'GPT-3.5 Turbo', value: 'gpt-3.5-turbo' },
83
+ ],
84
+ default: currentConfig.model,
85
+ },
86
+ ]);
87
+ newConfig.model = model;
88
+ break;
89
+ }
90
+ case 'language': {
91
+ const { language } = await inquirer.prompt([
92
+ {
93
+ type: 'list',
94
+ name: 'language',
95
+ message: 'Escolha o idioma:',
96
+ choices: [
97
+ { name: 'Português', value: 'pt' },
98
+ { name: 'English', value: 'en' },
99
+ ],
100
+ default: currentConfig.language,
101
+ },
102
+ ]);
103
+ newConfig.language = language;
104
+ break;
105
+ }
106
+ case 'temperature': {
107
+ const { temperature } = await inquirer.prompt([
108
+ {
109
+ type: 'input',
110
+ name: 'temperature',
111
+ message: 'Digite a temperatura (0.0 - 1.0):',
112
+ default: currentConfig.temperature.toString(),
113
+ validate: (input) => {
114
+ const num = parseFloat(input);
115
+ return !isNaN(num) && num >= 0 && num <= 1 ? true : 'Digite um número entre 0.0 e 1.0';
116
+ },
117
+ },
118
+ ]);
119
+ newConfig.temperature = parseFloat(temperature);
120
+ break;
121
+ }
122
+ case 'maxTokens': {
123
+ const { maxTokens } = await inquirer.prompt([
124
+ {
125
+ type: 'input',
126
+ name: 'maxTokens',
127
+ message: 'Digite o número máximo de tokens:',
128
+ default: currentConfig.maxTokens.toString(),
129
+ validate: (input) => {
130
+ const num = parseInt(input);
131
+ return !isNaN(num) && num > 0 ? true : 'Digite um número positivo';
132
+ },
133
+ },
134
+ ]);
135
+ newConfig.maxTokens = parseInt(maxTokens);
136
+ break;
137
+ }
138
+ case 'includeEmoji': {
139
+ const { includeEmoji } = await inquirer.prompt([
140
+ {
141
+ type: 'confirm',
142
+ name: 'includeEmoji',
143
+ message: 'Incluir emojis nas mensagens de commit?',
144
+ default: currentConfig.includeEmoji,
145
+ },
146
+ ]);
147
+ newConfig.includeEmoji = includeEmoji;
148
+ break;
149
+ }
150
+ case 'autoCommit': {
151
+ const { autoCommit } = await inquirer.prompt([
152
+ {
153
+ type: 'confirm',
154
+ name: 'autoCommit',
155
+ message: 'Fazer commit automaticamente sem confirmação?',
156
+ default: currentConfig.autoCommit,
157
+ },
158
+ ]);
159
+ newConfig.autoCommit = autoCommit;
160
+ break;
161
+ }
162
+ case 'excludePatterns': {
163
+ const { excludePatterns } = await inquirer.prompt([
164
+ {
165
+ type: 'input',
166
+ name: 'excludePatterns',
167
+ message: 'Padrões de exclusão (separados por vírgula):',
168
+ default: currentConfig.excludePatterns.join(', '),
169
+ },
170
+ ]);
171
+ newConfig.excludePatterns = excludePatterns.split(',').map((p) => p.trim());
172
+ break;
173
+ }
174
+ case 'saveGlobal':
175
+ saveConfig(currentConfig, true);
176
+ return;
71
177
  }
72
- const chunks = [];
73
- // Percorre os tokens de forma que cada chunk contenha no máximo maxTokens tokens.
74
- for (let i = 0; i < tokens.length; i += maxTokens) {
75
- const chunkTokens = tokens.slice(i, i + maxTokens);
76
- const chunkText = decode(chunkTokens);
77
- chunks.push(chunkText);
178
+ if (Object.keys(newConfig).length > 0) {
179
+ saveConfig(newConfig);
180
+ console.log(chalk.green('✅ Configuração atualizada com sucesso!'));
78
181
  }
79
- return chunks;
80
182
  }
81
- // Pré-prompt para a geração da mensagem de commit conforme as convenções
82
- const COMMIT_PROMPT = `
83
- Por favor, escreva a mensagem de commit para este diff usando a convenção de Conventional Commits: https://www.conventionalcommits.org/en/v1.0.0/.
84
- A mensagem deve começar com um tipo de commit, como:
85
- feat: para novas funcionalidades
86
- fix: para correções de bugs
87
- chore: para alterações que não afetam a funcionalidade
88
- docs: para mudanças na documentação
89
- style: para alterações no estilo do código (como formatação)
90
- refactor: para alterações no código que não alteram a funcionalidade
91
- perf: para melhorias de desempenho
92
- test: para alterações nos testes
93
- ci: para mudanças no pipeline de integração contínua
94
-
95
- Exemplo:
96
- feat(auth): adicionar suporte ao login com Google
97
-
98
- Caso o commit seja uma alteração significativa (breaking change), inclua um título com \`!\` após o tipo de commit e adicione a explicação em \`BREAKING CHANGE\`:
99
- feat!(auth): reestruturar fluxo de login
100
- BREAKING CHANGE: A API de login foi alterada e não é compatível com versões anteriores.
101
-
102
- Gere também uma descrição mais detalhada do commit, se necessário.
103
-
104
- Use sempre linguagem imperativa e primeira pessoa do singular, como:
105
- - "adiciona recurso"
106
- - "corrige bug"
107
- - "remove arquivo"
108
-
109
- Lembre-se: os textos fora do Conventional Commit devem ser em português.
110
- `;
111
- async function main() {
112
- // Verifica se o diretório é um repositório git.
113
- try {
114
- execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' });
183
+ /**
184
+ * Função principal do commit wizard
185
+ */
186
+ async function runCommitWizard() {
187
+ const config = loadConfig();
188
+ if (!config.apiKey) {
189
+ console.log(chalk.redBright('\n🚨 Erro: A variável de ambiente ') +
190
+ chalk.yellow('OPENAI_API_KEY') +
191
+ chalk.redBright(' não está definida.\n'));
192
+ console.log(chalk.white('→ Defina sua chave com: ') +
193
+ chalk.cyan('export OPENAI_API_KEY="sua-chave"') +
194
+ chalk.white(' ou configure no seu ') +
195
+ chalk.cyan('.bashrc') +
196
+ chalk.white(' ou ') +
197
+ chalk.cyan('.zshrc\n'));
198
+ process.exit(1);
115
199
  }
116
- catch {
200
+ const gitUtils = new GitUtils(config.excludePatterns);
201
+ const aiService = new AIService(config);
202
+ const diffProcessor = new DiffProcessor(aiService, config.maxTokens);
203
+ // Verifica se é um repositório Git
204
+ if (!gitUtils.isGitRepository()) {
117
205
  console.error(chalk.red('❌ Este diretório não é um repositório git.'));
118
206
  process.exit(1);
119
207
  }
120
- // Verifica se alterações staged, desconsiderando arquivos .lock
121
- let stagedFiles;
122
- try {
123
- stagedFiles = execSync('git diff --cached --name-only -- . ":(exclude)*.lock*"', { encoding: 'utf8' }).toString().trim();
124
- if (!stagedFiles) {
125
- console.log(chalk.yellow('⚠️ Não há alterações staged para o commit.'));
126
- process.exit(0);
127
- }
208
+ // Obtém status dos arquivos staged
209
+ const gitStatus = gitUtils.getStagedStatus();
210
+ if (!gitStatus.hasStagedFiles) {
211
+ console.log(chalk.yellow('⚠️ Não alterações staged para o commit.'));
212
+ console.log(chalk.cyan('💡 Dica: Use ') +
213
+ chalk.white('git add <arquivos>') +
214
+ chalk.cyan(' para adicionar arquivos ao stage.'));
215
+ process.exit(0);
128
216
  }
129
- catch (error) {
130
- console.error(chalk.red('❌ Erro ao verificar alterações staged:'), error);
131
- process.exit(1);
217
+ // Analisa complexidade do diff
218
+ const complexity = diffProcessor.analyzeDiffComplexity(gitStatus.diff);
219
+ const stats = diffProcessor.extractDiffStats(gitStatus.diff);
220
+ const hasBreakingChanges = diffProcessor.detectBreakingChanges(gitStatus.diff);
221
+ console.log(chalk.cyan.bold('\n📈 Análise do Diff:'));
222
+ console.log(chalk.white(`• Arquivos alterados: ${stats.files.length}`));
223
+ console.log(chalk.white(`• Linhas adicionadas: ${chalk.green(`+${stats.additions}`)}`));
224
+ console.log(chalk.white(`• Linhas removidas: ${chalk.red(`-${stats.deletions}`)}`));
225
+ console.log(chalk.white(`• Tokens estimados: ${complexity.tokenCount}`));
226
+ console.log(chalk.white(`• Complexidade: ${complexity.complexity === 'simple' ? '🟢 Simples' : complexity.complexity === 'moderate' ? '🟡 Moderada' : '🔴 Complexa'}`));
227
+ if (hasBreakingChanges) {
228
+ console.log(chalk.yellow('⚠️ Possíveis breaking changes detectadas!'));
132
229
  }
133
- // Obtém o diff completo das alterações staged, ignorando arquivos .lock*
134
- let diff;
230
+ // Processa o diff
231
+ console.log(chalk.cyan('\n🔍 Iniciando análise...'));
135
232
  try {
136
- diff = execSync('git diff --cached -- . ":(exclude)*.lock*"', { encoding: 'utf8' });
137
- }
138
- catch (error) {
139
- console.error(chalk.red('❌ Erro ao obter o diff:'), error);
140
- process.exit(1);
141
- }
142
- // Divide o diff em chunks com base no número máximo de tokens.
143
- const MAX_TOKENS = 1000;
144
- const chunks = chunkDiff(diff, MAX_TOKENS);
145
- let inputForCommit;
146
- if (chunks.length === 1) {
147
- inputForCommit = chunks[0];
148
- }
149
- else {
150
- // Se houver vários chunks, gera um resumo para todos eles utilizando um único spinner.
151
- const partialSummaries = [];
152
- const chunkSummaryPrefix = "A partir do diff abaixo, extraia um resumo breve das alterações (use linguagem imperativa e em português):";
153
- // Inicia um spinner único para todo o processo
154
- const spinnerSummary = ora("Gerando resumo do commit.").start();
155
- try {
156
- for (const chunk of chunks) {
157
- const prompt = `${chunkSummaryPrefix}\n\n${chunk}`;
158
- const summary = await callOpenAI(prompt, 'resumo');
159
- partialSummaries.push(summary);
233
+ const processedDiff = await diffProcessor.processLargeDiff(gitStatus.diff);
234
+ // Gera mensagem de commit
235
+ const generateSpinner = ora('🤖 Gerando mensagem de commit com IA...').start();
236
+ const response = await aiService.generateCommitMessage(processedDiff);
237
+ generateSpinner.succeed('✨ Mensagem de commit gerada com sucesso.');
238
+ if (response.usage) {
239
+ console.log(chalk.dim(`\n💰 Tokens utilizados: ${response.usage.totalTokens} (prompt: ${response.usage.promptTokens}, resposta: ${response.usage.completionTokens})`));
240
+ }
241
+ console.log(chalk.greenBright('\n✨ Mensagem de commit gerada:'));
242
+ console.log(chalk.yellowBright(response.content));
243
+ // Se auto commit estiver ativado, faz o commit diretamente
244
+ if (config.autoCommit) {
245
+ console.log(chalk.blue('\n🚀 Auto commit ativado, realizando commit...'));
246
+ gitUtils.commit(response.content);
247
+ console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
248
+ return;
249
+ }
250
+ // Menu de ações
251
+ const { action } = await inquirer.prompt([
252
+ {
253
+ type: 'list',
254
+ name: 'action',
255
+ message: chalk.blue.bold('O que deseja fazer com a mensagem de commit?'),
256
+ choices: [
257
+ { name: '📌 Confirmar e commitar', value: 'confirm' },
258
+ { name: '📝 Editar a mensagem antes de commitar', value: 'edit' },
259
+ { name: '🔄 Regenerar mensagem', value: 'regenerate' },
260
+ { name: '📋 Copiar para clipboard', value: 'copy' },
261
+ { name: '🚫 Cancelar o commit', value: 'cancel' },
262
+ ],
263
+ },
264
+ ]);
265
+ if (action === 'regenerate') {
266
+ // Recursão para regenerar
267
+ return runCommitWizard();
268
+ }
269
+ if (action === 'copy') {
270
+ try {
271
+ execSync(`echo "${response.content}" | pbcopy`, { stdio: 'ignore' });
272
+ console.log(chalk.green('📋 Mensagem copiada para o clipboard!'));
160
273
  }
161
- spinnerSummary.succeed("Resumo do commit gerado.");
274
+ catch {
275
+ console.log(chalk.yellow('⚠️ Não foi possível copiar para o clipboard. Mensagem:'));
276
+ console.log(response.content);
277
+ }
278
+ return;
162
279
  }
163
- catch (error) {
164
- spinnerSummary.fail("Erro ao gerar resumo do commit.");
165
- console.error(chalk.red('❌ Erro ao gerar resumo para o commit:'), error);
166
- process.exit(1);
280
+ if (action === 'cancel') {
281
+ console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
282
+ return;
167
283
  }
168
- inputForCommit = partialSummaries.join("\n\n");
169
- }
170
- // Gera a mensagem de commit com o pré-prompt e o diff (ou seus resumos).
171
- const finalPrompt = `${COMMIT_PROMPT}\n\nDiff:\n\n${inputForCommit}`;
172
- const spinnerCommit = ora('Gerando mensagem de commit com base no diff...').start();
173
- let generatedMessage;
174
- try {
175
- generatedMessage = await callOpenAI(finalPrompt, 'commit');
176
- // Remove os delimitadores de bloco de código (```)
177
- generatedMessage = generatedMessage.replace(/```/g, '').trim();
178
- spinnerCommit.succeed('Mensagem de commit gerada com sucesso.');
179
- }
180
- catch (error) {
181
- spinnerCommit.fail('Erro ao gerar a mensagem de commit.');
182
- console.error(chalk.red('❌ Erro ao gerar a mensagem de commit:'), error);
183
- process.exit(1);
184
- }
185
- console.log(chalk.greenBright('\n✨ Mensagem de commit gerada automaticamente:'));
186
- console.log(chalk.yellowBright(generatedMessage));
187
- // Pergunta ao usuário se deseja confirmar, editar ou cancelar o commit.
188
- const promptModule = inquirer.createPromptModule();
189
- const { action } = await promptModule([
190
- {
191
- type: 'list',
192
- name: 'action',
193
- message: chalk.blue.bold('O que deseja fazer com a mensagem de commit gerada?'),
194
- choices: [
195
- { name: '📌 Confirmar e commitar', value: 'confirm' },
196
- { name: '📝 Editar a mensagem antes de commitar', value: 'edit' },
197
- { name: '🚫 Cancelar o commit', value: 'cancel' },
198
- ],
199
- },
200
- ]);
201
- // Cria um arquivo temporário para armazenar a mensagem (para edição se necessário).
202
- const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
203
- fs.writeFileSync(tempFilePath, generatedMessage);
204
- if (action === 'edit') {
205
- console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
206
- const editor = process.env.EDITOR || 'nano';
284
+ let finalMessage = response.content;
285
+ if (action === 'edit') {
286
+ const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
287
+ fs.writeFileSync(tempFilePath, response.content);
288
+ console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
289
+ const editor = process.env.EDITOR || 'nano';
290
+ try {
291
+ execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' });
292
+ finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim();
293
+ fs.unlinkSync(tempFilePath);
294
+ if (!finalMessage) {
295
+ console.error(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
296
+ return;
297
+ }
298
+ }
299
+ catch (error) {
300
+ console.error(chalk.red('❌ Erro ao abrir o editor:'), error);
301
+ fs.unlinkSync(tempFilePath);
302
+ return;
303
+ }
304
+ }
305
+ // Realiza o commit
306
+ const additionalArgs = process.argv
307
+ .slice(2)
308
+ .filter(arg => !['--config', '--info'].includes(arg));
309
+ gitUtils.commit(finalMessage, additionalArgs);
310
+ console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
311
+ // Mostra informações do commit criado
207
312
  try {
208
- execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' });
313
+ const commitInfo = gitUtils.getLastCommitInfo();
314
+ console.log(chalk.dim(`\n📝 Commit ${commitInfo.hash.substring(0, 7)}: ${commitInfo.message}`));
209
315
  }
210
- catch (error) {
211
- console.error(chalk.red('❌ Erro ao abrir o editor:'), error);
212
- process.exit(1);
316
+ catch {
317
+ // Ignora erros ao obter info do commit
213
318
  }
214
319
  }
215
- else if (action === 'cancel') {
216
- console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
217
- fs.unlinkSync(tempFilePath);
218
- process.exit(0);
219
- }
220
- // Lê a mensagem final (após eventual edição).
221
- const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim();
222
- if (!finalMessage) {
223
- console.error(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
224
- fs.unlinkSync(tempFilePath);
320
+ catch (error) {
321
+ console.error(chalk.red(' Erro durante o commit:'), error);
225
322
  process.exit(1);
226
323
  }
227
- // Captura quaisquer argumentos adicionais passados para o comando.
228
- const gitArgs = process.argv.slice(2).join(' ');
229
- console.log(chalk.blue('🔍 Argumentos adicionais para o commit:'), gitArgs);
230
- // Realiza o commit com a mensagem final.
231
- try {
232
- execSync(`git commit -F ${tempFilePath} ${gitArgs}`, { stdio: 'inherit' });
233
- console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
324
+ }
325
+ /**
326
+ * Função principal
327
+ */
328
+ async function main() {
329
+ const args = process.argv.slice(2);
330
+ // Verifica argumentos de linha de comando
331
+ if (args.includes('--help') || args.includes('-h')) {
332
+ console.log(chalk.blue.bold('\n🧙‍♂️ Commit Wizard - Gerador de commits com IA\n'));
333
+ console.log(chalk.white('Uso: commit-wizard [opções]\n'));
334
+ console.log(chalk.white('Opções:'));
335
+ console.log(chalk.white(' --config, -c Abrir menu de configuração'));
336
+ console.log(chalk.white(' --info, -i Mostrar informações do sistema'));
337
+ console.log(chalk.white(' --help, -h Mostrar esta ajuda'));
338
+ console.log(chalk.white('\nExemplos:'));
339
+ console.log(chalk.cyan(' commit-wizard # Gerar commit normal'));
340
+ console.log(chalk.cyan(' commit-wizard --config # Configurar o wizard'));
341
+ console.log(chalk.cyan(' commit-wizard --info # Ver informações do sistema'));
342
+ return;
234
343
  }
235
- catch (error) {
236
- console.error(chalk.red('❌ Erro ao realizar o commit:'), error);
344
+ if (args.includes('--config') || args.includes('-c')) {
345
+ await configurationMenu();
346
+ return;
237
347
  }
238
- finally {
239
- fs.unlinkSync(tempFilePath);
348
+ if (args.includes('--info') || args.includes('-i')) {
349
+ const config = loadConfig();
350
+ const gitUtils = new GitUtils(config.excludePatterns);
351
+ displaySystemInfo(config, gitUtils);
352
+ return;
240
353
  }
354
+ // Executa o wizard principal
355
+ await runCommitWizard();
241
356
  }
242
- main().catch((err) => {
243
- console.error(chalk.red('❌ Erro durante o commit:'), err);
357
+ main().catch(err => {
358
+ console.error(chalk.red('❌ Erro durante execução:'), err);
244
359
  process.exit(1);
245
360
  });
246
361
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}