213 lines
5.7 KiB
Markdown
213 lines
5.7 KiB
Markdown
---
|
|
name: pr
|
|
description: Automate creating pull requests - fork repos, create branches, commit changes, and submit PRs. Works in current directory or creates new clone. Idempotent and safe to re-run. Keywords - PR, pull request, fork, contribute, upstream.
|
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep]
|
|
---
|
|
|
|
# PR - Pull Request Automation
|
|
|
|
Automate creating pull requests from start to finish.
|
|
|
|
## What This Does
|
|
|
|
1. Fork the repository (if needed)
|
|
2. Clone or use existing local repo
|
|
3. Create feature branch from upstream
|
|
4. Auto-commit your changes
|
|
5. Push and create PR
|
|
|
|
## Quick Start
|
|
|
|
**Basic workflow:**
|
|
```bash
|
|
# 1. Fork, clone, and create branch
|
|
bash ~/.claude/skills/pr/scripts/01-fork-and-setup.sh \
|
|
owner/repo \
|
|
~/code \
|
|
1 \
|
|
main \
|
|
my-feature
|
|
|
|
# 2. Make your changes (use Edit tool)...
|
|
|
|
# 3. Auto-commit and create PR
|
|
bash ~/.claude/skills/pr/scripts/03-create-pr.sh \
|
|
main \
|
|
"PR title" \
|
|
"PR description"
|
|
```
|
|
|
|
**Current directory mode:**
|
|
```bash
|
|
cd /path/to/your/repo
|
|
bash ~/.claude/skills/pr/scripts/01-fork-and-setup.sh owner/repo . "" main my-feature
|
|
# Make changes...
|
|
bash ~/.claude/skills/pr/scripts/03-create-pr.sh main "Fix bug"
|
|
```
|
|
|
|
## Scripts
|
|
|
|
### `01-fork-and-setup.sh` - Setup repo and branch
|
|
|
|
```bash
|
|
01-fork-and-setup.sh <repo> [work_dir] [depth] [base_branch] [feature_branch]
|
|
```
|
|
|
|
**Parameters:**
|
|
- `repo` - Repository to fork (e.g., `owner/repo`)
|
|
- `work_dir` - Where to clone (default: `~/tmp/contribute`, use `.` for current dir)
|
|
- `depth` - Clone depth (default: full, use `1` for 10x faster shallow clone)
|
|
- `base_branch` - Branch to base work on (e.g., `main`)
|
|
- `feature_branch` - Your new branch name (e.g., `fix/bug-123`)
|
|
|
|
**What it does:**
|
|
- Creates fork if needed (detects existing forks, even with different names)
|
|
- Clones repo or uses existing local copy
|
|
- Sets up `upstream` (original) and `origin` (fork) remotes
|
|
- Creates feature branch from latest upstream
|
|
- **Idempotent** - Safe to re-run multiple times
|
|
|
|
### `03-create-pr.sh` - Commit and create PR
|
|
|
|
```bash
|
|
03-create-pr.sh <base_branch> <pr_title> [pr_body] [commit_message]
|
|
```
|
|
|
|
**Parameters:**
|
|
- `base_branch` - Target branch for PR (e.g., `main`)
|
|
- `pr_title` - PR title
|
|
- `pr_body` - PR description (optional)
|
|
- `commit_message` - Commit message (optional, defaults to PR title)
|
|
|
|
**What it does:**
|
|
- Auto-commits any uncommitted changes with DCO sign-off
|
|
- Pushes branch to your fork
|
|
- Checks for existing PRs (avoids duplicates)
|
|
- Creates PR to upstream
|
|
- Returns PR URL
|
|
- **Idempotent** - Won't create duplicate PRs
|
|
|
|
## Examples
|
|
|
|
### Example 1: Fix bug in upstream repo
|
|
|
|
```bash
|
|
# User request: "Fix version 2.9 to 2.15 in stolostron/multicluster-global-hub"
|
|
|
|
# Step 1: Setup
|
|
bash ~/.claude/skills/pr/scripts/01-fork-and-setup.sh \
|
|
stolostron/multicluster-global-hub \
|
|
~/tmp/contribute \
|
|
1 \
|
|
main \
|
|
docs/fix-version
|
|
|
|
# Step 2: Make changes (using Edit tool to modify files)
|
|
# ... Edit files to change 2.9 to 2.15 ...
|
|
|
|
# Step 3: Create PR
|
|
bash ~/.claude/skills/pr/scripts/03-create-pr.sh \
|
|
main \
|
|
"docs: update version from 2.9 to 2.15" \
|
|
"Update documentation links to point to 2.15 instead of 2.9"
|
|
```
|
|
|
|
### Example 2: Work in current directory
|
|
|
|
```bash
|
|
# User is already in a git repo and wants to work there
|
|
|
|
cd /path/to/existing/repo
|
|
|
|
bash ~/.claude/skills/pr/scripts/01-fork-and-setup.sh \
|
|
owner/repo \
|
|
. \
|
|
"" \
|
|
main \
|
|
fix/issue-123
|
|
|
|
# Make changes...
|
|
|
|
bash ~/.claude/skills/pr/scripts/03-create-pr.sh \
|
|
main \
|
|
"Fix issue #123"
|
|
```
|
|
|
|
### Example 3: Handles fork name mismatches
|
|
|
|
```bash
|
|
# Scenario: Your fork is named "hub-of-hubs" but upstream is "multicluster-global-hub"
|
|
# The script automatically detects this and handles it
|
|
|
|
bash ~/.claude/skills/pr/scripts/01-fork-and-setup.sh \
|
|
stolostron/multicluster-global-hub \
|
|
~/code \
|
|
1 \
|
|
main \
|
|
fix/bug
|
|
|
|
# Output: "Found existing fork with different name: yanmxa/hub-of-hubs"
|
|
# Script uses the correct fork name automatically
|
|
```
|
|
|
|
## Key Features
|
|
|
|
✅ **Idempotent** - Safe to re-run, won't duplicate work
|
|
✅ **Smart fork detection** - Finds forks even with different names
|
|
✅ **Auto-fork** - Creates fork if it doesn't exist
|
|
✅ **Auto-commit** - Commits changes with DCO sign-off
|
|
✅ **No duplicates** - Checks for existing PRs before creating
|
|
✅ **Current dir mode** - Can work in existing repos (use `.` as work_dir)
|
|
✅ **Fast clone** - Shallow clone by default (10x faster)
|
|
✅ **Proper remotes** - Sets up upstream (HTTPS) and origin (SSH)
|
|
|
|
## Performance
|
|
|
|
**Clone speed with depth=1:**
|
|
| Repository | Full Clone | Shallow (depth=1) | Speedup |
|
|
|------------|------------|-------------------|---------|
|
|
| kubernetes | ~3GB | ~300MB | 10x |
|
|
| Linux kernel | ~4GB | ~400MB | 10x |
|
|
| Typical repo | ~500MB | ~50MB | 10x |
|
|
|
|
## Prerequisites
|
|
|
|
- **GitHub CLI (`gh`)** - Must be installed and authenticated
|
|
```bash
|
|
brew install gh
|
|
gh auth login
|
|
```
|
|
|
|
- **Git** - Configured with name and email
|
|
```bash
|
|
git config --global user.name "Your Name"
|
|
git config --global user.email "your.email@example.com"
|
|
```
|
|
|
|
- **SSH Keys** - Setup for GitHub (for cloning via SSH)
|
|
|
|
## Troubleshooting
|
|
|
|
**Fork already exists**
|
|
→ Script handles automatically, uses existing fork
|
|
|
|
**Repository already cloned**
|
|
→ Script verifies and updates remotes
|
|
|
|
**PR already exists**
|
|
→ Script shows existing PR URL instead of creating duplicate
|
|
|
|
**Fork has different name**
|
|
→ Script detects via GitHub API and uses correct name
|
|
|
|
**Current directory not a git repo**
|
|
→ Don't use `.` as work_dir, or cd to a git repo first
|
|
|
|
## Notes
|
|
|
|
- All commits are signed with DCO (`-s` flag)
|
|
- Uses `git add -u` (only modified/deleted files, not new untracked files)
|
|
- Creates PRs with proper `username:branch` format
|
|
- Handles both HTTPS (upstream) and SSH (origin) remotes
|
|
- Color-coded output for easy reading
|