--- name: zcf-release description: Automate version release and code commit using changeset disable-model-invocation: true allowed-tools: Read(**), Exec(git, pnpm, node, date, cat, gh) --- # ZCF Release - Automated Release and Commit Automate version release and code commit using changeset. ## Usage ```bash /zcf-release [-p|-mi|-ma|] ``` ## Parameters - `-p` or `--patch`: Patch version (default) - bug fixes, minor changes - `-mi` or `--minor`: Minor version - new features, backward compatible - `-ma` or `--major`: Major version - breaking changes, incompatible - ``: Specific version number (e.g., 1.2.3, 2.0.0-beta.1) - directly use provided version ## Context - Automatically analyze code changes and generate bilingual CHANGELOG - Use changeset for version management - Create release branch and pull request for protected main branch - Auto commit code changes (NO manual tags) - Support GitHub Actions auto publish to npm with automatic tagging after PR merge ## Your Role You are a professional release management assistant responsible for: 1. Analyzing code changes 2. Generating standardized CHANGELOG 3. Executing version release process ## Execution Flow Parse arguments: $ARGUMENTS ### 1. Parameter Parsing ```bash VERSION_TYPE="patch" # Default to patch version SPECIFIC_VERSION="" # For user-specified exact version # Check if argument looks like a version number (matches semver pattern) if [[ "$ARGUMENTS" =~ ^[0-9]+\.[0-9]+\.[0-9]+([.-].*)?$ ]]; then SPECIFIC_VERSION="$ARGUMENTS" VERSION_TYPE="custom" echo "๐Ÿš€ Preparing to release exact version: $SPECIFIC_VERSION" else case "$ARGUMENTS" in -p|--patch) VERSION_TYPE="patch" ;; -mi|--minor) VERSION_TYPE="minor" ;; -ma|--major) VERSION_TYPE="major" ;; "") VERSION_TYPE="patch" ;; *) echo "โŒ Unknown parameter: $ARGUMENTS" echo "Usage: /zcf-release [-p|-mi|-ma|]" echo "Examples:" echo " /zcf-release -p # Patch version bump" echo " /zcf-release -mi # Minor version bump" echo " /zcf-release -ma # Major version bump" echo " /zcf-release 1.2.3 # Exact version" echo " /zcf-release 2.0.0-beta.1 # Pre-release version" exit 1 ;; esac echo "๐Ÿš€ Preparing to release $VERSION_TYPE version" fi ``` ### 2. Check Working Directory Status Check if the current working directory meets release conditions: ```bash # Ensure in project root directory if [ ! -f "package.json" ]; then echo "โŒ Error: package.json not found, please run in project root" exit 1 fi # Check for uncommitted changes and handle automatically HAS_UNCOMMITTED=false if ! git diff --quiet || ! git diff --cached --quiet; then echo "โš ๏ธ Detected uncommitted changes:" git status --short echo "" HAS_UNCOMMITTED=true fi echo "โœ… Working directory status OK" ``` ### 3. Analyze Version Changes Analyze all changes since last release: ```bash # Get last release tag LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") if [ -z "$LAST_TAG" ]; then echo "๐Ÿ“Š No previous version tag found, analyzing all commits" COMMITS=$(git log --oneline) else echo "๐Ÿ“Š Last version: $LAST_TAG" echo "Analyzing changes since $LAST_TAG..." COMMITS=$(git log $LAST_TAG..HEAD --oneline) fi # Show commit history echo -e "\n๐Ÿ“ Changes:" echo "$COMMITS" # Analyze file changes echo -e "\n๐Ÿ“ File change statistics:" if [ -z "$LAST_TAG" ]; then git diff --stat else git diff --stat $LAST_TAG..HEAD fi ``` ### 4. Generate CHANGELOG Content Based on code change analysis, I will generate CHANGELOG following these standards: **Format Requirements**: 1. English description first, Chinese description second 2. No mixing Chinese and English on the same line 3. Organize by category: New Features, Optimization, Fixes, Documentation, etc. 4. Each entry should be concise and clear **Example Format**: ```markdown ## New Features - Add technical execution guidelines with command best practices - Support automated release command /zcf-release - Automatic quote handling for Windows paths ## ๆ–ฐๅŠŸ่ƒฝ - ๆทปๅŠ ๆŠ€ๆœฏๆ‰ง่กŒๆŒ‡ๅ—ๆ–‡ๆกฃ๏ผŒๆไพ›ๅ‘ฝไปคๆ‰ง่กŒๆœ€ไฝณๅฎž่ทต - ๆ”ฏๆŒ่‡ชๅŠจๅŒ–ๅ‘็‰ˆๅ‘ฝไปค /zcf-release - Windows ่ทฏๅพ„่‡ชๅŠจๅŠ ๅผ•ๅทๅค„็† ## Optimization - Prioritize ripgrep for better search performance - Improve template file organization ## ไผ˜ๅŒ– - ไผ˜ๅ…ˆไฝฟ็”จ ripgrep ๆๅ‡ๆœ็ดขๆ€ง่ƒฝ - ๆ”น่ฟ›ๆจกๆฟๆ–‡ไปถ็ป„็ป‡็ป“ๆž„ ## Fixes - Fix Windows path backslash escaping issue ## ไฟฎๅค - ไฟฎๅค Windows ่ทฏๅพ„ๅๆ–œๆ ไธขๅคฑ้—ฎ้ข˜ ``` ### 5. Create Changeset Create changeset file based on analysis: ```bash # Generate timestamp TIMESTAMP=$(date +%Y%m%d%H%M%S) CHANGESET_FILE=".changeset/release-$TIMESTAMP.md" # Create changeset file echo "๐Ÿ“ Creating changeset file..." if [ "$VERSION_TYPE" = "custom" ]; then # For specific version, use the exact version number cat > "$CHANGESET_FILE" << EOF --- "zcf": $SPECIFIC_VERSION --- [Bilingual CHANGELOG content generated based on actual changes] EOF echo "โœ… Changeset file created with exact version: $SPECIFIC_VERSION" else # For version type (patch/minor/major), use the type cat > "$CHANGESET_FILE" << EOF --- "zcf": $VERSION_TYPE --- [Bilingual CHANGELOG content generated based on actual changes] EOF echo "โœ… Changeset file created with version type: $VERSION_TYPE" fi ``` ### 6. Update Version Number Use changeset to update version number and CHANGELOG: ```bash echo "๐Ÿ”„ Updating version number and CHANGELOG..." pnpm changeset version # Note: The changeset version command will automatically: # 1. Update package.json version # 2. Generate/update CHANGELOG.md # 3. DELETE the temporary changeset file in .changeset/ directory # No manual cleanup needed! # Get new version number NEW_VERSION=$(node -p "require('./package.json').version") if [ "$VERSION_TYPE" = "custom" ]; then echo "๐Ÿ“ฆ New version set to: v$NEW_VERSION (specified: $SPECIFIC_VERSION)" else echo "๐Ÿ“ฆ New version: v$NEW_VERSION" fi # Show CHANGELOG update echo -e "\n๐Ÿ“‹ CHANGELOG has been updated, please review the content" echo "โœ… Temporary changeset file has been automatically deleted" ``` ### 7. Create Release Branch and Handle Commits Create release branch first, then handle commits separately to avoid polluting main branch: ````bash echo "๐Ÿš€ Creating release branch..." # Create and switch to release branch RELEASE_BRANCH="release/v$NEW_VERSION" git checkout -b "$RELEASE_BRANCH" # Handle uncommitted changes first (if any) if [ "$HAS_UNCOMMITTED" = true ]; then echo "๐Ÿ“ Committing pre-release changes..." # Stage only the uncommitted changes (exclude changeset modifications) git add . git reset HEAD package.json CHANGELOG.md 2>/dev/null || true # Check if there are still changes to commit after reset if ! git diff --quiet --staged; then # Analyze the staged changes to generate appropriate commit message echo "๐Ÿ” Analyzing uncommitted changes..." CHANGED_FILES=$(git diff --staged --name-only) # Generate commit message based on changed files COMMIT_TYPE="chore" COMMIT_SCOPE="" COMMIT_DESCRIPTION="pre-release changes" # Analyze file patterns to determine commit type and scope if echo "$CHANGED_FILES" | grep -E "\.(md|txt)$" >/dev/null; then if echo "$CHANGED_FILES" | grep -i "readme" >/dev/null; then COMMIT_TYPE="docs" COMMIT_SCOPE="readme" COMMIT_DESCRIPTION="update README documentation" elif echo "$CHANGED_FILES" | grep -E "\.claude/" >/dev/null; then COMMIT_TYPE="docs" COMMIT_SCOPE="commands" COMMIT_DESCRIPTION="update command documentation" else COMMIT_TYPE="docs" COMMIT_DESCRIPTION="update documentation" fi elif echo "$CHANGED_FILES" | grep -E "\.(ts|js|tsx|jsx)$" >/dev/null; then if echo "$CHANGED_FILES" | grep -E "test|spec" >/dev/null; then COMMIT_TYPE="test" COMMIT_DESCRIPTION="update tests" else COMMIT_TYPE="feat" COMMIT_DESCRIPTION="code changes" fi elif echo "$CHANGED_FILES" | grep -E "\.json$" >/dev/null; then if echo "$CHANGED_FILES" | grep "package" >/dev/null; then COMMIT_TYPE="chore" COMMIT_DESCRIPTION="update dependencies" else COMMIT_TYPE="chore" COMMIT_DESCRIPTION="update configuration" fi fi # Build commit message if [ -n "$COMMIT_SCOPE" ]; then COMMIT_MSG="${COMMIT_TYPE}(${COMMIT_SCOPE}): ${COMMIT_DESCRIPTION}" else COMMIT_MSG="${COMMIT_TYPE}: ${COMMIT_DESCRIPTION}" fi # Add file list to commit body COMMIT_BODY="" for file in $CHANGED_FILES; do COMMIT_BODY="${COMMIT_BODY}- Update ${file} " done COMMIT_BODY="${COMMIT_BODY} ๐Ÿค– Generated with [Claude Code](https://claude.ai/code) # Create the commit git commit -m "${COMMIT_MSG} ${COMMIT_BODY}" echo "โœ… Pre-release changes committed: $COMMIT_MSG" else echo "โ„น๏ธ No additional changes to commit after version update" fi fi echo "๐Ÿ’พ Committing release version changes..." # Add version-related changes git add package.json CHANGELOG.md # Create release version commit git commit -m "chore: release v$NEW_VERSION - Update version to $NEW_VERSION - Update CHANGELOG.md - Generated by /zcf-release command" # Push release branch to remote and set upstream tracking git push -u origin "$RELEASE_BRANCH" # If push fails due to conflicts, use force-with-lease to safely overwrite # git push --force-with-lease origin "$RELEASE_BRANCH" # Set upstream tracking if not set automatically git branch --set-upstream-to=origin/$RELEASE_BRANCH $RELEASE_BRANCH ### 8. Create Pull Request ```bash echo "๐Ÿ“‹ Creating pull request..." # Create pull request using gh CLI following the project's PR template gh pr create --title "๐Ÿš€ Release v$NEW_VERSION" --body "$(cat <<'EOF' ## Description Release version v$NEW_VERSION with automated version bump and CHANGELOG update. This release includes important changes, please review CHANGELOG.md for details. ## Type of Change - [x] New feature - [ ] Bug fix - [ ] Breaking change - [x] Documentation update ## Testing - [x] Tests added/updated - [x] All tests pass - [x] Coverage maintained ## Checklist - [x] Code follows style guidelines - [x] Self-review completed - [x] Documentation updated - [x] No new warnings introduced ## Release Notes โš ๏ธ **IMPORTANT**: After merge, GitHub Actions will automatically: - Create release tag - Publish to npm - Generate GitHub Release ๐Ÿค– Generated by /zcf-release command EOF )" echo -e "\nโœ… Release preparation complete!" echo "๐Ÿ“ฆ Version v$NEW_VERSION is ready" echo "๐Ÿ”— Pull request created successfully" echo "" echo "โš ๏ธ IMPORTANT: Review and merge the PR to trigger the release" echo "โš ๏ธ Do NOT create or push tags manually!" echo "๐Ÿค– After PR merge, GitHub Actions will automatically:" echo " - Create the release tag" echo " - Publish to npm" echo " - Generate GitHub Release" echo "๐Ÿ‘€ View release status: https://github.com/UfoMiao/zcf/actions" ```` ## Complete Workflow Summary 1. **Preparation Phase**: Check parameters (version type or exact version), working directory status 2. **Analysis Phase**: Analyze commit history and file changes 3. **Generation Phase**: Create bilingual CHANGELOG 4. **Execution Phase**: Update version (automatic bump or exact version) 5. **Branch Creation Phase**: Create release branch BEFORE committing 6. **Commit Phase**: Commit changes on release branch 7. **PR Creation Phase**: Push release branch and create pull request 8. **Review & Release Phase**: Manual PR review and merge, then GitHub Actions auto publish ## Important Notes โš ๏ธ **CRITICAL**: **NEVER create or push Git tags manually!** GitHub Actions will automatically: - Create the version tag after successful PR merge - Generate GitHub Release - Publish to npm registry Manual tags will cause conflicts with the automated release process! ### New Protected Branch Workflow: - ๐Ÿ›ก๏ธ **Main branch is protected**: Cannot push directly to main - ๐ŸŒฟ **Release branch created**: Automatic creation of `release/v{version}` branch - ๐Ÿ“‹ **Pull Request required**: All releases must go through PR review process - โœ… **Manual approval needed**: PR must be reviewed and merged manually - ๐Ÿค– **Auto-release after merge**: GitHub Actions triggers after PR merge ### Additional Notes: - Ensure all code has been tested before running release command - CHANGELOG must follow bilingual format standards - When using version types (-p/-mi/-ma), choose the correct type for your changes - When providing exact version numbers, ensure they follow semantic versioning (e.g., 1.2.3, 2.0.0-beta.1) - Exact version numbers bypass automatic version determination - use carefully - Carefully review CHANGELOG content in the created PR before merging - **No manual cleanup needed**: `changeset version` automatically deletes temporary changeset files - The `.changeset/` directory should only contain config files, not temporary release files - **Requires `gh` CLI**: Ensure GitHub CLI is installed and authenticated for PR creation **Version Parameter Examples**: - `/zcf-release` or `/zcf-release -p` - Auto patch bump (2.9.11 โ†’ 2.9.12) - `/zcf-release -mi` - Auto minor bump (2.9.11 โ†’ 2.10.0) - `/zcf-release -ma` - Auto major bump (2.9.11 โ†’ 3.0.0) - `/zcf-release 1.5.0` - Exact version (โ†’ 1.5.0) - `/zcf-release 3.0.0-alpha.1` - Pre-release version (โ†’ 3.0.0-alpha.1) --- **Now starting release process...**