gitlab-mcp 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -1
  3. package/dist/config/dotenv.d.ts +2 -0
  4. package/dist/config/dotenv.js +40 -0
  5. package/dist/config/dotenv.js.map +1 -0
  6. package/dist/config/env.d.ts +55 -0
  7. package/dist/config/env.js +164 -0
  8. package/dist/config/env.js.map +1 -0
  9. package/dist/http-app.d.ts +45 -0
  10. package/dist/http-app.js +550 -0
  11. package/dist/http-app.js.map +1 -0
  12. package/dist/http.d.ts +2 -0
  13. package/dist/http.js +65 -0
  14. package/dist/http.js.map +1 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.js +65 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/lib/auth-context.d.ts +9 -0
  19. package/dist/lib/auth-context.js +9 -0
  20. package/dist/lib/auth-context.js.map +1 -0
  21. package/dist/lib/gitlab-client.d.ts +331 -0
  22. package/dist/lib/gitlab-client.js +1025 -0
  23. package/dist/lib/gitlab-client.js.map +1 -0
  24. package/dist/lib/logger.d.ts +2 -0
  25. package/dist/lib/logger.js +13 -0
  26. package/dist/lib/logger.js.map +1 -0
  27. package/dist/lib/network.d.ts +3 -0
  28. package/dist/lib/network.js +38 -0
  29. package/dist/lib/network.js.map +1 -0
  30. package/dist/lib/oauth.d.ts +29 -0
  31. package/dist/lib/oauth.js +220 -0
  32. package/dist/lib/oauth.js.map +1 -0
  33. package/dist/lib/output.d.ts +14 -0
  34. package/dist/lib/output.js +38 -0
  35. package/dist/lib/output.js.map +1 -0
  36. package/dist/lib/policy.d.ts +25 -0
  37. package/dist/lib/policy.js +48 -0
  38. package/dist/lib/policy.js.map +1 -0
  39. package/dist/lib/request-runtime.d.ts +26 -0
  40. package/dist/lib/request-runtime.js +323 -0
  41. package/dist/lib/request-runtime.js.map +1 -0
  42. package/dist/lib/sanitize.d.ts +1 -0
  43. package/dist/lib/sanitize.js +21 -0
  44. package/dist/lib/sanitize.js.map +1 -0
  45. package/dist/lib/session-capacity.d.ts +8 -0
  46. package/dist/lib/session-capacity.js +7 -0
  47. package/dist/lib/session-capacity.js.map +1 -0
  48. package/dist/server/build-server.d.ts +3 -0
  49. package/dist/server/build-server.js +13 -0
  50. package/dist/server/build-server.js.map +1 -0
  51. package/dist/tools/gitlab.d.ts +9 -0
  52. package/dist/tools/gitlab.js +2576 -0
  53. package/dist/tools/gitlab.js.map +1 -0
  54. package/dist/tools/health.d.ts +2 -0
  55. package/dist/tools/health.js +21 -0
  56. package/dist/tools/health.js.map +1 -0
  57. package/dist/tools/mr-code-context.d.ts +38 -0
  58. package/dist/tools/mr-code-context.js +330 -0
  59. package/dist/tools/mr-code-context.js.map +1 -0
  60. package/{src/types/context.ts → dist/types/context.d.ts} +5 -6
  61. package/dist/types/context.js +2 -0
  62. package/dist/types/context.js.map +1 -0
  63. package/docs/architecture.md +10 -10
  64. package/docs/configuration.md +12 -7
  65. package/docs/mcp-integration-testing-best-practices.md +981 -0
  66. package/package.json +13 -1
  67. package/.dockerignore +0 -7
  68. package/.editorconfig +0 -9
  69. package/.env.example +0 -75
  70. package/.github/workflows/nodejs.yml +0 -31
  71. package/.github/workflows/npm-publish.yml +0 -31
  72. package/.husky/pre-commit +0 -1
  73. package/.nvmrc +0 -1
  74. package/.prettierrc.json +0 -6
  75. package/Dockerfile +0 -20
  76. package/docker-compose.yml +0 -10
  77. package/eslint.config.js +0 -23
  78. package/scripts/get-oauth-token.example.sh +0 -15
  79. package/src/config/env.ts +0 -171
  80. package/src/http.ts +0 -620
  81. package/src/index.ts +0 -77
  82. package/src/lib/auth-context.ts +0 -19
  83. package/src/lib/gitlab-client.ts +0 -1810
  84. package/src/lib/logger.ts +0 -17
  85. package/src/lib/network.ts +0 -45
  86. package/src/lib/oauth.ts +0 -287
  87. package/src/lib/output.ts +0 -51
  88. package/src/lib/policy.ts +0 -78
  89. package/src/lib/request-runtime.ts +0 -376
  90. package/src/lib/sanitize.ts +0 -25
  91. package/src/lib/session-capacity.ts +0 -14
  92. package/src/server/build-server.ts +0 -17
  93. package/src/tools/gitlab.ts +0 -3135
  94. package/src/tools/health.ts +0 -27
  95. package/src/tools/mr-code-context.ts +0 -473
  96. package/tests/auth-context.test.ts +0 -102
  97. package/tests/gitlab-client.test.ts +0 -672
  98. package/tests/graphql-guard.test.ts +0 -121
  99. package/tests/integration/agent-loop.integration.test.ts +0 -558
  100. package/tests/integration/server.integration.test.ts +0 -543
  101. package/tests/mr-code-context.test.ts +0 -600
  102. package/tests/oauth.test.ts +0 -43
  103. package/tests/output.test.ts +0 -186
  104. package/tests/policy.test.ts +0 -324
  105. package/tests/request-runtime.test.ts +0 -252
  106. package/tests/sanitize.test.ts +0 -123
  107. package/tests/session-capacity.test.ts +0 -49
  108. package/tests/upload-reference.test.ts +0 -88
  109. package/tsconfig.build.json +0 -11
  110. package/tsconfig.json +0 -21
  111. package/vitest.config.ts +0 -12
package/dist/index.js ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { env } from "./config/env.js";
4
+ import { GitLabClient } from "./lib/gitlab-client.js";
5
+ import { logger } from "./lib/logger.js";
6
+ import { configureNetworkRuntime } from "./lib/network.js";
7
+ import { OutputFormatter } from "./lib/output.js";
8
+ import { ToolPolicyEngine } from "./lib/policy.js";
9
+ import { GitLabRequestRuntime } from "./lib/request-runtime.js";
10
+ import { createMcpServer } from "./server/build-server.js";
11
+ async function main() {
12
+ const deniedToolsRegex = env.GITLAB_DENIED_TOOLS_REGEX
13
+ ? new RegExp(env.GITLAB_DENIED_TOOLS_REGEX)
14
+ : undefined;
15
+ configureNetworkRuntime(env, logger);
16
+ const requestRuntime = new GitLabRequestRuntime(env, logger);
17
+ const context = {
18
+ env,
19
+ logger,
20
+ gitlab: new GitLabClient(env.GITLAB_API_URL, env.GITLAB_PERSONAL_ACCESS_TOKEN, {
21
+ apiUrls: env.GITLAB_API_URLS,
22
+ timeoutMs: env.GITLAB_HTTP_TIMEOUT_MS,
23
+ beforeRequest: (requestContext) => requestRuntime.beforeRequest(requestContext)
24
+ }),
25
+ policy: new ToolPolicyEngine({
26
+ readOnlyMode: env.GITLAB_READ_ONLY_MODE,
27
+ allowedTools: env.GITLAB_ALLOWED_TOOLS,
28
+ deniedToolsRegex,
29
+ enabledFeatures: {
30
+ wiki: env.USE_GITLAB_WIKI,
31
+ milestone: env.USE_MILESTONE,
32
+ pipeline: env.USE_PIPELINE,
33
+ release: env.USE_RELEASE
34
+ }
35
+ }),
36
+ formatter: new OutputFormatter({
37
+ responseMode: env.GITLAB_RESPONSE_MODE,
38
+ maxBytes: env.GITLAB_MAX_RESPONSE_BYTES
39
+ })
40
+ };
41
+ const server = createMcpServer(context);
42
+ const transport = new StdioServerTransport();
43
+ await server.connect(transport);
44
+ logger.info({ transport: "stdio" }, "MCP server started");
45
+ const handleSignal = (signal) => {
46
+ void shutdown(signal, server);
47
+ };
48
+ process.once("SIGINT", () => handleSignal("SIGINT"));
49
+ process.once("SIGTERM", () => handleSignal("SIGTERM"));
50
+ }
51
+ async function shutdown(signal, server) {
52
+ logger.info({ signal }, "Shutting down MCP server");
53
+ try {
54
+ await server.close();
55
+ }
56
+ catch (error) {
57
+ logger.error({ err: error }, "Server close failed");
58
+ }
59
+ process.exit(0);
60
+ }
61
+ void main().catch((error) => {
62
+ logger.error({ err: error }, "Failed to start MCP server");
63
+ process.exit(1);
64
+ });
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface SessionAuth {
2
+ sessionId?: string;
3
+ token?: string;
4
+ apiUrl?: string;
5
+ header?: "authorization" | "private-token";
6
+ updatedAt: number;
7
+ }
8
+ export declare function runWithSessionAuth<T>(auth: SessionAuth | undefined, callback: () => T): T;
9
+ export declare function getSessionAuth(): SessionAuth | undefined;
@@ -0,0 +1,9 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ const sessionAuthStore = new AsyncLocalStorage();
3
+ export function runWithSessionAuth(auth, callback) {
4
+ return sessionAuthStore.run(auth, callback);
5
+ }
6
+ export function getSessionAuth() {
7
+ return sessionAuthStore.getStore();
8
+ }
9
+ //# sourceMappingURL=auth-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-context.js","sourceRoot":"","sources":["../../src/lib/auth-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAUrD,MAAM,gBAAgB,GAAG,IAAI,iBAAiB,EAA2B,CAAC;AAE1E,MAAM,UAAU,kBAAkB,CAAI,IAA6B,EAAE,QAAiB;IACpF,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,gBAAgB,CAAC,QAAQ,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,331 @@
1
+ import { type SessionAuth } from "./auth-context.js";
2
+ export interface GitLabClientOptions {
3
+ timeoutMs?: number;
4
+ apiUrls?: string[];
5
+ maxAttachmentBytes?: number;
6
+ maxResponseBodyBytes?: number;
7
+ beforeRequest?: (context: GitLabBeforeRequestContext) => Promise<GitLabBeforeRequestResult | void>;
8
+ }
9
+ export interface GitLabRequestOptions {
10
+ query?: Record<string, string | number | boolean | undefined | null>;
11
+ body?: BodyInit;
12
+ headers?: HeadersInit;
13
+ token?: string;
14
+ apiUrl?: string;
15
+ authHeader?: "authorization" | "private-token";
16
+ }
17
+ export interface GitLabBeforeRequestContext {
18
+ url: URL;
19
+ method: string;
20
+ headers: Headers;
21
+ body?: BodyInit;
22
+ token?: string;
23
+ authHeader?: "authorization" | "private-token";
24
+ }
25
+ export interface GitLabBeforeRequestResult {
26
+ headers?: Headers;
27
+ body?: BodyInit;
28
+ token?: string;
29
+ authHeader?: "authorization" | "private-token";
30
+ fetchImpl?: typeof fetch;
31
+ }
32
+ export interface GitLabProject {
33
+ id: number;
34
+ name: string;
35
+ description: string | null;
36
+ path_with_namespace: string;
37
+ default_branch: string | null;
38
+ web_url: string;
39
+ visibility: string;
40
+ last_activity_at: string;
41
+ }
42
+ export interface PushFileAction {
43
+ action: "create" | "delete" | "move" | "update" | "chmod";
44
+ file_path: string;
45
+ previous_path?: string;
46
+ content?: string;
47
+ encoding?: "text" | "base64";
48
+ execute_filemode?: boolean;
49
+ last_commit_id?: string;
50
+ }
51
+ export interface MergeRequestCodeContextFile {
52
+ old_path: string;
53
+ new_path: string;
54
+ new_file: boolean;
55
+ renamed_file: boolean;
56
+ deleted_file: boolean;
57
+ diff: string;
58
+ }
59
+ export declare class GitLabApiError extends Error {
60
+ readonly status: number;
61
+ readonly details?: unknown | undefined;
62
+ constructor(message: string, status: number, details?: unknown | undefined);
63
+ }
64
+ export declare class GitLabClient {
65
+ private static readonly DEFAULT_MAX_ATTACHMENT_BYTES;
66
+ private static readonly DEFAULT_MAX_RESPONSE_BODY_BYTES;
67
+ private readonly baseApiUrl;
68
+ private readonly apiUrls;
69
+ private nextApiUrlIndex;
70
+ private readonly defaultToken?;
71
+ private readonly timeoutMs;
72
+ private readonly maxAttachmentBytes;
73
+ private readonly maxResponseBodyBytes;
74
+ private readonly beforeRequest?;
75
+ constructor(baseApiUrl: string, defaultToken?: string, options?: GitLabClientOptions);
76
+ getProject(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
77
+ listProjects(options?: GitLabRequestOptions): Promise<unknown>;
78
+ createRepository(payload: {
79
+ name: string;
80
+ description?: string;
81
+ visibility?: "private" | "internal" | "public";
82
+ initialize_with_readme?: boolean;
83
+ path?: string;
84
+ namespace_id?: string | number;
85
+ default_branch?: string;
86
+ }, options?: GitLabRequestOptions): Promise<unknown>;
87
+ listProjectMembers(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
88
+ listGroupProjects(groupId: string, options?: GitLabRequestOptions): Promise<unknown>;
89
+ forkRepository(projectId: string, payload?: {
90
+ namespace?: string;
91
+ namespace_id?: string | number;
92
+ path?: string;
93
+ name?: string;
94
+ description?: string;
95
+ visibility?: "private" | "internal" | "public";
96
+ default_branch?: string;
97
+ }, options?: GitLabRequestOptions): Promise<unknown>;
98
+ searchProjects(search: string, limit?: number, options?: GitLabRequestOptions): Promise<unknown>;
99
+ searchRepositories(search: string, options?: GitLabRequestOptions): Promise<unknown>;
100
+ searchCodeBlobs(projectId: string, search: string, options?: GitLabRequestOptions): Promise<unknown>;
101
+ getRepositoryTree(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
102
+ getFileContents(projectId: string, filePath: string, ref: string, options?: GitLabRequestOptions): Promise<unknown>;
103
+ createOrUpdateFile(projectId: string, filePath: string, payload: {
104
+ branch: string;
105
+ content: string;
106
+ commit_message: string;
107
+ author_email?: string;
108
+ author_name?: string;
109
+ encoding?: "text" | "base64";
110
+ execute_filemode?: boolean;
111
+ start_branch?: string;
112
+ last_commit_id?: string;
113
+ }, options?: GitLabRequestOptions): Promise<unknown>;
114
+ pushFiles(projectId: string, payload: {
115
+ branch: string;
116
+ commit_message: string;
117
+ actions: PushFileAction[];
118
+ start_branch?: string;
119
+ author_name?: string;
120
+ author_email?: string;
121
+ force?: boolean;
122
+ }, options?: GitLabRequestOptions): Promise<unknown>;
123
+ createBranch(projectId: string, payload: {
124
+ branch: string;
125
+ ref: string;
126
+ }, options?: GitLabRequestOptions): Promise<unknown>;
127
+ getBranchDiffs(projectId: string, payload: {
128
+ from: string;
129
+ to: string;
130
+ straight?: boolean;
131
+ }, options?: GitLabRequestOptions): Promise<unknown>;
132
+ listCommits(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
133
+ getCommit(projectId: string, sha: string, options?: GitLabRequestOptions): Promise<unknown>;
134
+ getCommitDiff(projectId: string, sha: string, options?: GitLabRequestOptions): Promise<unknown>;
135
+ listMergeRequests(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
136
+ listGlobalMergeRequests(options?: GitLabRequestOptions): Promise<unknown>;
137
+ getMergeRequest(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
138
+ createMergeRequest(projectId: string, payload: {
139
+ source_branch: string;
140
+ target_branch: string;
141
+ title: string;
142
+ description?: string;
143
+ target_project_id?: string | number;
144
+ assignee_ids?: number[];
145
+ reviewer_ids?: number[];
146
+ labels?: string;
147
+ allow_collaboration?: boolean;
148
+ remove_source_branch?: boolean;
149
+ squash?: boolean;
150
+ draft?: boolean;
151
+ }, options?: GitLabRequestOptions): Promise<unknown>;
152
+ updateMergeRequest(projectId: string, mergeRequestIid: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
153
+ mergeMergeRequest(projectId: string, mergeRequestIid: string, payload?: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
154
+ getMergeRequestDiffs(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
155
+ listMergeRequestDiffs(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
156
+ listMergeRequestVersions(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
157
+ getMergeRequestVersion(projectId: string, mergeRequestIid: string, versionId: string, options?: GitLabRequestOptions): Promise<unknown>;
158
+ approveMergeRequest(projectId: string, mergeRequestIid: string, payload?: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
159
+ unapproveMergeRequest(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
160
+ getMergeRequestApprovalState(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
161
+ listMergeRequestDiscussions(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
162
+ createMergeRequestDiscussionNote(projectId: string, mergeRequestIid: string, discussionId: string, payload: {
163
+ body: string;
164
+ created_at?: string;
165
+ }, options?: GitLabRequestOptions): Promise<unknown>;
166
+ createMergeRequestThread(projectId: string, mergeRequestIid: string, payload: {
167
+ body: string;
168
+ position?: Record<string, unknown>;
169
+ created_at?: string;
170
+ }, options?: GitLabRequestOptions): Promise<unknown>;
171
+ updateMergeRequestDiscussionNote(projectId: string, mergeRequestIid: string, discussionId: string, noteId: string, payload: {
172
+ body?: string;
173
+ resolved?: boolean;
174
+ }, options?: GitLabRequestOptions): Promise<unknown>;
175
+ deleteMergeRequestDiscussionNote(projectId: string, mergeRequestIid: string, discussionId: string, noteId: string, options?: GitLabRequestOptions): Promise<unknown>;
176
+ resolveMergeRequestThread(projectId: string, mergeRequestIid: string, discussionId: string, noteId: string, resolved: boolean, options?: GitLabRequestOptions): Promise<unknown>;
177
+ listMergeRequestNotes(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
178
+ getMergeRequestNote(projectId: string, mergeRequestIid: string, noteId: string, options?: GitLabRequestOptions): Promise<unknown>;
179
+ createMergeRequestNote(projectId: string, mergeRequestIid: string, body: string, options?: GitLabRequestOptions): Promise<unknown>;
180
+ getDraftNote(projectId: string, mergeRequestIid: string, draftNoteId: string, options?: GitLabRequestOptions): Promise<unknown>;
181
+ listDraftNotes(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
182
+ createDraftNote(projectId: string, mergeRequestIid: string, payload: {
183
+ body: string;
184
+ position?: Record<string, unknown>;
185
+ resolve_discussion?: boolean;
186
+ }, options?: GitLabRequestOptions): Promise<unknown>;
187
+ updateDraftNote(projectId: string, mergeRequestIid: string, draftNoteId: string, payload: {
188
+ body?: string;
189
+ position?: Record<string, unknown>;
190
+ resolve_discussion?: boolean;
191
+ }, options?: GitLabRequestOptions): Promise<unknown>;
192
+ deleteDraftNote(projectId: string, mergeRequestIid: string, draftNoteId: string, options?: GitLabRequestOptions): Promise<unknown>;
193
+ publishDraftNote(projectId: string, mergeRequestIid: string, draftNoteId: string, options?: GitLabRequestOptions): Promise<unknown>;
194
+ bulkPublishDraftNotes(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
195
+ createNote(projectId: string, noteableType: "issue" | "merge_request", noteableIid: string, body: string, options?: GitLabRequestOptions): Promise<unknown>;
196
+ updateMergeRequestNote(projectId: string, mergeRequestIid: string, noteId: string, body: string, options?: GitLabRequestOptions): Promise<unknown>;
197
+ deleteMergeRequestNote(projectId: string, mergeRequestIid: string, noteId: string, options?: GitLabRequestOptions): Promise<unknown>;
198
+ listIssues(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
199
+ listGlobalIssues(options?: GitLabRequestOptions): Promise<unknown>;
200
+ getIssue(projectId: string, issueIid: string, options?: GitLabRequestOptions): Promise<unknown>;
201
+ createIssue(projectId: string, payload: {
202
+ title: string;
203
+ description?: string;
204
+ assignee_ids?: number[];
205
+ labels?: string;
206
+ milestone_id?: number;
207
+ due_date?: string;
208
+ confidential?: boolean;
209
+ issue_type?: string;
210
+ }, options?: GitLabRequestOptions): Promise<unknown>;
211
+ updateIssue(projectId: string, issueIid: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
212
+ deleteIssue(projectId: string, issueIid: string, options?: GitLabRequestOptions): Promise<unknown>;
213
+ myIssues(payload: {
214
+ project_id?: string;
215
+ state?: "opened" | "closed" | "all";
216
+ labels?: string;
217
+ milestone?: string;
218
+ search?: string;
219
+ created_after?: string;
220
+ created_before?: string;
221
+ updated_after?: string;
222
+ updated_before?: string;
223
+ per_page?: number;
224
+ page?: number;
225
+ scope?: string;
226
+ }, options?: GitLabRequestOptions): Promise<unknown>;
227
+ listIssueDiscussions(projectId: string, issueIid: string, options?: GitLabRequestOptions): Promise<unknown>;
228
+ createIssueNote(projectId: string, issueIid: string, payload: {
229
+ body: string;
230
+ discussion_id?: string;
231
+ created_at?: string;
232
+ }, options?: GitLabRequestOptions): Promise<unknown>;
233
+ updateIssueNote(projectId: string, issueIid: string, discussionId: string, noteId: string, payload: {
234
+ body?: string;
235
+ resolved?: boolean;
236
+ }, options?: GitLabRequestOptions): Promise<unknown>;
237
+ listIssueLinks(projectId: string, issueIid: string, options?: GitLabRequestOptions): Promise<unknown>;
238
+ getIssueLink(projectId: string, issueIid: string, issueLinkId: string, options?: GitLabRequestOptions): Promise<unknown>;
239
+ createIssueLink(projectId: string, issueIid: string, payload: {
240
+ target_project_id: string;
241
+ target_issue_iid: string;
242
+ link_type?: "relates_to" | "blocks" | "is_blocked_by";
243
+ }, options?: GitLabRequestOptions): Promise<unknown>;
244
+ deleteIssueLink(projectId: string, issueIid: string, issueLinkId: string, options?: GitLabRequestOptions): Promise<unknown>;
245
+ listWikiPages(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
246
+ getWikiPage(projectId: string, slug: string, options?: GitLabRequestOptions): Promise<unknown>;
247
+ createWikiPage(projectId: string, payload: {
248
+ title: string;
249
+ content: string;
250
+ format?: "markdown" | "rdoc" | "asciidoc" | "org";
251
+ }, options?: GitLabRequestOptions): Promise<unknown>;
252
+ updateWikiPage(projectId: string, slug: string, payload: {
253
+ content: string;
254
+ title?: string;
255
+ format?: "markdown" | "rdoc" | "asciidoc" | "org";
256
+ }, options?: GitLabRequestOptions): Promise<unknown>;
257
+ deleteWikiPage(projectId: string, slug: string, options?: GitLabRequestOptions): Promise<unknown>;
258
+ listPipelines(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
259
+ getPipeline(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
260
+ listPipelineJobs(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
261
+ listPipelineTriggerJobs(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
262
+ getPipelineJob(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
263
+ getPipelineJobOutput(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
264
+ createPipeline(projectId: string, payload: {
265
+ ref: string;
266
+ variables?: Array<{
267
+ key: string;
268
+ value: string;
269
+ variable_type?: "env_var" | "file";
270
+ }>;
271
+ }, options?: GitLabRequestOptions): Promise<unknown>;
272
+ retryPipeline(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
273
+ cancelPipeline(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
274
+ retryPipelineJob(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
275
+ cancelPipelineJob(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
276
+ playPipelineJob(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
277
+ listMilestones(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
278
+ getMilestone(projectId: string, milestoneId: string, options?: GitLabRequestOptions): Promise<unknown>;
279
+ createMilestone(projectId: string, payload: {
280
+ title: string;
281
+ description?: string;
282
+ due_date?: string;
283
+ start_date?: string;
284
+ }, options?: GitLabRequestOptions): Promise<unknown>;
285
+ updateMilestone(projectId: string, milestoneId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
286
+ deleteMilestone(projectId: string, milestoneId: string, options?: GitLabRequestOptions): Promise<unknown>;
287
+ getMilestoneIssues(projectId: string, milestoneId: string, options?: GitLabRequestOptions): Promise<unknown>;
288
+ getMilestoneMergeRequests(projectId: string, milestoneId: string, options?: GitLabRequestOptions): Promise<unknown>;
289
+ promoteMilestone(projectId: string, milestoneId: string, options?: GitLabRequestOptions): Promise<unknown>;
290
+ getMilestoneBurndownEvents(projectId: string, milestoneId: string, options?: GitLabRequestOptions): Promise<unknown>;
291
+ listReleases(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
292
+ getRelease(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
293
+ createRelease(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
294
+ updateRelease(projectId: string, tagName: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
295
+ deleteRelease(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
296
+ createReleaseEvidence(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
297
+ downloadReleaseAsset(projectId: string, tagName: string, directAssetPath: string, options?: GitLabRequestOptions): Promise<unknown>;
298
+ listLabels(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
299
+ getLabel(projectId: string, labelId: string, options?: GitLabRequestOptions): Promise<unknown>;
300
+ createLabel(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
301
+ updateLabel(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
302
+ deleteLabel(projectId: string, labelName: string, options?: GitLabRequestOptions): Promise<unknown>;
303
+ listNamespaces(options?: GitLabRequestOptions): Promise<unknown>;
304
+ listGroupIterations(groupId: string, options?: GitLabRequestOptions): Promise<unknown>;
305
+ getNamespace(namespaceIdOrPath: string, options?: GitLabRequestOptions): Promise<unknown>;
306
+ verifyNamespace(pathName: string, options?: GitLabRequestOptions): Promise<unknown>;
307
+ getUsers(options?: GitLabRequestOptions): Promise<unknown>;
308
+ listEvents(options?: GitLabRequestOptions): Promise<unknown>;
309
+ getProjectEvents(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
310
+ uploadMarkdown(projectId: string, content: string, filename: string, options?: GitLabRequestOptions): Promise<unknown>;
311
+ uploadMarkdownFile(projectId: string, filePath: string, options?: GitLabRequestOptions): Promise<unknown>;
312
+ downloadAttachment(urlOrPath: string, options?: GitLabRequestOptions): Promise<{
313
+ fileName: string;
314
+ contentType: string;
315
+ base64: string;
316
+ }>;
317
+ executeGraphql(query: string, variables: Record<string, unknown> | undefined, options?: GitLabRequestOptions): Promise<unknown>;
318
+ get(path: string, options?: GitLabRequestOptions): Promise<unknown>;
319
+ post(path: string, options?: GitLabRequestOptions): Promise<unknown>;
320
+ put(path: string, options?: GitLabRequestOptions): Promise<unknown>;
321
+ delete(path: string, options?: GitLabRequestOptions): Promise<unknown>;
322
+ private request;
323
+ private rawRequest;
324
+ private parseResponseBody;
325
+ private resolveRequestConfig;
326
+ private pickApiUrl;
327
+ private resolveAbsoluteUrl;
328
+ private resolveAttachmentUrl;
329
+ private attachAuth;
330
+ }
331
+ export declare function getEffectiveSessionAuth(defaultToken?: string, defaultApiUrl?: string): SessionAuth;