bundles/github/skills/release/SKILL.md
Cuts the release itself — derives the next semantic version from commits since the last tag, writes plain-English patch notes, previews the plan, then on confirmation creates an annotated tag plus GitHub release, or dispatches the repo's guarded release workflow where production sits behind a workflow_dispatch promote gate. Trunk-based; no develop or staging branch promotion. Assumes the trunk is already green — to open a release PR or wait on required checks first, use `release-pr-gates`.
npx skillsauth add shipshitdev/library releaseInstall 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.
Cut a release from the trunk and produce plain-English patch notes. Trunk-based flow: master/main is the source of truth, releases are tags cut from the trunk, no develop/staging promotion chain. Staging and production are environments driven by CI and tags.
Reads commit history, derives the next semantic version, writes patch notes, then — after confirmation — tags the trunk and publishes a GitHub release. Never rewrites history or tags a dirty or unsynced trunk.
Inputs:
patch / minor / major, or an explicit version vX.Y.Znotes (generate patch notes only, cut nothing) or the default
(notes + tag + GitHub release)since <tag>, 7d, from <date> to <date>);
defaults to "since the last release tag"Outputs:
Creates/Modifies:
vX.Y.Z) on the trunk HEAD and pushes itCHANGELOG.md if the user asksExternal Side Effects:
ghConfirmation Required:
Delegates To:
changelog-generator when a richer or differently-formatted changelog is wantedrelease-pr-gates to open the release PR and wait on required CI checks before
this skill cuts anything — that skill owns the pre-merge gate, this one owns the cutgh-fix-ci when the trunk's required checks are failing and the user wants them fixedgit-cleanup to prune merged feature branches and stale worktrees afterwarddeploy / deployment-composer to ship the freshly cut tag to an environmentHard rules:
git tag or
gh release create would bypass the gate's CI, preflight, and migration
checks, so it is forbidden there.Before Phase 1, determine which release mode the repo uses. Signals for dispatch mode, in priority order:
.github/workflows/ contains a workflow_dispatch release workflow (e.g.
create-release.yml, promote.yml) that itself cuts the tag/release and
runs the production deploy in-run.If neither signal is present, use tag mode (Phases 1–5 below).
In dispatch mode:
Run Phases 1–4 unchanged (preflight, next version, patch notes, plan + confirmation) — the preview and confirmation gates apply identically.
In Phase 5, instead of tagging locally, dispatch the guarded workflow and report the run:
gh workflow run <release-workflow> --ref <trunk> [-f version=<X.Y.Z>]
gh run list --workflow <release-workflow> --limit 1 --json databaseId,url
The workflow owns tagging, the GitHub release, and the deploy. Surface the run URL and stop; do not create tags or releases locally, and do not retry a failed run without showing the failure first.
gh auth status -h github.com
gh repo view --json nameWithOwner,defaultBranchRef --jq '{repo:.nameWithOwner, trunk:.defaultBranchRef.name}'
git fetch --all --tags --prune
git status -sb
Resolve the trunk (default branch) from defaultBranchRef; fall back to
git symbolic-ref --short refs/remotes/origin/HEAD, then explicitly test
origin/master and origin/main before failing:
TRUNK="$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name // empty')"
if [[ -z "$TRUNK" ]]; then
TRUNK="$(git symbolic-ref --quiet --short refs/remotes/origin/HEAD 2>/dev/null | sed 's#^origin/##' || true)"
fi
if [[ -z "$TRUNK" ]]; then
if git rev-parse --verify origin/master >/dev/null 2>&1; then
TRUNK="master"
elif git rev-parse --verify origin/main >/dev/null 2>&1; then
TRUNK="main"
else
echo "ERROR: Neither origin/master nor origin/main found. Available remote branches:"
git branch -r
exit 1
fi
fi
Require:
origin/<trunk> (fast-forward first if it is).Stop and report if any of these fail.
Check the trunk HEAD's required checks:
gh pr checks --watch=false 2>/dev/null || gh api "repos/{owner}/{repo}/commits/$(git rev-parse HEAD)/check-runs" --jq '.check_runs[] | "\(.name): \(.conclusion // .status)"'
If checks are failing or pending, surface them. Proceed only on explicit override
(or hand off to gh-fix-ci / release-pr-gates).
Find the latest release tag and the commits since it:
LAST_TAG=$(git describe --tags --abbrev=0 --match 'v*' 2>/dev/null || echo "")
RANGE=${LAST_TAG:+$LAST_TAG..HEAD}
git log ${RANGE:-HEAD} --pretty=format:'%h%x09%s' --no-merges
Derive the bump from Conventional Commits in that range, unless the user gave an explicit bump or version:
feat!: / fix!: / BREAKING CHANGE -> major (or minor while at
0.x, where breaking changes bump the minor)feat: -> minorfix:, perf:, refactor:, chore:, …) -> patchCompute the next version from the last tag (default the first release to v0.1.0
or v1.0.0 per the repo's convention). Honor an explicit patch/minor/major
or vX.Y.Z argument over the inferred bump.
Write the notes from the commit range, in plain English. Lead with what changed and why it matters; translate commits into product, workflow, reliability, performance, design, data, or deployment outcomes. Keep engineering detail light unless asked.
Group under headings, omitting empty ones:
feat:)fix:)perf:)refactor:/chore:), kept briefAttribute notable PRs with their number and link when available:
gh pr list --state merged --base "<trunk>" --search "merged:>$(git log -1 --format=%cs $LAST_TAG 2>/dev/null)" --json number,url,author
For a richer or house-styled changelog, delegate to changelog-generator.
In notes mode, stop here: print the version + notes, cut nothing.
Print one consolidated plan, then wait for an explicit yes:
<last tag> -> <next version> and the bump reason<last tag>..HEADDo not proceed until the user confirms. If CI is not green, require the explicit override here and note it in the final status.
Only after confirmation, tag the trunk HEAD and publish:
if git rev-parse --verify "refs/tags/<next-version>" >/dev/null 2>&1; then
echo "ERROR: Tag <next-version> already exists. Stop before overwriting release history."
exit 1
fi
git tag -a "<next-version>" -m "<next-version>"
git push origin "<next-version>"
gh release create "<next-version>" --target "<trunk>" --title "<next-version>" --notes "<patch notes>"
Rules during execution:
<next-version> already exists, stop and ask.CHANGELOG.md, prepend the notes under the new
version heading, commit on the trunk via a normal PR or direct commit per repo
policy, and say which path was taken.release notes — Phases 1-3. Generate the next version + patch notes only. Cut
nothing. (Equivalent to a dry run / "what would ship".)release or release <patch|minor|major|vX.Y.Z> — Phases 1-5. Notes, confirm,
tag, and publish the GitHub release. (Default; the explicit arg overrides the
inferred bump.)If the user scopes the notes window (since <tag>, 7d, from <date> to <date>),
honor it for the notes while still versioning from the latest release tag.
Report:
<last tag> -> <next version>) and the bump reasondeploy / deployment-composer, or prune
merged branches via git-cleanup (/cleanup)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.