@andrebuzeli/git-mcp 2.28.1 → 2.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) 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 +74 -50
  10. package/dist/providers/error-handler.d.ts.map +1 -1
  11. package/dist/providers/error-handler.js +234 -175
  12. package/dist/providers/error-handler.js.map +1 -1
  13. package/dist/providers/gitea-provider.d.ts +97 -97
  14. package/dist/providers/gitea-provider.d.ts.map +1 -1
  15. package/dist/providers/gitea-provider.js +1015 -1001
  16. package/dist/providers/gitea-provider.js.map +1 -1
  17. package/dist/providers/github-provider.d.ts +104 -104
  18. package/dist/providers/github-provider.d.ts.map +1 -1
  19. package/dist/providers/github-provider.js +1248 -1234
  20. package/dist/providers/github-provider.js.map +1 -1
  21. package/dist/providers/index.d.ts +12 -12
  22. package/dist/providers/index.js +40 -40
  23. package/dist/providers/provider-factory.d.ts +74 -74
  24. package/dist/providers/provider-factory.d.ts.map +1 -1
  25. package/dist/providers/provider-factory.js +318 -311
  26. package/dist/providers/provider-factory.js.map +1 -1
  27. package/dist/providers/types.d.ts +318 -318
  28. package/dist/providers/types.js +6 -6
  29. package/dist/server.d.ts +76 -76
  30. package/dist/server.js +306 -306
  31. package/dist/server.js.map +1 -1
  32. package/dist/tools/git-archive.d.ts +169 -165
  33. package/dist/tools/git-archive.d.ts.map +1 -1
  34. package/dist/tools/git-archive.js +246 -233
  35. package/dist/tools/git-archive.js.map +1 -1
  36. package/dist/tools/git-branches.d.ts +434 -430
  37. package/dist/tools/git-branches.d.ts.map +1 -1
  38. package/dist/tools/git-branches.js +640 -627
  39. package/dist/tools/git-branches.js.map +1 -1
  40. package/dist/tools/git-commits.d.ts +489 -485
  41. package/dist/tools/git-commits.d.ts.map +1 -1
  42. package/dist/tools/git-commits.js +748 -735
  43. package/dist/tools/git-commits.js.map +1 -1
  44. package/dist/tools/git-config.d.ts +144 -140
  45. package/dist/tools/git-config.d.ts.map +1 -1
  46. package/dist/tools/git-config.js +281 -268
  47. package/dist/tools/git-config.js.map +1 -1
  48. package/dist/tools/git-files.d.ts +490 -486
  49. package/dist/tools/git-files.d.ts.map +1 -1
  50. package/dist/tools/git-files.js +620 -607
  51. package/dist/tools/git-files.js.map +1 -1
  52. package/dist/tools/git-initialize.d.ts +46 -42
  53. package/dist/tools/git-initialize.d.ts.map +1 -1
  54. package/dist/tools/git-initialize.js +81 -68
  55. package/dist/tools/git-initialize.js.map +1 -1
  56. package/dist/tools/git-issues.d.ts +578 -571
  57. package/dist/tools/git-issues.d.ts.map +1 -1
  58. package/dist/tools/git-issues.js +754 -740
  59. package/dist/tools/git-issues.js.map +1 -1
  60. package/dist/tools/git-pulls.d.ts +701 -694
  61. package/dist/tools/git-pulls.d.ts.map +1 -1
  62. package/dist/tools/git-pulls.js +746 -732
  63. package/dist/tools/git-pulls.js.map +1 -1
  64. package/dist/tools/git-releases.d.ts +494 -487
  65. package/dist/tools/git-releases.d.ts.map +1 -1
  66. package/dist/tools/git-releases.js +571 -557
  67. package/dist/tools/git-releases.js.map +1 -1
  68. package/dist/tools/git-remote.d.ts +142 -138
  69. package/dist/tools/git-remote.d.ts.map +1 -1
  70. package/dist/tools/git-remote.js +287 -274
  71. package/dist/tools/git-remote.js.map +1 -1
  72. package/dist/tools/git-repositories.d.ts +487 -483
  73. package/dist/tools/git-repositories.d.ts.map +1 -1
  74. package/dist/tools/git-repositories.js +653 -640
  75. package/dist/tools/git-repositories.js.map +1 -1
  76. package/dist/tools/git-reset.d.ts +134 -130
  77. package/dist/tools/git-reset.d.ts.map +1 -1
  78. package/dist/tools/git-reset.js +236 -223
  79. package/dist/tools/git-reset.js.map +1 -1
  80. package/dist/tools/git-revert.d.ts +153 -149
  81. package/dist/tools/git-revert.d.ts.map +1 -1
  82. package/dist/tools/git-revert.js +211 -198
  83. package/dist/tools/git-revert.js.map +1 -1
  84. package/dist/tools/git-stash.d.ts +144 -140
  85. package/dist/tools/git-stash.d.ts.map +1 -1
  86. package/dist/tools/git-stash.js +282 -269
  87. package/dist/tools/git-stash.js.map +1 -1
  88. package/dist/tools/git-sync.d.ts +182 -178
  89. package/dist/tools/git-sync.d.ts.map +1 -1
  90. package/dist/tools/git-sync.js +325 -312
  91. package/dist/tools/git-sync.js.map +1 -1
  92. package/dist/tools/git-tags.d.ts +418 -411
  93. package/dist/tools/git-tags.d.ts.map +1 -1
  94. package/dist/tools/git-tags.js +499 -485
  95. package/dist/tools/git-tags.js.map +1 -1
  96. package/dist/tools/git-upload-project.d.ts +5 -1
  97. package/dist/tools/git-upload-project.d.ts.map +1 -1
  98. package/dist/tools/git-upload-project.js +21 -1
  99. package/dist/tools/git-upload-project.js.map +1 -1
  100. package/dist/tools/git-webhooks.d.ts +477 -470
  101. package/dist/tools/git-webhooks.d.ts.map +1 -1
  102. package/dist/tools/git-webhooks.js +561 -543
  103. package/dist/tools/git-webhooks.js.map +1 -1
  104. package/dist/utils/git-error-analyzer.d.ts +64 -0
  105. package/dist/utils/git-error-analyzer.d.ts.map +1 -0
  106. package/dist/utils/git-error-analyzer.js +286 -0
  107. package/dist/utils/git-error-analyzer.js.map +1 -0
  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 +2 -2
  113. package/dist/tools/gh-actions.d.ts +0 -253
  114. package/dist/tools/gh-actions.d.ts.map +0 -1
  115. package/dist/tools/gh-actions.js +0 -390
  116. package/dist/tools/gh-actions.js.map +0 -1
  117. package/dist/tools/gh-analytics.d.ts +0 -264
  118. package/dist/tools/gh-analytics.d.ts.map +0 -1
  119. package/dist/tools/gh-analytics.js +0 -402
  120. package/dist/tools/gh-analytics.js.map +0 -1
  121. package/dist/tools/gh-code-review.d.ts +0 -305
  122. package/dist/tools/gh-code-review.d.ts.map +0 -1
  123. package/dist/tools/gh-code-review.js +0 -513
  124. package/dist/tools/gh-code-review.js.map +0 -1
  125. package/dist/tools/gh-codespaces.d.ts +0 -139
  126. package/dist/tools/gh-codespaces.d.ts.map +0 -1
  127. package/dist/tools/gh-codespaces.js +0 -283
  128. package/dist/tools/gh-codespaces.js.map +0 -1
  129. package/dist/tools/gh-deployments.d.ts +0 -301
  130. package/dist/tools/gh-deployments.d.ts.map +0 -1
  131. package/dist/tools/gh-deployments.js +0 -368
  132. package/dist/tools/gh-deployments.js.map +0 -1
  133. package/dist/tools/gh-gists.d.ts +0 -175
  134. package/dist/tools/gh-gists.d.ts.map +0 -1
  135. package/dist/tools/gh-gists.js +0 -322
  136. package/dist/tools/gh-gists.js.map +0 -1
  137. package/dist/tools/gh-projects.d.ts +0 -206
  138. package/dist/tools/gh-projects.d.ts.map +0 -1
  139. package/dist/tools/gh-projects.js +0 -359
  140. package/dist/tools/gh-projects.js.map +0 -1
  141. package/dist/tools/gh-security.d.ts +0 -275
  142. package/dist/tools/gh-security.d.ts.map +0 -1
  143. package/dist/tools/gh-security.js +0 -396
  144. package/dist/tools/gh-security.js.map +0 -1
  145. package/dist/tools/gh-sync.d.ts +0 -214
  146. package/dist/tools/gh-sync.d.ts.map +0 -1
  147. package/dist/tools/gh-sync.js +0 -379
  148. package/dist/tools/gh-sync.js.map +0 -1
  149. package/dist/tools/gh-workflows.d.ts +0 -291
  150. package/dist/tools/gh-workflows.d.ts.map +0 -1
  151. package/dist/tools/gh-workflows.js +0 -433
  152. package/dist/tools/gh-workflows.js.map +0 -1
  153. package/dist/tools/git-bundle.d.ts +0 -172
  154. package/dist/tools/git-bundle.d.ts.map +0 -1
  155. package/dist/tools/git-bundle.js +0 -242
  156. package/dist/tools/git-bundle.js.map +0 -1
  157. package/dist/tools/git-cherry-pick.d.ts +0 -159
  158. package/dist/tools/git-cherry-pick.d.ts.map +0 -1
  159. package/dist/tools/git-cherry-pick.js +0 -225
  160. package/dist/tools/git-cherry-pick.js.map +0 -1
  161. package/dist/tools/git-rebase.d.ts +0 -138
  162. package/dist/tools/git-rebase.d.ts.map +0 -1
  163. package/dist/tools/git-rebase.js +0 -214
  164. package/dist/tools/git-rebase.js.map +0 -1
  165. package/dist/tools/git-submodule.d.ts +0 -153
  166. package/dist/tools/git-submodule.d.ts.map +0 -1
  167. package/dist/tools/git-submodule.js +0 -290
  168. package/dist/tools/git-submodule.js.map +0 -1
  169. package/dist/tools/git-worktree.d.ts +0 -160
  170. package/dist/tools/git-worktree.d.ts.map +0 -1
  171. package/dist/tools/git-worktree.js +0 -270
  172. package/dist/tools/git-worktree.js.map +0 -1
  173. package/dist/tools/repositories.d.ts +0 -406
  174. package/dist/tools/repositories.d.ts.map +0 -1
  175. package/dist/tools/repositories.js +0 -570
  176. package/dist/tools/repositories.js.map +0 -1
  177. package/dist/tools/users.d.ts +0 -373
  178. package/dist/tools/users.d.ts.map +0 -1
  179. package/dist/tools/users.js +0 -500
  180. package/dist/tools/users.js.map +0 -1
  181. package/dist/tools/validator.d.ts +0 -171
  182. package/dist/tools/validator.d.ts.map +0 -1
  183. package/dist/tools/validator.js +0 -195
  184. package/dist/tools/validator.js.map +0 -1
  185. package/dist/tools/version-control.d.ts +0 -137
  186. package/dist/tools/version-control.d.ts.map +0 -1
  187. package/dist/tools/version-control.js +0 -165
  188. package/dist/tools/version-control.js.map +0 -1
@@ -1,741 +1,755 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.issuesTool = 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
- /**
8
- * Tool: issues
9
- *
10
- * DESCRIÇÃO:
11
- * Gerenciamento completo de issues com suporte multi-provider (GitHub e Gitea)
12
- *
13
- * FUNCIONALIDADES:
14
- * - Criação de novas issues
15
- * - Listagem e busca de issues
16
- * - Obtenção de detalhes específicos
17
- * - Atualização de issues existentes
18
- * - Fechamento de issues
19
- * - Adição de comentários
20
- * - Busca por conteúdo e status
21
- *
22
- * USO:
23
- * - Para gerenciar bugs e features
24
- * - Para acompanhar progresso de desenvolvimento
25
- * - Para comunicação entre equipe
26
- * - Para controle de qualidade
27
- *
28
- * RECOMENDAÇÕES:
29
- * - Use títulos descritivos
30
- * - Documente detalhes completos
31
- * - Atualize status regularmente
32
- * - Use labels adequadamente
33
- */
34
- /**
35
- * Schema de validação para entrada da tool issues
36
- *
37
- * VALIDAÇÕES:
38
- * - action: Ação obrigatória (create, list, get, update, close, comment, 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 IssuesInputSchema = zod_1.z.object({
48
- action: zod_1.z.enum(['create', 'list', 'get', 'update', 'close', 'comment', 'search']),
49
- // Parâmetros comuns
50
- repo: zod_1.z.string(),
51
- // Para multi-provider
52
- provider: zod_1.z.enum(['gitea', 'github']).describe('Provider to use (gitea or github)'), // Provider específico: gitea, github ou both
53
- // Para create
54
- title: zod_1.z.string().optional(),
55
- body: zod_1.z.string().optional(),
56
- labels: zod_1.z.array(zod_1.z.string()).optional(),
57
- assignees: zod_1.z.array(zod_1.z.string()).optional(),
58
- milestone: zod_1.z.number().optional(),
59
- // Para get/update/close/comment
60
- issue_number: zod_1.z.number().optional(),
61
- // Para list
62
- state: zod_1.z.enum(['open', 'closed', 'all']).optional(),
63
- page: zod_1.z.number().min(1).optional(),
64
- limit: zod_1.z.number().min(1).max(100).optional(),
65
- // Para update
66
- new_title: zod_1.z.string().optional(),
67
- new_body: zod_1.z.string().optional(),
68
- new_state: zod_1.z.enum(['open', 'closed']).optional(),
69
- new_labels: zod_1.z.array(zod_1.z.string()).optional(),
70
- new_assignees: zod_1.z.array(zod_1.z.string()).optional(),
71
- new_milestone: zod_1.z.number().optional(),
72
- // Para comment
73
- comment_body: zod_1.z.string().optional(),
74
- // Para search
75
- query: zod_1.z.string().optional(),
76
- author: zod_1.z.string().optional(),
77
- assignee: zod_1.z.string().optional(),
78
- label: zod_1.z.string().optional(),
79
- });
80
- /**
81
- * Schema de saída padronizado
82
- *
83
- * ESTRUTURA:
84
- * - success: Status da operação
85
- * - action: Ação executada
86
- * - message: Mensagem descritiva
87
- * - data: Dados retornados (opcional)
88
- * - error: Detalhes do erro (opcional)
89
- */
90
- const IssuesResultSchema = zod_1.z.object({
91
- success: zod_1.z.boolean(),
92
- action: zod_1.z.string(),
93
- message: zod_1.z.string(),
94
- data: zod_1.z.any().optional(),
95
- error: zod_1.z.string().optional()
96
- });
97
- /**
98
- * Tool: issues
99
- *
100
- * DESCRIÇÃO:
101
- * Gerenciamento completo de issues Gitea com múltiplas ações
102
- *
103
- * ACTIONS DISPONÍVEIS:
104
- *
105
- * 1. create - Criar nova issue
106
- * Parâmetros:
107
- * - owner (obrigatório): Proprietário do repositório
108
- * - repo (obrigatório): Nome do repositório
109
- * - title (obrigatório): Título da issue
110
- * - body (opcional): Descrição detalhada
111
- * - labels (opcional): Array de labels
112
- * - assignees (opcional): Array de usuários responsáveis
113
- * - milestone (opcional): ID do milestone
114
- *
115
- * 2. list - Listar issues
116
- * Parâmetros:
117
- * - owner (obrigatório): Proprietário do repositório
118
- * - repo (obrigatório): Nome do repositório
119
- * - state (opcional): Estado das issues (open, closed, all) - padrão: open
120
- * - page (opcional): Página da listagem (padrão: 1)
121
- * - limit (opcional): Itens por página (padrão: 30, máximo: 100)
122
- *
123
- * 3. get - Obter detalhes da issue
124
- * Parâmetros:
125
- * - owner (obrigatório): Proprietário do repositório
126
- * - repo (obrigatório): Nome do repositório
127
- * - issue_number (obrigatório): Número da issue
128
- *
129
- * 4. update - Atualizar issue existente
130
- * Parâmetros:
131
- * - owner (obrigatório): Proprietário do repositório
132
- * - repo (obrigatório): Nome do repositório
133
- * - issue_number (obrigatório): Número da issue
134
- * - new_title (opcional): Novo título
135
- * - new_body (opcional): Nova descrição
136
- * - new_state (opcional): Novo estado
137
- * - new_labels (opcional): Novos labels
138
- * - new_assignees (opcional): Novos responsáveis
139
- * - new_milestone (opcional): Novo milestone
140
- *
141
- * 5. close - Fechar issue
142
- * Parâmetros:
143
- * - owner (obrigatório): Proprietário do repositório
144
- * - repo (obrigatório): Nome do repositório
145
- * - issue_number (obrigatório): Número da issue
146
- *
147
- * 6. comment - Adicionar comentário
148
- * Parâmetros:
149
- * - owner (obrigatório): Proprietário do repositório
150
- * - repo (obrigatório): Nome do repositório
151
- * - issue_number (obrigatório): Número da issue
152
- * - comment_body (obrigatório): Conteúdo do comentário
153
- *
154
- * 7. search - Buscar issues
155
- * Parâmetros:
156
- * - owner (obrigatório): Proprietário do repositório
157
- * - repo (obrigatório): Nome do repositório
158
- * - query (obrigatório): Termo de busca
159
- * - author (opcional): Autor das issues
160
- * - assignee (opcional): Responsável pelas issues
161
- * - label (opcional): Label específico
162
- *
163
- * RECOMENDAÇÕES DE USO:
164
- * - Use títulos descritivos e claros
165
- * - Documente detalhes completos na descrição
166
- * - Atualize status regularmente
167
- * - Use labels para categorização
168
- * - Atribua responsáveis adequadamente
169
- * - Mantenha issues organizadas
170
- */
171
- exports.issuesTool = {
172
- name: 'git-issues',
173
- description: 'tool: Gerencia issues Git, bugs, features e tarefas\n──────────────\naction create: cria nova issue\naction create requires: repo, title, body, labels, assignees, milestone, provider\n───────────────\naction list: lista issues do repositório\naction list requires: repo, state, page, limit, provider\n───────────────\naction get: obtém detalhes de issue\naction get requires: repo, issue_number, provider\n───────────────\naction update: atualiza issue existente\naction update requires: repo, issue_number, new_title, new_body, new_state, new_labels, new_assignees, new_milestone, provider\n───────────────\naction close: fecha issue\naction close requires: repo, issue_number, provider\n───────────────\naction comment: adiciona comentário\naction comment requires: repo, issue_number, comment_body, provider\n───────────────\naction search: busca issues por critérios\naction search requires: repo, query, author, assignee, label, provider',
174
- inputSchema: {
175
- type: 'object',
176
- properties: {
177
- action: {
178
- type: 'string',
179
- enum: ['create', 'list', 'get', 'update', 'close', 'comment', 'search'],
180
- description: 'Action to perform on issues'
181
- },
182
- repo: { type: 'string', description: 'Repository name' },
183
- provider: { type: 'string', description: 'Provider to use (github, gitea, or omit for default)' },
184
- title: { type: 'string', description: 'Issue title' },
185
- body: { type: 'string', description: 'Issue body/description' },
186
- labels: { type: 'array', items: { type: 'string' }, description: 'Issue labels' },
187
- assignees: { type: 'array', items: { type: 'string' }, description: 'Issue assignees' },
188
- milestone: { type: 'number', description: 'Milestone ID' },
189
- issue_number: { type: 'number', description: 'Issue number' },
190
- state: { type: 'string', enum: ['open', 'closed', 'all'], description: 'Issue state' },
191
- page: { type: 'number', description: 'Page number', minimum: 1 },
192
- limit: { type: 'number', description: 'Items per page', minimum: 1, maximum: 100 },
193
- new_title: { type: 'string', description: 'New issue title' },
194
- new_body: { type: 'string', description: 'New issue body' },
195
- new_state: { type: 'string', enum: ['open', 'closed'], description: 'New issue state' },
196
- new_labels: { type: 'array', items: { type: 'string' }, description: 'New issue labels' },
197
- new_assignees: { type: 'array', items: { type: 'string' }, description: 'New issue assignees' },
198
- new_milestone: { type: 'number', description: 'New milestone ID' },
199
- comment_body: { type: 'string', description: 'Comment content' },
200
- query: { type: 'string', description: 'Search query' },
201
- author: { type: 'string', description: 'Issue author filter' },
202
- assignee: { type: 'string', description: 'Issue assignee filter' },
203
- label: { type: 'string', description: 'Issue label filter' }
204
- },
205
- required: ['action', 'repo', 'provider']
206
- },
207
- /**
208
- * Handler principal da tool issues
209
- *
210
- * FUNCIONALIDADE:
211
- * - Valida entrada usando Zod schema
212
- * - Roteia para método específico baseado na ação
213
- * - Trata erros de forma uniforme
214
- * - Retorna resultado padronizado
215
- *
216
- * FLUXO:
217
- * 1. Validação de entrada
218
- * 2. Seleção do provider
219
- * 3. Roteamento por ação
220
- * 4. Execução do método específico
221
- * 5. Tratamento de erros
222
- * 6. Retorno de resultado
223
- *
224
- * TRATAMENTO DE ERROS:
225
- * - Validação: erro de schema
226
- * - Execução: erro da operação
227
- * - Roteamento: ação não suportada
228
- *
229
- * RECOMENDAÇÕES:
230
- * - Sempre valide entrada antes de processar
231
- * - Trate erros específicos adequadamente
232
- * - Log detalhes de erro para debug
233
- * - Retorne mensagens de erro úteis
234
- */
235
- async handler(input) {
236
- try {
237
- const validatedInput = IssuesInputSchema.parse(input);
238
- // Aplicar auto-detecção de usuário/owner
239
- const processedInput = await (0, user_detection_js_1.applyAutoUserDetection)(validatedInput, validatedInput.provider);
240
- // Obter o provider correto
241
- let provider;
242
- try {
243
- if (processedInput.provider) {
244
- const requestedProvider = index_js_1.globalProviderFactory.getProvider(processedInput.provider);
245
- if (!requestedProvider) {
246
- console.warn(`[ISSUES] Provider '${processedInput.provider}' não encontrado, usando padrão`);
247
- provider = index_js_1.globalProviderFactory.getDefaultProvider();
248
- }
249
- else {
250
- provider = requestedProvider;
251
- }
252
- }
253
- else {
254
- provider = index_js_1.globalProviderFactory.getDefaultProvider();
255
- }
256
- if (!provider) {
257
- throw new Error('Nenhum provider disponível');
258
- }
259
- }
260
- catch (providerError) {
261
- console.error('[ISSUES] Erro ao obter provider:', providerError);
262
- throw new Error(`Erro de configuração do provider: ${providerError instanceof Error ? providerError.message : 'Provider não disponível'}`);
263
- }
264
- // Obter o owner do provider
265
- const owner = (await provider.getCurrentUser()).login;
266
- switch (processedInput.action) {
267
- case 'create':
268
- return await this.createIssue(processedInput, provider, owner);
269
- case 'list':
270
- return await this.listIssues(processedInput, provider, owner);
271
- case 'get':
272
- return await this.getIssue(processedInput, provider, owner);
273
- case 'update':
274
- return await this.updateIssue(processedInput, provider, owner);
275
- case 'close':
276
- return await this.closeIssue(processedInput, provider, owner);
277
- case 'comment':
278
- return await this.addComment(processedInput, provider, owner);
279
- case 'search':
280
- return await this.searchIssues(processedInput, provider, owner);
281
- default:
282
- throw new Error(`Ação não suportada: ${processedInput.action}`);
283
- }
284
- }
285
- catch (error) {
286
- return {
287
- success: false,
288
- action: input.action,
289
- message: 'Erro na operação de issues',
290
- error: error instanceof Error ? error.message : String(error)
291
- };
292
- }
293
- },
294
- /**
295
- * Cria uma nova issue no repositório
296
- *
297
- * FUNCIONALIDADE:
298
- * - Cria issue com título e descrição
299
- * - Suporta labels, assignees e milestone
300
- * - Retorna detalhes da issue criada
301
- *
302
- * PARÂMETROS OBRIGATÓRIOS:
303
- * - owner: Proprietário do repositório
304
- * - repo: Nome do repositório
305
- * - title: Título da issue
306
- *
307
- * PARÂMETROS OPCIONAIS:
308
- * - body: Descrição detalhada
309
- * - labels: Array de labels para categorização
310
- * - assignees: Array de usuários responsáveis
311
- * - milestone: ID do milestone associado
312
- *
313
- * VALIDAÇÕES:
314
- * - Todos os parâmetros obrigatórios
315
- * - Título deve ser único no repositório
316
- * - Labels devem existir no repositório
317
- * - Assignees devem ser usuários válidos
318
- *
319
- * RECOMENDAÇÕES:
320
- * - Use títulos descritivos e claros
321
- * - Documente detalhes completos
322
- * - Use labels para categorização
323
- * - Atribua responsáveis adequadamente
324
- */
325
- async createIssue(params, provider, owner) {
326
- try {
327
- if (!owner) {
328
- throw new Error( obrigatório');
329
- }
330
- if (!params.repo) {
331
- throw new Error('Repo é obrigatório');
332
- }
333
- if (!params.title) {
334
- throw new Error('Title é obrigatório');
335
- }
336
- const issue = await provider.createIssue(owner, params.repo, params.title, params.body, params.assignees, params.labels);
337
- return {
338
- success: true,
339
- action: 'create',
340
- message: `Issue '${params.title}' criada com sucesso`,
341
- data: issue
342
- };
343
- }
344
- catch (error) {
345
- throw new Error(`Falha ao criar issue: ${error instanceof Error ? error.message : String(error)}`);
346
- }
347
- },
348
- /**
349
- * Lista issues do repositório
350
- *
351
- * FUNCIONALIDADE:
352
- * - Lista issues com filtros de estado
353
- * - Suporta paginação
354
- * - Retorna informações básicas de cada issue
355
- *
356
- * PARÂMETROS OBRIGATÓRIOS:
357
- * - owner: Proprietário do repositório
358
- * - repo: Nome do repositório
359
- *
360
- * PARÂMETROS OPCIONAIS:
361
- * - state: Estado das issues (open, closed, all) - padrão: open
362
- * - page: Página da listagem (padrão: 1)
363
- * - limit: Itens por página (padrão: 30, máximo: 100)
364
- *
365
- * VALIDAÇÕES:
366
- * - e repo obrigatórios
367
- * - State deve ser um dos valores válidos
368
- * - Page deve ser >= 1
369
- * - Limit deve ser entre 1 e 100
370
- *
371
- * RECOMENDAÇÕES:
372
- * - Use paginação para repositórios com muitas issues
373
- * - Monitore número total de issues
374
- * - Filtre por estado para organização
375
- * - Mantenha issues organizadas
376
- */
377
- async listIssues(params, provider, owner) {
378
- try {
379
- if (!owner) {
380
- throw new Error( obrigatório');
381
- }
382
- if (!params.repo) {
383
- throw new Error('Repo é obrigatório');
384
- }
385
- const state = params.state || 'open';
386
- const page = params.page || 1;
387
- const limit = params.limit || 30;
388
- const issues = await provider.listIssues((await provider.getCurrentUser()).login, params.repo, state, page, limit);
389
- return {
390
- success: true,
391
- action: 'list',
392
- message: `${issues.length} issues ${state} encontradas`,
393
- data: {
394
- issues,
395
- state,
396
- page,
397
- limit,
398
- total: issues.length
399
- }
400
- };
401
- }
402
- catch (error) {
403
- throw new Error(`Falha ao listar issues: ${error instanceof Error ? error.message : String(error)}`);
404
- }
405
- },
406
- /**
407
- * Obtém detalhes de uma issue específica
408
- *
409
- * FUNCIONALIDADE:
410
- * - Retorna informações completas da issue
411
- * - Inclui título, descrição, labels, assignees
412
- * - Mostra histórico de comentários
413
- *
414
- * PARÂMETROS OBRIGATÓRIOS:
415
- * - owner: Proprietário do repositório
416
- * - repo: Nome do repositório
417
- * - issue_number: Número da issue
418
- *
419
- * VALIDAÇÕES:
420
- * - Todos os parâmetros obrigatórios
421
- * - Issue deve existir no repositório
422
- * - Número deve ser válido
423
- *
424
- * RECOMENDAÇÕES:
425
- * - Use para obter detalhes completos
426
- * - Verifique status e labels
427
- * - Analise comentários e histórico
428
- * - Monitore mudanças importantes
429
- */
430
- async getIssue(params, provider, owner) {
431
- try {
432
- // Aplicar auto-detecção se necessário
433
- if (!owner) {
434
- throw new Error( obrigatório');
435
- }
436
- if (!params.repo) {
437
- throw new Error('Repo é obrigatório');
438
- }
439
- if (!params.issue_number) {
440
- throw new Error('Issue_number é obrigatório');
441
- }
442
- const issue = await provider.getIssue((await provider.getCurrentUser()).login, params.repo, params.issue_number);
443
- return {
444
- success: true,
445
- action: 'get',
446
- message: `Issue #${params.issue_number} obtida com sucesso`,
447
- data: issue
448
- };
449
- }
450
- catch (error) {
451
- throw new Error(`Falha ao obter issue: ${error instanceof Error ? error.message : String(error)}`);
452
- }
453
- },
454
- /**
455
- * Atualiza uma issue existente
456
- *
457
- * FUNCIONALIDADE:
458
- * - Atualiza campos da issue
459
- * - Suporta mudança de estado
460
- * - Permite alteração de labels e assignees
461
- *
462
- * PARÂMETROS OBRIGATÓRIOS:
463
- * - owner: Proprietário do repositório
464
- * - repo: Nome do repositório
465
- * - issue_number: Número da issue
466
- *
467
- * PARÂMETROS OPCIONAIS:
468
- * - new_title: Novo título
469
- * - new_body: Nova descrição
470
- * - new_state: Novo estado
471
- * - new_labels: Novos labels
472
- * - new_assignees: Novos responsáveis
473
- * - new_milestone: Novo milestone
474
- *
475
- * VALIDAÇÕES:
476
- * - Todos os parâmetros obrigatórios
477
- * - Issue deve existir
478
- * - Pelo menos um campo deve ser atualizado
479
- *
480
- * RECOMENDAÇÕES:
481
- * - Atualize apenas campos necessários
482
- * - Use mensagens de commit descritivas
483
- * - Documente mudanças importantes
484
- * - Notifique responsáveis sobre mudanças
485
- */
486
- async updateIssue(params, provider, owner) {
487
- try {
488
- if (!owner) {
489
- throw new Error( obrigatório');
490
- }
491
- if (!params.repo) {
492
- throw new Error('Repo é obrigatório');
493
- }
494
- if (!params.issue_number) {
495
- throw new Error('Issue_number é obrigatório');
496
- }
497
- const updateData = {};
498
- if (params.new_title)
499
- updateData.title = params.new_title;
500
- if (params.new_body !== undefined)
501
- updateData.body = params.new_body;
502
- if (params.new_state)
503
- updateData.state = params.new_state;
504
- if (params.new_labels)
505
- updateData.labels = params.new_labels;
506
- if (params.new_assignees)
507
- updateData.assignees = params.new_assignees;
508
- if (params.new_milestone !== undefined)
509
- updateData.milestone = params.new_milestone;
510
- if (Object.keys(updateData).length === 0) {
511
- throw new Error('Nenhum campo para atualizar foi fornecido');
512
- }
513
- const issue = await provider.updateIssue((await provider.getCurrentUser()).login, params.repo, params.issue_number, updateData);
514
- return {
515
- success: true,
516
- action: 'update',
517
- message: `Issue #${params.issue_number} atualizada com sucesso`,
518
- data: issue
519
- };
520
- }
521
- catch (error) {
522
- throw new Error(`Falha ao atualizar issue: ${error instanceof Error ? error.message : String(error)}`);
523
- }
524
- },
525
- /**
526
- * Fecha uma issue
527
- *
528
- * FUNCIONALIDADE:
529
- * - Altera estado da issue para closed
530
- * - Mantém histórico e comentários
531
- * - Permite reabertura posterior
532
- *
533
- * PARÂMETROS OBRIGATÓRIOS:
534
- * - owner: Proprietário do repositório
535
- * - repo: Nome do repositório
536
- * - issue_number: Número da issue
537
- *
538
- * VALIDAÇÕES:
539
- * - Todos os parâmetros obrigatórios
540
- * - Issue deve existir
541
- * - Issue deve estar aberta
542
- *
543
- * RECOMENDAÇÕES:
544
- * - Confirme que issue foi resolvida
545
- * - Documente solução aplicada
546
- * - Use comentário explicativo
547
- * - Verifique se não há dependências
548
- */
549
- async closeIssue(params, provider, owner) {
550
- try {
551
- if (!owner) {
552
- throw new Error( obrigatório');
553
- }
554
- if (!params.repo) {
555
- throw new Error('Repo é obrigatório');
556
- }
557
- if (!params.issue_number) {
558
- throw new Error('Issue_number é obrigatório');
559
- }
560
- const issue = await provider.updateIssue((await provider.getCurrentUser()).login, params.repo, params.issue_number, { state: 'closed' });
561
- return {
562
- success: true,
563
- action: 'close',
564
- message: `Issue #${params.issue_number} fechada com sucesso`,
565
- data: issue
566
- };
567
- }
568
- catch (error) {
569
- throw new Error(`Falha ao fechar issue: ${error instanceof Error ? error.message : String(error)}`);
570
- }
571
- },
572
- /**
573
- * Adiciona comentário a uma issue
574
- *
575
- * FUNCIONALIDADE:
576
- * - Cria novo comentário na issue
577
- * - Mantém histórico de discussão
578
- * - Suporta formatação Markdown
579
- *
580
- * PARÂMETROS OBRIGATÓRIOS:
581
- * - owner: Proprietário do repositório
582
- * - repo: Nome do repositório
583
- * - issue_number: Número da issue
584
- * - comment_body: Conteúdo do comentário
585
- *
586
- * VALIDAÇÕES:
587
- * - Todos os parâmetros obrigatórios
588
- * - Issue deve existir
589
- * - Comentário não pode estar vazio
590
- *
591
- * RECOMENDAÇÕES:
592
- * - Use comentários para atualizações
593
- * - Documente progresso e decisões
594
- * - Use formatação Markdown adequadamente
595
- * - Mantenha comentários relevantes
596
- */
597
- async addComment(params, provider, owner) {
598
- try {
599
- if (!owner) {
600
- throw new Error( obrigatório');
601
- }
602
- if (!params.repo) {
603
- throw new Error('Repo é obrigatório');
604
- }
605
- if (!params.issue_number) {
606
- throw new Error('Issue_number é obrigatório');
607
- }
608
- if (!params.comment_body) {
609
- throw new Error('Comment_body é obrigatório');
610
- }
611
- // Verificar se a issue existe
612
- try {
613
- await provider.getIssue(owner, params.repo, params.issue_number);
614
- }
615
- catch (error) {
616
- throw new Error(`Issue #${params.issue_number} não encontrada no repositório`);
617
- }
618
- // Adicionar comentário usando o provider
619
- const comment = await provider.addComment(owner, params.repo, params.issue_number, params.comment_body);
620
- return {
621
- success: true,
622
- action: 'comment',
623
- message: `Comentário adicionado à issue #${params.issue_number} com sucesso`,
624
- data: {
625
- issue_number: params.issue_number,
626
- comment: comment,
627
- body: params.comment_body,
628
- created_at: comment.created_at,
629
- updated_at: comment.updated_at,
630
- user: comment.user,
631
- html_url: comment.html_url
632
- }
633
- };
634
- }
635
- catch (error) {
636
- throw new Error(`Falha ao adicionar comentário: ${error instanceof Error ? error.message : String(error)}`);
637
- }
638
- },
639
- /**
640
- * Busca issues por critérios específicos
641
- *
642
- * FUNCIONALIDADE:
643
- * - Busca issues por conteúdo
644
- * - Filtra por autor, assignee e label
645
- * - Retorna resultados relevantes
646
- *
647
- * PARÂMETROS OBRIGATÓRIOS:
648
- * - owner: Proprietário do repositório
649
- * - repo: Nome do repositório
650
- * - query: Termo de busca
651
- *
652
- * PARÂMETROS OPCIONAIS:
653
- * - author: Autor das issues
654
- * - assignee: Responsável pelas issues
655
- * - label: Label específico
656
- *
657
- * VALIDAÇÕES:
658
- * - Todos os parâmetros obrigatórios
659
- * - Query deve ter pelo menos 3 caracteres
660
- * - Repositório deve existir
661
- *
662
- * RECOMENDAÇÕES:
663
- * - Use termos de busca específicos
664
- * - Combine filtros para resultados precisos
665
- * - Analise relevância dos resultados
666
- * - Use para encontrar issues relacionadas
667
- */
668
- async searchIssues(params, provider, owner) {
669
- try {
670
- if (!owner) {
671
- throw new Error( obrigatório');
672
- }
673
- if (!params.repo) {
674
- throw new Error('Repo é obrigatório');
675
- }
676
- if (!params.query) {
677
- throw new Error('Query é obrigatório');
678
- }
679
- if (params.query.length < 3) {
680
- throw new Error('Query deve ter pelo menos 3 caracteres');
681
- }
682
- const page = params.page || 1;
683
- const limit = Math.min(params.limit || 30, 100);
684
- // Buscar issues usando o provider
685
- let searchResults = [];
686
- if (provider.searchIssues) {
687
- searchResults = await provider.searchIssues(owner, params.repo, params.query, params.author || undefined, params.assignee || undefined, params.label || undefined);
688
- }
689
- else {
690
- // Fallback: buscar todas as issues e filtrar localmente
691
- const allIssues = await provider.listIssues(owner, params.repo, 'all', 1, 100);
692
- searchResults = allIssues.filter((issue) => issue.title?.toLowerCase().includes(params.query.toLowerCase()) ||
693
- issue.body?.toLowerCase().includes(params.query.toLowerCase()));
694
- }
695
- // Filtrar resultados por página e limite
696
- const startIndex = (page - 1) * limit;
697
- const endIndex = startIndex + limit;
698
- const paginatedResults = searchResults.slice(startIndex, endIndex);
699
- // Aplicar filtros adicionais se especificados
700
- let filteredResults = paginatedResults;
701
- if (params.author) {
702
- filteredResults = filteredResults.filter((issue) => issue.user?.login?.toLowerCase().includes(params.author.toLowerCase()));
703
- }
704
- if (params.assignee) {
705
- filteredResults = filteredResults.filter((issue) => issue.assignees?.some((assignee) => assignee.login?.toLowerCase().includes(params.assignee.toLowerCase())));
706
- }
707
- if (params.label) {
708
- filteredResults = filteredResults.filter((issue) => issue.labels?.some((label) => label.name?.toLowerCase().includes(params.label.toLowerCase())));
709
- }
710
- return {
711
- success: true,
712
- action: 'search',
713
- message: `${filteredResults.length} issues encontradas para '${params.query}'`,
714
- data: {
715
- query: params.query,
716
- author: params.author || 'todos',
717
- assignee: params.assignee || 'todos',
718
- label: params.label || 'todos',
719
- page,
720
- limit,
721
- total_found: searchResults.length,
722
- results: filteredResults,
723
- summary: {
724
- total_issues: searchResults.length,
725
- filtered_issues: filteredResults.length,
726
- states: {
727
- open: filteredResults.filter((i) => i.state === 'open').length,
728
- closed: filteredResults.filter((i) => i.state === 'closed').length
729
- },
730
- labels: [...new Set(filteredResults.flatMap((i) => i.labels?.map((l) => l.name) || []).filter(Boolean))],
731
- assignees: [...new Set(filteredResults.flatMap((i) => i.assignees?.map((a) => a.login) || []).filter(Boolean))]
732
- }
733
- }
734
- };
735
- }
736
- catch (error) {
737
- throw new Error(`Falha ao buscar issues: ${error instanceof Error ? error.message : String(error)}`);
738
- }
739
- }
740
- };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.issuesTool = 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
+ /**
8
+ * Tool: issues
9
+ *
10
+ * DESCRIÇÃO:
11
+ * Gerenciamento completo de issues com suporte multi-provider (GitHub e Gitea)
12
+ *
13
+ * FUNCIONALIDADES:
14
+ * - Criação de novas issues
15
+ * - Listagem e busca de issues
16
+ * - Obtenção de detalhes específicos
17
+ * - Atualização de issues existentes
18
+ * - Fechamento de issues
19
+ * - Adição de comentários
20
+ * - Busca por conteúdo e status
21
+ *
22
+ * USO:
23
+ * - Para gerenciar bugs e features
24
+ * - Para acompanhar progresso de desenvolvimento
25
+ * - Para comunicação entre equipe
26
+ * - Para controle de qualidade
27
+ *
28
+ * RECOMENDAÇÕES:
29
+ * - Use títulos descritivos
30
+ * - Documente detalhes completos
31
+ * - Atualize status regularmente
32
+ * - Use labels adequadamente
33
+ */
34
+ /**
35
+ * Schema de validação para entrada da tool issues
36
+ *
37
+ * VALIDAÇÕES:
38
+ * - action: Ação obrigatória (create, list, get, update, close, comment, 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 IssuesInputSchema = zod_1.z.object({
48
+ action: zod_1.z.enum(['create', 'list', 'get', 'update', 'close', 'comment', 'search']),
49
+ // Parâmetros comuns
50
+ repo: zod_1.z.string(),
51
+ // Para multi-provider
52
+ provider: zod_1.z.enum(['gitea', 'github']).describe('Provider to use (gitea or github)'), // Provider específico: gitea, github ou both
53
+ projectPath: zod_1.z.string().describe('Local project path for git operations'),
54
+ // Para create
55
+ title: zod_1.z.string().optional(),
56
+ body: zod_1.z.string().optional(),
57
+ labels: zod_1.z.array(zod_1.z.string()).optional(),
58
+ assignees: zod_1.z.array(zod_1.z.string()).optional(),
59
+ milestone: zod_1.z.number().optional(),
60
+ // Para get/update/close/comment
61
+ issue_number: zod_1.z.number().optional(),
62
+ // Para list
63
+ state: zod_1.z.enum(['open', 'closed', 'all']).optional(),
64
+ page: zod_1.z.number().min(1).optional(),
65
+ limit: zod_1.z.number().min(1).max(100).optional(),
66
+ // Para update
67
+ new_title: zod_1.z.string().optional(),
68
+ new_body: zod_1.z.string().optional(),
69
+ new_state: zod_1.z.enum(['open', 'closed']).optional(),
70
+ new_labels: zod_1.z.array(zod_1.z.string()).optional(),
71
+ new_assignees: zod_1.z.array(zod_1.z.string()).optional(),
72
+ new_milestone: zod_1.z.number().optional(),
73
+ // Para comment
74
+ comment_body: zod_1.z.string().optional(),
75
+ // Para search
76
+ query: zod_1.z.string().optional(),
77
+ author: zod_1.z.string().optional(),
78
+ assignee: zod_1.z.string().optional(),
79
+ label: zod_1.z.string().optional(),
80
+ });
81
+ /**
82
+ * Schema de saída padronizado
83
+ *
84
+ * ESTRUTURA:
85
+ * - success: Status da operação
86
+ * - action: Ação executada
87
+ * - message: Mensagem descritiva
88
+ * - data: Dados retornados (opcional)
89
+ * - error: Detalhes do erro (opcional)
90
+ */
91
+ const IssuesResultSchema = zod_1.z.object({
92
+ success: zod_1.z.boolean(),
93
+ action: zod_1.z.string(),
94
+ message: zod_1.z.string(),
95
+ data: zod_1.z.any().optional(),
96
+ error: zod_1.z.string().optional()
97
+ });
98
+ /**
99
+ * Tool: issues
100
+ *
101
+ * DESCRIÇÃO:
102
+ * Gerenciamento completo de issues Gitea com múltiplas ações
103
+ *
104
+ * ACTIONS DISPONÍVEIS:
105
+ *
106
+ * 1. create - Criar nova issue
107
+ * Parâmetros:
108
+ * - owner (obrigatório): Proprietário do repositório
109
+ * - repo (obrigatório): Nome do repositório
110
+ * - title (obrigatório): Título da issue
111
+ * - body (opcional): Descrição detalhada
112
+ * - labels (opcional): Array de labels
113
+ * - assignees (opcional): Array de usuários responsáveis
114
+ * - milestone (opcional): ID do milestone
115
+ *
116
+ * 2. list - Listar issues
117
+ * Parâmetros:
118
+ * - owner (obrigatório): Proprietário do repositório
119
+ * - repo (obrigatório): Nome do repositório
120
+ * - state (opcional): Estado das issues (open, closed, all) - padrão: open
121
+ * - page (opcional): Página da listagem (padrão: 1)
122
+ * - limit (opcional): Itens por página (padrão: 30, máximo: 100)
123
+ *
124
+ * 3. get - Obter detalhes da issue
125
+ * Parâmetros:
126
+ * - owner (obrigatório): Proprietário do repositório
127
+ * - repo (obrigatório): Nome do repositório
128
+ * - issue_number (obrigatório): Número da issue
129
+ *
130
+ * 4. update - Atualizar issue existente
131
+ * Parâmetros:
132
+ * - owner (obrigatório): Proprietário do repositório
133
+ * - repo (obrigatório): Nome do repositório
134
+ * - issue_number (obrigatório): Número da issue
135
+ * - new_title (opcional): Novo título
136
+ * - new_body (opcional): Nova descrição
137
+ * - new_state (opcional): Novo estado
138
+ * - new_labels (opcional): Novos labels
139
+ * - new_assignees (opcional): Novos responsáveis
140
+ * - new_milestone (opcional): Novo milestone
141
+ *
142
+ * 5. close - Fechar issue
143
+ * Parâmetros:
144
+ * - owner (obrigatório): Proprietário do repositório
145
+ * - repo (obrigatório): Nome do repositório
146
+ * - issue_number (obrigatório): Número da issue
147
+ *
148
+ * 6. comment - Adicionar comentário
149
+ * Parâmetros:
150
+ * - owner (obrigatório): Proprietário do repositório
151
+ * - repo (obrigatório): Nome do repositório
152
+ * - issue_number (obrigatório): Número da issue
153
+ * - comment_body (obrigatório): Conteúdo do comentário
154
+ *
155
+ * 7. search - Buscar issues
156
+ * Parâmetros:
157
+ * - owner (obrigatório): Proprietário do repositório
158
+ * - repo (obrigatório): Nome do repositório
159
+ * - query (obrigatório): Termo de busca
160
+ * - author (opcional): Autor das issues
161
+ * - assignee (opcional): Responsável pelas issues
162
+ * - label (opcional): Label específico
163
+ *
164
+ * RECOMENDAÇÕES DE USO:
165
+ * - Use títulos descritivos e claros
166
+ * - Documente detalhes completos na descrição
167
+ * - Atualize status regularmente
168
+ * - Use labels para categorização
169
+ * - Atribua responsáveis adequadamente
170
+ * - Mantenha issues organizadas
171
+ */
172
+ exports.issuesTool = {
173
+ name: 'git-issues',
174
+ description: 'tool: Gerencia issues Git, bugs, features e tarefas\n──────────────\naction create: cria nova issue\naction create requires: repo, title, body, labels, assignees, milestone, provider\n───────────────\naction list: lista issues do repositório\naction list requires: repo, state, page, limit, provider\n───────────────\naction get: obtém detalhes de issue\naction get requires: repo, issue_number, provider\n───────────────\naction update: atualiza issue existente\naction update requires: repo, issue_number, new_title, new_body, new_state, new_labels, new_assignees, new_milestone, provider\n───────────────\naction close: fecha issue\naction close requires: repo, issue_number, provider\n───────────────\naction comment: adiciona comentário\naction comment requires: repo, issue_number, comment_body, provider\n───────────────\naction search: busca issues por critérios\naction search requires: repo, query, author, assignee, label, provider',
175
+ inputSchema: {
176
+ type: 'object',
177
+ properties: {
178
+ action: {
179
+ type: 'string',
180
+ enum: ['create', 'list', 'get', 'update', 'close', 'comment', 'search'],
181
+ description: 'Action to perform on issues'
182
+ },
183
+ repo: { type: 'string', description: 'Repository name' },
184
+ provider: { type: 'string', description: 'Provider to use (github, gitea, or omit for default)' },
185
+ title: { type: 'string', description: 'Issue title' },
186
+ body: { type: 'string', description: 'Issue body/description' },
187
+ labels: { type: 'array', items: { type: 'string' }, description: 'Issue labels' },
188
+ assignees: { type: 'array', items: { type: 'string' }, description: 'Issue assignees' },
189
+ milestone: { type: 'number', description: 'Milestone ID' },
190
+ issue_number: { type: 'number', description: 'Issue number' },
191
+ state: { type: 'string', enum: ['open', 'closed', 'all'], description: 'Issue state' },
192
+ page: { type: 'number', description: 'Page number', minimum: 1 },
193
+ limit: { type: 'number', description: 'Items per page', minimum: 1, maximum: 100 },
194
+ new_title: { type: 'string', description: 'New issue title' },
195
+ new_body: { type: 'string', description: 'New issue body' },
196
+ new_state: { type: 'string', enum: ['open', 'closed'], description: 'New issue state' },
197
+ new_labels: { type: 'array', items: { type: 'string' }, description: 'New issue labels' },
198
+ new_assignees: { type: 'array', items: { type: 'string' }, description: 'New issue assignees' },
199
+ new_milestone: { type: 'number', description: 'New milestone ID' },
200
+ comment_body: { type: 'string', description: 'Comment content' },
201
+ query: { type: 'string', description: 'Search query' },
202
+ author: { type: 'string', description: 'Issue author filter' },
203
+ assignee: { type: 'string', description: 'Issue assignee filter' },
204
+ label: { type: 'string', description: 'Issue label filter' }
205
+ },
206
+ required: ['action', 'repo', 'provider', 'projectPath']
207
+ },
208
+ /**
209
+ * Handler principal da tool issues
210
+ *
211
+ * FUNCIONALIDADE:
212
+ * - Valida entrada usando Zod schema
213
+ * - Roteia para método específico baseado na ação
214
+ * - Trata erros de forma uniforme
215
+ * - Retorna resultado padronizado
216
+ *
217
+ * FLUXO:
218
+ * 1. Validação de entrada
219
+ * 2. Seleção do provider
220
+ * 3. Roteamento por ação
221
+ * 4. Execução do método específico
222
+ * 5. Tratamento de erros
223
+ * 6. Retorno de resultado
224
+ *
225
+ * TRATAMENTO DE ERROS:
226
+ * - Validação: erro de schema
227
+ * - Execução: erro da operação
228
+ * - Roteamento: ação não suportada
229
+ *
230
+ * RECOMENDAÇÕES:
231
+ * - Sempre valide entrada antes de processar
232
+ * - Trate erros específicos adequadamente
233
+ * - Log detalhes de erro para debug
234
+ * - Retorne mensagens de erro úteis
235
+ */
236
+ async handler(input) {
237
+ try {
238
+ const validatedInput = IssuesInputSchema.parse(input);
239
+ // Aplicar auto-detecção de usuário/owner
240
+ const processedInput = await (0, user_detection_js_1.applyAutoUserDetection)(validatedInput, validatedInput.provider);
241
+ // Obter o provider correto
242
+ let provider;
243
+ try {
244
+ if (processedInput.provider) {
245
+ const requestedProvider = index_js_1.globalProviderFactory.getProvider(processedInput.provider);
246
+ if (!requestedProvider) {
247
+ console.warn(`[ISSUES] Provider '${processedInput.provider}' não encontrado, usando padrão`);
248
+ provider = index_js_1.globalProviderFactory.getDefaultProvider();
249
+ }
250
+ else {
251
+ provider = requestedProvider;
252
+ }
253
+ }
254
+ else {
255
+ provider = index_js_1.globalProviderFactory.getDefaultProvider();
256
+ }
257
+ if (!provider) {
258
+ throw new Error('Nenhum provider disponível');
259
+ }
260
+ }
261
+ catch (providerError) {
262
+ console.error('[ISSUES] Erro ao obter provider:', providerError);
263
+ throw new Error(`Erro de configuração do provider: ${providerError instanceof Error ? providerError.message : 'Provider não disponível'}`);
264
+ }
265
+ // Obter o owner do provider
266
+ const owner = (await provider.getCurrentUser()).login;
267
+ switch (processedInput.action) {
268
+ case 'create':
269
+ return await this.createIssue(processedInput, provider, owner);
270
+ case 'list':
271
+ return await this.listIssues(processedInput, provider, owner);
272
+ case 'get':
273
+ return await this.getIssue(processedInput, provider, owner);
274
+ case 'update':
275
+ return await this.updateIssue(processedInput, provider, owner);
276
+ case 'close':
277
+ return await this.closeIssue(processedInput, provider, owner);
278
+ case 'comment':
279
+ return await this.addComment(processedInput, provider, owner);
280
+ case 'search':
281
+ return await this.searchIssues(processedInput, provider, owner);
282
+ default:
283
+ throw new Error(`Ação não suportada: ${processedInput.action}`);
284
+ }
285
+ }
286
+ catch (error) {
287
+ return {
288
+ success: false,
289
+ action: input.action,
290
+ message: 'Erro na operação de issues',
291
+ error: error instanceof Error ? error.message : String(error)
292
+ };
293
+ }
294
+ },
295
+ /**
296
+ * Cria uma nova issue no repositório
297
+ *
298
+ * FUNCIONALIDADE:
299
+ * - Cria issue com título e descrição
300
+ * - Suporta labels, assignees e milestone
301
+ * - Retorna detalhes da issue criada
302
+ *
303
+ * PARÂMETROS OBRIGATÓRIOS:
304
+ * - owner: Proprietário do repositório
305
+ * - repo: Nome do repositório
306
+ * - title: Título da issue
307
+ *
308
+ * PARÂMETROS OPCIONAIS:
309
+ * - body: Descrição detalhada
310
+ * - labels: Array de labels para categorização
311
+ * - assignees: Array de usuários responsáveis
312
+ * - milestone: ID do milestone associado
313
+ *
314
+ * VALIDAÇÕES:
315
+ * - Todos os parâmetros obrigatórios
316
+ * - Título deve ser único no repositório
317
+ * - Labels devem existir no repositório
318
+ * - Assignees devem ser usuários válidos
319
+ *
320
+ * RECOMENDAÇÕES:
321
+ * - Use títulos descritivos e claros
322
+ * - Documente detalhes completos
323
+ * - Use labels para categorização
324
+ * - Atribua responsáveis adequadamente
325
+ */
326
+ async createIssue(params, provider, owner) {
327
+ try {
328
+ if (!owner) {
329
+ throw new Error('é obrigatório');
330
+ }
331
+ if (!params.repo) {
332
+ throw new Error('Repo é obrigatório');
333
+ }
334
+ if (!params.title) {
335
+ throw new Error('Title é obrigatório');
336
+ }
337
+ const issue = await provider.createIssue(owner, params.repo, params.title, params.body, params.assignees, params.labels);
338
+ return {
339
+ success: true,
340
+ action: 'create',
341
+ message: `Issue '${params.title}' criada com sucesso`,
342
+ data: issue
343
+ };
344
+ }
345
+ catch (error) {
346
+ throw new Error(`Falha ao criar issue: ${error instanceof Error ? error.message : String(error)}`);
347
+ }
348
+ },
349
+ /**
350
+ * Lista issues do repositório
351
+ *
352
+ * FUNCIONALIDADE:
353
+ * - Lista issues com filtros de estado
354
+ * - Suporta paginação
355
+ * - Retorna informações básicas de cada issue
356
+ *
357
+ * PARÂMETROS OBRIGATÓRIOS:
358
+ * - owner: Proprietário do repositório
359
+ * - repo: Nome do repositório
360
+ *
361
+ * PARÂMETROS OPCIONAIS:
362
+ * - state: Estado das issues (open, closed, all) - padrão: open
363
+ * - page: Página da listagem (padrão: 1)
364
+ * - limit: Itens por página (padrão: 30, máximo: 100)
365
+ *
366
+ * VALIDAÇÕES:
367
+ * - e repo obrigatórios
368
+ * - State deve ser um dos valores válidos
369
+ * - Page deve ser >= 1
370
+ * - Limit deve ser entre 1 e 100
371
+ *
372
+ * RECOMENDAÇÕES:
373
+ * - Use paginação para repositórios com muitas issues
374
+ * - Monitore número total de issues
375
+ * - Filtre por estado para organização
376
+ * - Mantenha issues organizadas
377
+ */
378
+ async listIssues(params, provider, owner) {
379
+ try {
380
+ if (!owner) {
381
+ throw new Error('é obrigatório');
382
+ }
383
+ if (!params.repo) {
384
+ throw new Error('Repo é obrigatório');
385
+ }
386
+ const state = params.state || 'open';
387
+ const page = params.page || 1;
388
+ const limit = params.limit || 30;
389
+ const issues = await provider.listIssues((await provider.getCurrentUser()).login, params.repo, state, page, limit);
390
+ return {
391
+ success: true,
392
+ action: 'list',
393
+ message: `${issues.length} issues ${state} encontradas`,
394
+ data: {
395
+ issues,
396
+ state,
397
+ page,
398
+ limit,
399
+ total: issues.length
400
+ }
401
+ };
402
+ }
403
+ catch (error) {
404
+ throw new Error(`Falha ao listar issues: ${error instanceof Error ? error.message : String(error)}`);
405
+ }
406
+ },
407
+ /**
408
+ * Obtém detalhes de uma issue específica
409
+ *
410
+ * FUNCIONALIDADE:
411
+ * - Retorna informações completas da issue
412
+ * - Inclui título, descrição, labels, assignees
413
+ * - Mostra histórico de comentários
414
+ *
415
+ * PARÂMETROS OBRIGATÓRIOS:
416
+ * - owner: Proprietário do repositório
417
+ * - repo: Nome do repositório
418
+ * - issue_number: Número da issue
419
+ *
420
+ * VALIDAÇÕES:
421
+ * - Todos os parâmetros obrigatórios
422
+ * - Issue deve existir no repositório
423
+ * - Número deve ser válido
424
+ *
425
+ * RECOMENDAÇÕES:
426
+ * - Use para obter detalhes completos
427
+ * - Verifique status e labels
428
+ * - Analise comentários e histórico
429
+ * - Monitore mudanças importantes
430
+ */
431
+ async getIssue(params, provider, owner) {
432
+ try {
433
+ // Aplicar auto-detecção se necessário
434
+ if (!owner) {
435
+ throw new Error('é obrigatório');
436
+ }
437
+ if (!params.repo) {
438
+ throw new Error('Repo é obrigatório');
439
+ }
440
+ if (!params.issue_number) {
441
+ throw new Error('Issue_number é obrigatório');
442
+ }
443
+ const issue = await provider.getIssue((await provider.getCurrentUser()).login, params.repo, params.issue_number);
444
+ return {
445
+ success: true,
446
+ action: 'get',
447
+ message: `Issue #${params.issue_number} obtida com sucesso`,
448
+ data: issue
449
+ };
450
+ }
451
+ catch (error) {
452
+ throw new Error(`Falha ao obter issue: ${error instanceof Error ? error.message : String(error)}`);
453
+ }
454
+ },
455
+ /**
456
+ * Atualiza uma issue existente
457
+ *
458
+ * FUNCIONALIDADE:
459
+ * - Atualiza campos da issue
460
+ * - Suporta mudança de estado
461
+ * - Permite alteração de labels e assignees
462
+ *
463
+ * PARÂMETROS OBRIGATÓRIOS:
464
+ * - owner: Proprietário do repositório
465
+ * - repo: Nome do repositório
466
+ * - issue_number: Número da issue
467
+ *
468
+ * PARÂMETROS OPCIONAIS:
469
+ * - new_title: Novo título
470
+ * - new_body: Nova descrição
471
+ * - new_state: Novo estado
472
+ * - new_labels: Novos labels
473
+ * - new_assignees: Novos responsáveis
474
+ * - new_milestone: Novo milestone
475
+ *
476
+ * VALIDAÇÕES:
477
+ * - Todos os parâmetros obrigatórios
478
+ * - Issue deve existir
479
+ * - Pelo menos um campo deve ser atualizado
480
+ *
481
+ * RECOMENDAÇÕES:
482
+ * - Atualize apenas campos necessários
483
+ * - Use mensagens de commit descritivas
484
+ * - Documente mudanças importantes
485
+ * - Notifique responsáveis sobre mudanças
486
+ */
487
+ async updateIssue(params, provider, owner) {
488
+ try {
489
+ if (!owner) {
490
+ throw new Error('é obrigatório');
491
+ }
492
+ if (!params.repo) {
493
+ throw new Error('Repo é obrigatório');
494
+ }
495
+ if (!params.issue_number) {
496
+ throw new Error('Issue_number é obrigatório');
497
+ }
498
+ const updateData = {};
499
+ if (params.new_title)
500
+ updateData.title = params.new_title;
501
+ if (params.new_body !== undefined)
502
+ updateData.body = params.new_body;
503
+ if (params.new_state)
504
+ updateData.state = params.new_state;
505
+ if (params.new_labels)
506
+ updateData.labels = params.new_labels;
507
+ if (params.new_assignees)
508
+ updateData.assignees = params.new_assignees;
509
+ if (params.new_milestone !== undefined)
510
+ updateData.milestone = params.new_milestone;
511
+ if (Object.keys(updateData).length === 0) {
512
+ throw new Error('Nenhum campo para atualizar foi fornecido');
513
+ }
514
+ const issue = await provider.updateIssue((await provider.getCurrentUser()).login, params.repo, params.issue_number, updateData);
515
+ return {
516
+ success: true,
517
+ action: 'update',
518
+ message: `Issue #${params.issue_number} atualizada com sucesso`,
519
+ data: issue
520
+ };
521
+ }
522
+ catch (error) {
523
+ throw new Error(`Falha ao atualizar issue: ${error instanceof Error ? error.message : String(error)}`);
524
+ }
525
+ },
526
+ /**
527
+ * Fecha uma issue
528
+ *
529
+ * FUNCIONALIDADE:
530
+ * - Altera estado da issue para closed
531
+ * - Mantém histórico e comentários
532
+ * - Permite reabertura posterior
533
+ *
534
+ * PARÂMETROS OBRIGATÓRIOS:
535
+ * - owner: Proprietário do repositório
536
+ * - repo: Nome do repositório
537
+ * - issue_number: Número da issue
538
+ *
539
+ * VALIDAÇÕES:
540
+ * - Todos os parâmetros obrigatórios
541
+ * - Issue deve existir
542
+ * - Issue deve estar aberta
543
+ *
544
+ * RECOMENDAÇÕES:
545
+ * - Confirme que issue foi resolvida
546
+ * - Documente solução aplicada
547
+ * - Use comentário explicativo
548
+ * - Verifique se não há dependências
549
+ */
550
+ async closeIssue(params, provider, owner) {
551
+ try {
552
+ if (!owner) {
553
+ throw new Error('é obrigatório');
554
+ }
555
+ if (!params.repo) {
556
+ throw new Error('Repo é obrigatório');
557
+ }
558
+ if (!params.issue_number) {
559
+ throw new Error('Issue_number é obrigatório');
560
+ }
561
+ const issue = await provider.updateIssue((await provider.getCurrentUser()).login, params.repo, params.issue_number, { state: 'closed' });
562
+ return {
563
+ success: true,
564
+ action: 'close',
565
+ message: `Issue #${params.issue_number} fechada com sucesso`,
566
+ data: issue
567
+ };
568
+ }
569
+ catch (error) {
570
+ throw new Error(`Falha ao fechar issue: ${error instanceof Error ? error.message : String(error)}`);
571
+ }
572
+ },
573
+ /**
574
+ * Adiciona comentário a uma issue
575
+ *
576
+ * FUNCIONALIDADE:
577
+ * - Cria novo comentário na issue
578
+ * - Mantém histórico de discussão
579
+ * - Suporta formatação Markdown
580
+ *
581
+ * PARÂMETROS OBRIGATÓRIOS:
582
+ * - owner: Proprietário do repositório
583
+ * - repo: Nome do repositório
584
+ * - issue_number: Número da issue
585
+ * - comment_body: Conteúdo do comentário
586
+ *
587
+ * VALIDAÇÕES:
588
+ * - Todos os parâmetros obrigatórios
589
+ * - Issue deve existir
590
+ * - Comentário não pode estar vazio
591
+ *
592
+ * RECOMENDAÇÕES:
593
+ * - Use comentários para atualizações
594
+ * - Documente progresso e decisões
595
+ * - Use formatação Markdown adequadamente
596
+ * - Mantenha comentários relevantes
597
+ */
598
+ async addComment(params, provider, owner) {
599
+ try {
600
+ if (!owner) {
601
+ throw new Error('é obrigatório');
602
+ }
603
+ if (!params.repo) {
604
+ throw new Error('Repo é obrigatório');
605
+ }
606
+ if (!params.issue_number) {
607
+ throw new Error('Issue_number é obrigatório');
608
+ }
609
+ if (!params.comment_body) {
610
+ throw new Error('Comment_body é obrigatório');
611
+ }
612
+ // Verificar se a issue existe
613
+ try {
614
+ await provider.getIssue(owner, params.repo, params.issue_number);
615
+ }
616
+ catch (error) {
617
+ throw new Error(`Issue #${params.issue_number} não encontrada no repositório`);
618
+ }
619
+ // Adicionar comentário usando o provider
620
+ const comment = await provider.addComment(owner, params.repo, params.issue_number, params.comment_body);
621
+ return {
622
+ success: true,
623
+ action: 'comment',
624
+ message: `Comentário adicionado à issue #${params.issue_number} com sucesso`,
625
+ data: {
626
+ issue_number: params.issue_number,
627
+ comment: comment,
628
+ body: params.comment_body,
629
+ created_at: comment.created_at,
630
+ updated_at: comment.updated_at,
631
+ user: comment.user,
632
+ html_url: comment.html_url
633
+ }
634
+ };
635
+ }
636
+ catch (error) {
637
+ throw new Error(`Falha ao adicionar comentário: ${error instanceof Error ? error.message : String(error)}`);
638
+ }
639
+ },
640
+ /**
641
+ * Busca issues por critérios específicos
642
+ *
643
+ * FUNCIONALIDADE:
644
+ * - Busca issues por conteúdo
645
+ * - Filtra por autor, assignee e label
646
+ * - Retorna resultados relevantes
647
+ *
648
+ * PARÂMETROS OBRIGATÓRIOS:
649
+ * - owner: Proprietário do repositório
650
+ * - repo: Nome do repositório
651
+ * - query: Termo de busca
652
+ *
653
+ * PARÂMETROS OPCIONAIS:
654
+ * - author: Autor das issues
655
+ * - assignee: Responsável pelas issues
656
+ * - label: Label específico
657
+ *
658
+ * VALIDAÇÕES:
659
+ * - Todos os parâmetros obrigatórios
660
+ * - Query deve ter pelo menos 3 caracteres
661
+ * - Repositório deve existir
662
+ *
663
+ * RECOMENDAÇÕES:
664
+ * - Use termos de busca específicos
665
+ * - Combine filtros para resultados precisos
666
+ * - Analise relevância dos resultados
667
+ * - Use para encontrar issues relacionadas
668
+ */
669
+ async searchIssues(params, provider, owner) {
670
+ try {
671
+ if (!owner) {
672
+ throw new Error('é obrigatório');
673
+ }
674
+ if (!params.repo) {
675
+ throw new Error('Repo é obrigatório');
676
+ }
677
+ if (!params.query) {
678
+ throw new Error('Query é obrigatório');
679
+ }
680
+ if (params.query.length < 3) {
681
+ throw new Error('Query deve ter pelo menos 3 caracteres');
682
+ }
683
+ const page = params.page || 1;
684
+ const limit = Math.min(params.limit || 30, 100);
685
+ // Buscar issues usando o provider
686
+ let searchResults = [];
687
+ if (provider.searchIssues) {
688
+ searchResults = await provider.searchIssues(owner, params.repo, params.query, params.author || undefined, params.assignee || undefined, params.label || undefined);
689
+ }
690
+ else {
691
+ // Fallback: buscar todas as issues e filtrar localmente
692
+ const allIssues = await provider.listIssues(owner, params.repo, 'all', 1, 100);
693
+ searchResults = allIssues.filter((issue) => issue.title?.toLowerCase().includes(params.query?.toLowerCase() || '') ||
694
+ issue.body?.toLowerCase().includes(params.query?.toLowerCase() || ''));
695
+ }
696
+ // Filtrar resultados por página e limite
697
+ const startIndex = (page - 1) * limit;
698
+ const endIndex = startIndex + limit;
699
+ const paginatedResults = searchResults.slice(startIndex, endIndex);
700
+ // Aplicar filtros adicionais se especificados
701
+ let filteredResults = paginatedResults;
702
+ if (params.author) {
703
+ filteredResults = filteredResults.filter((issue) => issue.user?.login?.toLowerCase().includes(params.author.toLowerCase()));
704
+ }
705
+ if (params.assignee) {
706
+ filteredResults = filteredResults.filter((issue) => issue.assignees?.some((assignee) => assignee.login?.toLowerCase().includes(params.assignee.toLowerCase())));
707
+ }
708
+ if (params.label) {
709
+ filteredResults = filteredResults.filter((issue) => issue.labels?.some((label) => label.name?.toLowerCase().includes(params.label.toLowerCase())));
710
+ }
711
+ return {
712
+ success: true,
713
+ action: 'search',
714
+ message: `${filteredResults.length} issues encontradas para '${params.query}'`,
715
+ data: {
716
+ query: params.query,
717
+ author: params.author || 'todos',
718
+ assignee: params.assignee || 'todos',
719
+ label: params.label || 'todos',
720
+ page,
721
+ limit,
722
+ total_found: searchResults.length,
723
+ results: filteredResults,
724
+ summary: {
725
+ total_issues: searchResults.length,
726
+ filtered_issues: filteredResults.length,
727
+ states: {
728
+ open: filteredResults.filter((i) => i.state === 'open').length,
729
+ closed: filteredResults.filter((i) => i.state === 'closed').length
730
+ },
731
+ labels: [...new Set(filteredResults.flatMap((i) => i.labels?.map((l) => l.name) || []).filter(Boolean))],
732
+ assignees: [...new Set(filteredResults.flatMap((i) => i.assignees?.map((a) => a.login) || []).filter(Boolean))]
733
+ }
734
+ }
735
+ };
736
+ }
737
+ catch (error) {
738
+ throw new Error(`Falha ao buscar issues: ${error instanceof Error ? error.message : String(error)}`);
739
+ }
740
+ },
741
+ /**
742
+ * Verifica se erro é relacionado a Git
743
+ */
744
+ isGitRelatedError(errorMessage) {
745
+ const gitKeywords = [
746
+ 'git', 'commit', 'push', 'pull', 'merge', 'conflict', 'branch',
747
+ 'remote', 'repository', 'authentication', 'permission', 'unauthorized',
748
+ 'divergent', 'non-fast-forward', 'fetch first', 'working tree',
749
+ 'uncommitted', 'stash', 'rebase', 'reset', 'checkout'
750
+ ];
751
+ const errorLower = errorMessage.toLowerCase();
752
+ return gitKeywords.some(keyword => errorLower.includes(keyword));
753
+ }
754
+ };
741
755
  //# sourceMappingURL=git-issues.js.map