| name | release |
| description | Create a release PR with version bump and changelog update |
Create a release PR that bumps the version and updates the changelog. After the PR is merged, a GitHub workflow will automatically tag the release, create a GitHub release, and bump to the next development version.
Arguments
The skill accepts a version level argument:
patch - 5.5.0 -> 5.5.1
minor - 5.5.0 -> 5.6.0
major - 5.5.0 -> 6.0.0
- Or an explicit version like
5.6.0
Example: /release minor
Steps
-
Verify prerequisites:
- Must be on
main branch
- Working directory must be clean
- Must be up to date with origin/main
git fetch origin
if [ "$(git branch --show-current)" != "main" ]; then
echo "Error: Must be on main branch"
exit 1
fi
if [ -n "$(git status --porcelain)" ]; then
echo "Error: Working directory not clean"
exit 1
fi
if [ "$(git rev-parse HEAD)" != "$(git rev-parse origin/main)" ]; then
echo "Error: Not up to date with origin/main"
exit 1
fi
-
Run local checks:
cargo clippy --all-targets -- -D warnings
cargo test
If checks fail, stop and report the errors.
-
Determine the new version:
CURRENT=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
echo "Current version: $CURRENT"
cargo release version <LEVEL> --dry-run 2>&1 | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1
Note: cargo-release will strip the -alpha.N suffix when bumping to a release version.
-
Create release branch:
NEW_VERSION="X.Y.Z"
git checkout -b release/v${NEW_VERSION}
-
Bump version using cargo-release:
cargo release version <LEVEL> --execute --no-confirm
-
Update CHANGELOG.md:
- Rename "Unreleased" section to new version with today's date
- Create new empty "Unreleased" section at the top
- Update the comparison links at the bottom of the file:
- Add a new
[unreleased] link pointing to compare/vX.Y.Z...HEAD
- Add a new
[X.Y.Z] link comparing to the previous version
The changelog follows Keep a Changelog format. Ask the user if they want to review/edit the changelog before proceeding.
-
Commit changes:
git add -A
git commit -m "release: prepare v${NEW_VERSION}"
-
Push and create PR:
IMPORTANT: The PR title must start with release: prepare v so the
tag-release.yml workflow fires after merge. When the PR is
squash-merged (the repo default), the squash commit takes the PR
title as its message, and the workflow guard checks
startsWith(head_commit.message, 'release: prepare v'). A title like
release: v${NEW_VERSION} would NOT match and the tag/release would
be silently skipped.
git push -u origin release/v${NEW_VERSION}
gh pr create \
--repo iopsystems/rezolus \
--title "release: prepare v${NEW_VERSION}" \
--body "$(cat <<'EOF'
## Release v${NEW_VERSION}
This PR prepares the release of v${NEW_VERSION}.
### Changes
- Version bump in Cargo.toml
- Changelog update
### After Merge
The release workflows will automatically:
1. Create git tag `v${NEW_VERSION}` and bump to next dev version
2. Build and publish packages (deb, rpm, Homebrew)
3. Create GitHub release with all artifacts
4. Publish to crates.io
---
See CHANGELOG.md for details.
EOF
)"
-
Report the PR URL to the user.
After PR Merge
When the PR is merged to main, the following workflow chain runs automatically:
-
tag-release.yml (triggered by push to main with release commit message):
- Detects the version from Cargo.toml
- Creates and pushes the git tag
vX.Y.Z
- Bumps to next dev version (e.g.,
5.5.1-alpha.0) and pushes to main
-
release.yml (triggered by the tag push):
- Builds .deb packages for all supported distros and architectures
- Builds .rpm packages for Rocky Linux and Amazon Linux
- Uploads packages to GCP Artifact Registry
- Creates GitHub release with all package artifacts
- Publishes to crates.io (stable releases only)
- Updates Homebrew formula (stable releases only)
Troubleshooting
- cargo-release not installed:
cargo install cargo-release
- gh CLI not installed:
brew install gh or see https://cli.github.com/
- Not authenticated with gh:
gh auth login