@gitlab/opencode-gitlab-plugin 1.5.6 → 1.5.8
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/CHANGELOG.md +14 -0
- package/README.md +30 -35
- package/dist/gitlab-opencode-gitlab-plugin-1.5.8.tgz +0 -0
- package/dist/index.js +144 -131
- package/package.json +1 -1
- package/dist/gitlab-opencode-gitlab-plugin-1.5.6.tgz +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [1.5.8](https://gitlab.com/gitlab-org/editor-extensions/opencode-gitlab-plugin/compare/v1.5.7...v1.5.8) (2026-02-03)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### ♻️ Code Refactoring
|
|
9
|
+
|
|
10
|
+
* consolidate MR details, CI lint, and todo tools ([46d830f](https://gitlab.com/gitlab-org/editor-extensions/opencode-gitlab-plugin/commit/46d830fd6d9fabf851d7f6e8cc00836e55c7f266))
|
|
11
|
+
|
|
12
|
+
## [1.5.7](https://gitlab.com/gitlab-org/editor-extensions/opencode-gitlab-plugin/compare/v1.5.6...v1.5.7) (2026-02-03)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### ♻️ Code Refactoring
|
|
16
|
+
|
|
17
|
+
* consolidate epic issue management tools into unified interface ([b8708d7](https://gitlab.com/gitlab-org/editor-extensions/opencode-gitlab-plugin/commit/b8708d7fa65e4fcc5fda0e46daaf2391d8bbc094))
|
|
18
|
+
|
|
5
19
|
## [1.5.6](https://gitlab.com/gitlab-org/editor-extensions/opencode-gitlab-plugin/compare/v1.5.5...v1.5.6) (2026-02-03)
|
|
6
20
|
|
|
7
21
|
|
package/README.md
CHANGED
|
@@ -287,9 +287,9 @@ Or for API tokens:
|
|
|
287
287
|
|
|
288
288
|
## 🛠️ Available Tools
|
|
289
289
|
|
|
290
|
-
The plugin provides **
|
|
290
|
+
The plugin provides **64 tools** organized into the following categories:
|
|
291
291
|
|
|
292
|
-
### Merge Request Tools (
|
|
292
|
+
### Merge Request Tools (8 tools)
|
|
293
293
|
|
|
294
294
|
| Tool | Description |
|
|
295
295
|
| --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -298,8 +298,7 @@ The plugin provides **69 tools** organized into the following categories:
|
|
|
298
298
|
| `gitlab_create_merge_request` | Create a new merge request |
|
|
299
299
|
| `gitlab_update_merge_request` | Update merge request title, description, state, assignees, reviewers, and labels |
|
|
300
300
|
| `gitlab_get_mr_changes` | Get file changes/diffs for a merge request |
|
|
301
|
-
| `
|
|
302
|
-
| `gitlab_get_mr_pipelines` | Get all pipelines for a merge request |
|
|
301
|
+
| `gitlab_get_mr_details` | Get additional MR details (commits or pipelines) with detail_type parameter |
|
|
303
302
|
| `gitlab_list_merge_request_diffs` | List file diffs with pagination support for large changesets |
|
|
304
303
|
| `gitlab_set_mr_auto_merge` | Enable auto-merge (MWPS) using GraphQL API when pipeline succeeds |
|
|
305
304
|
|
|
@@ -311,30 +310,27 @@ The plugin provides **69 tools** organized into the following categories:
|
|
|
311
310
|
| `gitlab_get_issue` | Get issue details including state, author, assignees, labels, and comments |
|
|
312
311
|
| `gitlab_list_issues` | List issues with filtering by state, labels, assignee, and milestone |
|
|
313
312
|
|
|
314
|
-
### Epic Tools (
|
|
315
|
-
|
|
316
|
-
| Tool
|
|
317
|
-
|
|
|
318
|
-
| `gitlab_get_epic`
|
|
319
|
-
| `gitlab_list_epics`
|
|
320
|
-
| `gitlab_create_epic`
|
|
321
|
-
| `gitlab_update_epic`
|
|
322
|
-
| `
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
|
329
|
-
|
|
|
330
|
-
| `
|
|
331
|
-
| `
|
|
332
|
-
| `
|
|
333
|
-
| `
|
|
334
|
-
| `
|
|
335
|
-
| `gitlab_get_pipeline_failing_jobs` | Get only failed jobs for easier debugging |
|
|
336
|
-
| `gitlab_lint_ci_config` | Validate CI/CD YAML configuration with project context |
|
|
337
|
-
| `gitlab_lint_existing_ci_config` | Validate existing .gitlab-ci.yml from repository |
|
|
313
|
+
### Epic Tools (5 tools)
|
|
314
|
+
|
|
315
|
+
| Tool | Description |
|
|
316
|
+
| --------------------------- | ----------------------------------------------------------------------------- |
|
|
317
|
+
| `gitlab_get_epic` | Get epic details with title, description, state, dates, and associated issues |
|
|
318
|
+
| `gitlab_list_epics` | List epics with filtering by state, author, and labels |
|
|
319
|
+
| `gitlab_create_epic` | Create a new epic in a group |
|
|
320
|
+
| `gitlab_update_epic` | Update epic title, description, labels, dates, and state |
|
|
321
|
+
| `gitlab_manage_epic_issues` | Manage issues linked to an epic (list, add, remove) with action parameter |
|
|
322
|
+
|
|
323
|
+
### Pipeline Tools (7 tools)
|
|
324
|
+
|
|
325
|
+
| Tool | Description |
|
|
326
|
+
| ---------------------------------- | ------------------------------------------------------------------------------- |
|
|
327
|
+
| `gitlab_list_pipelines` | List pipelines with filtering by status, ref, and username |
|
|
328
|
+
| `gitlab_get_pipeline` | Get pipeline details with jobs and status |
|
|
329
|
+
| `gitlab_list_pipeline_jobs` | List all jobs in a pipeline with optional scope filtering |
|
|
330
|
+
| `gitlab_get_job_log` | Get the log output of a specific CI job |
|
|
331
|
+
| `gitlab_retry_job` | Retry a failed or canceled job |
|
|
332
|
+
| `gitlab_get_pipeline_failing_jobs` | Get only failed jobs for easier debugging |
|
|
333
|
+
| `gitlab_lint_ci_config` | Validate CI/CD YAML config with mode parameter (content or existing repository) |
|
|
338
334
|
|
|
339
335
|
### Repository Tools (7 tools)
|
|
340
336
|
|
|
@@ -381,14 +377,13 @@ The plugin provides **69 tools** organized into the following categories:
|
|
|
381
377
|
|
|
382
378
|
**Note**: All GraphQL-based security tools include automatic GID (Global ID) format validation.
|
|
383
379
|
|
|
384
|
-
### TODO Tools (
|
|
380
|
+
### TODO Tools (3 tools)
|
|
385
381
|
|
|
386
|
-
| Tool
|
|
387
|
-
|
|
|
388
|
-
| `gitlab_list_todos`
|
|
389
|
-
| `gitlab_mark_todo_done`
|
|
390
|
-
| `
|
|
391
|
-
| `gitlab_get_todo_count` | Get count of pending TODOs (GraphQL) |
|
|
382
|
+
| Tool | Description |
|
|
383
|
+
| ----------------------- | ------------------------------------------------------ |
|
|
384
|
+
| `gitlab_list_todos` | List TODO items with cursor-based pagination (GraphQL) |
|
|
385
|
+
| `gitlab_mark_todo_done` | Mark TODOs as done with action parameter (one or all) |
|
|
386
|
+
| `gitlab_get_todo_count` | Get count of pending TODOs (GraphQL) |
|
|
392
387
|
|
|
393
388
|
### Project & User Tools (3 tools)
|
|
394
389
|
|
|
Binary file
|
package/dist/index.js
CHANGED
|
@@ -2155,30 +2155,33 @@ Can update title, description, state, assignees, reviewers, labels, and more.`,
|
|
|
2155
2155
|
return JSON.stringify(mr, null, 2);
|
|
2156
2156
|
}
|
|
2157
2157
|
}),
|
|
2158
|
-
|
|
2159
|
-
description: `Get
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
return JSON.stringify(commits, null, 2);
|
|
2169
|
-
}
|
|
2170
|
-
}),
|
|
2171
|
-
gitlab_get_mr_pipelines: tool({
|
|
2172
|
-
description: `Get the list of pipelines for a merge request.
|
|
2173
|
-
Returns all pipelines that ran for the merge request.`,
|
|
2158
|
+
gitlab_get_mr_details: tool({
|
|
2159
|
+
description: `Get additional details for a merge request.
|
|
2160
|
+
|
|
2161
|
+
Detail types:
|
|
2162
|
+
- commits: List all commits in the MR
|
|
2163
|
+
- pipelines: List all pipelines that ran for the MR
|
|
2164
|
+
|
|
2165
|
+
Examples:
|
|
2166
|
+
- Get commits: detail_type="commits", project_id="group/project", mr_iid=123
|
|
2167
|
+
- Get pipelines: detail_type="pipelines", project_id="group/project", mr_iid=123`,
|
|
2174
2168
|
args: {
|
|
2169
|
+
detail_type: z.enum(["commits", "pipelines"]).describe("Type of details to fetch"),
|
|
2175
2170
|
project_id: z.string().describe("The project ID or URL-encoded path"),
|
|
2176
2171
|
mr_iid: z.number().describe("The internal ID of the merge request")
|
|
2177
2172
|
},
|
|
2178
2173
|
execute: async (args, _ctx) => {
|
|
2179
2174
|
const client = getGitLabClient();
|
|
2180
|
-
|
|
2181
|
-
|
|
2175
|
+
switch (args.detail_type) {
|
|
2176
|
+
case "commits": {
|
|
2177
|
+
const commits = await client.getMrCommits(args.project_id, args.mr_iid);
|
|
2178
|
+
return JSON.stringify(commits, null, 2);
|
|
2179
|
+
}
|
|
2180
|
+
case "pipelines": {
|
|
2181
|
+
const pipelines = await client.getMrPipelines(args.project_id, args.mr_iid);
|
|
2182
|
+
return JSON.stringify(pipelines, null, 2);
|
|
2183
|
+
}
|
|
2184
|
+
}
|
|
2182
2185
|
}
|
|
2183
2186
|
}),
|
|
2184
2187
|
gitlab_list_merge_request_diffs: tool({
|
|
@@ -2309,6 +2312,9 @@ Can filter by state, labels, assignee, milestone.`,
|
|
|
2309
2312
|
// src/tools/epics.ts
|
|
2310
2313
|
import { tool as tool3 } from "@opencode-ai/plugin";
|
|
2311
2314
|
var z3 = tool3.schema;
|
|
2315
|
+
function validationError(message) {
|
|
2316
|
+
return JSON.stringify({ error: message }, null, 2);
|
|
2317
|
+
}
|
|
2312
2318
|
var epicTools = {
|
|
2313
2319
|
gitlab_get_epic: tool3({
|
|
2314
2320
|
description: `Get details of a specific epic by group and epic IID.
|
|
@@ -2402,49 +2408,55 @@ Can update title, description, labels, dates, state, and confidentiality.`,
|
|
|
2402
2408
|
return JSON.stringify(epic, null, 2);
|
|
2403
2409
|
}
|
|
2404
2410
|
}),
|
|
2405
|
-
|
|
2406
|
-
description: `
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
description: `Link an existing issue to an epic.
|
|
2420
|
-
The issue can be from any project within the group hierarchy.`,
|
|
2421
|
-
args: {
|
|
2422
|
-
group_id: z3.string().describe("The group ID or URL-encoded path"),
|
|
2423
|
-
epic_iid: z3.number().describe("The internal ID of the epic"),
|
|
2424
|
-
issue_id: z3.number().describe("The global ID of the issue to add")
|
|
2425
|
-
},
|
|
2426
|
-
execute: async (args, _ctx) => {
|
|
2427
|
-
const client = getGitLabClient();
|
|
2428
|
-
const result = await client.addIssueToEpic(args.group_id, args.epic_iid, args.issue_id);
|
|
2429
|
-
return JSON.stringify(result, null, 2);
|
|
2430
|
-
}
|
|
2431
|
-
}),
|
|
2432
|
-
gitlab_remove_issue_from_epic: tool3({
|
|
2433
|
-
description: `Unlink an issue from an epic.
|
|
2434
|
-
Removes the association between the issue and the epic.`,
|
|
2411
|
+
gitlab_manage_epic_issues: tool3({
|
|
2412
|
+
description: `Manage issues linked to a GitLab epic.
|
|
2413
|
+
|
|
2414
|
+
Actions:
|
|
2415
|
+
- list: Get all issues associated with the epic
|
|
2416
|
+
- add: Link an existing issue to the epic (issue can be from any project within the group hierarchy)
|
|
2417
|
+
- remove: Unlink an issue from the epic
|
|
2418
|
+
|
|
2419
|
+
Examples:
|
|
2420
|
+
- List issues: action="list", group_id="gitlab-org", epic_iid=123
|
|
2421
|
+
- Add issue: action="add", group_id="gitlab-org", epic_iid=123, issue_id=456
|
|
2422
|
+
- Remove issue: action="remove", group_id="gitlab-org", epic_iid=123, epic_issue_id=789
|
|
2423
|
+
|
|
2424
|
+
Note: The epic_issue_id (for remove) is the ID of the epic-issue association, which can be obtained from the list action response.`,
|
|
2435
2425
|
args: {
|
|
2426
|
+
action: z3.enum(["list", "add", "remove"]).describe("The action to perform"),
|
|
2436
2427
|
group_id: z3.string().describe("The group ID or URL-encoded path"),
|
|
2437
|
-
epic_iid: z3.number().describe("The internal ID of the epic"),
|
|
2438
|
-
|
|
2428
|
+
epic_iid: z3.number().describe("The internal ID of the epic within the group"),
|
|
2429
|
+
issue_id: z3.number().optional().describe('The global ID of the issue to add (required for "add" action)'),
|
|
2430
|
+
epic_issue_id: z3.number().optional().describe(
|
|
2431
|
+
'The ID of the epic-issue association to remove (required for "remove" action, from list response)'
|
|
2432
|
+
)
|
|
2439
2433
|
},
|
|
2440
2434
|
execute: async (args, _ctx) => {
|
|
2441
2435
|
const client = getGitLabClient();
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2436
|
+
switch (args.action) {
|
|
2437
|
+
case "list": {
|
|
2438
|
+
const issues = await client.listEpicIssues(args.group_id, args.epic_iid);
|
|
2439
|
+
return JSON.stringify(issues, null, 2);
|
|
2440
|
+
}
|
|
2441
|
+
case "add": {
|
|
2442
|
+
if (args.issue_id === void 0) {
|
|
2443
|
+
return validationError('issue_id is required for "add" action');
|
|
2444
|
+
}
|
|
2445
|
+
const result = await client.addIssueToEpic(args.group_id, args.epic_iid, args.issue_id);
|
|
2446
|
+
return JSON.stringify(result, null, 2);
|
|
2447
|
+
}
|
|
2448
|
+
case "remove": {
|
|
2449
|
+
if (args.epic_issue_id === void 0) {
|
|
2450
|
+
return validationError('epic_issue_id is required for "remove" action');
|
|
2451
|
+
}
|
|
2452
|
+
const result = await client.removeIssueFromEpic(
|
|
2453
|
+
args.group_id,
|
|
2454
|
+
args.epic_iid,
|
|
2455
|
+
args.epic_issue_id
|
|
2456
|
+
);
|
|
2457
|
+
return JSON.stringify(result, null, 2);
|
|
2458
|
+
}
|
|
2459
|
+
}
|
|
2448
2460
|
}
|
|
2449
2461
|
})
|
|
2450
2462
|
};
|
|
@@ -2550,66 +2562,58 @@ This validates the configuration in the context of the project, including:
|
|
|
2550
2562
|
- Optionally simulating pipeline creation (dry_run)
|
|
2551
2563
|
- Optionally including the list of jobs that would be created
|
|
2552
2564
|
|
|
2565
|
+
Modes:
|
|
2566
|
+
- content: Validate provided YAML content (requires 'content' parameter)
|
|
2567
|
+
- existing: Validate the existing .gitlab-ci.yml from the repository
|
|
2568
|
+
|
|
2553
2569
|
Returns validation result with:
|
|
2554
2570
|
- valid: boolean indicating if configuration is valid
|
|
2555
2571
|
- errors: array of error messages
|
|
2556
2572
|
- warnings: array of warning messages
|
|
2557
2573
|
- merged_yaml: the final merged YAML after processing includes (optional)
|
|
2558
|
-
-
|
|
2574
|
+
- includes: list of included files (for existing mode)
|
|
2575
|
+
- jobs: list of jobs that would be created (optional, requires include_jobs=true)
|
|
2576
|
+
|
|
2577
|
+
Examples:
|
|
2578
|
+
- Validate content: mode="content", project_id="group/project", content="stages: [build]..."
|
|
2579
|
+
- Validate existing: mode="existing", project_id="group/project"`,
|
|
2559
2580
|
args: {
|
|
2581
|
+
mode: z4.enum(["content", "existing"]).describe('Validation mode: "content" for provided YAML, "existing" for repo file'),
|
|
2560
2582
|
project_id: z4.string().describe("The project ID or URL-encoded path"),
|
|
2561
|
-
content: z4.string().describe(
|
|
2583
|
+
content: z4.string().optional().describe('The CI/CD configuration content (YAML as string) - required for mode="content"'),
|
|
2562
2584
|
dry_run: z4.boolean().optional().describe("Run pipeline creation simulation instead of just static check (default: false)"),
|
|
2563
2585
|
include_jobs: z4.boolean().optional().describe("Include list of jobs that would be created in the response (default: false)"),
|
|
2564
2586
|
ref: z4.string().optional().describe(
|
|
2565
2587
|
"Branch or tag context to use for validation (defaults to project default branch)"
|
|
2566
|
-
)
|
|
2567
|
-
},
|
|
2568
|
-
execute: async (args, _ctx) => {
|
|
2569
|
-
const client = getGitLabClient();
|
|
2570
|
-
const result = await client.lintCiConfig(args.project_id, args.content, {
|
|
2571
|
-
dry_run: args.dry_run,
|
|
2572
|
-
include_jobs: args.include_jobs,
|
|
2573
|
-
ref: args.ref
|
|
2574
|
-
});
|
|
2575
|
-
return JSON.stringify(result, null, 2);
|
|
2576
|
-
}
|
|
2577
|
-
}),
|
|
2578
|
-
gitlab_lint_existing_ci_config: tool4({
|
|
2579
|
-
description: `Validate an existing .gitlab-ci.yml configuration from the repository.
|
|
2580
|
-
This validates the configuration in the context of the project, including:
|
|
2581
|
-
- Using the project's CI/CD variables
|
|
2582
|
-
- Searching the project's files for include:local entries
|
|
2583
|
-
- Optionally simulating pipeline creation (dry_run)
|
|
2584
|
-
- Optionally including the list of jobs that would be created
|
|
2585
|
-
|
|
2586
|
-
Returns validation result with:
|
|
2587
|
-
- valid: boolean indicating if configuration is valid
|
|
2588
|
-
- errors: array of error messages
|
|
2589
|
-
- warnings: array of warning messages
|
|
2590
|
-
- merged_yaml: the final merged YAML after processing includes (optional)
|
|
2591
|
-
- includes: list of included files with their locations (optional)
|
|
2592
|
-
- jobs: list of jobs that would be created (optional, requires include_jobs=true)`,
|
|
2593
|
-
args: {
|
|
2594
|
-
project_id: z4.string().describe("The project ID or URL-encoded path"),
|
|
2595
|
-
content_ref: z4.string().optional().describe(
|
|
2596
|
-
"Commit SHA, branch or tag to get CI config from (defaults to project default branch)"
|
|
2597
2588
|
),
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
),
|
|
2602
|
-
include_jobs: z4.boolean().optional().describe("Include list of jobs that would be created in the response (default: false)")
|
|
2589
|
+
content_ref: z4.string().optional().describe(
|
|
2590
|
+
'For mode="existing": Commit SHA, branch or tag to get CI config from (defaults to project default branch)'
|
|
2591
|
+
)
|
|
2603
2592
|
},
|
|
2604
2593
|
execute: async (args, _ctx) => {
|
|
2605
2594
|
const client = getGitLabClient();
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2595
|
+
switch (args.mode) {
|
|
2596
|
+
case "content": {
|
|
2597
|
+
if (!args.content) {
|
|
2598
|
+
return JSON.stringify({ error: 'content is required when mode is "content"' }, null, 2);
|
|
2599
|
+
}
|
|
2600
|
+
const result = await client.lintCiConfig(args.project_id, args.content, {
|
|
2601
|
+
dry_run: args.dry_run,
|
|
2602
|
+
include_jobs: args.include_jobs,
|
|
2603
|
+
ref: args.ref
|
|
2604
|
+
});
|
|
2605
|
+
return JSON.stringify(result, null, 2);
|
|
2606
|
+
}
|
|
2607
|
+
case "existing": {
|
|
2608
|
+
const result = await client.lintExistingCiConfig(args.project_id, {
|
|
2609
|
+
content_ref: args.content_ref,
|
|
2610
|
+
dry_run: args.dry_run,
|
|
2611
|
+
dry_run_ref: args.ref,
|
|
2612
|
+
include_jobs: args.include_jobs
|
|
2613
|
+
});
|
|
2614
|
+
return JSON.stringify(result, null, 2);
|
|
2615
|
+
}
|
|
2616
|
+
}
|
|
2613
2617
|
}
|
|
2614
2618
|
})
|
|
2615
2619
|
};
|
|
@@ -2746,7 +2750,7 @@ var SPECIALIZED_SCOPES = [
|
|
|
2746
2750
|
var ALL_SCOPES = [...GENERIC_SEARCH_SCOPES, ...SPECIALIZED_SCOPES];
|
|
2747
2751
|
var REF_SUPPORTED_SCOPES = ["commits", "wiki_blobs"];
|
|
2748
2752
|
var STATE_SUPPORTED_SCOPES = ["milestones"];
|
|
2749
|
-
function
|
|
2753
|
+
function validationError2(param, scope) {
|
|
2750
2754
|
return new Error(`Missing required parameter: '${param}' is required for scope '${scope}'`);
|
|
2751
2755
|
}
|
|
2752
2756
|
function invalidParamError(param, validScopes) {
|
|
@@ -2757,10 +2761,10 @@ function invalidParamError(param, validScopes) {
|
|
|
2757
2761
|
function validateSearchParams(scope, args) {
|
|
2758
2762
|
switch (scope) {
|
|
2759
2763
|
case "notes":
|
|
2760
|
-
if (!args.project_id) throw
|
|
2764
|
+
if (!args.project_id) throw validationError2("project_id", scope);
|
|
2761
2765
|
break;
|
|
2762
2766
|
case "group_projects":
|
|
2763
|
-
if (!args.group_id) throw
|
|
2767
|
+
if (!args.group_id) throw validationError2("group_id", scope);
|
|
2764
2768
|
break;
|
|
2765
2769
|
}
|
|
2766
2770
|
if (args.ref && !REF_SUPPORTED_SCOPES.includes(scope)) {
|
|
@@ -3202,25 +3206,34 @@ Use 'before' with the 'startCursor' from pageInfo to get the previous page.`,
|
|
|
3202
3206
|
}
|
|
3203
3207
|
}),
|
|
3204
3208
|
gitlab_mark_todo_done: tool9({
|
|
3205
|
-
description: `Mark
|
|
3206
|
-
|
|
3209
|
+
description: `Mark TODO items as done.
|
|
3210
|
+
|
|
3211
|
+
Actions:
|
|
3212
|
+
- one: Mark a specific TODO item as done (requires todo_id)
|
|
3213
|
+
- all: Mark all pending TODO items as done
|
|
3214
|
+
|
|
3215
|
+
Examples:
|
|
3216
|
+
- Mark one: action="one", todo_id=123
|
|
3217
|
+
- Mark all: action="all"`,
|
|
3207
3218
|
args: {
|
|
3208
|
-
|
|
3219
|
+
action: z9.enum(["one", "all"]).describe('Action to perform: "one" for single TODO, "all" for all TODOs'),
|
|
3220
|
+
todo_id: z9.number().optional().describe('The ID of the TODO item (required for action="one")')
|
|
3209
3221
|
},
|
|
3210
3222
|
execute: async (args, _ctx) => {
|
|
3211
3223
|
const client = getGitLabClient();
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
+
switch (args.action) {
|
|
3225
|
+
case "one": {
|
|
3226
|
+
if (args.todo_id === void 0) {
|
|
3227
|
+
return JSON.stringify({ error: 'todo_id is required when action is "one"' }, null, 2);
|
|
3228
|
+
}
|
|
3229
|
+
const result = await client.markTodoAsDone(args.todo_id);
|
|
3230
|
+
return JSON.stringify(result, null, 2);
|
|
3231
|
+
}
|
|
3232
|
+
case "all": {
|
|
3233
|
+
const result = await client.markAllTodosAsDone();
|
|
3234
|
+
return JSON.stringify(result, null, 2);
|
|
3235
|
+
}
|
|
3236
|
+
}
|
|
3224
3237
|
}
|
|
3225
3238
|
}),
|
|
3226
3239
|
gitlab_get_todo_count: tool9({
|
|
@@ -3696,7 +3709,7 @@ import { tool as tool13 } from "@opencode-ai/plugin";
|
|
|
3696
3709
|
var z13 = tool13.schema;
|
|
3697
3710
|
var VALID_LIST_CREATE_TYPES = ["merge_request", "issue", "epic", "snippet"];
|
|
3698
3711
|
var VALID_GET_NOTE_TYPES = ["issue", "epic"];
|
|
3699
|
-
function
|
|
3712
|
+
function validationError3(param, resourceType) {
|
|
3700
3713
|
return new Error(
|
|
3701
3714
|
`Missing required parameter: '${param}' is required for resource_type '${resourceType}'`
|
|
3702
3715
|
);
|
|
@@ -3710,16 +3723,16 @@ function validateListCreateParams(resourceType, args) {
|
|
|
3710
3723
|
switch (resourceType) {
|
|
3711
3724
|
case "merge_request":
|
|
3712
3725
|
case "issue":
|
|
3713
|
-
if (!args.project_id) throw
|
|
3714
|
-
if (args.iid == null) throw
|
|
3726
|
+
if (!args.project_id) throw validationError3("project_id", resourceType);
|
|
3727
|
+
if (args.iid == null) throw validationError3("iid", resourceType);
|
|
3715
3728
|
break;
|
|
3716
3729
|
case "epic":
|
|
3717
|
-
if (!args.group_id) throw
|
|
3718
|
-
if (args.iid == null) throw
|
|
3730
|
+
if (!args.group_id) throw validationError3("group_id", resourceType);
|
|
3731
|
+
if (args.iid == null) throw validationError3("iid", resourceType);
|
|
3719
3732
|
break;
|
|
3720
3733
|
case "snippet":
|
|
3721
|
-
if (!args.project_id) throw
|
|
3722
|
-
if (args.snippet_id == null) throw
|
|
3734
|
+
if (!args.project_id) throw validationError3("project_id", resourceType);
|
|
3735
|
+
if (args.snippet_id == null) throw validationError3("snippet_id", resourceType);
|
|
3723
3736
|
break;
|
|
3724
3737
|
}
|
|
3725
3738
|
}
|
|
@@ -3729,15 +3742,15 @@ function validateGetNoteParams(resourceType, args) {
|
|
|
3729
3742
|
`Invalid resource_type '${resourceType}'. Must be one of: ${VALID_GET_NOTE_TYPES.join(", ")}`
|
|
3730
3743
|
);
|
|
3731
3744
|
}
|
|
3732
|
-
if (args.note_id == null) throw
|
|
3745
|
+
if (args.note_id == null) throw validationError3("note_id", resourceType);
|
|
3733
3746
|
switch (resourceType) {
|
|
3734
3747
|
case "issue":
|
|
3735
|
-
if (!args.project_id) throw
|
|
3736
|
-
if (args.iid == null) throw
|
|
3748
|
+
if (!args.project_id) throw validationError3("project_id", resourceType);
|
|
3749
|
+
if (args.iid == null) throw validationError3("iid", resourceType);
|
|
3737
3750
|
break;
|
|
3738
3751
|
case "epic":
|
|
3739
|
-
if (!args.group_id) throw
|
|
3740
|
-
if (args.iid == null) throw
|
|
3752
|
+
if (!args.group_id) throw validationError3("group_id", resourceType);
|
|
3753
|
+
if (args.iid == null) throw validationError3("iid", resourceType);
|
|
3741
3754
|
break;
|
|
3742
3755
|
}
|
|
3743
3756
|
}
|
package/package.json
CHANGED
|
Binary file
|