/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:
git status --porcelainIf dirty, stop and ask user to commit or stash.
Verify branch:
git branch --show-currentWarn if not
mainormaster.Run quality checks:
make quality # or equivalent from prd/00_technology.mdAll checks must pass before release.
Get current version:
git 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:→ majorfeat:→ minorfix:,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:
# package.json, pyproject.toml, Cargo.toml, etc.Commit version bump (if file changed):
git add {package_config} git commit -m "chore: bump version to {version}"Create annotated tag:
git tag -a v{version} -m "Release v{version}"Push tag:
git push origin main --tagsCreate GitHub release:
gh 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!