/release
Tag a version, generate changelog, and create a GitHub release.
Usage
/release [version] [--dry-run] [--draft]
Arguments
- •
version: Semver version (1.2.3) or bump type (patch,minor,major) - •
--dry-run: Preview release without creating anything - •
--draft: Create as draft release (don't publish)
Instructions
When this skill is invoked:
Agent Behavior
Autonomy:
- •Determine version bump from commit history if not specified
- •Generate changelog from conventional commits
- •Create tag and GitHub release end-to-end
Safety:
- •Never release from a dirty worktree
- •Never release from a non-main branch without confirmation
- •Always run quality checks before tagging
Release Process
Phase 1: Pre-Release Checks
- •
Verify clean worktree:
bashgit status --porcelain
If dirty, stop and ask user to commit or stash.
- •
Verify branch:
bashgit branch --show-current
Warn if not
mainormaster. - •
Run quality checks:
bashmake quality # or equivalent from prd/00_technology.md
All checks must pass before release.
- •
Get current version:
bashgit describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
Phase 2: Determine Version
If version not specified, analyze commits since last tag:
git log $(git describe --tags --abbrev=0 2>/dev/null || echo "")..HEAD --oneline
Auto-bump rules (conventional commits):
- •
feat!:orBREAKING CHANGE:→ major - •
feat:→ minor - •
fix:,perf:,refactor:→ patch
Phase 3: Generate Changelog
- •
Check for
CHANGELOG.mdin project root.- •If it exists, update it (see format below).
- •If it doesn't exist, generate changelog for the GitHub release only.
- •
Classify changes using the Breaking Change Policy in
CHANGELOG.md.- •If a commit touches a surface listed in the policy table, check whether it's breaking.
- •If breaking changes are found and the bump type is not
major, warn the user.
- •
Update
CHANGELOG.md(if present):- •Move items from
[Unreleased]into a new[X.Y.Z] - YYYY-MM-DDsection. - •Add the comparison link at the bottom of the file.
- •Categorize entries: Added, Changed, Deprecated, Removed, Fixed, Security.
- •Move items from
- •
Generate GitHub release notes from commits since last tag:
## What's Changed ### Breaking Changes - description (#PR) ### Features - description (#PR) ### Bug Fixes - description (#PR) ### Performance - description (#PR) ### Other Changes - description (#PR) **Full Changelog**: v1.0.0...v1.1.0
Phase 4: Create Release
- •
Update version in package config if applicable:
bash# package.json, pyproject.toml, Cargo.toml, etc.
- •
Commit version bump (if file changed):
bashgit add {package_config} git commit -m "chore: bump version to {version}" - •
Create annotated tag:
bashgit tag -a v{version} -m "Release v{version}" - •
Push tag:
bashgit push origin main --tags
- •
Create GitHub release:
bashgh release create v{version} --title "v{version}" --notes "{changelog}" # or with --draft flag gh release create v{version} --title "v{version}" --notes "{changelog}" --draft
Dry Run Mode
When --dry-run is specified:
- •Show what version would be created
- •Show generated changelog
- •Show files that would be modified
- •Do NOT create tags, commits, or releases
Version File Locations
| Stack | File | Field |
|---|---|---|
| Node.js | package.json | version |
| Python | pyproject.toml | [project] version |
| Go | No file (tags only) | — |
| iOS | Info.plist | CFBundleShortVersionString |
| Android | build.gradle.kts | versionName / versionCode |
Example Output
$ /release minor Pre-release checks... Branch: main Worktree: clean Tests: passing (142/142) Lint: clean Current version: v1.2.0 Analyzing commits since v1.2.0... 3 features, 2 fixes, 1 refactor Bumping: v1.2.0 → v1.3.0 Changelog: ## What's Changed ### Features - Add OAuth2 login support (#45) - Add user avatar uploads (#48) - Add dark mode toggle (#52) ### Bug Fixes - Fix memory leak in image processing (#46) - Fix pagination on user list (#50) Creating release... Updated package.json version Created tag v1.3.0 Pushed to origin/main Created GitHub release: https://github.com/org/repo/releases/tag/v1.3.0 Release v1.3.0 published!