@gilbert_oliveira/commit-wizard 1.0.26 → 1.2.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 CHANGED
@@ -1,80 +1,310 @@
1
- # Commit Wizard
1
+ # 🧙‍♂️ Commit Wizard
2
+
3
+ [![npm version](https://badge.fury.io/js/%40gilbert_oliveira%2Fcommit-wizard.svg)](https://badge.fury.io/js/%40gilbert_oliveira%2Fcommit-wizard)
4
+ [![CI/CD](https://github.com/gilbert-oliveira/commit-wizard/actions/workflows/ci.yml/badge.svg)](https://github.com/gilbert-oliveira/commit-wizard/actions/workflows/ci.yml)
5
+ [![codecov](https://codecov.io/gh/gilbert-oliveira/commit-wizard/branch/main/graph/badge.svg)](https://codecov.io/gh/gilbert-oliveira/commit-wizard)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
2
7
 
3
8
  Gere mensagens de commit convencionais automaticamente com base nas alterações no código usando a API da OpenAI.
4
9
 
5
- ## ✨ Visão Geral
10
+ ## ✨ Funcionalidades
6
11
 
7
- Este projeto é uma ferramenta de linha de comando (CLI) chamada `commit-wizard`, que utiliza a API da OpenAI para gerar mensagens de commit com base no `diff` dos arquivos que estão em *staged* no Git.
12
+ - 🤖 **Geração inteligente de commits** usando GPT-4o/GPT-4o Mini
13
+ - 🎯 **Multi-commit inteligente** - divide mudanças por contexto 🆕
14
+ - 📝 **Convenção de Conventional Commits** automática
15
+ - 🌍 **Suporte multilíngue** (Português e Inglês)
16
+ - ⚙️ **Configuração flexível** (local e global)
17
+ - 📊 **Análise de complexidade** do diff
18
+ - 🚀 **Auto commit** opcional
19
+ - 😀 **Emojis** opcionais nas mensagens
20
+ - 🔄 **Regeneração** de mensagens
21
+ - 📋 **Cópia para clipboard**
22
+ - 🎯 **Detecção de breaking changes**
23
+ - 🧪 **Cobertura de testes** completa (63 testes)
8
24
 
9
25
  ## 🚀 Instalação
10
26
 
27
+ ### Global (Recomendado)
11
28
  ```bash
12
- npm install -g commit-wizard
29
+ npm install -g @gilbert_oliveira/commit-wizard
13
30
  ```
14
31
 
15
- Ou, se estiver usando localmente:
16
-
32
+ ### Local
17
33
  ```bash
18
- npm install
34
+ npm install @gilbert_oliveira/commit-wizard
19
35
  ```
20
36
 
21
37
  ## ⚙️ Configuração
22
38
 
23
- Antes de usar, você precisa definir a variável de ambiente com sua chave da OpenAI:
39
+ ### 1. API Key da OpenAI
40
+ Defina sua chave da OpenAI como variável de ambiente:
24
41
 
25
42
  ```bash
26
43
  export OPENAI_API_KEY=sk-...
27
44
  ```
28
45
 
29
- Você pode adicionar isso no seu `.bashrc`, `.zshrc` ou arquivo de ambiente equivalente.
46
+ Adicione isso no seu `.bashrc`, `.zshrc` ou arquivo de ambiente equivalente.
47
+
48
+ ### 2. Configuração do Wizard
49
+ Execute o comando de configuração para personalizar o comportamento:
50
+
51
+ ```bash
52
+ commit-wizard --config
53
+ ```
54
+
55
+ Ou crie um arquivo `.commit-wizard.json` no seu projeto ou diretório home:
56
+
57
+ ```json
58
+ {
59
+ "model": "gpt-4o",
60
+ "temperature": 0.2,
61
+ "maxTokens": 1000,
62
+ "language": "pt",
63
+ "autoCommit": false,
64
+ "excludePatterns": ["*.lock*", "*.log", "node_modules/**"],
65
+ "includeEmoji": true
66
+ }
67
+ ```
30
68
 
31
69
  ## 🧠 Como Funciona
32
70
 
33
- 1. O script os arquivos que estão em *staged* (`git diff --cached`).
34
- 2. Envia esse diff para a API da OpenAI.
35
- 3. Recebe uma sugestão de mensagem de commit no formato convencional (`feat:`, `fix:`, etc).
36
- 4. Exibe a mensagem para revisão.
71
+ 1. **Análise**: os arquivos staged (`git diff --cached`)
72
+ 2. **Processamento**: Divide diff grandes em chunks menores
73
+ 3. **IA**: Envia para OpenAI com prompts otimizados
74
+ 4. **Geração**: Cria mensagem seguindo Conventional Commits
75
+ 5. **Interação**: Permite edição, regeneração ou cópia
76
+ 6. **Commit**: Executa git commit com a mensagem final
77
+
78
+ ## 📝 Exemplos de Uso
79
+
80
+ ### Uso Básico
81
+ ```bash
82
+ # Adicione arquivos ao stage
83
+ git add .
37
84
 
38
- ## 📝 Exemplo de Uso
85
+ # Execute o wizard
86
+ commit-wizard
87
+ ```
39
88
 
89
+ ### Comandos Disponíveis
40
90
  ```bash
41
- npx commit-wizard
91
+ commit-wizard # Gerar commit normal (um único commit)
92
+ commit-wizard --split # Multi-commit por contexto 🆕
93
+ commit-wizard --config # Configurar o wizard
94
+ commit-wizard --info # Ver informações do sistema
95
+ commit-wizard --help # Mostrar ajuda
42
96
  ```
43
97
 
44
- Resultado esperado:
98
+ ### 🎯 Multi-Commit Inteligente 🆕
45
99
 
100
+ O Commit Wizard agora pode **dividir automaticamente** suas mudanças em **múltiplos commits** organizados por contexto:
101
+
102
+ ```bash
103
+ git add .
104
+ commit-wizard --split
46
105
  ```
47
- Sugestão de commit:
48
- feat: adiciona verificação automática para arquivos staged usando GPT-4
106
+
107
+ **Como funciona:**
108
+ - 🧠 **Análise inteligente** dos arquivos alterados
109
+ - 📂 **Agrupamento por contexto**: testes, docs, features, fixes, etc.
110
+ - 🎯 **Priorização automática**: bugs primeiro, depois testes, docs, features
111
+ - ✨ **Commits bem organizados** com mensagens específicas para cada grupo
112
+
113
+ **Exemplo de saída:**
49
114
  ```
115
+ 🎯 Multi-Commit Inteligente
116
+ 📋 3 commits propostos:
117
+
118
+ 1. 🐛 fix: corrige validação de entrada
119
+ Arquivos (2): src/auth.ts, src/validators.ts
120
+
121
+ 2. 🧪 test: adiciona testes para autenticação
122
+ Arquivos (1): tests/auth.test.ts
50
123
 
51
- ## 🛠 Tecnologias Utilizadas
124
+ 3. 📚 docs: atualiza documentação da API
125
+ Arquivos (1): README.md
52
126
 
53
- - Node.js
54
- - TypeScript
55
- - OpenAI API
56
- - Commander (CLI)
57
- - Dotenv
127
+ Deseja prosseguir com estes commits? Yes
58
128
 
59
- ## 🧪 Scripts Disponíveis
129
+ [1/3] Processando: 🐛 fix
130
+ ✅ Commit 1: 🐛 fix: corrige validação de entrada em auth.ts
60
131
 
61
- - `npm run build`: compila o TypeScript para JavaScript.
62
- - `npm start`: executa o CLI direto pelo TypeScript (com ts-node).
63
- - `npm run dev`: roda em modo de desenvolvimento com `ts-node-dev`.
132
+ [2/3] Processando: 🧪 test
133
+ Commit 2: 🧪 test: adiciona testes abrangentes para auth
64
134
 
65
- ## Commit Convencional
135
+ [3/3] Processando: 📚 docs
136
+ ✅ Commit 3: 📚 docs: atualiza documentação da API
66
137
 
67
- Este projeto segue o padrão de commit convencional, como:
138
+ 🎉 Multi-commit concluído!
139
+ • Commits realizados: 3/3
140
+ ✨ Histórico organizado com sucesso!
141
+ ```
142
+
143
+ **Tipos de contexto detectados:**
144
+ - 🐛 **fix** - Correções de bugs (prioridade 1)
145
+ - 🧪 **test** - Testes (prioridade 2)
146
+ - 📚 **docs** - Documentação (prioridade 3)
147
+ - 🔧 **chore** - Configurações (prioridade 4)
148
+ - 💄 **style** - Formatação (prioridade 5)
149
+ - ♻️ **refactor** - Refatoração (prioridade 6)
150
+ - ✨ **feat** - Novas funcionalidades (prioridade 7)
151
+ - 🔄 **ci** - CI/CD (prioridade 8)
152
+
153
+ ### Exemplo de Output
154
+ ```
155
+ 📈 Análise do Diff:
156
+ • Arquivos alterados: 3
157
+ • Linhas adicionadas: +45
158
+ • Linhas removidas: -12
159
+ • Tokens estimados: 850
160
+ • Complexidade: 🟡 Moderada
68
161
 
69
- - `feat:` para novas funcionalidades
70
- - `fix:` para correções de bugs
71
- - `docs:` para documentação
72
- - `refactor:` para mudanças internas no código
162
+ Mensagem de commit gerada:
163
+ feat(auth): adiciona autenticação OAuth2 com Google
164
+
165
+ 💰 Tokens utilizados: 1,234 (prompt: 987, resposta: 247)
166
+
167
+ O que deseja fazer com a mensagem de commit?
168
+ ❯ 📌 Confirmar e commitar
169
+ 📝 Editar a mensagem antes de commitar
170
+ 🔄 Regenerar mensagem
171
+ 📋 Copiar para clipboard
172
+ 🚫 Cancelar o commit
173
+ ```
174
+
175
+ ## 🛠 Modelos Suportados
176
+
177
+ - **GPT-4o** (padrão) - Mais recente e eficiente
178
+ - **GPT-4o Mini** - Mais rápido e econômico
179
+ - **GPT-4 Turbo** - Versão anterior robusta
180
+ - **GPT-3.5 Turbo** - Opção econômica
181
+
182
+ ## 🧪 Scripts de Desenvolvimento
183
+
184
+ ```bash
185
+ npm run build # Compilar TypeScript
186
+ npm run dev # Modo desenvolvimento
187
+ npm run test # Executar testes
188
+ npm run test:watch # Testes em modo watch
189
+ npm run test:coverage # Testes com cobertura
190
+ npm run lint # Verificar lint
191
+ npm run lint:fix # Corrigir lint automaticamente
192
+ npm run format # Formatar código
193
+ npm run format:check # Verificar formatação
194
+ npm run clean # Limpar arquivos build
195
+ ```
196
+
197
+ ## 📊 Conventional Commits Suportados
198
+
199
+ O wizard gera mensagens seguindo a [especificação Conventional Commits](https://www.conventionalcommits.org/):
200
+
201
+ - `feat:` - Novas funcionalidades
202
+ - `fix:` - Correções de bugs
203
+ - `docs:` - Mudanças na documentação
204
+ - `style:` - Formatação, ponto e vírgula, etc.
205
+ - `refactor:` - Mudanças que não alteram funcionalidade
206
+ - `perf:` - Melhorias de performance
207
+ - `test:` - Adição ou correção de testes
208
+ - `chore:` - Mudanças em ferramentas, configs, etc.
209
+ - `ci:` - Mudanças no CI/CD
210
+
211
+ ### Breaking Changes
212
+ Para alterações que quebram compatibilidade:
213
+ ```
214
+ feat!(auth): reestruturar API de login
215
+
216
+ BREAKING CHANGE: A API de login foi alterada e não é compatível com versões anteriores.
217
+ ```
218
+
219
+ ## 🎯 Configurações Avançadas
220
+
221
+ ### Padrões de Exclusão
222
+ Customize quais arquivos ignorar:
223
+ ```json
224
+ {
225
+ "excludePatterns": [
226
+ "*.lock*",
227
+ "*.log",
228
+ "node_modules/**",
229
+ "dist/**",
230
+ "coverage/**"
231
+ ]
232
+ }
233
+ ```
234
+
235
+ ### Auto Commit
236
+ Para fluxos automatizados:
237
+ ```json
238
+ {
239
+ "autoCommit": true
240
+ }
241
+ ```
242
+
243
+ ### Multilíngue
244
+ Suporte para português e inglês:
245
+ ```json
246
+ {
247
+ "language": "en"
248
+ }
249
+ ```
250
+
251
+ ## 🚨 Tratamento de Erros
252
+
253
+ O wizard trata graciosamente:
254
+ - ❌ API key não configurada
255
+ - ❌ Não é repositório Git
256
+ - ❌ Sem arquivos staged
257
+ - ❌ Erros da API OpenAI
258
+ - ❌ Problemas de conectividade
259
+ - ❌ Arquivos de configuração inválidos
260
+
261
+ ## 💡 Dicas de Uso
262
+
263
+ 1. **Stage seletivo**: Use `git add -p` para adicionar mudanças específicas
264
+ 2. **Configuração por projeto**: Crie `.commit-wizard.json` no projeto
265
+ 3. **Temperatura baixa**: Use 0.1-0.3 para mensagens mais consistentes
266
+ 4. **Exclude patterns**: Configure para ignorar arquivos irrelevantes
267
+ 5. **Auto commit**: Ative apenas em ambientes confiáveis
268
+
269
+ ## 🤝 Contribuindo
270
+
271
+ 1. Fork o projeto
272
+ 2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
273
+ 3. Commit suas mudanças (`git commit -m 'feat: add some AmazingFeature'`)
274
+ 4. Push para a branch (`git push origin feature/AmazingFeature`)
275
+ 5. Abra um Pull Request
276
+
277
+ ### Executando Localmente
278
+ ```bash
279
+ git clone https://github.com/gilbert-oliveira/commit-wizard.git
280
+ cd commit-wizard
281
+ npm install
282
+ npm run build
283
+ npm link
284
+ ```
285
+
286
+ ## 📈 Roadmap
287
+
288
+ - [ ] Suporte a outros provedores de IA (Claude, Gemini)
289
+ - [ ] Integração com GitHub Actions
290
+ - [ ] Plugin para VS Code
291
+ - [ ] Templates de commit customizáveis
292
+ - [ ] Integração com Conventional Changelog
293
+ - [ ] Suporte a monorepos
294
+ - [ ] Cache de respostas IA
73
295
 
74
296
  ## 📄 Licença
75
297
 
76
298
  Este projeto está licenciado sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.
77
299
 
300
+ ## 🙏 Agradecimentos
301
+
302
+ - [OpenAI](https://openai.com/) pela API GPT
303
+ - [Conventional Commits](https://www.conventionalcommits.org/) pela especificação
304
+ - Comunidade open source pelas bibliotecas utilizadas
305
+
78
306
  ---
79
307
 
80
- Feito com 💜 por Gilbert de Oliveira Santos
308
+ <div align="center">
309
+ <sub>Feito com 💜 por <a href="https://github.com/gilbert-oliveira">Gilbert de Oliveira Santos</a></sub>
310
+ </div>
@@ -0,0 +1,36 @@
1
+ import { Config } from './config.js';
2
+ export interface AIResponse {
3
+ content: string;
4
+ usage?: {
5
+ promptTokens: number;
6
+ completionTokens: number;
7
+ totalTokens: number;
8
+ };
9
+ }
10
+ /**
11
+ * Serviço para interação com APIs de IA
12
+ */
13
+ export declare class AIService {
14
+ private config;
15
+ constructor(config: Config);
16
+ /**
17
+ * Gera prompt do sistema baseado no modo e linguagem
18
+ */
19
+ private getSystemPrompt;
20
+ /**
21
+ * Gera prompt para mensagem de commit
22
+ */
23
+ private getCommitPrompt;
24
+ /**
25
+ * Realiza chamada para a API da OpenAI
26
+ */
27
+ callOpenAI(prompt: string, mode?: 'commit' | 'summary'): Promise<AIResponse>;
28
+ /**
29
+ * Gera resumo de um chunk de diff
30
+ */
31
+ generateSummary(chunk: string): Promise<string>;
32
+ /**
33
+ * Gera mensagem de commit baseada no diff ou resumo
34
+ */
35
+ generateCommitMessage(diffOrSummary: string): Promise<AIResponse>;
36
+ }
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Serviço para interação com APIs de IA
3
+ */
4
+ export class AIService {
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ /**
9
+ * Gera prompt do sistema baseado no modo e linguagem
10
+ */
11
+ getSystemPrompt(mode) {
12
+ const isPortuguese = this.config.language === 'pt';
13
+ if (mode === 'commit') {
14
+ return isPortuguese
15
+ ? 'Você é um assistente que gera mensagens de commit seguindo a convenção do Conventional Commits. Use linguagem imperativa em português.'
16
+ : 'You are an assistant that generates commit messages following the Conventional Commits convention. Use imperative language in English.';
17
+ }
18
+ return isPortuguese
19
+ ? 'Você é um assistente que resume alterações de código de forma breve, usando linguagem imperativa em português.'
20
+ : 'You are an assistant that summarizes code changes briefly, using imperative language in English.';
21
+ }
22
+ /**
23
+ * Gera prompt para mensagem de commit
24
+ */
25
+ getCommitPrompt() {
26
+ const isPortuguese = this.config.language === 'pt';
27
+ if (isPortuguese) {
28
+ return `
29
+ Por favor, escreva a mensagem de commit para este diff usando a convenção de Conventional Commits.
30
+ A mensagem deve começar com um tipo de commit, como:
31
+ feat: para novas funcionalidades
32
+ fix: para correções de bugs
33
+ chore: para alterações que não afetam a funcionalidade
34
+ docs: para mudanças na documentação
35
+ style: para alterações no estilo do código (formatação)
36
+ refactor: para alterações no código que não alteram a funcionalidade
37
+ perf: para melhorias de desempenho
38
+ test: para alterações nos testes
39
+ ci: para mudanças no pipeline de integração contínua
40
+
41
+ ${this.config.includeEmoji ? 'Inclua emojis apropriados no início da mensagem.' : 'Não inclua emojis na mensagem.'}
42
+
43
+ Para breaking changes, use "!" após o tipo: feat!(auth): reestruturar fluxo de login
44
+
45
+ Use sempre linguagem imperativa, como:
46
+ - "adiciona recurso"
47
+ - "corrige bug"
48
+ - "remove arquivo"
49
+
50
+ Mantenha a mensagem concisa mas informativa.
51
+ `;
52
+ }
53
+ return `
54
+ Please write the commit message for this diff using the Conventional Commits convention.
55
+ The message should start with a commit type, such as:
56
+ feat: for new features
57
+ fix: for bug fixes
58
+ chore: for changes that don't affect functionality
59
+ docs: for documentation changes
60
+ style: for code style changes (formatting)
61
+ refactor: for code changes that don't alter functionality
62
+ perf: for performance improvements
63
+ test: for test changes
64
+ ci: for CI pipeline changes
65
+
66
+ ${this.config.includeEmoji ? 'Include appropriate emojis at the beginning of the message.' : 'Do not include emojis in the message.'}
67
+
68
+ For breaking changes, use "!" after the type: feat!(auth): restructure login flow
69
+
70
+ Always use imperative language, such as:
71
+ - "add feature"
72
+ - "fix bug"
73
+ - "remove file"
74
+
75
+ Keep the message concise but informative.
76
+ `;
77
+ }
78
+ /**
79
+ * Realiza chamada para a API da OpenAI
80
+ */
81
+ async callOpenAI(prompt, mode = 'commit') {
82
+ if (!this.config.apiKey) {
83
+ throw new Error('API key da OpenAI não configurada');
84
+ }
85
+ const url = 'https://api.openai.com/v1/chat/completions';
86
+ const systemPrompt = this.getSystemPrompt(mode);
87
+ const fullPrompt = mode === 'commit' ? `${this.getCommitPrompt()}\n\nDiff:\n\n${prompt}` : prompt;
88
+ const body = {
89
+ model: this.config.model,
90
+ messages: [
91
+ { role: 'system', content: systemPrompt },
92
+ { role: 'user', content: fullPrompt },
93
+ ],
94
+ temperature: this.config.temperature,
95
+ max_tokens: 500, // Limite para mensagens de commit
96
+ };
97
+ try {
98
+ // Timeout de 30 segundos para evitar travamentos
99
+ const controller = new AbortController();
100
+ const timeoutId = globalThis.setTimeout(() => controller.abort(), 30000);
101
+ const response = await globalThis.fetch(url, {
102
+ method: 'POST',
103
+ headers: {
104
+ 'Content-Type': 'application/json',
105
+ Authorization: `Bearer ${this.config.apiKey}`,
106
+ },
107
+ body: JSON.stringify(body),
108
+ signal: controller.signal,
109
+ });
110
+ globalThis.clearTimeout(timeoutId);
111
+ if (!response.ok) {
112
+ const errorData = await response.json().catch(() => ({}));
113
+ throw new Error(`Erro na API OpenAI (${response.status}): ${errorData.error?.message || response.statusText}`);
114
+ }
115
+ const data = await response.json();
116
+ return {
117
+ content: data.choices[0].message.content.trim().replace(/```/g, ''),
118
+ usage: data.usage
119
+ ? {
120
+ promptTokens: data.usage.prompt_tokens,
121
+ completionTokens: data.usage.completion_tokens,
122
+ totalTokens: data.usage.total_tokens,
123
+ }
124
+ : undefined,
125
+ };
126
+ }
127
+ catch (error) {
128
+ if (error instanceof Error) {
129
+ if (error.name === 'AbortError') {
130
+ throw new Error('Timeout: A requisição demorou mais de 30 segundos. Tente reduzir o tamanho do diff ou verificar sua conexão.');
131
+ }
132
+ throw error;
133
+ }
134
+ throw new Error(`Erro desconhecido ao chamar API: ${error}`);
135
+ }
136
+ }
137
+ /**
138
+ * Gera resumo de um chunk de diff
139
+ */
140
+ async generateSummary(chunk) {
141
+ const isPortuguese = this.config.language === 'pt';
142
+ const summaryPrefix = isPortuguese
143
+ ? 'A partir do diff abaixo, extraia um resumo breve das alterações (use linguagem imperativa):'
144
+ : 'From the diff below, extract a brief summary of the changes (use imperative language):';
145
+ const prompt = `${summaryPrefix}\n\n${chunk}`;
146
+ const response = await this.callOpenAI(prompt, 'summary');
147
+ return response.content;
148
+ }
149
+ /**
150
+ * Gera mensagem de commit baseada no diff ou resumo
151
+ */
152
+ async generateCommitMessage(diffOrSummary) {
153
+ return this.callOpenAI(diffOrSummary, 'commit');
154
+ }
155
+ }
156
+ //# sourceMappingURL=ai-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-service.js","sourceRoot":"","sources":["../src/ai-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { GitUtils } from './git-utils.js';
2
+ import { Config } from './config.js';
3
+ export interface CommitGroup {
4
+ id: string;
5
+ type: 'feat' | 'fix' | 'docs' | 'style' | 'refactor' | 'test' | 'chore' | 'ci';
6
+ emoji: string;
7
+ description: string;
8
+ files: string[];
9
+ diff: string;
10
+ priority: number;
11
+ }
12
+ export interface SplitCommitResult {
13
+ groups: CommitGroup[];
14
+ totalFiles: number;
15
+ suggestedOrder: string[];
16
+ }
17
+ /**
18
+ * Serviço para dividir commits grandes em commits menores e organizados
19
+ */
20
+ export declare class CommitSplitter {
21
+ private gitUtils;
22
+ private config;
23
+ constructor(gitUtils: GitUtils, config: Config);
24
+ /**
25
+ * Analisa um arquivo e determina seu contexto/tipo
26
+ */
27
+ private analyzeFileContext;
28
+ /**
29
+ * Obtém emoji e prioridade para cada tipo de commit
30
+ */
31
+ private getCommitTypeInfo;
32
+ /**
33
+ * Agrupa arquivos relacionados por similaridade de caminho
34
+ */
35
+ private groupRelatedFiles;
36
+ /**
37
+ * Divide o diff atual em grupos de commits organizados
38
+ */
39
+ analyzeAndSplit(): Promise<SplitCommitResult>;
40
+ /**
41
+ * Gera descrição inteligente para um grupo de arquivos
42
+ */
43
+ private generateGroupDescription;
44
+ /**
45
+ * Encontra diretório comum de uma lista de arquivos
46
+ */
47
+ private findCommonDirectory;
48
+ }