--- name: prepare-pr description: Prepare a GitHub PR for merge by rebasing onto main, fixing review findings, running gates, committing fixes, and pushing to the PR head branch. Use after /reviewpr. Never merge or push to main. --- # 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 `~/dev/openclaw` if available; otherwise ask user. - 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. ```sh cd ~/openclaw # Sanity: confirm you are in the repo git rev-parse --show-toplevel WORKTREE_DIR=".worktrees/pr-" ``` Run all commands inside the worktree directory. ## Load Review Findings (Mandatory) ```sh 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 1. Identify PR meta (author, head branch, head repo URL) ```sh gh pr view --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 --json author --jq .author.login) head=$(gh pr view --json headRefName --jq .headRefName) head_repo_url=$(gh pr view --json headRepository --jq .headRepository.url) ``` 2. Fetch the PR branch tip into a local ref ```sh git fetch origin pull//head:pr- ``` 3. Rebase PR commits onto latest main ```sh # Move worktree to the PR tip first git reset --hard pr- # Rebase onto current main git fetch origin main git rebase origin/main ``` If conflicts happen: - Resolve each conflicted file. - Run `git add ` for each file. - Run `git rebase --continue`. If the rebase gets confusing or you resolve conflicts 3 or more times, stop and report. 4. 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. 5. 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. ```sh ls CHANGELOG.md 2>/dev/null ``` - Follow existing format. - Add a concise entry with PR number and contributor. 6. Update docs if flagged in review Check `.local/review.md` section G for guidance. If flagged, update only docs related to the PR changes. 7. Commit prep fixes Stage only specific files: ```sh git add ... ``` Preferred commit tool: ```sh committer "fix: (#) (thanks @$contrib)" ``` If `committer` is not found: ```sh git commit -m "fix: (#) (thanks @$contrib)" ``` 8. Run full gates before pushing ```sh 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. 9. Push updates back to the PR head branch ```sh # 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 ``` 10. Verify PR is not behind main (Mandatory) ```sh git fetch origin main git fetch origin pull//head:pr--verify --force git merge-base --is-ancestor origin/main pr--verify && echo "PR is up to date with main" || echo "ERROR: PR is still behind main, rebase again" git branch -D pr--verify 2>/dev/null || true ``` If still behind main, repeat steps 2 through 9. 11. 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: ```sh git rev-parse HEAD ls -la .local/prep.md wc -l .local/prep.md ``` 12. Output Include a diff stat summary: ```sh 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.