一键导入
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