skills/release/SKILL.md
Cut a release from the trunk (default branch) and generate plain-English patch notes. Determines the next semantic version from commits since the last tag, previews the release plan, then on confirmation either creates an annotated tag + GitHub release (tag mode) or dispatches the repo's guarded release workflow (dispatch mode, for repos whose production deploy is gated behind a workflow_dispatch promote gate). Trunk-based — there is no develop/staging branch promotion. Use when the user asks to cut a release, ship a release, tag a release, promote to production, release to production, generate release notes or a changelog, or runs /release.
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 wait on required CI checks before cutting the releasegh-fix-ci when the trunk's required checks are failing and the user wants them fixedrelease-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 release-cleanupdevelopment
TypeScript refactoring and modernization guidelines from a principal specialist perspective. This skill should be used when refactoring, reviewing, or modernizing TypeScript code to ensure type safety, compiler performance, and idiomatic patterns. Triggers on tasks involving TypeScript type architecture, narrowing, generics, error handling, or migration to modern TypeScript features.
tools
Resolves TypeScript and JavaScript problems across type-level programming, performance, monorepo management, migration, and modern tooling. Invoke when diagnosing "type instantiation excessively deep" errors, migrating JS to TS, configuring strict tsconfig, debugging module resolution, or choosing between Biome/ESLint/Turborepo/Nx.
tools
Turborepo monorepo build system guidance. Triggers on: `turbo.json`, task pipelines, `dependsOn`, caching, remote cache, the `turbo` CLI, `--filter`, `--affected`, CI optimization, environment variables, internal packages, monorepo structure, and package boundaries. Use when the user configures tasks or workflows, creates packages, sets up a monorepo, shares code between apps, runs changed packages, debugs cache behavior, or works in an `apps/` plus `packages/` workspace.
tools
Provides Tailwind CSS v4 performance optimization and best practices guidelines. Triggers when writing, reviewing, or refactoring Tailwind CSS v4 code; when working with Tailwind configuration, @theme directive, utility classes, responsive design, dark mode, container queries, or CSS generation optimization.