@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 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 **69 tools** organized into the following categories:
290
+ The plugin provides **64 tools** organized into the following categories:
291
291
 
292
- ### Merge Request Tools (9 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
- | `gitlab_get_mr_commits` | Get all commits in a merge request |
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 (7 tools)
315
-
316
- | Tool | Description |
317
- | ------------------------------- | ----------------------------------------------------------------------------- |
318
- | `gitlab_get_epic` | Get epic details with title, description, state, dates, and associated issues |
319
- | `gitlab_list_epics` | List epics with filtering by state, author, and labels |
320
- | `gitlab_create_epic` | Create a new epic in a group |
321
- | `gitlab_update_epic` | Update epic title, description, labels, dates, and state |
322
- | `gitlab_list_epic_issues` | Get all issues linked to an epic |
323
- | `gitlab_add_issue_to_epic` | Link an issue to an epic |
324
- | `gitlab_remove_issue_from_epic` | Unlink an issue from an epic |
325
-
326
- ### Pipeline Tools (8 tools)
327
-
328
- | Tool | Description |
329
- | ---------------------------------- | ---------------------------------------------------------- |
330
- | `gitlab_list_pipelines` | List pipelines with filtering by status, ref, and username |
331
- | `gitlab_get_pipeline` | Get pipeline details with jobs and status |
332
- | `gitlab_list_pipeline_jobs` | List all jobs in a pipeline with optional scope filtering |
333
- | `gitlab_get_job_log` | Get the log output of a specific CI job |
334
- | `gitlab_retry_job` | Retry a failed or canceled job |
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 (4 tools)
380
+ ### TODO Tools (3 tools)
385
381
 
386
- | Tool | Description |
387
- | ---------------------------- | ------------------------------------------------------ |
388
- | `gitlab_list_todos` | List TODO items with cursor-based pagination (GraphQL) |
389
- | `gitlab_mark_todo_done` | Mark a specific TODO as completed |
390
- | `gitlab_mark_all_todos_done` | Mark all pending TODOs as completed |
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
 
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
- gitlab_get_mr_commits: tool({
2159
- description: `Get the list of commits in a merge request.
2160
- Returns all commits that are part of the merge request.`,
2161
- args: {
2162
- project_id: z.string().describe("The project ID or URL-encoded path"),
2163
- mr_iid: z.number().describe("The internal ID of the merge request")
2164
- },
2165
- execute: async (args, _ctx) => {
2166
- const client = getGitLabClient();
2167
- const commits = await client.getMrCommits(args.project_id, args.mr_iid);
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
- const pipelines = await client.getMrPipelines(args.project_id, args.mr_iid);
2181
- return JSON.stringify(pipelines, null, 2);
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
- gitlab_list_epic_issues: tool3({
2406
- description: `Get all issues associated with an epic.
2407
- Returns the list of issues that are linked to the epic.`,
2408
- args: {
2409
- group_id: z3.string().describe("The group ID or URL-encoded path"),
2410
- epic_iid: z3.number().describe("The internal ID of the epic")
2411
- },
2412
- execute: async (args, _ctx) => {
2413
- const client = getGitLabClient();
2414
- const issues = await client.listEpicIssues(args.group_id, args.epic_iid);
2415
- return JSON.stringify(issues, null, 2);
2416
- }
2417
- }),
2418
- gitlab_add_issue_to_epic: tool3({
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
- epic_issue_id: z3.number().describe("The ID of the epic-issue association (from list_epic_issues)")
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
- const result = await client.removeIssueFromEpic(
2443
- args.group_id,
2444
- args.epic_iid,
2445
- args.epic_issue_id
2446
- );
2447
- return JSON.stringify(result, null, 2);
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
- - jobs: list of jobs that would be created (optional, requires include_jobs=true)`,
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("The CI/CD configuration content (YAML as string)"),
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
- dry_run: z4.boolean().optional().describe("Run pipeline creation simulation instead of just static check (default: false)"),
2599
- dry_run_ref: z4.string().optional().describe(
2600
- "Branch or tag context to use for validation when dry_run is true (defaults to project default branch)"
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
- const result = await client.lintExistingCiConfig(args.project_id, {
2607
- content_ref: args.content_ref,
2608
- dry_run: args.dry_run,
2609
- dry_run_ref: args.dry_run_ref,
2610
- include_jobs: args.include_jobs
2611
- });
2612
- return JSON.stringify(result, null, 2);
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 validationError(param, scope) {
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 validationError("project_id", scope);
2764
+ if (!args.project_id) throw validationError2("project_id", scope);
2761
2765
  break;
2762
2766
  case "group_projects":
2763
- if (!args.group_id) throw validationError("group_id", scope);
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 a specific TODO item as done.
3206
- Use this to mark a single TODO as completed.`,
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
- todo_id: z9.number().describe("The ID of the TODO item to mark as done")
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
- const result = await client.markTodoAsDone(args.todo_id);
3213
- return JSON.stringify(result, null, 2);
3214
- }
3215
- }),
3216
- gitlab_mark_all_todos_done: tool9({
3217
- description: `Mark all TODO items as done.
3218
- Use this to mark all pending TODOs for the current user as completed.`,
3219
- args: {},
3220
- execute: async (_args, _ctx) => {
3221
- const client = getGitLabClient();
3222
- const result = await client.markAllTodosAsDone();
3223
- return JSON.stringify(result, null, 2);
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 validationError2(param, resourceType) {
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 validationError2("project_id", resourceType);
3714
- if (args.iid == null) throw validationError2("iid", resourceType);
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 validationError2("group_id", resourceType);
3718
- if (args.iid == null) throw validationError2("iid", resourceType);
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 validationError2("project_id", resourceType);
3722
- if (args.snippet_id == null) throw validationError2("snippet_id", resourceType);
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 validationError2("note_id", resourceType);
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 validationError2("project_id", resourceType);
3736
- if (args.iid == null) throw validationError2("iid", resourceType);
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 validationError2("group_id", resourceType);
3740
- if (args.iid == null) throw validationError2("iid", resourceType);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/opencode-gitlab-plugin",
3
- "version": "1.5.6",
3
+ "version": "1.5.8",
4
4
  "description": "GitLab tools plugin for OpenCode - provides GitLab API access for merge requests, issues, pipelines, and more",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",