Merge Requests
Working with GitLab merge requests via glab mr.
Scripts directory (absolute, for invocations from other skills where ${CLAUDE_SKILL_DIR} points elsewhere): !mkdir -p /tmp/claude/gitlab-skill 2>/dev/null; touch "/tmp/claude/gitlab-skill/${CLAUDE_SESSION_ID}" 2>/dev/null; echo "${CLAUDE_SKILL_DIR}/scripts"
Arguments
$0 (optional verb) routes to a section below. With no verb, infer the operation from the request.
create: open an MR. See Patterns.--draftopens it as a draft (glab mr create --draft).merge: merge the MR. See Merging.--autoenables auto-merge (merge.ts --auto-merge).review: review MRs. See Reviews.--role reviewer(default) fetches MRs awaiting your review;--role authortriages threads on MRs you authored.discussions: work MR discussion threads. See Discussions.block: block an MR until another merges. See Blocking.
Flag defaults: --draft off, --auto off, --role reviewer.
Merging
Always use merge.ts to merge. It handles merge trains, auto-merge, and squash, falling back to glab mr merge internally when appropriate.
bun ${CLAUDE_PLUGIN_ROOT}/scripts/merge.ts
bun ${CLAUDE_PLUGIN_ROOT}/scripts/merge.ts --auto-merge
bun ${CLAUDE_PLUGIN_ROOT}/scripts/merge.ts feature-branch --auto-merge --squash
Re-Arm Auto-Merge After a Push
Pushing new commits cancels queued auto-merge and drops the MR from the merge train. GitLab does this deliberately so the new commits get a fresh pipeline and review. To keep auto-merge, re-run merge.ts --auto-merge after every push that intends to stay armed. The script is idempotent: it treats an already-armed MR as success and retries through the brief approvals_syncing window that follows a push, so re-running it is always safe.
A push also resets approvals when reset_approvals_on_push is on. Re-trigger review in the same pass, see Re-request reviewers.
Inspect or Recover a Train
To inspect the active train or clear a stuck entry via the API (glab has no merge-train command), see merge-trains.md.
Patterns
Always push before creating:
git push -u origin feature-branch && glab mr create --fill
Draft MRs: Use --draft to prevent accidental merges.
Auto-fill vs custom: --fill auto-populates from commits but cannot combine with --title/--description. Choose one approach.
Body from file: No --body-file flag; use --description "$(cat file.md)".
Username resolution: Flags like --reviewer and --assignee require exact usernames; invalid names are silently ignored. Look up users first:
glab api projects/:id/members/all --paginate | jq '.[] | select(.name | test("<name>"; "i")) | {name, username}'
Blocking
Block an MR from merging until another MR merges first (block verb). See blocking.md for the REST API commands.
Reviews
Submit review feedback as draft notes that accumulate before publishing. See review.md for the draft notes workflow, code suggestions, and approvals.
Fetch MRs awaiting your first review across all projects (the UNREVIEWED bucket; REST's scope=reviews_for_me cannot filter by review state). Emits [{ url, reference, title }] as JSON:
bun ${CLAUDE_SKILL_DIR}/scripts/review-queue.ts
See review-state.md for the underlying GraphQL query and filter.
To group all your review-requested MRs by next actor (not just the UNREVIEWED slice), see Review Inbox (Next-Actor Triage) in review-state.md.
Re-request reviewers
Re-trigger a review after a push reset approvals. The mergeRequestReviewerRereview mutation flips the target's reviewState back to UNREVIEWED and re-surfaces the MR. The reviewer must already be assigned. See Re-Request Review for the user-ID lookup and exact mutation.
Discussions
Fetch, filter, resolve, and summarize MR discussion threads. See discussions.md for the discussions script, resolution workflow, and pagination pitfalls.
Stacking
glab stack manages stacked diffs, small changes that build on each other. See stack.md.