Gitlab
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=featureMethods
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)
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
Global Arguments
| Argument | Type | Description |
|---|---|---|
| host | string | GitLab hostname (e.g. git.example.org) |
| token | string | GitLab personal access token with api scope (use vault reference) |
| Argument | Type | Description |
|---|---|---|
| project | string | Project path (e.g. mygroup/myproject) |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| state | enum |
| Argument | Type | Description |
|---|---|---|
| project | string | Project path (group/repo) or numeric ID |
| ref | string | Branch or ref to list from; empty uses the default branch |
| since | string | Only commits after this ISO 8601 timestamp; empty = no lower bound |
| perPage | number | Page size (max 100) |
| Argument | Type | Description |
|---|---|---|
| url | string | GitLab blob URL, e.g. https://<host>/<group>/<project>/-/blob/<ref>/<path> |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| state | enum |
| Argument | Type | Description |
|---|---|---|
| project | string |
| Argument | Type | Description |
|---|---|---|
| project | string |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| title | string | |
| description | string | |
| labels | array |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| title? | string | |
| description? | string | |
| labels? | array | |
| stateEvent? | enum |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| body | string |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number |
| Argument | Type | Description |
|---|---|---|
| todoId | string | Todo ID — the gid (gid://gitlab/Todo/NNN) or the numeric id |
| Argument | Type | Description |
|---|---|---|
| state | enum | Which todos to fetch (default pending) |
| maxTodos | number | Safety cap on total todos fetched across pages |
| Argument | Type | Description |
|---|---|---|
| todoIds | array | Todo ids (gid://gitlab/Todo/NNN or numeric) |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| title | string | |
| sourceBranch | string | |
| targetBranch | string | |
| description | string |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| skipCi | boolean |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| pipelineId | number | |
| scope | enum |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| jobId | number | |
| tailLines | number |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| jobId | number |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| pipelineId | number |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| squash | boolean |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| title? | string | |
| description? | string | |
| labels? | array | |
| stateEvent? | enum |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| body | string |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| noteId | number | |
| body | string |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| noteId | number |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| usernames | array |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iids | array | |
| username? | string |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iids | array | |
| username? | string |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| usernames | array |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| first | number |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| iid | number | |
| discussionId | string | |
| resolved | boolean |
| Argument | Type | Description |
|---|---|---|
| project | string |
| Argument | Type | Description |
|---|---|---|
| project | string | |
| name | string | |
| color | string | |
| description | string |
| Argument | Type | Description |
|---|---|---|
| project | string |
| Argument | Type | Description |
|---|---|---|
| project | string |
Resources
Prioritized action items dashboard from cross-project MR data
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
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
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
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
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
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
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
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
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
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
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
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
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_requests — group/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 (GraphQLupdateNote).delete_mr_note(project, iid, noteId)— remove an MR comment by id (GraphQLdestroyNote). Previously a comment could be created but not deleted in-model.set_mr_assignees(project, iid, usernames)— set/replace assignees by username (GraphQLmergeRequestSetAssignees,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'sfailure_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_requestnow also returnsheadPipelineId, so you can
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_requests — group/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 (GraphQLupdateNote).delete_mr_note(project, iid, noteId)— remove an MR comment by id (GraphQLdestroyNote). Previously a comment could be created but not deleted in-model.set_mr_assignees(project, iid, usernames)— set/replace assignees by username (GraphQLmergeRequestSetAssignees,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'sfailure_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_requestnow also returnsheadPipelineId, 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
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_requests — group/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 (GraphQLupdateNote).delete_mr_note(project, iid, noteId)— remove an MR comment by id (GraphQLdestroyNote). Previously a comment could be created but not deleted in-model.set_mr_assignees(project, iid, usernames)— set/replace assignees by username (GraphQLmergeRequestSetAssignees,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'sfailure_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_requestnow also returnsheadPipelineId, 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'sdetailed_merge_status, with a plain-Englishsummaryandblockersli
Modified 1 models
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_requests — group/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 (GraphQLupdateNote).delete_mr_note(project, iid, noteId)— remove an MR comment by id (GraphQLdestroyNote). Previously a comment could be created but not deleted in-model.set_mr_assignees(project, iid, usernames)— set/replace assignees by username (GraphQLmergeRequestSetAssignees,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'sfailure_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_requestnow also returnsheadPipelineId, 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'sdetailed_merge_status, with a plain-Englishsummaryandblockerslist (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 (errorwithmerge_error), or is still running (in_progress). SupportsskipCi.
2026.07.08.1
Added:
list_mr_notes— list the discussion notes/comments on a merge request (mirrorslist_issue_notes; writes the sharednotesresource withnoteableType: "merge_request").mark_todo_done— mark a GitLab to-do as done via thetodoMarkDonemutation, so handled items drop off the pending queue. Accepts either thegid://gitlab/Todo/NNNform 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
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_requests — group/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 (GraphQLupdateNote).delete_mr_note(project, iid, noteId)— remove an MR comment by id (GraphQLdestroyNote). Previously a comment could be created but not deleted in-model.set_mr_assignees(project, iid, usernames)— set/replace assignees by username (GraphQLmergeRequestSetAssignees,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'sfailure_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_requestnow also returnsheadPipelineId, 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'sdetailed_merge_status, with a plain-Englishsummaryandblockerslist (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 (errorwithmerge_error), or is still running (in_progress). SupportsskipCi.
2026.07.08.1
Added:
list_mr_notes— list the discussion notes/comments on a merge request (mirrorslist_issue_notes; writes the sharednotesresource withnoteableType: "merge_request").mark_todo_done— mark a GitLab to-do as done via thetodoMarkDonemutation, so handled items drop off the pending queue. Accepts either thegid://gitlab/Todo/NNNform 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
Added: A canonical, GitLab-flavored reference on every dashboard work item
from list_my_merge_requests — group/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 (GraphQLupdateNote).delete_mr_note(project, iid, noteId)— remove an MR comment by id (GraphQLdestroyNote). Previously a comment could be created but not deleted in-model.set_mr_assignees(project, iid, usernames)— set/replace assignees by username (GraphQLmergeRequestSetAssignees,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'sfailure_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_requestnow also returnsheadPipelineId, 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'sdetailed_merge_status, with a plain-Englishsummaryandblockerslist (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 (errorwithmerge_error), or is still running (in_progress). SupportsskipCi.
2026.07.08.1
Added:
list_mr_notes— list the discussion notes/comments on a merge request (mirrorslist_issue_notes; writes the sharednotesresource withnoteableType: "merge_request").mark_todo_done— mark a GitLab to-do as done via thetodoMarkDonemutation, so handled items drop off the pending queue. Accepts either thegid://gitlab/Todo/NNNform 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.
- 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