@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,641 +1,654 @@
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
+ * Verifica se erro é relacionado a Git
642
+ */
643
+ isGitRelatedError(errorMessage) {
644
+ const gitKeywords = [
645
+ 'git', 'commit', 'push', 'pull', 'merge', 'conflict', 'branch',
646
+ 'remote', 'repository', 'authentication', 'permission', 'unauthorized',
647
+ 'divergent', 'non-fast-forward', 'fetch first', 'working tree',
648
+ 'uncommitted', 'stash', 'rebase', 'reset', 'checkout'
649
+ ];
650
+ const errorLower = errorMessage.toLowerCase();
651
+ return gitKeywords.some(keyword => errorLower.includes(keyword));
652
+ }
653
+ };
641
654
  //# sourceMappingURL=git-repositories.js.map