@andrebuzeli/git-mcp 2.28.0 → 2.28.2

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 (154) 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 -160
  8. package/dist/providers/base-provider.js +274 -274
  9. package/dist/providers/error-handler.d.ts +50 -50
  10. package/dist/providers/error-handler.js +175 -175
  11. package/dist/providers/gitea-provider.d.ts +97 -97
  12. package/dist/providers/gitea-provider.d.ts.map +1 -1
  13. package/dist/providers/gitea-provider.js +1015 -1001
  14. package/dist/providers/gitea-provider.js.map +1 -1
  15. package/dist/providers/github-provider.d.ts +104 -104
  16. package/dist/providers/github-provider.d.ts.map +1 -1
  17. package/dist/providers/github-provider.js +1248 -1234
  18. package/dist/providers/github-provider.js.map +1 -1
  19. package/dist/providers/index.d.ts +12 -12
  20. package/dist/providers/index.js +40 -40
  21. package/dist/providers/provider-factory.d.ts +74 -74
  22. package/dist/providers/provider-factory.d.ts.map +1 -1
  23. package/dist/providers/provider-factory.js +318 -311
  24. package/dist/providers/provider-factory.js.map +1 -1
  25. package/dist/providers/types.d.ts +318 -318
  26. package/dist/providers/types.js +6 -6
  27. package/dist/server.d.ts +76 -76
  28. package/dist/server.js +306 -306
  29. package/dist/tools/git-archive.d.ts +165 -165
  30. package/dist/tools/git-archive.js +233 -233
  31. package/dist/tools/git-branches.d.ts +430 -430
  32. package/dist/tools/git-branches.js +627 -627
  33. package/dist/tools/git-commits.d.ts +485 -485
  34. package/dist/tools/git-commits.js +735 -735
  35. package/dist/tools/git-commits.js.map +1 -1
  36. package/dist/tools/git-config.d.ts +140 -140
  37. package/dist/tools/git-config.js +268 -268
  38. package/dist/tools/git-files.d.ts +486 -486
  39. package/dist/tools/git-files.js +607 -607
  40. package/dist/tools/git-files.js.map +1 -1
  41. package/dist/tools/git-issues.d.ts +574 -571
  42. package/dist/tools/git-issues.d.ts.map +1 -1
  43. package/dist/tools/git-issues.js +741 -740
  44. package/dist/tools/git-issues.js.map +1 -1
  45. package/dist/tools/git-pulls.d.ts +697 -694
  46. package/dist/tools/git-pulls.d.ts.map +1 -1
  47. package/dist/tools/git-pulls.js +733 -732
  48. package/dist/tools/git-pulls.js.map +1 -1
  49. package/dist/tools/git-releases.d.ts +490 -487
  50. package/dist/tools/git-releases.d.ts.map +1 -1
  51. package/dist/tools/git-releases.js +558 -557
  52. package/dist/tools/git-releases.js.map +1 -1
  53. package/dist/tools/git-remote.d.ts +138 -138
  54. package/dist/tools/git-remote.js +274 -274
  55. package/dist/tools/git-repositories.d.ts +483 -483
  56. package/dist/tools/git-repositories.js +640 -640
  57. package/dist/tools/git-repositories.js.map +1 -1
  58. package/dist/tools/git-reset.d.ts +130 -130
  59. package/dist/tools/git-reset.js +223 -223
  60. package/dist/tools/git-revert.d.ts +149 -149
  61. package/dist/tools/git-revert.js +198 -198
  62. package/dist/tools/git-stash.d.ts +140 -140
  63. package/dist/tools/git-stash.js +269 -269
  64. package/dist/tools/git-sync.d.ts +178 -178
  65. package/dist/tools/git-sync.js +312 -312
  66. package/dist/tools/git-tags.d.ts +414 -411
  67. package/dist/tools/git-tags.d.ts.map +1 -1
  68. package/dist/tools/git-tags.js +486 -485
  69. package/dist/tools/git-tags.js.map +1 -1
  70. package/dist/tools/git-webhooks.d.ts +473 -470
  71. package/dist/tools/git-webhooks.d.ts.map +1 -1
  72. package/dist/tools/git-webhooks.js +544 -543
  73. package/dist/tools/git-webhooks.js.map +1 -1
  74. package/dist/utils/terminal-controller.d.ts +80 -80
  75. package/dist/utils/terminal-controller.js +345 -345
  76. package/dist/utils/user-detection.d.ts +24 -24
  77. package/dist/utils/user-detection.js +53 -53
  78. package/package.json +2 -2
  79. package/dist/tools/gh-actions.d.ts +0 -253
  80. package/dist/tools/gh-actions.d.ts.map +0 -1
  81. package/dist/tools/gh-actions.js +0 -390
  82. package/dist/tools/gh-actions.js.map +0 -1
  83. package/dist/tools/gh-analytics.d.ts +0 -264
  84. package/dist/tools/gh-analytics.d.ts.map +0 -1
  85. package/dist/tools/gh-analytics.js +0 -402
  86. package/dist/tools/gh-analytics.js.map +0 -1
  87. package/dist/tools/gh-code-review.d.ts +0 -305
  88. package/dist/tools/gh-code-review.d.ts.map +0 -1
  89. package/dist/tools/gh-code-review.js +0 -513
  90. package/dist/tools/gh-code-review.js.map +0 -1
  91. package/dist/tools/gh-codespaces.d.ts +0 -139
  92. package/dist/tools/gh-codespaces.d.ts.map +0 -1
  93. package/dist/tools/gh-codespaces.js +0 -283
  94. package/dist/tools/gh-codespaces.js.map +0 -1
  95. package/dist/tools/gh-deployments.d.ts +0 -301
  96. package/dist/tools/gh-deployments.d.ts.map +0 -1
  97. package/dist/tools/gh-deployments.js +0 -368
  98. package/dist/tools/gh-deployments.js.map +0 -1
  99. package/dist/tools/gh-gists.d.ts +0 -175
  100. package/dist/tools/gh-gists.d.ts.map +0 -1
  101. package/dist/tools/gh-gists.js +0 -322
  102. package/dist/tools/gh-gists.js.map +0 -1
  103. package/dist/tools/gh-projects.d.ts +0 -206
  104. package/dist/tools/gh-projects.d.ts.map +0 -1
  105. package/dist/tools/gh-projects.js +0 -359
  106. package/dist/tools/gh-projects.js.map +0 -1
  107. package/dist/tools/gh-security.d.ts +0 -275
  108. package/dist/tools/gh-security.d.ts.map +0 -1
  109. package/dist/tools/gh-security.js +0 -396
  110. package/dist/tools/gh-security.js.map +0 -1
  111. package/dist/tools/gh-sync.d.ts +0 -214
  112. package/dist/tools/gh-sync.d.ts.map +0 -1
  113. package/dist/tools/gh-sync.js +0 -379
  114. package/dist/tools/gh-sync.js.map +0 -1
  115. package/dist/tools/gh-workflows.d.ts +0 -291
  116. package/dist/tools/gh-workflows.d.ts.map +0 -1
  117. package/dist/tools/gh-workflows.js +0 -433
  118. package/dist/tools/gh-workflows.js.map +0 -1
  119. package/dist/tools/git-bundle.d.ts +0 -172
  120. package/dist/tools/git-bundle.d.ts.map +0 -1
  121. package/dist/tools/git-bundle.js +0 -242
  122. package/dist/tools/git-bundle.js.map +0 -1
  123. package/dist/tools/git-cherry-pick.d.ts +0 -159
  124. package/dist/tools/git-cherry-pick.d.ts.map +0 -1
  125. package/dist/tools/git-cherry-pick.js +0 -225
  126. package/dist/tools/git-cherry-pick.js.map +0 -1
  127. package/dist/tools/git-rebase.d.ts +0 -138
  128. package/dist/tools/git-rebase.d.ts.map +0 -1
  129. package/dist/tools/git-rebase.js +0 -214
  130. package/dist/tools/git-rebase.js.map +0 -1
  131. package/dist/tools/git-submodule.d.ts +0 -153
  132. package/dist/tools/git-submodule.d.ts.map +0 -1
  133. package/dist/tools/git-submodule.js +0 -290
  134. package/dist/tools/git-submodule.js.map +0 -1
  135. package/dist/tools/git-worktree.d.ts +0 -160
  136. package/dist/tools/git-worktree.d.ts.map +0 -1
  137. package/dist/tools/git-worktree.js +0 -270
  138. package/dist/tools/git-worktree.js.map +0 -1
  139. package/dist/tools/repositories.d.ts +0 -406
  140. package/dist/tools/repositories.d.ts.map +0 -1
  141. package/dist/tools/repositories.js +0 -570
  142. package/dist/tools/repositories.js.map +0 -1
  143. package/dist/tools/users.d.ts +0 -373
  144. package/dist/tools/users.d.ts.map +0 -1
  145. package/dist/tools/users.js +0 -500
  146. package/dist/tools/users.js.map +0 -1
  147. package/dist/tools/validator.d.ts +0 -171
  148. package/dist/tools/validator.d.ts.map +0 -1
  149. package/dist/tools/validator.js +0 -195
  150. package/dist/tools/validator.js.map +0 -1
  151. package/dist/tools/version-control.d.ts +0 -137
  152. package/dist/tools/version-control.d.ts.map +0 -1
  153. package/dist/tools/version-control.js +0 -165
  154. package/dist/tools/version-control.js.map +0 -1
@@ -1,736 +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
- // 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
- };
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', 'projectPath']
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
+ };
736
736
  //# sourceMappingURL=git-commits.js.map