agent-nuvira 1.31.0 → 1.32.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.
@@ -0,0 +1,73 @@
1
+ /**
2
+ * GitLab Agent — Manages GitLab operations via the GitLab API.
3
+ *
4
+ * Capabilities:
5
+ * - Create merge requests with title, description, labels
6
+ * - Comment on merge requests (code review inline + summary)
7
+ * - Create and comment on issues
8
+ * - List merge requests/issues for triage
9
+ * - Check pipeline status
10
+ * - Auto-merge approved MRs
11
+ *
12
+ * Uses the existing GitAgent for local git operations (branch, commit, push)
13
+ * and delegates remote GitLab operations (MR, issues, comments) to the API client.
14
+ *
15
+ * Requires: GITLAB_TOKEN env var or explicit token.
16
+ *
17
+ * Usage in task plans:
18
+ * ```json
19
+ * { "id": "step-mr", "description": "Create merge request for fix-login branch", "agentType": "gitlab", "dependsOn": ["step-commit"] }
20
+ * ```
21
+ */
22
+ import { Agent, type AgentContext, type AgentResult } from '../agent.js';
23
+ import type { LLMCallFn } from '../agent.js';
24
+ import { GitLabAPIClient } from './gitlab-api-client.js';
25
+ /**
26
+ * GitLab Agent — Handles GitLab operations for the multi-agent pipeline.
27
+ */
28
+ export declare class GitLabAgent extends Agent {
29
+ readonly name = "GitLab";
30
+ readonly description = "Manages GitLab operations (MR, issues, comments, pipelines)";
31
+ private client;
32
+ constructor(client?: GitLabAPIClient);
33
+ execute(context: AgentContext, _callLLM: LLMCallFn): Promise<AgentResult>;
34
+ private detectOperation;
35
+ /**
36
+ * Resolve the GitLab project ID from the context or task description.
37
+ * Checks: task description → context metadata → git remote
38
+ */
39
+ private resolveProjectId;
40
+ /** Discover accessible GitLab projects */
41
+ private discoverProjects;
42
+ /** Create a merge request */
43
+ private createMergeRequest;
44
+ /** List merge requests */
45
+ private listMergeRequests;
46
+ /** Comment on a merge request */
47
+ private commentOnMR;
48
+ /** Merge a merge request */
49
+ private mergeMR;
50
+ /** Create an issue */
51
+ private createIssue;
52
+ /** List issues */
53
+ private listIssues;
54
+ /** Comment on an issue */
55
+ private commentOnIssue;
56
+ /** Check pipeline status */
57
+ private checkPipelineStatus;
58
+ /** Detect a branch name from the task description */
59
+ private detectBranch;
60
+ /** Detect the target branch from the task description */
61
+ private detectTargetBranch;
62
+ /** Generate an MR title from the description and goal */
63
+ private generateMRTitle;
64
+ /** Generate an MR description from the goal */
65
+ private generateMRDescription;
66
+ /** Extract MR number from description: "!42" or "MR 42" or "merge request 42" */
67
+ private extractMRNumber;
68
+ /** Extract issue number from description: "#42" or "issue 42" */
69
+ private extractIssueNumber;
70
+ /** Extract comment text from description */
71
+ private extractCommentText;
72
+ }
73
+ //# sourceMappingURL=gitlab-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab-agent.d.ts","sourceRoot":"","sources":["../../../src/agents/agents/gitlab-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAUzD;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,iEAAiE;IAErF,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,CAAC,EAAE,eAAe;IAK9B,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAgD/E,OAAO,CAAC,eAAe;IA2CvB;;;OAGG;YACW,gBAAgB;IA8C9B,0CAA0C;YAC5B,gBAAgB;IAkB9B,6BAA6B;YACf,kBAAkB;IAsDhC,0BAA0B;YACZ,iBAAiB;IA0B/B,iCAAiC;YACnB,WAAW;IA0BzB,4BAA4B;YACd,OAAO;IAuBrB,sBAAsB;YACR,WAAW;IA8BzB,kBAAkB;YACJ,UAAU;IAwBxB,0BAA0B;YACZ,cAAc;IAoB5B,4BAA4B;YACd,mBAAmB;IAuCjC,qDAAqD;IACrD,OAAO,CAAC,YAAY;IAepB,yDAAyD;IACzD,OAAO,CAAC,kBAAkB;IAK1B,yDAAyD;IACzD,OAAO,CAAC,eAAe;IAUvB,+CAA+C;IAC/C,OAAO,CAAC,qBAAqB;IAY7B,iFAAiF;IACjF,OAAO,CAAC,eAAe;IAevB,iEAAiE;IACjE,OAAO,CAAC,kBAAkB;IAc1B,4CAA4C;IAC5C,OAAO,CAAC,kBAAkB;CAc3B"}
@@ -0,0 +1,449 @@
1
+ /**
2
+ * GitLab Agent — Manages GitLab operations via the GitLab API.
3
+ *
4
+ * Capabilities:
5
+ * - Create merge requests with title, description, labels
6
+ * - Comment on merge requests (code review inline + summary)
7
+ * - Create and comment on issues
8
+ * - List merge requests/issues for triage
9
+ * - Check pipeline status
10
+ * - Auto-merge approved MRs
11
+ *
12
+ * Uses the existing GitAgent for local git operations (branch, commit, push)
13
+ * and delegates remote GitLab operations (MR, issues, comments) to the API client.
14
+ *
15
+ * Requires: GITLAB_TOKEN env var or explicit token.
16
+ *
17
+ * Usage in task plans:
18
+ * ```json
19
+ * { "id": "step-mr", "description": "Create merge request for fix-login branch", "agentType": "gitlab", "dependsOn": ["step-commit"] }
20
+ * ```
21
+ */
22
+ import { Agent } from '../agent.js';
23
+ import { GitLabAPIClient } from './gitlab-api-client.js';
24
+ // ─── Agent ──────────────────────────────────────────────────────────────────
25
+ /**
26
+ * GitLab Agent — Handles GitLab operations for the multi-agent pipeline.
27
+ */
28
+ export class GitLabAgent extends Agent {
29
+ name = 'GitLab';
30
+ description = 'Manages GitLab operations (MR, issues, comments, pipelines)';
31
+ client;
32
+ constructor(client) {
33
+ super();
34
+ this.client = client ?? new GitLabAPIClient();
35
+ }
36
+ async execute(context, _callLLM) {
37
+ try {
38
+ // Check if GitLab is configured
39
+ if (!this.client.hasToken()) {
40
+ return {
41
+ success: false,
42
+ summary: 'GitLab not configured',
43
+ error: 'Set GITLAB_TOKEN environment variable to use the GitLab agent',
44
+ };
45
+ }
46
+ const taskDesc = context.taskPlan.find((s) => s.agentType === 'gitlab' && s.status === 'running')?.description || context.goal;
47
+ const operation = this.detectOperation(taskDesc);
48
+ const projectId = await this.resolveProjectId(context);
49
+ switch (operation) {
50
+ case 'discover':
51
+ return this.discoverProjects();
52
+ case 'mr-create':
53
+ return this.createMergeRequest(context, taskDesc, projectId);
54
+ case 'mr-list':
55
+ return this.listMergeRequests(projectId, taskDesc);
56
+ case 'mr-comment':
57
+ return this.commentOnMR(context, taskDesc, projectId);
58
+ case 'mr-merge':
59
+ return this.mergeMR(projectId, taskDesc);
60
+ case 'issue-create':
61
+ return this.createIssue(context, taskDesc, projectId);
62
+ case 'issue-list':
63
+ return this.listIssues(projectId, taskDesc);
64
+ case 'issue-comment':
65
+ return this.commentOnIssue(context, taskDesc, projectId);
66
+ case 'pipeline-status':
67
+ return this.checkPipelineStatus(projectId, taskDesc);
68
+ default:
69
+ return this.createMergeRequest(context, taskDesc, projectId);
70
+ }
71
+ }
72
+ catch (err) {
73
+ const msg = err instanceof Error ? err.message : String(err);
74
+ return { success: false, summary: 'GitLab operation failed', error: msg };
75
+ }
76
+ }
77
+ // ─── Operation Detection ──────────────────────────────────────────────────
78
+ detectOperation(description) {
79
+ const lower = description.toLowerCase();
80
+ // Discover projects
81
+ if (lower.includes('discover') || lower.includes('list project') || lower.includes('find project'))
82
+ return 'discover';
83
+ // MR operations — use word-based matching for robustness
84
+ // Split into words for more accurate intent detection
85
+ const words = lower.split(/[\s,;:!?]+/);
86
+ const hasMr = words.some(w => w === 'mr' || w === 'mrs' || w === 'merge' || w === 'merges');
87
+ const hasMergeRequest = lower.includes('merge request') || lower.includes('merge requests');
88
+ // 'create' + 'mr'/'merge request'
89
+ if ((lower.includes('create') || lower.includes('new')) && (hasMr || hasMergeRequest))
90
+ return 'mr-create';
91
+ // 'list'/'show'/'open' + 'mr'/'merge request'
92
+ if ((lower.includes('list') || lower.includes('show') || lower.includes('open')) && (hasMr || hasMergeRequest))
93
+ return 'mr-list';
94
+ // 'merge'/'accept'/'approve' as verb + 'mr'/'merge request'
95
+ // Check if 'merge' appears as a separate word (not in 'merge request')
96
+ const mergeAsVerb = words.includes('merge') || words.includes('merged') || words.includes('merging');
97
+ if ((mergeAsVerb || lower.includes('accept') || lower.includes('approve')) && (hasMr || hasMergeRequest))
98
+ return 'mr-merge';
99
+ // 'comment'/'review' + 'mr'/'merge request'
100
+ if ((lower.includes('comment') || lower.includes('review') || lower.includes('note')) && (hasMr || hasMergeRequest))
101
+ return 'mr-comment';
102
+ // Catch-all for other mr-related descriptions
103
+ if (hasMr || hasMergeRequest)
104
+ return 'mr-create';
105
+ // Issue operations
106
+ if (lower.includes('create issue') || lower.includes('new issue'))
107
+ return 'issue-create';
108
+ if (lower.includes('comment') && lower.includes('issue'))
109
+ return 'issue-comment';
110
+ if (lower.includes('list issue') || lower.includes('open issue') || lower.includes('show issue'))
111
+ return 'issue-list';
112
+ // Pipeline
113
+ if (lower.includes('pipeline') || lower.includes('ci') || lower.includes('build status'))
114
+ return 'pipeline-status';
115
+ // Default
116
+ return 'mr-create';
117
+ }
118
+ // ─── Project Resolution ───────────────────────────────────────────────────
119
+ /**
120
+ * Resolve the GitLab project ID from the context or task description.
121
+ * Checks: task description → context metadata → git remote
122
+ */
123
+ async resolveProjectId(context) {
124
+ // Check context metadata for a pre-resolved project ID
125
+ const metaId = context.metadata?.gitlabProjectId;
126
+ if (typeof metaId === 'number')
127
+ return metaId;
128
+ if (typeof metaId === 'string' && /^\d+$/.test(metaId))
129
+ return Number(metaId);
130
+ // Check for a project path in metadata (e.g., "my-org/my-project")
131
+ const metaPath = context.metadata?.gitlabProjectPath;
132
+ if (typeof metaPath === 'string') {
133
+ try {
134
+ const project = await this.client.getProject(metaPath);
135
+ return project.id;
136
+ }
137
+ catch {
138
+ // Fall through
139
+ }
140
+ }
141
+ // Try to extract from the git remote
142
+ try {
143
+ const { execSync } = await import('node:child_process');
144
+ const remote = execSync('git remote get-url origin 2>&1', {
145
+ timeout: 10_000,
146
+ encoding: 'utf-8',
147
+ stdio: 'pipe',
148
+ }).trim();
149
+ // Parse gitlab.com URLs: git@gitlab.com:org/repo.git or https://gitlab.com/org/repo.git
150
+ const match = remote.match(/gitlab\.com[/:]([^/]+\/[^/.]+?)(?:\.git)?$/);
151
+ if (match) {
152
+ const projectPath = match[1];
153
+ try {
154
+ const project = await this.client.getProject(projectPath);
155
+ return project.id;
156
+ }
157
+ catch {
158
+ // Fall through
159
+ }
160
+ }
161
+ }
162
+ catch {
163
+ // Fall through
164
+ }
165
+ return null;
166
+ }
167
+ // ─── Operations ───────────────────────────────────────────────────────────
168
+ /** Discover accessible GitLab projects */
169
+ async discoverProjects() {
170
+ const projects = await this.client.listProjects({ membership: true });
171
+ if (projects.length === 0) {
172
+ return { success: true, summary: 'No GitLab projects found' };
173
+ }
174
+ const details = projects.map((p) => ` • ${p.nameWithNamespace} (id: ${p.id}) — ${p.webUrl}`).join('\n');
175
+ return {
176
+ success: true,
177
+ summary: `Found ${projects.length} GitLab project(s)`,
178
+ details,
179
+ };
180
+ }
181
+ /** Create a merge request */
182
+ async createMergeRequest(context, description, projectId) {
183
+ // Detect branch name from context or description
184
+ const sourceBranch = this.detectBranch(description) || context.metadata?.gitlabSourceBranch || '';
185
+ const targetBranch = this.detectTargetBranch(description) || context.metadata?.gitlabTargetBranch || 'main';
186
+ if (!sourceBranch) {
187
+ return {
188
+ success: false,
189
+ summary: 'Could not determine source branch',
190
+ error: 'Specify the branch name in the task description (e.g., "Create MR for branch fix/login")',
191
+ };
192
+ }
193
+ // Generate title and description from the goal
194
+ const title = this.generateMRTitle(description, context.goal);
195
+ const desc = this.generateMRDescription(description, context.goal);
196
+ const options = {
197
+ title,
198
+ description: desc,
199
+ sourceBranch,
200
+ targetBranch,
201
+ draft: description.toLowerCase().includes('draft') || description.toLowerCase().includes('wip'),
202
+ removeSourceBranch: description.toLowerCase().includes('delete branch') || description.toLowerCase().includes('remove branch'),
203
+ squash: description.toLowerCase().includes('squash'),
204
+ };
205
+ // Extract labels if mentioned
206
+ const labelMatch = description.match(/labels?\s*[:\s]+([a-zA-Z0-9_,\s-]+)/i);
207
+ if (labelMatch) {
208
+ options.labels = labelMatch[1].split(/[, ]+/).filter(Boolean);
209
+ }
210
+ if (projectId) {
211
+ const mr = await this.client.createMergeRequest(projectId, options);
212
+ return {
213
+ success: true,
214
+ summary: `Created MR #${mr.iid}: ${mr.title}`,
215
+ details: mr.webUrl,
216
+ };
217
+ }
218
+ // No project resolved — try to create via GitLab API using path from git remote
219
+ return {
220
+ success: false,
221
+ summary: 'Could not resolve GitLab project',
222
+ error: 'Ensure the git remote points to GitLab or set gitlabProjectId in context metadata',
223
+ };
224
+ }
225
+ /** List merge requests */
226
+ async listMergeRequests(projectId, description) {
227
+ const state = description.includes('merged') ? 'merged'
228
+ : description.includes('closed') ? 'closed'
229
+ : 'opened';
230
+ if (!projectId) {
231
+ return { success: false, summary: 'No GitLab project resolved', error: 'Set git remote or gitlabProjectId' };
232
+ }
233
+ const mrs = await this.client.listMergeRequests(projectId, { state });
234
+ if (mrs.length === 0) {
235
+ return { success: true, summary: `No ${state} merge requests found` };
236
+ }
237
+ const details = mrs.map((mr) => ` • !${mr.iid} ${mr.title} (${mr.sourceBranch} → ${mr.targetBranch}) — ${mr.state}`).join('\n');
238
+ return {
239
+ success: true,
240
+ summary: `Found ${mrs.length} ${state} merge request(s)`,
241
+ details,
242
+ };
243
+ }
244
+ /** Comment on a merge request */
245
+ async commentOnMR(context, description, projectId) {
246
+ const mrIid = this.extractMRNumber(description);
247
+ if (!projectId || !mrIid) {
248
+ return {
249
+ success: false,
250
+ summary: 'MR ID and project required',
251
+ error: 'Specify the MR number (e.g., "Comment on MR !42: LGTM")',
252
+ };
253
+ }
254
+ // Use context summary as comment if available, otherwise extract from description
255
+ const commentText = this.extractCommentText(description) || 'Reviewed by agent-nuvira.';
256
+ const note = await this.client.createMRNote(projectId, mrIid, commentText);
257
+ return {
258
+ success: true,
259
+ summary: `Commented on MR !${mrIid}`,
260
+ details: `Note #${note.id}: ${commentText.slice(0, 100)}${commentText.length > 100 ? '...' : ''}`,
261
+ };
262
+ }
263
+ /** Merge a merge request */
264
+ async mergeMR(projectId, description) {
265
+ const mrIid = this.extractMRNumber(description);
266
+ if (!projectId || !mrIid) {
267
+ return {
268
+ success: false,
269
+ summary: 'MR ID and project required',
270
+ error: 'Specify the MR number (e.g., "Merge MR !42")',
271
+ };
272
+ }
273
+ const mr = await this.client.mergeMergeRequest(projectId, mrIid, {
274
+ squash: description.toLowerCase().includes('squash'),
275
+ shouldRemoveSourceBranch: description.toLowerCase().includes('delete branch'),
276
+ });
277
+ return {
278
+ success: true,
279
+ summary: `Merged MR !${mrIid}: ${mr.title}`,
280
+ details: mr.webUrl,
281
+ };
282
+ }
283
+ /** Create an issue */
284
+ async createIssue(context, description, projectId) {
285
+ const title = this.generateMRTitle(description, context.goal);
286
+ const desc = this.generateMRDescription(description, context.goal);
287
+ const options = {
288
+ title,
289
+ description: desc,
290
+ };
291
+ const labelMatch = description.match(/labels?\s*[:\s]+([a-zA-Z0-9_,\s-]+)/i);
292
+ if (labelMatch) {
293
+ options.labels = labelMatch[1].split(/[, ]+/).filter(Boolean);
294
+ }
295
+ if (!projectId) {
296
+ return { success: false, summary: 'No GitLab project resolved', error: 'Set git remote or gitlabProjectId' };
297
+ }
298
+ const issue = await this.client.createIssue(projectId, options);
299
+ return {
300
+ success: true,
301
+ summary: `Created issue #${issue.iid}: ${issue.title}`,
302
+ details: issue.webUrl,
303
+ };
304
+ }
305
+ /** List issues */
306
+ async listIssues(projectId, description) {
307
+ const state = description.includes('closed') ? 'closed' : 'opened';
308
+ if (!projectId) {
309
+ return { success: false, summary: 'No GitLab project resolved', error: 'Set git remote or gitlabProjectId' };
310
+ }
311
+ const issues = await this.client.listIssues(projectId, { state });
312
+ if (issues.length === 0) {
313
+ return { success: true, summary: `No ${state} issues found` };
314
+ }
315
+ const details = issues.map((issue) => ` • #${issue.iid} ${issue.title} (${issue.labels.length > 0 ? issue.labels.join(', ') : 'no labels'})`).join('\n');
316
+ return {
317
+ success: true,
318
+ summary: `Found ${issues.length} ${state} issue(s)`,
319
+ details,
320
+ };
321
+ }
322
+ /** Comment on an issue */
323
+ async commentOnIssue(context, description, projectId) {
324
+ const issueIid = this.extractIssueNumber(description);
325
+ if (!projectId || !issueIid) {
326
+ return { success: false, summary: 'Issue ID and project required', error: 'Specify issue number' };
327
+ }
328
+ const commentText = this.extractCommentText(description) || 'Reviewed by agent-nuvira.';
329
+ await this.client.createIssueNote(projectId, issueIid, commentText);
330
+ return {
331
+ success: true,
332
+ summary: `Commented on issue #${issueIid}`,
333
+ };
334
+ }
335
+ /** Check pipeline status */
336
+ async checkPipelineStatus(projectId, _description) {
337
+ if (!projectId) {
338
+ return { success: false, summary: 'No GitLab project resolved', error: 'Set git remote or gitlabProjectId' };
339
+ }
340
+ // Try to get the current branch
341
+ let ref;
342
+ try {
343
+ const { execSync } = await import('node:child_process');
344
+ ref = execSync('git rev-parse --abbrev-ref HEAD', {
345
+ timeout: 10_000,
346
+ encoding: 'utf-8',
347
+ stdio: 'pipe',
348
+ }).trim();
349
+ }
350
+ catch {
351
+ // No branch found
352
+ }
353
+ const pipelines = await this.client.listPipelines(projectId, { ref, perPage: 5 });
354
+ if (pipelines.length === 0) {
355
+ return { success: true, summary: 'No pipelines found for this branch' };
356
+ }
357
+ const latest = pipelines[0];
358
+ const details = pipelines.map((p) => ` • Pipeline #${p.id} — ${p.status} (${p.ref})`).join('\n');
359
+ const statusText = latest.status === 'success' ? 'passing' : latest.status === 'failed' ? 'failing' : latest.status;
360
+ return {
361
+ success: true,
362
+ summary: `Pipeline #${latest.id}: ${statusText}`,
363
+ details,
364
+ };
365
+ }
366
+ // ─── Private Helpers ──────────────────────────────────────────────────
367
+ /** Detect a branch name from the task description */
368
+ detectBranch(description) {
369
+ // Look for branch-like patterns: feat/xxx, fix/xxx, branch: xxx
370
+ const branchPatterns = [
371
+ /(?:branch|from)\s*[:\s]+([a-zA-Z0-9_\/-]+)/i,
372
+ /(?:feat|fix|chore|refactor|docs|style|test|ci|perf)\/[a-zA-Z0-9_-]+/,
373
+ ];
374
+ for (const pattern of branchPatterns) {
375
+ const match = description.match(pattern);
376
+ if (match)
377
+ return match[1] || match[0];
378
+ }
379
+ return undefined;
380
+ }
381
+ /** Detect the target branch from the task description */
382
+ detectTargetBranch(description) {
383
+ const match = description.match(/(?:into|target|to|against)\s*[:\s]+([a-zA-Z0-9_\/-]+)/i);
384
+ return match ? match[1] : 'main';
385
+ }
386
+ /** Generate an MR title from the description and goal */
387
+ generateMRTitle(description, goal) {
388
+ // Try to find a quoted title
389
+ const quoted = description.match(/["'„]([^"'„]+)["'“]/);
390
+ if (quoted)
391
+ return quoted[1].trim();
392
+ // Use a reasonable prefix + goal summary
393
+ const goalSummary = goal.length > 80 ? goal.slice(0, 77) + '...' : goal;
394
+ return goalSummary;
395
+ }
396
+ /** Generate an MR description from the goal */
397
+ generateMRDescription(description, goal) {
398
+ const lines = [];
399
+ lines.push('## Summary');
400
+ lines.push('');
401
+ lines.push(goal);
402
+ lines.push('');
403
+ lines.push('---');
404
+ lines.push('Created by agent-nuvira 🤖');
405
+ return lines.join('\n');
406
+ }
407
+ /** Extract MR number from description: "!42" or "MR 42" or "merge request 42" */
408
+ extractMRNumber(description) {
409
+ const patterns = [
410
+ /!(\d+)/,
411
+ /MR\s*#?(\d+)/i,
412
+ /merge request\s*#?(\d+)/i,
413
+ ];
414
+ for (const pattern of patterns) {
415
+ const match = description.match(pattern);
416
+ if (match)
417
+ return parseInt(match[1], 10);
418
+ }
419
+ return null;
420
+ }
421
+ /** Extract issue number from description: "#42" or "issue 42" */
422
+ extractIssueNumber(description) {
423
+ const patterns = [
424
+ /#(\d+)/,
425
+ /issue\s*#?(\d+)/i,
426
+ ];
427
+ for (const pattern of patterns) {
428
+ const match = description.match(pattern);
429
+ if (match)
430
+ return parseInt(match[1], 10);
431
+ }
432
+ return null;
433
+ }
434
+ /** Extract comment text from description */
435
+ extractCommentText(description) {
436
+ // Look for text after "say", "comment", "message"
437
+ const patterns = [
438
+ /(?:say|comment|message)\s*[:\s]+["'„]([^"'„]+)["'“]/i,
439
+ /(?:say|comment|message)\s*[:\s]+([^"]+)$/i,
440
+ ];
441
+ for (const pattern of patterns) {
442
+ const match = description.match(pattern);
443
+ if (match)
444
+ return match[1].trim();
445
+ }
446
+ return undefined;
447
+ }
448
+ }
449
+ //# sourceMappingURL=gitlab-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitlab-agent.js","sourceRoot":"","sources":["../../../src/agents/agents/gitlab-agent.ts"],"names":[],"mappings":"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"}