ワンクリックで
release
Standardized release workflow with version updates and CHANGELOG management
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Standardized release workflow with version updates and CHANGELOG management
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Orchestrate complete issue implementation workflow from branch to PR
Create Pull Requests with pre-flight checks and proper formatting
Decompose a large GitHub Issue (epic, refactor, or feature) into subtask Issues, each small enough for a single focused PR
Spawn a Reviewer Agent to evaluate code changes against architecture, design, and quality criteria
Create commits with code quality checks and conventional commit messages
Run all validations before pushing to remote
| name | release |
| description | Standardized release workflow with version updates and CHANGELOG management |
Automates the pre-release preparation workflow, ensuring consistent version updates across all files and proper CHANGELOG management.
IMPORTANT: All outputs (commits, PRs, branch names) MUST be written in English.
developrelease/vX.Y.Z → develop → main
release/vX.Y.Z → developdevelop → main (with tag creation)This separation ensures human oversight for the irreversible release action (tag push triggers CI/CD).
Before proceeding with version updates, ALL of the following checks MUST pass:
cargo fmt --all
cargo clippy --all-targets --all-features -- -D warnings
CRITICAL: Zero warnings required. Fix all issues before proceeding.
cargo test --all
All tests must pass.
git branch --show-current
CRITICAL: Must be on develop or a feature branch. Cannot release from main.
| Current Branch | Action |
|---|---|
main | ❌ STOP - Cannot release from main |
develop | ✅ Proceed |
feature/* | ✅ Proceed |
bugfix/* | ✅ Proceed |
If on main:
⚠️ ERROR: Cannot start release from 'main' branch.
Please checkout 'develop' or a feature branch first.
Ask the user for the target version number (e.g., "1.1.0").
Version Format Validation:
X.Y.Z where X, Y, Z are non-negative integers1.0.0, 1.1.0, 2.0.0-beta.1v1.0.0 (no 'v' prefix), 1.0 (missing patch)Execute ALL pre-flight checks:
cargo fmt --all
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all
If any check fails:
Update version in exactly these 3 files:
| File | Pattern | Example |
|---|---|---|
Cargo.toml | version = "X.Y.Z" | version = "1.1.0" |
python-wrapper/pyproject.toml | version = "X.Y.Z" | version = "1.1.0" |
python-wrapper/uv_sbom_bin/install.py | UV_SBOM_VERSION = "X.Y.Z" | UV_SBOM_VERSION = "1.1.0" |
After updating version files, run cargo check to regenerate Cargo.lock with the new version:
cargo check
This ensures Cargo.lock reflects the updated version before committing.
Review the [Unreleased] section and remove any entries that do not reflect
user-observable changes. This step must be completed before promoting to a
versioned entry in Step 4.
| Section heading | Reason |
|---|---|
### Refactored / ### Internal | No behavior change |
### Testing | No behavior change |
### Dependencies (non-security bumps) | No behavior change for users |
### CI / ### Chore | No behavior change |
| Section heading | Reason |
|---|---|
### Added | New user-facing features |
### Changed | Behavior changes |
### Deprecated | User must know |
### Removed | Breaking removal |
### Fixed | Bug fixes users care about |
### Security | Always required |
### Breaking Changes | Critical for users |
### Performance | Observable improvement |
⚠️ WARNING: STOP — DO NOT PROCEED SILENTLY.
If after removing internal entries the [Unreleased] section is empty, this
typically means one of two things:
[Unreleased] was legitimately internal (refactor, CI, tests) — safe to release with no user-facing changelog.CHANGELOG.md — this is the v2.2.0 incident (Issue #491).You must ask the user explicitly before continuing:
⚠️ The
[Unreleased]section is empty after removing internal entries. Promoting this will produce a release with no user-facing changelog.Did you intentionally make no user-facing changes in this release? Run
git log <last-tag>..HEAD --onelineto audit merged PRs if unsure.Type yes to proceed with an empty release entry, or no to pause and add missing entries first.
If the user answers yes: continue to Step 4. The resulting file will look like:
## [Unreleased]
## [X.Y.Z] - YYYY-MM-DD
If the user answers no: STOP HERE. Do not proceed to Step 4.
Instruct the user to add missing entries under the appropriate sections
(### Added, ### Fixed, ### Security, ### Changed) and then re-run /release.
Before:
## [Unreleased]
### Added
- New feature
After:
## [Unreleased]
## [X.Y.Z] - YYYY-MM-DD
### Added
- New feature
## [Unreleased] section header with version and date## [Unreleased] section above the new versionYYYY-MM-DD (e.g., 2025-02-06)# Check all versions match
grep 'version = "' Cargo.toml | head -1
grep 'version = "' python-wrapper/pyproject.toml
grep 'UV_SBOM_VERSION = "' python-wrapper/uv_sbom_bin/install.py
All three must show the same version. If not, stop and fix.
git checkout -b release/vX.Y.Z
Branch naming: release/v{version} (e.g., release/v1.1.0)
Stage and commit all version changes using /commit skill conventions:
git add Cargo.toml Cargo.lock python-wrapper/pyproject.toml python-wrapper/uv_sbom_bin/install.py CHANGELOG.md
Commit message format:
chore(release): prepare v{version}
- Update version to {version} in all files
- Update CHANGELOG with release date
Co-Authored-By: Claude <noreply@anthropic.com>
Create PR to develop (NOT main):
gh pr create --base develop --title "chore(release): prepare v{version}" --body "$(cat <<'EOF'
## Summary
- Prepare release v{version}
- Update version numbers in all required files
- Update CHANGELOG with release date
## Version Files Updated
- `Cargo.toml`: version = "{version}"
- `python-wrapper/pyproject.toml`: version = "{version}"
- `python-wrapper/uv_sbom_bin/install.py`: UV_SBOM_VERSION = "{version}"
## CHANGELOG
- Converted [Unreleased] to [{version}] - {date}
- Added empty [Unreleased] section
## Test Plan
- [x] `cargo fmt --all -- --check` passes
- [x] `cargo clippy --all-targets --all-features -- -D warnings` passes
- [x] `cargo test --all` passes
- [x] All version strings are consistent
## Post-Merge Manual Steps
After merging this PR into `develop`:
1. Open a PR: `develop` → `main`
2. Merge the PR to main
3. Create tag: `git tag v{version}`
4. Push tag: `git push origin v{version}`
5. Verify CI release workflow completes successfully
---
Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
IMPORTANT: PR base branch is develop, NOT main. The develop → main PR is a separate manual step after this PR is merged.
After PR creation, display the following instructions:
✅ Release PR created successfully!
📋 Manual steps after PR is merged:
1. Wait for CI to pass and get approval
2. Merge the PR into `develop`
3. Open a second PR: develop → main
gh pr create --base main --head develop \
--title "chore(release): v{version}" \
--body "Merge release v{version} from develop into main."
4. Merge the develop → main PR
5. Create and push the tag:
git checkout main
git pull origin main
git tag v{version}
git push origin v{version}
6. Verify the release:
- Check GitHub Actions release workflow
- Verify GitHub Release was created
- Check crates.io publication
- Check PyPI publication
If version doesn't match semver:
⚠️ ERROR: Invalid version format: '{input}'
Version must be in semver format: X.Y.Z (e.g., 1.1.0)
If any pre-flight check fails:
If versions don't match after update:
⚠️ ERROR: Version mismatch detected!
Cargo.toml: {version1}
pyproject.toml: {version2}
install.py: {version3}
Please fix manually and retry.
If CHANGELOG already contains the target version:
⚠️ WARNING: CHANGELOG.md already contains [{version}]
This version may have already been released.
Do you want to continue anyway? (y/N)
User: "/release 1.1.0" or "リリース 1.1.0"
Claude executes /release skill:
cargo check to regenerate Cargo.lock ✓release/v1.1.0develop (NOT main)Final output:
✅ Release preparation complete!
PR: https://github.com/Taketo-Yoda/uv-sbom/pull/XXX
📋 After PR merge, run:
git tag v1.1.0
git push origin v1.1.0