@andrebuzeli/git-mcp 5.5.2 → 5.8.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/README.md +69 -6
- package/dist/index.js +65 -9
- package/dist/resources/toolsGuide.d.ts +12 -0
- package/dist/resources/toolsGuide.js +1491 -0
- package/dist/server.d.ts +2 -1
- package/dist/server.js +33 -0
- package/dist/tools/gitBranches.d.ts +2 -2
- package/dist/tools/gitBranches.js +2 -1
- package/dist/tools/gitFiles.d.ts +6 -0
- package/dist/tools/gitFiles.js +10 -8
- package/dist/tools/gitHistory.d.ts +17 -0
- package/dist/tools/gitHistory.js +365 -0
- package/dist/tools/gitIssues.d.ts +1 -16
- package/dist/tools/gitIssues.js +208 -122
- package/dist/tools/gitPulls.d.ts +1 -69
- package/dist/tools/gitPulls.js +225 -127
- package/dist/tools/gitRelease.d.ts +1 -29
- package/dist/tools/gitRelease.js +277 -55
- package/dist/tools/gitUpdate.d.ts +14 -0
- package/dist/tools/gitUpdate.js +374 -0
- package/dist/tools/gitUpload.d.ts +11 -0
- package/dist/tools/gitUpload.js +342 -0
- package/dist/tools/gitWorkflow.d.ts +1 -64
- package/dist/tools/gitWorkflow.js +224 -50
- package/dist/types.d.ts +7 -0
- package/package.json +2 -2
package/dist/tools/gitPulls.js
CHANGED
|
@@ -9,146 +9,222 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
9
9
|
class GitPullsTool {
|
|
10
10
|
constructor() {
|
|
11
11
|
this.name = 'git-pulls';
|
|
12
|
-
this.description = 'Pull request management for GitHub and Gitea';
|
|
12
|
+
this.description = 'Pull request management for GitHub and Gitea - automatic dual-provider execution';
|
|
13
13
|
}
|
|
14
14
|
async handle(params, ctx) {
|
|
15
15
|
const action = params.action;
|
|
16
|
-
const provider = params.provider;
|
|
17
16
|
if (!action)
|
|
18
17
|
throw new errors_1.MCPError('VALIDATION_ERROR', 'action is required');
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const owner = params.owner || process.env.GITHUB_USERNAME || process.env.GITEA_USERNAME;
|
|
18
|
+
const githubOwner = params.owner || process.env.GITHUB_USERNAME;
|
|
19
|
+
const giteaOwner = params.owner || process.env.GITEA_USERNAME;
|
|
22
20
|
const repo = params.repo;
|
|
23
21
|
switch (action) {
|
|
24
22
|
case 'create': {
|
|
25
23
|
if (!params.title || !params.head || !params.base) {
|
|
26
24
|
throw new errors_1.MCPError('VALIDATION_ERROR', 'title, head, and base are required');
|
|
27
25
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
26
|
+
const results = { success: true, providers: {} };
|
|
27
|
+
// GitHub
|
|
28
|
+
if (ctx.providerManager.github) {
|
|
29
|
+
try {
|
|
30
|
+
const result = await ctx.providerManager.github.rest.pulls.create({
|
|
31
|
+
owner: githubOwner,
|
|
32
|
+
repo: repo,
|
|
33
|
+
title: params.title,
|
|
34
|
+
head: params.head,
|
|
35
|
+
base: params.base,
|
|
36
|
+
body: params.body,
|
|
37
|
+
});
|
|
38
|
+
results.providers.github = { success: true, pull: result.data };
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
results.providers.github = { success: false, error: err.message };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Gitea
|
|
45
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
46
|
+
try {
|
|
47
|
+
const result = await axios_1.default.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls`, {
|
|
48
|
+
title: params.title,
|
|
49
|
+
head: params.head,
|
|
50
|
+
base: params.base,
|
|
51
|
+
body: params.body,
|
|
52
|
+
}, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
53
|
+
results.providers.gitea = { success: true, pull: result.data };
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return results;
|
|
49
60
|
}
|
|
50
61
|
case 'list': {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
62
|
+
const results = { success: true, providers: {} };
|
|
63
|
+
// GitHub
|
|
64
|
+
if (ctx.providerManager.github) {
|
|
65
|
+
try {
|
|
66
|
+
const result = await ctx.providerManager.github.rest.pulls.list({
|
|
67
|
+
owner: githubOwner,
|
|
68
|
+
repo: repo,
|
|
69
|
+
state: params.state_filter || 'open',
|
|
70
|
+
sort: params.sort || 'created',
|
|
71
|
+
direction: params.direction || 'desc',
|
|
72
|
+
});
|
|
73
|
+
results.providers.github = { success: true, pulls: result.data };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
results.providers.github = { success: false, error: err.message };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Gitea
|
|
80
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
81
|
+
try {
|
|
82
|
+
const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls`, {
|
|
83
|
+
params: { state: params.state_filter || 'open' },
|
|
84
|
+
headers: { Authorization: `token ${ctx.providerManager.giteaToken}` }
|
|
85
|
+
});
|
|
86
|
+
results.providers.gitea = { success: true, pulls: result.data };
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return results;
|
|
69
93
|
}
|
|
70
94
|
case 'get': {
|
|
71
95
|
const pull_number = params.pull_number;
|
|
72
96
|
if (!pull_number)
|
|
73
97
|
throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number is required');
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
98
|
+
const results = { success: true, providers: {} };
|
|
99
|
+
// GitHub
|
|
100
|
+
if (ctx.providerManager.github) {
|
|
101
|
+
try {
|
|
102
|
+
const result = await ctx.providerManager.github.rest.pulls.get({
|
|
103
|
+
owner: githubOwner,
|
|
104
|
+
repo: repo,
|
|
105
|
+
pull_number,
|
|
106
|
+
});
|
|
107
|
+
results.providers.github = { success: true, pull: result.data };
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
results.providers.github = { success: false, error: err.message };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Gitea
|
|
114
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
115
|
+
try {
|
|
116
|
+
const result = await axios_1.default.get(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls/${pull_number}`, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
117
|
+
results.providers.gitea = { success: true, pull: result.data };
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return results;
|
|
87
124
|
}
|
|
88
125
|
case 'update': {
|
|
89
126
|
const pull_number = params.pull_number;
|
|
90
127
|
if (!pull_number)
|
|
91
128
|
throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number is required');
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
129
|
+
const results = { success: true, providers: {} };
|
|
130
|
+
// GitHub
|
|
131
|
+
if (ctx.providerManager.github) {
|
|
132
|
+
try {
|
|
133
|
+
const result = await ctx.providerManager.github.rest.pulls.update({
|
|
134
|
+
owner: githubOwner,
|
|
135
|
+
repo: repo,
|
|
136
|
+
pull_number,
|
|
137
|
+
title: params.title,
|
|
138
|
+
body: params.body,
|
|
139
|
+
state: params.state,
|
|
140
|
+
});
|
|
141
|
+
results.providers.github = { success: true, pull: result.data };
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
results.providers.github = { success: false, error: err.message };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Gitea
|
|
148
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
149
|
+
try {
|
|
150
|
+
const result = await axios_1.default.patch(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls/${pull_number}`, { title: params.title, body: params.body }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
151
|
+
results.providers.gitea = { success: true, pull: result.data };
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return results;
|
|
108
158
|
}
|
|
109
159
|
case 'merge': {
|
|
110
160
|
const pull_number = params.pull_number;
|
|
111
161
|
if (!pull_number)
|
|
112
162
|
throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number is required');
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
163
|
+
const results = { success: true, providers: {} };
|
|
164
|
+
// GitHub
|
|
165
|
+
if (ctx.providerManager.github) {
|
|
166
|
+
try {
|
|
167
|
+
const result = await ctx.providerManager.github.rest.pulls.merge({
|
|
168
|
+
owner: githubOwner,
|
|
169
|
+
repo: repo,
|
|
170
|
+
pull_number,
|
|
171
|
+
commit_title: params.commit_title,
|
|
172
|
+
commit_message: params.commit_message,
|
|
173
|
+
merge_method: params.merge_method || 'merge',
|
|
174
|
+
});
|
|
175
|
+
results.providers.github = { success: true, merged: result.data };
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
results.providers.github = { success: false, error: err.message };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Gitea
|
|
182
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
183
|
+
try {
|
|
184
|
+
const result = await axios_1.default.post(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls/${pull_number}/merge`, {
|
|
185
|
+
Do: params.merge_method || 'merge',
|
|
186
|
+
MergeTitleField: params.commit_title,
|
|
187
|
+
MergeMessageField: params.commit_message,
|
|
188
|
+
}, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
189
|
+
results.providers.gitea = { success: true, merged: result.data };
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return results;
|
|
133
196
|
}
|
|
134
197
|
case 'close': {
|
|
135
198
|
const pull_number = params.pull_number;
|
|
136
199
|
if (!pull_number)
|
|
137
200
|
throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number is required');
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
201
|
+
const results = { success: true, providers: {} };
|
|
202
|
+
// GitHub
|
|
203
|
+
if (ctx.providerManager.github) {
|
|
204
|
+
try {
|
|
205
|
+
const result = await ctx.providerManager.github.rest.pulls.update({
|
|
206
|
+
owner: githubOwner,
|
|
207
|
+
repo: repo,
|
|
208
|
+
pull_number,
|
|
209
|
+
state: 'closed',
|
|
210
|
+
});
|
|
211
|
+
results.providers.github = { success: true, pull: result.data };
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
results.providers.github = { success: false, error: err.message };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Gitea
|
|
218
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
219
|
+
try {
|
|
220
|
+
const result = await axios_1.default.patch(`${ctx.providerManager.giteaBaseUrl}/api/v1/repos/${giteaOwner}/${repo}/pulls/${pull_number}`, { state: 'closed' }, { headers: { Authorization: `token ${ctx.providerManager.giteaToken}` } });
|
|
221
|
+
results.providers.gitea = { success: true, pull: result.data };
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
results.providers.gitea = { success: false, error: err.message };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return results;
|
|
152
228
|
}
|
|
153
229
|
case 'review': {
|
|
154
230
|
const pull_number = params.pull_number;
|
|
@@ -156,31 +232,53 @@ class GitPullsTool {
|
|
|
156
232
|
if (!pull_number || !event) {
|
|
157
233
|
throw new errors_1.MCPError('VALIDATION_ERROR', 'pull_number and event are required');
|
|
158
234
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
235
|
+
const results = { success: true, providers: {} };
|
|
236
|
+
// GitHub
|
|
237
|
+
if (ctx.providerManager.github) {
|
|
238
|
+
try {
|
|
239
|
+
const result = await ctx.providerManager.github.rest.pulls.createReview({
|
|
240
|
+
owner: githubOwner,
|
|
241
|
+
repo: repo,
|
|
242
|
+
pull_number,
|
|
243
|
+
event,
|
|
244
|
+
body: params.review_body,
|
|
245
|
+
});
|
|
246
|
+
results.providers.github = { success: true, review: result.data };
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
results.providers.github = { success: false, error: err.message };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Gitea
|
|
253
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
254
|
+
results.providers.gitea = { success: false, error: 'Review not fully implemented for Gitea' };
|
|
255
|
+
}
|
|
256
|
+
return results;
|
|
170
257
|
}
|
|
171
258
|
case 'search': {
|
|
172
259
|
const query = params.query;
|
|
173
260
|
if (!query)
|
|
174
261
|
throw new errors_1.MCPError('VALIDATION_ERROR', 'query is required');
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
262
|
+
const results = { success: true, providers: {} };
|
|
263
|
+
// GitHub
|
|
264
|
+
if (ctx.providerManager.github) {
|
|
265
|
+
try {
|
|
266
|
+
const result = await ctx.providerManager.github.rest.search.issuesAndPullRequests({
|
|
267
|
+
q: `${query} repo:${giteaOwner}/${repo} type:pr`,
|
|
268
|
+
sort: params.search_sort || 'created',
|
|
269
|
+
order: params.search_order || 'desc',
|
|
270
|
+
});
|
|
271
|
+
results.providers.github = { success: true, pulls: result.data.items };
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
results.providers.github = { success: false, error: err.message };
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Gitea
|
|
278
|
+
if (ctx.providerManager.giteaBaseUrl) {
|
|
279
|
+
results.providers.gitea = { success: false, error: 'Search not fully implemented for Gitea' };
|
|
280
|
+
}
|
|
281
|
+
return results;
|
|
184
282
|
}
|
|
185
283
|
default:
|
|
186
284
|
throw new errors_1.MCPError('VALIDATION_ERROR', `Unsupported action: ${action}`);
|
|
@@ -2,33 +2,5 @@ import { Tool, MCPContext } from '../types';
|
|
|
2
2
|
export declare class GitReleaseTool implements Tool {
|
|
3
3
|
name: string;
|
|
4
4
|
description: string;
|
|
5
|
-
handle(params: Record<string, any>, ctx: MCPContext): Promise<
|
|
6
|
-
success: boolean;
|
|
7
|
-
release: any;
|
|
8
|
-
tag?: undefined;
|
|
9
|
-
message?: undefined;
|
|
10
|
-
releases?: undefined;
|
|
11
|
-
tags?: undefined;
|
|
12
|
-
} | {
|
|
13
|
-
success: boolean;
|
|
14
|
-
tag: any;
|
|
15
|
-
message: string;
|
|
16
|
-
release?: undefined;
|
|
17
|
-
releases?: undefined;
|
|
18
|
-
tags?: undefined;
|
|
19
|
-
} | {
|
|
20
|
-
success: boolean;
|
|
21
|
-
releases: any;
|
|
22
|
-
release?: undefined;
|
|
23
|
-
tag?: undefined;
|
|
24
|
-
message?: undefined;
|
|
25
|
-
tags?: undefined;
|
|
26
|
-
} | {
|
|
27
|
-
success: boolean;
|
|
28
|
-
tags: string[];
|
|
29
|
-
release?: undefined;
|
|
30
|
-
tag?: undefined;
|
|
31
|
-
message?: undefined;
|
|
32
|
-
releases?: undefined;
|
|
33
|
-
}>;
|
|
5
|
+
handle(params: Record<string, any>, ctx: MCPContext): Promise<any>;
|
|
34
6
|
}
|