Cryptoclaw prepare-pr
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.
git clone https://github.com/TermiX-official/cryptoclaw
T=$(mktemp -d) && git clone --depth=1 https://github.com/TermiX-official/cryptoclaw "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.agents/skills/prepare-pr" ~/.claude/skills/termix-official-cryptoclaw-prepare-pr && rm -rf "$T"
.agents/skills/prepare-pr/SKILL.mdPrepare 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
ormain
. Push only to the PR head branch.origin/main - Never run
without specifying remote and branch explicitly. Do not run baregit push
.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
orgit add -A
. Stage only specific files changed.git add .
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
orgit add -A
.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
with a prep summary..local/prep.md - 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
for each file.git add <resolved_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
if flagged in reviewCHANGELOG.md
Check
.local/review.md section H for guidance.
If flagged and user-facing:
- Check if
exists.CHANGELOG.md
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.
may reuse it./mergepr - Do not run
.gh pr merge - Never push to main. Only push to the PR head branch.
- Run and pass all gates before pushing.