@gilbert_oliveira/commit-wizard 1.0.7 → 1.0.9

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gilbert_oliveira/commit-wizard",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "O **Commit Wizard** é uma ferramenta automatizada para geração de mensagens de commit com base na convenção de **Conventional Commits**. Ele ajuda a garantir que suas mensagens de commit sigam um padrão consistente e facilite a comunicação de mudanças no código.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -37,9 +37,14 @@
37
37
  "access": "public"
38
38
  },
39
39
  "devDependencies": {
40
+ "@types/node": "^22.14.1",
40
41
  "typescript": "^5.6.3"
41
42
  },
42
43
  "dependencies": {
44
+ "gpt-tokenizer": "^1.0.0",
45
+ "ora": "^8.2.0",
46
+ "@types/bun": "latest",
47
+ "typescript": "^5.0.0",
43
48
  "chalk": "^5.3.0",
44
49
  "child_process": "^1.0.2",
45
50
  "fs": "^0.0.1-security",
package/src/index.ts CHANGED
@@ -1,62 +1,92 @@
1
1
  #!/usr/bin/env ts-node
2
2
 
3
3
  import chalk from 'chalk';
4
- import { execSync } from 'child_process';
5
- import fs from 'fs';
6
4
  import inquirer from 'inquirer';
7
5
  import os from 'os';
8
6
  import path from 'path';
7
+ import fs from 'fs';
8
+ import { execSync } from 'child_process';
9
+ import ora from 'ora';
10
+ import { encode, decode } from 'gpt-tokenizer';
9
11
 
10
- // Função para verificar se o comando 'cody' está disponível
11
- function isCodyInstalled(): boolean {
12
- try {
13
- execSync('cody --version', { stdio: 'ignore' });
14
- return true;
15
- } catch (error) {
16
- return false;
17
- }
12
+ const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
13
+ if (!OPENAI_API_KEY) {
14
+ throw new Error("Chave da API do OpenAI não configurada. Defina a variável de ambiente OPENAI_API_KEY.");
18
15
  }
19
16
 
20
- // Função para instalar o 'cody' automaticamente
21
- function installCody(): void {
22
- console.log(chalk.blue('🚀 Instalando o cody automaticamente...'));
23
- try {
24
- execSync('npm i -g @sourcegraph/cody', { stdio: 'inherit' });
25
- console.log(chalk.green('✅ Cody instalado com sucesso!'));
26
- } catch (error) {
27
- console.error(chalk.red('❌ Erro ao instalar o Cody:'), (error as Error).message);
28
- process.exit(1);
17
+ /**
18
+ * Realiza a chamada à API do OpenAI.
19
+ * @param prompt Texto que será enviado como mensagem do usuário.
20
+ * @param mode Define o contexto: 'commit' para gerar mensagem de commit ou outro valor para resumo.
21
+ * @returns Resposta da API (string com a mensagem ou o resumo).
22
+ */
23
+ export async function callOpenAI(prompt: string, mode: string = 'commit'): Promise<string> {
24
+ const url = 'https://api.openai.com/v1/chat/completions';
25
+
26
+ // Escolhe o prompt inicial de acordo com o modo.
27
+ const systemPrompt =
28
+ mode === 'commit'
29
+ ? "Você é um assistente que gera mensagens de commit seguindo a convenção do Conventional Commits."
30
+ : "Você é um assistente que resume alterações de código de forma breve, usando linguagem imperativa em português.";
31
+
32
+ const body = {
33
+ model: "gpt-4-turbo",
34
+ messages: [
35
+ { role: "system", content: systemPrompt },
36
+ { role: "user", content: prompt }
37
+ ],
38
+ temperature: 0.2
39
+ };
40
+
41
+ const response = await fetch(url, {
42
+ method: "POST",
43
+ headers: {
44
+ "Content-Type": "application/json",
45
+ "Authorization": `Bearer ${OPENAI_API_KEY}`
46
+ },
47
+ body: JSON.stringify(body)
48
+ });
49
+
50
+ if (!response.ok) {
51
+ throw new Error(`Erro na API OpenAI: ${response.statusText}`);
29
52
  }
30
- }
31
53
 
32
- // Verifica se o 'cody' está instalado, caso contrário, instala
33
- if (!isCodyInstalled()) {
34
- installCody();
54
+ const data = await response.json();
55
+ // Retorna a resposta do primeiro "choice".
56
+ return data.choices[0].message.content.trim();
35
57
  }
36
58
 
37
- // Função para verificar se está logado no cody
38
- function isCodyLoggedIn(): boolean {
39
- try {
40
- execSync('cody auth whoami', { stdio: 'ignore' });
41
- return true;
42
- } catch (error) {
43
- return false;
59
+ /**
60
+ * Divide o diff em chunks menores com base na contagem de tokens.
61
+ * Utiliza o gpt-tokenizer para garantir que cada chunk não exceda o limite de tokens.
62
+ * @param diff O diff completo em formato de string.
63
+ * @param maxTokens Quantidade máxima de tokens permitida para cada chunk (padrão: 1000 tokens).
64
+ * @returns Array de strings, cada uma representando um chunk.
65
+ */
66
+ export function chunkDiff(diff: string, maxTokens: number = 1000): string[] {
67
+ // Codifica o diff para obter o array de tokens.
68
+ const tokens = encode(diff);
69
+
70
+ // Se o diff couber em um único chunk, retorna-o diretamente.
71
+ if (tokens.length <= maxTokens) {
72
+ return [diff];
44
73
  }
45
- }
46
74
 
47
- // Verificar se o usuário está logado no Cody, se não estiver, roda o comando para logar
48
- if (!isCodyLoggedIn()) {
49
- console.log(chalk.blue('🔑 Realize o login no Cody...'));
50
- try {
51
- execSync('cody auth login --web', { stdio: 'inherit' });
52
- } catch (error) {
53
- console.error(chalk.red('❌ Erro ao realizar o login no Cody:'), (error as Error).message);
54
- process.exit(1);
75
+ const chunks: string[] = [];
76
+
77
+ // Percorre os tokens de forma que cada chunk contenha no máximo maxTokens tokens.
78
+ for (let i = 0; i < tokens.length; i += maxTokens) {
79
+ const chunkTokens = tokens.slice(i, i + maxTokens);
80
+ const chunkText = decode(chunkTokens);
81
+ chunks.push(chunkText);
55
82
  }
83
+
84
+ return chunks;
56
85
  }
57
86
 
58
- // Define o prompt do Cody para geração da mensagem de commit
59
- const CODY_PROMPT = `
87
+
88
+ // Pré-prompt para a geração da mensagem de commit conforme as convenções
89
+ const COMMIT_PROMPT = `
60
90
  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/.
61
91
  A mensagem deve começar com um tipo de commit, como:
62
92
  feat: para novas funcionalidades
@@ -86,59 +116,96 @@ Use sempre linguagem imperativa e primeira pessoa do singular, como:
86
116
  Lembre-se: os textos fora do Conventional Commit devem ser em português.
87
117
  `;
88
118
 
89
- interface CommitAction {
90
- action: 'confirm' | 'edit' | 'cancel';
91
- }
119
+ async function main(): Promise<void> {
120
+ // Verifica se o diretório é um repositório git.
121
+ try {
122
+ execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' });
123
+ } catch {
124
+ console.error(chalk.red('❌ Este diretório não é um repositório git.'));
125
+ process.exit(1);
126
+ }
92
127
 
93
- async function ccm(): Promise<void> {
94
- const prompt = inquirer.createPromptModule();
128
+ // Verifica se alterações staged, desconsiderando arquivos .lock
129
+ let stagedFiles: string;
130
+ try {
131
+ stagedFiles = execSync(
132
+ 'git diff --cached --name-only -- . ":(exclude)*.lock"',
133
+ { encoding: 'utf8' }
134
+ ).toString().trim();
135
+ if (!stagedFiles) {
136
+ console.log(chalk.yellow('⚠️ Não há alterações staged para o commit.'));
137
+ process.exit(0);
138
+ }
139
+ } catch (error) {
140
+ console.error(chalk.red('❌ Erro ao verificar alterações staged:'), error);
141
+ process.exit(1);
142
+ }
95
143
 
96
- // Verifica se o repositório git está inicializado
144
+ // Obtém o diff completo das alterações staged, ignorando arquivos .lock
145
+ let diff: string;
97
146
  try {
98
- console.log(chalk.blue('🔄 Verificando se o diretório é um repositório git...'));
99
- execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' });
147
+ diff = execSync(
148
+ 'git diff --cached -- . ":(exclude)*.lock"',
149
+ { encoding: 'utf8' }
150
+ );
100
151
  } catch (error) {
101
- console.error(chalk.red('❌ Este diretório não é um repositório git.'));
102
- return;
152
+ console.error(chalk.red('❌ Erro ao obter o diff:'), error);
153
+ process.exit(1);
103
154
  }
104
155
 
105
- // Verifica se alterações staged
106
- const stagedChanges = execSync('git diff --cached --name-only').toString().trim();
107
- if (!stagedChanges) {
108
- console.log(chalk.yellow('⚠️ Não há alterações staged para o commit.'));
109
- return;
156
+ // Divide o diff em chunks com base no número máximo de tokens.
157
+ const MAX_TOKENS = 1000;
158
+ const chunks = chunkDiff(diff, MAX_TOKENS);
159
+ let inputForCommit: string;
160
+
161
+ if (chunks.length === 1) {
162
+ inputForCommit = chunks[0];
163
+ } else {
164
+ // Se houver vários chunks, gera um resumo para todos eles utilizando um único spinner.
165
+ const partialSummaries: string[] = [];
166
+ const chunkSummaryPrefix =
167
+ "A partir do diff abaixo, extraia um resumo breve das alterações (use linguagem imperativa e em português):";
168
+
169
+ // Inicia um spinner único para todo o processo
170
+ const spinnerSummary = ora("Gerando resumo do commit.").start();
171
+
172
+ try {
173
+ for (const chunk of chunks) {
174
+ const prompt = `${chunkSummaryPrefix}\n\n${chunk}`;
175
+ const summary = await callOpenAI(prompt, 'resumo');
176
+ partialSummaries.push(summary);
177
+ }
178
+ spinnerSummary.succeed("Resumo do commit gerado.");
179
+ } catch (error) {
180
+ spinnerSummary.fail("Erro ao gerar resumo do commit.");
181
+ console.error(chalk.red('❌ Erro ao gerar resumo para o commit:'), error);
182
+ process.exit(1);
183
+ }
184
+ inputForCommit = partialSummaries.join("\n\n");
110
185
  }
111
186
 
112
- // Cria arquivos temporários para armazenar o prompt e o diff
113
- const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt');
114
- const tempDiffPath = path.join(os.tmpdir(), 'CODY_DIFF.patch');
115
- fs.writeFileSync(tempPromptPath, CODY_PROMPT);
116
- fs.writeFileSync(tempDiffPath, execSync("git diff --cached --ignore-all-space | grep '^[+-]'").toString());
187
+ // Gera a mensagem de commit com o pré-prompt e o diff (ou seus resumos).
188
+ const finalPrompt = `${COMMIT_PROMPT}\n\nDiff:\n\n${inputForCommit}`;
189
+ const spinnerCommit = ora('Gerando mensagem de commit com base no diff...').start();
117
190
 
118
- // Gera a mensagem do commit usando o diff salvo no arquivo temporário
119
191
  let generatedMessage: string;
120
192
  try {
121
- console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'));
122
- const response = execSync(
123
- `cody chat --context-file ${tempDiffPath} --stdin -m "$(cat ${tempPromptPath})"`
124
- ).toString();
125
-
126
- // Extrai o bloco de código delimitado por ``` usando regex
127
- const match = response.match(/```([\s\S]*?)```/);
128
- generatedMessage = match ? match[1].trim() : response.trim();
129
-
130
- console.log(chalk.greenBright('\n✨ Mensagem de commit gerada automaticamente:'));
131
- console.log(chalk.yellowBright(generatedMessage));
193
+ generatedMessage = await callOpenAI(finalPrompt, 'commit');
194
+ // Remove os delimitadores de bloco de código (```)
195
+ generatedMessage = generatedMessage.replace(/```/g, '').trim();
196
+ spinnerCommit.succeed('Mensagem de commit gerada com sucesso.');
132
197
  } catch (error) {
133
- console.error(chalk.red('Erro ao gerar mensagem de commit com o Cody:'), (error as Error).message);
134
- return;
135
- } finally {
136
- fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário do prompt
137
- fs.unlinkSync(tempDiffPath); // Remove o arquivo temporário do diff
198
+ spinnerCommit.fail('Erro ao gerar a mensagem de commit.');
199
+ console.error(chalk.red('❌ Erro ao gerar a mensagem de commit:'), error);
200
+ process.exit(1);
138
201
  }
139
202
 
140
- // Pergunta ao usuário se ele quer editar, confirmar ou cancelar o commit
141
- const { action }: CommitAction = await prompt([
203
+ console.log(chalk.greenBright('\n✨ Mensagem de commit gerada automaticamente:'));
204
+ console.log(chalk.yellowBright(generatedMessage));
205
+
206
+ // Pergunta ao usuário se deseja confirmar, editar ou cancelar o commit.
207
+ const promptModule = inquirer.createPromptModule();
208
+ const { action } = await promptModule<{ action: 'confirm' | 'edit' | 'cancel' }>([
142
209
  {
143
210
  type: 'list',
144
211
  name: 'action',
@@ -151,7 +218,7 @@ async function ccm(): Promise<void> {
151
218
  },
152
219
  ]);
153
220
 
154
- // Caminho temporário para salvar a mensagem gerada
221
+ // Cria um arquivo temporário para armazenar a mensagem (para edição se necessário).
155
222
  const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
156
223
  fs.writeFileSync(tempFilePath, generatedMessage);
157
224
 
@@ -161,35 +228,39 @@ async function ccm(): Promise<void> {
161
228
  try {
162
229
  execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' });
163
230
  } catch (error) {
164
- console.error(chalk.red('❌ Erro ao abrir o editor:'), (error as Error).message);
165
- return;
231
+ console.error(chalk.red('❌ Erro ao abrir o editor:'), error);
232
+ process.exit(1);
166
233
  }
167
234
  } else if (action === 'cancel') {
168
235
  console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
169
236
  fs.unlinkSync(tempFilePath);
170
- return;
237
+ process.exit(0);
171
238
  }
172
239
 
173
- // Lê a mensagem do arquivo temporário após a edição
240
+ // Lê a mensagem final (após eventual edição).
174
241
  const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim();
175
-
176
- // Verifica se a mensagem está vazia
177
242
  if (!finalMessage) {
178
- console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
243
+ console.error(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
179
244
  fs.unlinkSync(tempFilePath);
180
- return;
245
+ process.exit(1);
181
246
  }
182
247
 
183
- // Realiza o commit com a mensagem final
248
+ // Captura quaisquer argumentos adicionais passados para o comando.
249
+ const gitArgs = process.argv.slice(2).join(' ');
250
+ console.log(chalk.blue('🔍 Argumentos adicionais para o commit:'), gitArgs);
251
+
252
+ // Realiza o commit com a mensagem final.
184
253
  try {
185
- execSync(`git commit -F ${tempFilePath}`);
254
+ execSync(`git commit -F ${tempFilePath} ${gitArgs}`, { stdio: 'inherit' });
186
255
  console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
187
256
  } catch (error) {
188
- console.error(chalk.red('❌ Erro ao realizar o commit:'), (error as Error).message);
257
+ console.error(chalk.red('❌ Erro ao realizar o commit:'), error);
189
258
  } finally {
190
259
  fs.unlinkSync(tempFilePath);
191
260
  }
192
261
  }
193
262
 
194
- // Chama a função principal
195
- ccm().catch((err) => console.error(chalk.red('❌ Erro durante o commit:'), err));
263
+ main().catch((err) => {
264
+ console.error(chalk.red('❌ Erro durante o commit:'), err);
265
+ process.exit(1);
266
+ });
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env ts-node
2
- export {};
@@ -1,215 +0,0 @@
1
- #!/usr/bin/env ts-node
2
- import chalk from 'chalk';
3
- import { execSync } from 'child_process';
4
- import fs from 'fs';
5
- import inquirer from 'inquirer';
6
- import os from 'os';
7
- import path from 'path';
8
- // Função para verificar se o comando 'cody' está disponível
9
- function isCodyInstalled() {
10
- try {
11
- execSync('cody --version', { stdio: 'ignore' });
12
- return true;
13
- }
14
- catch (error) {
15
- return false;
16
- }
17
- }
18
- // Função para instalar o 'cody' automaticamente
19
- function installCody() {
20
- console.log(chalk.blue('🚀 Instalando o cody automaticamente...'));
21
- try {
22
- execSync('npm i -g @sourcegraph/cody', { stdio: 'inherit' });
23
- console.log(chalk.green('✅ Cody instalado com sucesso!'));
24
- }
25
- catch (error) {
26
- console.error(chalk.red('❌ Erro ao instalar o Cody:'), error.message);
27
- process.exit(1);
28
- }
29
- }
30
- // Verifica se o 'cody' está instalado, caso contrário, instala
31
- if (!isCodyInstalled()) {
32
- installCody();
33
- }
34
- // Função para verificar se está logado no Cody
35
- function isCodyLoggedIn() {
36
- try {
37
- execSync('cody auth whoami', { stdio: 'ignore' });
38
- return true;
39
- }
40
- catch (error) {
41
- return false;
42
- }
43
- }
44
- // Verificar se o usuário está logado no Cody, se não estiver, roda o comando para logar
45
- if (!isCodyLoggedIn()) {
46
- console.log(chalk.blue('🔑 Realize o login no Cody...'));
47
- try {
48
- execSync('cody auth login --web', { stdio: 'inherit' });
49
- }
50
- catch (error) {
51
- console.error(chalk.red('❌ Erro ao realizar o login no Cody:'), error.message);
52
- process.exit(1);
53
- }
54
- }
55
- // Função para verificar arquivos no estado staged e unstaged
56
- function getGitStatus() {
57
- const staged = execSync('git diff --name-only --cached')
58
- .toString()
59
- .trim()
60
- .split('\n')
61
- .filter(Boolean);
62
- const unstaged = execSync('git diff --name-only')
63
- .toString()
64
- .trim()
65
- .split('\n')
66
- .filter(Boolean);
67
- return { staged, unstaged };
68
- }
69
- async function ccm() {
70
- const CODY_PROMPT = `
71
- Por favor, escreva a mensagem de commit para este diff usando a convenção de Conventional Commits...
72
- `;
73
- const prompt = inquirer.createPromptModule();
74
- // Verifica se o diretório é um repositório Git
75
- try {
76
- console.log(chalk.blue('🔄 Verificando se o diretório é um repositório git...'));
77
- execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' });
78
- }
79
- catch (error) {
80
- console.error(chalk.red('❌ Este diretório não é um repositório git.'));
81
- return;
82
- }
83
- // Obtém status do git
84
- const { staged, unstaged } = getGitStatus();
85
- if (staged.length === 0 && unstaged.length === 0) {
86
- console.log(chalk.yellow('⚠️ Nenhuma modificação detectada no repositório.'));
87
- return;
88
- }
89
- if (staged.length === 0 && unstaged.length > 0) {
90
- console.log(chalk.yellow('📂 Há arquivos modificados fora da staged:'));
91
- console.log(unstaged.map((file) => ` - ${file}`).join('\n'));
92
- const { addAll } = await prompt([
93
- {
94
- type: 'confirm',
95
- name: 'addAll',
96
- message: 'Deseja adicionar todos os arquivos ao staged?',
97
- },
98
- ]);
99
- if (addAll) {
100
- execSync('git add .');
101
- console.log(chalk.green('✅ Todos os arquivos foram adicionados à staged.'));
102
- }
103
- else {
104
- console.log(chalk.red('❌ Nenhum arquivo foi adicionado à staged. Operação cancelada.'));
105
- return;
106
- }
107
- }
108
- else if (staged.length > 0 && unstaged.length > 0) {
109
- console.log(chalk.blue('📂 Arquivos na staged:'));
110
- console.log(staged.map((file) => ` - ${file}`).join('\n'));
111
- console.log(chalk.yellow('📂 Arquivos fora da staged:'));
112
- console.log(unstaged.map((file) => ` - ${file}`).join('\n'));
113
- const { addUnstaged } = await prompt([
114
- {
115
- type: 'confirm',
116
- name: 'addUnstaged',
117
- message: 'Deseja adicionar os arquivos fora da staged?',
118
- },
119
- ]);
120
- if (addUnstaged) {
121
- execSync('git add .');
122
- console.log(chalk.green('✅ Todos os arquivos foram adicionados à staged.'));
123
- }
124
- }
125
- // Confirma se há arquivos na staged após as alterações
126
- const finalStatus = getGitStatus();
127
- if (finalStatus.staged.length === 0) {
128
- console.log(chalk.red('❌ Nenhum arquivo na staged. Operação cancelada.'));
129
- return;
130
- }
131
- // Cria arquivos temporários para armazenar o prompt e o diff
132
- const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt');
133
- const tempDiffPath = path.join(os.tmpdir(), 'CODY_DIFF.patch');
134
- fs.writeFileSync(tempPromptPath, CODY_PROMPT);
135
- fs.writeFileSync(tempDiffPath, execSync('git diff --cached').toString());
136
- // Gera a mensagem do commit usando o diff salvo no arquivo temporário
137
- let generatedMessage;
138
- try {
139
- console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'));
140
- const response = execSync(`cody chat --context-file ${tempDiffPath} --stdin -m "$(cat ${tempPromptPath})"`).toString();
141
- // Extrai o bloco de código delimitado por ``` usando regex
142
- const match = response.match(/```([\s\S]*?)```/);
143
- generatedMessage = match ? match[1].trim() : response.trim();
144
- console.log(chalk.greenBright('\n✨ Mensagem de commit gerada automaticamente:'));
145
- console.log(chalk.yellowBright(generatedMessage));
146
- }
147
- catch (error) {
148
- console.error(chalk.red('❌ Erro ao gerar mensagem de commit com o Cody:'), error.message);
149
- return;
150
- }
151
- finally {
152
- fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário do prompt
153
- fs.unlinkSync(tempDiffPath); // Remove o arquivo temporário do diff
154
- }
155
- // Pergunta ao usuário se ele quer editar, confirmar ou cancelar o commit
156
- const { action } = await prompt([
157
- {
158
- type: 'list',
159
- name: 'action',
160
- message: chalk.blue.bold('O que deseja fazer com a mensagem de commit gerada?'),
161
- choices: [
162
- { name: '📌 Confirmar e commitar', value: 'confirm' },
163
- { name: '📝 Editar a mensagem antes de commitar', value: 'edit' },
164
- { name: '🚫 Cancelar o commit', value: 'cancel' },
165
- ],
166
- },
167
- ]);
168
- // Caminho temporário para salvar a mensagem gerada
169
- const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
170
- fs.writeFileSync(tempFilePath, generatedMessage);
171
- if (action === 'edit') {
172
- console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
173
- const editor = process.env.EDITOR || 'nano';
174
- try {
175
- execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' });
176
- }
177
- catch (error) {
178
- console.error(chalk.red('❌ Erro ao abrir o editor:'), error.message);
179
- return;
180
- }
181
- }
182
- else if (action === 'cancel') {
183
- console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
184
- fs.unlinkSync(tempFilePath);
185
- return;
186
- }
187
- // Lê a mensagem do arquivo temporário após a edição
188
- const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim();
189
- // Verifica se a mensagem está vazia
190
- if (!finalMessage) {
191
- console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
192
- fs.unlinkSync(tempFilePath);
193
- return;
194
- }
195
- // Realiza o commit com a mensagem final
196
- try {
197
- execSync(`git commit -F ${tempFilePath}`);
198
- console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
199
- }
200
- catch (error) {
201
- console.error(chalk.red('❌ Erro ao realizar o commit:'), error.message);
202
- }
203
- finally {
204
- fs.unlinkSync(tempFilePath);
205
- }
206
- }
207
- // Chama a função principal
208
- ccm().catch((err) => console.error(chalk.red('❌ Erro durante o commit:'), err)).finally(() => {
209
- // delete the temp files
210
- fs.unlinkSync(path.join(os.tmpdir(), 'CODY_PROMPT.txt'));
211
- fs.unlinkSync(path.join(os.tmpdir(), 'CODY_DIFF.patch'));
212
- fs.unlinkSync(path.join(os.tmpdir(), 'COMMIT_EDITMSG'));
213
- console.log(chalk.green('✅ Todos os arquivos temporários removidos.'));
214
- });
215
- //# sourceMappingURL=index%20copy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index copy.js","sourceRoot":"","sources":["../src/index copy.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env ts-node
2
- export {};
package/dist/index.js DELETED
@@ -1,180 +0,0 @@
1
- #!/usr/bin/env ts-node
2
- import chalk from 'chalk';
3
- import { execSync } from 'child_process';
4
- import fs from 'fs';
5
- import inquirer from 'inquirer';
6
- import os from 'os';
7
- import path from 'path';
8
- // Função para verificar se o comando 'cody' está disponível
9
- function isCodyInstalled() {
10
- try {
11
- execSync('cody --version', { stdio: 'ignore' });
12
- return true;
13
- }
14
- catch (error) {
15
- return false;
16
- }
17
- }
18
- // Função para instalar o 'cody' automaticamente
19
- function installCody() {
20
- console.log(chalk.blue('🚀 Instalando o cody automaticamente...'));
21
- try {
22
- execSync('npm i -g @sourcegraph/cody', { stdio: 'inherit' });
23
- console.log(chalk.green('✅ Cody instalado com sucesso!'));
24
- }
25
- catch (error) {
26
- console.error(chalk.red('❌ Erro ao instalar o Cody:'), error.message);
27
- process.exit(1);
28
- }
29
- }
30
- // Verifica se o 'cody' está instalado, caso contrário, instala
31
- if (!isCodyInstalled()) {
32
- installCody();
33
- }
34
- // Função para verificar se está logado no cody
35
- function isCodyLoggedIn() {
36
- try {
37
- execSync('cody auth whoami', { stdio: 'ignore' });
38
- return true;
39
- }
40
- catch (error) {
41
- return false;
42
- }
43
- }
44
- // Verificar se o usuário está logado no Cody, se não estiver, roda o comando para logar
45
- if (!isCodyLoggedIn()) {
46
- console.log(chalk.blue('🔑 Realize o login no Cody...'));
47
- try {
48
- execSync('cody auth login --web', { stdio: 'inherit' });
49
- }
50
- catch (error) {
51
- console.error(chalk.red('❌ Erro ao realizar o login no Cody:'), error.message);
52
- process.exit(1);
53
- }
54
- }
55
- // Define o prompt do Cody para geração da mensagem de commit
56
- const CODY_PROMPT = `
57
- 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/.
58
- A mensagem deve começar com um tipo de commit, como:
59
- feat: para novas funcionalidades
60
- fix: para correções de bugs
61
- chore: para alterações que não afetam a funcionalidade
62
- docs: para mudanças na documentação
63
- style: para alterações no estilo do código (como formatação)
64
- refactor: para alterações no código que não alteram a funcionalidade
65
- perf: para melhorias de desempenho
66
- test: para alterações nos testes
67
- ci: para mudanças no pipeline de integração contínua
68
-
69
- Exemplo:
70
- feat(auth): adicionar suporte ao login com Google
71
-
72
- 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\`:
73
- feat!(auth): reestruturar fluxo de login
74
- BREAKING CHANGE: A API de login foi alterada e não é compatível com versões anteriores.
75
-
76
- Gere também uma descrição mais detalhada do commit, se necessário.
77
-
78
- Use sempre linguagem imperativa e primeira pessoa do singular, como:
79
- - "adiciona recurso"
80
- - "corrige bug"
81
- - "remove arquivo"
82
-
83
- Lembre-se: os textos fora do Conventional Commit devem ser em português.
84
- `;
85
- async function ccm() {
86
- const prompt = inquirer.createPromptModule();
87
- // Verifica se o repositório git está inicializado
88
- try {
89
- console.log(chalk.blue('🔄 Verificando se o diretório é um repositório git...'));
90
- execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' });
91
- }
92
- catch (error) {
93
- console.error(chalk.red('❌ Este diretório não é um repositório git.'));
94
- return;
95
- }
96
- // Verifica se há alterações staged
97
- const stagedChanges = execSync('git diff --cached --name-only').toString().trim();
98
- if (!stagedChanges) {
99
- console.log(chalk.yellow('⚠️ Não há alterações staged para o commit.'));
100
- return;
101
- }
102
- // Cria arquivos temporários para armazenar o prompt e o diff
103
- const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt');
104
- const tempDiffPath = path.join(os.tmpdir(), 'CODY_DIFF.patch');
105
- fs.writeFileSync(tempPromptPath, CODY_PROMPT);
106
- fs.writeFileSync(tempDiffPath, execSync("git diff --cached --ignore-all-space | grep '^[+-]'").toString());
107
- // Gera a mensagem do commit usando o diff salvo no arquivo temporário
108
- let generatedMessage;
109
- try {
110
- console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'));
111
- const response = execSync(`cody chat --context-file ${tempDiffPath} --stdin -m "$(cat ${tempPromptPath})"`).toString();
112
- // Extrai o bloco de código delimitado por ``` usando regex
113
- const match = response.match(/```([\s\S]*?)```/);
114
- generatedMessage = match ? match[1].trim() : response.trim();
115
- console.log(chalk.greenBright('\n✨ Mensagem de commit gerada automaticamente:'));
116
- console.log(chalk.yellowBright(generatedMessage));
117
- }
118
- catch (error) {
119
- console.error(chalk.red('❌ Erro ao gerar mensagem de commit com o Cody:'), error.message);
120
- return;
121
- }
122
- finally {
123
- fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário do prompt
124
- fs.unlinkSync(tempDiffPath); // Remove o arquivo temporário do diff
125
- }
126
- // Pergunta ao usuário se ele quer editar, confirmar ou cancelar o commit
127
- const { action } = await prompt([
128
- {
129
- type: 'list',
130
- name: 'action',
131
- message: chalk.blue.bold('O que deseja fazer com a mensagem de commit gerada?'),
132
- choices: [
133
- { name: '📌 Confirmar e commitar', value: 'confirm' },
134
- { name: '📝 Editar a mensagem antes de commitar', value: 'edit' },
135
- { name: '🚫 Cancelar o commit', value: 'cancel' },
136
- ],
137
- },
138
- ]);
139
- // Caminho temporário para salvar a mensagem gerada
140
- const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
141
- fs.writeFileSync(tempFilePath, generatedMessage);
142
- if (action === 'edit') {
143
- console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
144
- const editor = process.env.EDITOR || 'nano';
145
- try {
146
- execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' });
147
- }
148
- catch (error) {
149
- console.error(chalk.red('❌ Erro ao abrir o editor:'), error.message);
150
- return;
151
- }
152
- }
153
- else if (action === 'cancel') {
154
- console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
155
- fs.unlinkSync(tempFilePath);
156
- return;
157
- }
158
- // Lê a mensagem do arquivo temporário após a edição
159
- const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim();
160
- // Verifica se a mensagem está vazia
161
- if (!finalMessage) {
162
- console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
163
- fs.unlinkSync(tempFilePath);
164
- return;
165
- }
166
- // Realiza o commit com a mensagem final
167
- try {
168
- execSync(`git commit -F ${tempFilePath}`);
169
- console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
170
- }
171
- catch (error) {
172
- console.error(chalk.red('❌ Erro ao realizar o commit:'), error.message);
173
- }
174
- finally {
175
- fs.unlinkSync(tempFilePath);
176
- }
177
- }
178
- // Chama a função principal
179
- ccm().catch((err) => console.error(chalk.red('❌ Erro durante o commit:'), err));
180
- //# 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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"}