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.
- package/dist/agents/agents/gitlab-agent.d.ts +73 -0
- package/dist/agents/agents/gitlab-agent.d.ts.map +1 -0
- package/dist/agents/agents/gitlab-agent.js +449 -0
- package/dist/agents/agents/gitlab-agent.js.map +1 -0
- package/dist/agents/agents/gitlab-api-client.d.ts +230 -0
- package/dist/agents/agents/gitlab-api-client.d.ts.map +1 -0
- package/dist/agents/agents/gitlab-api-client.js +290 -0
- package/dist/agents/agents/gitlab-api-client.js.map +1 -0
- package/dist/agents/agents/planner.js +1 -1
- package/dist/agents/agents/planner.js.map +1 -1
- package/dist/agents/agents/pr-review-agent.d.ts +68 -0
- package/dist/agents/agents/pr-review-agent.d.ts.map +1 -0
- package/dist/agents/agents/pr-review-agent.js +504 -0
- package/dist/agents/agents/pr-review-agent.js.map +1 -0
- package/dist/agents/module-registry.d.ts.map +1 -1
- package/dist/agents/module-registry.js +14 -0
- package/dist/agents/module-registry.js.map +1 -1
- package/package.json +1 -1
|
@@ -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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"}
|