一键导入
zcf-pr
Create pull request based on current branch changes
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Create pull request based on current branch changes
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Professional AI programming assistant with structured workflow (Research -> Ideate -> Plan -> Execute -> Optimize -> Review) for developers
专业AI编程助手,提供结构化六阶段开发工作流(研究→构思→计划→执行→优化→评审),适用于专业开发者
Quickly add a new corporate sponsor to ZCF — sponsor list by default, with optional API preset and documentation ad placements
Automate version release and code commit using changeset
Automatically check code changes since last tag and update documentation in docs/ directory (en, zh-CN, ja-JP) and CLAUDE.md to ensure consistency with actual code implementation
Initialize or update BMad-Method (V6) in your project
| name | zcf-pr |
| description | Create pull request based on current branch changes |
| disable-model-invocation | true |
| allowed-tools | Read(**), Exec(git, pnpm, node, date, cat, gh) |
Create pull request based on current branch changes and generate standardized PR description.
/zcf-pr [--base <branch>] [--draft] [--title <title>]
--base <branch>: Target base branch (default: main)--draft: Create as draft pull request--title <title>: Custom PR titleYou are a professional pull request management assistant responsible for:
Parse arguments: $ARGUMENTS
BASE_BRANCH="main"
IS_DRAFT=false
CUSTOM_TITLE=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--base)
BASE_BRANCH="$2"
shift 2
;;
--draft)
IS_DRAFT=true
shift
;;
--title)
CUSTOM_TITLE="$2"
shift 2
;;
*)
echo "❌ Unknown parameter: $1"
echo "Usage: /zcf-pr [--base <branch>] [--draft] [--title <title>]"
echo "Examples:"
echo " /zcf-pr # Create PR to main"
echo " /zcf-pr --base develop # Create PR to develop"
echo " /zcf-pr --draft # Create draft PR"
echo " /zcf-pr --title 'Bug Fix' # Custom title"
exit 1
;;
esac
done
echo "🚀 Creating PR from current branch to $BASE_BRANCH"
if [ "$IS_DRAFT" = true ]; then
echo "📝 Creating as draft PR"
fi
if [ -n "$CUSTOM_TITLE" ]; then
echo "📝 Custom title: $CUSTOM_TITLE"
fi
# Check if we're in a git repository
if [ ! -d ".git" ]; then
echo "❌ Error: Not in a git repository"
exit 1
fi
# Get current branch
CURRENT_BRANCH=$(git branch --show-current)
if [ -z "$CURRENT_BRANCH" ]; then
echo "❌ Error: Could not determine current branch"
exit 1
fi
# Check if current branch is same as base branch
if [ "$CURRENT_BRANCH" = "$BASE_BRANCH" ]; then
echo "❌ Error: Cannot create PR from $BASE_BRANCH to $BASE_BRANCH"
echo "Please switch to a feature branch first"
exit 1
fi
# Check for uncommitted changes
if ! git diff --quiet || ! git diff --cached --quiet; then
echo "⚠️ Warning: You have uncommitted changes"
echo "Please commit your changes before creating a PR"
echo ""
git status --short
echo ""
echo "Run the following commands to commit your changes:"
echo " git add ."
echo " git commit -m 'Your commit message'"
exit 1
fi
echo "✅ Branch status OK: $CURRENT_BRANCH"
# Check if base branch exists
if ! git rev-parse --verify "$BASE_BRANCH" >/dev/null 2>&1; then
echo "❌ Error: Base branch '$BASE_BRANCH' does not exist"
exit 1
fi
# Get commit history since divergence
echo "📊 Analyzing changes from $BASE_BRANCH..."
# Find common ancestor
MERGE_BASE=$(git merge-base "$BASE_BRANCH" HEAD)
if [ -z "$MERGE_BASE" ]; then
echo "❌ Error: Could not find common ancestor with $BASE_BRANCH"
exit 1
fi
# Get commits since divergence
COMMITS=$(git log $MERGE_BASE..HEAD --oneline)
COMMIT_COUNT=$(echo "$COMMITS" | wc -l | tr -d ' ')
if [ "$COMMIT_COUNT" -eq 0 ]; then
echo "❌ Error: No commits found since divergence from $BASE_BRANCH"
exit 1
fi
echo "📝 Found $COMMIT_COUNT commit(s):"
echo "$COMMITS"
echo ""
# Analyze file changes
echo "📁 File change statistics:"
git diff --stat $MERGE_BASE..HEAD
# Get changed files
CHANGED_FILES=$(git diff --name-only $MERGE_BASE..HEAD)
echo ""
echo "📋 Changed files:"
echo "$CHANGED_FILES"
# Analyze changes to determine type and scope
echo ""
echo "🔍 Analyzing change categories..."
BUG_FIX=false
NEW_FEATURE=false
BREAKING_CHANGE=false
DOCUMENTATION=false
TESTS=false
# Analyze commits for change indicators
if echo "$COMMITS" | grep -E "(fix|bug|error|issue|problem)" >/dev/null; then
BUG_FIX=true
fi
if echo "$COMMITS" | grep -E "(feat|add|new|create|implement)" >/dev/null; then
NEW_FEATURE=true
fi
if echo "$COMMITS" | grep -E "(break|change|remove|delete|major)" >/dev/null; then
BREAKING_CHANGE=true
fi
if echo "$CHANGED_FILES" | grep -E "\.(md|txt|rst)$" >/dev/null; then
DOCUMENTATION=true
fi
if echo "$CHANGED_FILES" | grep -E "(test|spec)\." >/dev/null; then
TESTS=true
fi
# Show analysis results
echo "📊 Change type analysis:"
if [ "$BUG_FIX" = true ]; then echo " ✅ Bug fix detected"; fi
if [ "$NEW_FEATURE" = true ]; then echo " ✅ New feature detected"; fi
if [ "$BREAKING_CHANGE" = true ]; then echo " ✅ Breaking change detected"; fi
if [ "$DOCUMENTATION" = true ]; then echo " ✅ Documentation update detected"; fi
if [ "$TESTS" = true ]; then echo " ✅ Test updates detected"; fi
# Generate PR title
if [ -n "$CUSTOM_TITLE" ]; then
PR_TITLE="$CUSTOM_TITLE"
else
# Auto-generate title from first commit
FIRST_COMMIT=$(echo "$COMMITS" | tail -1)
# Clean up commit message for PR title
if echo "$FIRST_COMMIT" | grep -E "^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: " >/dev/null; then
# Use conventional commit format
PR_TITLE=$(echo "$FIRST_COMMIT" | sed 's/^[a-f0-9]\+ //')
else
# Fallback to simple format
PR_TITLE="$CURRENT_BRANCH"
fi
fi
echo "📝 PR Title: $PR_TITLE"
# Generate comprehensive PR description
echo "📋 Generating PR description..."
# Generate change summary
CHANGE_SUMMARY=""
if [ "$BUG_FIX" = true ]; then
CHANGE_SUMMARY="${CHANGE_SUMMARY}- Bug fixes and error handling improvements\n"
fi
if [ "$NEW_FEATURE" = true ]; then
CHANGE_SUMMARY="${CHANGE_SUMMARY}- New features and functionality additions\n"
fi
if [ "$BREAKING_CHANGE" = true ]; then
CHANGE_SUMMARY="${CHANGE_SUMMARY}- Breaking changes requiring attention\n"
fi
if [ "$DOCUMENTATION" = true ]; then
CHANGE_SUMMARY="${CHANGE_SUMMARY}- Documentation updates and improvements\n"
fi
if [ "$TESTS" = true ]; then
CHANGE_SUMMARY="${CHANGE_SUMMARY}- Test coverage and quality improvements\n"
fi
# Generate file change summary
FILE_CHANGES=""
for file in $CHANGED_FILES; do
FILE_CHANGES="${FILE_CHANGES}- \`$file\`\n"
done
# Build complete PR description
PR_DESCRIPTION=$(cat <<EOF
## Description
This PR includes changes from branch \`$CURRENT_BRANCH\` with $COMMIT_COUNT commit(s) since divergence from \`$BASE_BRANCH\`.
### Key Changes:
$CHANGE_SUMMARY
### Files Modified:
$FILE_CHANGES
## Type of Change
EOF
)
# Add checkboxes based on analysis
if [ "$BUG_FIX" = true ]; then
PR_DESCRIPTION="${PR_DESCRIPTION}- [x] Bug fix\n"
else
PR_DESCRIPTION="${PR_DESCRIPTION}- [ ] Bug fix\n"
fi
if [ "$NEW_FEATURE" = true ]; then
PR_DESCRIPTION="${PR_DESCRIPTION}- [x] New feature\n"
else
PR_DESCRIPTION="${PR_DESCRIPTION}- [ ] New feature\n"
fi
if [ "$BREAKING_CHANGE" = true ]; then
PR_DESCRIPTION="${PR_DESCRIPTION}- [x] Breaking change\n"
else
PR_DESCRIPTION="${PR_DESCRIPTION}- [ ] Breaking change\n"
fi
if [ "$DOCUMENTATION" = true ]; then
PR_DESCRIPTION="${PR_DESCRIPTION}- [x] Documentation update\n"
else
PR_DESCRIPTION="${PR_DESCRIPTION}- [ ] Documentation update\n"
fi
# Add testing section
PR_DESCRIPTION="${PR_DESCRIPTION}
## Testing
- [x] Code changes tested
- [x] No new warnings introduced
- [x] Code follows style guidelines"
if [ "$TESTS" = true ]; then
PR_DESCRIPTION="${PR_DESCRIPTION}\n- [x] Tests added/updated"
else
PR_DESCRIPTION="${PR_DESCRIPTION}\n- [ ] Tests added/updated"
fi
# Add checklist
PR_DESCRIPTION="${PR_DESCRIPTION}
## Checklist
- [x] Self-review completed
- [x] Documentation updated (if applicable)
- [x] No new warnings introduced
- [x] Code follows project guidelines
## Additional Information
**Branch:** \`$CURRENT_BRANCH\` → \`$BASE_BRANCH\`
**Commits:** $COMMIT_COUNT
**Files Changed:** $(echo "$CHANGED_FILES" | wc -l | tr -d ' ')
### Commit History:
\`\`\`
$COMMITS
\`\`\`
---
🤖 Generated with /zcf-pr command
EOF
echo "✅ PR description generated"
# Check if branch exists on remote
if ! git ls-remote --heads origin "$CURRENT_BRANCH" >/dev/null 2>&1; then
echo "📤 Pushing branch to remote..."
git push -u origin "$CURRENT_BRANCH"
else
echo "📤 Branch already exists on remote, ensuring it's up to date..."
git push origin "$CURRENT_BRANCH"
fi
# Create PR using gh CLI
echo "📋 Creating pull request..."
PR_OPTIONS="--title '$PR_TITLE' --body '$PR_DESCRIPTION'"
if [ "$IS_DRAFT" = true ]; then
PR_OPTIONS="$PR_OPTIONS --draft"
fi
# Execute gh pr create command
PR_URL=$(eval "gh pr create --base $BASE_BRANCH $PR_OPTIONS")
if [ $? -eq 0 ]; then
echo ""
echo "✅ Pull request created successfully!"
echo "🔗 PR URL: $PR_URL"
echo ""
echo "📋 PR Details:"
echo " Title: $PR_TITLE"
echo " From: $CURRENT_BRANCH"
echo " To: $BASE_BRANCH"
echo " Commits: $COMMIT_COUNT"
echo " Files: $(echo "$CHANGED_FILES" | wc -l | tr -d ' ')"
echo ""
echo "⚠️ Please review the PR and add any additional information as needed"
else
echo "❌ Failed to create pull request"
echo "Please check GitHub CLI authentication and permissions"
exit 1
fi
⚠️ Prerequisites:
gh): Must be installed and authenticatedThe command automatically categorizes changes based on:
.md/.txt for docs, (test|spec)\. for tests# Standard PR to main
/zcf-pr
# → Creates PR: "feat: add new feature" with full description
# PR to develop branch
/zcf-pr --base develop
# → Creates PR to develop branch instead of main
# Draft PR
/zcf-pr --draft
# → Creates draft PR for initial review
# Custom title
/zcf-pr --title "Critical bug fix for authentication"
# → Uses custom title instead of auto-generated one
Now creating pull request...