gitlab-mcp 1.4.0 → 1.5.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 +45 -34
- package/dist/config/env.d.ts +7 -1
- package/dist/config/env.js +17 -0
- package/dist/config/env.js.map +1 -1
- package/dist/http-app.js +422 -17
- package/dist/http-app.js.map +1 -1
- package/dist/http.js +10 -1
- package/dist/http.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/download-token.d.ts +24 -0
- package/dist/lib/download-token.js +84 -0
- package/dist/lib/download-token.js.map +1 -0
- package/dist/lib/gitlab-client.d.ts +78 -1
- package/dist/lib/gitlab-client.js +451 -7
- package/dist/lib/gitlab-client.js.map +1 -1
- package/dist/lib/http-auth-guard.d.ts +8 -0
- package/dist/lib/http-auth-guard.js +19 -0
- package/dist/lib/http-auth-guard.js.map +1 -0
- package/dist/lib/mcp-oauth-provider.d.ts +2 -0
- package/dist/lib/mcp-oauth-provider.js +61 -0
- package/dist/lib/mcp-oauth-provider.js.map +1 -0
- package/dist/lib/oauth.d.ts +3 -1
- package/dist/lib/oauth.js +5 -5
- package/dist/lib/oauth.js.map +1 -1
- package/dist/lib/patch-helper.d.ts +13 -0
- package/dist/lib/patch-helper.js +156 -0
- package/dist/lib/patch-helper.js.map +1 -0
- package/dist/lib/request-runtime.d.ts +1 -0
- package/dist/lib/request-runtime.js +42 -4
- package/dist/lib/request-runtime.js.map +1 -1
- package/dist/lib/tool-schema.js +1 -1
- package/dist/lib/tool-schema.js.map +1 -1
- package/dist/tools/gitlab.js +2690 -52
- package/dist/tools/gitlab.js.map +1 -1
- package/docs/authentication.md +37 -8
- package/docs/configuration.md +7 -4
- package/docs/tools.md +153 -51
- package/package.json +1 -1
package/dist/http.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { createServer } from "node:http";
|
|
3
3
|
import { env } from "./config/env.js";
|
|
4
4
|
import { GitLabClient } from "./lib/gitlab-client.js";
|
|
5
|
+
import { assertSafeHttpAuthConfig } from "./lib/http-auth-guard.js";
|
|
5
6
|
import { logger } from "./lib/logger.js";
|
|
6
7
|
import { configureNetworkRuntime } from "./lib/network.js";
|
|
7
8
|
import { OutputFormatter } from "./lib/output.js";
|
|
@@ -12,15 +13,23 @@ import { setupMcpHttpApp } from "./http-app.js";
|
|
|
12
13
|
/* ------------------------------------------------------------------ */
|
|
13
14
|
/* Module entry point */
|
|
14
15
|
/* ------------------------------------------------------------------ */
|
|
16
|
+
assertSafeHttpAuthConfig(env);
|
|
15
17
|
const requestRuntime = new GitLabRequestRuntime(env, logger);
|
|
16
18
|
configureNetworkRuntime(env, logger);
|
|
19
|
+
const defaultToken = env.GITLAB_PERSONAL_ACCESS_TOKEN ?? env.GITLAB_JOB_TOKEN;
|
|
20
|
+
const defaultAuthHeader = env.GITLAB_PERSONAL_ACCESS_TOKEN
|
|
21
|
+
? undefined
|
|
22
|
+
: env.GITLAB_JOB_TOKEN
|
|
23
|
+
? "job-token"
|
|
24
|
+
: undefined;
|
|
17
25
|
const context = {
|
|
18
26
|
env,
|
|
19
27
|
logger,
|
|
20
|
-
gitlab: new GitLabClient(env.GITLAB_API_URL,
|
|
28
|
+
gitlab: new GitLabClient(env.GITLAB_API_URL, defaultToken, {
|
|
21
29
|
apiUrls: env.GITLAB_API_URLS,
|
|
22
30
|
timeoutMs: env.GITLAB_HTTP_TIMEOUT_MS,
|
|
23
31
|
maxLocalFileBytes: env.GITLAB_MAX_LOCAL_FILE_BYTES,
|
|
32
|
+
defaultAuthHeader,
|
|
24
33
|
beforeRequest: (requestContext) => requestRuntime.beforeRequest(requestContext)
|
|
25
34
|
}),
|
|
26
35
|
policy: new ToolPolicyEngine({
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC7D,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,13 +13,20 @@ async function main() {
|
|
|
13
13
|
const deniedToolsRegex = compileDeniedToolsRegex(env.GITLAB_DENIED_TOOLS_REGEX, logger);
|
|
14
14
|
configureNetworkRuntime(env, logger);
|
|
15
15
|
const requestRuntime = new GitLabRequestRuntime(env, logger);
|
|
16
|
+
const defaultToken = env.GITLAB_PERSONAL_ACCESS_TOKEN ?? env.GITLAB_JOB_TOKEN;
|
|
17
|
+
const defaultAuthHeader = env.GITLAB_PERSONAL_ACCESS_TOKEN
|
|
18
|
+
? undefined
|
|
19
|
+
: env.GITLAB_JOB_TOKEN
|
|
20
|
+
? "job-token"
|
|
21
|
+
: undefined;
|
|
16
22
|
const context = {
|
|
17
23
|
env,
|
|
18
24
|
logger,
|
|
19
|
-
gitlab: new GitLabClient(env.GITLAB_API_URL,
|
|
25
|
+
gitlab: new GitLabClient(env.GITLAB_API_URL, defaultToken, {
|
|
20
26
|
apiUrls: env.GITLAB_API_URLS,
|
|
21
27
|
timeoutMs: env.GITLAB_HTTP_TIMEOUT_MS,
|
|
22
28
|
maxLocalFileBytes: env.GITLAB_MAX_LOCAL_FILE_BYTES,
|
|
29
|
+
defaultAuthHeader,
|
|
23
30
|
beforeRequest: (requestContext) => requestRuntime.beforeRequest(requestContext)
|
|
24
31
|
}),
|
|
25
32
|
policy: new ToolPolicyEngine({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,GAAG,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;IACxF,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3D,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,GAAG,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;IACxF,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,GAAG,CAAC,4BAA4B,IAAI,GAAG,CAAC,gBAAgB,CAAC;IAC9E,MAAM,iBAAiB,GAAG,GAAG,CAAC,4BAA4B;QACxD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,GAAG,CAAC,gBAAgB;YACpB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,OAAO,GAAe;QAC1B,GAAG;QACH,MAAM;QACN,MAAM,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE;YACzD,OAAO,EAAE,GAAG,CAAC,eAAe;YAC5B,SAAS,EAAE,GAAG,CAAC,sBAAsB;YACrC,iBAAiB,EAAE,GAAG,CAAC,2BAA2B;YAClD,iBAAiB;YACjB,aAAa,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,cAAc,CAAC;SAChF,CAAC;QACF,MAAM,EAAE,IAAI,gBAAgB,CAAC;YAC3B,YAAY,EAAE,GAAG,CAAC,qBAAqB;YACvC,oBAAoB,EAAE,GAAG,CAAC,4BAA4B;YACtD,YAAY,EAAE,GAAG,CAAC,oBAAoB;YACtC,gBAAgB;YAChB,eAAe,EAAE;gBACf,IAAI,EAAE,GAAG,CAAC,eAAe;gBACzB,SAAS,EAAE,GAAG,CAAC,aAAa;gBAC5B,QAAQ,EAAE,GAAG,CAAC,YAAY;gBAC1B,OAAO,EAAE,GAAG,CAAC,WAAW;aACzB;SACF,CAAC;QACF,SAAS,EAAE,IAAI,eAAe,CAAC;YAC7B,YAAY,EAAE,GAAG,CAAC,oBAAoB;YACtC,QAAQ,EAAE,GAAG,CAAC,yBAAyB;SACxC,CAAC;QACF,mBAAmB,EAAE,IAAI;KAC1B,CAAC;IAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAE1D,MAAM,YAAY,GAAG,CAAC,MAAsB,EAAE,EAAE;QAC9C,KAAK,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,MAAsB,EACtB,MAA0C;IAE1C,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,4BAA4B,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { GitLabAuthHeader } from "../types/auth.js";
|
|
2
|
+
export interface DownloadTokenAuth {
|
|
3
|
+
header: GitLabAuthHeader;
|
|
4
|
+
token: string;
|
|
5
|
+
apiUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DownloadTokenResource {
|
|
8
|
+
type: string;
|
|
9
|
+
params: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export interface DownloadTokenPayload extends DownloadTokenAuth {
|
|
12
|
+
expiresAt: number;
|
|
13
|
+
resource: DownloadTokenResource;
|
|
14
|
+
}
|
|
15
|
+
export declare function createDownloadToken(auth: DownloadTokenAuth, resource: DownloadTokenResource, options: {
|
|
16
|
+
secret?: string;
|
|
17
|
+
ttlSeconds: number;
|
|
18
|
+
now?: number;
|
|
19
|
+
}): string;
|
|
20
|
+
export declare function decryptDownloadToken(token: string, options: {
|
|
21
|
+
secret?: string;
|
|
22
|
+
now?: number;
|
|
23
|
+
}): DownloadTokenPayload | undefined;
|
|
24
|
+
export declare function downloadTokenResourceMatches(payload: DownloadTokenPayload, resource: DownloadTokenResource): boolean;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, createHash, randomBytes } from "node:crypto";
|
|
2
|
+
export function createDownloadToken(auth, resource, options) {
|
|
3
|
+
const key = deriveDownloadTokenKey(options.secret);
|
|
4
|
+
const iv = randomBytes(12);
|
|
5
|
+
const cipher = createCipheriv("aes-256-gcm", key, iv);
|
|
6
|
+
const payload = JSON.stringify({
|
|
7
|
+
h: auth.header,
|
|
8
|
+
t: auth.token,
|
|
9
|
+
u: auth.apiUrl,
|
|
10
|
+
e: Math.floor((options.now ?? Date.now()) / 1000) + options.ttlSeconds,
|
|
11
|
+
r: resource.type,
|
|
12
|
+
p: resource.params
|
|
13
|
+
});
|
|
14
|
+
const encrypted = Buffer.concat([cipher.update(payload, "utf8"), cipher.final()]);
|
|
15
|
+
const tag = cipher.getAuthTag();
|
|
16
|
+
return Buffer.concat([iv, tag, encrypted]).toString("base64url");
|
|
17
|
+
}
|
|
18
|
+
export function decryptDownloadToken(token, options) {
|
|
19
|
+
try {
|
|
20
|
+
const bytes = Buffer.from(token, "base64url");
|
|
21
|
+
if (bytes.length < 29) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const key = deriveDownloadTokenKey(options.secret);
|
|
25
|
+
const iv = bytes.subarray(0, 12);
|
|
26
|
+
const tag = bytes.subarray(12, 28);
|
|
27
|
+
const encrypted = bytes.subarray(28);
|
|
28
|
+
const decipher = createDecipheriv("aes-256-gcm", key, iv);
|
|
29
|
+
decipher.setAuthTag(tag);
|
|
30
|
+
const raw = Buffer.concat([decipher.update(encrypted), decipher.final()]).toString("utf8");
|
|
31
|
+
const parsed = JSON.parse(raw);
|
|
32
|
+
if (!isGitLabAuthHeader(parsed.h) || typeof parsed.t !== "string") {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
if (typeof parsed.e !== "number") {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
if (Math.floor((options.now ?? Date.now()) / 1000) > parsed.e) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if (typeof parsed.r !== "string" || !isStringRecord(parsed.p)) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
header: parsed.h,
|
|
46
|
+
token: parsed.t,
|
|
47
|
+
apiUrl: typeof parsed.u === "string" ? parsed.u : undefined,
|
|
48
|
+
expiresAt: parsed.e,
|
|
49
|
+
resource: {
|
|
50
|
+
type: parsed.r,
|
|
51
|
+
params: parsed.p
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function downloadTokenResourceMatches(payload, resource) {
|
|
60
|
+
if (payload.resource.type !== resource.type) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return stableStringify(payload.resource.params) === stableStringify(resource.params);
|
|
64
|
+
}
|
|
65
|
+
function deriveDownloadTokenKey(secret) {
|
|
66
|
+
if (secret && secret.trim().length > 0) {
|
|
67
|
+
return createHash("sha256").update(secret).digest();
|
|
68
|
+
}
|
|
69
|
+
return processKey;
|
|
70
|
+
}
|
|
71
|
+
function isGitLabAuthHeader(value) {
|
|
72
|
+
return value === "authorization" || value === "private-token" || value === "job-token";
|
|
73
|
+
}
|
|
74
|
+
function isStringRecord(value) {
|
|
75
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return Object.values(value).every((item) => typeof item === "string");
|
|
79
|
+
}
|
|
80
|
+
function stableStringify(value) {
|
|
81
|
+
return JSON.stringify(Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right))));
|
|
82
|
+
}
|
|
83
|
+
const processKey = randomBytes(32);
|
|
84
|
+
//# sourceMappingURL=download-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-token.js","sourceRoot":"","sources":["../../src/lib/download-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ export interface GitLabClientOptions {
|
|
|
6
6
|
maxAttachmentBytes?: number;
|
|
7
7
|
maxLocalFileBytes?: number;
|
|
8
8
|
maxResponseBodyBytes?: number;
|
|
9
|
+
defaultAuthHeader?: GitLabAuthHeader;
|
|
9
10
|
beforeRequest?: (context: GitLabBeforeRequestContext) => Promise<GitLabBeforeRequestResult | void>;
|
|
10
11
|
}
|
|
11
12
|
export interface GitLabRequestOptions {
|
|
@@ -89,6 +90,7 @@ export declare class GitLabClient {
|
|
|
89
90
|
private readonly apiUrls;
|
|
90
91
|
private nextApiUrlIndex;
|
|
91
92
|
private readonly defaultToken?;
|
|
93
|
+
private readonly defaultAuthHeader?;
|
|
92
94
|
private readonly timeoutMs;
|
|
93
95
|
private readonly maxAttachmentBytes;
|
|
94
96
|
private readonly maxLocalFileBytes;
|
|
@@ -106,6 +108,13 @@ export declare class GitLabClient {
|
|
|
106
108
|
namespace_id?: string | number;
|
|
107
109
|
default_branch?: string;
|
|
108
110
|
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
111
|
+
createGroup(payload: {
|
|
112
|
+
name: string;
|
|
113
|
+
path: string;
|
|
114
|
+
description?: string;
|
|
115
|
+
visibility?: "private" | "internal" | "public";
|
|
116
|
+
parent_id?: number;
|
|
117
|
+
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
109
118
|
listProjectMembers(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
110
119
|
listGroupProjects(groupId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
111
120
|
forkRepository(projectId: string, payload?: {
|
|
@@ -119,9 +128,12 @@ export declare class GitLabClient {
|
|
|
119
128
|
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
120
129
|
searchProjects(search: string, limit?: number, options?: GitLabRequestOptions): Promise<unknown>;
|
|
121
130
|
searchRepositories(search: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
131
|
+
searchCode(search: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
122
132
|
searchCodeBlobs(projectId: string, search: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
133
|
+
searchGroupCodeBlobs(groupId: string, search: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
123
134
|
getRepositoryTree(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
124
135
|
getFileContents(projectId: string, filePath: string, ref: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
136
|
+
getFileBlame(projectId: string, filePath: string, ref: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
125
137
|
createOrUpdateFile(projectId: string, filePath: string, payload: {
|
|
126
138
|
branch: string;
|
|
127
139
|
content: string;
|
|
@@ -146,6 +158,9 @@ export declare class GitLabClient {
|
|
|
146
158
|
branch: string;
|
|
147
159
|
ref: string;
|
|
148
160
|
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
161
|
+
listBranches(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
162
|
+
getBranch(projectId: string, branch: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
163
|
+
deleteBranch(projectId: string, branch: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
149
164
|
getBranchDiffs(projectId: string, payload: {
|
|
150
165
|
from: string;
|
|
151
166
|
to: string;
|
|
@@ -154,9 +169,14 @@ export declare class GitLabClient {
|
|
|
154
169
|
listCommits(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
155
170
|
getCommit(projectId: string, sha: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
156
171
|
getCommitDiff(projectId: string, sha: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
172
|
+
listCommitStatuses(projectId: string, sha: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
173
|
+
createCommitStatus(projectId: string, sha: string, payload: Record<string, string | number | boolean | null | undefined>, options?: GitLabRequestOptions): Promise<unknown>;
|
|
157
174
|
listMergeRequests(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
158
175
|
listGlobalMergeRequests(options?: GitLabRequestOptions): Promise<unknown>;
|
|
159
176
|
getMergeRequest(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
177
|
+
countMergeRequestCommits(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<number>;
|
|
178
|
+
listMergeRequestCommits(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
179
|
+
listMergeRequestPipelines(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
160
180
|
createMergeRequest(projectId: string, payload: {
|
|
161
181
|
source_branch: string;
|
|
162
182
|
target_branch: string;
|
|
@@ -200,6 +220,20 @@ export declare class GitLabClient {
|
|
|
200
220
|
listMergeRequestNotes(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
201
221
|
getMergeRequestNote(projectId: string, mergeRequestIid: string, noteId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
202
222
|
createMergeRequestNote(projectId: string, mergeRequestIid: string, body: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
223
|
+
listMergeRequestEmojiReactions(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
224
|
+
createMergeRequestEmojiReaction(projectId: string, mergeRequestIid: string, name: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
225
|
+
deleteMergeRequestEmojiReaction(projectId: string, mergeRequestIid: string, awardId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
226
|
+
listMergeRequestNoteEmojiReactions(projectId: string, mergeRequestIid: string, noteId: string, payload?: {
|
|
227
|
+
discussion_id?: string;
|
|
228
|
+
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
229
|
+
createMergeRequestNoteEmojiReaction(projectId: string, mergeRequestIid: string, noteId: string, payload: {
|
|
230
|
+
name: string;
|
|
231
|
+
discussion_id?: string;
|
|
232
|
+
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
233
|
+
deleteMergeRequestNoteEmojiReaction(projectId: string, mergeRequestIid: string, noteId: string, payload: {
|
|
234
|
+
award_id: string;
|
|
235
|
+
discussion_id?: string;
|
|
236
|
+
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
203
237
|
getDraftNote(projectId: string, mergeRequestIid: string, draftNoteId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
204
238
|
listDraftNotes(projectId: string, mergeRequestIid: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
205
239
|
createDraftNote(projectId: string, mergeRequestIid: string, payload: {
|
|
@@ -247,12 +281,29 @@ export declare class GitLabClient {
|
|
|
247
281
|
page?: number;
|
|
248
282
|
scope?: string;
|
|
249
283
|
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
284
|
+
listTodos(options?: GitLabRequestOptions): Promise<unknown>;
|
|
285
|
+
markTodoDone(todoId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
286
|
+
markAllTodosDone(options?: GitLabRequestOptions): Promise<unknown>;
|
|
250
287
|
listIssueDiscussions(projectId: string, issueIid: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
251
288
|
createIssueNote(projectId: string, issueIid: string, payload: {
|
|
252
289
|
body: string;
|
|
253
290
|
discussion_id?: string;
|
|
254
291
|
created_at?: string;
|
|
255
292
|
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
293
|
+
listIssueEmojiReactions(projectId: string, issueIid: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
294
|
+
createIssueEmojiReaction(projectId: string, issueIid: string, name: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
295
|
+
deleteIssueEmojiReaction(projectId: string, issueIid: string, awardId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
296
|
+
listIssueNoteEmojiReactions(projectId: string, issueIid: string, noteId: string, payload?: {
|
|
297
|
+
discussion_id?: string;
|
|
298
|
+
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
299
|
+
createIssueNoteEmojiReaction(projectId: string, issueIid: string, noteId: string, payload: {
|
|
300
|
+
name: string;
|
|
301
|
+
discussion_id?: string;
|
|
302
|
+
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
303
|
+
deleteIssueNoteEmojiReaction(projectId: string, issueIid: string, noteId: string, payload: {
|
|
304
|
+
award_id: string;
|
|
305
|
+
discussion_id?: string;
|
|
306
|
+
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
256
307
|
updateIssueNote(projectId: string, issueIid: string, discussionId: string, noteId: string, payload: {
|
|
257
308
|
body?: string;
|
|
258
309
|
resolved?: boolean;
|
|
@@ -278,6 +329,11 @@ export declare class GitLabClient {
|
|
|
278
329
|
format?: "markdown" | "rdoc" | "asciidoc" | "org";
|
|
279
330
|
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
280
331
|
deleteWikiPage(projectId: string, slug: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
332
|
+
listGroupWikiPages(groupId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
333
|
+
getGroupWikiPage(groupId: string, slug: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
334
|
+
createGroupWikiPage(groupId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
|
|
335
|
+
updateGroupWikiPage(groupId: string, slug: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
|
|
336
|
+
deleteGroupWikiPage(groupId: string, slug: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
281
337
|
listPipelines(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
282
338
|
getPipeline(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
283
339
|
listDeployments(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
@@ -288,6 +344,8 @@ export declare class GitLabClient {
|
|
|
288
344
|
listPipelineTriggerJobs(projectId: string, pipelineId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
289
345
|
getPipelineJob(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
290
346
|
getPipelineJobOutput(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
347
|
+
validateCiLint(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
|
|
348
|
+
validateProjectCiLint(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
291
349
|
listJobArtifacts(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
292
350
|
downloadJobArtifacts(projectId: string, jobId: string, options?: GitLabRequestOptions): Promise<GitLabDownloadedFile>;
|
|
293
351
|
saveJobArtifacts(projectId: string, jobId: string, localPath?: string, options?: GitLabRequestOptions): Promise<GitLabSavedFile>;
|
|
@@ -327,7 +385,12 @@ export declare class GitLabClient {
|
|
|
327
385
|
updateRelease(projectId: string, tagName: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
|
|
328
386
|
deleteRelease(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
329
387
|
createReleaseEvidence(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
330
|
-
downloadReleaseAsset(projectId: string, tagName: string, directAssetPath: string, options?: GitLabRequestOptions): Promise<
|
|
388
|
+
downloadReleaseAsset(projectId: string, tagName: string, directAssetPath: string, options?: GitLabRequestOptions): Promise<GitLabDownloadedFile>;
|
|
389
|
+
listTags(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
390
|
+
getTag(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
391
|
+
createTag(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
|
|
392
|
+
deleteTag(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
393
|
+
getTagSignature(projectId: string, tagName: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
331
394
|
listLabels(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
332
395
|
getLabel(projectId: string, labelId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
333
396
|
createLabel(projectId: string, payload: Record<string, unknown>, options?: GitLabRequestOptions): Promise<unknown>;
|
|
@@ -338,8 +401,18 @@ export declare class GitLabClient {
|
|
|
338
401
|
getNamespace(namespaceIdOrPath: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
339
402
|
verifyNamespace(pathName: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
340
403
|
getUsers(options?: GitLabRequestOptions): Promise<unknown>;
|
|
404
|
+
getUser(userId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
405
|
+
whoami(options?: GitLabRequestOptions): Promise<unknown>;
|
|
341
406
|
listEvents(options?: GitLabRequestOptions): Promise<unknown>;
|
|
342
407
|
getProjectEvents(projectId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
408
|
+
listWebhooks(scope: {
|
|
409
|
+
projectId?: string;
|
|
410
|
+
groupId?: string;
|
|
411
|
+
}, options?: GitLabRequestOptions): Promise<unknown>;
|
|
412
|
+
listWebhookEvents(scope: {
|
|
413
|
+
projectId?: string;
|
|
414
|
+
groupId?: string;
|
|
415
|
+
}, hookId: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
343
416
|
uploadMarkdown(projectId: string, content: string, filename: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
344
417
|
uploadMarkdownFile(projectId: string, filePath: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
345
418
|
downloadAttachment(urlOrPath: string, options?: GitLabRequestOptions): Promise<GitLabDownloadedFile>;
|
|
@@ -355,9 +428,13 @@ export declare class GitLabClient {
|
|
|
355
428
|
delete(path: string, options?: GitLabRequestOptions): Promise<unknown>;
|
|
356
429
|
private request;
|
|
357
430
|
private rawRequest;
|
|
431
|
+
private parseApiResponse;
|
|
358
432
|
private parseResponseBody;
|
|
359
433
|
private resolveRequestConfig;
|
|
360
434
|
private pickApiUrl;
|
|
435
|
+
private webhookBasePath;
|
|
436
|
+
private awardEmojiPath;
|
|
437
|
+
private createAwardEmoji;
|
|
361
438
|
private resolveAbsoluteUrl;
|
|
362
439
|
private resolveAttachmentUrl;
|
|
363
440
|
private attachAuth;
|