@gilbert_oliveira/commit-wizard 1.0.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/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # Commit Wizard
2
+
3
+ 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.
4
+
5
+ ## Funcionalidades
6
+
7
+ - Geração automática de mensagens de commit com base nas mudanças de código.
8
+ - Suporte para edição de mensagens de commit antes de realizar o commit final.
9
+ - Suporte para commits de **breaking change** (alterações significativas) com formatação correta.
10
+ - Personalização da mensagem de commit gerada com base no código alterado.
11
+
12
+ ## Instalação
13
+
14
+ Para instalar o **Commit Wizard** globalmente com npnm, execute o seguinte comando:
15
+
16
+ ```bash
17
+ npm install -g commit-wizard
package/index.ts ADDED
@@ -0,0 +1,195 @@
1
+ import chalk from 'chalk'
2
+ import { execSync } from 'child_process'
3
+ import fs from 'fs'
4
+ import inquirer from 'inquirer'
5
+ import os from 'os'
6
+ import path from 'path'
7
+
8
+ // Função para verificar se o comando 'cody' está disponível
9
+ function isCodyInstalled(): boolean {
10
+ try {
11
+ execSync('cody --version', { stdio: 'ignore' }) // Tentando rodar o comando `cody --version`
12
+ return true
13
+ } catch (error) {
14
+ return false
15
+ }
16
+ }
17
+
18
+ // Função para instalar o 'cody' automaticamente
19
+ function installCody(): void {
20
+ console.log(chalk.blue('🚀 Instalando o cody automaticamente...'))
21
+ try {
22
+ execSync('npm i -g @sourcegraph/cody', { stdio: 'inherit' }) // Instalando globalmente com npm
23
+ console.log(chalk.green('✅ Cody instalado com sucesso!'))
24
+ } catch (error) {
25
+ console.error(chalk.red('❌ Erro ao instalar o Cody:'), (error as Error).message)
26
+ process.exit(1) // Finaliza o processo em caso de erro
27
+ }
28
+ }
29
+
30
+ // Verifica se o 'cody' está instalado, caso contrário, instala
31
+ if (!isCodyInstalled()) {
32
+ installCody()
33
+ }
34
+
35
+ // Função para verificar se esta logado no cody
36
+ function isCodyLoggedIn(): boolean {
37
+ try {
38
+ execSync('cody auth whoami', { stdio: 'ignore' }) // Tentando rodar o comando `cody auth whoami`
39
+ return true
40
+ } catch (error) {
41
+ return false
42
+ }
43
+ }
44
+
45
+ // Verificar se o usuário está logado no Cody se nao estiver roda o comando para logar
46
+ if (!isCodyLoggedIn()) {
47
+ console.log(chalk.blue('🔑 Realize o login no Cody...'))
48
+ try {
49
+ execSync('cody auth login --web', { stdio: 'inherit' }) // Rodando o comando `cody auth login`
50
+ } catch (error) {
51
+ console.error(chalk.red('❌ Erro ao realizar o login no Cody:'), (error as Error).message)
52
+ process.exit(1) // Finaliza o processo em caso de erro
53
+ }
54
+ }
55
+
56
+ // Define o prompt do Cody para geração da mensagem de commit
57
+ const CODY_PROMPT = `
58
+ 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/.
59
+ A mensagem deve começar com um tipo de commit, como:
60
+ feat: para novas funcionalidades
61
+ fix: para correções de bugs
62
+ chore: para alterações que não afetam a funcionalidade
63
+ docs: para mudanças na documentação
64
+ style: para alterações no estilo do código (como formatação)
65
+ refactor: para alterações no código que não alteram a funcionalidade
66
+ perf: para melhorias de desempenho
67
+ test: para alterações nos testes
68
+ ci: para mudanças no pipeline de integração contínua
69
+
70
+ Exemplo:
71
+ feat(auth): adicionar suporte ao login com Google
72
+
73
+ 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\`:
74
+ feat!(auth): reestruturar fluxo de login
75
+ BREAKING CHANGE: A API de login foi alterada e não é compatível com versões anteriores.
76
+
77
+ Gere também uma descrição mais detalhada do commit, se necessário.
78
+
79
+ Use sempre linguagem imperativa e primeira pessoa do singular, como:
80
+ - "adiciona recurso"
81
+ - "corrige bug"
82
+ - "remove arquivo"
83
+
84
+ Lembre-se: os textos fora do Conventional Commit devem ser em português.
85
+ `
86
+
87
+ interface CommitAction {
88
+ action: 'confirm' | 'edit' | 'cancel'
89
+ }
90
+
91
+ async function ccm(): Promise<void> {
92
+ const prompt = inquirer.createPromptModule()
93
+
94
+ // verifica se o repositório git está inicializado
95
+ try {
96
+ console.log(chalk.blue('🔄 Verificando se o diretório é um repositório git...'))
97
+ execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' })
98
+ } catch (error) {
99
+ console.error(chalk.red('❌ Este diretório não é um repositório git.'))
100
+ return
101
+ }
102
+
103
+ // Adiciona todos os arquivos modificados ao índice
104
+ execSync('git add .')
105
+
106
+ // Cria um arquivo temporário para armazenar o prompt
107
+ const tempPromptPath = path.join(os.tmpdir(), 'CODY_PROMPT.txt')
108
+ fs.writeFileSync(tempPromptPath, CODY_PROMPT)
109
+
110
+ // Gera a mensagem do commit usando o diff com o cody chat
111
+ let generatedMessage: string
112
+ try {
113
+ console.log(chalk.blue.bold('⌛ Gerando mensagem de commit com o Cody...'))
114
+ const response = execSync(
115
+ `git diff --cached | cody chat --stdin -m "$(cat ${tempPromptPath})"`,
116
+ ).toString()
117
+
118
+ // Extrai o bloco de código delimitado por ``` usando regex
119
+ const match = response.match(/```([\s\S]*?)```/)
120
+ generatedMessage = match ? match[1].trim() : response.trim()
121
+
122
+ console.log(
123
+ chalk.greenBright('\n✨ Mensagem de commit gerada automaticamente:'),
124
+ )
125
+ console.log(chalk.yellowBright(generatedMessage))
126
+ } catch (error) {
127
+ console.error(
128
+ chalk.red('❌ Erro ao gerar mensagem de commit com o Cody:'),
129
+ (error as Error).message,
130
+ )
131
+ return
132
+ } finally {
133
+ fs.unlinkSync(tempPromptPath) // Remove o arquivo temporário após o uso
134
+ }
135
+
136
+ // Pergunta ao usuário se ele quer editar, confirmar ou cancelar o commit
137
+ const { action }: CommitAction = await prompt([
138
+ {
139
+ type: 'list',
140
+ name: 'action',
141
+ message: chalk.blue.bold(
142
+ 'O que deseja fazer com a mensagem de commit gerada?',
143
+ ),
144
+ choices: [
145
+ { name: '📌 Confirmar e commitar', value: 'confirm' },
146
+ { name: '📝 Editar a mensagem antes de commitar', value: 'edit' },
147
+ { name: '🚫 Cancelar o commit', value: 'cancel' },
148
+ ],
149
+ },
150
+ ])
151
+
152
+ // Caminho temporário para salvar a mensagem gerada
153
+ const tempFilePath = path.join(os.tmpdir(), 'COMMIT_EDITMSG')
154
+
155
+ // Salva a mensagem gerada no arquivo temporário
156
+ fs.writeFileSync(tempFilePath, generatedMessage)
157
+
158
+ if (action === 'edit') {
159
+ console.log(chalk.cyan('📝 Abrindo editor para edição da mensagem...'))
160
+ const editor = process.env.EDITOR || 'nano'
161
+ try {
162
+ execSync(`${editor} ${tempFilePath}`, { stdio: 'inherit' })
163
+ } catch (error) {
164
+ console.error(chalk.red('❌ Erro ao abrir o editor:'), (error as Error).message)
165
+ return
166
+ }
167
+ } else if (action === 'cancel') {
168
+ console.log(chalk.yellow('🚫 Commit cancelado pelo usuário.'))
169
+ fs.unlinkSync(tempFilePath) // Remove o arquivo temporário
170
+ return
171
+ }
172
+
173
+ // Lê a mensagem do arquivo temporário após a edição
174
+ const finalMessage = fs.readFileSync(tempFilePath, 'utf8').trim()
175
+
176
+ // Verifica se a mensagem está vazia
177
+ if (!finalMessage) {
178
+ console.log(chalk.red('❌ Nenhuma mensagem inserida, commit cancelado.'))
179
+ fs.unlinkSync(tempFilePath) // Remove o arquivo temporário
180
+ return
181
+ }
182
+
183
+ // Realiza o commit com a mensagem final
184
+ try {
185
+ execSync(`git commit -F ${tempFilePath}`)
186
+ console.log(chalk.green.bold('✅ Commit realizado com sucesso.'))
187
+ } catch (error) {
188
+ console.error(chalk.red('❌ Erro ao realizar o commit:'), (error as Error).message)
189
+ } finally {
190
+ fs.unlinkSync(tempFilePath) // Remove o arquivo temporário
191
+ }
192
+ }
193
+
194
+ // Chama a função principal
195
+ ccm().catch((err) => console.error(chalk.red('❌ Erro durante o commit:'), err))
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@gilbert_oliveira/commit-wizard",
3
+ "version": "1.0.0",
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
+ "main": "index.ts",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/gilbert-oliveira/commit-wizard.git"
12
+ },
13
+ "keywords": [
14
+ "commit",
15
+ "wizard",
16
+ "conventional",
17
+ "commits",
18
+ "conventional-commits",
19
+ "commitizen",
20
+ "commitlint",
21
+ "husky",
22
+ "lint-staged"
23
+ ],
24
+ "author": "Gilbert Oliveira",
25
+ "license": "ISC",
26
+ "bugs": {
27
+ "url": "https://github.com/gilbert-oliveira/commit-wizard/issues"
28
+ },
29
+ "homepage": "https://github.com/gilbert-oliveira/commit-wizard#readme",
30
+ "publishConfig": {
31
+ "access": "public"
32
+ }
33
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ // Enable latest features
4
+ "lib": ["ESNext", "DOM"],
5
+ "target": "ESNext",
6
+ "module": "ESNext",
7
+ "moduleDetection": "force",
8
+ "jsx": "react-jsx",
9
+ "allowJs": true,
10
+
11
+ // Bundler mode
12
+ "moduleResolution": "bundler",
13
+ "allowImportingTsExtensions": true,
14
+ "verbatimModuleSyntax": true,
15
+ "noEmit": true,
16
+
17
+ // Best practices
18
+ "strict": true,
19
+ "skipLibCheck": true,
20
+ "noFallthroughCasesInSwitch": true,
21
+
22
+ // Some stricter flags (disabled by default)
23
+ "noUnusedLocals": false,
24
+ "noUnusedParameters": false,
25
+ "noPropertyAccessFromIndexSignature": false,
26
+
27
+ "outDir": "./dist"
28
+ },
29
+ "include": ["index.ts"]
30
+ }