@andrebuzeli/git-mcp 2.27.4 → 2.28.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.
- 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 -156
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +274 -260
- package/dist/providers/base-provider.js.map +1 -1
- 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.js +1001 -1001
- package/dist/providers/github-provider.d.ts +104 -104
- package/dist/providers/github-provider.js +1234 -1234
- 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.js +311 -311
- package/dist/providers/types.d.ts +318 -298
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +6 -6
- package/dist/server.d.ts +76 -76
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +306 -305
- package/dist/server.js.map +1 -1
- package/dist/tools/gh-actions.d.ts +252 -252
- package/dist/tools/gh-actions.js +389 -389
- package/dist/tools/gh-analytics.d.ts +263 -263
- package/dist/tools/gh-analytics.js +401 -401
- package/dist/tools/gh-code-review.d.ts +304 -304
- package/dist/tools/gh-code-review.js +512 -512
- package/dist/tools/gh-codespaces.d.ts +138 -138
- package/dist/tools/gh-codespaces.js +282 -282
- package/dist/tools/gh-deployments.d.ts +300 -300
- package/dist/tools/gh-deployments.js +367 -367
- package/dist/tools/gh-gists.d.ts +174 -174
- package/dist/tools/gh-gists.js +321 -321
- package/dist/tools/gh-projects.d.ts +205 -205
- package/dist/tools/gh-projects.js +358 -358
- package/dist/tools/gh-security.d.ts +274 -274
- package/dist/tools/gh-security.js +395 -395
- package/dist/tools/gh-sync.d.ts +213 -213
- package/dist/tools/gh-sync.js +378 -378
- package/dist/tools/gh-workflows.d.ts +290 -290
- package/dist/tools/gh-workflows.js +432 -432
- 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.d.ts.map +1 -1
- package/dist/tools/git-branches.js +627 -530
- package/dist/tools/git-branches.js.map +1 -1
- package/dist/tools/git-bundle.d.ts +171 -171
- package/dist/tools/git-bundle.js +241 -241
- package/dist/tools/git-cherry-pick.d.ts +158 -158
- package/dist/tools/git-cherry-pick.js +224 -224
- package/dist/tools/git-commits.d.ts +485 -485
- package/dist/tools/git-commits.d.ts.map +1 -1
- package/dist/tools/git-commits.js +735 -625
- 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-issues.d.ts +571 -571
- package/dist/tools/git-issues.d.ts.map +1 -1
- package/dist/tools/git-issues.js +740 -693
- package/dist/tools/git-issues.js.map +1 -1
- package/dist/tools/git-pulls.d.ts +694 -694
- package/dist/tools/git-pulls.js +732 -732
- package/dist/tools/git-rebase.d.ts +137 -137
- package/dist/tools/git-rebase.js +213 -213
- package/dist/tools/git-releases.d.ts +487 -487
- package/dist/tools/git-releases.js +557 -557
- 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-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-submodule.d.ts +152 -152
- package/dist/tools/git-submodule.js +289 -289
- package/dist/tools/git-sync.d.ts +178 -166
- package/dist/tools/git-sync.d.ts.map +1 -1
- package/dist/tools/git-sync.js +312 -117
- package/dist/tools/git-sync.js.map +1 -1
- package/dist/tools/git-tags.d.ts +411 -411
- package/dist/tools/git-tags.js +485 -485
- package/dist/tools/git-webhooks.d.ts +470 -482
- package/dist/tools/git-webhooks.d.ts.map +1 -1
- package/dist/tools/git-webhooks.js +543 -555
- package/dist/tools/git-webhooks.js.map +1 -1
- package/dist/tools/git-worktree.d.ts +159 -159
- package/dist/tools/git-worktree.js +269 -269
- package/dist/tools/repositories.d.ts +405 -405
- package/dist/tools/repositories.js +569 -569
- package/dist/tools/users.d.ts +372 -372
- package/dist/tools/users.js +499 -499
- package/dist/tools/validator.d.ts +170 -170
- package/dist/tools/validator.js +194 -194
- package/dist/tools/version-control.d.ts +136 -136
- package/dist/tools/version-control.js +164 -164
- 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 +59 -59
package/dist/tools/validator.js
CHANGED
|
@@ -1,195 +1,195 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ToolSchemas = exports.ToolValidator = exports.RepositorySchemas = exports.CommonSchemas = void 0;
|
|
4
|
-
const zod_1 = require("zod");
|
|
5
|
-
/**
|
|
6
|
-
* Validador comum para todas as tools
|
|
7
|
-
* Fornece schemas e métodos de validação padronizados
|
|
8
|
-
*/
|
|
9
|
-
// Schemas comuns reutilizáveis
|
|
10
|
-
exports.CommonSchemas = {
|
|
11
|
-
// Identificadores
|
|
12
|
-
username: zod_1.z.string().min(1, 'Username is required').max(100, 'Username too long').optional(),
|
|
13
|
-
repo: zod_1.z.string().min(1, 'Repository name is required').max(100, 'Repository name too long'),
|
|
14
|
-
provider: zod_1.z.enum(['gitea', 'github', 'both']),
|
|
15
|
-
// Paginação
|
|
16
|
-
page: zod_1.z.number().min(1, 'Page must be at least 1').max(1000, 'Page too high').optional(),
|
|
17
|
-
limit: zod_1.z.number().min(1, 'Limit must be at least 1').max(100, 'Limit cannot exceed 100').optional(),
|
|
18
|
-
// Strings opcionais com limites
|
|
19
|
-
shortString: zod_1.z.string().max(255, 'String too long').optional(),
|
|
20
|
-
mediumString: zod_1.z.string().max(1000, 'String too long').optional(),
|
|
21
|
-
longString: zod_1.z.string().max(10000, 'String too long').optional(),
|
|
22
|
-
// Identificadores específicos
|
|
23
|
-
branch: zod_1.z.string().min(1, 'Branch name is required').max(255, 'Branch name too long').optional(),
|
|
24
|
-
tag: zod_1.z.string().min(1, 'Tag name is required').max(255, 'Tag name too long').optional(),
|
|
25
|
-
sha: zod_1.z.string().regex(/^[a-f0-9]{7,40}$/i, 'Invalid SHA format').optional(),
|
|
26
|
-
// Paths e URLs
|
|
27
|
-
filePath: zod_1.z.string().min(1, 'File path is required').max(1000, 'File path too long').optional(),
|
|
28
|
-
url: zod_1.z.string().url('Invalid URL format').optional(),
|
|
29
|
-
// Estados
|
|
30
|
-
issueState: zod_1.z.enum(['open', 'closed', 'all']).optional(),
|
|
31
|
-
prState: zod_1.z.enum(['open', 'closed', 'merged', 'all']).optional(),
|
|
32
|
-
// Arrays
|
|
33
|
-
stringArray: zod_1.z.array(zod_1.z.string().max(255)).max(50, 'Too many items').optional(),
|
|
34
|
-
// Booleanos
|
|
35
|
-
boolean: zod_1.z.boolean().optional(),
|
|
36
|
-
// Números
|
|
37
|
-
positiveNumber: zod_1.z.number().positive('Must be positive').optional(),
|
|
38
|
-
issueNumber: zod_1.z.number().min(1, 'Issue number must be positive').max(999999, 'Issue number too high').optional(),
|
|
39
|
-
// Enums específicos
|
|
40
|
-
mergeMethod: zod_1.z.enum(['merge', 'rebase', 'squash']).optional(),
|
|
41
|
-
syncDirection: zod_1.z.enum(['one-way', 'two-way']).optional(),
|
|
42
|
-
syncStrategy: zod_1.z.enum(['source-wins', 'timestamp', 'skip-conflicts']).optional()
|
|
43
|
-
};
|
|
44
|
-
// Schemas para repositórios
|
|
45
|
-
exports.RepositorySchemas = {
|
|
46
|
-
source: zod_1.z.object({
|
|
47
|
-
provider: zod_1.z.enum(['gitea', 'github']),
|
|
48
|
-
repo: exports.CommonSchemas.repo
|
|
49
|
-
}).optional(),
|
|
50
|
-
target: zod_1.z.object({
|
|
51
|
-
provider: zod_1.z.enum(['gitea', 'github']),
|
|
52
|
-
repo: exports.CommonSchemas.repo
|
|
53
|
-
}).optional()
|
|
54
|
-
};
|
|
55
|
-
// Validações customizadas
|
|
56
|
-
class ToolValidator {
|
|
57
|
-
/**
|
|
58
|
-
* Valida se pelo menos um dos campos obrigatórios está presente
|
|
59
|
-
*/
|
|
60
|
-
static requireOneOf(data, fields, errorMessage) {
|
|
61
|
-
const hasRequired = fields.some(field => data[field] !== undefined && data[field] !== null && data[field] !== '');
|
|
62
|
-
if (!hasRequired) {
|
|
63
|
-
throw new Error(errorMessage || `At least one of the following fields is required: ${fields.join(', ')}`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Valida se todos os campos de um grupo estão presentes ou ausentes
|
|
68
|
-
*/
|
|
69
|
-
static requireAllOrNone(data, fields, errorMessage) {
|
|
70
|
-
const presentFields = fields.filter(field => data[field] !== undefined && data[field] !== null && data[field] !== '');
|
|
71
|
-
if (presentFields.length > 0 && presentFields.length < fields.length) {
|
|
72
|
-
throw new Error(errorMessage || `All or none of these fields must be provided: ${fields.join(', ')}`);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Valida formato de versão semântica
|
|
77
|
-
*/
|
|
78
|
-
static validateSemVer(version) {
|
|
79
|
-
const semVerRegex = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
|
80
|
-
return semVerRegex.test(version);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Valida nome de branch Git
|
|
84
|
-
*/
|
|
85
|
-
static validateBranchName(branch) {
|
|
86
|
-
// Regras básicas do Git para nomes de branch
|
|
87
|
-
const invalidPatterns = [
|
|
88
|
-
/^\./, // Não pode começar com ponto
|
|
89
|
-
/\.\./, // Não pode conter dois pontos consecutivos
|
|
90
|
-
/[\x00-\x1f\x7f]/, // Não pode conter caracteres de controle
|
|
91
|
-
/[\s~^:?*\[]/, // Não pode conter espaços ou caracteres especiais
|
|
92
|
-
/\/$/, // Não pode terminar com /
|
|
93
|
-
/\.lock$/, // Não pode terminar com .lock
|
|
94
|
-
/@\{/ // Não pode conter @{
|
|
95
|
-
];
|
|
96
|
-
return !invalidPatterns.some(pattern => pattern.test(branch)) && branch.length > 0 && branch.length <= 255;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Valida nome de arquivo/path
|
|
100
|
-
*/
|
|
101
|
-
static validateFilePath(path) {
|
|
102
|
-
// Não pode conter caracteres inválidos para sistemas de arquivo
|
|
103
|
-
const invalidChars = /[<>:"|?*\x00-\x1f]/;
|
|
104
|
-
return !invalidChars.test(path) && path.length > 0 && path.length <= 1000;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Sanitiza entrada de texto removendo caracteres perigosos
|
|
108
|
-
*/
|
|
109
|
-
static sanitizeText(text) {
|
|
110
|
-
return text
|
|
111
|
-
.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') // Remove caracteres de controle
|
|
112
|
-
.replace(/[<>"'&]/g, '') // Remove caracteres HTML perigosos
|
|
113
|
-
.trim();
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Valida e sanitiza parâmetros de entrada de uma tool
|
|
117
|
-
*/
|
|
118
|
-
static validateAndSanitize(data, schema) {
|
|
119
|
-
try {
|
|
120
|
-
// Primeiro valida com Zod
|
|
121
|
-
const validated = schema.parse(data);
|
|
122
|
-
// Depois sanitiza strings se necessário
|
|
123
|
-
const sanitized = this.sanitizeObject(validated);
|
|
124
|
-
return sanitized;
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
if (error instanceof zod_1.z.ZodError) {
|
|
128
|
-
const issues = error.issues.map(issue => `${issue.path.join('.')}: ${issue.message}`).join(', ');
|
|
129
|
-
throw new Error(`Validation failed: ${issues}`);
|
|
130
|
-
}
|
|
131
|
-
throw error;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Sanitiza recursivamente um objeto
|
|
136
|
-
*/
|
|
137
|
-
static sanitizeObject(obj) {
|
|
138
|
-
if (typeof obj === 'string') {
|
|
139
|
-
return this.sanitizeText(obj);
|
|
140
|
-
}
|
|
141
|
-
if (Array.isArray(obj)) {
|
|
142
|
-
return obj.map(item => this.sanitizeObject(item));
|
|
143
|
-
}
|
|
144
|
-
if (obj && typeof obj === 'object') {
|
|
145
|
-
const sanitized = {};
|
|
146
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
147
|
-
sanitized[key] = this.sanitizeObject(value);
|
|
148
|
-
}
|
|
149
|
-
return sanitized;
|
|
150
|
-
}
|
|
151
|
-
return obj;
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Cria um schema base para tools com parâmetros comuns
|
|
155
|
-
*/
|
|
156
|
-
static createBaseToolSchema(additionalFields = {}) {
|
|
157
|
-
return zod_1.z.object({
|
|
158
|
-
repo: exports.CommonSchemas.repo,
|
|
159
|
-
provider: exports.CommonSchemas.provider,
|
|
160
|
-
page: exports.CommonSchemas.page,
|
|
161
|
-
limit: exports.CommonSchemas.limit,
|
|
162
|
-
...additionalFields
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
exports.ToolValidator = ToolValidator;
|
|
167
|
-
// Schemas pré-definidos para tools comuns
|
|
168
|
-
exports.ToolSchemas = {
|
|
169
|
-
// Schema básico para operações de repositório
|
|
170
|
-
repositoryOperation: ToolValidator.createBaseToolSchema(),
|
|
171
|
-
// Schema para operações com arquivos
|
|
172
|
-
fileOperation: ToolValidator.createBaseToolSchema({
|
|
173
|
-
path: exports.CommonSchemas.filePath,
|
|
174
|
-
content: exports.CommonSchemas.longString,
|
|
175
|
-
message: exports.CommonSchemas.mediumString,
|
|
176
|
-
branch: exports.CommonSchemas.branch,
|
|
177
|
-
sha: exports.CommonSchemas.sha
|
|
178
|
-
}),
|
|
179
|
-
// Schema para operações com issues
|
|
180
|
-
issueOperation: ToolValidator.createBaseToolSchema({
|
|
181
|
-
title: exports.CommonSchemas.mediumString,
|
|
182
|
-
body: exports.CommonSchemas.longString,
|
|
183
|
-
state: exports.CommonSchemas.issueState,
|
|
184
|
-
labels: exports.CommonSchemas.stringArray,
|
|
185
|
-
assignees: exports.CommonSchemas.stringArray,
|
|
186
|
-
issue_number: exports.CommonSchemas.issueNumber
|
|
187
|
-
}),
|
|
188
|
-
// Schema para operações com branches
|
|
189
|
-
branchOperation: ToolValidator.createBaseToolSchema({
|
|
190
|
-
branch: exports.CommonSchemas.branch,
|
|
191
|
-
from_branch: exports.CommonSchemas.branch,
|
|
192
|
-
branch_name: exports.CommonSchemas.branch
|
|
193
|
-
})
|
|
194
|
-
};
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ToolSchemas = exports.ToolValidator = exports.RepositorySchemas = exports.CommonSchemas = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
/**
|
|
6
|
+
* Validador comum para todas as tools
|
|
7
|
+
* Fornece schemas e métodos de validação padronizados
|
|
8
|
+
*/
|
|
9
|
+
// Schemas comuns reutilizáveis
|
|
10
|
+
exports.CommonSchemas = {
|
|
11
|
+
// Identificadores
|
|
12
|
+
username: zod_1.z.string().min(1, 'Username is required').max(100, 'Username too long').optional(),
|
|
13
|
+
repo: zod_1.z.string().min(1, 'Repository name is required').max(100, 'Repository name too long'),
|
|
14
|
+
provider: zod_1.z.enum(['gitea', 'github', 'both']),
|
|
15
|
+
// Paginação
|
|
16
|
+
page: zod_1.z.number().min(1, 'Page must be at least 1').max(1000, 'Page too high').optional(),
|
|
17
|
+
limit: zod_1.z.number().min(1, 'Limit must be at least 1').max(100, 'Limit cannot exceed 100').optional(),
|
|
18
|
+
// Strings opcionais com limites
|
|
19
|
+
shortString: zod_1.z.string().max(255, 'String too long').optional(),
|
|
20
|
+
mediumString: zod_1.z.string().max(1000, 'String too long').optional(),
|
|
21
|
+
longString: zod_1.z.string().max(10000, 'String too long').optional(),
|
|
22
|
+
// Identificadores específicos
|
|
23
|
+
branch: zod_1.z.string().min(1, 'Branch name is required').max(255, 'Branch name too long').optional(),
|
|
24
|
+
tag: zod_1.z.string().min(1, 'Tag name is required').max(255, 'Tag name too long').optional(),
|
|
25
|
+
sha: zod_1.z.string().regex(/^[a-f0-9]{7,40}$/i, 'Invalid SHA format').optional(),
|
|
26
|
+
// Paths e URLs
|
|
27
|
+
filePath: zod_1.z.string().min(1, 'File path is required').max(1000, 'File path too long').optional(),
|
|
28
|
+
url: zod_1.z.string().url('Invalid URL format').optional(),
|
|
29
|
+
// Estados
|
|
30
|
+
issueState: zod_1.z.enum(['open', 'closed', 'all']).optional(),
|
|
31
|
+
prState: zod_1.z.enum(['open', 'closed', 'merged', 'all']).optional(),
|
|
32
|
+
// Arrays
|
|
33
|
+
stringArray: zod_1.z.array(zod_1.z.string().max(255)).max(50, 'Too many items').optional(),
|
|
34
|
+
// Booleanos
|
|
35
|
+
boolean: zod_1.z.boolean().optional(),
|
|
36
|
+
// Números
|
|
37
|
+
positiveNumber: zod_1.z.number().positive('Must be positive').optional(),
|
|
38
|
+
issueNumber: zod_1.z.number().min(1, 'Issue number must be positive').max(999999, 'Issue number too high').optional(),
|
|
39
|
+
// Enums específicos
|
|
40
|
+
mergeMethod: zod_1.z.enum(['merge', 'rebase', 'squash']).optional(),
|
|
41
|
+
syncDirection: zod_1.z.enum(['one-way', 'two-way']).optional(),
|
|
42
|
+
syncStrategy: zod_1.z.enum(['source-wins', 'timestamp', 'skip-conflicts']).optional()
|
|
43
|
+
};
|
|
44
|
+
// Schemas para repositórios
|
|
45
|
+
exports.RepositorySchemas = {
|
|
46
|
+
source: zod_1.z.object({
|
|
47
|
+
provider: zod_1.z.enum(['gitea', 'github']),
|
|
48
|
+
repo: exports.CommonSchemas.repo
|
|
49
|
+
}).optional(),
|
|
50
|
+
target: zod_1.z.object({
|
|
51
|
+
provider: zod_1.z.enum(['gitea', 'github']),
|
|
52
|
+
repo: exports.CommonSchemas.repo
|
|
53
|
+
}).optional()
|
|
54
|
+
};
|
|
55
|
+
// Validações customizadas
|
|
56
|
+
class ToolValidator {
|
|
57
|
+
/**
|
|
58
|
+
* Valida se pelo menos um dos campos obrigatórios está presente
|
|
59
|
+
*/
|
|
60
|
+
static requireOneOf(data, fields, errorMessage) {
|
|
61
|
+
const hasRequired = fields.some(field => data[field] !== undefined && data[field] !== null && data[field] !== '');
|
|
62
|
+
if (!hasRequired) {
|
|
63
|
+
throw new Error(errorMessage || `At least one of the following fields is required: ${fields.join(', ')}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Valida se todos os campos de um grupo estão presentes ou ausentes
|
|
68
|
+
*/
|
|
69
|
+
static requireAllOrNone(data, fields, errorMessage) {
|
|
70
|
+
const presentFields = fields.filter(field => data[field] !== undefined && data[field] !== null && data[field] !== '');
|
|
71
|
+
if (presentFields.length > 0 && presentFields.length < fields.length) {
|
|
72
|
+
throw new Error(errorMessage || `All or none of these fields must be provided: ${fields.join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Valida formato de versão semântica
|
|
77
|
+
*/
|
|
78
|
+
static validateSemVer(version) {
|
|
79
|
+
const semVerRegex = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
|
80
|
+
return semVerRegex.test(version);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Valida nome de branch Git
|
|
84
|
+
*/
|
|
85
|
+
static validateBranchName(branch) {
|
|
86
|
+
// Regras básicas do Git para nomes de branch
|
|
87
|
+
const invalidPatterns = [
|
|
88
|
+
/^\./, // Não pode começar com ponto
|
|
89
|
+
/\.\./, // Não pode conter dois pontos consecutivos
|
|
90
|
+
/[\x00-\x1f\x7f]/, // Não pode conter caracteres de controle
|
|
91
|
+
/[\s~^:?*\[]/, // Não pode conter espaços ou caracteres especiais
|
|
92
|
+
/\/$/, // Não pode terminar com /
|
|
93
|
+
/\.lock$/, // Não pode terminar com .lock
|
|
94
|
+
/@\{/ // Não pode conter @{
|
|
95
|
+
];
|
|
96
|
+
return !invalidPatterns.some(pattern => pattern.test(branch)) && branch.length > 0 && branch.length <= 255;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Valida nome de arquivo/path
|
|
100
|
+
*/
|
|
101
|
+
static validateFilePath(path) {
|
|
102
|
+
// Não pode conter caracteres inválidos para sistemas de arquivo
|
|
103
|
+
const invalidChars = /[<>:"|?*\x00-\x1f]/;
|
|
104
|
+
return !invalidChars.test(path) && path.length > 0 && path.length <= 1000;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Sanitiza entrada de texto removendo caracteres perigosos
|
|
108
|
+
*/
|
|
109
|
+
static sanitizeText(text) {
|
|
110
|
+
return text
|
|
111
|
+
.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') // Remove caracteres de controle
|
|
112
|
+
.replace(/[<>"'&]/g, '') // Remove caracteres HTML perigosos
|
|
113
|
+
.trim();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Valida e sanitiza parâmetros de entrada de uma tool
|
|
117
|
+
*/
|
|
118
|
+
static validateAndSanitize(data, schema) {
|
|
119
|
+
try {
|
|
120
|
+
// Primeiro valida com Zod
|
|
121
|
+
const validated = schema.parse(data);
|
|
122
|
+
// Depois sanitiza strings se necessário
|
|
123
|
+
const sanitized = this.sanitizeObject(validated);
|
|
124
|
+
return sanitized;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
128
|
+
const issues = error.issues.map(issue => `${issue.path.join('.')}: ${issue.message}`).join(', ');
|
|
129
|
+
throw new Error(`Validation failed: ${issues}`);
|
|
130
|
+
}
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Sanitiza recursivamente um objeto
|
|
136
|
+
*/
|
|
137
|
+
static sanitizeObject(obj) {
|
|
138
|
+
if (typeof obj === 'string') {
|
|
139
|
+
return this.sanitizeText(obj);
|
|
140
|
+
}
|
|
141
|
+
if (Array.isArray(obj)) {
|
|
142
|
+
return obj.map(item => this.sanitizeObject(item));
|
|
143
|
+
}
|
|
144
|
+
if (obj && typeof obj === 'object') {
|
|
145
|
+
const sanitized = {};
|
|
146
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
147
|
+
sanitized[key] = this.sanitizeObject(value);
|
|
148
|
+
}
|
|
149
|
+
return sanitized;
|
|
150
|
+
}
|
|
151
|
+
return obj;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Cria um schema base para tools com parâmetros comuns
|
|
155
|
+
*/
|
|
156
|
+
static createBaseToolSchema(additionalFields = {}) {
|
|
157
|
+
return zod_1.z.object({
|
|
158
|
+
repo: exports.CommonSchemas.repo,
|
|
159
|
+
provider: exports.CommonSchemas.provider,
|
|
160
|
+
page: exports.CommonSchemas.page,
|
|
161
|
+
limit: exports.CommonSchemas.limit,
|
|
162
|
+
...additionalFields
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.ToolValidator = ToolValidator;
|
|
167
|
+
// Schemas pré-definidos para tools comuns
|
|
168
|
+
exports.ToolSchemas = {
|
|
169
|
+
// Schema básico para operações de repositório
|
|
170
|
+
repositoryOperation: ToolValidator.createBaseToolSchema(),
|
|
171
|
+
// Schema para operações com arquivos
|
|
172
|
+
fileOperation: ToolValidator.createBaseToolSchema({
|
|
173
|
+
path: exports.CommonSchemas.filePath,
|
|
174
|
+
content: exports.CommonSchemas.longString,
|
|
175
|
+
message: exports.CommonSchemas.mediumString,
|
|
176
|
+
branch: exports.CommonSchemas.branch,
|
|
177
|
+
sha: exports.CommonSchemas.sha
|
|
178
|
+
}),
|
|
179
|
+
// Schema para operações com issues
|
|
180
|
+
issueOperation: ToolValidator.createBaseToolSchema({
|
|
181
|
+
title: exports.CommonSchemas.mediumString,
|
|
182
|
+
body: exports.CommonSchemas.longString,
|
|
183
|
+
state: exports.CommonSchemas.issueState,
|
|
184
|
+
labels: exports.CommonSchemas.stringArray,
|
|
185
|
+
assignees: exports.CommonSchemas.stringArray,
|
|
186
|
+
issue_number: exports.CommonSchemas.issueNumber
|
|
187
|
+
}),
|
|
188
|
+
// Schema para operações com branches
|
|
189
|
+
branchOperation: ToolValidator.createBaseToolSchema({
|
|
190
|
+
branch: exports.CommonSchemas.branch,
|
|
191
|
+
from_branch: exports.CommonSchemas.branch,
|
|
192
|
+
branch_name: exports.CommonSchemas.branch
|
|
193
|
+
})
|
|
194
|
+
};
|
|
195
195
|
//# sourceMappingURL=validator.js.map
|