Prepare PR
Overview
Prepare a PR branch for merge with review fixes, green gates, and an updated head branch.
Inputs
-
Ask for PR number or URL.
-
If missing, auto-detect from conversation.
-
If ambiguous, ask.
Safety
-
Never push to main or origin/main . Push only to the PR head branch.
-
Never run git push without specifying remote and branch explicitly. Do not run bare git push .
-
Do not run gateway stop commands. Do not kill processes. Do not touch port 18792.
-
Do not run git clean -fdx .
-
Do not run git add -A or git add . . Stage only specific files changed.
Execution Rule
-
Execute the workflow. Do not stop after printing the TODO checklist.
-
If delegating, require the delegate to run commands and capture outputs.
Known Footguns
-
If you see "fatal: not a git repository", you are in the wrong directory. Use ~/openclaw .
-
Do not run git clean -fdx .
-
Do not run git add -A or git add . .
Completion Criteria
-
Rebase PR commits onto origin/main .
-
Fix all BLOCKER and IMPORTANT items from .local/review.md .
-
Run gates and pass.
-
Commit prep changes.
-
Push the updated HEAD back to the PR head branch.
-
Write .local/prep.md with a prep summary.
-
Output exactly: PR is ready for /mergepr .
First: Create a TODO Checklist
Create a checklist of all prep steps, print it, then continue and execute the commands.
Setup: Use a Worktree
Use an isolated worktree for all prep work.
cd ~/openclaw
Sanity: confirm you are in the repo
git rev-parse --show-toplevel
WORKTREE_DIR=".worktrees/pr-<PR>"
Run all commands inside the worktree directory.
Load Review Findings (Mandatory)
if [ -f .local/review.md ]; then echo "Found review findings from /reviewpr" else echo "Missing .local/review.md. Run /reviewpr first and save findings." exit 1 fi
Read it
sed -n '1,200p' .local/review.md
Steps
- Identify PR meta (author, head branch, head repo URL)
gh pr view <PR> --json number,title,author,headRefName,baseRefName,headRepository,body --jq '{number,title,author:.author.login,head:.headRefName,base:.baseRefName,headRepo:.headRepository.nameWithOwner,body}' contrib=$(gh pr view <PR> --json author --jq .author.login) head=$(gh pr view <PR> --json headRefName --jq .headRefName) head_repo_url=$(gh pr view <PR> --json headRepository --jq .headRepository.url)
- Fetch the PR branch tip into a local ref
git fetch origin pull/<PR>/head:pr-<PR>
- Rebase PR commits onto latest main
Move worktree to the PR tip first
git reset --hard pr-<PR>
Rebase onto current main
git fetch origin main git rebase origin/main
If conflicts happen:
-
Resolve each conflicted file.
-
Run git add <resolved_file> for each file.
-
Run git rebase --continue .
If the rebase gets confusing or you resolve conflicts 3 or more times, stop and report.
-
Fix issues from .local/review.md
-
Fix all BLOCKER and IMPORTANT items.
-
NITs are optional.
-
Keep scope tight.
Keep a running log in .local/prep.md :
-
List which review items you fixed.
-
List which files you touched.
-
Note behavior changes.
-
Update CHANGELOG.md if flagged in review
Check .local/review.md section H for guidance. If flagged and user-facing:
- Check if CHANGELOG.md exists.
ls CHANGELOG.md 2>/dev/null
-
Follow existing format.
-
Add a concise entry with PR number and contributor.
-
Update docs if flagged in review
Check .local/review.md section G for guidance. If flagged, update only docs related to the PR changes.
- Commit prep fixes
Stage only specific files:
git add <file1> <file2> ...
Preferred commit tool:
committer "fix: <summary> (#<PR>) (thanks @$contrib)" <changed files>
If committer is not found:
git commit -m "fix: <summary> (#<PR>) (thanks @$contrib)"
- Run full gates before pushing
pnpm install pnpm build pnpm ui:build pnpm check pnpm test
Require all to pass. If something fails, fix, commit, and rerun. Allow at most 3 fix and rerun cycles. If gates still fail after 3 attempts, stop and report the failures. Do not loop indefinitely.
- Push updates back to the PR head branch
Ensure remote for PR head exists
git remote add prhead "$head_repo_url.git" 2>/dev/null || git remote set-url prhead "$head_repo_url.git"
Use force with lease after rebase
Double check: $head must NOT be "main" or "master"
echo "Pushing to branch: $head" if [ "$head" = "main" ] || [ "$head" = "master" ]; then echo "ERROR: head branch is main/master. This is wrong. Stopping." exit 1 fi git push --force-with-lease prhead HEAD:$head
- Verify PR is not behind main (Mandatory)
git fetch origin main git fetch origin pull/<PR>/head:pr-<PR>-verify --force git merge-base --is-ancestor origin/main pr-<PR>-verify && echo "PR is up to date with main" || echo "ERROR: PR is still behind main, rebase again" git branch -D pr-<PR>-verify 2>/dev/null || true
If still behind main, repeat steps 2 through 9.
- Write prep summary artifacts (Mandatory)
Update .local/prep.md with:
-
Current HEAD sha from git rev-parse HEAD .
-
Short bullet list of changes.
-
Gate results.
-
Push confirmation.
-
Rebase verification result.
Create or overwrite .local/prep.md and verify it exists and is non-empty:
git rev-parse HEAD ls -la .local/prep.md wc -l .local/prep.md
- Output
Include a diff stat summary:
git diff --stat origin/main..HEAD git diff --shortstat origin/main..HEAD
Report totals: X files changed, Y insertions(+), Z deletions(-).
If gates passed and push succeeded, print exactly:
PR is ready for /mergepr
Otherwise, list remaining failures and stop.
Guardrails
-
Worktree only.
-
Do not delete the worktree on success. /mergepr may reuse it.
-
Do not run gh pr merge .
-
Never push to main. Only push to the PR head branch.
-
Run and pass all gates before pushing.