marketplace/bundles/plan-marshall/skills/workflow-integration-gitlab/SKILL.md
GitLab provider for MR review workflows — fetch comments, triage, and respond to review feedback via glab CLI
npx skillsauth add cuioss/plan-marshall workflow-integration-gitlabInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
GitLab provider for the findings-pipeline pr-comment producer. Mirror of the GitHub provider's two-verb contract: fetch_findings (FIND — fetch MR review comments, apply the pre-filter comment-patterns.json, and file one pr-comment finding per surviving comment, quarantining the untrusted body under raw_input.{body}) and post_responses (RESPOND — apply already-decided triage dispositions back to the MR, keyed by hash_id). Triage is NOT on the provider surface. Uses the glab CLI for all GitLab operations.
Architectural context: This SKILL.md owns the provider-side CLI surface. For the FIND → INGEST → one-TRIAGE → one-RESPOND flow that connects this provider to the unified ledger, the batched
manage-findings ingestpass, the per-domainext-triageconsolidated triage, and the invariant gate, seeref-workflow-architecture/standards/findings-pipeline.md.
Execution mode: Fetch MR review comments, triage each for action, implement fixes or generate responses, resolve threads.
Prohibited actions:
glab directly from LLM context; all operations go through script APIConstraints:
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| pr | int | no | auto-detect | MR number (auto-detects current branch's MR if omitted) |
| unresolved-only | bool | no | false | Only return unresolved comments (fetch-comments) |
workflow-integration-gitlab (GitLab MR comment workflow)
├─> gitlab_ops.py (GitLab operations via glab CLI)
├─> gitlab_pr.py (two-verb provider: fetch_findings + post_responses)
└─> triage_helpers (ref-toon-format) — shared error handling
This skill is the GitLab provider in the CI provider model. The central dispatcher (tools-integration-ci:ci) routes to this skill's gitlab_ops.py for all GitLab operations.
# FIND: fetch + pre-filter + file one pr-comment finding per surviving comment (body quarantined under raw_input)
python3 .plan/execute-script.py plan-marshall:workflow-integration-gitlab:gitlab_pr fetch_findings --pr-number 123 --plan-id EXAMPLE-PLAN
# RESPOND: apply already-decided triage dispositions back to the MR, keyed by hash_id
python3 .plan/execute-script.py plan-marshall:workflow-integration-gitlab:gitlab_pr post_responses --pr-number 123 --plan-id EXAMPLE-PLAN
# Raw fetch (no filtering, no storage) — for ad-hoc inspection
python3 .plan/execute-script.py plan-marshall:workflow-integration-gitlab:gitlab_pr fetch-comments --pr 123
# Consumer reads ingested findings via manage-findings (top-level fields only)
python3 .plan/execute-script.py plan-marshall:manage-findings:manage-findings list --plan-id EXAMPLE-PLAN --type pr-comment
| Script | Notation | Purpose |
|--------|----------|---------|
| gitlab_ops | plan-marshall:workflow-integration-gitlab:gitlab_ops | GitLab operations via glab CLI |
| gitlab_pr | plan-marshall:workflow-integration-gitlab:gitlab_pr | Two-verb provider: fetch_findings (FIND — fetch + pre-filter + file) and post_responses (RESPOND — apply triaged dispositions, keyed by hash_id) |
Purpose: Stage MR review comments into the per-type finding store, then let the LLM consumer drive classification and responses from the stored findings.
FIND flow: fetch_findings is the producer surface. It fetches review comments, applies the comment-patterns.json keyword pre-filter to drop obvious noise (bot signatures, "lgtm", etc.), and files one pr-comment finding per surviving comment (the untrusted body quarantined under raw_input.{body}). The batched manage-findings ingest pass then promotes the validated body to the clean top-level fields; the consolidated triage pass reads those top-level fields and decides dispositions, which post_responses transmits back. Triage is not on this provider surface.
Steps:
FIND — file comments to the ledger:
python3 .plan/execute-script.py plan-marshall:workflow-integration-gitlab:gitlab_pr fetch_findings --pr-number {mr} --plan-id {plan_id}
Output reports count_fetched, count_skipped_noise, count_stored, and producer_mismatch_hash_id (set when count_stored ≠ count_fetched − count_skipped_noise; the mismatch is also persisted as a Q-Gate finding under phase 5-execute with title prefix (producer-mismatch)).
Query Stored Findings:
python3 .plan/execute-script.py plan-marshall:manage-findings:manage-findings list --plan-id {plan_id} --type pr-comment
Process by Action Type — the LLM reads each finding's detail (which carries the full body, kind, thread_id, author, path:line, comment_id) and decides code_change / explain / ignore. After acting on each finding, call manage-findings resolve --hash-id {hash} --resolution fixed|suppressed|accepted.
This skill is consumed by:
tools-integration-ci — CI dispatcher routes GitLab operations hereworkflow-pr-doctor — PR diagnosis workflowsphase-6-finalize — plan finalization with MR creationstandards/comment-patterns.json is a pre-filter only — it drops obvious noise (bot signatures, "lgtm", "thanks!") before findings are written. Classification of surviving comments belongs to the LLM consumer, which reads the full body from each finding's detail field.
| Failure | Action | |---------|--------| | fetch-comments failure | Report error to caller with stderr details | | triage failure | Log warning, skip comment, continue | | CI router failure | Log warning, continue — best-effort |
The canonical argparse surface for gitlab_pr.py. The plugin-doctor analyzer (_analyze_manage_invocation.py) reads this section as source-of-truth for the manage-invocation-invalid and missing-canonical-block rules. Consuming docs xref this section by name instead of restating the command inline. See pm-plugin-development:plugin-script-architecture cross-skill-integration.md § "Script invocation in documentation".
python3 .plan/execute-script.py plan-marshall:workflow-integration-gitlab:gitlab_pr fetch-comments \
[--pr PR] [--unresolved-only]
python3 .plan/execute-script.py plan-marshall:workflow-integration-gitlab:gitlab_pr fetch_findings \
--pr-number PR_NUMBER --plan-id PLAN_ID
python3 .plan/execute-script.py plan-marshall:workflow-integration-gitlab:gitlab_pr post_responses \
--pr-number PR_NUMBER --plan-id PLAN_ID
plan-marshall:tools-integration-ci — Central CI dispatcherplan-marshall:workflow-integration-github — GitHub provider counterpartplan-marshall:workflow-pr-doctor — PR diagnosis workflowsdevelopment
Domain-owned OpenRewrite log-line finding parser for the java-cui domain — parses the
development
Domain-owned OpenRewrite marker detection for the java-cui domain — scans Java/Kotlin sources for cui-rewrite TODO markers, categorizes them by recipe, and fails the gate on any detected marker
development
Operator control surface for the marshalld build server — enrol/drop a project in the machine-global registry (the opt-in enable signal and anti-laundering wall), manage the daemon lifecycle (start, stop, drain, status, install, upgrade) version-pinned to the verified bundle copy, and inspect the daemon's per-project interaction-audit log (read-only)
tools
The tiny build-consumption client for the marshalld build server — submit a build job, bounded long-poll for its result, ping the daemon identity, and preflight registry-plus-liveness in one call; consumption only, never provisioning or enrolment