원클릭으로
release
Automate project release workflow with version management, CHANGELOG updates, and git operations
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Automate project release workflow with version management, CHANGELOG updates, and git operations
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | release |
| description | Automate project release workflow with version management, CHANGELOG updates, and git operations |
| user-invocable | true |
Automates the release management workflow for any project, following semantic versioning and Keep a Changelog conventions. Works with Python, Node.js, and other project types through automatic version file detection.
/release minor # Create minor version release (1.1.0 -> 1.2.0)
/release patch # Create patch version release (1.1.0 -> 1.1.1)
/release major # Create major version release (1.0.0 -> 2.0.0)
/release hotfix v1.1.0 # Create hotfix from v1.1.0 tag
/release test # Create TestPyPI test release
IMPORTANT: This repository uses a fork-based workflow.
If you are a contributor (not @itdove):
/release test for local testingWhen invoked with arguments (e.g., /release minor), this skill guides you through:
/release major|minor|patch)Purpose: Create a new production release from main branch
Prerequisites:
Steps:
release-1.2)-dev suffix)README.md to point to the release tag (e.g., v1.2.0) — MUST happen before tagging/release hotfix <tag>)Purpose: Create a critical bug fix for an existing release
Preferred approach: If the minor release branch (release-x.y) still exists, apply the patch fix there directly instead of creating a separate hotfix branch. Only create a hotfix-x.y.z branch when the release branch has been deleted or in emergencies.
Prerequisites:
Steps:
release-x.y branch exists
release-x.y, cherry-pick or apply fix therehotfix-x.y.z branch from the specified tag/release test)Purpose: Test release process with TestPyPI before production
Prerequisites:
Steps:
-test suffix)On first use, the skill automatically detects version files in your project by scanning for common patterns:
Python projects:
pyproject.toml: version = "X.Y.Z"setup.py: version="X.Y.Z"__init__.py: __version__ = "X.Y.Z"Node.js projects:
package.json: "version": "X.Y.Z"Generic projects:
VERSION file: X.Y.Zversion.txt: X.Y.ZThe detected configuration is saved to .release-config.json and can be edited manually if needed.
CRITICAL: All detected version files MUST be kept in sync. The skill automatically updates all configured files together.
Version Format:
"1.0.0" (semantic versioning)"1.1.0-dev" (on main branch)"1.2.0-test1" (for TestPyPI testing)Version Transitions:
1.1.0-dev → 1.2.0 (remove -dev)1.1.0 → 1.1.1 (increment patch)1.2.0-dev → 1.2.0-test1 (replace -dev with -test1)1.2.0 → 1.3.0-dev (increment minor, add -dev)Location: Project root directory (auto-detected as CHANGELOG.md)
Format: Keep a Changelog format (https://keepachangelog.com/)
Structure:
## [Unreleased]
### Added
- New features
### Changed
- Changes to existing functionality
### Fixed
- Bug fixes
## [1.2.0] - 2026-04-08
### Added
- Feature X
- Feature Y
[Unreleased]: https://github.com/owner/repo/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/owner/repo/releases/tag/v1.2.0
When updating for release:
[Unreleased] content to new version section[Unreleased] sectionFollow project conventions:
<type>: <subject>
<body>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Types:
chore: - Version bumps, release preparationdocs: - CHANGELOG updatesfix: - Hotfix bug fixesfeat: - New features (rare in release commits)Always use HEREDOC for commit messages to ensure proper formatting:
git commit -m "$(cat <<'EOF'
chore: bump version to 2.2.0 for release
Prepare for v2.2.0 release:
- Update version in pyproject.toml
- Update version in devflow/__init__.py
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
EOF
)"
Before starting any release:
pytestError Handling:
Before creating the release branch, trigger the automated release readiness workflow to validate install, upgrade, IDE setup, daemon, detection, config, and MCP server functionality.
Workflow: .github/workflows/release-readiness.yml
Steps:
Trigger the workflow on the current branch:
gh workflow run release-readiness.yml --ref $(git branch --show-current)
Wait for completion (polls every 30 seconds):
# Get the run ID
sleep 5
RUN_ID=$(gh run list --workflow=release-readiness.yml --limit 1 --json databaseId --jq '.[0].databaseId')
# Wait for it to finish
gh run watch "$RUN_ID"
Check results:
gh run view "$RUN_ID" --log-failed
Jobs validated:
fresh-install — Clean install across Python 3.9–3.14upgrade-from-previous — Upgrade from last stable releasemulti-agent-setup — All IDE adapters (claude, cursor, copilot, etc.)daemon-lifecycle — Daemon start/status/reload/pause/resume/stopdetection-end-to-end — Secret, PII, and prompt injection detectionconfig-validation — Config profiles, migration, doctor checksmcp-server — MCP server initialize and tool call responsesmoke-tests — End-to-end violation detection for all types (secret, PII, prompt injection, SSRF, directory blocking, config exfil, jailbreak, context poisoning)Skipping: The readiness check may be skipped for hotfix releases (/release hotfix) when the fix is urgent, but this should be documented in the release notes.
Note: The release readiness workflow includes smoke tests (smoke-tests.yml) as a reusable workflow — no need to run smoke tests separately.
Before creating the release branch, compare docs against changes since the previous release tag:
Review all docs/ files for accuracy:
find docs/ -name '*.md' -type f | sort
Read each file and verify its content matches current functionality.
Check for new features not yet documented:
git log --oneline <previous-tag>..HEAD --grep='feat'
Verify README.md:
docs/ files, not READMEdocs/ pageVerify CONTRIBUTING.md is current
Verify ai-guardian-example.json matches schema and setup.py defaults
Verify docs/COOKBOOK.md:
Verify CHANGELOG.md:
Before creating the release branch, check for open Dependabot security alerts and PRs:
Check for open Dependabot security PRs:
gh pr list --label dependabot --state open
Check for security advisories:
gh api repos/{owner}/{repo}/dependabot/alerts --jq '[.[] | select(.state=="open")] | length'
Merge critical security fixes:
security labelDocument any deferred updates:
Skipping: May be skipped for urgent hotfix releases, but this should be documented in the release notes.
Cursor IDE uses its own hooks in ~/.cursor/hooks.json. Since Cursor could change hook support in any update, each release must verify all 6 hook events still fire correctly. This is a semi-automated 3-step flow.
Workflow: .claude/skills/release/release_helper.py (cursor-verify-* subcommands)
python .claude/skills/release/release_helper.py cursor-verify-setup
This command:
/tmp/cursor-hook-debug.sh~/.cursor/hooks.jsonFollow the printed instructions:
python .claude/skills/release/release_helper.py cursor-verify-analyze
This command reads /tmp/cursor-hook-debug-*.json files and reports:
cursor_version fieldpython .claude/skills/release/release_helper.py cursor-verify-cleanup
Removes debug hooks from hooks.json, deletes debug script and log files, removes backup.
Skipping: May be skipped for hotfix releases (/release hotfix) when the fix is urgent, but this should be documented in the release notes.
Before creating the production tag, verify the package builds and renders correctly on TestPyPI. This catches README rendering issues, missing files, and metadata problems before they reach the real PyPI (where you can't re-upload the same version).
Workflow: .github/workflows/publish-test.yml
Steps:
Create a test tag from the release branch (after all commits including URL updates):
git tag -a vX.Y.Z-test1 -m "Test release vX.Y.Z-test1"
git push origin vX.Y.Z-test1
Wait for TestPyPI publish workflow to complete:
sleep 5
RUN_ID=$(gh run list --workflow=publish-test.yml --limit 1 --json databaseId --jq '.[0].databaseId')
gh run watch "$RUN_ID"
Verify on TestPyPI:
https://test.pypi.org/project/ai-guardian/X.Y.Z-test1/pip install -i https://test.pypi.org/simple/ ai-guardian==X.Y.Z.test1If issues found: fix on release branch, delete the test tag, create a new test tag (-test2), and re-verify.
If clean: proceed with production tag creation.
Clean up test tags after production release:
git tag -d vX.Y.Z-test1
git push origin --delete vX.Y.Z-test1
Skipping: May be skipped for hotfix releases when the fix is urgent. Document the skip in the release notes.
Why this matters: PyPI does not allow re-uploading the same version. A README rendering bug or missing metadata on PyPI is permanent for that version — you'd need a patch release (X.Y.Z+1) to fix it.
Branch Naming:
release-X.Y (e.g., release-2.2)release-X.Y branch; use hotfix-X.Y.Z (e.g., hotfix-2.1.1) only when release branch is deletedrelease-X.Y-test (e.g., release-2.2-test)Tag Naming:
vX.Y.Z (e.g., v2.2.0)vX.Y.Z-testN (e.g., v2.2.0-test1)Important:
⚠️ MAINTAINERS ONLY - Check project's RELEASING.md or CONTRIBUTING.md for authorized release managers.
Before pushing tag:
After creating release tag:
git push origin vX.Y.ZREADME.md install URLs point to main (not a version tag — there is no PyPI release for dev versions)docs/notebooklm-export.mdnotebooklm-mcp MCP server is available, upload the generated docs/notebooklm-export.md and update other sources in the AI Guardian notebook using source_addX.Y-demo-guide.md in the external docs directory (see AGENTS.md) documenting new features with step-by-step demonstrations for stakeholder walkthroughsIf you are NOT authorized:
/release minor
# Skill will:
# 1. Auto-detect version files (first run only)
# 2. Verify prerequisites
# 3. Run documentation review checklist
# 4. Create release-1.2 branch
# 5. Update version 1.1.0-dev → 1.2.0 in all detected files
# 6. Update CHANGELOG.md for v1.2.0
# 7. Commit changes
# 8. Provide tag creation command: git tag -a v1.2.0 -m "..."
# 9. Provide post-release instructions
/release hotfix v1.1.0
# Skill will:
# 1. Verify v1.1.0 tag exists
# 2. Check if release-1.1 branch exists
# - If yes: switch to release-1.1 (preferred)
# - If no: create hotfix-1.1.1 branch from v1.1.0
# 3. Wait for user to implement fix (or cherry-pick from main)
# 4. Update version to 1.1.1 in all configured files
# 5. Update CHANGELOG.md for v1.1.1
# 6. Commit changes
# 7. Provide tag creation and cherry-pick-to-main commands
/release test
# Skill will:
# 1. Create release-1.2-test branch
# 2. Update version 1.2.0-dev → 1.2.0-test1 in all configured files
# 3. Commit changes
# 4. Create test tag v1.2.0-test1
# 5. Provide test verification steps
# 6. Provide cleanup commands
When user invokes this skill:
release-readiness.yml workflow and wait for all jobs to pass (regular releases only, may skip for urgent hotfixes)main with release tag in README.md install commands (before tagging — PyPI uses the tag snapshot as package README)Error Recovery:
Before using this skill for production releases:
Test version detection:
python .claude/skills/release/release_helper.py get-version
# Verify all version files detected correctly
Test with test release first:
/release test
# Verify workflow works end-to-end
Verify version updates:
Verify CHANGELOG updates:
Verify safety checks:
The skill creates .release-config.json on first use. You can manually edit this file to:
Example configuration:
{
"version_files": [
{
"path": "pyproject.toml",
"pattern": "version = \"{version}\"",
"description": "Python project metadata"
},
{
"path": "src/myproject/__init__.py",
"pattern": "__version__ = \"{version}\"",
"description": "Python package version"
}
],
"changelog": "CHANGELOG.md"
}