ワンクリックで
auto-merge
// Auto-merge a PR after it is marked ready-for-review, if the change is small, non-disruptive, and all checks pass.
// Auto-merge a PR after it is marked ready-for-review, if the change is small, non-disruptive, and all checks pass.
Diagnose and fix failing CI on a PR. Capped at 3 attempts. Load repo-setup first.
Promote a draft PR to ready-for-review after CI passes and self-review is clean. Assigns reviewers and adds labels.
Clone or refresh a GitHub repo and prepare the working tree. Load this before any situation skill.
Resolve a GitHub issue end-to-end — explore, plan, implement, clean up, and open a draft PR.
Triage and respond to comments on a PR. Fix if actionable, reply either way. Load repo-setup first.
Review a pull request. Self-fix on own PRs, post a review on others'. Load repo-setup first.
| name | auto-merge |
| description | Auto-merge a PR after it is marked ready-for-review, if the change is small, non-disruptive, and all checks pass. |
| license | Apache-2.0 |
| metadata | {"audience":"autonomous-agents"} |
Merge a PR that was just promoted from draft to ready-for-review,
only when the change is small, non-disruptive, and every required
check is green. This skill is the natural successor to mark-pr-ready.
Load after the mark-pr-ready skill has run (or after a
pull_request.ready_for_review event). Do not load it for PRs
that were created as ready-for-review from the start — only for PRs
that transitioned from draft.
If any precondition fails, stop — do not merge. Post a comment explaining which precondition was not met.
Classify the PR as "small and non-disruptive" only when all of these hold:
.github/workflows/, Dockerfile,
docker-compose*, Makefile, Justfile, Terraform *.tf).bun.lock, package-lock.json,
yarn.lock, pnpm-lock.yaml, Cargo.lock, go.sum).If the PR exceeds the size gate, stop. Post a comment noting the PR needs human review and list which criteria it exceeded.
Verify PR state and target branch:
PR_JSON=$(gh pr view <N> --json state,isDraft,baseRefName)
STATE=$(echo "$PR_JSON" | jq -r '.state')
IS_DRAFT=$(echo "$PR_JSON" | jq -r '.isDraft')
BASE=$(echo "$PR_JSON" | jq -r '.baseRefName')
DEFAULT_BRANCH=$(gh repo view --json defaultBranchRef --jq .defaultBranchRef.name)
STATE=OPEN, IS_DRAFT=false. If draft or closed, stop.BASE == DEFAULT_BRANCH. If the PR targets a release or
other protected branch, stop — those need human review.Verify all checks pass:
CHECKS=$(gh pr view <N> --json statusCheckRollup \
--jq '.statusCheckRollup')
For each check, inspect status and conclusion:
status other than "COMPLETED" (e.g.
"QUEUED", "IN_PROGRESS", "PENDING"), stop — checks
haven't finished yet. Post a comment noting which checks are
still running.conclusion other than "SUCCESS",
"SKIPPED", or "NEUTRAL", stop — checks are failing. Post a
comment listing the failing checks.Quick jq filter for non-passing completed checks:
FAILING=$(echo "$CHECKS" | jq '[.[] | select(
.status == "COMPLETED" and
.conclusion != "SUCCESS" and
.conclusion != "SKIPPED" and
.conclusion != "NEUTRAL"
)]')
Quick jq filter for still-running checks:
PENDING=$(echo "$CHECKS" | jq '[.[] | select(.status != "COMPLETED")]')
Evaluate the size gate:
PR_DATA=$(gh pr view <N> --json additions,deletions,files)
ADDITIONS=$(echo "$PR_DATA" | jq '.additions')
DELETIONS=$(echo "$PR_DATA" | jq '.deletions')
TOTAL=$((ADDITIONS + DELETIONS))
FILES_CHANGED=$(echo "$PR_DATA" | jq '.files | length')
Check each criterion listed in the size gate section. Inspect the file list for CI/CD, lockfile, migration, auth, or public API changes:
echo "$PR_DATA" | jq -r '.files[].path'
Check for review objections and unresolved threads:
CHANGES_REQUESTED=$(gh pr view <N> --json reviews \
--jq '[.reviews[] | select(.state == "CHANGES_REQUESTED")] | length')
If CHANGES_REQUESTED > 0, stop — a reviewer has requested changes.
Check for unresolved review threads via the GraphQL API:
UNRESOLVED=$(gh api graphql -f query='
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(first: 100) {
nodes { isResolved }
}
}
}
}' -f owner=<OWNER> -f repo=<REPO> -F pr=<N> \
--jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)] | length')
If UNRESOLVED > 0, stop — there are unresolved review threads.
Merge:
gh pr merge <N> --squash --auto --delete-branch
Use --squash to keep the main branch history clean.
Use --auto so GitHub waits for branch protection rules.
Use --delete-branch to clean up the feature branch.
Post a short comment confirming the merge was enabled. Mention the total diff size and that all checks passed. Write it naturally — vary the wording, don't use a canned phrase.
In all these cases, leave a comment explaining why auto-merge was skipped, and let a human decide.
mark-pr-ready
completes, or in response to a pull_request.ready_for_review webhook.--auto flag on gh pr merge respects branch protection rules.
If the repo requires approvals, the merge will wait until those are
satisfied.