agentsclimarketplace

Merge open prs

Skill emaraschio/cursor-commands/plugin/.cursor/skill-contracts/merge-open-prs

Production-grade Cursor slash commands with paired skill contracts, behavioral evals, and ship-gate CI. Install as a user plugin.

Install
npx -y skills add emaraschio/cursor-commands --skill merge-open-prs

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 9 stars9 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Review, verify (Docker by default), and auto-merge open PRs when CI, reviews, and local verification pass. Batch up to 10 PRs per run. Use when the user wants to merge all open PRs, clear the PR queue, or run /merge-open-prs.

SKILL.md

8.2 KB, ~2.1k tokens by cl100k_base, as published. Nobody here has run it

Merge open PRs

Orchestrate a batch of open pull requests in the current repo: babysit each PR, code-review, verify locally (Docker-first), auto-merge when green, then post-batch smoke on the default branch.

Do not duplicate the babysit contract inline. Read and follow the babysit skill at ~/.cursor/skills-cursor/babysit/SKILL.md for every PR in the batch.

Entry point: .cursor/commands/merge-open-prs.md (slash /merge-open-prs). When this file disagrees with the command file, this file wins.


Defaults

Apply these when the user does not override:

SettingDefaultOverride
VerificationDocker-first--no-docker
Batch size10 PRs--limit N
Autonomyauto_if_green (merge when gate passes)--dry-run (no merge)
Single PRProcess only that number42 or #42 argument

Parse flags from the user message: --dry-run, --no-docker, --limit N. A bare number selects one PR.


When NOT to use

  • Single PR babysit only (no batch, no queue) → use babysit on that PR directly
  • Cross-repo initiative status → use cross-repo-status or manual gh sweep per user rules
  • PRs needing product/legal sign-off → skip; report in summary
  • Sensitive security changes without explicit user approval → hard stop
  • Repo has no Docker and user did not pass --no-docker → blocker at preflight (do not silently fall back)

Phase 0: Preflight

  1. gh auth status: blocker if not authenticated
  2. Confirm git repo root: git remote get-url origin
  3. git fetch --all --prune
  4. If working tree dirty → warn; do not stash without asking
  5. Docker (default path): docker info. If it fails and user did not pass --no-docker, stop with a blocker (suggest --no-docker only when they accept non-Docker verification)
  6. Resolve profile path: profiles/<repo-basename>.yaml relative to this skill directory (basename from git remote get-url origin, strip .git, last path segment). See profiles/README.md.

Phase 1: Inventory

gh pr list --state open --limit <LIMIT> --json number,title,isDraft,mergeable,reviewDecision,statusCheckRollup,headRefName,author,labels,createdAt,updatedAt
  • <LIMIT> = user --limit or 10 default. Fetch at least that many; if more open PRs exist, note deferred count in the plan table.

  • Skip (do not process): isDraft, labels in profile skip_labels or default do-not-merge, wip

  • Order: createdAt ascending (FIFO). If user passed a PR number, only that PR (still full verify + gate)

  • Emit a plan table before acting:

    #TitleIn batch?Skip reason

Phase 2: Per-PR loop

For each PR in batch (in order):

2a: Babysit

Read and execute ~/.cursor/skills-cursor/babysit/SKILL.md:

  • Resolve merge conflicts (abort if intent conflicts; ask user)
  • Triage unresolved comments (filter resolved threads; validate Bugbot)
  • Fix CI failures in PR scope only; never weaken workflows

Checkout the PR branch: gh pr checkout <n>.

2b: Code review

Apply the checklist in ~/.cursor/skill-contracts/code-review/SKILL.md (or slash /code-review). Surface blockers in chat. Hard stops (entire batch):

  • .env, credentials, API keys in diff
  • DB migration without rollback note in PR description
  • Breaking change (feat!, BREAKING) without explicit user approval in this session

2c: Local verification

Docker-first (default; unless --no-docker)

  1. If profile exists → run verify.steps in order (each step is a shell command)
  2. Else if docker-compose.yml, compose.yaml, or compose.yml exists:
    • docker compose build
    • Run tests via profile-less heuristic: read repo README / Makefile for the canonical test service; prefer docker compose run --rm <service> <test-cmd> over inventing commands
  3. Else → skip PR with reason no-docker-profile-or-compose; do not auto-merge

Never run docker compose down -v unless the user explicitly requests volume teardown.

Host-only (--no-docker)

  1. Profile verify.mode: host steps if present
  2. Else heuristics: make test, bin/test, npm test, pnpm test, bundle exec rspec (first that exists)
  3. If nothing found → skip PR with reason no-verify-path

Record pass/fail output in the session summary.

2d: Re-fetch GitHub state

gh pr view <n> --json mergeable,mergeStateStatus,reviewDecision,isDraft
gh pr checks <n>

Unresolved review threads: use gh api GraphQL or review threads; follow babysit (human threads block; bots per babysit judgment).


Phase 3: auto_if_green gate

Merge only if all are true:

CheckRequirement
Mergeablemergeable == MERGEABLE / mergeStateStatus not blocked
ReviewsreviewDecisionCHANGES_REQUESTED
CIAll required checks SUCCESS (gh pr checks)
ThreadsNo unresolved human review threads
Local verifyPassed in 2c
DraftisDraft == false
  • Pass → Phase 4a to 4b (unless --dry-run)
  • Fail → log reason, continue to next PR (do not stop batch unless auth/rate-limit/hard-stop)

Do not approve before the gate passes. Approval is a pre-merge step, not a substitute for local verify or CI.

--dry-run

Evaluate gate and report would approve / would merge / would skip; never call gh pr merge or gh pr review --approve.


Phase 4a: Approve (always before merge)

After gate passes (and not in --dry-run):

  1. gh pr view <n> --json reviewDecision,author: confirm the authenticated gh user can act as reviewer on this repo
  2. If you have not already left an APPROVE review on this PR in this session:
    • gh pr review <n> --approve with an optional one-line body summarizing verify + CI status
  3. Re-fetch reviewDecision. If still blocked (e.g. requires another reviewer), skip merge with reason approval-insufficient; continue queue
  4. Log approval in the per-PR summary before proceeding

Never approve when gate failed, local verify failed, or hard-stop conditions apply.


Phase 4b: Merge (only after 4a)

Merge only after Phase 4a succeeded (approve recorded or already approved by you):

# squash example
gh pr merge <n> --squash --delete-branch

Use profile merge (squash | merge | rebase) or repo default.

Never:

  • gh pr merge --admin
  • --no-verify on git operations
  • Force-push to default branch
  • Merge with failing required checks

Phase 5: Post-batch smoke

After all PRs processed:

  1. git checkout <default_branch>: from profile or gh repo view --json defaultBranchRef
  2. git pull
  3. Run post_merge_smoke from profile, or repeat a lighter Docker smoke (e.g. same as verify step 1 only) when Docker-default
  4. Summary table: merged | skipped (reason) | failed | deferred (beyond limit) | smoke pass/fail

Profiles

Optional YAML at profiles/<repo-basename>.yaml. Copy from profiles/_template.yaml. Profile overrides detection heuristics.


Behavioral evaluation

Before changing this contract materially, walk eval/cases.md sections A, D, E (minimum). Target: 0 FAIL, ≥90% adjusted pass rate. See eval/README.md.


Lessons (maintainers)

  • Docker default matches repos with a merge profile; --no-docker is explicit opt-out
  • Limit 10 prevents runaway merges; deferred PRs must appear in summary
  • Babysit is source of truth for per-PR triage; do not fork its rules here

Guardrails

  • Merge only when the gate passes: require local verification, CI success, no CHANGES_REQUESTED, and resolved human threads before merging.
  • Do not silently skip Docker; if docker info fails without --no-docker, stop with a blocker.
  • Keep the batch bounded: process up to --limit (default 10) FIFO and report deferred PRs.

What ships with it: 5 files

9.2 KB alongside SKILL.md

eval/

profiles/

Gives 0 of the 12 instructions most quality gates skills give in ~2.1k tokens

Counted across 1,195 of the 2,094 authors here whose files we hold, read 2026-08-07

  • Read the output and check the exit codein 54 of 1195, across 14 files
  • Verify requirements using a line-by-line checklistin 53 of 1195, across 12 files
  • Identify the verification command proving the claimin 51 of 1195, across 12 files
  • Run the full verification commandin 50 of 1195, across 11 files
  • Verify output confirms the claimin 49 of 1195, across 12 files
  • Check version control diff after agent delegationin 46 of 1195, across 6 files
  • State claim with evidencein 44 of 1195, across 4 files
  • Run the test suitein 33 of 1195, across 26 files
  • Keep state in memory by defaultin 27 of 1195, across 6 files
  • Make prototype runnable with one commandin 26 of 1195, across 5 files
  • Produce a verification reportin 25 of 1195, across 14 files
  • Detect the package manager from lockfilesin 24 of 1195, across 5 files

Said here and by no other author read

  • process up to ten pull requests per batch
  • fetch open pull requests in FIFO order
  • skip draft pull requests or blocked labels
  • read and execute the babysit skill per PR
  • fix CI failures within the pull request scope only
  • run local verification via Docker by default

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 327,069. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.