skills/create-release/SKILL.md
Automate semantic version releases across project types by detecting version files, bumping versions, updating changelogs, creating git tags, and optionally publishing GitHub releases. Use when users ask to cut a release, bump the version, prepare a new version, tag a release, update the changelog for a release, or publish a GitHub release.
npx skillsauth add ragnarok22/agent-skills create-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.
Prepare and execute a semantic version release by bumping version strings, updating changelogs, committing changes, tagging, and optionally publishing a GitHub release.
Scan the repository root for files that contain version strings. Check these files in order:
package.json (field version), package-lock.json, lerna.jsonpyproject.toml (fields project.version or tool.poetry.version), setup.cfg (field version), setup.py (argument version=), __version__.py or _version.py in source directories, version.pyCargo.toml (field version under [package])build.gradle or build.gradle.kts (property version), pom.xml (element <version> under <project>)app.json (field expo.version or version), Info.plist (CFBundleShortVersionString)version.txt, VERSIONSearch commands:
# Find candidate version files
find . -maxdepth 3 \( \
-name "package.json" -o -name "pyproject.toml" -o \
-name "setup.cfg" -o -name "setup.py" -o \
-name "Cargo.toml" -o -name "build.gradle" -o \
-name "build.gradle.kts" -o -name "pom.xml" -o \
-name "app.json" -o -name "version.txt" -o \
-name "VERSION" -o -name "lerna.json" \
\) -not -path "*/node_modules/*" -not -path "*/.git/*" \
-not -path "*/vendor/*" -not -path "*/target/*"
# Find Python version files
find . -maxdepth 4 \( \
-name "__version__.py" -o -name "_version.py" -o \
-name "version.py" \
\) -not -path "*/node_modules/*" -not -path "*/.git/*" \
-not -path "*/.venv/*" -not -path "*/venv/*"
For each detected file, extract the current version string and record it. If multiple version files exist, verify they contain the same version. If versions are inconsistent, report the discrepancy to the user and ask which version to treat as canonical before proceeding.
If no version files are found, ask the user where versions should be stored and create the entry during the bump step.
MAJOR.MINOR.PATCH with optional pre-release suffix.Current: X.Y.Z -> New: A.B.CDetermine the last release tag and the commit range for changelog generation.
# List recent version tags, sorted by version
git tag --list --sort=-version:refname | head -20
Identify the tag naming convention used in the repository:
vX.Y.Z (most common)X.Y.Z (no prefix)<package>@X.Y.Z (monorepo style)# Find the most recent tag matching a semver pattern
git tag --list --sort=-version:refname 'v*' | head -1
git tag --list --sort=-version:refname '[0-9]*' | head -1
If no existing tags are found:
v unless the user specifies otherwise.Record the last release tag and the tag prefix convention for use in Steps 4 and 8.
# Commits since last tag
git log <last-tag>..HEAD --pretty=format:"%h %s" --no-merges
# If no prior tag exists
git log --pretty=format:"%h %s" --no-merges
If the project uses Conventional Commits, categorize entries:
feat commitsfix commitsrefactor, perf commits! or BREAKING CHANGE footerdocs, test, build, ci, chore commitsIf commit messages do not follow Conventional Commits, group by general intent where possible, or list all changes under a single section.
Format the changelog entry:
## [X.Y.Z] - YYYY-MM-DD
### Added
- Description of feature (hash)
### Fixed
- Description of fix (hash)
### Changed
- Description of change (hash)
### Breaking Changes
- Description of breaking change (hash)
Omit empty sections. Use the current date for the release date.
find . -maxdepth 1 -iname "CHANGELOG*" -o -iname "HISTORY*" -o \
-iname "CHANGES*" -o -iname "NEWS*" -o -iname "RELEASES*" | head -5
If a changelog file exists:
If no changelog file exists:
CHANGELOG.md with a standard header and the new release entry.Present the changelog diff to the user for review before saving.
Scan the README for version-specific content that may need updating:
# Search for version strings, badges, or install instructions referencing the old version
grep -n "<old-version>\|badge.*version\|install.*<old-version>" README.md 2>/dev/null || true
Check for:
pip install package==X.Y.Z, npm install [email protected])If version references are found:
If no version references are found or no README exists, skip this step.
Update the version string in every file identified in Step 1. Apply file-type-specific update methods:
"version" field value. For package-lock.json, update both the root version and packages[""].version.version = "X.Y.Z" under [project] or [tool.poetry].version = X.Y.Z under [metadata].version="X.Y.Z" argument.__version__ = "X.Y.Z" or VERSION = "X.Y.Z".version = "X.Y.Z" under [package].version = "X.Y.Z" or version "X.Y.Z".<version>X.Y.Z</version> under the root <project> element (not dependency versions)."version" field.After making changes, verify all version files now contain the new version:
git diff --name-only
Safety gate (mandatory): Before executing any git commands that modify history, present the full plan to the user and wait for explicit confirmation:
After approval:
# Stage all modified version and changelog files
git add <list of modified files>
# Commit with a descriptive message
git commit -m "release: bump version to X.Y.Z"
# Create an annotated tag
git tag -a <prefix>X.Y.Z -m "Release X.Y.Z"
Use the tag prefix convention detected in Step 3 (default: v).
After execution, confirm:
Do not push to remote unless the user explicitly asks. If the user requests a push:
git push origin <branch>
git push origin <prefix>X.Y.Z
gh CLI is available:gh --version 2>/dev/null
If gh is not installed, inform the user and skip this step.
If gh is available, ask the user if they want to create a GitHub release.
If confirmed, create the release using the changelog content from Step 4 as the body:
gh release create <prefix>X.Y.Z \
--title "<prefix>X.Y.Z" \
--notes "<changelog content>"
For pre-release versions (versions with -alpha, -beta, -rc suffixes):
gh release create <prefix>X.Y.Z \
--title "<prefix>X.Y.Z" \
--notes "<changelog content>" \
--prerelease
npm publish, cargo publish, twine upload, or any package registry publish command. This skill handles version bumping and tagging only, not package publishing.git status before committing to detect unrelated staged changes.v.-alpha.N, -beta.N, -rc.N suffixes. Ask user if the release is stable or pre-release.Read references/semver-2.0.0.md for the semantic versioning specification summary.
development
Create Git commit messages that conform to Conventional Commits 1.0.0, including type/scope/description format, optional body, trailer-style footers, and explicit BREAKING CHANGE signaling. Use when users ask to draft commit messages, commit current changes, rewrite a commit message into conventional format, or enforce conventional commit standards in a repo.
development
Optimize Django ORM performance by detecting N+1 query patterns, missing `select_related`/`prefetch_related`, and likely index gaps. Run targeted static scans, optional runtime query capture, and produce a prioritized remediation plan with expected query-count impact. Use when users ask to speed up Django endpoints, reduce database hits, investigate slow views/serializers, or audit QuerySet efficiency before release.
development
Audit Python codebases for security, performance, correctness, and architecture antipatterns. Run optional trusted runtime checks (syntax, tests, lint, typing) plus static rule scans, then output a 0-100 health score with actionable fixes. Use when users ask to inspect a Python project, run a Python health check, review backend code quality, or perform a pre-release audit.
development
Verify Dockerfiles and Docker Compose manifests for security issues, reliability risks, optimization opportunities, syntax errors, and misconfiguration before builds or deploys. Run deterministic checks (`scripts/verify-docker.sh`, `docker compose config -q`, optional `hadolint`) and produce a 0-100 health score with prioritized fixes. Use when users ask to validate Dockerfile(s), docker-compose/compose YAML files, harden container configuration, optimize image/runtime setup, debug configuration failures, or run a pre-deploy Docker audit.