github-workflows/skills/finalize-pr/SKILL.md
Automatically finalize pull requests for merge by resolving CodeQL violations, review threads, merge conflicts, and CI failures. Handles single PR (current branch or by number), all open PRs in the repo, or all open PRs across the org. Includes bot-authored PRs in all modes.
npx skillsauth add jacobpevans/claude-code-plugins finalize-prInstall 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.
FULLY AUTOMATIC - Fully automates PR finalization: monitor, fix, prepare for merge. Assumes PR already exists.
No manual intervention required. For manual review-focused workflows, use /review-pr.
State warning: Automated reviewers (CodeQL, Copilot, AI reviews) post asynchronously. CI may have re-run. Merge conflicts may have appeared. Re-fetch live PR state from Step 1.
/resolve-pr-threads for review threads/resolve-codeql/ship.Steps 1.1–1.4 run sequentially.
| Argument | Mode | Target |
|---|---|---|
| (none) | Current branch | Single PR on current branch |
| 42 | Single PR | PR #42 |
| all | Repo-wide | All open PRs in current repo |
| org | Org-wide | All open PRs across all repos in current org |
all): List all open PRs (limit 50) with number, title, author, headRefName.org): Enumerate repos, list open PRs per repo (limit 50 each, 50 total cap), include repository field.Tag PRs where author.login ends with [bot] for reporting. Process identically to human PRs.
Display discovery list before proceeding. Verify working tree is clean (if dirty, ask user to commit/stash). Note current branch for restoration.
If invoked via /ship, a context brief is already in session context — skip this step.
If invoked standalone, build a lightweight brief from:
gh pr view <PR_NUMBER> --json body --jq '.body'BASE=$(gh pr view <PR_NUMBER> --json baseRefName --jq '.baseRefName') && git log --oneline origin/$BASE..HEADSynthesize purpose, key changes, and intentional patterns into a 5-10 line block.
This informs /resolve-pr-threads (Phase 2.2) when evaluating reviewer feedback.
Execution strategy: Start CI monitoring in the background (Step 2.1) and
fix all other issues in parallel while CI runs. Never block on CI when other
work is available. Pre-push simplification is handled by /ship; within this
skill, /simplify runs once at Step 2.3.5 after all fixes are applied.
For multi-PR modes, Phases 2-5 execute once per PR in sequence. Check out each PR branch at the
start of each iteration. For org-wide mode, use repository.nameWithOwner from Phase 1 as the
--repo argument when checking out.
Steps 2.1 and 2.2 start concurrently (2.1 is non-blocking). Steps 2.3 and 2.4 run sequentially after 2.2.
Launch CI monitoring in a background Task agent (run_in_background: true on the Task tool).
Monitor CI checks using --watch so the agent blocks until all complete.
Do NOT wait for the agent to finish — proceed to 2.2 immediately.
Run these checks simultaneously. Launch independent fixes in parallel via
Task agents when they touch different files. Invoke superpowers:dispatching-parallel-agents for dispatch patterns.
Run the canonical code-scanning alert count from /gh-cli-patterns.
Replace <OWNER> and <REPO> per the placeholder convention in that skill.
If violations found: Invoke /resolve-codeql fix, validate locally.
Invoke /resolve-pr-threads. It exits cleanly when no threads exist.
After completion, validate locally.
Check if the PR has git conflicts (mergeable field). mergeable: MERGEABLE means no git
conflicts only — it does NOT mean the PR is fully ready to merge. If conflicts: Fetch main,
attempt merge, report unresolvable conflicts for user. After resolution, validate locally. Full
readiness verification (including mergeStateStatus, CI, CodeQL, review decision, threads) happens
in Phase 3.
Check background CI results from 2.1:
After all fixes from 2.2 and 2.3 are complete, invoke /simplify once on all
cumulative changes. This is the single /simplify pass within /finalize-pr —
it catches any code introduced by fix iterations (CodeQL fixes, CI fixes,
review thread implementations) that wasn't part of the original pre-push
simplification. If /simplify produces changes, validate locally, commit,
and push before proceeding to 2.4.
Verify final PR state, mergeability, and check status. If fixes introduced new issues, loop back to 2.2.
⛔ NO SHORT-CIRCUIT — EVERY INVOCATION, EVERY TIME. Run this gate against live API state now, even if this PR was verified 30 seconds ago. Subagent self-reports and prior in-session messages are historical snapshots, not current truth. The world changes: CodeQL completes async, required reviewers post async, Renovate force-pushes, branch protection re-evaluates. Re-run every query below.
Run the canonical PR-readiness gate from /gh-cli-patterns against
<PR_NUMBER>. Replace <OWNER>, <REPO>, <PR_NUMBER> per the placeholder convention in
that skill.
Required values — if any fail, return to Phase 2:
| Field | Required | Abort message |
|-------|---------|---------------|
| state | OPEN | "PR is not open" |
| mergeable | MERGEABLE | "PR has git conflicts — rebase/merge in Phase 2" |
| mergeStateStatus | CLEAN or HAS_HOOKS | "PR merge state is {value} — blocked, return to Phase 2" |
| isDraft | false | "PR is a draft — mark ready for review first" |
| reviewDecision | APPROVED or null | "Review decision is {value} — changes requested or required" |
| statusCheckRollup.state | SUCCESS | "CI rollup is {state} — fix failures in Phase 2" |
| All reviewThreads.isResolved | true | "Unresolved threads — run /resolve-pr-threads" |
| reviewThreads.pageInfo.hasNextPage | false | "More than 100 threads — paginate manually and re-verify" |
mergeStateStatusvalues that are NOT ready:BEHIND(needs rebase),BLOCKED(branch protection — could be required review, CodeQL, or required status check),DIRTY(conflicts),DRAFT,UNKNOWN(GitHub computing),UNSTABLE(checks failed or pending). Any of these = return to Phase 2.
statusCheckRollup does NOT include CodeQL alert state. Run the canonical code-scanning
alert count from /gh-cli-patterns. Replace <OWNER> and <REPO> per the
placeholder convention.
Required: Result must be 0. Any open CodeQL alerts → return to Phase 2,
invoke /resolve-codeql fix.
/simplify ran at Phase 2.3.5 on all changesOnly if all three gates (3.1, 3.2, 3.3) pass: Proceed to Phase 4 to update PR metadata.
Multi-PR handling: If a PR needs human intervention (unresolvable conflict, unrecoverable CI failure, etc.), log it with reason and continue to the next PR. Do not stop the batch for one blocked PR.
Delegate to a haiku subagent to keep full diff out of main context. Steps 4.1 and 4.2 run sequentially within the agent. Step 4.3 runs after both.
Closes #X (directly related issues) or Related: #X (adjacent PRs) — no guessing.After 4.1 and 4.2 complete, apply title and body together — no temp files. Use the heredoc body pattern from /gh-cli-patterns:
gh pr edit <PR_NUMBER> --title "generated title" --body "$(cat <<'EOF'
... generated body ...
EOF
)"
Single-quoted 'EOF' prevents shell expansion. Closing EOF must be alone on its own line with no leading whitespace.
Proceed to Phase 5.
Single/current-branch mode: Emit the Canonical PR Status Summary (Section 1 =
this PR, Section 2 = all open PRs in current repo) as defined in /gh-cli-patterns,
titled PR Status. Then append:
IMPORTANT: Do NOT merge this PR. Wait for the human to review and invoke
/squash-merge-pr # Squash all commits into one
/rebase-pr # Rebase commits onto main (preserves history)
Multi-PR mode: Record the per-PR result (ready / blocked / needs-human). Restore the original branch and continue to the next PR. Do NOT emit a ready report — that happens in Phase 6.
MUST NOT return until ALL conditions pass for EVERY targeted PR: CI green, CodeQL clean, threads resolved, no conflicts, code simplified, local linters and tests pass, metadata updated. If ANY fails, loop back to Phase 2. CRITICAL: CodeQL is SEPARATE from CI — check both independently.
MERGE PROHIBITION: FORBIDDEN from merging, auto-merging, enabling auto-merge, or approving any PR.
Emit the Canonical PR Status Summary as defined in /gh-cli-patterns, titled
Finalization Summary. Section 1 = all PRs processed this run. Section 2 = all open
PRs in affected repos (current repo for all mode; all repos from Phase 1 discovery
for org mode). Show the target repo as a label next to each merge command (no --repo flag; user
runs from the correct worktree).
Wait for explicit user merge commands.
Use ONLY after a PR exists. Phases: 1 (discover) → 1.5 (context brief) →
2 (fix loop) → 3 (verify) → 4 (metadata) → 5 (report ready).
For all/org modes: Phases 2-5 loop per PR, Phase 6 aggregates results.
documentation
Use when editing GitHub Actions workflow files (.github/workflows/*.yml) in JacobPEvans repos. Documents when to target self-hosted RunsOn runners vs GitHub-hosted runners, the v3 label catalog used across the org, the required github.run_id segment, and the GitHub App allowlist prereq.
testing
Check PR merge readiness, sync local repo, cleanup stale worktrees; optional cross-repo sweep and stale-branch prune modes
tools
Local rebase-merge workflow for pull requests with signed commits
tools
Canonical reference for all gh CLI command shapes used by skills in this plugin. Defines the placeholder convention, allowed --json fields, GraphQL fallback rules, -f/-F/--raw-field flag semantics, the PR-readiness gate, code-scanning alert query, review-thread fetch/count/resolve mutations, and heredoc bodies. Prevents Unknown JSON field errors and divergent query shapes.