@andrebuzeli/git-mcp 2.27.4 → 2.28.1

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.
Files changed (112) hide show
  1. package/dist/client.d.ts +306 -306
  2. package/dist/client.js +298 -298
  3. package/dist/config.d.ts +310 -310
  4. package/dist/config.js +392 -392
  5. package/dist/index.d.ts +22 -22
  6. package/dist/index.js +89 -89
  7. package/dist/providers/base-provider.d.ts +160 -156
  8. package/dist/providers/base-provider.d.ts.map +1 -1
  9. package/dist/providers/base-provider.js +274 -260
  10. package/dist/providers/base-provider.js.map +1 -1
  11. package/dist/providers/error-handler.d.ts +50 -50
  12. package/dist/providers/error-handler.js +175 -175
  13. package/dist/providers/gitea-provider.d.ts +97 -97
  14. package/dist/providers/gitea-provider.js +1001 -1001
  15. package/dist/providers/github-provider.d.ts +104 -104
  16. package/dist/providers/github-provider.js +1234 -1234
  17. package/dist/providers/index.d.ts +12 -12
  18. package/dist/providers/index.js +40 -40
  19. package/dist/providers/provider-factory.d.ts +74 -74
  20. package/dist/providers/provider-factory.js +311 -311
  21. package/dist/providers/types.d.ts +318 -298
  22. package/dist/providers/types.d.ts.map +1 -1
  23. package/dist/providers/types.js +6 -6
  24. package/dist/server.d.ts +76 -76
  25. package/dist/server.d.ts.map +1 -1
  26. package/dist/server.js +306 -305
  27. package/dist/server.js.map +1 -1
  28. package/dist/tools/gh-actions.d.ts +252 -252
  29. package/dist/tools/gh-actions.js +389 -389
  30. package/dist/tools/gh-analytics.d.ts +263 -263
  31. package/dist/tools/gh-analytics.js +401 -401
  32. package/dist/tools/gh-code-review.d.ts +304 -304
  33. package/dist/tools/gh-code-review.js +512 -512
  34. package/dist/tools/gh-codespaces.d.ts +138 -138
  35. package/dist/tools/gh-codespaces.js +282 -282
  36. package/dist/tools/gh-deployments.d.ts +300 -300
  37. package/dist/tools/gh-deployments.js +367 -367
  38. package/dist/tools/gh-gists.d.ts +174 -174
  39. package/dist/tools/gh-gists.js +321 -321
  40. package/dist/tools/gh-projects.d.ts +205 -205
  41. package/dist/tools/gh-projects.js +358 -358
  42. package/dist/tools/gh-security.d.ts +274 -274
  43. package/dist/tools/gh-security.js +395 -395
  44. package/dist/tools/gh-sync.d.ts +213 -213
  45. package/dist/tools/gh-sync.js +378 -378
  46. package/dist/tools/gh-workflows.d.ts +290 -290
  47. package/dist/tools/gh-workflows.js +432 -432
  48. package/dist/tools/git-archive.d.ts +165 -165
  49. package/dist/tools/git-archive.js +233 -233
  50. package/dist/tools/git-branches.d.ts +430 -430
  51. package/dist/tools/git-branches.d.ts.map +1 -1
  52. package/dist/tools/git-branches.js +627 -530
  53. package/dist/tools/git-branches.js.map +1 -1
  54. package/dist/tools/git-bundle.d.ts +171 -171
  55. package/dist/tools/git-bundle.js +241 -241
  56. package/dist/tools/git-cherry-pick.d.ts +158 -158
  57. package/dist/tools/git-cherry-pick.js +224 -224
  58. package/dist/tools/git-commits.d.ts +485 -485
  59. package/dist/tools/git-commits.d.ts.map +1 -1
  60. package/dist/tools/git-commits.js +735 -625
  61. package/dist/tools/git-commits.js.map +1 -1
  62. package/dist/tools/git-config.d.ts +140 -140
  63. package/dist/tools/git-config.js +268 -268
  64. package/dist/tools/git-files.d.ts +486 -486
  65. package/dist/tools/git-files.js +607 -607
  66. package/dist/tools/git-issues.d.ts +571 -571
  67. package/dist/tools/git-issues.d.ts.map +1 -1
  68. package/dist/tools/git-issues.js +740 -693
  69. package/dist/tools/git-issues.js.map +1 -1
  70. package/dist/tools/git-pulls.d.ts +694 -694
  71. package/dist/tools/git-pulls.js +732 -732
  72. package/dist/tools/git-rebase.d.ts +137 -137
  73. package/dist/tools/git-rebase.js +213 -213
  74. package/dist/tools/git-releases.d.ts +487 -487
  75. package/dist/tools/git-releases.js +557 -557
  76. package/dist/tools/git-remote.d.ts +138 -138
  77. package/dist/tools/git-remote.js +274 -274
  78. package/dist/tools/git-repositories.d.ts +483 -483
  79. package/dist/tools/git-repositories.js +640 -640
  80. package/dist/tools/git-reset.d.ts +130 -130
  81. package/dist/tools/git-reset.js +223 -223
  82. package/dist/tools/git-revert.d.ts +149 -149
  83. package/dist/tools/git-revert.js +198 -198
  84. package/dist/tools/git-stash.d.ts +140 -140
  85. package/dist/tools/git-stash.js +269 -269
  86. package/dist/tools/git-submodule.d.ts +152 -152
  87. package/dist/tools/git-submodule.js +289 -289
  88. package/dist/tools/git-sync.d.ts +178 -166
  89. package/dist/tools/git-sync.d.ts.map +1 -1
  90. package/dist/tools/git-sync.js +312 -117
  91. package/dist/tools/git-sync.js.map +1 -1
  92. package/dist/tools/git-tags.d.ts +411 -411
  93. package/dist/tools/git-tags.js +485 -485
  94. package/dist/tools/git-webhooks.d.ts +470 -482
  95. package/dist/tools/git-webhooks.d.ts.map +1 -1
  96. package/dist/tools/git-webhooks.js +543 -555
  97. package/dist/tools/git-webhooks.js.map +1 -1
  98. package/dist/tools/git-worktree.d.ts +159 -159
  99. package/dist/tools/git-worktree.js +269 -269
  100. package/dist/tools/repositories.d.ts +405 -405
  101. package/dist/tools/repositories.js +569 -569
  102. package/dist/tools/users.d.ts +372 -372
  103. package/dist/tools/users.js +499 -499
  104. package/dist/tools/validator.d.ts +170 -170
  105. package/dist/tools/validator.js +194 -194
  106. package/dist/tools/version-control.d.ts +136 -136
  107. package/dist/tools/version-control.js +164 -164
  108. package/dist/utils/terminal-controller.d.ts +80 -80
  109. package/dist/utils/terminal-controller.js +345 -345
  110. package/dist/utils/user-detection.d.ts +24 -24
  111. package/dist/utils/user-detection.js +53 -53
  112. package/package.json +59 -59
@@ -1,626 +1,736 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.commitsTool = void 0;
4
- const zod_1 = require("zod");
5
- const index_js_1 = require("../providers/index.js");
6
- const user_detection_js_1 = require("../utils/user-detection.js");
7
- const terminal_controller_js_1 = require("../utils/terminal-controller.js");
8
- /**
9
- * Tool: commits
10
- *
11
- * DESCRIÇÃO:
12
- * Gerenciamento completo de commits com suporte multi-provider (GitHub e Gitea)
13
- *
14
- * FUNCIONALIDADES:
15
- * - Listagem de histórico de commits
16
- * - Obtenção de detalhes específicos
17
- * - Criação de novos commits
18
- * - Comparação entre commits
19
- * - Busca por mensagens e conteúdo
20
- * - Análise de mudanças
21
- *
22
- * USO:
23
- * - Para acompanhar histórico de mudanças
24
- * - Para analisar evolução do código
25
- * - Para criar commits programaticamente
26
- * - Para auditoria de mudanças
27
- *
28
- * RECOMENDAÇÕES:
29
- * - Use mensagens de commit descritivas
30
- * - Mantenha commits atômicos
31
- * - Documente mudanças importantes
32
- * - Revise histórico regularmente
33
- */
34
- /**
35
- * Schema de validação para entrada da tool commits
36
- *
37
- * VALIDAÇÕES:
38
- * - action: Ação obrigatória (list, get, create, compare, search)
39
- * - Parâmetros específicos por ação
40
- * - Validação de tipos e formatos
41
- *
42
- * RECOMENDAÇÕES:
43
- * - Sempre valide entrada antes de usar
44
- * - Use parâmetros opcionais adequadamente
45
- * - Documente parâmetros obrigatórios
46
- */
47
- const CommitsInputSchema = zod_1.z.object({
48
- action: zod_1.z.enum(['list', 'get', 'create', 'compare', 'search', 'push', 'pull']),
49
- // Parâmetros comuns
50
- // owner: obtido automaticamente do provider,
51
- repo: zod_1.z.string(),
52
- projectPath: zod_1.z.string().describe('Local project path for git operations'),
53
- // Para multi-provider
54
- provider: zod_1.z.enum(['gitea', 'github']).describe('Provider to use (gitea or github)'), // Provider específico: gitea, github ou both
55
- // Para list
56
- sha: zod_1.z.string().optional(),
57
- page: zod_1.z.number().min(1).optional(),
58
- limit: zod_1.z.number().min(1).max(100).optional(),
59
- // Para get
60
- commit_sha: zod_1.z.string().optional(),
61
- // Para create
62
- message: zod_1.z.string().optional(),
63
- branch: zod_1.z.string().optional(),
64
- author_name: zod_1.z.string().optional(),
65
- author_email: zod_1.z.string().optional(),
66
- committer_name: zod_1.z.string().optional(),
67
- committer_email: zod_1.z.string().optional(),
68
- // Para compare
69
- base: zod_1.z.string().optional(),
70
- head: zod_1.z.string().optional(),
71
- // Para search
72
- query: zod_1.z.string().optional(),
73
- author: zod_1.z.string().optional(),
74
- });
75
- /**
76
- * Schema de saída padronizado
77
- *
78
- * ESTRUTURA:
79
- * - success: Status da operação
80
- * - action: Ação executada
81
- * - message: Mensagem descritiva
82
- * - data: Dados retornados (opcional)
83
- * - error: Detalhes do erro (opcional)
84
- */
85
- const CommitsResultSchema = zod_1.z.object({
86
- success: zod_1.z.boolean(),
87
- action: zod_1.z.string(),
88
- message: zod_1.z.string(),
89
- data: zod_1.z.any().optional(),
90
- error: zod_1.z.string().optional()
91
- });
92
- /**
93
- * Tool: commits
94
- *
95
- * DESCRIÇÃO:
96
- * Gerenciamento completo de commits Gitea com múltiplas ações
97
- *
98
- * ACTIONS DISPONÍVEIS:
99
- *
100
- * 1. list - Listar commits
101
- * Parâmetros:
102
- * - owner (obrigatório): Proprietário do repositório
103
- * - repo (obrigatório): Nome do repositório
104
- * - sha (opcional): Branch ou commit específico (padrão: branch padrão)
105
- * - page (opcional): Página da listagem (padrão: 1)
106
- * - limit (opcional): Itens por página (padrão: 30, máximo: 100)
107
- *
108
- * 2. get - Obter detalhes do commit
109
- * Parâmetros:
110
- * - owner (obrigatório): Proprietário do repositório
111
- * - repo (obrigatório): Nome do repositório
112
- * - commit_sha (obrigatório): SHA do commit
113
- *
114
- * 3. create - Criar novo commit
115
- * Parâmetros:
116
- * - owner (obrigatório): Proprietário do repositório
117
- * - repo (obrigatório): Nome do repositório
118
- * - message (obrigatório): Mensagem do commit
119
- * - branch (obrigatório): Branch de destino
120
- * - author_name (opcional): Nome do autor
121
- * - author_email (opcional): Email do autor
122
- * - committer_name (opcional): Nome do committer
123
- * - committer_email (opcional): Email do committer
124
- *
125
- * 4. compare - Comparar commits
126
- * Parâmetros:
127
- * - owner (obrigatório): Proprietário do repositório
128
- * - repo (obrigatório): Nome do repositório
129
- * - base (obrigatório): Commit base para comparação
130
- * - head (obrigatório): Commit para comparar
131
- *
132
- * 5. search - Buscar commits
133
- * Parâmetros:
134
- * - owner (obrigatório): Proprietário do repositório
135
- * - repo (obrigatório): Nome do repositório
136
- * - query (obrigatório): Termo de busca
137
- * - author (opcional): Autor dos commits
138
- * - page (opcional): Página da busca (padrão: 1)
139
- * - limit (opcional): Itens por página (padrão: 30, máximo: 100)
140
- *
141
- * RECOMENDAÇÕES DE USO:
142
- * - Use mensagens de commit descritivas
143
- * - Mantenha commits atômicos
144
- * - Documente mudanças importantes
145
- * - Revise histórico regularmente
146
- * - Use branches para features
147
- * - Mantenha histórico limpo
148
- */
149
- exports.commitsTool = {
150
- name: 'git-commits',
151
- description: 'tool: Gerencia commits Git completos, histórico, criação e sincronização\n──────────────\naction list: lista commits do repositório\naction list requires: repo, page, limit, provider\n───────────────\naction get: obtém detalhes de commit específico\naction get requires: repo, sha, provider\n───────────────\naction create: cria novo commit\naction create requires: repo, message, branch, provider\n───────────────\naction compare: compara commits/branches\naction compare requires: repo, base, head, provider\n───────────────\naction search: busca commits por critérios\naction search requires: repo, query, author, provider\n───────────────\naction push: envia commits para remoto\naction push requires: repo, branch, provider\n───────────────\naction pull: baixa commits do remoto\naction pull requires: repo, branch, provider',
152
- inputSchema: {
153
- type: 'object',
154
- properties: {
155
- action: {
156
- type: 'string',
157
- enum: ['list', 'get', 'create', 'compare', 'search', 'push', 'pull'],
158
- description: 'Action to perform on commits'
159
- },
160
- repo: { type: 'string', description: 'Repository name' },
161
- provider: { type: 'string', description: 'Specific provider (github, gitea) or use default' },
162
- sha: { type: 'string', description: 'Branch, tag or commit SHA' },
163
- page: { type: 'number', description: 'Page number', minimum: 1 },
164
- limit: { type: 'number', description: 'Items per page', minimum: 1, maximum: 100 },
165
- commit_sha: { type: 'string', description: 'Specific commit SHA' },
166
- message: { type: 'string', description: 'Commit message' },
167
- branch: { type: 'string', description: 'Target branch' },
168
- author_name: { type: 'string', description: 'Author name' },
169
- author_email: { type: 'string', description: 'Author email' },
170
- committer_name: { type: 'string', description: 'Committer name' },
171
- committer_email: { type: 'string', description: 'Committer email' },
172
- base: { type: 'string', description: 'Base commit/branch for comparison' },
173
- head: { type: 'string', description: 'Head commit/branch for comparison' },
174
- query: { type: 'string', description: 'Search query' },
175
- author: { type: 'string', description: 'Author filter for search' }
176
- },
177
- required: ['action', 'repo', 'provider']
178
- },
179
- /**
180
- * Handler principal da tool commits
181
- *
182
- * FUNCIONALIDADE:
183
- * - Valida entrada usando Zod schema
184
- * - Roteia para método específico baseado na ação
185
- * - Trata erros de forma uniforme
186
- * - Retorna resultado padronizado
187
- *
188
- * FLUXO:
189
- * 1. Validação de entrada
190
- * 2. Seleção do provider
191
- * 3. Roteamento por ação
192
- * 4. Execução do método específico
193
- * 5. Tratamento de erros
194
- * 6. Retorno de resultado
195
- *
196
- * TRATAMENTO DE ERROS:
197
- * - Validação: erro de schema
198
- * - Execução: erro da operação
199
- * - Roteamento: ação não suportada
200
- *
201
- * RECOMENDAÇÕES:
202
- * - Sempre valide entrada antes de processar
203
- * - Trate erros específicos adequadamente
204
- * - Log detalhes de erro para debug
205
- * - Retorne mensagens de erro úteis
206
- */
207
- async handler(input) {
208
- try {
209
- const validatedInput = CommitsInputSchema.parse(input);
210
- // Aplicar auto-detecção de usuário/owner
211
- const processedInput = await (0, user_detection_js_1.applyAutoUserDetection)(validatedInput, validatedInput.provider);
212
- // Obter o provider correto
213
- const provider = processedInput.provider
214
- ? index_js_1.globalProviderFactory.getProvider(processedInput.provider)
215
- : index_js_1.globalProviderFactory.getDefaultProvider();
216
- if (!provider) {
217
- throw new Error(`Provider '${processedInput.provider}' não encontrado`);
218
- }
219
- // Obter o owner do provider
220
- const owner = (await provider.getCurrentUser()).login;
221
- // Para ações que precisam de owner, verificar se foi determinado
222
- if (!owner && ['list', 'get', 'create', 'compare', 'search'].includes(processedInput.action)) {
223
- throw new Error('Não foi possível determinar o owner automaticamente. Verifique se o token está configurado corretamente.');
224
- }
225
- switch (processedInput.action) {
226
- case 'list':
227
- return await this.listCommits(processedInput, provider, owner);
228
- case 'get':
229
- return await this.getCommit(processedInput, provider, owner);
230
- case 'create':
231
- return await this.createCommit(processedInput, provider, owner);
232
- case 'compare':
233
- return await this.compareCommits(processedInput, provider, owner);
234
- case 'search':
235
- return await this.searchCommits(processedInput, provider, owner);
236
- case 'push':
237
- return await this.pushCommits(processedInput, provider);
238
- case 'pull':
239
- return await this.pullCommits(processedInput, provider);
240
- default:
241
- throw new Error(`Ação não suportada: ${processedInput.action}`);
242
- }
243
- }
244
- catch (error) {
245
- return {
246
- success: false,
247
- action: input.action,
248
- message: 'Erro na operação de commits',
249
- error: error instanceof Error ? error.message : String(error)
250
- };
251
- }
252
- },
253
- /**
254
- * Lista commits do repositório
255
- *
256
- * FUNCIONALIDADE:
257
- * - Lista commits com paginação
258
- * - Suporta filtro por branch ou commit
259
- * - Retorna informações básicas de cada commit
260
- *
261
- * PARÂMETROS OBRIGATÓRIOS:
262
- * - owner: Proprietário do repositório
263
- * - repo: Nome do repositório
264
- *
265
- * PARÂMETROS OPCIONAIS:
266
- * - sha: Branch, tag ou commit específico (padrão: branch padrão)
267
- * - page: Página da listagem (padrão: 1)
268
- * - limit: Itens por página (padrão: 30, máximo: 100)
269
- *
270
- * VALIDAÇÕES:
271
- * - e repo obrigatórios
272
- * - SHA deve ser válido se fornecido
273
- * - Page deve ser >= 1
274
- * - Limit deve ser entre 1 e 100
275
- *
276
- * RECOMENDAÇÕES:
277
- * - Use paginação para repositórios grandes
278
- * - Monitore número total de commits
279
- * - Use SHA específico para análise
280
- * - Mantenha histórico organizado
281
- */
282
- async listCommits(params, provider, owner) {
283
- try {
284
- if (!owner || !params.repo) {
285
- throw new Error('e repo são obrigatórios');
286
- }
287
- const page = params.page || 1;
288
- const limit = params.limit || 30;
289
- const commits = await provider.listCommits(owner, params.repo, params.sha, page, limit);
290
- return {
291
- success: true,
292
- action: 'list',
293
- message: `${commits.length} commits encontrados`,
294
- data: {
295
- commits,
296
- page,
297
- limit,
298
- total: commits.length,
299
- sha: params.sha || 'branch padrão'
300
- }
301
- };
302
- }
303
- catch (error) {
304
- throw new Error(`Falha ao listar commits: ${error instanceof Error ? error.message : String(error)}`);
305
- }
306
- },
307
- /**
308
- * Obtém detalhes de um commit específico
309
- *
310
- * FUNCIONALIDADE:
311
- * - Obtém informações completas do commit
312
- * - Inclui detalhes de autor e committer
313
- * - Mostra arquivos modificados
314
- * - Retorna hash e mensagem
315
- *
316
- * PARÂMETROS OBRIGATÓRIOS:
317
- * - owner: Proprietário do repositório
318
- * - repo: Nome do repositório
319
- * - commit_sha: SHA do commit
320
- *
321
- * VALIDAÇÕES:
322
- * - Todos os parâmetros obrigatórios
323
- * - SHA deve ser válido
324
- * - Commit deve existir
325
- *
326
- * RECOMENDAÇÕES:
327
- * - Use para análise detalhada
328
- * - Verifique arquivos modificados
329
- * - Analise mensagem e autor
330
- * - Documente mudanças importantes
331
- */
332
- async getCommit(params, provider, owner) {
333
- try {
334
- if (!owner || !params.repo) {
335
- throw new Error('e repo são obrigatórios');
336
- }
337
- // Se não foi fornecido commit_sha, usa o SHA da branch padrão
338
- let commitSha = params.commit_sha;
339
- if (!commitSha) {
340
- try {
341
- const branchInfo = await provider.getBranch(owner, params.repo, 'main');
342
- commitSha = branchInfo.commit.sha;
343
- }
344
- catch (error) {
345
- // Se não conseguir obter o branch main, tenta master
346
- try {
347
- const branchInfo = await provider.getBranch(owner, params.repo, 'master');
348
- commitSha = branchInfo.commit.sha;
349
- }
350
- catch (masterError) {
351
- throw new Error('Não foi possível obter SHA do commit. Forneça commit_sha ou verifique se a branch existe.');
352
- }
353
- }
354
- }
355
- const commit = await provider.getCommit(owner, params.repo, commitSha);
356
- return {
357
- success: true,
358
- action: 'get',
359
- message: `Commit '${commitSha}' obtido com sucesso`,
360
- data: {
361
- commit,
362
- sha: commitSha,
363
- owner: owner,
364
- repo: params.repo
365
- }
366
- };
367
- }
368
- catch (error) {
369
- throw new Error(`Falha ao obter commit: ${error instanceof Error ? error.message : String(error)}`);
370
- }
371
- },
372
- /**
373
- * Cria um novo commit
374
- *
375
- * FUNCIONALIDADE:
376
- * - Cria commit com mensagem personalizada
377
- * - Suporta autor e committer diferentes
378
- * - Permite especificar branch de destino
379
- * - Valida dados obrigatórios
380
- *
381
- * PARÂMETROS OBRIGATÓRIOS:
382
- * - owner: Proprietário do repositório
383
- * - repo: Nome do repositório
384
- * - message: Mensagem do commit
385
- * - branch: Branch de destino
386
- *
387
- * PARÂMETROS OPCIONAIS:
388
- * - author_name: Nome do autor
389
- * - author_email: Email do autor
390
- * - committer_name: Nome do committer
391
- * - committer_email: Email do committer
392
- *
393
- * VALIDAÇÕES:
394
- * - Todos os parâmetros obrigatórios
395
- * - Mensagem não pode estar vazia
396
- * - Branch deve existir
397
- * - Emails devem ser válidos
398
- *
399
- * RECOMENDAÇÕES:
400
- * - Use mensagens descritivas
401
- * - Mantenha commits atômicos
402
- * - Documente mudanças importantes
403
- * - Use branches apropriadas
404
- */
405
- async createCommit(params, provider, owner) {
406
- try {
407
- if (!owner || !params.repo || !params.message || !params.branch) {
408
- throw new Error('repo, message e branch são obrigatórios');
409
- }
410
- if (params.message.trim().length === 0) {
411
- throw new Error('Mensagem do commit não pode estar vazia');
412
- }
413
- // Implementar criação de commit
414
- // Por enquanto, retorna mensagem de funcionalidade
415
- return {
416
- success: true,
417
- action: 'create',
418
- message: `Criação de commit solicitada para branch '${params.branch}'`,
419
- data: {
420
- message: params.message,
421
- branch: params.branch,
422
- author: params.author_name || 'usuário atual',
423
- committer: params.committer_name || 'usuário atual',
424
- commit: 'Funcionalidade de criação será implementada'
425
- }
426
- };
427
- }
428
- catch (error) {
429
- throw new Error(`Falha ao criar commit: ${error instanceof Error ? error.message : String(error)}`);
430
- }
431
- },
432
- /**
433
- * Compara dois commits ou branches
434
- *
435
- * FUNCIONALIDADE:
436
- * - Compara diferenças entre commits
437
- * - Mostra arquivos modificados
438
- * - Retorna estatísticas de mudanças
439
- *
440
- * PARÂMETROS OBRIGATÓRIOS:
441
- * - owner: Proprietário do repositório
442
- * - repo: Nome do repositório
443
- * - base: Commit ou branch base
444
- * - head: Commit ou branch para comparar
445
- *
446
- * VALIDAÇÕES:
447
- * - Todos os parâmetros obrigatórios
448
- * - Base e head devem existir
449
- * - Deve ser possível comparar
450
- *
451
- * RECOMENDAÇÕES:
452
- * - Use para análise de mudanças
453
- * - Compare antes de fazer merge
454
- * - Analise arquivos modificados
455
- * - Documente diferenças importantes
456
- */
457
- async compareCommits(params, provider, owner) {
458
- try {
459
- if (!owner || !params.repo || !params.base || !params.head) {
460
- throw new Error('repo, base e head são obrigatórios');
461
- }
462
- // Implementar comparação de commits
463
- // Por enquanto, retorna mensagem de funcionalidade
464
- return {
465
- success: true,
466
- action: 'compare',
467
- message: `Comparação entre '${params.base}' e '${params.head}' solicitada`,
468
- data: {
469
- base: params.base,
470
- head: params.head,
471
- comparison: 'Funcionalidade de comparação será implementada'
472
- }
473
- };
474
- }
475
- catch (error) {
476
- throw new Error(`Falha ao comparar commits: ${error instanceof Error ? error.message : String(error)}`);
477
- }
478
- },
479
- /**
480
- * Busca commits por critérios específicos
481
- *
482
- * FUNCIONALIDADE:
483
- * - Busca commits por mensagem
484
- * - Filtra por autor
485
- * - Suporta paginação
486
- *
487
- * PARÂMETROS OBRIGATÓRIOS:
488
- * - owner: Proprietário do repositório
489
- * - repo: Nome do repositório
490
- * - query: Termo de busca
491
- *
492
- * PARÂMETROS OPCIONAIS:
493
- * - author: Autor dos commits
494
- * - page: Página da busca (padrão: 1)
495
- * - limit: Itens por página (padrão: 30, máximo: 100)
496
- *
497
- * VALIDAÇÕES:
498
- * - Todos os parâmetros obrigatórios
499
- * - Query deve ter pelo menos 3 caracteres
500
- * - Repositório deve existir
501
- *
502
- * RECOMENDAÇÕES:
503
- * - Use termos de busca específicos
504
- * - Combine com filtros de autor
505
- * - Use paginação para resultados grandes
506
- * - Analise relevância dos resultados
507
- */
508
- async searchCommits(params, provider, owner) {
509
- try {
510
- if (!owner || !params.repo || !params.query) {
511
- throw new Error('repo e query são obrigatórios');
512
- }
513
- if (params.query.length < 3) {
514
- throw new Error('Query deve ter pelo menos 3 caracteres');
515
- }
516
- // Implementar busca de commits
517
- // Por enquanto, retorna mensagem de funcionalidade
518
- return {
519
- success: true,
520
- action: 'search',
521
- message: `Busca por commits com '${params.query}' solicitada`,
522
- data: {
523
- query: params.query,
524
- author: params.author || 'todos',
525
- results: 'Funcionalidade de busca será implementada'
526
- }
527
- };
528
- }
529
- catch (error) {
530
- throw new Error(`Falha ao buscar commits: ${error instanceof Error ? error.message : String(error)}`);
531
- }
532
- },
533
- /**
534
- * Faz push dos commits locais para o repositório remoto
535
- *
536
- * FUNCIONALIDADE:
537
- * - Faz push da branch atual para o remote
538
- * - Suporta especificar branch específica
539
- * - Verifica se há commits para fazer push
540
- *
541
- * PARÂMETROS OBRIGATÓRIOS:
542
- * - projectPath: Caminho do projeto local
543
- *
544
- * PARÂMETROS OPCIONAIS:
545
- * - branch: Branch para fazer push (padrão: branch atual)
546
- *
547
- * RECOMENDAÇÕES:
548
- * - Verifique se commits locais antes do push
549
- * - Use branch específica se necessário
550
- * - Monitore conflitos durante o push
551
- */
552
- async pushCommits(params, provider) {
553
- try {
554
- if (!params.projectPath) {
555
- throw new Error('projectPath é obrigatório para push');
556
- }
557
- const branch = params.branch || 'main';
558
- // Faz push usando o terminal controller
559
- const pushResult = await (0, terminal_controller_js_1.gitPush)(params.projectPath, branch);
560
- if (pushResult.exitCode !== 0) {
561
- throw new Error(`Falha no push: ${pushResult.output}`);
562
- }
563
- return {
564
- success: true,
565
- action: 'push',
566
- message: `Push realizado com sucesso na branch '${branch}'`,
567
- data: {
568
- projectPath: params.projectPath,
569
- branch: branch,
570
- pushed: true,
571
- output: pushResult.output
572
- }
573
- };
574
- }
575
- catch (error) {
576
- throw new Error(`Falha ao fazer push: ${error instanceof Error ? error.message : String(error)}`);
577
- }
578
- },
579
- /**
580
- * Faz pull dos commits do repositório remoto
581
- *
582
- * FUNCIONALIDADE:
583
- * - Faz pull da branch atual do remote
584
- * - Suporta especificar branch específica
585
- * - Faz merge automático se possível
586
- *
587
- * PARÂMETROS OBRIGATÓRIOS:
588
- * - projectPath: Caminho do projeto local
589
- *
590
- * PARÂMETROS OPCIONAIS:
591
- * - branch: Branch para fazer pull (padrão: branch atual)
592
- *
593
- * RECOMENDAÇÕES:
594
- * - Faça backup antes do pull
595
- * - Resolva conflitos manualmente se houver
596
- * - Use branch específica se necessário
597
- */
598
- async pullCommits(params, provider) {
599
- try {
600
- if (!params.projectPath) {
601
- throw new Error('projectPath é obrigatório para pull');
602
- }
603
- const branch = params.branch || 'main';
604
- // Faz pull usando o terminal controller
605
- const pullResult = await (0, terminal_controller_js_1.gitPull)(params.projectPath, branch);
606
- if (pullResult.exitCode !== 0) {
607
- throw new Error(`Falha no pull: ${pullResult.output}`);
608
- }
609
- return {
610
- success: true,
611
- action: 'pull',
612
- message: `Pull realizado com sucesso na branch '${branch}'`,
613
- data: {
614
- projectPath: params.projectPath,
615
- branch: branch,
616
- pulled: true,
617
- output: pullResult.output
618
- }
619
- };
620
- }
621
- catch (error) {
622
- throw new Error(`Falha ao fazer pull: ${error instanceof Error ? error.message : String(error)}`);
623
- }
624
- }
625
- };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.commitsTool = void 0;
4
+ const zod_1 = require("zod");
5
+ const index_js_1 = require("../providers/index.js");
6
+ const user_detection_js_1 = require("../utils/user-detection.js");
7
+ const terminal_controller_js_1 = require("../utils/terminal-controller.js");
8
+ /**
9
+ * Tool: commits
10
+ *
11
+ * DESCRIÇÃO:
12
+ * Gerenciamento completo de commits com suporte multi-provider (GitHub e Gitea)
13
+ *
14
+ * FUNCIONALIDADES:
15
+ * - Listagem de histórico de commits
16
+ * - Obtenção de detalhes específicos
17
+ * - Criação de novos commits
18
+ * - Comparação entre commits
19
+ * - Busca por mensagens e conteúdo
20
+ * - Análise de mudanças
21
+ *
22
+ * USO:
23
+ * - Para acompanhar histórico de mudanças
24
+ * - Para analisar evolução do código
25
+ * - Para criar commits programaticamente
26
+ * - Para auditoria de mudanças
27
+ *
28
+ * RECOMENDAÇÕES:
29
+ * - Use mensagens de commit descritivas
30
+ * - Mantenha commits atômicos
31
+ * - Documente mudanças importantes
32
+ * - Revise histórico regularmente
33
+ */
34
+ /**
35
+ * Schema de validação para entrada da tool commits
36
+ *
37
+ * VALIDAÇÕES:
38
+ * - action: Ação obrigatória (list, get, create, compare, search)
39
+ * - Parâmetros específicos por ação
40
+ * - Validação de tipos e formatos
41
+ *
42
+ * RECOMENDAÇÕES:
43
+ * - Sempre valide entrada antes de usar
44
+ * - Use parâmetros opcionais adequadamente
45
+ * - Documente parâmetros obrigatórios
46
+ */
47
+ const CommitsInputSchema = zod_1.z.object({
48
+ action: zod_1.z.enum(['list', 'get', 'create', 'compare', 'search', 'push', 'pull']),
49
+ // Parâmetros comuns
50
+ // owner: obtido automaticamente do provider,
51
+ repo: zod_1.z.string(),
52
+ projectPath: zod_1.z.string().describe('Local project path for git operations'),
53
+ // Para multi-provider
54
+ provider: zod_1.z.enum(['gitea', 'github']).describe('Provider to use (gitea or github)'), // Provider específico: gitea, github ou both
55
+ // Para list
56
+ sha: zod_1.z.string().optional(),
57
+ page: zod_1.z.number().min(1).optional(),
58
+ limit: zod_1.z.number().min(1).max(100).optional(),
59
+ // Para get
60
+ commit_sha: zod_1.z.string().optional(),
61
+ // Para create
62
+ message: zod_1.z.string().optional(),
63
+ branch: zod_1.z.string().optional(),
64
+ author_name: zod_1.z.string().optional(),
65
+ author_email: zod_1.z.string().optional(),
66
+ committer_name: zod_1.z.string().optional(),
67
+ committer_email: zod_1.z.string().optional(),
68
+ // Para compare
69
+ base: zod_1.z.string().optional(),
70
+ head: zod_1.z.string().optional(),
71
+ // Para search
72
+ query: zod_1.z.string().optional(),
73
+ author: zod_1.z.string().optional(),
74
+ });
75
+ /**
76
+ * Schema de saída padronizado
77
+ *
78
+ * ESTRUTURA:
79
+ * - success: Status da operação
80
+ * - action: Ação executada
81
+ * - message: Mensagem descritiva
82
+ * - data: Dados retornados (opcional)
83
+ * - error: Detalhes do erro (opcional)
84
+ */
85
+ const CommitsResultSchema = zod_1.z.object({
86
+ success: zod_1.z.boolean(),
87
+ action: zod_1.z.string(),
88
+ message: zod_1.z.string(),
89
+ data: zod_1.z.any().optional(),
90
+ error: zod_1.z.string().optional()
91
+ });
92
+ /**
93
+ * Tool: commits
94
+ *
95
+ * DESCRIÇÃO:
96
+ * Gerenciamento completo de commits Gitea com múltiplas ações
97
+ *
98
+ * ACTIONS DISPONÍVEIS:
99
+ *
100
+ * 1. list - Listar commits
101
+ * Parâmetros:
102
+ * - owner (obrigatório): Proprietário do repositório
103
+ * - repo (obrigatório): Nome do repositório
104
+ * - sha (opcional): Branch ou commit específico (padrão: branch padrão)
105
+ * - page (opcional): Página da listagem (padrão: 1)
106
+ * - limit (opcional): Itens por página (padrão: 30, máximo: 100)
107
+ *
108
+ * 2. get - Obter detalhes do commit
109
+ * Parâmetros:
110
+ * - owner (obrigatório): Proprietário do repositório
111
+ * - repo (obrigatório): Nome do repositório
112
+ * - commit_sha (obrigatório): SHA do commit
113
+ *
114
+ * 3. create - Criar novo commit
115
+ * Parâmetros:
116
+ * - owner (obrigatório): Proprietário do repositório
117
+ * - repo (obrigatório): Nome do repositório
118
+ * - message (obrigatório): Mensagem do commit
119
+ * - branch (obrigatório): Branch de destino
120
+ * - author_name (opcional): Nome do autor
121
+ * - author_email (opcional): Email do autor
122
+ * - committer_name (opcional): Nome do committer
123
+ * - committer_email (opcional): Email do committer
124
+ *
125
+ * 4. compare - Comparar commits
126
+ * Parâmetros:
127
+ * - owner (obrigatório): Proprietário do repositório
128
+ * - repo (obrigatório): Nome do repositório
129
+ * - base (obrigatório): Commit base para comparação
130
+ * - head (obrigatório): Commit para comparar
131
+ *
132
+ * 5. search - Buscar commits
133
+ * Parâmetros:
134
+ * - owner (obrigatório): Proprietário do repositório
135
+ * - repo (obrigatório): Nome do repositório
136
+ * - query (obrigatório): Termo de busca
137
+ * - author (opcional): Autor dos commits
138
+ * - page (opcional): Página da busca (padrão: 1)
139
+ * - limit (opcional): Itens por página (padrão: 30, máximo: 100)
140
+ *
141
+ * RECOMENDAÇÕES DE USO:
142
+ * - Use mensagens de commit descritivas
143
+ * - Mantenha commits atômicos
144
+ * - Documente mudanças importantes
145
+ * - Revise histórico regularmente
146
+ * - Use branches para features
147
+ * - Mantenha histórico limpo
148
+ */
149
+ exports.commitsTool = {
150
+ name: 'git-commits',
151
+ description: 'tool: Gerencia commits Git completos, histórico, criação e sincronização\n──────────────\naction list: lista commits do repositório\naction list requires: repo, page, limit, provider\n───────────────\naction get: obtém detalhes de commit específico\naction get requires: repo, sha, provider\n───────────────\naction create: cria novo commit\naction create requires: repo, message, branch, provider\n───────────────\naction compare: compara commits/branches\naction compare requires: repo, base, head, provider\n───────────────\naction search: busca commits por critérios\naction search requires: repo, query, author, provider\n───────────────\naction push: envia commits para remoto\naction push requires: repo, branch, provider\n───────────────\naction pull: baixa commits do remoto\naction pull requires: repo, branch, provider',
152
+ inputSchema: {
153
+ type: 'object',
154
+ properties: {
155
+ action: {
156
+ type: 'string',
157
+ enum: ['list', 'get', 'create', 'compare', 'search', 'push', 'pull'],
158
+ description: 'Action to perform on commits'
159
+ },
160
+ repo: { type: 'string', description: 'Repository name' },
161
+ provider: { type: 'string', description: 'Specific provider (github, gitea) or use default' },
162
+ sha: { type: 'string', description: 'Branch, tag or commit SHA' },
163
+ page: { type: 'number', description: 'Page number', minimum: 1 },
164
+ limit: { type: 'number', description: 'Items per page', minimum: 1, maximum: 100 },
165
+ commit_sha: { type: 'string', description: 'Specific commit SHA' },
166
+ message: { type: 'string', description: 'Commit message' },
167
+ branch: { type: 'string', description: 'Target branch' },
168
+ author_name: { type: 'string', description: 'Author name' },
169
+ author_email: { type: 'string', description: 'Author email' },
170
+ committer_name: { type: 'string', description: 'Committer name' },
171
+ committer_email: { type: 'string', description: 'Committer email' },
172
+ base: { type: 'string', description: 'Base commit/branch for comparison' },
173
+ head: { type: 'string', description: 'Head commit/branch for comparison' },
174
+ query: { type: 'string', description: 'Search query' },
175
+ author: { type: 'string', description: 'Author filter for search' }
176
+ },
177
+ required: ['action', 'repo', 'provider']
178
+ },
179
+ /**
180
+ * Handler principal da tool commits
181
+ *
182
+ * FUNCIONALIDADE:
183
+ * - Valida entrada usando Zod schema
184
+ * - Roteia para método específico baseado na ação
185
+ * - Trata erros de forma uniforme
186
+ * - Retorna resultado padronizado
187
+ *
188
+ * FLUXO:
189
+ * 1. Validação de entrada
190
+ * 2. Seleção do provider
191
+ * 3. Roteamento por ação
192
+ * 4. Execução do método específico
193
+ * 5. Tratamento de erros
194
+ * 6. Retorno de resultado
195
+ *
196
+ * TRATAMENTO DE ERROS:
197
+ * - Validação: erro de schema
198
+ * - Execução: erro da operação
199
+ * - Roteamento: ação não suportada
200
+ *
201
+ * RECOMENDAÇÕES:
202
+ * - Sempre valide entrada antes de processar
203
+ * - Trate erros específicos adequadamente
204
+ * - Log detalhes de erro para debug
205
+ * - Retorne mensagens de erro úteis
206
+ */
207
+ async handler(input) {
208
+ try {
209
+ const validatedInput = CommitsInputSchema.parse(input);
210
+ // Aplicar auto-detecção de usuário/owner
211
+ const processedInput = await (0, user_detection_js_1.applyAutoUserDetection)(validatedInput, validatedInput.provider);
212
+ // Obter o provider correto
213
+ const provider = processedInput.provider
214
+ ? index_js_1.globalProviderFactory.getProvider(processedInput.provider)
215
+ : index_js_1.globalProviderFactory.getDefaultProvider();
216
+ if (!provider) {
217
+ throw new Error(`Provider '${processedInput.provider}' não encontrado`);
218
+ }
219
+ // Obter o owner do provider
220
+ const owner = (await provider.getCurrentUser()).login;
221
+ // Para ações que precisam de owner, verificar se foi determinado
222
+ if (!owner && ['list', 'get', 'create', 'compare', 'search'].includes(processedInput.action)) {
223
+ throw new Error('Não foi possível determinar o owner automaticamente. Verifique se o token está configurado corretamente.');
224
+ }
225
+ switch (processedInput.action) {
226
+ case 'list':
227
+ return await this.listCommits(processedInput, provider, owner);
228
+ case 'get':
229
+ return await this.getCommit(processedInput, provider, owner);
230
+ case 'create':
231
+ return await this.createCommit(processedInput, provider, owner);
232
+ case 'compare':
233
+ return await this.compareCommits(processedInput, provider, owner);
234
+ case 'search':
235
+ return await this.searchCommits(processedInput, provider, owner);
236
+ case 'push':
237
+ return await this.pushCommits(processedInput, provider);
238
+ case 'pull':
239
+ return await this.pullCommits(processedInput, provider);
240
+ default:
241
+ throw new Error(`Ação não suportada: ${processedInput.action}`);
242
+ }
243
+ }
244
+ catch (error) {
245
+ return {
246
+ success: false,
247
+ action: input.action,
248
+ message: 'Erro na operação de commits',
249
+ error: error instanceof Error ? error.message : String(error)
250
+ };
251
+ }
252
+ },
253
+ /**
254
+ * Lista commits do repositório
255
+ *
256
+ * FUNCIONALIDADE:
257
+ * - Lista commits com paginação
258
+ * - Suporta filtro por branch ou commit
259
+ * - Retorna informações básicas de cada commit
260
+ *
261
+ * PARÂMETROS OBRIGATÓRIOS:
262
+ * - owner: Proprietário do repositório
263
+ * - repo: Nome do repositório
264
+ *
265
+ * PARÂMETROS OPCIONAIS:
266
+ * - sha: Branch, tag ou commit específico (padrão: branch padrão)
267
+ * - page: Página da listagem (padrão: 1)
268
+ * - limit: Itens por página (padrão: 30, máximo: 100)
269
+ *
270
+ * VALIDAÇÕES:
271
+ * - e repo obrigatórios
272
+ * - SHA deve ser válido se fornecido
273
+ * - Page deve ser >= 1
274
+ * - Limit deve ser entre 1 e 100
275
+ *
276
+ * RECOMENDAÇÕES:
277
+ * - Use paginação para repositórios grandes
278
+ * - Monitore número total de commits
279
+ * - Use SHA específico para análise
280
+ * - Mantenha histórico organizado
281
+ */
282
+ async listCommits(params, provider, owner) {
283
+ try {
284
+ if (!owner || !params.repo) {
285
+ throw new Error('e repo são obrigatórios');
286
+ }
287
+ const page = params.page || 1;
288
+ const limit = params.limit || 30;
289
+ const commits = await provider.listCommits(owner, params.repo, params.sha, page, limit);
290
+ return {
291
+ success: true,
292
+ action: 'list',
293
+ message: `${commits.length} commits encontrados`,
294
+ data: {
295
+ commits,
296
+ page,
297
+ limit,
298
+ total: commits.length,
299
+ sha: params.sha || 'branch padrão'
300
+ }
301
+ };
302
+ }
303
+ catch (error) {
304
+ throw new Error(`Falha ao listar commits: ${error instanceof Error ? error.message : String(error)}`);
305
+ }
306
+ },
307
+ /**
308
+ * Obtém detalhes de um commit específico
309
+ *
310
+ * FUNCIONALIDADE:
311
+ * - Obtém informações completas do commit
312
+ * - Inclui detalhes de autor e committer
313
+ * - Mostra arquivos modificados
314
+ * - Retorna hash e mensagem
315
+ *
316
+ * PARÂMETROS OBRIGATÓRIOS:
317
+ * - owner: Proprietário do repositório
318
+ * - repo: Nome do repositório
319
+ * - commit_sha: SHA do commit
320
+ *
321
+ * VALIDAÇÕES:
322
+ * - Todos os parâmetros obrigatórios
323
+ * - SHA deve ser válido
324
+ * - Commit deve existir
325
+ *
326
+ * RECOMENDAÇÕES:
327
+ * - Use para análise detalhada
328
+ * - Verifique arquivos modificados
329
+ * - Analise mensagem e autor
330
+ * - Documente mudanças importantes
331
+ */
332
+ async getCommit(params, provider, owner) {
333
+ try {
334
+ if (!owner || !params.repo) {
335
+ throw new Error('e repo são obrigatórios');
336
+ }
337
+ // Se não foi fornecido commit_sha, usa o SHA da branch padrão
338
+ let commitSha = params.commit_sha;
339
+ if (!commitSha) {
340
+ try {
341
+ const branchInfo = await provider.getBranch(owner, params.repo, 'main');
342
+ commitSha = branchInfo.commit.sha;
343
+ }
344
+ catch (error) {
345
+ // Se não conseguir obter o branch main, tenta master
346
+ try {
347
+ const branchInfo = await provider.getBranch(owner, params.repo, 'master');
348
+ commitSha = branchInfo.commit.sha;
349
+ }
350
+ catch (masterError) {
351
+ throw new Error('Não foi possível obter SHA do commit. Forneça commit_sha ou verifique se a branch existe.');
352
+ }
353
+ }
354
+ }
355
+ const commit = await provider.getCommit(owner, params.repo, commitSha);
356
+ return {
357
+ success: true,
358
+ action: 'get',
359
+ message: `Commit '${commitSha}' obtido com sucesso`,
360
+ data: {
361
+ commit,
362
+ sha: commitSha,
363
+ owner: owner,
364
+ repo: params.repo
365
+ }
366
+ };
367
+ }
368
+ catch (error) {
369
+ throw new Error(`Falha ao obter commit: ${error instanceof Error ? error.message : String(error)}`);
370
+ }
371
+ },
372
+ /**
373
+ * Cria um novo commit
374
+ *
375
+ * FUNCIONALIDADE:
376
+ * - Cria commit com mensagem personalizada
377
+ * - Suporta autor e committer diferentes
378
+ * - Permite especificar branch de destino
379
+ * - Valida dados obrigatórios
380
+ *
381
+ * PARÂMETROS OBRIGATÓRIOS:
382
+ * - owner: Proprietário do repositório
383
+ * - repo: Nome do repositório
384
+ * - message: Mensagem do commit
385
+ * - branch: Branch de destino
386
+ *
387
+ * PARÂMETROS OPCIONAIS:
388
+ * - author_name: Nome do autor
389
+ * - author_email: Email do autor
390
+ * - committer_name: Nome do committer
391
+ * - committer_email: Email do committer
392
+ *
393
+ * VALIDAÇÕES:
394
+ * - Todos os parâmetros obrigatórios
395
+ * - Mensagem não pode estar vazia
396
+ * - Branch deve existir
397
+ * - Emails devem ser válidos
398
+ *
399
+ * RECOMENDAÇÕES:
400
+ * - Use mensagens descritivas
401
+ * - Mantenha commits atômicos
402
+ * - Documente mudanças importantes
403
+ * - Use branches apropriadas
404
+ */
405
+ async createCommit(params, provider, owner) {
406
+ try {
407
+ if (!owner || !params.repo || !params.message || !params.branch) {
408
+ throw new Error('repo, message e branch são obrigatórios');
409
+ }
410
+ if (params.message.trim().length === 0) {
411
+ throw new Error('Mensagem do commit não pode estar vazia');
412
+ }
413
+ // Verificar se a branch existe
414
+ try {
415
+ await provider.getBranch(owner, params.repo, params.branch);
416
+ }
417
+ catch (error) {
418
+ throw new Error(`Branch '${params.branch}' não existe no repositório`);
419
+ }
420
+ // Obter informações do usuário atual para usar como padrão
421
+ const currentUser = await provider.getCurrentUser();
422
+ // Preparar dados do commit
423
+ const commitData = {
424
+ message: params.message,
425
+ branch: params.branch,
426
+ author: {
427
+ name: params.author_name || currentUser.login,
428
+ email: params.author_email || currentUser.email || `${currentUser.login}@example.com`
429
+ },
430
+ committer: {
431
+ name: params.committer_name || currentUser.login,
432
+ email: params.committer_email || currentUser.email || `${currentUser.login}@example.com`
433
+ }
434
+ };
435
+ // Criar o commit usando o provider
436
+ const commit = await provider.createCommit(owner, params.repo, commitData.message, commitData.branch, commitData.author.name, commitData.author.email, commitData.committer.name, commitData.committer.email);
437
+ return {
438
+ success: true,
439
+ action: 'create',
440
+ message: `Commit criado com sucesso na branch '${params.branch}'`,
441
+ data: {
442
+ commit: commit,
443
+ message: params.message,
444
+ branch: params.branch,
445
+ author: commitData.author,
446
+ committer: commitData.committer,
447
+ sha: commit.sha,
448
+ url: commit.html_url
449
+ }
450
+ };
451
+ }
452
+ catch (error) {
453
+ throw new Error(`Falha ao criar commit: ${error instanceof Error ? error.message : String(error)}`);
454
+ }
455
+ },
456
+ /**
457
+ * Compara dois commits ou branches
458
+ *
459
+ * FUNCIONALIDADE:
460
+ * - Compara diferenças entre commits
461
+ * - Mostra arquivos modificados
462
+ * - Retorna estatísticas de mudanças
463
+ *
464
+ * PARÂMETROS OBRIGATÓRIOS:
465
+ * - owner: Proprietário do repositório
466
+ * - repo: Nome do repositório
467
+ * - base: Commit ou branch base
468
+ * - head: Commit ou branch para comparar
469
+ *
470
+ * VALIDAÇÕES:
471
+ * - Todos os parâmetros obrigatórios
472
+ * - Base e head devem existir
473
+ * - Deve ser possível comparar
474
+ *
475
+ * RECOMENDAÇÕES:
476
+ * - Use para análise de mudanças
477
+ * - Compare antes de fazer merge
478
+ * - Analise arquivos modificados
479
+ * - Documente diferenças importantes
480
+ */
481
+ async compareCommits(params, provider, owner) {
482
+ try {
483
+ if (!owner || !params.repo || !params.base || !params.head) {
484
+ throw new Error('repo, base e head são obrigatórios');
485
+ }
486
+ // Verificar se os commits/branches existem
487
+ try {
488
+ // Tentar obter como commits primeiro
489
+ await provider.getCommit(owner, params.repo, params.base);
490
+ await provider.getCommit(owner, params.repo, params.head);
491
+ }
492
+ catch (commitError) {
493
+ try {
494
+ // Se falhar, tentar como branches
495
+ await provider.getBranch(owner, params.repo, params.base);
496
+ await provider.getBranch(owner, params.repo, params.head);
497
+ }
498
+ catch (branchError) {
499
+ throw new Error(`Commits/branches não encontrados: ${params.base} ou ${params.head}`);
500
+ }
501
+ }
502
+ // Obter commits de cada referência para análise
503
+ const baseCommits = await provider.listCommits(owner, params.repo, params.base, 1, 10);
504
+ const headCommits = await provider.listCommits(owner, params.repo, params.head, 1, 10);
505
+ // Comparar commits únicos
506
+ const baseCommitShas = baseCommits.map(c => c.sha);
507
+ const headCommitShas = headCommits.map(c => c.sha);
508
+ const uniqueBaseCommits = baseCommits.filter(c => !headCommitShas.includes(c.sha));
509
+ const uniqueHeadCommits = headCommits.filter(c => !baseCommitShas.includes(c.sha));
510
+ // Usar compareCommits do provider se disponível
511
+ let detailedComparison = null;
512
+ try {
513
+ if (provider.compareCommits) {
514
+ detailedComparison = await provider.compareCommits(owner, params.repo, params.base, params.head);
515
+ }
516
+ }
517
+ catch (error) {
518
+ console.warn('Comparação detalhada não disponível:', error);
519
+ }
520
+ return {
521
+ success: true,
522
+ action: 'compare',
523
+ message: `Comparação entre '${params.base}' e '${params.head}' realizada com sucesso`,
524
+ data: {
525
+ base: {
526
+ ref: params.base,
527
+ commits: baseCommits.length,
528
+ unique_commits: uniqueBaseCommits.length,
529
+ last_commit: baseCommits[0]?.sha
530
+ },
531
+ head: {
532
+ ref: params.head,
533
+ commits: headCommits.length,
534
+ unique_commits: uniqueHeadCommits.length,
535
+ last_commit: headCommits[0]?.sha
536
+ },
537
+ comparison: {
538
+ base_ahead: uniqueBaseCommits.length,
539
+ head_ahead: uniqueHeadCommits.length,
540
+ divergent: uniqueBaseCommits.length > 0 && uniqueHeadCommits.length > 0,
541
+ detailed: detailedComparison
542
+ },
543
+ summary: {
544
+ status: uniqueBaseCommits.length === 0 ? 'head está à frente' :
545
+ uniqueHeadCommits.length === 0 ? 'base está à frente' :
546
+ 'divergiram',
547
+ can_merge: uniqueBaseCommits.length === 0 || uniqueHeadCommits.length === 0,
548
+ requires_merge: uniqueBaseCommits.length > 0 && uniqueHeadCommits.length > 0
549
+ }
550
+ }
551
+ };
552
+ }
553
+ catch (error) {
554
+ throw new Error(`Falha ao comparar commits: ${error instanceof Error ? error.message : String(error)}`);
555
+ }
556
+ },
557
+ /**
558
+ * Busca commits por critérios específicos
559
+ *
560
+ * FUNCIONALIDADE:
561
+ * - Busca commits por mensagem
562
+ * - Filtra por autor
563
+ * - Suporta paginação
564
+ *
565
+ * PARÂMETROS OBRIGATÓRIOS:
566
+ * - owner: Proprietário do repositório
567
+ * - repo: Nome do repositório
568
+ * - query: Termo de busca
569
+ *
570
+ * PARÂMETROS OPCIONAIS:
571
+ * - author: Autor dos commits
572
+ * - page: Página da busca (padrão: 1)
573
+ * - limit: Itens por página (padrão: 30, máximo: 100)
574
+ *
575
+ * VALIDAÇÕES:
576
+ * - Todos os parâmetros obrigatórios
577
+ * - Query deve ter pelo menos 3 caracteres
578
+ * - Repositório deve existir
579
+ *
580
+ * RECOMENDAÇÕES:
581
+ * - Use termos de busca específicos
582
+ * - Combine com filtros de autor
583
+ * - Use paginação para resultados grandes
584
+ * - Analise relevância dos resultados
585
+ */
586
+ async searchCommits(params, provider, owner) {
587
+ try {
588
+ if (!owner || !params.repo || !params.query) {
589
+ throw new Error('repo e query são obrigatórios');
590
+ }
591
+ if (params.query.length < 3) {
592
+ throw new Error('Query deve ter pelo menos 3 caracteres');
593
+ }
594
+ const page = params.page || 1;
595
+ const limit = Math.min(params.limit || 30, 100);
596
+ // Buscar commits usando o provider
597
+ let searchResults = [];
598
+ if (provider.searchCommits) {
599
+ searchResults = await provider.searchCommits(owner, params.repo, params.query, params.author || undefined);
600
+ }
601
+ else {
602
+ // Fallback: buscar todos os commits e filtrar localmente
603
+ const allCommits = await provider.listCommits(owner, params.repo, undefined, 1, 100);
604
+ searchResults = allCommits.filter((commit) => commit.message?.toLowerCase().includes(params.query.toLowerCase()) ||
605
+ commit.commit?.message?.toLowerCase().includes(params.query.toLowerCase()));
606
+ }
607
+ // Filtrar resultados por página e limite
608
+ const startIndex = (page - 1) * limit;
609
+ const endIndex = startIndex + limit;
610
+ const paginatedResults = searchResults.slice(startIndex, endIndex);
611
+ // Filtrar por autor se especificado
612
+ const filteredResults = params.author
613
+ ? paginatedResults.filter((commit) => commit.commit?.author?.name?.toLowerCase().includes(params.author.toLowerCase()) ||
614
+ commit.author?.login?.toLowerCase().includes(params.author.toLowerCase()))
615
+ : paginatedResults;
616
+ return {
617
+ success: true,
618
+ action: 'search',
619
+ message: `${filteredResults.length} commits encontrados para '${params.query}'`,
620
+ data: {
621
+ query: params.query,
622
+ author: params.author || 'todos',
623
+ page,
624
+ limit,
625
+ total_found: searchResults.length,
626
+ results: filteredResults,
627
+ summary: {
628
+ total_commits: searchResults.length,
629
+ filtered_commits: filteredResults.length,
630
+ authors: [...new Set(filteredResults.map((c) => c.commit?.author?.name || c.author?.login).filter(Boolean))],
631
+ date_range: filteredResults.length > 0 ? {
632
+ earliest: filteredResults[filteredResults.length - 1]?.commit?.author?.date,
633
+ latest: filteredResults[0]?.commit?.author?.date
634
+ } : null
635
+ }
636
+ }
637
+ };
638
+ }
639
+ catch (error) {
640
+ throw new Error(`Falha ao buscar commits: ${error instanceof Error ? error.message : String(error)}`);
641
+ }
642
+ },
643
+ /**
644
+ * Faz push dos commits locais para o repositório remoto
645
+ *
646
+ * FUNCIONALIDADE:
647
+ * - Faz push da branch atual para o remote
648
+ * - Suporta especificar branch específica
649
+ * - Verifica se há commits para fazer push
650
+ *
651
+ * PARÂMETROS OBRIGATÓRIOS:
652
+ * - projectPath: Caminho do projeto local
653
+ *
654
+ * PARÂMETROS OPCIONAIS:
655
+ * - branch: Branch para fazer push (padrão: branch atual)
656
+ *
657
+ * RECOMENDAÇÕES:
658
+ * - Verifique se há commits locais antes do push
659
+ * - Use branch específica se necessário
660
+ * - Monitore conflitos durante o push
661
+ */
662
+ async pushCommits(params, provider) {
663
+ try {
664
+ if (!params.projectPath) {
665
+ throw new Error('projectPath é obrigatório para push');
666
+ }
667
+ const branch = params.branch || 'main';
668
+ // Faz push usando o terminal controller
669
+ const pushResult = await (0, terminal_controller_js_1.gitPush)(params.projectPath, branch);
670
+ if (pushResult.exitCode !== 0) {
671
+ throw new Error(`Falha no push: ${pushResult.output}`);
672
+ }
673
+ return {
674
+ success: true,
675
+ action: 'push',
676
+ message: `Push realizado com sucesso na branch '${branch}'`,
677
+ data: {
678
+ projectPath: params.projectPath,
679
+ branch: branch,
680
+ pushed: true,
681
+ output: pushResult.output
682
+ }
683
+ };
684
+ }
685
+ catch (error) {
686
+ throw new Error(`Falha ao fazer push: ${error instanceof Error ? error.message : String(error)}`);
687
+ }
688
+ },
689
+ /**
690
+ * Faz pull dos commits do repositório remoto
691
+ *
692
+ * FUNCIONALIDADE:
693
+ * - Faz pull da branch atual do remote
694
+ * - Suporta especificar branch específica
695
+ * - Faz merge automático se possível
696
+ *
697
+ * PARÂMETROS OBRIGATÓRIOS:
698
+ * - projectPath: Caminho do projeto local
699
+ *
700
+ * PARÂMETROS OPCIONAIS:
701
+ * - branch: Branch para fazer pull (padrão: branch atual)
702
+ *
703
+ * RECOMENDAÇÕES:
704
+ * - Faça backup antes do pull
705
+ * - Resolva conflitos manualmente se houver
706
+ * - Use branch específica se necessário
707
+ */
708
+ async pullCommits(params, provider) {
709
+ try {
710
+ if (!params.projectPath) {
711
+ throw new Error('projectPath é obrigatório para pull');
712
+ }
713
+ const branch = params.branch || 'main';
714
+ // Faz pull usando o terminal controller
715
+ const pullResult = await (0, terminal_controller_js_1.gitPull)(params.projectPath, branch);
716
+ if (pullResult.exitCode !== 0) {
717
+ throw new Error(`Falha no pull: ${pullResult.output}`);
718
+ }
719
+ return {
720
+ success: true,
721
+ action: 'pull',
722
+ message: `Pull realizado com sucesso na branch '${branch}'`,
723
+ data: {
724
+ projectPath: params.projectPath,
725
+ branch: branch,
726
+ pulled: true,
727
+ output: pullResult.output
728
+ }
729
+ };
730
+ }
731
+ catch (error) {
732
+ throw new Error(`Falha ao fazer pull: ${error instanceof Error ? error.message : String(error)}`);
733
+ }
734
+ }
735
+ };
626
736
  //# sourceMappingURL=git-commits.js.map