@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,641 +1,641 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.gitRepositoriesTool = 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: git-repositories
10
- *
11
- * DESCRIÇÃO COMPLETA:
12
- * Gerenciamento completo de repositórios Git com suporte multi-provider (GitHub e Gitea).
13
- * Esta tool é 100% auto-suficiente e implementa TODAS as operações de repositório sem depender
14
- * de outras tools ou comandos externos.
15
- *
16
- * FUNCIONALIDADES IMPLEMENTADAS:
17
- *
18
- * 1. CRIAÇÃO E CONFIGURAÇÃO:
19
- * - create: Cria novos repositórios com configurações completas
20
- * - init: Inicializa repositórios Git locais
21
- * - clone: Clona repositórios remotos localmente
22
- * - update: Atualiza configurações de repositórios existentes
23
- *
24
- * 2. LISTAGEM E BUSCA:
25
- * - list: Lista repositórios do usuário ou organização
26
- * - get: Obtém detalhes específicos de um repositório
27
- * - search: Busca repositórios por critérios específicos
28
- *
29
- * 3. OPERAÇÕES AVANÇADAS:
30
- * - fork: Cria fork de repositórios existentes
31
- * - delete: Remove repositórios permanentemente
32
- * - archive: Arquivamento de repositórios
33
- * - transfer: Transferência de propriedade
34
- *
35
- * 4. CONFIGURAÇÕES E METADADOS:
36
- * - Visibilidade (público/privado)
37
- * - Descrições e documentação
38
- * - Configurações de branch padrão
39
- * - Templates e inicialização automática
40
- * - Licenças e arquivos de configuração
41
- *
42
- * PARÂMETROS OBRIGATÓRIOS:
43
- * - action: Ação a executar (create, list, get, update, delete, fork, search, init, clone)
44
- * - provider: Provedor a usar (gitea ou github)
45
- * - owner: Proprietário do repositório (obrigatório para operações remotas)
46
- * - repo: Nome do repositório (obrigatório para operações remotas)
47
- * - projectPath: Caminho do projeto local (obrigatório para operações locais)
48
- *
49
- * PARÂMETROS OPCIONAIS:
50
- * - name: Nome do repositório para criação
51
- * - description: Descrição do repositório
52
- * - private: Visibilidade do repositório
53
- * - auto_init: Inicialização automática com README
54
- * - gitignores: Template de .gitignore
55
- * - license: Template de licença
56
- * - readme: Conteúdo do README
57
- * - default_branch: Branch padrão
58
- * - username: Usuário para listagem
59
- * - page: Página para paginação
60
- * - limit: Limite de resultados
61
- * - new_name: Novo nome para atualização
62
- * - new_description: Nova descrição
63
- * - new_private: Nova visibilidade
64
- * - archived: Status de arquivamento
65
- * - organization: Organização para fork
66
- * - query: Termo de busca
67
- *
68
- * CASOS DE USO:
69
- * 1. Criação de repositórios para novos projetos
70
- * 2. Backup e migração de código
71
- * 3. Organização de projetos em equipe
72
- * 4. Automação de workflows de desenvolvimento
73
- * 5. Gerenciamento de repositórios em massa
74
- * 6. Configuração de templates de projeto
75
- * 7. Sincronização entre diferentes provedores
76
- *
77
- * EXEMPLOS DE USO:
78
- * - Criar repositório: action=create, name=meu-projeto, description=Projeto incrível
79
- * - Listar repositórios: action=list, username=usuario
80
- * - Buscar repositórios: action=search, query=react typescript
81
- * - Clonar repositório: action=clone, url=https://github.com/user/repo.git
82
- * - Inicializar local: action=init, projectPath=/path/to/project
83
- *
84
- * RECOMENDAÇÕES:
85
- * - Use nomes descritivos e consistentes
86
- * - Configure visibilidade adequada para cada projeto
87
- * - Mantenha descrições atualizadas e informativas
88
- * - Use templates para padronização
89
- * - Configure branches padrão apropriadas
90
- * - Documente configurações importantes
91
- * - Use licenças adequadas para cada projeto
92
- *
93
- * LIMITAÇÕES:
94
- * - Operações de arquivamento dependem do provedor
95
- * - Transferência de propriedade requer permissões especiais
96
- * - Alguns provedores podem ter limitações de API
97
- *
98
- * SEGURANÇA:
99
- * - Tokens de acesso são obrigatórios para operações remotas
100
- * - Validação de permissões antes de operações destrutivas
101
- * - Logs detalhados de todas as operações
102
- * - Tratamento seguro de informações sensíveis
103
- */
104
- /**
105
- * Schema de validação para entrada da tool git-repositories
106
- *
107
- * VALIDAÇÕES:
108
- * - action: Ação obrigatória (create, list, get, update, delete, fork, search, init, clone)
109
- * - provider: Obrigatório (gitea ou github)
110
- * - Parâmetros específicos por ação
111
- * - Validação de tipos e formatos
112
- *
113
- * RECOMENDAÇÕES:
114
- * - Sempre valide entrada antes de usar
115
- * - Use parâmetros opcionais adequadamente
116
- * - Documente parâmetros obrigatórios
117
- */
118
- const GitRepositoriesInputSchema = zod_1.z.object({
119
- action: zod_1.z.enum(['create', 'list', 'get', 'update', 'delete', 'fork', 'search', 'init', 'clone']),
120
- // Parâmetros comuns
121
- repo: zod_1.z.string().optional(),
122
- provider: zod_1.z.enum(['gitea', 'github']).describe('Provider to use (gitea or github)'),
123
- projectPath: zod_1.z.string().describe('Local project path for git operations').optional(),
124
- name: zod_1.z.string().optional(),
125
- description: zod_1.z.string().optional(),
126
- private: zod_1.z.boolean().optional(),
127
- auto_init: zod_1.z.boolean().optional(),
128
- gitignores: zod_1.z.string().optional(),
129
- license: zod_1.z.string().optional(),
130
- readme: zod_1.z.string().optional(),
131
- default_branch: zod_1.z.string().optional(),
132
- // Para list
133
- username: zod_1.z.string().optional(),
134
- page: zod_1.z.number().min(1).optional(),
135
- limit: zod_1.z.number().min(1).max(100).optional(),
136
- // Para update
137
- new_name: zod_1.z.string().optional(),
138
- new_description: zod_1.z.string().optional(),
139
- new_private: zod_1.z.boolean().optional(),
140
- archived: zod_1.z.boolean().optional(),
141
- // Para fork
142
- organization: zod_1.z.string().optional(),
143
- // Para search
144
- query: zod_1.z.string().optional(),
145
- });
146
- // Schema de saída
147
- const GitRepositoriesResultSchema = zod_1.z.object({
148
- success: zod_1.z.boolean(),
149
- action: zod_1.z.string(),
150
- message: zod_1.z.string(),
151
- data: zod_1.z.any().optional(),
152
- error: zod_1.z.string().optional()
153
- });
154
- /**
155
- * Tool: git-repositories
156
- *
157
- * DESCRIÇÃO:
158
- * Gerenciamento completo de repositórios Git (GitHub + Gitea) com múltiplas ações
159
- *
160
- * ACTIONS DISPONÍVEIS:
161
- *
162
- * 1. create - Criar novo repositório
163
- * Parâmetros:
164
- * - name (obrigatório): Nome do repositório
165
- * - description (opcional): Descrição do repositório
166
- * - private (opcional): Repositório privado (padrão: false)
167
- * - auto_init (opcional): Inicializar com README (padrão: false)
168
- * - gitignores (opcional): Template de .gitignore
169
- * - license (opcional): Template de licença
170
- * - readme (opcional): Conteúdo do README
171
- * - default_branch (opcional): Branch padrão
172
- *
173
- * 2. list - Listar repositórios
174
- * Parâmetros:
175
- * - username (opcional): Usuário específico (padrão: usuário atual)
176
- * - page (opcional): Página da listagem (padrão: 1)
177
- * - limit (opcional): Itens por página (padrão: 30)
178
- *
179
- * 3. get - Obter detalhes do repositório
180
- * Parâmetros:
181
- * - owner (obrigatório): Proprietário do repositório
182
- * - repo (obrigatório): Nome do repositório
183
- *
184
- * 4. update - Atualizar repositório
185
- * Parâmetros:
186
- * - owner (obrigatório): Proprietário do repositório
187
- * - repo (obrigatório): Nome do repositório
188
- * - new_name (opcional): Novo nome
189
- * - new_description (opcional): Nova descrição
190
- * - new_private (opcional): Nova visibilidade
191
- * - archived (opcional): Status de arquivamento
192
- *
193
- * 5. delete - Deletar repositório
194
- * Parâmetros:
195
- * - owner (obrigatório): Proprietário do repositório
196
- * - repo (obrigatório): Nome do repositório
197
- *
198
- * 6. fork - Fazer fork do repositório
199
- * Parâmetros:
200
- * - owner (obrigatório): Proprietário do repositório original
201
- * - repo (obrigatório): Nome do repositório original
202
- * - organization (opcional): Organização de destino
203
- *
204
- * 7. search - Buscar repositórios
205
- * Parâmetros:
206
- * - query (obrigatório): Termo de busca
207
- * - page (opcional): Página da busca (padrão: 1)
208
- * - limit (opcional): Itens por página (padrão: 30)
209
- *
210
- * 8. init - Inicializar repositório Git local
211
- * Parâmetros:
212
- * - projectPath (obrigatório): Caminho do projeto local
213
- * - owner/repo (opcional): Para configurar remote
214
- *
215
- * 9. clone - Clonar repositório para local
216
- * Parâmetros:
217
- * - owner (obrigatório): Proprietário do repositório
218
- * - repo (obrigatório): Nome do repositório
219
- * - projectPath (obrigatório): Caminho local de destino
220
- *
221
- * RECOMENDAÇÕES DE USO:
222
- * - Use nomes descritivos para repositórios
223
- * - Configure visibilidade adequada para o projeto
224
- * - Mantenha descrições atualizadas
225
- * - Use templates para projetos similares
226
- * - Configure branch padrão adequada
227
- * - Use paginação para listas grandes
228
- */
229
- exports.gitRepositoriesTool = {
230
- name: 'git-repositories',
231
- description: 'tool: Gerencia repositórios Git completos, criação, configuração, busca e operações avançadas\n──────────────\naction create: cria repositório novo\naction create requires: name, description, private, auto_init, gitignores, license, readme, default_branch, provider\n───────────────\naction list: lista repositórios do usuário\naction list requires: page, limit, username, provider\n───────────────\naction get: obtém detalhes específicos\naction get requires: repo, provider\n───────────────\naction update: atualiza configurações\naction update requires: repo, new_name, new_description, new_private, archived, provider\n───────────────\naction delete: remove repositório\naction delete requires: repo, provider\n───────────────\naction fork: cria fork\naction fork requires: repo, organization, provider\n───────────────\naction search: busca repositórios\naction search requires: query, provider\n───────────────\naction init: inicializa repositório local\naction init requires: projectPath, provider\n───────────────\naction clone: clona repositório\naction clone requires: repo, projectPath, provider',
232
- inputSchema: {
233
- type: 'object',
234
- properties: {
235
- action: {
236
- type: 'string',
237
- enum: ['create', 'list', 'get', 'update', 'delete', 'fork', 'search', 'init', 'clone'],
238
- description: 'Action to perform on repositories'
239
- },
240
- repo: { type: 'string', description: 'Repository name' },
241
- provider: { type: 'string', enum: ['gitea', 'github'], description: 'Provider to use (gitea or github)' },
242
- projectPath: { type: 'string', description: 'Local project path for git operations' },
243
- name: { type: 'string', description: 'Repository name for creation' },
244
- description: { type: 'string', description: 'Repository description' },
245
- private: { type: 'boolean', description: 'Private repository' },
246
- auto_init: { type: 'boolean', description: 'Auto initialize with README' },
247
- gitignores: { type: 'string', description: 'Gitignore template' },
248
- license: { type: 'string', description: 'License template' },
249
- readme: { type: 'string', description: 'README content' },
250
- default_branch: { type: 'string', description: 'Default branch name' },
251
- username: { type: 'string', description: 'Username for listing repos' },
252
- page: { type: 'number', description: 'Page number', minimum: 1 },
253
- limit: { type: 'number', description: 'Items per page', minimum: 1, maximum: 100 },
254
- new_name: { type: 'string', description: 'New repository name' },
255
- new_description: { type: 'string', description: 'New repository description' },
256
- new_private: { type: 'boolean', description: 'New privacy setting' },
257
- archived: { type: 'boolean', description: 'Archive status' },
258
- organization: { type: 'string', description: 'Organization for fork' },
259
- query: { type: 'string', description: 'Search query' }
260
- },
261
- required: ['action', 'provider']
262
- },
263
- /**
264
- * Handler principal da tool git-repositories
265
- *
266
- * FUNCIONALIDADE:
267
- * - Valida entrada usando Zod schema
268
- * - Roteia para método específico baseado na ação
269
- * - Trata erros de forma uniforme
270
- * - Retorna resultado padronizado
271
- *
272
- * FLUXO:
273
- * 1. Validação de entrada
274
- * 2. Roteamento por ação
275
- * 3. Execução do método específico
276
- * 4. Tratamento de erros
277
- * 5. Retorno de resultado
278
- *
279
- * TRATAMENTO DE ERROS:
280
- * - Validação: erro de schema
281
- * - Execução: erro da operação
282
- * - Roteamento: ação não suportada
283
- *
284
- * RECOMENDAÇÕES:
285
- * - Sempre valide entrada antes de processar
286
- * - Trate erros específicos adequadamente
287
- * - Log detalhes de erro para debug
288
- * - Retorne mensagens de erro úteis
289
- */
290
- async handler(input) {
291
- try {
292
- const validatedInput = GitRepositoriesInputSchema.parse(input);
293
- // Aplicar auto-detecção apenas para owner/username dentro do provider especificado
294
- const processedInput = await (0, user_detection_js_1.applyAutoUserDetection)(validatedInput, validatedInput.provider);
295
- // Usar o provider especificado pelo usuário
296
- const provider = index_js_1.globalProviderFactory.getProvider(processedInput.provider);
297
- if (!provider) {
298
- throw new Error(`Provider '${processedInput.provider}' não encontrado`);
299
- }
300
- switch (processedInput.action) {
301
- case 'create':
302
- return await this.createRepository(processedInput, provider);
303
- case 'list':
304
- return await this.listRepositories(processedInput, provider);
305
- case 'get':
306
- return await this.getRepository(processedInput, provider);
307
- case 'update':
308
- return await this.updateRepository(processedInput, provider);
309
- case 'delete':
310
- return await this.deleteRepository(processedInput, provider);
311
- case 'fork':
312
- return await this.forkRepository(processedInput, provider);
313
- case 'search':
314
- return await this.searchRepositories(processedInput, provider);
315
- case 'init':
316
- return await this.initRepository(processedInput, provider);
317
- case 'clone':
318
- return await this.cloneRepository(processedInput, provider);
319
- default:
320
- throw new Error(`Ação não suportada: ${processedInput.action}`);
321
- }
322
- }
323
- catch (error) {
324
- return {
325
- success: false,
326
- action: input.action,
327
- message: 'Erro na operação de repositórios',
328
- error: error instanceof Error ? error.message : String(error)
329
- };
330
- }
331
- },
332
- /**
333
- * Cria um novo repositório
334
- *
335
- * FUNCIONALIDADE:
336
- * - Valida parâmetros obrigatórios
337
- * - Configura dados padrão
338
- * - Chama API do provider para criação
339
- * - Retorna resultado formatado
340
- *
341
- * PARÂMETROS OBRIGATÓRIOS:
342
- * - name: Nome do repositório
343
- *
344
- * PARÂMETROS OPCIONAIS:
345
- * - description: Descrição do repositório
346
- * - private: Visibilidade (padrão: false)
347
- * - auto_init: Inicializar com README (padrão: false)
348
- * - gitignores: Template de .gitignore
349
- * - license: Template de licença
350
- * - readme: Conteúdo do README
351
- * - default_branch: Branch padrão (padrão: main)
352
- *
353
- * VALIDAÇÕES:
354
- * - Nome obrigatório
355
- * - Nome único no usuário/organização
356
- * - Permissões adequadas
357
- *
358
- * RECOMENDAÇÕES:
359
- * - Use nomes descritivos e únicos
360
- * - Configure visibilidade adequada
361
- * - Inicialize com README para projetos novos
362
- * - Use templates para consistência
363
- */
364
- async createRepository(params, provider) {
365
- try {
366
- if (!params.name) {
367
- throw new Error('Nome do repositório é obrigatório');
368
- }
369
- const repository = await provider.createRepository(params.name, params.description, params.private || false);
370
- return {
371
- success: true,
372
- action: 'create',
373
- message: `Repositório '${params.name}' criado com sucesso`,
374
- data: repository
375
- };
376
- }
377
- catch (error) {
378
- throw new Error(`Falha ao criar repositório: ${error instanceof Error ? error.message : String(error)}`);
379
- }
380
- },
381
- async listRepositories(params, provider) {
382
- try {
383
- const page = params.page || 1;
384
- const limit = params.limit || 30;
385
- const repositories = await provider.listRepositories(params.username, page, limit);
386
- return {
387
- success: true,
388
- action: 'list',
389
- message: `${repositories.length} repositórios encontrados`,
390
- data: {
391
- repositories,
392
- page,
393
- limit,
394
- total: repositories.length
395
- }
396
- };
397
- }
398
- catch (error) {
399
- throw new Error(`Falha ao listar repositórios: ${error instanceof Error ? error.message : String(error)}`);
400
- }
401
- },
402
- async getRepository(params, provider) {
403
- try {
404
- if (!params.repo) {
405
- throw new Error('Nome do repositório é obrigatório');
406
- }
407
- const currentUser = await provider.getCurrentUser();
408
- const owner = currentUser.login;
409
- const repository = await provider.getRepository((await provider.getCurrentUser()).login, params.repo);
410
- return {
411
- success: true,
412
- action: 'get',
413
- message: `Repositório '${owner}/${params.repo}' obtido com sucesso`,
414
- data: repository
415
- };
416
- }
417
- catch (error) {
418
- throw new Error(`Falha ao obter repositório: ${error instanceof Error ? error.message : String(error)}`);
419
- }
420
- },
421
- async updateRepository(params, provider) {
422
- try {
423
- if (!params.repo) {
424
- throw new Error('Nome do repositório é obrigatório');
425
- }
426
- const currentUser = await provider.getCurrentUser();
427
- const owner = currentUser.login;
428
- const updateData = {};
429
- if (params.new_name)
430
- updateData.name = params.new_name;
431
- if (params.new_description !== undefined)
432
- updateData.description = params.new_description;
433
- if (params.new_private !== undefined)
434
- updateData.private = params.new_private;
435
- if (params.archived !== undefined)
436
- updateData.archived = params.archived;
437
- if (Object.keys(updateData).length === 0) {
438
- throw new Error('Nenhum campo para atualizar foi fornecido');
439
- }
440
- const repository = await provider.updateRepository((await provider.getCurrentUser()).login, params.repo, updateData);
441
- return {
442
- success: true,
443
- action: 'update',
444
- message: `Repositório '${owner}/${params.repo}' atualizado com sucesso`,
445
- data: repository
446
- };
447
- }
448
- catch (error) {
449
- throw new Error(`Falha ao atualizar repositório: ${error instanceof Error ? error.message : String(error)}`);
450
- }
451
- },
452
- async deleteRepository(params, provider) {
453
- try {
454
- if (!params.repo) {
455
- throw new Error('Nome do repositório é obrigatório');
456
- }
457
- const currentUser = await provider.getCurrentUser();
458
- const owner = currentUser.login;
459
- await provider.deleteRepository((await provider.getCurrentUser()).login, params.repo);
460
- return {
461
- success: true,
462
- action: 'delete',
463
- message: `Repositório '${owner}/${params.repo}' deletado com sucesso`,
464
- data: { deleted: true }
465
- };
466
- }
467
- catch (error) {
468
- throw new Error(`Falha ao deletar repositório: ${error instanceof Error ? error.message : String(error)}`);
469
- }
470
- },
471
- async forkRepository(params, provider) {
472
- try {
473
- if (!params.repo) {
474
- throw new Error('Nome do repositório é obrigatório');
475
- }
476
- const currentUser = await provider.getCurrentUser();
477
- const owner = currentUser.login;
478
- const repository = await provider.forkRepository((await provider.getCurrentUser()).login, params.repo, params.organization);
479
- return {
480
- success: true,
481
- action: 'fork',
482
- message: `Fork do repositório '${owner}/${params.repo}' criado com sucesso`,
483
- data: repository
484
- };
485
- }
486
- catch (error) {
487
- throw new Error(`Falha ao fazer fork do repositório: ${error instanceof Error ? error.message : String(error)}`);
488
- }
489
- },
490
- async searchRepositories(params, provider) {
491
- try {
492
- if (!params.query) {
493
- throw new Error('Query de busca é obrigatória');
494
- }
495
- const page = params.page || 1;
496
- const limit = params.limit || 30;
497
- const repositories = await provider.searchRepositories(params.query, page, limit);
498
- return {
499
- success: true,
500
- action: 'search',
501
- message: `${repositories.length} repositórios encontrados para '${params.query}'`,
502
- data: {
503
- repositories,
504
- query: params.query,
505
- page,
506
- limit,
507
- total: repositories.length
508
- }
509
- };
510
- }
511
- catch (error) {
512
- throw new Error(`Falha ao buscar repositórios: ${error instanceof Error ? error.message : String(error)}`);
513
- }
514
- },
515
- /**
516
- * Inicializa um repositório Git local
517
- *
518
- * FUNCIONALIDADE:
519
- * - Executa 'git init' no diretório especificado
520
- * - Cria estrutura básica do Git
521
- * - Adiciona remote se especificado
522
- *
523
- * PARÂMETROS OBRIGATÓRIOS:
524
- * - projectPath: Caminho do projeto local
525
- *
526
- * PARÂMETROS OPCIONAIS:
527
- * - owner/repo: Para configurar remote
528
- * - provider: Para determinar URL do remote
529
- *
530
- * RECOMENDAÇÕES:
531
- * - Verifique se diretório existe
532
- * - Use caminhos absolutos
533
- * - Configure remote após inicialização
534
- */
535
- async initRepository(params, provider) {
536
- try {
537
- if (!params.projectPath) {
538
- throw new Error('projectPath é obrigatório para inicialização do repositório');
539
- }
540
- // Executa git init no diretório especificado
541
- const initResult = await (0, terminal_controller_js_1.runTerminalCmd)({
542
- command: `git init "${params.projectPath}"`,
543
- is_background: false,
544
- explanation: 'Inicializando repositório Git local'
545
- });
546
- if (initResult.exitCode !== 0) {
547
- throw new Error(`Falha ao inicializar repositório: ${initResult.output}`);
548
- }
549
- // Se owner/repo foram especificados, configura remote
550
- if (params.repo && provider) {
551
- const currentUser = await provider.getCurrentUser();
552
- const owner = currentUser.login;
553
- // Obtém URL base do provider
554
- const providerConfig = provider.getConfig ? provider.getConfig() : null;
555
- const baseUrl = providerConfig?.apiUrl || (params.provider === 'gitea' ? 'http://nas-ubuntu:3000' : 'https://github.com');
556
- const remoteUrl = params.provider === 'gitea'
557
- ? `${baseUrl.replace('/api/v1', '')}/${owner}/${params.repo}.git`
558
- : `https://github.com/${owner}/${params.repo}.git`;
559
- const remoteResult = await (0, terminal_controller_js_1.runTerminalCmd)({
560
- command: `cd "${params.projectPath}" && git remote add origin "${remoteUrl}"`,
561
- is_background: false,
562
- explanation: 'Configurando remote origin'
563
- });
564
- if (remoteResult.exitCode !== 0) {
565
- console.warn(`Aviso: Não foi possível configurar remote: ${remoteResult.output}`);
566
- }
567
- }
568
- return {
569
- success: true,
570
- action: 'init',
571
- message: `Repositório Git inicializado com sucesso em '${params.projectPath}'`,
572
- data: {
573
- path: params.projectPath,
574
- initialized: true,
575
- remoteConfigured: !!(params.repo && provider)
576
- }
577
- };
578
- }
579
- catch (error) {
580
- throw new Error(`Falha ao inicializar repositório: ${error instanceof Error ? error.message : String(error)}`);
581
- }
582
- },
583
- /**
584
- * Clona um repositório para o diretório local
585
- *
586
- * FUNCIONALIDADE:
587
- * - Clona repositório remoto para diretório local
588
- * - Suporta diferentes protocolos (HTTPS, SSH)
589
- * - Mantém estrutura de diretórios
590
- *
591
- * PARÂMETROS OBRIGATÓRIOS:
592
- * - owner: Proprietário do repositório
593
- * - repo: Nome do repositório
594
- * - projectPath: Caminho local de destino
595
- * - provider: Provider a ser usado
596
- *
597
- * RECOMENDAÇÕES:
598
- * - Verifique espaço em disco disponível
599
- * - Use caminhos absolutos
600
- * - Considere profundidade de clone para repositórios grandes
601
- */
602
- async cloneRepository(params, provider) {
603
- try {
604
- if (!params.repo || !params.projectPath) {
605
- throw new Error('repo e projectPath são obrigatórios para clonagem');
606
- }
607
- const currentUser = await provider.getCurrentUser();
608
- const owner = currentUser.login;
609
- // Obtém URL do repositório
610
- const providerConfig = provider.getConfig ? provider.getConfig() : null;
611
- const baseUrl = providerConfig?.apiUrl || (params.provider === 'gitea' ? 'http://nas-ubuntu:3000' : 'https://github.com');
612
- const repoUrl = params.provider === 'gitea'
613
- ? `${baseUrl.replace('/api/v1', '')}/${owner}/${params.repo}.git`
614
- : `https://github.com/${owner}/${params.repo}.git`;
615
- // Executa git clone
616
- const cloneResult = await (0, terminal_controller_js_1.runTerminalCmd)({
617
- command: `git clone "${repoUrl}" "${params.projectPath}"`,
618
- is_background: false,
619
- explanation: 'Clonando repositório remoto'
620
- });
621
- if (cloneResult.exitCode !== 0) {
622
- throw new Error(`Falha ao clonar repositório: ${cloneResult.output}`);
623
- }
624
- return {
625
- success: true,
626
- action: 'clone',
627
- message: `Repositório '${owner}/${params.repo}' clonado com sucesso para '${params.projectPath}'`,
628
- data: {
629
- source: `${owner}/${params.repo}`,
630
- destination: params.projectPath,
631
- cloned: true,
632
- url: repoUrl
633
- }
634
- };
635
- }
636
- catch (error) {
637
- throw new Error(`Falha ao clonar repositório: ${error instanceof Error ? error.message : String(error)}`);
638
- }
639
- }
640
- };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gitRepositoriesTool = 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: git-repositories
10
+ *
11
+ * DESCRIÇÃO COMPLETA:
12
+ * Gerenciamento completo de repositórios Git com suporte multi-provider (GitHub e Gitea).
13
+ * Esta tool é 100% auto-suficiente e implementa TODAS as operações de repositório sem depender
14
+ * de outras tools ou comandos externos.
15
+ *
16
+ * FUNCIONALIDADES IMPLEMENTADAS:
17
+ *
18
+ * 1. CRIAÇÃO E CONFIGURAÇÃO:
19
+ * - create: Cria novos repositórios com configurações completas
20
+ * - init: Inicializa repositórios Git locais
21
+ * - clone: Clona repositórios remotos localmente
22
+ * - update: Atualiza configurações de repositórios existentes
23
+ *
24
+ * 2. LISTAGEM E BUSCA:
25
+ * - list: Lista repositórios do usuário ou organização
26
+ * - get: Obtém detalhes específicos de um repositório
27
+ * - search: Busca repositórios por critérios específicos
28
+ *
29
+ * 3. OPERAÇÕES AVANÇADAS:
30
+ * - fork: Cria fork de repositórios existentes
31
+ * - delete: Remove repositórios permanentemente
32
+ * - archive: Arquivamento de repositórios
33
+ * - transfer: Transferência de propriedade
34
+ *
35
+ * 4. CONFIGURAÇÕES E METADADOS:
36
+ * - Visibilidade (público/privado)
37
+ * - Descrições e documentação
38
+ * - Configurações de branch padrão
39
+ * - Templates e inicialização automática
40
+ * - Licenças e arquivos de configuração
41
+ *
42
+ * PARÂMETROS OBRIGATÓRIOS:
43
+ * - action: Ação a executar (create, list, get, update, delete, fork, search, init, clone)
44
+ * - provider: Provedor a usar (gitea ou github)
45
+ * - owner: Proprietário do repositório (obrigatório para operações remotas)
46
+ * - repo: Nome do repositório (obrigatório para operações remotas)
47
+ * - projectPath: Caminho do projeto local (obrigatório para operações locais)
48
+ *
49
+ * PARÂMETROS OPCIONAIS:
50
+ * - name: Nome do repositório para criação
51
+ * - description: Descrição do repositório
52
+ * - private: Visibilidade do repositório
53
+ * - auto_init: Inicialização automática com README
54
+ * - gitignores: Template de .gitignore
55
+ * - license: Template de licença
56
+ * - readme: Conteúdo do README
57
+ * - default_branch: Branch padrão
58
+ * - username: Usuário para listagem
59
+ * - page: Página para paginação
60
+ * - limit: Limite de resultados
61
+ * - new_name: Novo nome para atualização
62
+ * - new_description: Nova descrição
63
+ * - new_private: Nova visibilidade
64
+ * - archived: Status de arquivamento
65
+ * - organization: Organização para fork
66
+ * - query: Termo de busca
67
+ *
68
+ * CASOS DE USO:
69
+ * 1. Criação de repositórios para novos projetos
70
+ * 2. Backup e migração de código
71
+ * 3. Organização de projetos em equipe
72
+ * 4. Automação de workflows de desenvolvimento
73
+ * 5. Gerenciamento de repositórios em massa
74
+ * 6. Configuração de templates de projeto
75
+ * 7. Sincronização entre diferentes provedores
76
+ *
77
+ * EXEMPLOS DE USO:
78
+ * - Criar repositório: action=create, name=meu-projeto, description=Projeto incrível
79
+ * - Listar repositórios: action=list, username=usuario
80
+ * - Buscar repositórios: action=search, query=react typescript
81
+ * - Clonar repositório: action=clone, url=https://github.com/user/repo.git
82
+ * - Inicializar local: action=init, projectPath=/path/to/project
83
+ *
84
+ * RECOMENDAÇÕES:
85
+ * - Use nomes descritivos e consistentes
86
+ * - Configure visibilidade adequada para cada projeto
87
+ * - Mantenha descrições atualizadas e informativas
88
+ * - Use templates para padronização
89
+ * - Configure branches padrão apropriadas
90
+ * - Documente configurações importantes
91
+ * - Use licenças adequadas para cada projeto
92
+ *
93
+ * LIMITAÇÕES:
94
+ * - Operações de arquivamento dependem do provedor
95
+ * - Transferência de propriedade requer permissões especiais
96
+ * - Alguns provedores podem ter limitações de API
97
+ *
98
+ * SEGURANÇA:
99
+ * - Tokens de acesso são obrigatórios para operações remotas
100
+ * - Validação de permissões antes de operações destrutivas
101
+ * - Logs detalhados de todas as operações
102
+ * - Tratamento seguro de informações sensíveis
103
+ */
104
+ /**
105
+ * Schema de validação para entrada da tool git-repositories
106
+ *
107
+ * VALIDAÇÕES:
108
+ * - action: Ação obrigatória (create, list, get, update, delete, fork, search, init, clone)
109
+ * - provider: Obrigatório (gitea ou github)
110
+ * - Parâmetros específicos por ação
111
+ * - Validação de tipos e formatos
112
+ *
113
+ * RECOMENDAÇÕES:
114
+ * - Sempre valide entrada antes de usar
115
+ * - Use parâmetros opcionais adequadamente
116
+ * - Documente parâmetros obrigatórios
117
+ */
118
+ const GitRepositoriesInputSchema = zod_1.z.object({
119
+ action: zod_1.z.enum(['create', 'list', 'get', 'update', 'delete', 'fork', 'search', 'init', 'clone']),
120
+ // Parâmetros comuns
121
+ repo: zod_1.z.string().optional(),
122
+ provider: zod_1.z.enum(['gitea', 'github']).describe('Provider to use (gitea or github)'),
123
+ projectPath: zod_1.z.string().describe('Local project path for git operations'),
124
+ name: zod_1.z.string().optional(),
125
+ description: zod_1.z.string().optional(),
126
+ private: zod_1.z.boolean().optional(),
127
+ auto_init: zod_1.z.boolean().optional(),
128
+ gitignores: zod_1.z.string().optional(),
129
+ license: zod_1.z.string().optional(),
130
+ readme: zod_1.z.string().optional(),
131
+ default_branch: zod_1.z.string().optional(),
132
+ // Para list
133
+ username: zod_1.z.string().optional(),
134
+ page: zod_1.z.number().min(1).optional(),
135
+ limit: zod_1.z.number().min(1).max(100).optional(),
136
+ // Para update
137
+ new_name: zod_1.z.string().optional(),
138
+ new_description: zod_1.z.string().optional(),
139
+ new_private: zod_1.z.boolean().optional(),
140
+ archived: zod_1.z.boolean().optional(),
141
+ // Para fork
142
+ organization: zod_1.z.string().optional(),
143
+ // Para search
144
+ query: zod_1.z.string().optional(),
145
+ });
146
+ // Schema de saída
147
+ const GitRepositoriesResultSchema = zod_1.z.object({
148
+ success: zod_1.z.boolean(),
149
+ action: zod_1.z.string(),
150
+ message: zod_1.z.string(),
151
+ data: zod_1.z.any().optional(),
152
+ error: zod_1.z.string().optional()
153
+ });
154
+ /**
155
+ * Tool: git-repositories
156
+ *
157
+ * DESCRIÇÃO:
158
+ * Gerenciamento completo de repositórios Git (GitHub + Gitea) com múltiplas ações
159
+ *
160
+ * ACTIONS DISPONÍVEIS:
161
+ *
162
+ * 1. create - Criar novo repositório
163
+ * Parâmetros:
164
+ * - name (obrigatório): Nome do repositório
165
+ * - description (opcional): Descrição do repositório
166
+ * - private (opcional): Repositório privado (padrão: false)
167
+ * - auto_init (opcional): Inicializar com README (padrão: false)
168
+ * - gitignores (opcional): Template de .gitignore
169
+ * - license (opcional): Template de licença
170
+ * - readme (opcional): Conteúdo do README
171
+ * - default_branch (opcional): Branch padrão
172
+ *
173
+ * 2. list - Listar repositórios
174
+ * Parâmetros:
175
+ * - username (opcional): Usuário específico (padrão: usuário atual)
176
+ * - page (opcional): Página da listagem (padrão: 1)
177
+ * - limit (opcional): Itens por página (padrão: 30)
178
+ *
179
+ * 3. get - Obter detalhes do repositório
180
+ * Parâmetros:
181
+ * - owner (obrigatório): Proprietário do repositório
182
+ * - repo (obrigatório): Nome do repositório
183
+ *
184
+ * 4. update - Atualizar repositório
185
+ * Parâmetros:
186
+ * - owner (obrigatório): Proprietário do repositório
187
+ * - repo (obrigatório): Nome do repositório
188
+ * - new_name (opcional): Novo nome
189
+ * - new_description (opcional): Nova descrição
190
+ * - new_private (opcional): Nova visibilidade
191
+ * - archived (opcional): Status de arquivamento
192
+ *
193
+ * 5. delete - Deletar repositório
194
+ * Parâmetros:
195
+ * - owner (obrigatório): Proprietário do repositório
196
+ * - repo (obrigatório): Nome do repositório
197
+ *
198
+ * 6. fork - Fazer fork do repositório
199
+ * Parâmetros:
200
+ * - owner (obrigatório): Proprietário do repositório original
201
+ * - repo (obrigatório): Nome do repositório original
202
+ * - organization (opcional): Organização de destino
203
+ *
204
+ * 7. search - Buscar repositórios
205
+ * Parâmetros:
206
+ * - query (obrigatório): Termo de busca
207
+ * - page (opcional): Página da busca (padrão: 1)
208
+ * - limit (opcional): Itens por página (padrão: 30)
209
+ *
210
+ * 8. init - Inicializar repositório Git local
211
+ * Parâmetros:
212
+ * - projectPath (obrigatório): Caminho do projeto local
213
+ * - owner/repo (opcional): Para configurar remote
214
+ *
215
+ * 9. clone - Clonar repositório para local
216
+ * Parâmetros:
217
+ * - owner (obrigatório): Proprietário do repositório
218
+ * - repo (obrigatório): Nome do repositório
219
+ * - projectPath (obrigatório): Caminho local de destino
220
+ *
221
+ * RECOMENDAÇÕES DE USO:
222
+ * - Use nomes descritivos para repositórios
223
+ * - Configure visibilidade adequada para o projeto
224
+ * - Mantenha descrições atualizadas
225
+ * - Use templates para projetos similares
226
+ * - Configure branch padrão adequada
227
+ * - Use paginação para listas grandes
228
+ */
229
+ exports.gitRepositoriesTool = {
230
+ name: 'git-repositories',
231
+ description: 'tool: Gerencia repositórios Git completos, criação, configuração, busca e operações avançadas\n──────────────\naction create: cria repositório novo\naction create requires: name, description, private, auto_init, gitignores, license, readme, default_branch, provider\n───────────────\naction list: lista repositórios do usuário\naction list requires: page, limit, username, provider\n───────────────\naction get: obtém detalhes específicos\naction get requires: repo, provider\n───────────────\naction update: atualiza configurações\naction update requires: repo, new_name, new_description, new_private, archived, provider\n───────────────\naction delete: remove repositório\naction delete requires: repo, provider\n───────────────\naction fork: cria fork\naction fork requires: repo, organization, provider\n───────────────\naction search: busca repositórios\naction search requires: query, provider\n───────────────\naction init: inicializa repositório local\naction init requires: projectPath, provider\n───────────────\naction clone: clona repositório\naction clone requires: repo, projectPath, provider',
232
+ inputSchema: {
233
+ type: 'object',
234
+ properties: {
235
+ action: {
236
+ type: 'string',
237
+ enum: ['create', 'list', 'get', 'update', 'delete', 'fork', 'search', 'init', 'clone'],
238
+ description: 'Action to perform on repositories'
239
+ },
240
+ repo: { type: 'string', description: 'Repository name' },
241
+ provider: { type: 'string', enum: ['gitea', 'github'], description: 'Provider to use (gitea or github)' },
242
+ projectPath: { type: 'string', description: 'Local project path for git operations' },
243
+ name: { type: 'string', description: 'Repository name for creation' },
244
+ description: { type: 'string', description: 'Repository description' },
245
+ private: { type: 'boolean', description: 'Private repository' },
246
+ auto_init: { type: 'boolean', description: 'Auto initialize with README' },
247
+ gitignores: { type: 'string', description: 'Gitignore template' },
248
+ license: { type: 'string', description: 'License template' },
249
+ readme: { type: 'string', description: 'README content' },
250
+ default_branch: { type: 'string', description: 'Default branch name' },
251
+ username: { type: 'string', description: 'Username for listing repos' },
252
+ page: { type: 'number', description: 'Page number', minimum: 1 },
253
+ limit: { type: 'number', description: 'Items per page', minimum: 1, maximum: 100 },
254
+ new_name: { type: 'string', description: 'New repository name' },
255
+ new_description: { type: 'string', description: 'New repository description' },
256
+ new_private: { type: 'boolean', description: 'New privacy setting' },
257
+ archived: { type: 'boolean', description: 'Archive status' },
258
+ organization: { type: 'string', description: 'Organization for fork' },
259
+ query: { type: 'string', description: 'Search query' }
260
+ },
261
+ required: ['action', 'provider', 'projectPath']
262
+ },
263
+ /**
264
+ * Handler principal da tool git-repositories
265
+ *
266
+ * FUNCIONALIDADE:
267
+ * - Valida entrada usando Zod schema
268
+ * - Roteia para método específico baseado na ação
269
+ * - Trata erros de forma uniforme
270
+ * - Retorna resultado padronizado
271
+ *
272
+ * FLUXO:
273
+ * 1. Validação de entrada
274
+ * 2. Roteamento por ação
275
+ * 3. Execução do método específico
276
+ * 4. Tratamento de erros
277
+ * 5. Retorno de resultado
278
+ *
279
+ * TRATAMENTO DE ERROS:
280
+ * - Validação: erro de schema
281
+ * - Execução: erro da operação
282
+ * - Roteamento: ação não suportada
283
+ *
284
+ * RECOMENDAÇÕES:
285
+ * - Sempre valide entrada antes de processar
286
+ * - Trate erros específicos adequadamente
287
+ * - Log detalhes de erro para debug
288
+ * - Retorne mensagens de erro úteis
289
+ */
290
+ async handler(input) {
291
+ try {
292
+ const validatedInput = GitRepositoriesInputSchema.parse(input);
293
+ // Aplicar auto-detecção apenas para owner/username dentro do provider especificado
294
+ const processedInput = await (0, user_detection_js_1.applyAutoUserDetection)(validatedInput, validatedInput.provider);
295
+ // Usar o provider especificado pelo usuário
296
+ const provider = index_js_1.globalProviderFactory.getProvider(processedInput.provider);
297
+ if (!provider) {
298
+ throw new Error(`Provider '${processedInput.provider}' não encontrado`);
299
+ }
300
+ switch (processedInput.action) {
301
+ case 'create':
302
+ return await this.createRepository(processedInput, provider);
303
+ case 'list':
304
+ return await this.listRepositories(processedInput, provider);
305
+ case 'get':
306
+ return await this.getRepository(processedInput, provider);
307
+ case 'update':
308
+ return await this.updateRepository(processedInput, provider);
309
+ case 'delete':
310
+ return await this.deleteRepository(processedInput, provider);
311
+ case 'fork':
312
+ return await this.forkRepository(processedInput, provider);
313
+ case 'search':
314
+ return await this.searchRepositories(processedInput, provider);
315
+ case 'init':
316
+ return await this.initRepository(processedInput, provider);
317
+ case 'clone':
318
+ return await this.cloneRepository(processedInput, provider);
319
+ default:
320
+ throw new Error(`Ação não suportada: ${processedInput.action}`);
321
+ }
322
+ }
323
+ catch (error) {
324
+ return {
325
+ success: false,
326
+ action: input.action,
327
+ message: 'Erro na operação de repositórios',
328
+ error: error instanceof Error ? error.message : String(error)
329
+ };
330
+ }
331
+ },
332
+ /**
333
+ * Cria um novo repositório
334
+ *
335
+ * FUNCIONALIDADE:
336
+ * - Valida parâmetros obrigatórios
337
+ * - Configura dados padrão
338
+ * - Chama API do provider para criação
339
+ * - Retorna resultado formatado
340
+ *
341
+ * PARÂMETROS OBRIGATÓRIOS:
342
+ * - name: Nome do repositório
343
+ *
344
+ * PARÂMETROS OPCIONAIS:
345
+ * - description: Descrição do repositório
346
+ * - private: Visibilidade (padrão: false)
347
+ * - auto_init: Inicializar com README (padrão: false)
348
+ * - gitignores: Template de .gitignore
349
+ * - license: Template de licença
350
+ * - readme: Conteúdo do README
351
+ * - default_branch: Branch padrão (padrão: main)
352
+ *
353
+ * VALIDAÇÕES:
354
+ * - Nome obrigatório
355
+ * - Nome único no usuário/organização
356
+ * - Permissões adequadas
357
+ *
358
+ * RECOMENDAÇÕES:
359
+ * - Use nomes descritivos e únicos
360
+ * - Configure visibilidade adequada
361
+ * - Inicialize com README para projetos novos
362
+ * - Use templates para consistência
363
+ */
364
+ async createRepository(params, provider) {
365
+ try {
366
+ if (!params.name) {
367
+ throw new Error('Nome do repositório é obrigatório');
368
+ }
369
+ const repository = await provider.createRepository(params.name, params.description, params.private || false);
370
+ return {
371
+ success: true,
372
+ action: 'create',
373
+ message: `Repositório '${params.name}' criado com sucesso`,
374
+ data: repository
375
+ };
376
+ }
377
+ catch (error) {
378
+ throw new Error(`Falha ao criar repositório: ${error instanceof Error ? error.message : String(error)}`);
379
+ }
380
+ },
381
+ async listRepositories(params, provider) {
382
+ try {
383
+ const page = params.page || 1;
384
+ const limit = params.limit || 30;
385
+ const repositories = await provider.listRepositories(params.username, page, limit);
386
+ return {
387
+ success: true,
388
+ action: 'list',
389
+ message: `${repositories.length} repositórios encontrados`,
390
+ data: {
391
+ repositories,
392
+ page,
393
+ limit,
394
+ total: repositories.length
395
+ }
396
+ };
397
+ }
398
+ catch (error) {
399
+ throw new Error(`Falha ao listar repositórios: ${error instanceof Error ? error.message : String(error)}`);
400
+ }
401
+ },
402
+ async getRepository(params, provider) {
403
+ try {
404
+ if (!params.repo) {
405
+ throw new Error('Nome do repositório é obrigatório');
406
+ }
407
+ const currentUser = await provider.getCurrentUser();
408
+ const owner = currentUser.login;
409
+ const repository = await provider.getRepository((await provider.getCurrentUser()).login, params.repo);
410
+ return {
411
+ success: true,
412
+ action: 'get',
413
+ message: `Repositório '${owner}/${params.repo}' obtido com sucesso`,
414
+ data: repository
415
+ };
416
+ }
417
+ catch (error) {
418
+ throw new Error(`Falha ao obter repositório: ${error instanceof Error ? error.message : String(error)}`);
419
+ }
420
+ },
421
+ async updateRepository(params, provider) {
422
+ try {
423
+ if (!params.repo) {
424
+ throw new Error('Nome do repositório é obrigatório');
425
+ }
426
+ const currentUser = await provider.getCurrentUser();
427
+ const owner = currentUser.login;
428
+ const updateData = {};
429
+ if (params.new_name)
430
+ updateData.name = params.new_name;
431
+ if (params.new_description !== undefined)
432
+ updateData.description = params.new_description;
433
+ if (params.new_private !== undefined)
434
+ updateData.private = params.new_private;
435
+ if (params.archived !== undefined)
436
+ updateData.archived = params.archived;
437
+ if (Object.keys(updateData).length === 0) {
438
+ throw new Error('Nenhum campo para atualizar foi fornecido');
439
+ }
440
+ const repository = await provider.updateRepository((await provider.getCurrentUser()).login, params.repo, updateData);
441
+ return {
442
+ success: true,
443
+ action: 'update',
444
+ message: `Repositório '${owner}/${params.repo}' atualizado com sucesso`,
445
+ data: repository
446
+ };
447
+ }
448
+ catch (error) {
449
+ throw new Error(`Falha ao atualizar repositório: ${error instanceof Error ? error.message : String(error)}`);
450
+ }
451
+ },
452
+ async deleteRepository(params, provider) {
453
+ try {
454
+ if (!params.repo) {
455
+ throw new Error('Nome do repositório é obrigatório');
456
+ }
457
+ const currentUser = await provider.getCurrentUser();
458
+ const owner = currentUser.login;
459
+ await provider.deleteRepository((await provider.getCurrentUser()).login, params.repo);
460
+ return {
461
+ success: true,
462
+ action: 'delete',
463
+ message: `Repositório '${owner}/${params.repo}' deletado com sucesso`,
464
+ data: { deleted: true }
465
+ };
466
+ }
467
+ catch (error) {
468
+ throw new Error(`Falha ao deletar repositório: ${error instanceof Error ? error.message : String(error)}`);
469
+ }
470
+ },
471
+ async forkRepository(params, provider) {
472
+ try {
473
+ if (!params.repo) {
474
+ throw new Error('Nome do repositório é obrigatório');
475
+ }
476
+ const currentUser = await provider.getCurrentUser();
477
+ const owner = currentUser.login;
478
+ const repository = await provider.forkRepository((await provider.getCurrentUser()).login, params.repo, params.organization);
479
+ return {
480
+ success: true,
481
+ action: 'fork',
482
+ message: `Fork do repositório '${owner}/${params.repo}' criado com sucesso`,
483
+ data: repository
484
+ };
485
+ }
486
+ catch (error) {
487
+ throw new Error(`Falha ao fazer fork do repositório: ${error instanceof Error ? error.message : String(error)}`);
488
+ }
489
+ },
490
+ async searchRepositories(params, provider) {
491
+ try {
492
+ if (!params.query) {
493
+ throw new Error('Query de busca é obrigatória');
494
+ }
495
+ const page = params.page || 1;
496
+ const limit = params.limit || 30;
497
+ const repositories = await provider.searchRepositories(params.query, page, limit);
498
+ return {
499
+ success: true,
500
+ action: 'search',
501
+ message: `${repositories.length} repositórios encontrados para '${params.query}'`,
502
+ data: {
503
+ repositories,
504
+ query: params.query,
505
+ page,
506
+ limit,
507
+ total: repositories.length
508
+ }
509
+ };
510
+ }
511
+ catch (error) {
512
+ throw new Error(`Falha ao buscar repositórios: ${error instanceof Error ? error.message : String(error)}`);
513
+ }
514
+ },
515
+ /**
516
+ * Inicializa um repositório Git local
517
+ *
518
+ * FUNCIONALIDADE:
519
+ * - Executa 'git init' no diretório especificado
520
+ * - Cria estrutura básica do Git
521
+ * - Adiciona remote se especificado
522
+ *
523
+ * PARÂMETROS OBRIGATÓRIOS:
524
+ * - projectPath: Caminho do projeto local
525
+ *
526
+ * PARÂMETROS OPCIONAIS:
527
+ * - owner/repo: Para configurar remote
528
+ * - provider: Para determinar URL do remote
529
+ *
530
+ * RECOMENDAÇÕES:
531
+ * - Verifique se diretório existe
532
+ * - Use caminhos absolutos
533
+ * - Configure remote após inicialização
534
+ */
535
+ async initRepository(params, provider) {
536
+ try {
537
+ if (!params.projectPath) {
538
+ throw new Error('projectPath é obrigatório para inicialização do repositório');
539
+ }
540
+ // Executa git init no diretório especificado
541
+ const initResult = await (0, terminal_controller_js_1.runTerminalCmd)({
542
+ command: `git init "${params.projectPath}"`,
543
+ is_background: false,
544
+ explanation: 'Inicializando repositório Git local'
545
+ });
546
+ if (initResult.exitCode !== 0) {
547
+ throw new Error(`Falha ao inicializar repositório: ${initResult.output}`);
548
+ }
549
+ // Se owner/repo foram especificados, configura remote
550
+ if (params.repo && provider) {
551
+ const currentUser = await provider.getCurrentUser();
552
+ const owner = currentUser.login;
553
+ // Obtém URL base do provider
554
+ const providerConfig = provider.getConfig ? provider.getConfig() : null;
555
+ const baseUrl = providerConfig?.apiUrl || (params.provider === 'gitea' ? 'http://nas-ubuntu:3000' : 'https://github.com');
556
+ const remoteUrl = params.provider === 'gitea'
557
+ ? `${baseUrl.replace('/api/v1', '')}/${owner}/${params.repo}.git`
558
+ : `https://github.com/${owner}/${params.repo}.git`;
559
+ const remoteResult = await (0, terminal_controller_js_1.runTerminalCmd)({
560
+ command: `cd "${params.projectPath}" && git remote add origin "${remoteUrl}"`,
561
+ is_background: false,
562
+ explanation: 'Configurando remote origin'
563
+ });
564
+ if (remoteResult.exitCode !== 0) {
565
+ console.warn(`Aviso: Não foi possível configurar remote: ${remoteResult.output}`);
566
+ }
567
+ }
568
+ return {
569
+ success: true,
570
+ action: 'init',
571
+ message: `Repositório Git inicializado com sucesso em '${params.projectPath}'`,
572
+ data: {
573
+ path: params.projectPath,
574
+ initialized: true,
575
+ remoteConfigured: !!(params.repo && provider)
576
+ }
577
+ };
578
+ }
579
+ catch (error) {
580
+ throw new Error(`Falha ao inicializar repositório: ${error instanceof Error ? error.message : String(error)}`);
581
+ }
582
+ },
583
+ /**
584
+ * Clona um repositório para o diretório local
585
+ *
586
+ * FUNCIONALIDADE:
587
+ * - Clona repositório remoto para diretório local
588
+ * - Suporta diferentes protocolos (HTTPS, SSH)
589
+ * - Mantém estrutura de diretórios
590
+ *
591
+ * PARÂMETROS OBRIGATÓRIOS:
592
+ * - owner: Proprietário do repositório
593
+ * - repo: Nome do repositório
594
+ * - projectPath: Caminho local de destino
595
+ * - provider: Provider a ser usado
596
+ *
597
+ * RECOMENDAÇÕES:
598
+ * - Verifique espaço em disco disponível
599
+ * - Use caminhos absolutos
600
+ * - Considere profundidade de clone para repositórios grandes
601
+ */
602
+ async cloneRepository(params, provider) {
603
+ try {
604
+ if (!params.repo || !params.projectPath) {
605
+ throw new Error('repo e projectPath são obrigatórios para clonagem');
606
+ }
607
+ const currentUser = await provider.getCurrentUser();
608
+ const owner = currentUser.login;
609
+ // Obtém URL do repositório
610
+ const providerConfig = provider.getConfig ? provider.getConfig() : null;
611
+ const baseUrl = providerConfig?.apiUrl || (params.provider === 'gitea' ? 'http://nas-ubuntu:3000' : 'https://github.com');
612
+ const repoUrl = params.provider === 'gitea'
613
+ ? `${baseUrl.replace('/api/v1', '')}/${owner}/${params.repo}.git`
614
+ : `https://github.com/${owner}/${params.repo}.git`;
615
+ // Executa git clone
616
+ const cloneResult = await (0, terminal_controller_js_1.runTerminalCmd)({
617
+ command: `git clone "${repoUrl}" "${params.projectPath}"`,
618
+ is_background: false,
619
+ explanation: 'Clonando repositório remoto'
620
+ });
621
+ if (cloneResult.exitCode !== 0) {
622
+ throw new Error(`Falha ao clonar repositório: ${cloneResult.output}`);
623
+ }
624
+ return {
625
+ success: true,
626
+ action: 'clone',
627
+ message: `Repositório '${owner}/${params.repo}' clonado com sucesso para '${params.projectPath}'`,
628
+ data: {
629
+ source: `${owner}/${params.repo}`,
630
+ destination: params.projectPath,
631
+ cloned: true,
632
+ url: repoUrl
633
+ }
634
+ };
635
+ }
636
+ catch (error) {
637
+ throw new Error(`Falha ao clonar repositório: ${error instanceof Error ? error.message : String(error)}`);
638
+ }
639
+ }
640
+ };
641
641
  //# sourceMappingURL=git-repositories.js.map