@made-by-moonlight/athene-plugin-scm-gitlab 0.9.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.
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Composio, Inc.
4
+ Copyright (c) 2026 slievr (Athene fork)
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared helpers for GitLab plugins that use the `glab` CLI.
3
+ */
4
+ export declare function glab(args: string[], hostname?: string): Promise<string>;
5
+ export declare function parseJSON<T>(raw: string, context: string): T;
6
+ export declare function extractHost(repo: string): string | undefined;
7
+ export declare function stripHost(fullPath: string): string;
8
+ //# sourceMappingURL=glab-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glab-utils.d.ts","sourceRoot":"","sources":["../src/glab-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe7E;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAM5D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI5D;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMlD"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Shared helpers for GitLab plugins that use the `glab` CLI.
3
+ */
4
+ import { execFile } from "node:child_process";
5
+ import { promisify } from "node:util";
6
+ const execFileAsync = promisify(execFile);
7
+ export async function glab(args, hostname) {
8
+ if (hostname && args[0] === "api") {
9
+ args = [args[0], "--hostname", hostname, ...args.slice(1)];
10
+ }
11
+ try {
12
+ const { stdout } = await execFileAsync("glab", args, {
13
+ maxBuffer: 10 * 1024 * 1024,
14
+ timeout: 30_000,
15
+ });
16
+ return stdout.trim();
17
+ }
18
+ catch (err) {
19
+ throw new Error(`glab ${args.slice(0, 3).join(" ")} failed: ${err.message}`, {
20
+ cause: err,
21
+ });
22
+ }
23
+ }
24
+ export function parseJSON(raw, context) {
25
+ try {
26
+ return JSON.parse(raw);
27
+ }
28
+ catch (err) {
29
+ throw new Error(`${context}: expected JSON but got: ${raw.slice(0, 200)}`, { cause: err });
30
+ }
31
+ }
32
+ export function extractHost(repo) {
33
+ const parts = repo.split("/");
34
+ const first = parts[0];
35
+ return first && first.includes(".") && parts.length >= 3 ? first : undefined;
36
+ }
37
+ export function stripHost(fullPath) {
38
+ const parts = fullPath.split("/");
39
+ if (parts[0] && parts[0].includes(".") && parts.length >= 3) {
40
+ return parts.slice(1).join("/");
41
+ }
42
+ return fullPath;
43
+ }
44
+ //# sourceMappingURL=glab-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glab-utils.js","sourceRoot":"","sources":["../src/glab-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,QAAiB;IAC1D,IAAI,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE;YACnD,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;YAC3B,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAa,GAAa,CAAC,OAAO,EAAE,EAAE;YACtF,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAI,GAAW,EAAE,OAAe;IACvD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,4BAA4B,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * scm-gitlab plugin — GitLab MRs, CI pipelines, reviews, merge readiness.
3
+ *
4
+ * Uses the `glab` CLI for GitLab API interactions.
5
+ */
6
+ import { type SCM } from "@made-by-moonlight/athene-core";
7
+ /** Test-only: reset once-per-PR activity event guards. */
8
+ export declare function _resetGitLabActivityEventDedupeForTesting(): void;
9
+ export declare const manifest: {
10
+ name: string;
11
+ slot: "scm";
12
+ description: string;
13
+ version: string;
14
+ };
15
+ export declare function create(config?: Record<string, unknown>): SCM;
16
+ declare const _default: {
17
+ manifest: {
18
+ name: string;
19
+ slot: "scm";
20
+ description: string;
21
+ version: string;
22
+ };
23
+ create: typeof create;
24
+ };
25
+ export default _default;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAIL,KAAK,GAAG,EAiBT,MAAM,gCAAgC,CAAC;AAuBxC,0DAA0D;AAC1D,wBAAgB,yCAAyC,IAAI,IAAI,CAGhE;AAszBD,eAAO,MAAM,QAAQ;;;;;CAKpB,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,CAE5D;;;;;;;;;;AAED,wBAAgE"}
package/dist/index.js ADDED
@@ -0,0 +1,673 @@
1
+ /**
2
+ * scm-gitlab plugin — GitLab MRs, CI pipelines, reviews, merge readiness.
3
+ *
4
+ * Uses the `glab` CLI for GitLab API interactions.
5
+ */
6
+ import { createHash, timingSafeEqual } from "node:crypto";
7
+ import { CI_STATUS, recordActivityEvent, } from "@made-by-moonlight/athene-core";
8
+ import { getWebhookHeader, parseWebhookBranchRef, parseWebhookJsonObject, parseWebhookTimestamp, } from "@made-by-moonlight/athene-core/scm-webhook-utils";
9
+ import { glab, parseJSON, stripHost } from "./glab-utils.js";
10
+ const BOT_AUTHORS = new Set([
11
+ "gitlab-bot",
12
+ "ghost",
13
+ "dependabot[bot]",
14
+ "renovate[bot]",
15
+ "sast-bot",
16
+ "codeclimate[bot]",
17
+ "sonarcloud[bot]",
18
+ "snyk-bot",
19
+ ]);
20
+ const ciSummaryFailClosedEmitted = new Set();
21
+ const reviewFetchFailedEmitted = new Set();
22
+ /** Test-only: reset once-per-PR activity event guards. */
23
+ export function _resetGitLabActivityEventDedupeForTesting() {
24
+ ciSummaryFailClosedEmitted.clear();
25
+ reviewFetchFailedEmitted.clear();
26
+ }
27
+ function isBot(username) {
28
+ return (BOT_AUTHORS.has(username) || /^project_\d+_bot/.test(username) || username.endsWith("[bot]"));
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // Helpers
32
+ // ---------------------------------------------------------------------------
33
+ function repoFlag(pr) {
34
+ return `${pr.owner}/${pr.repo}`;
35
+ }
36
+ function prEventKey(pr) {
37
+ return `${repoFlag(pr)}#${pr.number}`;
38
+ }
39
+ function parseDate(val) {
40
+ if (!val)
41
+ return new Date(0);
42
+ const d = new Date(val);
43
+ return isNaN(d.getTime()) ? new Date(0) : d;
44
+ }
45
+ function extractHostFromOwner(owner) {
46
+ const parts = owner.split("/");
47
+ const first = parts[0];
48
+ return first && first.includes(".") && parts.length >= 2 ? first : undefined;
49
+ }
50
+ function encodeProjectId(owner, repo) {
51
+ return encodeURIComponent(stripHost(`${owner}/${repo}`));
52
+ }
53
+ function mapJobStatus(status) {
54
+ switch (status) {
55
+ case "pending":
56
+ case "waiting_for_resource":
57
+ case "preparing":
58
+ case "created":
59
+ case "scheduled":
60
+ case "manual":
61
+ return "pending";
62
+ case "running":
63
+ return "running";
64
+ case "success":
65
+ return "passed";
66
+ case "failed":
67
+ case "canceled":
68
+ return "failed";
69
+ case "skipped":
70
+ return "skipped";
71
+ default:
72
+ return "failed";
73
+ }
74
+ }
75
+ function mapPRState(state) {
76
+ const s = state.toLowerCase();
77
+ if (s === "merged")
78
+ return "merged";
79
+ if (s === "closed")
80
+ return "closed";
81
+ return "open";
82
+ }
83
+ function getGitLabWebhookConfig(project) {
84
+ const webhook = project.scm?.webhook;
85
+ return {
86
+ enabled: webhook?.enabled !== false,
87
+ path: webhook?.path ?? "/api/webhooks/gitlab",
88
+ secretEnvVar: webhook?.secretEnvVar,
89
+ signatureHeader: webhook?.signatureHeader ?? "x-gitlab-token",
90
+ eventHeader: webhook?.eventHeader ?? "x-gitlab-event",
91
+ deliveryHeader: webhook?.deliveryHeader ?? "x-gitlab-event-uuid",
92
+ maxBodyBytes: webhook?.maxBodyBytes,
93
+ };
94
+ }
95
+ function verifyGitLabToken(secret, providedToken) {
96
+ const toDigest = (value) => createHash("sha256").update(value).digest();
97
+ return timingSafeEqual(toDigest(secret), toDigest(providedToken));
98
+ }
99
+ function parseGitLabRepository(payload) {
100
+ const project = payload["project"];
101
+ if (!project || typeof project !== "object")
102
+ return undefined;
103
+ const projectRecord = project;
104
+ const pathWithNamespace = projectRecord["path_with_namespace"];
105
+ if (typeof pathWithNamespace === "string" && pathWithNamespace.length > 0) {
106
+ const parts = pathWithNamespace.split("/");
107
+ if (parts.length >= 2) {
108
+ const name = parts[parts.length - 1];
109
+ const owner = parts.slice(0, -1).join("/");
110
+ if (owner && name)
111
+ return { owner, name };
112
+ }
113
+ }
114
+ const namespace = typeof projectRecord["namespace"] === "string" ? projectRecord["namespace"] : undefined;
115
+ const name = typeof projectRecord["path"] === "string" ? projectRecord["path"] : undefined;
116
+ if (!namespace || !name)
117
+ return undefined;
118
+ return { owner: namespace, name };
119
+ }
120
+ function isGitLabTagRef(payload, objectAttributes) {
121
+ return (objectAttributes?.["tag"] === true ||
122
+ payload["ref_type"] === "tag" ||
123
+ payload["object_kind"] === "tag_push");
124
+ }
125
+ function parseGitLabCiBranch(payload, objectAttributes) {
126
+ const isTag = isGitLabTagRef(payload, objectAttributes);
127
+ if (isTag)
128
+ return undefined;
129
+ return parseWebhookBranchRef(payload["ref"] ?? objectAttributes?.["ref"]);
130
+ }
131
+ function parseGitLabPushBranch(payload, objectAttributes) {
132
+ const isTag = isGitLabTagRef(payload, objectAttributes);
133
+ if (isTag)
134
+ return undefined;
135
+ const refValue = payload["ref"];
136
+ return parseWebhookBranchRef(refValue);
137
+ }
138
+ function parseGitLabWebhookEvent(request, payload, config) {
139
+ const rawEventType = getWebhookHeader(request.headers, config.eventHeader);
140
+ if (!rawEventType)
141
+ return null;
142
+ const normalizedEventType = rawEventType.toLowerCase();
143
+ const deliveryId = getWebhookHeader(request.headers, config.deliveryHeader);
144
+ const repository = parseGitLabRepository(payload);
145
+ const objectAttributes = payload["object_attributes"] && typeof payload["object_attributes"] === "object"
146
+ ? payload["object_attributes"]
147
+ : undefined;
148
+ const action = typeof objectAttributes?.["action"] === "string"
149
+ ? objectAttributes["action"]
150
+ : typeof payload["action"] === "string"
151
+ ? payload["action"]
152
+ : rawEventType;
153
+ if (normalizedEventType === "merge request hook" || payload["object_kind"] === "merge_request") {
154
+ const mergeRequest = payload["object_attributes"] && typeof payload["object_attributes"] === "object"
155
+ ? payload["object_attributes"]
156
+ : undefined;
157
+ if (!mergeRequest)
158
+ return null;
159
+ return {
160
+ provider: "gitlab",
161
+ kind: "pull_request",
162
+ action,
163
+ rawEventType,
164
+ deliveryId,
165
+ repository,
166
+ prNumber: typeof mergeRequest["iid"] === "number"
167
+ ? mergeRequest["iid"]
168
+ : typeof mergeRequest["id"] === "number"
169
+ ? mergeRequest["id"]
170
+ : undefined,
171
+ branch: parseWebhookBranchRef(mergeRequest["source_branch"]),
172
+ sha: typeof mergeRequest["last_commit"] === "object" && mergeRequest["last_commit"]
173
+ ? mergeRequest["last_commit"]["id"]
174
+ : undefined,
175
+ timestamp: parseWebhookTimestamp(mergeRequest["updated_at"]),
176
+ data: payload,
177
+ };
178
+ }
179
+ if (normalizedEventType === "note hook" || payload["object_kind"] === "note") {
180
+ const mergeRequest = payload["merge_request"] && typeof payload["merge_request"] === "object"
181
+ ? payload["merge_request"]
182
+ : undefined;
183
+ const noteableType = objectAttributes?.["noteable_type"];
184
+ if (!mergeRequest || noteableType !== "MergeRequest")
185
+ return null;
186
+ return {
187
+ provider: "gitlab",
188
+ kind: "comment",
189
+ action,
190
+ rawEventType,
191
+ deliveryId,
192
+ repository,
193
+ prNumber: typeof mergeRequest["iid"] === "number" ? mergeRequest["iid"] : undefined,
194
+ branch: parseWebhookBranchRef(mergeRequest["source_branch"]),
195
+ sha: typeof mergeRequest["last_commit"] === "object" && mergeRequest["last_commit"]
196
+ ? mergeRequest["last_commit"]["id"]
197
+ : undefined,
198
+ timestamp: parseWebhookTimestamp(objectAttributes?.["updated_at"] ?? objectAttributes?.["created_at"]),
199
+ data: payload,
200
+ };
201
+ }
202
+ if (normalizedEventType === "pipeline hook" ||
203
+ normalizedEventType === "job hook" ||
204
+ payload["object_kind"] === "pipeline" ||
205
+ payload["object_kind"] === "build") {
206
+ return {
207
+ provider: "gitlab",
208
+ kind: "ci",
209
+ action,
210
+ rawEventType,
211
+ deliveryId,
212
+ repository,
213
+ prNumber: typeof payload["merge_request"] === "object" && payload["merge_request"]
214
+ ? (payload["merge_request"]["iid"] ??
215
+ payload["merge_request"]["id"])
216
+ : undefined,
217
+ branch: parseGitLabCiBranch(payload, objectAttributes),
218
+ sha: typeof payload["checkout_sha"] === "string"
219
+ ? payload["checkout_sha"]
220
+ : typeof payload["sha"] === "string"
221
+ ? payload["sha"]
222
+ : typeof objectAttributes?.["sha"] === "string"
223
+ ? objectAttributes["sha"]
224
+ : undefined,
225
+ timestamp: parseWebhookTimestamp(objectAttributes?.["finished_at"] ??
226
+ objectAttributes?.["updated_at"] ??
227
+ payload["commit_timestamp"] ??
228
+ payload["updated_at"]),
229
+ data: payload,
230
+ };
231
+ }
232
+ if (normalizedEventType === "push hook" ||
233
+ normalizedEventType === "tag push hook" ||
234
+ payload["object_kind"] === "push" ||
235
+ payload["object_kind"] === "tag_push") {
236
+ return {
237
+ provider: "gitlab",
238
+ kind: "push",
239
+ action,
240
+ rawEventType,
241
+ deliveryId,
242
+ repository,
243
+ branch: parseGitLabPushBranch(payload, objectAttributes),
244
+ sha: typeof payload["after"] === "string"
245
+ ? payload["after"]
246
+ : typeof payload["checkout_sha"] === "string"
247
+ ? payload["checkout_sha"]
248
+ : undefined,
249
+ timestamp: parseWebhookTimestamp(payload["event_created_at"] ?? payload["commit_timestamp"]),
250
+ data: payload,
251
+ };
252
+ }
253
+ return {
254
+ provider: "gitlab",
255
+ kind: "unknown",
256
+ action,
257
+ rawEventType,
258
+ deliveryId,
259
+ repository,
260
+ timestamp: parseWebhookTimestamp(objectAttributes?.["updated_at"] ?? payload["event_created_at"]),
261
+ data: payload,
262
+ };
263
+ }
264
+ function mrApiPath(pr) {
265
+ return `projects/${encodeProjectId(pr.owner, pr.repo)}/merge_requests/${pr.number}`;
266
+ }
267
+ async function fetchDiscussions(pr, hostname, context) {
268
+ const raw = await glab(["api", `${mrApiPath(pr)}/discussions?per_page=100`], hostname);
269
+ return parseJSON(raw, context);
270
+ }
271
+ // ---------------------------------------------------------------------------
272
+ // SCM implementation
273
+ // ---------------------------------------------------------------------------
274
+ function createGitLabSCM(config) {
275
+ const configHostname = typeof config?.host === "string" ? config.host : undefined;
276
+ function resolveHostname(pr) {
277
+ return configHostname ?? (pr ? extractHostFromOwner(pr.owner) : undefined);
278
+ }
279
+ return {
280
+ name: "gitlab",
281
+ async verifyWebhook(request, project) {
282
+ const webhookConfig = getGitLabWebhookConfig(project);
283
+ if (!webhookConfig.enabled) {
284
+ return { ok: false, reason: "Webhook is disabled for this project" };
285
+ }
286
+ if (request.method.toUpperCase() !== "POST") {
287
+ return { ok: false, reason: "Webhook requests must use POST" };
288
+ }
289
+ if (webhookConfig.maxBodyBytes !== undefined &&
290
+ Buffer.byteLength(request.body, "utf8") > webhookConfig.maxBodyBytes) {
291
+ return { ok: false, reason: "Webhook payload exceeds configured maxBodyBytes" };
292
+ }
293
+ const eventType = getWebhookHeader(request.headers, webhookConfig.eventHeader);
294
+ if (!eventType) {
295
+ return { ok: false, reason: `Missing ${webhookConfig.eventHeader} header` };
296
+ }
297
+ const deliveryId = getWebhookHeader(request.headers, webhookConfig.deliveryHeader);
298
+ const secretName = webhookConfig.secretEnvVar;
299
+ if (!secretName) {
300
+ return { ok: true, deliveryId, eventType };
301
+ }
302
+ const secret = process.env[secretName];
303
+ if (!secret) {
304
+ return { ok: false, reason: `Webhook secret env var ${secretName} is not configured` };
305
+ }
306
+ const providedToken = getWebhookHeader(request.headers, webhookConfig.signatureHeader);
307
+ if (!providedToken) {
308
+ return { ok: false, reason: `Missing ${webhookConfig.signatureHeader} header` };
309
+ }
310
+ if (!verifyGitLabToken(secret, providedToken)) {
311
+ return {
312
+ ok: false,
313
+ reason: "Webhook token verification failed",
314
+ deliveryId,
315
+ eventType,
316
+ };
317
+ }
318
+ return { ok: true, deliveryId, eventType };
319
+ },
320
+ async parseWebhook(request, project) {
321
+ const webhookConfig = getGitLabWebhookConfig(project);
322
+ const payload = parseWebhookJsonObject(request.body);
323
+ return parseGitLabWebhookEvent(request, payload, webhookConfig);
324
+ },
325
+ async detectPR(session, project) {
326
+ if (!session.branch || !project.repo)
327
+ return null;
328
+ const parts = project.repo.split("/");
329
+ if (parts.length < 2 || !parts[0] || !parts[1]) {
330
+ throw new Error(`Invalid repo format "${project.repo}", expected "owner/repo"`);
331
+ }
332
+ const owner = parts.slice(0, -1).join("/");
333
+ const repo = parts[parts.length - 1];
334
+ try {
335
+ const raw = await glab([
336
+ "mr",
337
+ "list",
338
+ "--source-branch",
339
+ session.branch,
340
+ "--repo",
341
+ project.repo,
342
+ "-F",
343
+ "json",
344
+ "-P",
345
+ "1",
346
+ ], resolveHostname());
347
+ const mrs = parseJSON(raw, `detectPR for branch "${session.branch}"`);
348
+ if (mrs.length === 0)
349
+ return null;
350
+ const mr = mrs[0];
351
+ return {
352
+ number: mr.iid,
353
+ url: mr.web_url,
354
+ title: mr.title,
355
+ owner,
356
+ repo,
357
+ branch: mr.source_branch,
358
+ baseBranch: mr.target_branch,
359
+ isDraft: mr.draft ?? false,
360
+ };
361
+ }
362
+ catch (err) {
363
+ console.warn(`detectPR: failed for branch "${session.branch}": ${err.message}`);
364
+ return null;
365
+ }
366
+ },
367
+ async getPRState(pr) {
368
+ const raw = await glab(["mr", "view", String(pr.number), "--repo", repoFlag(pr), "-F", "json"], resolveHostname(pr));
369
+ const data = parseJSON(raw, `getPRState for MR !${pr.number}`);
370
+ return mapPRState(data.state);
371
+ },
372
+ async getPRSummary(pr) {
373
+ const raw = await glab(["mr", "view", String(pr.number), "--repo", repoFlag(pr), "-F", "json"], resolveHostname(pr));
374
+ const data = parseJSON(raw, `getPRSummary for MR !${pr.number}`);
375
+ return {
376
+ state: mapPRState(data.state),
377
+ title: data.title ?? "",
378
+ additions: 0,
379
+ deletions: 0,
380
+ };
381
+ },
382
+ async mergePR(pr, method = "squash") {
383
+ const args = ["mr", "merge", String(pr.number), "--repo", repoFlag(pr)];
384
+ if (method === "squash")
385
+ args.push("--squash");
386
+ else if (method === "rebase")
387
+ args.push("--rebase");
388
+ args.push("-d", "-y");
389
+ await glab(args, resolveHostname(pr));
390
+ },
391
+ async closePR(pr) {
392
+ await glab(["mr", "close", String(pr.number), "--repo", repoFlag(pr)], resolveHostname(pr));
393
+ },
394
+ async getCIChecks(pr) {
395
+ try {
396
+ const apiBase = mrApiPath(pr);
397
+ const hostname = resolveHostname(pr);
398
+ const pipelinesRaw = await glab(["api", `${apiBase}/pipelines`], hostname);
399
+ const pipelines = parseJSON(pipelinesRaw, `getCIChecks pipelines for MR !${pr.number}`);
400
+ if (pipelines.length === 0)
401
+ return [];
402
+ const latestPipelineId = pipelines[0].id;
403
+ const projectId = encodeProjectId(pr.owner, pr.repo);
404
+ const jobsRaw = await glab(["api", `projects/${projectId}/pipelines/${latestPipelineId}/jobs`], hostname);
405
+ const jobs = parseJSON(jobsRaw, `getCIChecks jobs for pipeline ${latestPipelineId}`);
406
+ return jobs.map((j) => ({
407
+ name: j.name,
408
+ status: mapJobStatus(j.status),
409
+ url: j.web_url || undefined,
410
+ conclusion: j.status || undefined,
411
+ startedAt: j.started_at ? new Date(j.started_at) : undefined,
412
+ completedAt: j.finished_at ? new Date(j.finished_at) : undefined,
413
+ }));
414
+ }
415
+ catch (err) {
416
+ throw new Error("Failed to fetch CI checks", { cause: err });
417
+ }
418
+ },
419
+ async getCISummary(pr) {
420
+ let checks;
421
+ try {
422
+ checks = await this.getCIChecks(pr);
423
+ }
424
+ catch (err) {
425
+ console.warn(`getCISummary: CI check fetch failed for MR !${pr.number}: ${err.message}`);
426
+ try {
427
+ const state = await this.getPRState(pr);
428
+ if (state === "merged" || state === "closed")
429
+ return "none";
430
+ }
431
+ catch (innerErr) {
432
+ console.warn(`getCISummary: PR state fallback also failed for MR !${pr.number}: ${innerErr.message}`);
433
+ }
434
+ const eventKey = prEventKey(pr);
435
+ if (!ciSummaryFailClosedEmitted.has(eventKey)) {
436
+ ciSummaryFailClosedEmitted.add(eventKey);
437
+ const errorMessage = err instanceof Error ? err.message : String(err);
438
+ recordActivityEvent({
439
+ source: "scm",
440
+ kind: "scm.ci_summary_failclosed",
441
+ level: "warn",
442
+ summary: `getCISummary failed-closed for MR !${pr.number}`,
443
+ data: {
444
+ plugin: "scm-gitlab",
445
+ prNumber: pr.number,
446
+ prOwner: pr.owner,
447
+ prRepo: pr.repo,
448
+ errorMessage,
449
+ },
450
+ });
451
+ }
452
+ return "failing";
453
+ }
454
+ if (checks.length === 0)
455
+ return "none";
456
+ const hasFailing = checks.some((c) => c.status === "failed");
457
+ if (hasFailing)
458
+ return "failing";
459
+ const hasPending = checks.some((c) => c.status === "pending" || c.status === "running");
460
+ if (hasPending)
461
+ return "pending";
462
+ const hasPassing = checks.some((c) => c.status === "passed");
463
+ if (!hasPassing)
464
+ return "none";
465
+ return "passing";
466
+ },
467
+ async getReviews(pr) {
468
+ const hostname = resolveHostname(pr);
469
+ const reviews = [];
470
+ const approvalsRaw = await glab(["api", `${mrApiPath(pr)}/approvals`], hostname);
471
+ const approvals = parseJSON(approvalsRaw, `getReviews approvals for MR !${pr.number}`);
472
+ const approvedUsers = new Set();
473
+ for (const a of approvals.approved_by ?? []) {
474
+ const author = a.user?.username ?? "unknown";
475
+ approvedUsers.add(author);
476
+ reviews.push({ author, state: "approved", submittedAt: new Date(0) });
477
+ }
478
+ try {
479
+ const discussions = await fetchDiscussions(pr, hostname, `getReviews discussions for MR !${pr.number}`);
480
+ const requestedAuthors = new Set();
481
+ for (const d of discussions) {
482
+ const note = d.notes[0];
483
+ if (!note)
484
+ continue;
485
+ if (!note.resolvable || note.resolved)
486
+ continue;
487
+ const author = note.author?.username ?? "";
488
+ if (isBot(author) || approvedUsers.has(author) || requestedAuthors.has(author))
489
+ continue;
490
+ requestedAuthors.add(author);
491
+ reviews.push({
492
+ author,
493
+ state: "changes_requested",
494
+ submittedAt: parseDate(note.created_at),
495
+ });
496
+ }
497
+ }
498
+ catch (err) {
499
+ console.warn(`getReviews: discussions fetch failed for MR !${pr.number}: ${err.message}`);
500
+ const eventKey = prEventKey(pr);
501
+ if (!reviewFetchFailedEmitted.has(eventKey)) {
502
+ reviewFetchFailedEmitted.add(eventKey);
503
+ const errorMessage = err instanceof Error ? err.message : String(err);
504
+ recordActivityEvent({
505
+ source: "scm",
506
+ kind: "scm.review_fetch_failed",
507
+ level: "warn",
508
+ summary: `getReviews discussions fetch failed for MR !${pr.number}`,
509
+ data: {
510
+ plugin: "scm-gitlab",
511
+ prNumber: pr.number,
512
+ prOwner: pr.owner,
513
+ prRepo: pr.repo,
514
+ errorMessage,
515
+ },
516
+ });
517
+ }
518
+ }
519
+ return reviews;
520
+ },
521
+ async getReviewDecision(pr) {
522
+ const raw = await glab(["api", `${mrApiPath(pr)}/approvals`], resolveHostname(pr));
523
+ const data = parseJSON(raw, `getReviewDecision for MR !${pr.number}`);
524
+ if (data.approved)
525
+ return "approved";
526
+ if (data.approvals_left > 0)
527
+ return "pending";
528
+ return "none";
529
+ },
530
+ async getPendingComments(pr) {
531
+ const discussions = await fetchDiscussions(pr, resolveHostname(pr), `getPendingComments for MR !${pr.number}`);
532
+ const comments = [];
533
+ for (const d of discussions) {
534
+ const note = d.notes[0];
535
+ if (!note)
536
+ continue;
537
+ if (!note.resolvable || note.resolved)
538
+ continue;
539
+ if (isBot(note.author?.username ?? ""))
540
+ continue;
541
+ comments.push({
542
+ id: String(note.id),
543
+ author: note.author?.username ?? "unknown",
544
+ body: note.body,
545
+ path: note.position?.new_path || undefined,
546
+ line: note.position?.new_line ?? undefined,
547
+ isResolved: false,
548
+ createdAt: parseDate(note.created_at),
549
+ url: "",
550
+ });
551
+ }
552
+ return comments;
553
+ },
554
+ async getReviewThreads(pr) {
555
+ const hostname = resolveHostname(pr);
556
+ const discussions = await fetchDiscussions(pr, hostname, `getReviewThreads for MR !${pr.number}`);
557
+ // Unresolved threads — includes both human and bot comments (with isBot flag)
558
+ const threads = [];
559
+ for (const d of discussions) {
560
+ const note = d.notes[0];
561
+ if (!note)
562
+ continue;
563
+ if (!note.resolvable || note.resolved)
564
+ continue;
565
+ const author = note.author?.username ?? "unknown";
566
+ threads.push({
567
+ id: String(note.id),
568
+ threadId: d.id,
569
+ author,
570
+ body: note.body,
571
+ path: note.position?.new_path || undefined,
572
+ line: note.position?.new_line ?? undefined,
573
+ isResolved: false,
574
+ createdAt: parseDate(note.created_at),
575
+ url: "",
576
+ isBot: isBot(author),
577
+ });
578
+ }
579
+ // Review summaries from approvals
580
+ const reviews = [];
581
+ try {
582
+ const approvalsRaw = await glab(["api", `${mrApiPath(pr)}/approvals`], hostname);
583
+ const approvals = parseJSON(approvalsRaw, `getReviewThreads approvals for MR !${pr.number}`);
584
+ for (const a of approvals.approved_by ?? []) {
585
+ reviews.push({
586
+ author: a.user?.username ?? "unknown",
587
+ state: "APPROVED",
588
+ body: "",
589
+ submittedAt: new Date(0),
590
+ });
591
+ }
592
+ }
593
+ catch {
594
+ // Best-effort — threads are the critical data
595
+ }
596
+ return { threads, reviews };
597
+ },
598
+ async getMergeability(pr) {
599
+ const hostname = resolveHostname(pr);
600
+ const mrRaw = await glab(["mr", "view", String(pr.number), "--repo", repoFlag(pr), "-F", "json"], hostname);
601
+ const mrData = parseJSON(mrRaw, `getMergeability mr view for MR !${pr.number}`);
602
+ const state = mapPRState(mrData.state);
603
+ if (state === "merged") {
604
+ return {
605
+ mergeable: true,
606
+ ciPassing: true,
607
+ approved: true,
608
+ noConflicts: true,
609
+ blockers: [],
610
+ };
611
+ }
612
+ if (state === "closed") {
613
+ return {
614
+ mergeable: false,
615
+ ciPassing: false,
616
+ approved: false,
617
+ noConflicts: true,
618
+ blockers: ["MR is closed"],
619
+ };
620
+ }
621
+ const apiRaw = await glab(["api", mrApiPath(pr)], hostname);
622
+ const apiData = parseJSON(apiRaw, `getMergeability api for MR !${pr.number}`);
623
+ const blockers = [];
624
+ const ciStatus = await this.getCISummary(pr);
625
+ const ciPassing = ciStatus === CI_STATUS.PASSING || ciStatus === CI_STATUS.NONE;
626
+ if (!ciPassing) {
627
+ blockers.push(`CI is ${ciStatus}`);
628
+ }
629
+ const reviewDecision = await this.getReviewDecision(pr);
630
+ const approved = reviewDecision === "approved";
631
+ if (reviewDecision === "pending") {
632
+ blockers.push("Approval required");
633
+ }
634
+ const noConflicts = !apiData.has_conflicts;
635
+ if (!noConflicts) {
636
+ blockers.push("Merge conflicts");
637
+ }
638
+ if (apiData.merge_status === "cannot_be_merged" && noConflicts) {
639
+ blockers.push("Merge status: cannot be merged");
640
+ }
641
+ else if (apiData.merge_status === "checking") {
642
+ blockers.push("Merge status unknown (GitLab is computing)");
643
+ }
644
+ if (!apiData.blocking_discussions_resolved) {
645
+ blockers.push("Unresolved discussions blocking merge");
646
+ }
647
+ if (mrData.draft) {
648
+ blockers.push("MR is still a draft");
649
+ }
650
+ return {
651
+ mergeable: blockers.length === 0,
652
+ ciPassing,
653
+ approved,
654
+ noConflicts,
655
+ blockers,
656
+ };
657
+ },
658
+ };
659
+ }
660
+ // ---------------------------------------------------------------------------
661
+ // Plugin module export
662
+ // ---------------------------------------------------------------------------
663
+ export const manifest = {
664
+ name: "gitlab",
665
+ slot: "scm",
666
+ description: "SCM plugin: GitLab MRs, CI pipelines, reviews, merge readiness",
667
+ version: "0.1.0",
668
+ };
669
+ export function create(config) {
670
+ return createGitLabSCM(config);
671
+ }
672
+ export default { manifest, create };
673
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@made-by-moonlight/athene-plugin-scm-gitlab",
3
+ "version": "0.9.1",
4
+ "description": "SCM plugin: GitLab (MRs, CI, reviews)",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./glab-utils": {
15
+ "types": "./dist/glab-utils.d.ts",
16
+ "import": "./dist/glab-utils.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/slievr/Athene.git",
25
+ "directory": "packages/plugins/scm-gitlab"
26
+ },
27
+ "homepage": "https://github.com/slievr/Athene",
28
+ "bugs": {
29
+ "url": "https://github.com/slievr/Athene/issues"
30
+ },
31
+ "engines": {
32
+ "node": ">=20.0.0"
33
+ },
34
+ "dependencies": {
35
+ "@made-by-moonlight/athene-core": "0.9.1"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^25.2.3",
39
+ "typescript": "^5.7.0",
40
+ "vitest": "^3.0.0"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "typecheck": "tsc --noEmit",
48
+ "test": "vitest run",
49
+ "clean": "rm -rf dist"
50
+ }
51
+ }