Skip to main content

Gitlab

@webframp/gitlabv2026.09.15.1· 1d agoMODELSREPORTS
01README

Read and write GitLab data via GraphQL (REST fallback for branches and merge accept). Projects, merge requests, issues, releases, pipelines, labels, members, branches, and a cross-project review dashboard with todos. No CLI dependencies — uses native fetch with a personal access token stored in a swamp vault.

Authentication

Requires a GitLab personal access token with api scope, stored in a swamp vault.

Usage

# Create with vault-stored token
swamp model create @webframp/gitlab gitlab \
  --global-arg host=git.example.org \
  --global-arg 'token=${{ vault.get("gitlab", "TOKEN") }}'

# Read operations
swamp model method run gitlab list_projects
swamp model method run gitlab list_issues --input project=group/repo
swamp model method run gitlab list_merge_requests --input project=group/repo

# Dashboard (GraphQL)
swamp model method run gitlab list_my_merge_requests
swamp model method run gitlab list_my_merge_requests --input role=reviewer

# Write operations
swamp model method run gitlab create_issue --input project=group/repo --input title="New issue"
swamp model method run gitlab add_issue_note --input project=group/repo --input iid=1 --input body="Comment"
swamp model method run gitlab create_merge_request --input project=group/repo --input title="MR" --input sourceBranch=feature

Methods

Read:

  • list_projects, get_project_info, list_merge_requests, list_issues
  • list_commits (REST repository/commits; optional ref + since bound)
  • get_file (raw file content at a ref, parsed from a pasted blob URL)
  • get_issue (full description body, keyed by project + iid)
  • list_releases, list_pipelines, list_issue_notes, list_mr_notes
  • list_mr_discussions (resolvable threads + resolution state + diff position)
  • list_labels, list_members, list_branches
  • list_my_merge_requests (GraphQL — cross-project dashboard + todos)
  • list_todos (GraphQL — ALL todos, paginated past the 20-cap, each with target lifecycle state)
  • get_merge_request (detailed_merge_status + why an MR can/can't merge + source/target branch + webUrl)
  • get_pipeline_jobs (jobs + failure_reason; defaults to failed jobs)
  • get_job_log (tail of a CI job's trace)

Write:

  • create_issue, update_issue, add_issue_note
  • create_merge_request, update_merge_request, merge, add_mr_note
  • update_mr_note / delete_mr_note (edit or remove an MR comment by id)
  • set_mr_assignees (assign/reassign/unassign by username; CE keeps one, EE many)
  • unassign_from_mrs (fan-out: remove an assignee from many MRs in a project)
  • set_mr_reviewers / remove_mr_reviewers (replace or fan-out-remove reviewers by username)
  • resolve_mr_discussion (resolve/unresolve an MR discussion thread; mutating)
  • create_label
  • mark_todo_done (clear a handled to-do off the pending queue)
  • mark_todos_done (bulk-clear many todos in one call, sequential; companion to mark_todo_done)
  • rebase_merge_request (rebase a stale MR onto its target, polling to completion)
  • retry_job / retry_pipeline (re-run CI after a transient failure)
02Release Notes

2026.09.15.1

Changed: Bump zod 4.4.3 → 4.6.5

2026.09.08.2

Added: get_file method — fetches a file's raw content at a given ref via the REST repository/files/:path/raw endpoint. Accepts a GitLab blob URL (e.g. https://<host>/<group>/<project>/-/blob/<ref>/<path>, the kind you'd paste from the web UI) and resolves project, ref, and path from it. A ref containing slashes (e.g. feat/my-feature) is disambiguated by probing the API for each plausible ref/path split, rather than guessing the first one. The URL's host must match the model instance's configured host, tolerating an explicit default port (:443) — a URL for a different GitLab instance is rejected. If more than one ref/path split resolves (e.g. a branch and a tag sharing a slash-containing name), a warning is logged and the shortest-ref candidate is used; probing is bounded to 10 splits so a pathologically deep path can't force an unbounded burst of API calls, and a non-404 error on one candidate (e.g. GitLab rejecting a malformed ref) no longer aborts the whole call — later candidates still get a chance to resolve. Writes a new fileContent resource, with a collision-resistant instance name (hashed project/ref/path) so distinct files with hyphenated components can't overwrite each other. Only text/code files are supported — binary content (images, archives, compiled artifacts) is detected by sniffing for a NUL byte, the same heuristic Git itself uses, rather than trusting Content-Type alone (GitLab's raw-file endpoint commonly serves extension-less text files like Dockerfile or Jenkinsfile as application/octet-stream). If a resolved candidate turns out to be binary while a different ref/path split resolves as text, that candidate is skipped and a warning notes it so the mismatch isn't silent — and if every candidate is either binary or missing, the binary rejection is what surfaces (it means the target file was found, just of an unsupported type), not a less useful later error. The response body is read up to the size cap and the rest of the stream is discarded, so an oversized file (a multi-GB vendored bundle, a SQL dump) is never fully buffered into memory before being trimmed down. Content is capped at 500KB measured in bytes (not JS string length), truncating on a UTF-8 codepoint boundary so a multi-byte character straddling the cap isn't corrupted into a replacement character, and common credential patterns are redacted, same as get_job_log's trace handling. truncated reflects whether the network read itself was cut short, not just whether the post-redaction content still exceeds the cap — a large file with a credential near the front can shrink under 500KB once redacted, but real data was still dropped upstream, so the flag stays honest instead of silently reporting a complete file. If the network read cap itself lands mid-character, the dangling lead byte at the tail is trimmed rather than decoded into a replacement character (U+FFFD) — this is checked independently of the final 500KB trim, since redaction can shrink content enough to skip that second trim entirely. That trim only applies when the read was actually cut short; a complete file's genuine trailing bytes (e.g. Latin-1 text ending in a byte that happens to match a UTF-8 lead-byte pattern) are left alone rather than guessed at. A malformed percent-escape in the URL (e.g. a real filename like 100%complete.md) now surfaces as a descriptive error naming the URL instead of a bare URIError.

Upgrade note: no schema or globalArguments change for existing resources. Running any method on an existing instance migrates it to 2026.09.08.2 as a no-op.

2026.09.08.1

Fixed: the manifest description's method list (published to the registry and README) was missing seven methods that already shipped in code: list_commits, get_issue, list_mr_discussions, resolve_mr_discussion, set_mr_reviewers, remove_mr_reviewers, and unassign_from_mrs. Users browsing the registry entry had no way to discover these without reading source. No behavioral change — documentation only.

Upgrade note: no schema or globalArguments change. Running any method on an existing instance migrates it to 2026.09.08.1 as a no-op.

2026.09.02.1

Added: get_issue method — fetches a single issue by project and iid, including its description body, via GraphQL project.issue(iid). Writes the existing issueDetail resource (the same shape produced by create_issue and update_issue). Enables reading full work-item details, such as a directly addressed tier-1 to-do, without creating or mutating the issue.

Fixed: the 2026.07.30.1 upgrade erroneously injected sourceBranch, targetBranch, and webUrl into globalArguments (only host and token are valid), which broke every method on upgraded instances with an Unknown argument(s) validation error. That upgrade is now a no-op on global arguments (the mergeStatus fields i

03Models1
@webframp/gitlabv2026.09.15.1gitlab/projects.ts

Global Arguments

ArgumentTypeDescription
hoststringGitLab hostname (e.g. git.example.org)
tokenstringGitLab personal access token with api scope (use vault reference)
fn list_projects()
List projects for the authenticated user with basic metadata
fn get_project_info(project: string)
Get detailed information about a specific project
ArgumentTypeDescription
projectstringProject path (e.g. mygroup/myproject)
fn list_merge_requests(project: string, state: enum)
List merge requests for a project with optional state filter
ArgumentTypeDescription
projectstring
stateenum
fn list_commits(project: string, ref: string, since: string, perPage: number)
List commits for a project (optionally a branch), newest first.
ArgumentTypeDescription
projectstringProject path (group/repo) or numeric ID
refstringBranch or ref to list from; empty uses the default branch
sincestringOnly commits after this ISO 8601 timestamp; empty = no lower bound
perPagenumberPage size (max 100)
fn get_file(url: string)
Fetch a file's raw content at a given ref via GitLab's REST raw-file
ArgumentTypeDescription
urlstringGitLab blob URL, e.g. https://<host>/<group>/<project>/-/blob/<ref>/<path>
fn list_issues(project: string, state: enum)
List issues for a project with optional state filter
ArgumentTypeDescription
projectstring
stateenum
fn list_releases(project: string)
List releases for a project
ArgumentTypeDescription
projectstring
fn list_pipelines(project: string)
List recent CI/CD pipelines for a project
ArgumentTypeDescription
projectstring
fn get_issue(project: string, iid: number)
Get a single issue including its description body (for reading
ArgumentTypeDescription
projectstring
iidnumber
fn create_issue(project: string, title: string, description: string, labels: array)
Create a new issue in a project
ArgumentTypeDescription
projectstring
titlestring
descriptionstring
labelsarray
fn update_issue(project: string, iid: number, title?: string, description?: string, labels?: array, stateEvent?: enum)
Update an existing issue (title, description, labels, state)
ArgumentTypeDescription
projectstring
iidnumber
title?string
description?string
labels?array
stateEvent?enum
fn add_issue_note(project: string, iid: number, body: string)
Add a comment to an issue
ArgumentTypeDescription
projectstring
iidnumber
bodystring
fn list_issue_notes(project: string, iid: number)
List comments on an issue
ArgumentTypeDescription
projectstring
iidnumber
fn list_mr_notes(project: string, iid: number)
List the most recent comments/discussion notes on a merge request (newest 50; truncated=true when older notes exist)
ArgumentTypeDescription
projectstring
iidnumber
fn mark_todo_done(todoId: string)
Mark a to-do as done so it drops off the pending list (todoMarkDone).
ArgumentTypeDescription
todoIdstringTodo ID — the gid (gid://gitlab/Todo/NNN) or the numeric id
fn list_todos(state: enum, maxTodos: number)
List the authenticated user's todos across ALL pages (the dashboard
ArgumentTypeDescription
stateenumWhich todos to fetch (default pending)
maxTodosnumberSafety cap on total todos fetched across pages
fn mark_todos_done(todoIds: array)
Mark MANY todos done in one call — one sequential GraphQL request per
ArgumentTypeDescription
todoIdsarrayTodo ids (gid://gitlab/Todo/NNN or numeric)
fn create_merge_request(project: string, title: string, sourceBranch: string, targetBranch: string, description: string)
Create a new merge request
ArgumentTypeDescription
projectstring
titlestring
sourceBranchstring
targetBranchstring
descriptionstring
fn get_merge_request(project: string, iid: number)
Report an MR's mergeability: detailed_merge_status plus a plain-English summary of why it can or cannot merge.
ArgumentTypeDescription
projectstring
iidnumber
fn rebase_merge_request(project: string, iid: number, skipCi: boolean)
Trigger a rebase of an MR's source branch onto its target (async), polling until it finishes or errors.
ArgumentTypeDescription
projectstring
iidnumber
skipCiboolean
fn get_pipeline_jobs(project: string, pipelineId: number, scope: enum)
List a pipeline's jobs with failure_reason (script_failure = real; runner_system_failure / stuck_or_timeout_failure / job_execution_timeout / api_failure = transient). Defaults to failed jobs only.
ArgumentTypeDescription
projectstring
pipelineIdnumber
scopeenum
fn get_job_log(project: string, jobId: number, tailLines: number)
Fetch the tail of a CI job's trace/log (last N lines) to diagnose a failure.
ArgumentTypeDescription
projectstring
jobIdnumber
tailLinesnumber
fn retry_job(project: string, jobId: number)
Retry a CI job (e.g. after a transient failure). Returns the new job's id and status.
ArgumentTypeDescription
projectstring
jobIdnumber
fn retry_pipeline(project: string, pipelineId: number)
Retry the failed jobs in a pipeline.
ArgumentTypeDescription
projectstring
pipelineIdnumber
fn merge(project: string, iid: number, squash: boolean)
Merge a merge request
ArgumentTypeDescription
projectstring
iidnumber
squashboolean
fn update_merge_request(project: string, iid: number, title?: string, description?: string, labels?: array, stateEvent?: enum)
Update a merge request (title, description, labels, state)
ArgumentTypeDescription
projectstring
iidnumber
title?string
description?string
labels?array
stateEvent?enum
fn add_mr_note(project: string, iid: number, body: string)
Add a comment to a merge request, or reply into an existing thread by passing discussionId (from list_mr_discussions)
ArgumentTypeDescription
projectstring
iidnumber
bodystring
fn update_mr_note(project: string, iid: number, noteId: number, body: string)
Edit an existing comment on a merge request by note id.
ArgumentTypeDescription
projectstring
iidnumber
noteIdnumber
bodystring
fn delete_mr_note(project: string, iid: number, noteId: number)
Delete a comment on a merge request by note id.
ArgumentTypeDescription
projectstring
iidnumber
noteIdnumber
fn set_mr_assignees(project: string, iid: number, usernames: array)
Set (replace) an MR's assignees by username; pass an empty list to unassign. GitLab CE keeps one; EE/Premium support multiple.
ArgumentTypeDescription
projectstring
iidnumber
usernamesarray
fn unassign_from_mrs(project: string, iids: array, username?: string)
Remove an assignee (default: the authenticated user) from multiple MRs
ArgumentTypeDescription
projectstring
iidsarray
username?string
fn remove_mr_reviewers(project: string, iids: array, username?: string)
Remove a reviewer (default: the authenticated user) from multiple MRs
ArgumentTypeDescription
projectstring
iidsarray
username?string
fn set_mr_reviewers(project: string, iid: number, usernames: array)
Set (replace) an MR's reviewers by username; pass an empty list to clear.
ArgumentTypeDescription
projectstring
iidnumber
usernamesarray
fn list_mr_discussions(project: string, iid: number, first: number)
List resolvable discussion threads on an MR with per-thread resolution state and slim diff position (file/line). System-only threads are excluded. Filter for blockers with CEL: size(discussions.filter(d, d.resolvable && !d.resolved)).
ArgumentTypeDescription
projectstring
iidnumber
firstnumber
fn resolve_mr_discussion(project: string, iid: number, discussionId: string, resolved: boolean)
Resolve (or unresolve) a merge request discussion thread by its discussionId (from list_mr_discussions). MUTATING.
ArgumentTypeDescription
projectstring
iidnumber
discussionIdstring
resolvedboolean
fn list_labels(project: string)
List labels for a project
ArgumentTypeDescription
projectstring
fn create_label(project: string, name: string, color: string, description: string)
Create a label in a project
ArgumentTypeDescription
projectstring
namestring
colorstring
descriptionstring
fn list_members(project: string)
List members of a project
ArgumentTypeDescription
projectstring
fn list_branches(project: string)
List branches for a project
ArgumentTypeDescription
projectstring
fn list_my_merge_requests()
List MRs and todos for the authenticated user via GraphQL (reviewer, assignee, author roles + pending todos)

Resources

projects(30m)— List of projects for the authenticated user
projectInfo(30m)— Detailed information about a specific project
mergeRequests(15m)— List of merge requests for a project
commits(15m)— List of commits for a project
fileContent(15m)— Raw content of a file at a given ref
issues(15m)— List of issues for a project
issueDetail(15m)— Single issue detail (from create/update)
notes(15m)— Notes/comments on an issue or MR
discussions(15m)— Resolvable discussion threads on an MR, with per-thread resolution state and slim diff position
discussionResolution(15m)— Outcome of resolving/unresolving an MR discussion
mergeStatus(15m)— Mergeability of an MR — detailed_merge_status plus human-readable blockers
rebaseResult(15m)— Outcome of a triggered MR rebase
pipelineJobs(15m)— Jobs in a pipeline (with failure_reason), for CI diagnosis
jobLog(15m)— Tail of a CI job's trace/log
retryResult(15m)— Outcome of a triggered job/pipeline retry
noteDeleted(15m)— Record of a deleted MR note
unassignResult(infinite)— Result of a fan-out unassign across MRs (remaining assignees + failures)
reviewerRemovalResult(infinite)— Result of a fan-out reviewer removal across MRs (remaining reviewers + failures)
mrAssignees(15m)— Assignees of an MR after a set/unassign
mrReviewers(15m)— Reviewers of an MR after a set/clear
releases(1h)— List of releases for a project
pipelines(10m)— List of recent CI/CD pipelines
labels(1h)— Labels for a project
members(1h)— Members of a project
branches(15m)— Branches for a project
dashboard(30m)— Cross-project MR dashboard and todos for the authenticated user
todoList(15m)— All todos for the authenticated user (paginated past the dashboard's
bulkTodoResult(infinite)— Result of a bulk mark-todos-done (confirmed done + per-todo failures)
04Reports1
@webframp/review-dashboardmethod
review_dashboard.ts

Prioritized action items dashboard from cross-project MR data

gitlabreviewsdashboard
05Previous Versions18
2026.09.08.2

2026.09.08.2

Added: get_file method — fetches a file's raw content at a given ref via the REST repository/files/:path/raw endpoint. Accepts a GitLab blob URL (e.g. https://<host>/<group>/<project>/-/blob/<ref>/<path>, the kind you'd paste from the web UI) and resolves project, ref, and path from it. A ref containing slashes (e.g. feat/my-feature) is disambiguated by probing the API for each plausible ref/path split, rather than guessing the first one. The URL's host must match the model instance's configured host, tolerating an explicit default port (:443) — a URL for a different GitLab instance is rejected. If more than one ref/path split resolves (e.g. a branch and a tag sharing a slash-containing name), a warning is logged and the shortest-ref candidate is used; probing is bounded to 10 splits so a pathologically deep path can't force an unbounded burst of API calls, and a non-404 error on one candidate (e.g. GitLab rejecting a malformed ref) no longer aborts the whole call — later candidates still get a chance to resolve. Writes a new fileContent resource, with a collision-resistant instance name (hashed project/ref/path) so distinct files with hyphenated components can't overwrite each other. Only text/code files are supported — binary content (images, archives, compiled artifacts) is detected by sniffing for a NUL byte, the same heuristic Git itself uses, rather than trusting Content-Type alone (GitLab's raw-file endpoint commonly serves extension-less text files like Dockerfile or Jenkinsfile as application/octet-stream). If a resolved candidate turns out to be binary while a different ref/path split resolves as text, that candidate is skipped and a warning notes it so the mismatch isn't silent — and if every candidate is either binary or missing, the binary rejection is what surfaces (it means the target file was found, just of an unsupported type), not a less useful later error. The response body is read up to the size cap and the rest of the stream is discarded, so an oversized file (a multi-GB vendored bundle, a SQL dump) is never fully buffered into memory before being trimmed down. Content is capped at 500KB measured in bytes (not JS string length), truncating on a UTF-8 codepoint boundary so a multi-byte character straddling the cap isn't corrupted into a replacement character, and common credential patterns are redacted, same as get_job_log's trace handling. truncated reflects whether the network read itself was cut short, not just whether the post-redaction content still exceeds the cap — a large file with a credential near the front can shrink under 500KB once redacted, but real data was still dropped upstream, so the flag stays honest instead of silently reporting a complete file. If the network read cap itself lands mid-character, the dangling lead byte at the tail is trimmed rather than decoded into a replacement character (U+FFFD) — this is checked independently of the final 500KB trim, since redaction can shrink content enough to skip that second trim entirely. That trim only applies when the read was actually cut short; a complete file's genuine trailing bytes (e.g. Latin-1 text ending in a byte that happens to match a UTF-8 lead-byte pattern) are left alone rather than guessed at. A malformed percent-escape in the URL (e.g. a real filename like 100%complete.md) now surfaces as a descriptive error naming the URL instead of a bare URIError.

Upgrade note: no schema or globalArguments change for existing resources. Running any method on an existing instance migrates it to 2026.09.08.2 as a no-op.

2026.09.08.1

Fixed: the manifest description's method list (published to the registry and README) was missing seven methods that already shipped in code: list_commits, get_issue, list_mr_discussions, resolve_mr_discussion, set_mr_reviewers, remove_mr_reviewers, and unassign_from_mrs. Users browsing the registry entry had no way to discover these without reading source. No behavioral change — documentation only.

Upgrade note: no schema or globalArguments change. Running any method on an existing instance migrates it to 2026.09.08.1 as a no-op.

2026.09.02.1

Added: get_issue method — fetches a single issue by project and iid, including its description body, via GraphQL project.issue(iid). Writes the existing issueDetail resource (the same shape produced by create_issue and update_issue). Enables reading full work-item details, such as a directly addressed tier-1 to-do, without creating or mutating the issue.

Fixed: the 2026.07.30.1 upgrade erroneously injected sourceBranch, targetBranch, and webUrl into globalArguments (only host and token are valid), which broke every method on upgraded instances with an Unknown argument(s) validation error. That upgrade is now a no-op on global arguments (the mergeStatus fields it described belong to a resource schema, which needs n

Modified 1 models

2026.09.08.1

2026.09.08.1

Fixed: the manifest description's method list (published to the registry and README) was missing seven methods that already shipped in code: list_commits, get_issue, list_mr_discussions, resolve_mr_discussion, set_mr_reviewers, remove_mr_reviewers, and unassign_from_mrs. Users browsing the registry entry had no way to discover these without reading source. No behavioral change — documentation only.

Upgrade note: no schema or globalArguments change. Running any method on an existing instance migrates it to 2026.09.08.1 as a no-op.

2026.09.02.1

Added: get_issue method — fetches a single issue by project and iid, including its description body, via GraphQL project.issue(iid). Writes the existing issueDetail resource (the same shape produced by create_issue and update_issue). Enables reading full work-item details, such as a directly addressed tier-1 to-do, without creating or mutating the issue.

Fixed: the 2026.07.30.1 upgrade erroneously injected sourceBranch, targetBranch, and webUrl into globalArguments (only host and token are valid), which broke every method on upgraded instances with an Unknown argument(s) validation error. That upgrade is now a no-op on global arguments (the mergeStatus fields it described belong to a resource schema, which needs no attribute migration), and the 2026.09.02.1 upgrade removes the stray keys from any instance already poisoned by it.

Upgrade note: running any method on an existing instance migrates it to 2026.09.02.1 and strips the stray global-argument keys automatically. No manual intervention is required.

2026.09.01.1

Added: mergedAt field on merge requests (GraphQL mergedAt, REST merged_at) — the timestamp an MR was merged, or null if not merged.

Added: approvers field on merge requests — the usernames who approved (reviewed) the MR, from GraphQL approvedBy. Enables cross-boundary review attribution (an approver helps the MR author). REST-mapped MRs default to an empty array.

Added: list_commits method — lists a project's commits (optionally a branch, with a since lower time bound) via the REST repository/commits endpoint, writing a commits resource. Enables commit-based contribution analysis (who commits to another crew's repository).

Together these support downstream review-outcome / unblock-rate scoring and cross-boundary contribution measurement.

Upgrade note: Purely additive and backward-compatible. New MR fields are nullable / defaulted, so merge-request data stored by earlier versions still validates on read. list_commits is a new method; no existing method changed.

2026.08.28.1

Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.

Upgrade note: License text only. No API, schema, or runtime behavior changed.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

2026.09.02.1

2026.09.02.1

Added: get_issue method — fetches a single issue by project and iid, including its description body, via GraphQL project.issue(iid). Writes the existing issueDetail resource (the same shape produced by create_issue and update_issue). Enables reading full work-item details, such as a directly addressed tier-1 to-do, without creating or mutating the issue.

Fixed: the 2026.07.30.1 upgrade erroneously injected sourceBranch, targetBranch, and webUrl into globalArguments (only host and token are valid), which broke every method on upgraded instances with an Unknown argument(s) validation error. That upgrade is now a no-op on global arguments (the mergeStatus fields it described belong to a resource schema, which needs no attribute migration), and the 2026.09.02.1 upgrade removes the stray keys from any instance already poisoned by it.

Upgrade note: running any method on an existing instance migrates it to 2026.09.02.1 and strips the stray global-argument keys automatically. No manual intervention is required.

2026.09.01.1

Added: mergedAt field on merge requests (GraphQL mergedAt, REST merged_at) — the timestamp an MR was merged, or null if not merged.

Added: approvers field on merge requests — the usernames who approved (reviewed) the MR, from GraphQL approvedBy. Enables cross-boundary review attribution (an approver helps the MR author). REST-mapped MRs default to an empty array.

Added: list_commits method — lists a project's commits (optionally a branch, with a since lower time bound) via the REST repository/commits endpoint, writing a commits resource. Enables commit-based contribution analysis (who commits to another crew's repository).

Together these support downstream review-outcome / unblock-rate scoring and cross-boundary contribution measurement.

Upgrade note: Purely additive and backward-compatible. New MR fields are nullable / defaulted, so merge-request data stored by earlier versions still validates on read. list_commits is a new method; no existing method changed.

2026.08.28.1

Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.

Upgrade note: License text only. No API, schema, or runtime behavior changed.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

Modified 1 models

2026.09.01.1

2026.09.01.1

Added: mergedAt field on merge requests (GraphQL mergedAt, REST merged_at) — the timestamp an MR was merged, or null if not merged.

Added: approvers field on merge requests — the usernames who approved (reviewed) the MR, from GraphQL approvedBy. Enables cross-boundary review attribution (an approver helps the MR author). REST-mapped MRs default to an empty array.

Added: list_commits method — lists a project's commits (optionally a branch, with a since lower time bound) via the REST repository/commits endpoint, writing a commits resource. Enables commit-based contribution analysis (who commits to another crew's repository).

Together these support downstream review-outcome / unblock-rate scoring and cross-boundary contribution measurement.

Upgrade note: Purely additive and backward-compatible. New MR fields are nullable / defaulted, so merge-request data stored by earlier versions still validates on read. list_commits is a new method; no existing method changed.

2026.08.28.1

Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.

Upgrade note: License text only. No API, schema, or runtime behavior changed.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

Modified 1 models

2026.08.28.1

2026.08.28.1

Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.

Upgrade note: License text only. No API, schema, or runtime behavior changed.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

2026.08.26.3

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

2026.08.26.1

2026.08.26.1

Fixed: Added missing description field to upgrade entry for version 2026.08.24.2. The omission caused swamp extension pull to fail with a catalog validation error ("upgrades.N.description: Invalid input: expected string, received undefined").

2026.08.24.3

2026.08.24.3

Added: Output metadata attributes for observability.

  • durationMs: Method execution duration in milliseconds.
  • collectedBy: Extension name that produced the data.
  • fetchedAt: ISO 8601 timestamp when data was fetched (added to resources that previously lacked it).
2026.08.24.2

2026.08.24.2

Added Troubleshooting section documenting single-page fixed-limit pagination, token scope requirements, batch method partial-failure reporting, set_mr_assignees verification, no rate-limit retry, and undocumented methods.

2026.08.21.2

2026.08.21.2

Changed: A malformed (non-JSON) response body from the GitLab GraphQL API now raises a clear error naming the host, instead of a raw JSON.parse SyntaxError with no indication of which request failed. The review-dashboard report now distinguishes "no dashboard data has been generated yet" from "the stored dashboard data could not be loaded" — the latter now surfaces the underlying read/parse error in both the markdown and JSON output instead of being silently treated the same as the empty case.

2026.08.21.1

Changed: Added .describe() documentation to every previously undocumented field across all resource schemas (projects, merge requests, issues, notes, discussions, releases, pipelines, labels, members, branches, dashboard, todos, merge status, pipeline jobs, job logs, retry results, and rebase results). No schema or behavioral changes — a no-op upgrades entry was added to keep the model's typeVersion tracking in sync with the version bump.

2026.08.12.1

Added: list_my_merge_requests now includes pipelineStatus on each MR in the dashboard resource. The value is the head pipeline's status normalized to lowercase (success, failed, running, etc.) or null when no pipeline exists. This enables downstream consumers to make triage decisions based on pipeline state — for example, auto-approving Renovate MRs with a passing pipeline.

Technical details: The DASHBOARD_QUERY GraphQL fragments now request headPipeline { status } on all three MR connection types (reviewing, assigned, authored). The field is added to DashboardMRSchema as z.string().nullable().optional() for backward compatibility with stored data.

Upgrade note: Schema is additive only — one new optional nullable field. Existing stored dashboard resources validate without modification. No reconfiguration required.

2026.07.30.1

Fixed: list_merge_requests and list_issues fail with "Variable $state of type MergeRequestState was provided invalid value" when any state filter is used. The methods incorrectly uppercased the state value before passing it to the GitLab GraphQL API, which expects lowercase enum values (opened, closed, merged). The list_my_merge_requests dashboard query was unaffected because it already passed the value without transformation.

Added: get_merge_request now returns sourceBranch, targetBranch, and webUrl in the mergeStatus resource. Previously these fields required a heavier call through @webframp/gitlab-review / get_mr_diff. Consumers composing with git-workspace or other models that need the source branch can now get it directly from the merge status check.

Upgrade note: Schema is additive only — three new nullable fields. Existing stored mergeStatus resources will be backfilled with null values on upgrade. No reconfiguration required.

2026.08.21.1

2026.08.21.1

Changed: Added .describe() documentation to every previously undocumented field across all resource schemas (projects, merge requests, issues, notes, discussions, releases, pipelines, labels, members, branches, dashboard, todos, merge status, pipeline jobs, job logs, retry results, and rebase results). No schema or behavioral changes — a no-op upgrades entry was added to keep the model's typeVersion tracking in sync with the version bump.

2026.08.12.1

Added: list_my_merge_requests now includes pipelineStatus on each MR in the dashboard resource. The value is the head pipeline's status normalized to lowercase (success, failed, running, etc.) or null when no pipeline exists. This enables downstream consumers to make triage decisions based on pipeline state — for example, auto-approving Renovate MRs with a passing pipeline.

Technical details: The DASHBOARD_QUERY GraphQL fragments now request headPipeline { status } on all three MR connection types (reviewing, assigned, authored). The field is added to DashboardMRSchema as z.string().nullable().optional() for backward compatibility with stored data.

Upgrade note: Schema is additive only — one new optional nullable field. Existing stored dashboard resources validate without modification. No reconfiguration required.

2026.07.30.1

Fixed: list_merge_requests and list_issues fail with "Variable $state of type MergeRequestState was provided invalid value" when any state filter is used. The methods incorrectly uppercased the state value before passing it to the GitLab GraphQL API, which expects lowercase enum values (opened, closed, merged). The list_my_merge_requests dashboard query was unaffected because it already passed the value without transformation.

Added: get_merge_request now returns sourceBranch, targetBranch, and webUrl in the mergeStatus resource. Previously these fields required a heavier call through @webframp/gitlab-review / get_mr_diff. Consumers composing with git-workspace or other models that need the source branch can now get it directly from the merge status check.

Upgrade note: Schema is additive only — three new nullable fields. Existing stored mergeStatus resources will be backfilled with null values on upgrade. No reconfiguration required.

2026.07.30.1

2026.07.30.1

Fixed: list_merge_requests and list_issues fail with "Variable $state of type MergeRequestState was provided invalid value" when any state filter is used. The methods incorrectly uppercased the state value before passing it to the GitLab GraphQL API, which expects lowercase enum values (opened, closed, merged). The list_my_merge_requests dashboard query was unaffected because it already passed the value without transformation.

Added: get_merge_request now returns sourceBranch, targetBranch, and webUrl in the mergeStatus resource. Previously these fields required a heavier call through @webframp/gitlab-review / get_mr_diff. Consumers composing with git-workspace or other models that need the source branch can now get it directly from the merge status check.

Upgrade note: Schema is additive only — three new nullable fields. Existing stored mergeStatus resources will be backfilled with null values on upgrade. No reconfiguration required.

2026.07.18.1

2026.07.18.1

Added: An upgrades array entry (no-op) to projects.ts for proper typeVersion tracking on existing instances. No schema or behavior changes.

2026.07.11.1

Added: list_todos(state?, maxTodos?) — the authenticated user's todos across ALL pages, not the 20 the dashboard caps at. Paginates GraphQL currentUser.todos with a cursor up to a maxTodos safety cap (default 2000, truncated flag when hit). Each todo carries a hoisted targetState (opened/closed/merged for MR/issue targets, null otherwise) pulled via inline fragments, so classifying a large backlog as stale-vs-live is a flat CEL filter with no per-item fetch: todos.filter(t, t.targetState in ["merged", "closed"]). Writes a todoList resource.

Added: mark_todos_done(todoIds) — bulk companion to mark_todo_done. Marks many todos done in one call, one sequential GraphQL request per todo (not parallel; accepts gids or numeric ids), guarding the null payload GitLab returns on permission-denied/not-found; per-todo failures land in failed[] rather than aborting the batch. Writes a bulkTodoResult resource. Together with list_todos, clearing a large stale backlog is: list → CEL-filter merged/closed → mark_todos_done.

2026.07.10.4

Added: remove_mr_reviewers(project, iids, username?) — remove a reviewer (default: the authenticated user) from multiple MRs in one fan-out, via GraphQL mergeRequestSetReviewers with operationMode: REMOVE. Other reviewers are preserved; it is idempotent; per-MR failures land in failed[] rather than aborting the batch. The reviewer-side sibling of unassign_from_mrs, for clearing yourself off MRs you've already reviewed (the "approved-but-still-listed" clutter). Writes a reviewerRemovalResult resource.

2026.07.10.3

Added: list_mr_discussions(project, iid) — resolvable discussion threads on an MR with per-thread resolvable/resolved/resolvedBy and a slim diff position (file/line) hoisted to the thread level, plus the thread notes. System-only threads are excluded. Unresolved threads (the discussions_not_resolved merge blocker) are a CEL filter away: size(discussions.filter(d, d.resolvable && !d.resolved)).

Added: resolve_mr_discussion(project, iid, discussionId, resolved) — resolve or unresolve a thread (GraphQL discussionToggleResolve).

Changed: add_mr_note takes an optional discussionId to reply into an existing thread rather than post top-level. Omitting it is unchanged behavior; add_issue_note is untouched.

2026.07.10.2

Added: A canonical, GitLab-flavored reference on every dashboard work item from list_my_merge_requestsgroup/project!123 for MRs, group/project#123 for issue todos — so items in a cross-project list are uniquely identifiable and autolink in GitLab markdown. MRs derive it from the project path + iid; todos parse it (and a new iid) from targetUrl (the todo's own project field is a display name, not a path). The @webframp/review-dashboard report now renders these references, unfenced, in the MR tables and the todos table (falling back to the project path / target type for data written before this release).

2026.07.10.1

Added: unassign_from_mrs(project, iids, username?) — remove an assignee (default: the authenticated user) from multiple MRs in a single fan-out call. Uses GraphQL mergeRequestSetAssignees with operationMode: REMOVE, so other assignees are preserved; it is idempotent, and per-MR failures are recorded in a failed[] list rather than aborting the batch. Complements set_mr_assignees (REPLACE, single MR) for the common "clear my review queue" case without a read-modify-write. Writes a new unassignResult resource.

2026.07.08.4

Added: MR note management and assignee control.

  • update_mr_note(project, iid, noteId, body) — edit an MR comment by id (GraphQL updateNote).
  • delete_mr_note(project, iid, noteId) — remove an MR comment by id (GraphQL destroyNote). Previously a comment could be created but not deleted in-model.
  • set_mr_assignees(project, iid, usernames) — set/replace assignees by username (GraphQL mergeRequestSetAssignees, operationMode: REPLACE); pass an empty list to unassign. GitLab CE keeps a single assignee; EE/Premium support multiple.

2026.07.08.3

Added: CI-failure diagnosis for merge requests.

  • get_pipeline_jobs(project, pipelineId, scope=failed) — list a pipeline's jobs with GitLab's failure_reason, so a caller can tell a transient failure (runner_system_failure, stuck_or_timeout_failure, job_execution_timeout, api_failure) from a real one (script_failure).
  • get_job_log(project, jobId, tailLines=200) — the tail of a job's trace, to diagnose why it failed (never the whole log).
  • retry_job(project, jobId) / retry_pipeline(project, pipelineId) — re-run CI after a transient failure.
  • get_merge_request now also returns headPipelineId, so you can
2026.07.16.1

2026.07.11.1

Added: list_todos(state?, maxTodos?) — the authenticated user's todos across ALL pages, not the 20 the dashboard caps at. Paginates GraphQL currentUser.todos with a cursor up to a maxTodos safety cap (default 2000, truncated flag when hit). Each todo carries a hoisted targetState (opened/closed/merged for MR/issue targets, null otherwise) pulled via inline fragments, so classifying a large backlog as stale-vs-live is a flat CEL filter with no per-item fetch: todos.filter(t, t.targetState in ["merged", "closed"]). Writes a todoList resource.

Added: mark_todos_done(todoIds) — bulk companion to mark_todo_done. Marks many todos done in one call, one sequential GraphQL request per todo (not parallel; accepts gids or numeric ids), guarding the null payload GitLab returns on permission-denied/not-found; per-todo failures land in failed[] rather than aborting the batch. Writes a bulkTodoResult resource. Together with list_todos, clearing a large stale backlog is: list → CEL-filter merged/closed → mark_todos_done.

2026.07.10.4

Added: remove_mr_reviewers(project, iids, username?) — remove a reviewer (default: the authenticated user) from multiple MRs in one fan-out, via GraphQL mergeRequestSetReviewers with operationMode: REMOVE. Other reviewers are preserved; it is idempotent; per-MR failures land in failed[] rather than aborting the batch. The reviewer-side sibling of unassign_from_mrs, for clearing yourself off MRs you've already reviewed (the "approved-but-still-listed" clutter). Writes a reviewerRemovalResult resource.

2026.07.10.3

Added: list_mr_discussions(project, iid) — resolvable discussion threads on an MR with per-thread resolvable/resolved/resolvedBy and a slim diff position (file/line) hoisted to the thread level, plus the thread notes. System-only threads are excluded. Unresolved threads (the discussions_not_resolved merge blocker) are a CEL filter away: size(discussions.filter(d, d.resolvable && !d.resolved)).

Added: resolve_mr_discussion(project, iid, discussionId, resolved) — resolve or unresolve a thread (GraphQL discussionToggleResolve).

Changed: add_mr_note takes an optional discussionId to reply into an existing thread rather than post top-level. Omitting it is unchanged behavior; add_issue_note is untouched.

2026.07.10.2

Added: A canonical, GitLab-flavored reference on every dashboard work item from list_my_merge_requestsgroup/project!123 for MRs, group/project#123 for issue todos — so items in a cross-project list are uniquely identifiable and autolink in GitLab markdown. MRs derive it from the project path + iid; todos parse it (and a new iid) from targetUrl (the todo's own project field is a display name, not a path). The @webframp/review-dashboard report now renders these references, unfenced, in the MR tables and the todos table (falling back to the project path / target type for data written before this release).

2026.07.10.1

Added: unassign_from_mrs(project, iids, username?) — remove an assignee (default: the authenticated user) from multiple MRs in a single fan-out call. Uses GraphQL mergeRequestSetAssignees with operationMode: REMOVE, so other assignees are preserved; it is idempotent, and per-MR failures are recorded in a failed[] list rather than aborting the batch. Complements set_mr_assignees (REPLACE, single MR) for the common "clear my review queue" case without a read-modify-write. Writes a new unassignResult resource.

2026.07.08.4

Added: MR note management and assignee control.

  • update_mr_note(project, iid, noteId, body) — edit an MR comment by id (GraphQL updateNote).
  • delete_mr_note(project, iid, noteId) — remove an MR comment by id (GraphQL destroyNote). Previously a comment could be created but not deleted in-model.
  • set_mr_assignees(project, iid, usernames) — set/replace assignees by username (GraphQL mergeRequestSetAssignees, operationMode: REPLACE); pass an empty list to unassign. GitLab CE keeps a single assignee; EE/Premium support multiple.

2026.07.08.3

Added: CI-failure diagnosis for merge requests.

  • get_pipeline_jobs(project, pipelineId, scope=failed) — list a pipeline's jobs with GitLab's failure_reason, so a caller can tell a transient failure (runner_system_failure, stuck_or_timeout_failure, job_execution_timeout, api_failure) from a real one (script_failure).
  • get_job_log(project, jobId, tailLines=200) — the tail of a job's trace, to diagnose why it failed (never the whole log).
  • retry_job(project, jobId) / retry_pipeline(project, pipelineId) — re-run CI after a transient failure.
  • get_merge_request now also returns headPipelineId, so you can go straight from a blocked MR to its failed jobs.

2026.07.08.2

Added:

  • get_merge_request — report an MR's mergeability via GitLab's `detailed_merge_st

Modified 1 models

2026.07.11.1

2026.07.11.1

Added: list_todos(state?, maxTodos?) — the authenticated user's todos across ALL pages, not the 20 the dashboard caps at. Paginates GraphQL currentUser.todos with a cursor up to a maxTodos safety cap (default 2000, truncated flag when hit). Each todo carries a hoisted targetState (opened/closed/merged for MR/issue targets, null otherwise) pulled via inline fragments, so classifying a large backlog as stale-vs-live is a flat CEL filter with no per-item fetch: todos.filter(t, t.targetState in ["merged", "closed"]). Writes a todoList resource.

Added: mark_todos_done(todoIds) — bulk mirror of mark_todo_done. Marks many todos done in one fan-out (accepts gids or numeric ids), guarding the null payload GitLab returns on permission-denied/not-found; per-todo failures land in failed[] rather than aborting the batch. Writes a bulkTodoResult resource. Together with list_todos, clearing a large stale backlog is: list → CEL-filter merged/closed → mark_todos_done.

2026.07.10.4

Added: remove_mr_reviewers(project, iids, username?) — remove a reviewer (default: the authenticated user) from multiple MRs in one fan-out, via GraphQL mergeRequestSetReviewers with operationMode: REMOVE. Other reviewers are preserved; it is idempotent; per-MR failures land in failed[] rather than aborting the batch. The reviewer-side sibling of unassign_from_mrs, for clearing yourself off MRs you've already reviewed (the "approved-but-still-listed" clutter). Writes a reviewerRemovalResult resource.

2026.07.10.3

Added: list_mr_discussions(project, iid) — resolvable discussion threads on an MR with per-thread resolvable/resolved/resolvedBy and a slim diff position (file/line) hoisted to the thread level, plus the thread notes. System-only threads are excluded. Unresolved threads (the discussions_not_resolved merge blocker) are a CEL filter away: size(discussions.filter(d, d.resolvable && !d.resolved)).

Added: resolve_mr_discussion(project, iid, discussionId, resolved) — resolve or unresolve a thread (GraphQL discussionToggleResolve).

Changed: add_mr_note takes an optional discussionId to reply into an existing thread rather than post top-level. Omitting it is unchanged behavior; add_issue_note is untouched.

2026.07.10.2

Added: A canonical, GitLab-flavored reference on every dashboard work item from list_my_merge_requestsgroup/project!123 for MRs, group/project#123 for issue todos — so items in a cross-project list are uniquely identifiable and autolink in GitLab markdown. MRs derive it from the project path + iid; todos parse it (and a new iid) from targetUrl (the todo's own project field is a display name, not a path). The @webframp/review-dashboard report now renders these references, unfenced, in the MR tables and the todos table (falling back to the project path / target type for data written before this release).

2026.07.10.1

Added: unassign_from_mrs(project, iids, username?) — remove an assignee (default: the authenticated user) from multiple MRs in a single fan-out call. Uses GraphQL mergeRequestSetAssignees with operationMode: REMOVE, so other assignees are preserved; it is idempotent, and per-MR failures are recorded in a failed[] list rather than aborting the batch. Complements set_mr_assignees (REPLACE, single MR) for the common "clear my review queue" case without a read-modify-write. Writes a new unassignResult resource.

2026.07.08.4

Added: MR note management and assignee control.

  • update_mr_note(project, iid, noteId, body) — edit an MR comment by id (GraphQL updateNote).
  • delete_mr_note(project, iid, noteId) — remove an MR comment by id (GraphQL destroyNote). Previously a comment could be created but not deleted in-model.
  • set_mr_assignees(project, iid, usernames) — set/replace assignees by username (GraphQL mergeRequestSetAssignees, operationMode: REPLACE); pass an empty list to unassign. GitLab CE keeps a single assignee; EE/Premium support multiple.

2026.07.08.3

Added: CI-failure diagnosis for merge requests.

  • get_pipeline_jobs(project, pipelineId, scope=failed) — list a pipeline's jobs with GitLab's failure_reason, so a caller can tell a transient failure (runner_system_failure, stuck_or_timeout_failure, job_execution_timeout, api_failure) from a real one (script_failure).
  • get_job_log(project, jobId, tailLines=200) — the tail of a job's trace, to diagnose why it failed (never the whole log).
  • retry_job(project, jobId) / retry_pipeline(project, pipelineId) — re-run CI after a transient failure.
  • get_merge_request now also returns headPipelineId, so you can go straight from a blocked MR to its failed jobs.

2026.07.08.2

Added:

  • get_merge_request — report an MR's mergeability via GitLab's detailed_merge_status, with a plain-English summary and blockers li

Modified 1 models

2026.07.10.4

2026.07.10.4

Added: remove_mr_reviewers(project, iids, username?) — remove a reviewer (default: the authenticated user) from multiple MRs in one fan-out, via GraphQL mergeRequestSetReviewers with operationMode: REMOVE. Other reviewers are preserved; it is idempotent; per-MR failures land in failed[] rather than aborting the batch. The reviewer-side sibling of unassign_from_mrs, for clearing yourself off MRs you've already reviewed (the "approved-but-still-listed" clutter). Writes a reviewerRemovalResult resource.

2026.07.10.3

Added: list_mr_discussions(project, iid) — resolvable discussion threads on an MR with per-thread resolvable/resolved/resolvedBy and a slim diff position (file/line) hoisted to the thread level, plus the thread notes. System-only threads are excluded. Unresolved threads (the discussions_not_resolved merge blocker) are a CEL filter away: size(discussions.filter(d, d.resolvable && !d.resolved)).

Added: resolve_mr_discussion(project, iid, discussionId, resolved) — resolve or unresolve a thread (GraphQL discussionToggleResolve).

Changed: add_mr_note takes an optional discussionId to reply into an existing thread rather than post top-level. Omitting it is unchanged behavior; add_issue_note is untouched.

2026.07.10.2

Added: A canonical, GitLab-flavored reference on every dashboard work item from list_my_merge_requestsgroup/project!123 for MRs, group/project#123 for issue todos — so items in a cross-project list are uniquely identifiable and autolink in GitLab markdown. MRs derive it from the project path + iid; todos parse it (and a new iid) from targetUrl (the todo's own project field is a display name, not a path). The @webframp/review-dashboard report now renders these references, unfenced, in the MR tables and the todos table (falling back to the project path / target type for data written before this release).

2026.07.10.1

Added: unassign_from_mrs(project, iids, username?) — remove an assignee (default: the authenticated user) from multiple MRs in a single fan-out call. Uses GraphQL mergeRequestSetAssignees with operationMode: REMOVE, so other assignees are preserved; it is idempotent, and per-MR failures are recorded in a failed[] list rather than aborting the batch. Complements set_mr_assignees (REPLACE, single MR) for the common "clear my review queue" case without a read-modify-write. Writes a new unassignResult resource.

2026.07.08.4

Added: MR note management and assignee control.

  • update_mr_note(project, iid, noteId, body) — edit an MR comment by id (GraphQL updateNote).
  • delete_mr_note(project, iid, noteId) — remove an MR comment by id (GraphQL destroyNote). Previously a comment could be created but not deleted in-model.
  • set_mr_assignees(project, iid, usernames) — set/replace assignees by username (GraphQL mergeRequestSetAssignees, operationMode: REPLACE); pass an empty list to unassign. GitLab CE keeps a single assignee; EE/Premium support multiple.

2026.07.08.3

Added: CI-failure diagnosis for merge requests.

  • get_pipeline_jobs(project, pipelineId, scope=failed) — list a pipeline's jobs with GitLab's failure_reason, so a caller can tell a transient failure (runner_system_failure, stuck_or_timeout_failure, job_execution_timeout, api_failure) from a real one (script_failure).
  • get_job_log(project, jobId, tailLines=200) — the tail of a job's trace, to diagnose why it failed (never the whole log).
  • retry_job(project, jobId) / retry_pipeline(project, pipelineId) — re-run CI after a transient failure.
  • get_merge_request now also returns headPipelineId, so you can go straight from a blocked MR to its failed jobs.

2026.07.08.2

Added:

  • get_merge_request — report an MR's mergeability via GitLab's detailed_merge_status, with a plain-English summary and blockers list (answers "why can't this MR merge?": need_rebase, conflict, ci_must_pass, not_approved, discussions_not_resolved, draft, …).
  • rebase_merge_request — trigger a rebase of an MR's source branch onto its target (REST), polling until it finishes (rebased), errors (error with merge_error), or is still running (in_progress). Supports skipCi.

2026.07.08.1

Added:

  • list_mr_notes — list the discussion notes/comments on a merge request (mirrors list_issue_notes; writes the shared notes resource with noteableType: "merge_request").
  • mark_todo_done — mark a GitLab to-do as done via the todoMarkDone mutation, so handled items drop off the pending queue. Accepts either the gid://gitlab/Todo/NNN form or a bare numeric id.

2026.06.26.1

Added: approvedByMe (boolean) and myReviewState (pending/reviewed/approved/unapproved, nullable) fields on every MR in list_my_merge_requests output. Consumers can now filter actionable reviews from already-handled ones without

Modified 1 models

2026.07.10.3

2026.07.10.3

Added: list_mr_discussions(project, iid) — resolvable discussion threads on an MR with per-thread resolvable/resolved/resolvedBy and a slim diff position (file/line) hoisted to the thread level, plus the thread notes. System-only threads are excluded. Unresolved threads (the discussions_not_resolved merge blocker) are a CEL filter away: size(discussions.filter(d, d.resolvable && !d.resolved)).

Added: resolve_mr_discussion(project, iid, discussionId, resolved) — resolve or unresolve a thread (GraphQL discussionToggleResolve).

Changed: add_mr_note takes an optional discussionId to reply into an existing thread rather than post top-level. Omitting it is unchanged behavior; add_issue_note is untouched.

2026.07.10.2

Added: A canonical, GitLab-flavored reference on every dashboard work item from list_my_merge_requestsgroup/project!123 for MRs, group/project#123 for issue todos — so items in a cross-project list are uniquely identifiable and autolink in GitLab markdown. MRs derive it from the project path + iid; todos parse it (and a new iid) from targetUrl (the todo's own project field is a display name, not a path). The @webframp/review-dashboard report now renders these references, unfenced, in the MR tables and the todos table (falling back to the project path / target type for data written before this release).

2026.07.10.1

Added: unassign_from_mrs(project, iids, username?) — remove an assignee (default: the authenticated user) from multiple MRs in a single fan-out call. Uses GraphQL mergeRequestSetAssignees with operationMode: REMOVE, so other assignees are preserved; it is idempotent, and per-MR failures are recorded in a failed[] list rather than aborting the batch. Complements set_mr_assignees (REPLACE, single MR) for the common "clear my review queue" case without a read-modify-write. Writes a new unassignResult resource.

2026.07.08.4

Added: MR note management and assignee control.

  • update_mr_note(project, iid, noteId, body) — edit an MR comment by id (GraphQL updateNote).
  • delete_mr_note(project, iid, noteId) — remove an MR comment by id (GraphQL destroyNote). Previously a comment could be created but not deleted in-model.
  • set_mr_assignees(project, iid, usernames) — set/replace assignees by username (GraphQL mergeRequestSetAssignees, operationMode: REPLACE); pass an empty list to unassign. GitLab CE keeps a single assignee; EE/Premium support multiple.

2026.07.08.3

Added: CI-failure diagnosis for merge requests.

  • get_pipeline_jobs(project, pipelineId, scope=failed) — list a pipeline's jobs with GitLab's failure_reason, so a caller can tell a transient failure (runner_system_failure, stuck_or_timeout_failure, job_execution_timeout, api_failure) from a real one (script_failure).
  • get_job_log(project, jobId, tailLines=200) — the tail of a job's trace, to diagnose why it failed (never the whole log).
  • retry_job(project, jobId) / retry_pipeline(project, pipelineId) — re-run CI after a transient failure.
  • get_merge_request now also returns headPipelineId, so you can go straight from a blocked MR to its failed jobs.

2026.07.08.2

Added:

  • get_merge_request — report an MR's mergeability via GitLab's detailed_merge_status, with a plain-English summary and blockers list (answers "why can't this MR merge?": need_rebase, conflict, ci_must_pass, not_approved, discussions_not_resolved, draft, …).
  • rebase_merge_request — trigger a rebase of an MR's source branch onto its target (REST), polling until it finishes (rebased), errors (error with merge_error), or is still running (in_progress). Supports skipCi.

2026.07.08.1

Added:

  • list_mr_notes — list the discussion notes/comments on a merge request (mirrors list_issue_notes; writes the shared notes resource with noteableType: "merge_request").
  • mark_todo_done — mark a GitLab to-do as done via the todoMarkDone mutation, so handled items drop off the pending queue. Accepts either the gid://gitlab/Todo/NNN form or a bare numeric id.

2026.06.26.1

Added: approvedByMe (boolean) and myReviewState (pending/reviewed/approved/unapproved, nullable) fields on every MR in list_my_merge_requests output. Consumers can now filter actionable reviews from already-handled ones without additional API calls.

Changed: The GraphQL query now fetches approvedBy and reviewers with mergeRequestInteraction on all three MR lists (reviewer, assigned, authored). This adds ~200 bytes per MR to the response but no additional API round-trips. The assigned and authored lists now also populate the commented field (previously always false due to missing currentUser param).

Upgrade note: Schema is additive only. Existing model instances work without reconfiguration. Previously stored dashboard resources will

Modified 1 models

2026.07.10.2

2026.07.10.2

Added: A canonical, GitLab-flavored reference on every dashboard work item from list_my_merge_requestsgroup/project!123 for MRs, group/project#123 for issue todos — so items in a cross-project list are uniquely identifiable and autolink in GitLab markdown. MRs derive it from the project path + iid; todos parse it (and a new iid) from targetUrl (the todo's own project field is a display name, not a path). The @webframp/review-dashboard report now renders these references, unfenced, in the MR tables and the todos table (falling back to the project path / target type for data written before this release).

2026.07.10.1

Added: unassign_from_mrs(project, iids, username?) — remove an assignee (default: the authenticated user) from multiple MRs in a single fan-out call. Uses GraphQL mergeRequestSetAssignees with operationMode: REMOVE, so other assignees are preserved; it is idempotent, and per-MR failures are recorded in a failed[] list rather than aborting the batch. Complements set_mr_assignees (REPLACE, single MR) for the common "clear my review queue" case without a read-modify-write. Writes a new unassignResult resource.

2026.07.08.4

Added: MR note management and assignee control.

  • update_mr_note(project, iid, noteId, body) — edit an MR comment by id (GraphQL updateNote).
  • delete_mr_note(project, iid, noteId) — remove an MR comment by id (GraphQL destroyNote). Previously a comment could be created but not deleted in-model.
  • set_mr_assignees(project, iid, usernames) — set/replace assignees by username (GraphQL mergeRequestSetAssignees, operationMode: REPLACE); pass an empty list to unassign. GitLab CE keeps a single assignee; EE/Premium support multiple.

2026.07.08.3

Added: CI-failure diagnosis for merge requests.

  • get_pipeline_jobs(project, pipelineId, scope=failed) — list a pipeline's jobs with GitLab's failure_reason, so a caller can tell a transient failure (runner_system_failure, stuck_or_timeout_failure, job_execution_timeout, api_failure) from a real one (script_failure).
  • get_job_log(project, jobId, tailLines=200) — the tail of a job's trace, to diagnose why it failed (never the whole log).
  • retry_job(project, jobId) / retry_pipeline(project, pipelineId) — re-run CI after a transient failure.
  • get_merge_request now also returns headPipelineId, so you can go straight from a blocked MR to its failed jobs.

2026.07.08.2

Added:

  • get_merge_request — report an MR's mergeability via GitLab's detailed_merge_status, with a plain-English summary and blockers list (answers "why can't this MR merge?": need_rebase, conflict, ci_must_pass, not_approved, discussions_not_resolved, draft, …).
  • rebase_merge_request — trigger a rebase of an MR's source branch onto its target (REST), polling until it finishes (rebased), errors (error with merge_error), or is still running (in_progress). Supports skipCi.

2026.07.08.1

Added:

  • list_mr_notes — list the discussion notes/comments on a merge request (mirrors list_issue_notes; writes the shared notes resource with noteableType: "merge_request").
  • mark_todo_done — mark a GitLab to-do as done via the todoMarkDone mutation, so handled items drop off the pending queue. Accepts either the gid://gitlab/Todo/NNN form or a bare numeric id.

2026.06.26.1

Added: approvedByMe (boolean) and myReviewState (pending/reviewed/approved/unapproved, nullable) fields on every MR in list_my_merge_requests output. Consumers can now filter actionable reviews from already-handled ones without additional API calls.

Changed: The GraphQL query now fetches approvedBy and reviewers with mergeRequestInteraction on all three MR lists (reviewer, assigned, authored). This adds ~200 bytes per MR to the response but no additional API round-trips. The assigned and authored lists now also populate the commented field (previously always false due to missing currentUser param).

Upgrade note: Schema is additive only. Existing model instances work without reconfiguration. Previously stored dashboard resources will be overwritten on next method call.

06Stats
A
100 / 100
Downloads
336
Archive size
81.1 KB
  • Has README or module doc2/2earned
  • README has a code example1/1earned
  • README is substantive1/1earned
  • Most symbols documented1/1earned
  • No slow types (deprecated)1/1earned
  • Dependencies pass trust audit2/2earned
  • Has description1/1earned
  • Platform support declared (or universal)2/2earned
  • License declared1/1earned
  • Verified public repository2/2earned
07Platforms
08Labels