@gilbert_oliveira/commit-wizard 1.0.3 → 1.0.5
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/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/index.js +18 -16
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +71 -77
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) [year] [Full name]
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -23,3 +23,36 @@ Para instalar o Commit Wizard globalmente, execute o seguinte comando:
|
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
npm install -g @gilbert_oliveira/commit-wizard
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Instalação Local
|
|
29
|
+
|
|
30
|
+
Para instalar o Commit Wizard localmente, execute o seguinte comando:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install @gilbert_oliveira/commit-wizard
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Uso
|
|
37
|
+
|
|
38
|
+
Para usar o Commit Wizard, execute o seguinte comando no terminal:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
commit-wizard
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
O Commit Wizard irá gerar uma mensagem de commit com base nas mudanças no repositório Git e na convenção de **Conventional Commits**. Você pode editar a mensagem gerada ou confirmá-la.
|
|
45
|
+
|
|
46
|
+
## Contribuição
|
|
47
|
+
|
|
48
|
+
Se você quiser contribuir com o Commit Wizard, siga as instruções abaixo:
|
|
49
|
+
|
|
50
|
+
1. Faça um fork do repositório.
|
|
51
|
+
2. Crie uma nova branch com a sua feature: `git checkout -b my-feature`
|
|
52
|
+
3. Faça o commit das suas alterações: `git commit -m 'feat: My new feature'`
|
|
53
|
+
4. Faça o push para a sua branch: `git push origin my-feature`
|
|
54
|
+
5. Abra um Pull Request
|
|
55
|
+
|
|
56
|
+
## Licença
|
|
57
|
+
|
|
58
|
+
Este projeto está licenciado sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.
|
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
|
|
@@ -95,14 +95,16 @@ async function ccm() {
|
|
|
95
95
|
}
|
|
96
96
|
// Adiciona todos os arquivos modificados ao índice
|
|
97
97
|
execSync('git add .');
|
|
98
|
-
// Cria
|
|
98
|
+
// Cria arquivos temporários para armazenar o prompt e o diff
|
|
99
99
|
const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt');
|
|
100
|
+
const tempDiffPath = path.join(os.tmpdir(), 'CODY_DIFF.patch');
|
|
100
101
|
fs.writeFileSync(tempPromptPath, CODY_PROMPT);
|
|
101
|
-
|
|
102
|
+
fs.writeFileSync(tempDiffPath, execSync('git diff --cached').toString());
|
|
103
|
+
// Gera a mensagem do commit usando o diff salvo no arquivo temporário
|
|
102
104
|
let generatedMessage;
|
|
103
105
|
try {
|
|
104
106
|
console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'));
|
|
105
|
-
const response = execSync(`
|
|
107
|
+
const response = execSync(`cody chat --context-file ${tempDiffPath} --stdin -m "$(cat ${tempPromptPath})"`).toString();
|
|
106
108
|
// Extrai o bloco de código delimitado por ``` usando regex
|
|
107
109
|
const match = response.match(/```([\s\S]*?)```/);
|
|
108
110
|
generatedMessage = match ? match[1].trim() : response.trim();
|
|
@@ -114,7 +116,8 @@ async function ccm() {
|
|
|
114
116
|
return;
|
|
115
117
|
}
|
|
116
118
|
finally {
|
|
117
|
-
fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário
|
|
119
|
+
fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário do prompt
|
|
120
|
+
fs.unlinkSync(tempDiffPath); // Remove o arquivo temporário do diff
|
|
118
121
|
}
|
|
119
122
|
// Pergunta ao usuário se ele quer editar, confirmar ou cancelar o commit
|
|
120
123
|
const { action } = await prompt([
|
|
@@ -131,7 +134,6 @@ async function ccm() {
|
|
|
131
134
|
]);
|
|
132
135
|
// Caminho temporário para salvar a mensagem gerada
|
|
133
136
|
const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
|
|
134
|
-
// Salva a mensagem gerada no arquivo temporário
|
|
135
137
|
fs.writeFileSync(tempFilePath, generatedMessage);
|
|
136
138
|
if (action === 'edit') {
|
|
137
139
|
console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
|
|
@@ -146,7 +148,7 @@ async function ccm() {
|
|
|
146
148
|
}
|
|
147
149
|
else if (action === 'cancel') {
|
|
148
150
|
console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
|
|
149
|
-
fs.unlinkSync(tempFilePath);
|
|
151
|
+
fs.unlinkSync(tempFilePath);
|
|
150
152
|
return;
|
|
151
153
|
}
|
|
152
154
|
// Lê a mensagem do arquivo temporário após a edição
|
|
@@ -154,7 +156,7 @@ async function ccm() {
|
|
|
154
156
|
// Verifica se a mensagem está vazia
|
|
155
157
|
if (!finalMessage) {
|
|
156
158
|
console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
|
|
157
|
-
fs.unlinkSync(tempFilePath);
|
|
159
|
+
fs.unlinkSync(tempFilePath);
|
|
158
160
|
return;
|
|
159
161
|
}
|
|
160
162
|
// Realiza o commit com a mensagem final
|
|
@@ -166,7 +168,7 @@ async function ccm() {
|
|
|
166
168
|
console.error(chalk.red('❌ Erro ao realizar o commit:'), error.message);
|
|
167
169
|
}
|
|
168
170
|
finally {
|
|
169
|
-
fs.unlinkSync(tempFilePath);
|
|
171
|
+
fs.unlinkSync(tempFilePath);
|
|
170
172
|
}
|
|
171
173
|
}
|
|
172
174
|
// 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.5",
|
|
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",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"lint-staged"
|
|
29
29
|
],
|
|
30
30
|
"author": "Gilbert Oliveira",
|
|
31
|
-
"license": "
|
|
31
|
+
"license": "MIT",
|
|
32
32
|
"bugs": {
|
|
33
33
|
"url": "https://github.com/gilbert-oliveira/commit-wizard/issues"
|
|
34
34
|
},
|
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,53 @@ 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
105
|
// Adiciona todos os arquivos modificados ao índice
|
|
106
|
-
execSync('git add .')
|
|
106
|
+
execSync('git add .');
|
|
107
107
|
|
|
108
|
-
// Cria
|
|
109
|
-
const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt')
|
|
110
|
-
|
|
108
|
+
// Cria arquivos temporários para armazenar o prompt e o diff
|
|
109
|
+
const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt');
|
|
110
|
+
const tempDiffPath = path.join(os.tmpdir(), 'CODY_DIFF.patch');
|
|
111
|
+
fs.writeFileSync(tempPromptPath, CODY_PROMPT);
|
|
112
|
+
fs.writeFileSync(tempDiffPath, execSync('git diff --cached').toString());
|
|
111
113
|
|
|
112
|
-
// Gera a mensagem do commit usando o diff
|
|
113
|
-
let generatedMessage: string
|
|
114
|
+
// Gera a mensagem do commit usando o diff salvo no arquivo temporário
|
|
115
|
+
let generatedMessage: string;
|
|
114
116
|
try {
|
|
115
|
-
console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'))
|
|
117
|
+
console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'));
|
|
116
118
|
const response = execSync(
|
|
117
|
-
`
|
|
118
|
-
).toString()
|
|
119
|
+
`cody chat --context-file ${tempDiffPath} --stdin -m "$(cat ${tempPromptPath})"`
|
|
120
|
+
).toString();
|
|
119
121
|
|
|
120
122
|
// 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()
|
|
123
|
+
const match = response.match(/```([\s\S]*?)```/);
|
|
124
|
+
generatedMessage = match ? match[1].trim() : response.trim();
|
|
123
125
|
|
|
124
|
-
console.log(
|
|
125
|
-
|
|
126
|
-
)
|
|
127
|
-
console.log(chalk.yellowBright(generatedMessage))
|
|
126
|
+
console.log(chalk.greenBright('\n✨ Mensagem de commit gerada automaticamente:'));
|
|
127
|
+
console.log(chalk.yellowBright(generatedMessage));
|
|
128
128
|
} catch (error) {
|
|
129
|
-
console.error(
|
|
130
|
-
|
|
131
|
-
(error as Error).message,
|
|
132
|
-
)
|
|
133
|
-
return
|
|
129
|
+
console.error(chalk.red('❌ Erro ao gerar mensagem de commit com o Cody:'), (error as Error).message);
|
|
130
|
+
return;
|
|
134
131
|
} finally {
|
|
135
|
-
fs.unlinkSync(tempPromptPath) // Remove o arquivo temporário
|
|
132
|
+
fs.unlinkSync(tempPromptPath); // Remove o arquivo temporário do prompt
|
|
133
|
+
fs.unlinkSync(tempDiffPath); // Remove o arquivo temporário do diff
|
|
136
134
|
}
|
|
137
135
|
|
|
138
136
|
// Pergunta ao usuário se ele quer editar, confirmar ou cancelar o commit
|
|
@@ -140,58 +138,54 @@ async function ccm(): Promise<void> {
|
|
|
140
138
|
{
|
|
141
139
|
type: 'list',
|
|
142
140
|
name: 'action',
|
|
143
|
-
message: chalk.blue.bold(
|
|
144
|
-
'O que deseja fazer com a mensagem de commit gerada?',
|
|
145
|
-
),
|
|
141
|
+
message: chalk.blue.bold('O que deseja fazer com a mensagem de commit gerada?'),
|
|
146
142
|
choices: [
|
|
147
143
|
{ name: '📌 Confirmar e commitar', value: 'confirm' },
|
|
148
144
|
{ name: '📝 Editar a mensagem antes de commitar', value: 'edit' },
|
|
149
145
|
{ name: '🚫 Cancelar o commit', value: 'cancel' },
|
|
150
146
|
],
|
|
151
147
|
},
|
|
152
|
-
])
|
|
148
|
+
]);
|
|
153
149
|
|
|
154
150
|
// 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)
|
|
151
|
+
const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG');
|
|
152
|
+
fs.writeFileSync(tempFilePath, generatedMessage);
|
|
159
153
|
|
|
160
154
|
if (action === 'edit') {
|
|
161
|
-
console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'))
|
|
162
|
-
const editor = process.env.EDITOR || 'nano'
|
|
155
|
+
console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'));
|
|
156
|
+
const editor = process.env.EDITOR || 'nano';
|
|
163
157
|
try {
|
|
164
|
-
execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' })
|
|
158
|
+
execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' });
|
|
165
159
|
} catch (error) {
|
|
166
|
-
console.error(chalk.red('❌ Erro ao abrir o editor:'), (error as Error).message)
|
|
167
|
-
return
|
|
160
|
+
console.error(chalk.red('❌ Erro ao abrir o editor:'), (error as Error).message);
|
|
161
|
+
return;
|
|
168
162
|
}
|
|
169
163
|
} else if (action === 'cancel') {
|
|
170
|
-
console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'))
|
|
171
|
-
fs.unlinkSync(tempFilePath)
|
|
172
|
-
return
|
|
164
|
+
console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'));
|
|
165
|
+
fs.unlinkSync(tempFilePath);
|
|
166
|
+
return;
|
|
173
167
|
}
|
|
174
168
|
|
|
175
169
|
// Lê a mensagem do arquivo temporário após a edição
|
|
176
|
-
const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim()
|
|
170
|
+
const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim();
|
|
177
171
|
|
|
178
172
|
// Verifica se a mensagem está vazia
|
|
179
173
|
if (!finalMessage) {
|
|
180
|
-
console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'))
|
|
181
|
-
fs.unlinkSync(tempFilePath)
|
|
182
|
-
return
|
|
174
|
+
console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'));
|
|
175
|
+
fs.unlinkSync(tempFilePath);
|
|
176
|
+
return;
|
|
183
177
|
}
|
|
184
178
|
|
|
185
179
|
// Realiza o commit com a mensagem final
|
|
186
180
|
try {
|
|
187
|
-
execSync(`git commit -F ${tempFilePath}`)
|
|
188
|
-
console.log(chalk.green.bold('✅ Commit realizado com sucesso.'))
|
|
181
|
+
execSync(`git commit -F ${tempFilePath}`);
|
|
182
|
+
console.log(chalk.green.bold('✅ Commit realizado com sucesso.'));
|
|
189
183
|
} catch (error) {
|
|
190
|
-
console.error(chalk.red('❌ Erro ao realizar o commit:'), (error as Error).message)
|
|
184
|
+
console.error(chalk.red('❌ Erro ao realizar o commit:'), (error as Error).message);
|
|
191
185
|
} finally {
|
|
192
|
-
fs.unlinkSync(tempFilePath)
|
|
186
|
+
fs.unlinkSync(tempFilePath);
|
|
193
187
|
}
|
|
194
188
|
}
|
|
195
189
|
|
|
196
190
|
// Chama a função principal
|
|
197
|
-
ccm().catch((err) => console.error(chalk.red('❌ Erro durante o commit:'), err))
|
|
191
|
+
ccm().catch((err) => console.error(chalk.red('❌ Erro durante o commit:'), err));
|