bundles/dev-workflow/skills/release-pr-gates/SKILL.md
Holds a release at the gate — opens or reuses a release PR into the trunk, runs local format, lint, and type-check, watches required GitHub checks through to green, and summarizes the failing run's root cause when they are not. Tags only after the gate passes. Reach for it during the pre-merge wait; for version derivation and plain-English patch notes, use `release`.
npx skillsauth add shipshitdev/library release-pr-gatesInstall 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.
Verify required CI checks are green on the trunk, then cut a release (semver tag + GitHub release) or open a release PR targeting the default branch. Staging and production are deployment environments driven by CI/CD and tags — not long-lived branches.
Apply this engine only within the user's requested task and existing explicit authorization. Loading or delegating to it grants no additional authority. Preserve report-only restrictions and the caller's target, host, provider, and cost limits. Existing approval satisfies a gate only for the same actions and scope; obtain approval before expanding them. Forward these limits to delegates.
Inputs:
Outputs:
Creates/Modifies:
External Side Effects:
Confirmation Required:
Delegates To:
github-fix-ci when checks failrelease once the gate is green and the cut needs semver derivation and
plain-English patch notes — this skill owns the wait, that one owns the cutchangelog-generator when a release body needs commit summariesdeploy after release gates pass and provider deployment is neededVerify GitHub CLI and auth:
gh --version
gh auth status -h github.com
Verify clean release context:
git status -sb
git remote -v
git fetch --all --prune
Identify the repository and default branch (the trunk):
gh repo view --json nameWithOwner,defaultBranchRef --jq '{repo:.nameWithOwner,trunk:.defaultBranchRef.name}'
Fallback if GitHub CLI is unavailable:
git symbolic-ref refs/remotes/origin/HEAD | sed 's|refs/remotes/origin/||'
Confirm the trunk is ahead of or at the expected state:
git log --oneline origin/<trunk> -10
All PRs target the trunk (default branch). Choose the head in this order:
There are no develop, staging, or other long-lived promotion branches.
Require explicit user confirmation before merging into the trunk.
Run local quality gates before opening or updating the release PR. Format, lint, and type-check are mandatory because they mirror GitHub Actions and are cheap to run locally:
bun run format || npm run format || bunx biome check --write .
bun run lint || npm run lint || bunx turbo lint
bun run typecheck || bun run type-check || npm run typecheck || npm run type-check || bunx tsc --noEmit
Fix failures before pushing. Do not open a release PR with known local format, lint, or type errors.
Inspect divergence between the source branch and the trunk:
git log --oneline origin/<trunk>..origin/<head>
git diff --stat origin/<trunk>...origin/<head>
Check for an existing open PR targeting the trunk:
gh pr list --head <head> --base <trunk> --state open --json number,url,headRefName,baseRefName
If no open PR exists, create one:
gh pr create --head <head> --base <trunk> --title "Release: <head> → <trunk>" --body-file <body-file>
The PR body should include:
<trunk>..<head>If an open PR already exists, reuse it. Do not create duplicates.
Mark the PR ready for review only if the user requested a non-draft PR or the repository release convention requires ready PRs.
After creating or finding the PR, wait for GitHub checks:
gh pr checks <number> --watch
If --watch is not available or fails, poll checks:
gh pr checks <number>
Quality gate outcomes:
pass: report the PR is green and ready for review or merge.fail: fetch the failing workflow logs and summarize root cause.pending: keep waiting unless the user asks for a status-only update.skipping or no checks: report exactly what GitHub shows; do not call it green
unless required checks are passing or absent by repository policy.For failed GitHub Actions runs, inspect logs:
gh run view <run-id> --log
Do not rerun workflows unless the user asks.
After gates pass and the PR is merged (or if releasing directly from the trunk), cut a semver tag and GitHub release:
Confirm the tag with the user before creating it.
Create the tag on the trunk HEAD:
git tag v<semver> origin/<trunk>
git push origin v<semver>
Create the GitHub release:
gh release create v<semver> --title "v<semver>" --notes-file <release-notes-file> --target <trunk>
Deployment to staging and production environments is then triggered automatically by CI/CD pipelines that react to the tag — not by merging into additional long-lived branches.
Report:
development
Coordinates a weekly engineering review of board accuracy, recent code changes, operational health, and scoped cleanup. Use for a recurring repository health review or a review of the last several days.
testing
Audits project board configuration and prepares explicitly requested setup, copy, or normalization changes while preserving the existing workflow and provider boundaries. Use when inspecting a board's fields, columns, scope, or configuration.
testing
Reconciles a project board with current work and delivery evidence, reports incomplete coverage and metadata gaps, and applies only approved provider-supported field changes. Use when auditing board drift, reviewing blocked work, or assessing upcoming delivery.
development
Walk through how a subsystem works. Use for "how does X work", code walkthroughs before changing something, and placement or ownership questions. Explains architecture, runtime flow, and onboarding mental models. Can critique architecture. Use why for motivation.