@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.
- package/dist/client.d.ts +306 -306
- package/dist/client.js +298 -298
- package/dist/config.d.ts +310 -310
- package/dist/config.js +392 -392
- package/dist/index.d.ts +22 -22
- package/dist/index.js +89 -89
- package/dist/providers/base-provider.d.ts +160 -160
- package/dist/providers/base-provider.js +274 -274
- package/dist/providers/error-handler.d.ts +50 -50
- package/dist/providers/error-handler.js +175 -175
- package/dist/providers/gitea-provider.d.ts +97 -97
- package/dist/providers/gitea-provider.d.ts.map +1 -1
- package/dist/providers/gitea-provider.js +1015 -1001
- package/dist/providers/gitea-provider.js.map +1 -1
- package/dist/providers/github-provider.d.ts +104 -104
- package/dist/providers/github-provider.d.ts.map +1 -1
- package/dist/providers/github-provider.js +1248 -1234
- package/dist/providers/github-provider.js.map +1 -1
- package/dist/providers/index.d.ts +12 -12
- package/dist/providers/index.js +40 -40
- package/dist/providers/provider-factory.d.ts +74 -74
- package/dist/providers/provider-factory.d.ts.map +1 -1
- package/dist/providers/provider-factory.js +318 -311
- package/dist/providers/provider-factory.js.map +1 -1
- package/dist/providers/types.d.ts +318 -318
- package/dist/providers/types.js +6 -6
- package/dist/server.d.ts +76 -76
- package/dist/server.js +306 -306
- package/dist/tools/git-archive.d.ts +165 -165
- package/dist/tools/git-archive.js +233 -233
- package/dist/tools/git-branches.d.ts +430 -430
- package/dist/tools/git-branches.js +627 -627
- package/dist/tools/git-commits.d.ts +485 -485
- package/dist/tools/git-commits.js +735 -735
- package/dist/tools/git-commits.js.map +1 -1
- package/dist/tools/git-config.d.ts +140 -140
- package/dist/tools/git-config.js +268 -268
- package/dist/tools/git-files.d.ts +486 -486
- package/dist/tools/git-files.js +607 -607
- package/dist/tools/git-files.js.map +1 -1
- package/dist/tools/git-issues.d.ts +574 -571
- package/dist/tools/git-issues.d.ts.map +1 -1
- package/dist/tools/git-issues.js +741 -740
- package/dist/tools/git-issues.js.map +1 -1
- package/dist/tools/git-pulls.d.ts +697 -694
- package/dist/tools/git-pulls.d.ts.map +1 -1
- package/dist/tools/git-pulls.js +733 -732
- package/dist/tools/git-pulls.js.map +1 -1
- package/dist/tools/git-releases.d.ts +490 -487
- package/dist/tools/git-releases.d.ts.map +1 -1
- package/dist/tools/git-releases.js +558 -557
- package/dist/tools/git-releases.js.map +1 -1
- package/dist/tools/git-remote.d.ts +138 -138
- package/dist/tools/git-remote.js +274 -274
- package/dist/tools/git-repositories.d.ts +483 -483
- package/dist/tools/git-repositories.js +640 -640
- package/dist/tools/git-repositories.js.map +1 -1
- package/dist/tools/git-reset.d.ts +130 -130
- package/dist/tools/git-reset.js +223 -223
- package/dist/tools/git-revert.d.ts +149 -149
- package/dist/tools/git-revert.js +198 -198
- package/dist/tools/git-stash.d.ts +140 -140
- package/dist/tools/git-stash.js +269 -269
- package/dist/tools/git-sync.d.ts +178 -178
- package/dist/tools/git-sync.js +312 -312
- package/dist/tools/git-tags.d.ts +414 -411
- package/dist/tools/git-tags.d.ts.map +1 -1
- package/dist/tools/git-tags.js +486 -485
- package/dist/tools/git-tags.js.map +1 -1
- package/dist/tools/git-webhooks.d.ts +473 -470
- package/dist/tools/git-webhooks.d.ts.map +1 -1
- package/dist/tools/git-webhooks.js +544 -543
- package/dist/tools/git-webhooks.js.map +1 -1
- package/dist/utils/terminal-controller.d.ts +80 -80
- package/dist/utils/terminal-controller.js +345 -345
- package/dist/utils/user-detection.d.ts +24 -24
- package/dist/utils/user-detection.js +53 -53
- package/package.json +2 -2
- package/dist/tools/gh-actions.d.ts +0 -253
- package/dist/tools/gh-actions.d.ts.map +0 -1
- package/dist/tools/gh-actions.js +0 -390
- package/dist/tools/gh-actions.js.map +0 -1
- package/dist/tools/gh-analytics.d.ts +0 -264
- package/dist/tools/gh-analytics.d.ts.map +0 -1
- package/dist/tools/gh-analytics.js +0 -402
- package/dist/tools/gh-analytics.js.map +0 -1
- package/dist/tools/gh-code-review.d.ts +0 -305
- package/dist/tools/gh-code-review.d.ts.map +0 -1
- package/dist/tools/gh-code-review.js +0 -513
- package/dist/tools/gh-code-review.js.map +0 -1
- package/dist/tools/gh-codespaces.d.ts +0 -139
- package/dist/tools/gh-codespaces.d.ts.map +0 -1
- package/dist/tools/gh-codespaces.js +0 -283
- package/dist/tools/gh-codespaces.js.map +0 -1
- package/dist/tools/gh-deployments.d.ts +0 -301
- package/dist/tools/gh-deployments.d.ts.map +0 -1
- package/dist/tools/gh-deployments.js +0 -368
- package/dist/tools/gh-deployments.js.map +0 -1
- package/dist/tools/gh-gists.d.ts +0 -175
- package/dist/tools/gh-gists.d.ts.map +0 -1
- package/dist/tools/gh-gists.js +0 -322
- package/dist/tools/gh-gists.js.map +0 -1
- package/dist/tools/gh-projects.d.ts +0 -206
- package/dist/tools/gh-projects.d.ts.map +0 -1
- package/dist/tools/gh-projects.js +0 -359
- package/dist/tools/gh-projects.js.map +0 -1
- package/dist/tools/gh-security.d.ts +0 -275
- package/dist/tools/gh-security.d.ts.map +0 -1
- package/dist/tools/gh-security.js +0 -396
- package/dist/tools/gh-security.js.map +0 -1
- package/dist/tools/gh-sync.d.ts +0 -214
- package/dist/tools/gh-sync.d.ts.map +0 -1
- package/dist/tools/gh-sync.js +0 -379
- package/dist/tools/gh-sync.js.map +0 -1
- package/dist/tools/gh-workflows.d.ts +0 -291
- package/dist/tools/gh-workflows.d.ts.map +0 -1
- package/dist/tools/gh-workflows.js +0 -433
- package/dist/tools/gh-workflows.js.map +0 -1
- package/dist/tools/git-bundle.d.ts +0 -172
- package/dist/tools/git-bundle.d.ts.map +0 -1
- package/dist/tools/git-bundle.js +0 -242
- package/dist/tools/git-bundle.js.map +0 -1
- package/dist/tools/git-cherry-pick.d.ts +0 -159
- package/dist/tools/git-cherry-pick.d.ts.map +0 -1
- package/dist/tools/git-cherry-pick.js +0 -225
- package/dist/tools/git-cherry-pick.js.map +0 -1
- package/dist/tools/git-rebase.d.ts +0 -138
- package/dist/tools/git-rebase.d.ts.map +0 -1
- package/dist/tools/git-rebase.js +0 -214
- package/dist/tools/git-rebase.js.map +0 -1
- package/dist/tools/git-submodule.d.ts +0 -153
- package/dist/tools/git-submodule.d.ts.map +0 -1
- package/dist/tools/git-submodule.js +0 -290
- package/dist/tools/git-submodule.js.map +0 -1
- package/dist/tools/git-worktree.d.ts +0 -160
- package/dist/tools/git-worktree.d.ts.map +0 -1
- package/dist/tools/git-worktree.js +0 -270
- package/dist/tools/git-worktree.js.map +0 -1
- package/dist/tools/repositories.d.ts +0 -406
- package/dist/tools/repositories.d.ts.map +0 -1
- package/dist/tools/repositories.js +0 -570
- package/dist/tools/repositories.js.map +0 -1
- package/dist/tools/users.d.ts +0 -373
- package/dist/tools/users.d.ts.map +0 -1
- package/dist/tools/users.js +0 -500
- package/dist/tools/users.js.map +0 -1
- package/dist/tools/validator.d.ts +0 -171
- package/dist/tools/validator.d.ts.map +0 -1
- package/dist/tools/validator.js +0 -195
- package/dist/tools/validator.js.map +0 -1
- package/dist/tools/version-control.d.ts +0 -137
- package/dist/tools/version-control.d.ts.map +0 -1
- package/dist/tools/version-control.js +0 -165
- 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')
|
|
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
|