@ekho/gitlab-mcp 1.1.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/LICENSE +21 -0
- package/PLAN.md +517 -0
- package/README.md +429 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -0
- package/dist/groups/access_tokens/tools.d.ts +3 -0
- package/dist/groups/access_tokens/tools.js +198 -0
- package/dist/groups/access_tokens/tools.js.map +1 -0
- package/dist/groups/admin/tools.d.ts +3 -0
- package/dist/groups/admin/tools.js +136 -0
- package/dist/groups/admin/tools.js.map +1 -0
- package/dist/groups/ai_catalog/queries.d.ts +3 -0
- package/dist/groups/ai_catalog/queries.js +75 -0
- package/dist/groups/ai_catalog/queries.js.map +1 -0
- package/dist/groups/ai_catalog/tools.d.ts +3 -0
- package/dist/groups/ai_catalog/tools.js +40 -0
- package/dist/groups/ai_catalog/tools.js.map +1 -0
- package/dist/groups/analytics/queries.d.ts +1 -0
- package/dist/groups/analytics/queries.js +28 -0
- package/dist/groups/analytics/queries.js.map +1 -0
- package/dist/groups/analytics/tools.d.ts +3 -0
- package/dist/groups/analytics/tools.js +110 -0
- package/dist/groups/analytics/tools.js.map +1 -0
- package/dist/groups/audit_events/tools.d.ts +3 -0
- package/dist/groups/audit_events/tools.js +112 -0
- package/dist/groups/audit_events/tools.js.map +1 -0
- package/dist/groups/boards/tools.d.ts +3 -0
- package/dist/groups/boards/tools.js +46 -0
- package/dist/groups/boards/tools.js.map +1 -0
- package/dist/groups/branches/tools.d.ts +3 -0
- package/dist/groups/branches/tools.js +122 -0
- package/dist/groups/branches/tools.js.map +1 -0
- package/dist/groups/ci_catalog/queries.d.ts +2 -0
- package/dist/groups/ci_catalog/queries.js +63 -0
- package/dist/groups/ci_catalog/queries.js.map +1 -0
- package/dist/groups/ci_catalog/tools.d.ts +3 -0
- package/dist/groups/ci_catalog/tools.js +45 -0
- package/dist/groups/ci_catalog/tools.js.map +1 -0
- package/dist/groups/ci_lint/tools.d.ts +3 -0
- package/dist/groups/ci_lint/tools.js +36 -0
- package/dist/groups/ci_lint/tools.js.map +1 -0
- package/dist/groups/ci_variables/tools.d.ts +3 -0
- package/dist/groups/ci_variables/tools.js +201 -0
- package/dist/groups/ci_variables/tools.js.map +1 -0
- package/dist/groups/code_search/tools.d.ts +3 -0
- package/dist/groups/code_search/tools.js +70 -0
- package/dist/groups/code_search/tools.js.map +1 -0
- package/dist/groups/commits/tools.d.ts +3 -0
- package/dist/groups/commits/tools.js +192 -0
- package/dist/groups/commits/tools.js.map +1 -0
- package/dist/groups/compliance/queries.d.ts +1 -0
- package/dist/groups/compliance/queries.js +22 -0
- package/dist/groups/compliance/queries.js.map +1 -0
- package/dist/groups/compliance/tools.d.ts +3 -0
- package/dist/groups/compliance/tools.js +104 -0
- package/dist/groups/compliance/tools.js.map +1 -0
- package/dist/groups/container_registry/tools.d.ts +3 -0
- package/dist/groups/container_registry/tools.js +113 -0
- package/dist/groups/container_registry/tools.js.map +1 -0
- package/dist/groups/custom_roles/queries.d.ts +5 -0
- package/dist/groups/custom_roles/queries.js +69 -0
- package/dist/groups/custom_roles/queries.js.map +1 -0
- package/dist/groups/custom_roles/tools.d.ts +3 -0
- package/dist/groups/custom_roles/tools.js +84 -0
- package/dist/groups/custom_roles/tools.js.map +1 -0
- package/dist/groups/deployments/tools.d.ts +3 -0
- package/dist/groups/deployments/tools.js +98 -0
- package/dist/groups/deployments/tools.js.map +1 -0
- package/dist/groups/discussions/tools.d.ts +3 -0
- package/dist/groups/discussions/tools.js +144 -0
- package/dist/groups/discussions/tools.js.map +1 -0
- package/dist/groups/duo_chat/queries.d.ts +4 -0
- package/dist/groups/duo_chat/queries.js +76 -0
- package/dist/groups/duo_chat/queries.js.map +1 -0
- package/dist/groups/duo_chat/tools.d.ts +3 -0
- package/dist/groups/duo_chat/tools.js +95 -0
- package/dist/groups/duo_chat/tools.js.map +1 -0
- package/dist/groups/environments/tools.d.ts +3 -0
- package/dist/groups/environments/tools.js +105 -0
- package/dist/groups/environments/tools.js.map +1 -0
- package/dist/groups/events/tools.d.ts +3 -0
- package/dist/groups/events/tools.js +64 -0
- package/dist/groups/events/tools.js.map +1 -0
- package/dist/groups/feature_flags/tools.d.ts +3 -0
- package/dist/groups/feature_flags/tools.js +137 -0
- package/dist/groups/feature_flags/tools.js.map +1 -0
- package/dist/groups/groups/tools.d.ts +3 -0
- package/dist/groups/groups/tools.js +145 -0
- package/dist/groups/groups/tools.js.map +1 -0
- package/dist/groups/integrations/tools.d.ts +3 -0
- package/dist/groups/integrations/tools.js +143 -0
- package/dist/groups/integrations/tools.js.map +1 -0
- package/dist/groups/jobs/tools.d.ts +3 -0
- package/dist/groups/jobs/tools.js +209 -0
- package/dist/groups/jobs/tools.js.map +1 -0
- package/dist/groups/keys/tools.d.ts +3 -0
- package/dist/groups/keys/tools.js +140 -0
- package/dist/groups/keys/tools.js.map +1 -0
- package/dist/groups/labels/tools.d.ts +3 -0
- package/dist/groups/labels/tools.js +110 -0
- package/dist/groups/labels/tools.js.map +1 -0
- package/dist/groups/members/tools.d.ts +3 -0
- package/dist/groups/members/tools.js +136 -0
- package/dist/groups/members/tools.js.map +1 -0
- package/dist/groups/merge_requests/tools.d.ts +3 -0
- package/dist/groups/merge_requests/tools.js +288 -0
- package/dist/groups/merge_requests/tools.js.map +1 -0
- package/dist/groups/milestones/tools.d.ts +3 -0
- package/dist/groups/milestones/tools.js +143 -0
- package/dist/groups/milestones/tools.js.map +1 -0
- package/dist/groups/packages/tools.d.ts +3 -0
- package/dist/groups/packages/tools.js +157 -0
- package/dist/groups/packages/tools.js.map +1 -0
- package/dist/groups/pipeline_schedules/tools.d.ts +3 -0
- package/dist/groups/pipeline_schedules/tools.js +127 -0
- package/dist/groups/pipeline_schedules/tools.js.map +1 -0
- package/dist/groups/pipeline_triggers/tools.d.ts +3 -0
- package/dist/groups/pipeline_triggers/tools.js +74 -0
- package/dist/groups/pipeline_triggers/tools.js.map +1 -0
- package/dist/groups/pipelines/tools.d.ts +3 -0
- package/dist/groups/pipelines/tools.js +140 -0
- package/dist/groups/pipelines/tools.js.map +1 -0
- package/dist/groups/projects/tools.d.ts +3 -0
- package/dist/groups/projects/tools.js +189 -0
- package/dist/groups/projects/tools.js.map +1 -0
- package/dist/groups/protected_environments/tools.d.ts +3 -0
- package/dist/groups/protected_environments/tools.js +77 -0
- package/dist/groups/protected_environments/tools.js.map +1 -0
- package/dist/groups/releases/tools.d.ts +3 -0
- package/dist/groups/releases/tools.js +153 -0
- package/dist/groups/releases/tools.js.map +1 -0
- package/dist/groups/repository_files/tools.d.ts +3 -0
- package/dist/groups/repository_files/tools.js +163 -0
- package/dist/groups/repository_files/tools.js.map +1 -0
- package/dist/groups/runners/tools.d.ts +3 -0
- package/dist/groups/runners/tools.js +108 -0
- package/dist/groups/runners/tools.js.map +1 -0
- package/dist/groups/search/tools.d.ts +3 -0
- package/dist/groups/search/tools.js +58 -0
- package/dist/groups/search/tools.js.map +1 -0
- package/dist/groups/secrets/queries.d.ts +10 -0
- package/dist/groups/secrets/queries.js +121 -0
- package/dist/groups/secrets/queries.js.map +1 -0
- package/dist/groups/secrets/tools.d.ts +8 -0
- package/dist/groups/secrets/tools.js +167 -0
- package/dist/groups/secrets/tools.js.map +1 -0
- package/dist/groups/security_policies/queries.d.ts +3 -0
- package/dist/groups/security_policies/queries.js +75 -0
- package/dist/groups/security_policies/queries.js.map +1 -0
- package/dist/groups/security_policies/tools.d.ts +3 -0
- package/dist/groups/security_policies/tools.js +40 -0
- package/dist/groups/security_policies/tools.js.map +1 -0
- package/dist/groups/security_reports/queries.d.ts +1 -0
- package/dist/groups/security_reports/queries.js +75 -0
- package/dist/groups/security_reports/queries.js.map +1 -0
- package/dist/groups/security_reports/tools.d.ts +3 -0
- package/dist/groups/security_reports/tools.js +51 -0
- package/dist/groups/security_reports/tools.js.map +1 -0
- package/dist/groups/snippets/tools.d.ts +3 -0
- package/dist/groups/snippets/tools.js +148 -0
- package/dist/groups/snippets/tools.js.map +1 -0
- package/dist/groups/statistics/queries.d.ts +2 -0
- package/dist/groups/statistics/queries.js +32 -0
- package/dist/groups/statistics/queries.js.map +1 -0
- package/dist/groups/statistics/tools.d.ts +3 -0
- package/dist/groups/statistics/tools.js +35 -0
- package/dist/groups/statistics/tools.js.map +1 -0
- package/dist/groups/tags/tools.d.ts +3 -0
- package/dist/groups/tags/tools.js +97 -0
- package/dist/groups/tags/tools.js.map +1 -0
- package/dist/groups/todos/tools.d.ts +3 -0
- package/dist/groups/todos/tools.js +93 -0
- package/dist/groups/todos/tools.js.map +1 -0
- package/dist/groups/users/tools.d.ts +3 -0
- package/dist/groups/users/tools.js +121 -0
- package/dist/groups/users/tools.js.map +1 -0
- package/dist/groups/vulnerabilities/queries.d.ts +3 -0
- package/dist/groups/vulnerabilities/queries.js +104 -0
- package/dist/groups/vulnerabilities/queries.js.map +1 -0
- package/dist/groups/vulnerabilities/tools.d.ts +3 -0
- package/dist/groups/vulnerabilities/tools.js +131 -0
- package/dist/groups/vulnerabilities/tools.js.map +1 -0
- package/dist/groups/webhooks/tools.d.ts +3 -0
- package/dist/groups/webhooks/tools.js +213 -0
- package/dist/groups/webhooks/tools.js.map +1 -0
- package/dist/groups/wiki/tools.d.ts +3 -0
- package/dist/groups/wiki/tools.js +142 -0
- package/dist/groups/wiki/tools.js.map +1 -0
- package/dist/groups/work_items/queries.d.ts +16 -0
- package/dist/groups/work_items/queries.js +181 -0
- package/dist/groups/work_items/queries.js.map +1 -0
- package/dist/groups/work_items/tools.d.ts +3 -0
- package/dist/groups/work_items/tools.js +250 -0
- package/dist/groups/work_items/tools.js.map +1 -0
- package/dist/http/errors.d.ts +21 -0
- package/dist/http/errors.js +62 -0
- package/dist/http/errors.js.map +1 -0
- package/dist/http/graphql.d.ts +29 -0
- package/dist/http/graphql.js +93 -0
- package/dist/http/graphql.js.map +1 -0
- package/dist/http/rest.d.ts +96 -0
- package/dist/http/rest.js +369 -0
- package/dist/http/rest.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/args.d.ts +51 -0
- package/dist/shared/args.js +46 -0
- package/dist/shared/args.js.map +1 -0
- package/dist/shared/handlers.d.ts +6 -0
- package/dist/shared/handlers.js +14 -0
- package/dist/shared/handlers.js.map +1 -0
- package/dist/shared/ids.d.ts +18 -0
- package/dist/shared/ids.js +43 -0
- package/dist/shared/ids.js.map +1 -0
- package/dist/tools/meta.d.ts +3 -0
- package/dist/tools/meta.js +22 -0
- package/dist/tools/meta.js.map +1 -0
- package/dist/tools/registry.d.ts +3 -0
- package/dist/tools/registry.js +117 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +18 -0
- package/dist/tools/types.js +20 -0
- package/dist/tools/types.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { PaginationArgs, ProjectIdArg } from '../../shared/args.js';
|
|
3
|
+
import { safe } from '../../shared/handlers.js';
|
|
4
|
+
import { resolveProjectId } from '../../shared/ids.js';
|
|
5
|
+
const JobScope = z.enum([
|
|
6
|
+
'created',
|
|
7
|
+
'pending',
|
|
8
|
+
'running',
|
|
9
|
+
'failed',
|
|
10
|
+
'success',
|
|
11
|
+
'canceled',
|
|
12
|
+
'skipped',
|
|
13
|
+
'waiting_for_resource',
|
|
14
|
+
'manual',
|
|
15
|
+
]);
|
|
16
|
+
const JobVariable = z.object({ key: z.string(), value: z.string() });
|
|
17
|
+
export function registerJobTools(server, ctx) {
|
|
18
|
+
server.tool('job_list_pipeline', 'List jobs in a specific pipeline.', {
|
|
19
|
+
...ProjectIdArg,
|
|
20
|
+
pipeline_id: z.number().int().positive(),
|
|
21
|
+
scope: z.array(JobScope).optional(),
|
|
22
|
+
include_retried: z.boolean().optional(),
|
|
23
|
+
...PaginationArgs,
|
|
24
|
+
}, async (args) => safe(async () => {
|
|
25
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
26
|
+
const { project_id: _p, pipeline_id, ...rest } = args;
|
|
27
|
+
const res = await ctx.rest.request({
|
|
28
|
+
path: `/projects/${projectId}/pipelines/${pipeline_id}/jobs`,
|
|
29
|
+
query: rest,
|
|
30
|
+
});
|
|
31
|
+
return res.data;
|
|
32
|
+
}));
|
|
33
|
+
server.tool('job_list_project', 'List all jobs in a project (newest first).', {
|
|
34
|
+
...ProjectIdArg,
|
|
35
|
+
scope: z.array(JobScope).optional(),
|
|
36
|
+
...PaginationArgs,
|
|
37
|
+
}, async (args) => safe(async () => {
|
|
38
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
39
|
+
const { project_id: _p, ...rest } = args;
|
|
40
|
+
const res = await ctx.rest.request({
|
|
41
|
+
path: `/projects/${projectId}/jobs`,
|
|
42
|
+
query: rest,
|
|
43
|
+
});
|
|
44
|
+
return res.data;
|
|
45
|
+
}));
|
|
46
|
+
server.tool('job_get', 'Get a single job by id (includes artifact metadata).', { ...ProjectIdArg, job_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
47
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
48
|
+
const res = await ctx.rest.request({
|
|
49
|
+
path: `/projects/${projectId}/jobs/${args.job_id}`,
|
|
50
|
+
});
|
|
51
|
+
return res.data;
|
|
52
|
+
}));
|
|
53
|
+
server.tool('job_log', 'Get the trace (raw log) of a job as plain text. Use tail to grab only the last N kilobytes.', {
|
|
54
|
+
...ProjectIdArg,
|
|
55
|
+
job_id: z.number().int().positive(),
|
|
56
|
+
tail_kb: z
|
|
57
|
+
.number()
|
|
58
|
+
.int()
|
|
59
|
+
.positive()
|
|
60
|
+
.max(2048)
|
|
61
|
+
.optional()
|
|
62
|
+
.describe('If set, return only the last N kilobytes of the log.'),
|
|
63
|
+
}, async (args) => safe(async () => {
|
|
64
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
65
|
+
const res = await ctx.rest.request({
|
|
66
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/trace`,
|
|
67
|
+
});
|
|
68
|
+
const text = typeof res.data === 'string' ? res.data : String(res.data ?? '');
|
|
69
|
+
if (args.tail_kb !== undefined) {
|
|
70
|
+
const maxBytes = args.tail_kb * 1024;
|
|
71
|
+
return text.length > maxBytes ? text.slice(-maxBytes) : text;
|
|
72
|
+
}
|
|
73
|
+
return text;
|
|
74
|
+
}));
|
|
75
|
+
server.tool('job_retry', 'Retry a single job.', { ...ProjectIdArg, job_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
76
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
77
|
+
const res = await ctx.rest.request({
|
|
78
|
+
method: 'POST',
|
|
79
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/retry`,
|
|
80
|
+
});
|
|
81
|
+
return res.data;
|
|
82
|
+
}));
|
|
83
|
+
server.tool('job_cancel', 'Cancel a running job.', { ...ProjectIdArg, job_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
84
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
85
|
+
const res = await ctx.rest.request({
|
|
86
|
+
method: 'POST',
|
|
87
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/cancel`,
|
|
88
|
+
});
|
|
89
|
+
return res.data;
|
|
90
|
+
}));
|
|
91
|
+
server.tool('job_play', 'Play a manual job, optionally with per-run variables.', {
|
|
92
|
+
...ProjectIdArg,
|
|
93
|
+
job_id: z.number().int().positive(),
|
|
94
|
+
job_variables_attributes: z.array(JobVariable).optional(),
|
|
95
|
+
}, async (args) => safe(async () => {
|
|
96
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
97
|
+
const body = {};
|
|
98
|
+
if (args.job_variables_attributes) {
|
|
99
|
+
body['job_variables_attributes'] = args.job_variables_attributes;
|
|
100
|
+
}
|
|
101
|
+
const res = await ctx.rest.request({
|
|
102
|
+
method: 'POST',
|
|
103
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/play`,
|
|
104
|
+
body: Object.keys(body).length > 0 ? body : undefined,
|
|
105
|
+
});
|
|
106
|
+
return res.data;
|
|
107
|
+
}));
|
|
108
|
+
server.tool('job_erase', 'Erase a job\'s log and downloadable artifacts.', { ...ProjectIdArg, job_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
109
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
110
|
+
const res = await ctx.rest.request({
|
|
111
|
+
method: 'POST',
|
|
112
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/erase`,
|
|
113
|
+
});
|
|
114
|
+
return res.data;
|
|
115
|
+
}));
|
|
116
|
+
server.tool('job_artifacts_keep', 'Pin a job\'s artifacts so they are not deleted by expiration policy.', { ...ProjectIdArg, job_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
117
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
118
|
+
const res = await ctx.rest.request({
|
|
119
|
+
method: 'POST',
|
|
120
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/artifacts/keep`,
|
|
121
|
+
});
|
|
122
|
+
return res.data;
|
|
123
|
+
}));
|
|
124
|
+
server.tool('job_artifacts_delete', 'Delete the artifacts attached to a job.', { ...ProjectIdArg, job_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
125
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
126
|
+
const res = await ctx.rest.request({
|
|
127
|
+
method: 'DELETE',
|
|
128
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/artifacts`,
|
|
129
|
+
});
|
|
130
|
+
return res.data ?? { ok: true };
|
|
131
|
+
}));
|
|
132
|
+
server.tool('job_artifacts_download', 'Download the full artifacts archive of a job (ZIP). Saves to `save_to` if provided; otherwise returns base64 (capped by max_inline_bytes).', {
|
|
133
|
+
...ProjectIdArg,
|
|
134
|
+
job_id: z.number().int().positive(),
|
|
135
|
+
save_to: z.string().optional().describe('Absolute path on the MCP host to write the ZIP.'),
|
|
136
|
+
max_inline_bytes: z
|
|
137
|
+
.number()
|
|
138
|
+
.int()
|
|
139
|
+
.positive()
|
|
140
|
+
.max(50 * 1024 * 1024)
|
|
141
|
+
.optional()
|
|
142
|
+
.describe('Default 1 MiB. Used only when save_to is omitted.'),
|
|
143
|
+
}, async (args) => safe(async () => {
|
|
144
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
145
|
+
const res = await ctx.rest.downloadBinary({
|
|
146
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/artifacts`,
|
|
147
|
+
...(args.save_to ? { saveTo: args.save_to } : {}),
|
|
148
|
+
...(args.max_inline_bytes ? { maxInlineBytes: args.max_inline_bytes } : {}),
|
|
149
|
+
});
|
|
150
|
+
return res;
|
|
151
|
+
}));
|
|
152
|
+
server.tool('job_artifact_file_download', 'Download a single file from a job\'s artifacts by path within the archive.', {
|
|
153
|
+
...ProjectIdArg,
|
|
154
|
+
job_id: z.number().int().positive(),
|
|
155
|
+
artifact_path: z.string().describe('Path inside the artifact archive, e.g. "dist/index.html".'),
|
|
156
|
+
save_to: z.string().optional(),
|
|
157
|
+
max_inline_bytes: z.number().int().positive().optional(),
|
|
158
|
+
}, async (args) => safe(async () => {
|
|
159
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
160
|
+
const encoded = args.artifact_path
|
|
161
|
+
.split('/')
|
|
162
|
+
.map((p) => encodeURIComponent(p))
|
|
163
|
+
.join('/');
|
|
164
|
+
const res = await ctx.rest.downloadBinary({
|
|
165
|
+
path: `/projects/${projectId}/jobs/${args.job_id}/artifacts/${encoded}`,
|
|
166
|
+
...(args.save_to ? { saveTo: args.save_to } : {}),
|
|
167
|
+
...(args.max_inline_bytes ? { maxInlineBytes: args.max_inline_bytes } : {}),
|
|
168
|
+
});
|
|
169
|
+
return res;
|
|
170
|
+
}));
|
|
171
|
+
server.tool('job_artifacts_download_by_ref', 'Download the artifacts archive of the latest successful build of job_name on ref_name.', {
|
|
172
|
+
...ProjectIdArg,
|
|
173
|
+
ref_name: z.string(),
|
|
174
|
+
job_name: z.string(),
|
|
175
|
+
save_to: z.string().optional(),
|
|
176
|
+
max_inline_bytes: z.number().int().positive().optional(),
|
|
177
|
+
}, async (args) => safe(async () => {
|
|
178
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
179
|
+
const res = await ctx.rest.downloadBinary({
|
|
180
|
+
path: `/projects/${projectId}/jobs/artifacts/${encodeURIComponent(args.ref_name)}/download`,
|
|
181
|
+
query: { job: args.job_name },
|
|
182
|
+
...(args.save_to ? { saveTo: args.save_to } : {}),
|
|
183
|
+
...(args.max_inline_bytes ? { maxInlineBytes: args.max_inline_bytes } : {}),
|
|
184
|
+
});
|
|
185
|
+
return res;
|
|
186
|
+
}));
|
|
187
|
+
server.tool('job_artifact_file_download_by_ref', 'Download a single artifact file from the latest successful build of job_name on ref_name.', {
|
|
188
|
+
...ProjectIdArg,
|
|
189
|
+
ref_name: z.string(),
|
|
190
|
+
job_name: z.string(),
|
|
191
|
+
artifact_path: z.string(),
|
|
192
|
+
save_to: z.string().optional(),
|
|
193
|
+
max_inline_bytes: z.number().int().positive().optional(),
|
|
194
|
+
}, async (args) => safe(async () => {
|
|
195
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
196
|
+
const encoded = args.artifact_path
|
|
197
|
+
.split('/')
|
|
198
|
+
.map((p) => encodeURIComponent(p))
|
|
199
|
+
.join('/');
|
|
200
|
+
const res = await ctx.rest.downloadBinary({
|
|
201
|
+
path: `/projects/${projectId}/jobs/artifacts/${encodeURIComponent(args.ref_name)}/raw/${encoded}`,
|
|
202
|
+
query: { job: args.job_name },
|
|
203
|
+
...(args.save_to ? { saveTo: args.save_to } : {}),
|
|
204
|
+
...(args.max_inline_bytes ? { maxInlineBytes: args.max_inline_bytes } : {}),
|
|
205
|
+
});
|
|
206
|
+
return res;
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/groups/jobs/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { PaginationArgs, ProjectIdArg } from '../../shared/args.js';
|
|
3
|
+
import { safe } from '../../shared/handlers.js';
|
|
4
|
+
import { resolveProjectId } from '../../shared/ids.js';
|
|
5
|
+
export function registerKeyTools(server, ctx) {
|
|
6
|
+
// -- SSH keys ----------------------------------------------------------
|
|
7
|
+
server.tool('ssh_key_list', 'List SSH keys. Without user_id, lists the current user\'s; admin can list any.', {
|
|
8
|
+
user_id: z.number().int().optional(),
|
|
9
|
+
...PaginationArgs,
|
|
10
|
+
}, async (args) => safe(async () => {
|
|
11
|
+
const { user_id, ...rest } = args;
|
|
12
|
+
const path = user_id === undefined ? '/user/keys' : `/users/${user_id}/keys`;
|
|
13
|
+
const res = await ctx.rest.request({ path, query: rest });
|
|
14
|
+
return res.data;
|
|
15
|
+
}));
|
|
16
|
+
server.tool('ssh_key_get', 'Get an SSH key by id (current user).', { key_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
17
|
+
const res = await ctx.rest.request({ path: `/user/keys/${args.key_id}` });
|
|
18
|
+
return res.data;
|
|
19
|
+
}));
|
|
20
|
+
server.tool('ssh_key_create', 'Add an SSH key. Without user_id, adds to the current user; admin can target a user.', {
|
|
21
|
+
title: z.string(),
|
|
22
|
+
key: z.string().describe('Full public key including type and comment.'),
|
|
23
|
+
expires_at: z.string().optional(),
|
|
24
|
+
usage_type: z.enum(['auth', 'signing', 'auth_and_signing']).optional(),
|
|
25
|
+
user_id: z.number().int().optional(),
|
|
26
|
+
}, async (args) => safe(async () => {
|
|
27
|
+
const { user_id, ...body } = args;
|
|
28
|
+
const path = user_id === undefined ? '/user/keys' : `/users/${user_id}/keys`;
|
|
29
|
+
const res = await ctx.rest.request({ method: 'POST', path, body });
|
|
30
|
+
return res.data;
|
|
31
|
+
}));
|
|
32
|
+
server.tool('ssh_key_delete', 'Delete an SSH key. Without user_id, deletes from the current user.', {
|
|
33
|
+
key_id: z.number().int().positive(),
|
|
34
|
+
user_id: z.number().int().optional(),
|
|
35
|
+
}, async (args) => safe(async () => {
|
|
36
|
+
const path = args.user_id === undefined
|
|
37
|
+
? `/user/keys/${args.key_id}`
|
|
38
|
+
: `/users/${args.user_id}/keys/${args.key_id}`;
|
|
39
|
+
const res = await ctx.rest.request({ method: 'DELETE', path });
|
|
40
|
+
return res.data ?? { ok: true };
|
|
41
|
+
}));
|
|
42
|
+
// -- GPG keys ---------------------------------------------------------
|
|
43
|
+
server.tool('gpg_key_list', 'List GPG keys for the current user (or another user when admin).', { user_id: z.number().int().optional(), ...PaginationArgs }, async (args) => safe(async () => {
|
|
44
|
+
const { user_id, ...rest } = args;
|
|
45
|
+
const path = user_id === undefined ? '/user/gpg_keys' : `/users/${user_id}/gpg_keys`;
|
|
46
|
+
const res = await ctx.rest.request({ path, query: rest });
|
|
47
|
+
return res.data;
|
|
48
|
+
}));
|
|
49
|
+
server.tool('gpg_key_create', 'Add a GPG key (ASCII-armored public key).', {
|
|
50
|
+
key: z.string(),
|
|
51
|
+
user_id: z.number().int().optional(),
|
|
52
|
+
}, async (args) => safe(async () => {
|
|
53
|
+
const path = args.user_id === undefined ? '/user/gpg_keys' : `/users/${args.user_id}/gpg_keys`;
|
|
54
|
+
const res = await ctx.rest.request({
|
|
55
|
+
method: 'POST',
|
|
56
|
+
path,
|
|
57
|
+
body: { key: args.key },
|
|
58
|
+
});
|
|
59
|
+
return res.data;
|
|
60
|
+
}));
|
|
61
|
+
server.tool('gpg_key_delete', 'Delete a GPG key.', {
|
|
62
|
+
key_id: z.number().int().positive(),
|
|
63
|
+
user_id: z.number().int().optional(),
|
|
64
|
+
}, async (args) => safe(async () => {
|
|
65
|
+
const path = args.user_id === undefined
|
|
66
|
+
? `/user/gpg_keys/${args.key_id}`
|
|
67
|
+
: `/users/${args.user_id}/gpg_keys/${args.key_id}`;
|
|
68
|
+
const res = await ctx.rest.request({ method: 'DELETE', path });
|
|
69
|
+
return res.data ?? { ok: true };
|
|
70
|
+
}));
|
|
71
|
+
// -- Deploy keys ------------------------------------------------------
|
|
72
|
+
server.tool('deploy_key_list_project', 'List deploy keys configured on a project.', { ...ProjectIdArg, ...PaginationArgs }, async (args) => safe(async () => {
|
|
73
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
74
|
+
const { project_id: _p, ...rest } = args;
|
|
75
|
+
const res = await ctx.rest.request({
|
|
76
|
+
path: `/projects/${projectId}/deploy_keys`,
|
|
77
|
+
query: rest,
|
|
78
|
+
});
|
|
79
|
+
return res.data;
|
|
80
|
+
}));
|
|
81
|
+
server.tool('deploy_key_list_all', 'Admin: list all deploy keys on the instance.', PaginationArgs, async (args) => safe(async () => {
|
|
82
|
+
const res = await ctx.rest.request({ path: '/deploy_keys', query: args });
|
|
83
|
+
return res.data;
|
|
84
|
+
}));
|
|
85
|
+
server.tool('deploy_key_get', 'Get a deploy key on a project.', { ...ProjectIdArg, key_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
86
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
87
|
+
const res = await ctx.rest.request({
|
|
88
|
+
path: `/projects/${projectId}/deploy_keys/${args.key_id}`,
|
|
89
|
+
});
|
|
90
|
+
return res.data;
|
|
91
|
+
}));
|
|
92
|
+
server.tool('deploy_key_add', 'Add a new deploy key to a project.', {
|
|
93
|
+
...ProjectIdArg,
|
|
94
|
+
title: z.string(),
|
|
95
|
+
key: z.string(),
|
|
96
|
+
can_push: z.boolean().optional(),
|
|
97
|
+
expires_at: z.string().optional(),
|
|
98
|
+
}, async (args) => safe(async () => {
|
|
99
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
100
|
+
const { project_id: _p, ...body } = args;
|
|
101
|
+
const res = await ctx.rest.request({
|
|
102
|
+
method: 'POST',
|
|
103
|
+
path: `/projects/${projectId}/deploy_keys`,
|
|
104
|
+
body,
|
|
105
|
+
});
|
|
106
|
+
return res.data;
|
|
107
|
+
}));
|
|
108
|
+
server.tool('deploy_key_update', 'Update a deploy key (only title/can_push).', {
|
|
109
|
+
...ProjectIdArg,
|
|
110
|
+
key_id: z.number().int().positive(),
|
|
111
|
+
title: z.string().optional(),
|
|
112
|
+
can_push: z.boolean().optional(),
|
|
113
|
+
}, async (args) => safe(async () => {
|
|
114
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
115
|
+
const { project_id: _p, key_id, ...body } = args;
|
|
116
|
+
const res = await ctx.rest.request({
|
|
117
|
+
method: 'PUT',
|
|
118
|
+
path: `/projects/${projectId}/deploy_keys/${key_id}`,
|
|
119
|
+
body,
|
|
120
|
+
});
|
|
121
|
+
return res.data;
|
|
122
|
+
}));
|
|
123
|
+
server.tool('deploy_key_enable', 'Enable an existing deploy key (from another project) on this project.', { ...ProjectIdArg, key_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
124
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
125
|
+
const res = await ctx.rest.request({
|
|
126
|
+
method: 'POST',
|
|
127
|
+
path: `/projects/${projectId}/deploy_keys/${args.key_id}/enable`,
|
|
128
|
+
});
|
|
129
|
+
return res.data;
|
|
130
|
+
}));
|
|
131
|
+
server.tool('deploy_key_delete', 'Delete a deploy key from a project.', { ...ProjectIdArg, key_id: z.number().int().positive() }, async (args) => safe(async () => {
|
|
132
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
133
|
+
const res = await ctx.rest.request({
|
|
134
|
+
method: 'DELETE',
|
|
135
|
+
path: `/projects/${projectId}/deploy_keys/${args.key_id}`,
|
|
136
|
+
});
|
|
137
|
+
return res.data ?? { ok: true };
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/groups/keys/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { GroupIdArg, IdOrPath, PaginationArgs, ProjectIdArg } from '../../shared/args.js';
|
|
3
|
+
import { safe } from '../../shared/handlers.js';
|
|
4
|
+
import { resolveGroupId, resolveProjectId } from '../../shared/ids.js';
|
|
5
|
+
function scopedLabelsPath(scope, scopeId, suffix = '') {
|
|
6
|
+
return `/${scope === 'project' ? 'projects' : 'groups'}/${scopeId}/labels${suffix}`;
|
|
7
|
+
}
|
|
8
|
+
function resolveScopeId(ctx, scope, scopeId) {
|
|
9
|
+
return scope === 'project'
|
|
10
|
+
? resolveProjectId(ctx.config, scopeId)
|
|
11
|
+
: resolveGroupId(ctx.config, scopeId);
|
|
12
|
+
}
|
|
13
|
+
export function registerLabelTools(server, ctx) {
|
|
14
|
+
server.tool('label_list_project', 'List labels in a project. Set include_ancestor_groups=true to include inherited group labels.', {
|
|
15
|
+
...ProjectIdArg,
|
|
16
|
+
with_counts: z.boolean().optional(),
|
|
17
|
+
include_ancestor_groups: z.boolean().optional(),
|
|
18
|
+
search: z.string().optional(),
|
|
19
|
+
...PaginationArgs,
|
|
20
|
+
}, async (args) => safe(async () => {
|
|
21
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
22
|
+
const { project_id: _p, ...rest } = args;
|
|
23
|
+
const res = await ctx.rest.request({
|
|
24
|
+
path: scopedLabelsPath('project', projectId),
|
|
25
|
+
query: rest,
|
|
26
|
+
});
|
|
27
|
+
return res.data;
|
|
28
|
+
}));
|
|
29
|
+
server.tool('label_list_group', 'List labels in a group.', {
|
|
30
|
+
...GroupIdArg,
|
|
31
|
+
with_counts: z.boolean().optional(),
|
|
32
|
+
include_ancestor_groups: z.boolean().optional(),
|
|
33
|
+
include_descendant_groups: z.boolean().optional(),
|
|
34
|
+
only_group_labels: z.boolean().optional(),
|
|
35
|
+
search: z.string().optional(),
|
|
36
|
+
...PaginationArgs,
|
|
37
|
+
}, async (args) => safe(async () => {
|
|
38
|
+
const groupId = resolveGroupId(ctx.config, args.group_id);
|
|
39
|
+
const { group_id: _g, ...rest } = args;
|
|
40
|
+
const res = await ctx.rest.request({
|
|
41
|
+
path: scopedLabelsPath('group', groupId),
|
|
42
|
+
query: rest,
|
|
43
|
+
});
|
|
44
|
+
return res.data;
|
|
45
|
+
}));
|
|
46
|
+
server.tool('label_create', 'Create a label scoped to a project or group.', {
|
|
47
|
+
scope: z.enum(['project', 'group']),
|
|
48
|
+
scope_id: IdOrPath.optional(),
|
|
49
|
+
name: z.string(),
|
|
50
|
+
color: z.string().describe('Hex color, e.g. "#FF0000" or named CSS color.'),
|
|
51
|
+
description: z.string().optional(),
|
|
52
|
+
priority: z.number().int().optional(),
|
|
53
|
+
}, async (args) => safe(async () => {
|
|
54
|
+
const scopeId = resolveScopeId(ctx, args.scope, args.scope_id);
|
|
55
|
+
const { scope, scope_id: _s, ...body } = args;
|
|
56
|
+
const res = await ctx.rest.request({
|
|
57
|
+
method: 'POST',
|
|
58
|
+
path: scopedLabelsPath(scope, scopeId),
|
|
59
|
+
body,
|
|
60
|
+
});
|
|
61
|
+
return res.data;
|
|
62
|
+
}));
|
|
63
|
+
server.tool('label_update', 'Update a label by id (or numeric label_id) within project or group.', {
|
|
64
|
+
scope: z.enum(['project', 'group']),
|
|
65
|
+
scope_id: IdOrPath.optional(),
|
|
66
|
+
label_id: z.union([z.number().int(), z.string()]).describe('Label id or name.'),
|
|
67
|
+
new_name: z.string().optional(),
|
|
68
|
+
color: z.string().optional(),
|
|
69
|
+
description: z.string().optional(),
|
|
70
|
+
priority: z.number().int().nullable().optional(),
|
|
71
|
+
}, async (args) => safe(async () => {
|
|
72
|
+
const scopeId = resolveScopeId(ctx, args.scope, args.scope_id);
|
|
73
|
+
const { scope, scope_id: _s, label_id, ...body } = args;
|
|
74
|
+
const res = await ctx.rest.request({
|
|
75
|
+
method: 'PUT',
|
|
76
|
+
path: scopedLabelsPath(scope, scopeId, `/${encodeURIComponent(String(label_id))}`),
|
|
77
|
+
body,
|
|
78
|
+
});
|
|
79
|
+
return res.data;
|
|
80
|
+
}));
|
|
81
|
+
server.tool('label_delete', 'Delete a label by id or name.', {
|
|
82
|
+
scope: z.enum(['project', 'group']),
|
|
83
|
+
scope_id: IdOrPath.optional(),
|
|
84
|
+
label_id: z.union([z.number().int(), z.string()]),
|
|
85
|
+
}, async (args) => safe(async () => {
|
|
86
|
+
const scopeId = resolveScopeId(ctx, args.scope, args.scope_id);
|
|
87
|
+
const res = await ctx.rest.request({
|
|
88
|
+
method: 'DELETE',
|
|
89
|
+
path: scopedLabelsPath(args.scope, scopeId, `/${encodeURIComponent(String(args.label_id))}`),
|
|
90
|
+
});
|
|
91
|
+
return res.data ?? { ok: true };
|
|
92
|
+
}));
|
|
93
|
+
server.tool('label_subscribe', 'Subscribe the current user to label notifications (project labels only).', { ...ProjectIdArg, label_id: z.union([z.number().int(), z.string()]) }, async (args) => safe(async () => {
|
|
94
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
95
|
+
const res = await ctx.rest.request({
|
|
96
|
+
method: 'POST',
|
|
97
|
+
path: `/projects/${projectId}/labels/${encodeURIComponent(String(args.label_id))}/subscribe`,
|
|
98
|
+
});
|
|
99
|
+
return res.data;
|
|
100
|
+
}));
|
|
101
|
+
server.tool('label_unsubscribe', 'Unsubscribe the current user from a project label.', { ...ProjectIdArg, label_id: z.union([z.number().int(), z.string()]) }, async (args) => safe(async () => {
|
|
102
|
+
const projectId = resolveProjectId(ctx.config, args.project_id);
|
|
103
|
+
const res = await ctx.rest.request({
|
|
104
|
+
method: 'POST',
|
|
105
|
+
path: `/projects/${projectId}/labels/${encodeURIComponent(String(args.label_id))}/unsubscribe`,
|
|
106
|
+
});
|
|
107
|
+
return res.data;
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/groups/labels/tools.ts"],"names":[],"mappings":"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"}
|