@gilbert_oliveira/commit-wizard 1.0.4 → 1.0.6
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 copy.d.ts +2 -0
- package/dist/index copy.js +215 -0
- package/dist/index copy.js.map +1 -0
- package/dist/index.js +25 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +77 -79
|
@@ -0,0 +1,215 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index copy.js","sourceRoot":"","sources":["../src/index copy.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import path from 'path';
|
|
|
8
8
|
// Função para verificar se o comando 'cody' está disponível
|
|
9
9
|
function isCodyInstalled() {
|
|
10
10
|
try {
|
|
11
|
-
execSync('cody --version', { stdio: 'ignore' });
|
|
11
|
+
execSync('cody --version', { stdio: 'ignore' });
|
|
12
12
|
return true;
|
|
13
13
|
}
|
|
14
14
|
catch (error) {
|
|
@@ -19,37 +19,37 @@ function isCodyInstalled() {
|
|
|
19
19
|
function installCody() {
|
|
20
20
|
console.log(chalk.blue('🚀 Instalando o cody automaticamente...'));
|
|
21
21
|
try {
|
|
22
|
-
execSync('npm i -g @sourcegraph/cody', { stdio: 'inherit' });
|
|
22
|
+
execSync('npm i -g @sourcegraph/cody', { stdio: 'inherit' });
|
|
23
23
|
console.log(chalk.green('✅ Cody instalado com sucesso!'));
|
|
24
24
|
}
|
|
25
25
|
catch (error) {
|
|
26
26
|
console.error(chalk.red('❌ Erro ao instalar o Cody:'), error.message);
|
|
27
|
-
process.exit(1);
|
|
27
|
+
process.exit(1);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
// Verifica se o 'cody' está instalado, caso contrário, instala
|
|
31
31
|
if (!isCodyInstalled()) {
|
|
32
32
|
installCody();
|
|
33
33
|
}
|
|
34
|
-
// Função para verificar se
|
|
34
|
+
// Função para verificar se está logado no cody
|
|
35
35
|
function isCodyLoggedIn() {
|
|
36
36
|
try {
|
|
37
|
-
execSync('cody auth whoami', { stdio: 'ignore' });
|
|
37
|
+
execSync('cody auth whoami', { stdio: 'ignore' });
|
|
38
38
|
return true;
|
|
39
39
|
}
|
|
40
40
|
catch (error) {
|
|
41
41
|
return false;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
-
// Verificar se o usuário está logado no Cody se
|
|
44
|
+
// Verificar se o usuário está logado no Cody, se não estiver, roda o comando para logar
|
|
45
45
|
if (!isCodyLoggedIn()) {
|
|
46
46
|
console.log(chalk.blue('🔑 Realize o login no Cody...'));
|
|
47
47
|
try {
|
|
48
|
-
execSync('cody auth login --web', { stdio: 'inherit' });
|
|
48
|
+
execSync('cody auth login --web', { stdio: 'inherit' });
|
|
49
49
|
}
|
|
50
50
|
catch (error) {
|
|
51
51
|
console.error(chalk.red('❌ Erro ao realizar o login no Cody:'), error.message);
|
|
52
|
-
process.exit(1);
|
|
52
|
+
process.exit(1);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
// Define o prompt do Cody para geração da mensagem de commit
|
|
@@ -84,7 +84,7 @@ Lembre-se: os textos fora do Conventional Commit devem ser em português.
|
|
|
84
84
|
`;
|
|
85
85
|
async function ccm() {
|
|
86
86
|
const prompt = inquirer.createPromptModule();
|
|
87
|
-
//
|
|
87
|
+
// Verifica se o repositório git está inicializado
|
|
88
88
|
try {
|
|
89
89
|
console.log(chalk.blue('🔄 Verificando se o diretório é um repositório git...'));
|
|
90
90
|
execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' });
|
|
@@ -93,16 +93,22 @@ async function ccm() {
|
|
|
93
93
|
console.error(chalk.red('❌ Este diretório não é um repositório git.'));
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
96
|
-
//
|
|
97
|
-
execSync('git
|
|
98
|
-
|
|
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
|
|
99
103
|
const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt');
|
|
104
|
+
const tempDiffPath = path.join(os.tmpdir(), 'CODY_DIFF.patch');
|
|
100
105
|
fs.writeFileSync(tempPromptPath, CODY_PROMPT);
|
|
101
|
-
|
|
106
|
+
fs.writeFileSync(tempDiffPath, execSync('git diff --cached').toString());
|
|
107
|
+
// Gera a mensagem do commit usando o diff salvo no arquivo temporário
|
|
102
108
|
let generatedMessage;
|
|
103
109
|
try {
|
|
104
110
|
console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'));
|
|
105
|
-
const response = execSync(`
|
|
111
|
+
const response = execSync(`cody chat --context-file ${tempDiffPath} --stdin -m "$(cat ${tempPromptPath})"`).toString();
|
|
106
112
|
// Extrai o bloco de código delimitado por ``` usando regex
|
|
107
113
|
const match = response.match(/```([\s\S]*?)```/);
|
|
108
114
|
generatedMessage = match ? match[1].trim() : response.trim();
|
|
@@ -114,7 +120,8 @@ async function ccm() {
|
|
|
114
120
|
return;
|
|
115
121
|
}
|
|
116
122
|
finally {
|
|
117
|
-
fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário
|
|
123
|
+
fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário do prompt
|
|
124
|
+
fs.unlinkSync(tempDiffPath); // Remove o arquivo temporário do diff
|
|
118
125
|
}
|
|
119
126
|
// Pergunta ao usuário se ele quer editar, confirmar ou cancelar o commit
|
|
120
127
|
const { action } = await prompt([
|
|
@@ -131,7 +138,6 @@ async function ccm() {
|
|
|
131
138
|
]);
|
|
132
139
|
// Caminho temporário para salvar a mensagem gerada
|
|
133
140
|
const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
|
|
134
|
-
// Salva a mensagem gerada no arquivo temporário
|
|
135
141
|
fs.writeFileSync(tempFilePath, generatedMessage);
|
|
136
142
|
if (action === 'edit') {
|
|
137
143
|
console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
|
|
@@ -146,7 +152,7 @@ async function ccm() {
|
|
|
146
152
|
}
|
|
147
153
|
else if (action === 'cancel') {
|
|
148
154
|
console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
|
|
149
|
-
fs.unlinkSync(tempFilePath);
|
|
155
|
+
fs.unlinkSync(tempFilePath);
|
|
150
156
|
return;
|
|
151
157
|
}
|
|
152
158
|
// Lê a mensagem do arquivo temporário após a edição
|
|
@@ -154,7 +160,7 @@ async function ccm() {
|
|
|
154
160
|
// Verifica se a mensagem está vazia
|
|
155
161
|
if (!finalMessage) {
|
|
156
162
|
console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
|
|
157
|
-
fs.unlinkSync(tempFilePath);
|
|
163
|
+
fs.unlinkSync(tempFilePath);
|
|
158
164
|
return;
|
|
159
165
|
}
|
|
160
166
|
// Realiza o commit com a mensagem final
|
|
@@ -166,7 +172,7 @@ async function ccm() {
|
|
|
166
172
|
console.error(chalk.red('❌ Erro ao realizar o commit:'), error.message);
|
|
167
173
|
}
|
|
168
174
|
finally {
|
|
169
|
-
fs.unlinkSync(tempFilePath);
|
|
175
|
+
fs.unlinkSync(tempFilePath);
|
|
170
176
|
}
|
|
171
177
|
}
|
|
172
178
|
// Chama a função principal
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gilbert_oliveira/commit-wizard",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
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",
|
package/src/index.ts
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
1
|
#!/usr/bin/env ts-node
|
|
2
2
|
|
|
3
|
-
import chalk from 'chalk'
|
|
4
|
-
import { execSync } from 'child_process'
|
|
5
|
-
import fs from 'fs'
|
|
6
|
-
import inquirer from 'inquirer'
|
|
7
|
-
import os from 'os'
|
|
8
|
-
import path from 'path'
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import inquirer from 'inquirer';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
import path from 'path';
|
|
9
9
|
|
|
10
10
|
// Função para verificar se o comando 'cody' está disponível
|
|
11
11
|
function isCodyInstalled(): boolean {
|
|
12
12
|
try {
|
|
13
|
-
execSync('cody --version', { stdio: 'ignore' })
|
|
14
|
-
return true
|
|
13
|
+
execSync('cody --version', { stdio: 'ignore' });
|
|
14
|
+
return true;
|
|
15
15
|
} catch (error) {
|
|
16
|
-
return false
|
|
16
|
+
return false;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
// Função para instalar o 'cody' automaticamente
|
|
21
21
|
function installCody(): void {
|
|
22
|
-
console.log(chalk.blue('🚀 Instalando o cody automaticamente...'))
|
|
22
|
+
console.log(chalk.blue('🚀 Instalando o cody automaticamente...'));
|
|
23
23
|
try {
|
|
24
|
-
execSync('npm i -g @sourcegraph/cody', { stdio: 'inherit' })
|
|
25
|
-
console.log(chalk.green('✅ Cody instalado com sucesso!'))
|
|
24
|
+
execSync('npm i -g @sourcegraph/cody', { stdio: 'inherit' });
|
|
25
|
+
console.log(chalk.green('✅ Cody instalado com sucesso!'));
|
|
26
26
|
} catch (error) {
|
|
27
|
-
console.error(chalk.red('❌ Erro ao instalar o Cody:'), (error as Error).message)
|
|
28
|
-
process.exit(1)
|
|
27
|
+
console.error(chalk.red('❌ Erro ao instalar o Cody:'), (error as Error).message);
|
|
28
|
+
process.exit(1);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
// Verifica se o 'cody' está instalado, caso contrário, instala
|
|
33
33
|
if (!isCodyInstalled()) {
|
|
34
|
-
installCody()
|
|
34
|
+
installCody();
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
// Função para verificar se
|
|
37
|
+
// Função para verificar se está logado no cody
|
|
38
38
|
function isCodyLoggedIn(): boolean {
|
|
39
39
|
try {
|
|
40
|
-
execSync('cody auth whoami', { stdio: 'ignore' })
|
|
41
|
-
return true
|
|
40
|
+
execSync('cody auth whoami', { stdio: 'ignore' });
|
|
41
|
+
return true;
|
|
42
42
|
} catch (error) {
|
|
43
|
-
return false
|
|
43
|
+
return false;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
// Verificar se o usuário está logado no Cody se
|
|
47
|
+
// Verificar se o usuário está logado no Cody, se não estiver, roda o comando para logar
|
|
48
48
|
if (!isCodyLoggedIn()) {
|
|
49
|
-
console.log(chalk.blue('🔑 Realize o login no Cody...'))
|
|
49
|
+
console.log(chalk.blue('🔑 Realize o login no Cody...'));
|
|
50
50
|
try {
|
|
51
|
-
execSync('cody auth login --web', { stdio: 'inherit' })
|
|
51
|
+
execSync('cody auth login --web', { stdio: 'inherit' });
|
|
52
52
|
} catch (error) {
|
|
53
|
-
console.error(chalk.red('❌ Erro ao realizar o login no Cody:'), (error as Error).message)
|
|
54
|
-
process.exit(1)
|
|
53
|
+
console.error(chalk.red('❌ Erro ao realizar o login no Cody:'), (error as Error).message);
|
|
54
|
+
process.exit(1);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -84,55 +84,57 @@ Use sempre linguagem imperativa e primeira pessoa do singular, como:
|
|
|
84
84
|
- "remove arquivo"
|
|
85
85
|
|
|
86
86
|
Lembre-se: os textos fora do Conventional Commit devem ser em português.
|
|
87
|
-
|
|
87
|
+
`;
|
|
88
88
|
|
|
89
89
|
interface CommitAction {
|
|
90
|
-
action: 'confirm' | 'edit' | 'cancel'
|
|
90
|
+
action: 'confirm' | 'edit' | 'cancel';
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
async function ccm(): Promise<void> {
|
|
94
|
-
const prompt = inquirer.createPromptModule()
|
|
94
|
+
const prompt = inquirer.createPromptModule();
|
|
95
95
|
|
|
96
|
-
//
|
|
96
|
+
// Verifica se o repositório git está inicializado
|
|
97
97
|
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' })
|
|
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' });
|
|
100
100
|
} catch (error) {
|
|
101
|
-
console.error(chalk.red('❌ Este diretório não é um repositório git.'))
|
|
102
|
-
return
|
|
101
|
+
console.error(chalk.red('❌ Este diretório não é um repositório git.'));
|
|
102
|
+
return;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
//
|
|
106
|
-
execSync('git
|
|
105
|
+
// Verifica se há 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;
|
|
110
|
+
}
|
|
107
111
|
|
|
108
|
-
// Cria
|
|
109
|
-
const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt')
|
|
110
|
-
|
|
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').toString());
|
|
111
117
|
|
|
112
|
-
// Gera a mensagem do commit usando o diff
|
|
113
|
-
let generatedMessage: string
|
|
118
|
+
// Gera a mensagem do commit usando o diff salvo no arquivo temporário
|
|
119
|
+
let generatedMessage: string;
|
|
114
120
|
try {
|
|
115
|
-
console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'))
|
|
121
|
+
console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'));
|
|
116
122
|
const response = execSync(
|
|
117
|
-
`
|
|
118
|
-
).toString()
|
|
123
|
+
`cody chat --context-file ${tempDiffPath} --stdin -m "$(cat ${tempPromptPath})"`
|
|
124
|
+
).toString();
|
|
119
125
|
|
|
120
126
|
// Extrai o bloco de código delimitado por ``` usando regex
|
|
121
|
-
const match = response.match(/```([\s\S]*?)```/)
|
|
122
|
-
generatedMessage = match ? match[1].trim() : response.trim()
|
|
127
|
+
const match = response.match(/```([\s\S]*?)```/);
|
|
128
|
+
generatedMessage = match ? match[1].trim() : response.trim();
|
|
123
129
|
|
|
124
|
-
console.log(
|
|
125
|
-
|
|
126
|
-
)
|
|
127
|
-
console.log(chalk.yellowBright(generatedMessage))
|
|
130
|
+
console.log(chalk.greenBright('\n✨ Mensagem de commit gerada automaticamente:'));
|
|
131
|
+
console.log(chalk.yellowBright(generatedMessage));
|
|
128
132
|
} catch (error) {
|
|
129
|
-
console.error(
|
|
130
|
-
|
|
131
|
-
(error as Error).message,
|
|
132
|
-
)
|
|
133
|
-
return
|
|
133
|
+
console.error(chalk.red('❌ Erro ao gerar mensagem de commit com o Cody:'), (error as Error).message);
|
|
134
|
+
return;
|
|
134
135
|
} finally {
|
|
135
|
-
fs.unlinkSync(tempPromptPath) // Remove o arquivo temporário
|
|
136
|
+
fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário do prompt
|
|
137
|
+
fs.unlinkSync(tempDiffPath); // Remove o arquivo temporário do diff
|
|
136
138
|
}
|
|
137
139
|
|
|
138
140
|
// Pergunta ao usuário se ele quer editar, confirmar ou cancelar o commit
|
|
@@ -140,58 +142,54 @@ async function ccm(): Promise<void> {
|
|
|
140
142
|
{
|
|
141
143
|
type: 'list',
|
|
142
144
|
name: 'action',
|
|
143
|
-
message: chalk.blue.bold(
|
|
144
|
-
'O que deseja fazer com a mensagem de commit gerada?',
|
|
145
|
-
),
|
|
145
|
+
message: chalk.blue.bold('O que deseja fazer com a mensagem de commit gerada?'),
|
|
146
146
|
choices: [
|
|
147
147
|
{ name: '📌 Confirmar e commitar', value: 'confirm' },
|
|
148
148
|
{ name: '📝 Editar a mensagem antes de commitar', value: 'edit' },
|
|
149
149
|
{ name: '🚫 Cancelar o commit', value: 'cancel' },
|
|
150
150
|
],
|
|
151
151
|
},
|
|
152
|
-
])
|
|
152
|
+
]);
|
|
153
153
|
|
|
154
154
|
// Caminho temporário para salvar a mensagem gerada
|
|
155
|
-
const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG')
|
|
156
|
-
|
|
157
|
-
// Salva a mensagem gerada no arquivo temporário
|
|
158
|
-
fs.writeFileSync(tempFilePath, generatedMessage)
|
|
155
|
+
const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
|
|
156
|
+
fs.writeFileSync(tempFilePath, generatedMessage);
|
|
159
157
|
|
|
160
158
|
if (action === 'edit') {
|
|
161
|
-
console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'))
|
|
162
|
-
const editor = process.env.EDITOR || 'nano'
|
|
159
|
+
console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
|
|
160
|
+
const editor = process.env.EDITOR || 'nano';
|
|
163
161
|
try {
|
|
164
|
-
execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' })
|
|
162
|
+
execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' });
|
|
165
163
|
} catch (error) {
|
|
166
|
-
console.error(chalk.red('❌ Erro ao abrir o editor:'), (error as Error).message)
|
|
167
|
-
return
|
|
164
|
+
console.error(chalk.red('❌ Erro ao abrir o editor:'), (error as Error).message);
|
|
165
|
+
return;
|
|
168
166
|
}
|
|
169
167
|
} else if (action === 'cancel') {
|
|
170
|
-
console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'))
|
|
171
|
-
fs.unlinkSync(tempFilePath)
|
|
172
|
-
return
|
|
168
|
+
console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
|
|
169
|
+
fs.unlinkSync(tempFilePath);
|
|
170
|
+
return;
|
|
173
171
|
}
|
|
174
172
|
|
|
175
173
|
// Lê a mensagem do arquivo temporário após a edição
|
|
176
|
-
const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim()
|
|
174
|
+
const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim();
|
|
177
175
|
|
|
178
176
|
// Verifica se a mensagem está vazia
|
|
179
177
|
if (!finalMessage) {
|
|
180
|
-
console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'))
|
|
181
|
-
fs.unlinkSync(tempFilePath)
|
|
182
|
-
return
|
|
178
|
+
console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
|
|
179
|
+
fs.unlinkSync(tempFilePath);
|
|
180
|
+
return;
|
|
183
181
|
}
|
|
184
182
|
|
|
185
183
|
// Realiza o commit com a mensagem final
|
|
186
184
|
try {
|
|
187
|
-
execSync(`git commit -F ${tempFilePath}`)
|
|
188
|
-
console.log(chalk.green.bold('✅ Commit realizado com sucesso.'))
|
|
185
|
+
execSync(`git commit -F ${tempFilePath}`);
|
|
186
|
+
console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
|
|
189
187
|
} catch (error) {
|
|
190
|
-
console.error(chalk.red('❌ Erro ao realizar o commit:'), (error as Error).message)
|
|
188
|
+
console.error(chalk.red('❌ Erro ao realizar o commit:'), (error as Error).message);
|
|
191
189
|
} finally {
|
|
192
|
-
fs.unlinkSync(tempFilePath)
|
|
190
|
+
fs.unlinkSync(tempFilePath);
|
|
193
191
|
}
|
|
194
192
|
}
|
|
195
193
|
|
|
196
194
|
// Chama a função principal
|
|
197
|
-
ccm().catch((err) => console.error(chalk.red('❌ Erro durante o commit:'), err))
|
|
195
|
+
ccm().catch((err) => console.error(chalk.red('❌ Erro durante o commit:'), err));
|