clawdinators/scripts/landpr.md
Josh Palmer be9f5fada8 refine: landpr flow to single approval gate
- default to rebase unless squash requested
- avoid dumping checklist; treat as playbook
- add single approval gate before rebase/force-push/merge
2026-02-01 17:15:33 +01:00

2.7 KiB

/landpr

Input

  • PR: <number|url>
    • If missing: use the most recent PR mentioned in the conversation.
    • If ambiguous: ask.

Do (end-to-end) Goal: PR must end in GitHub state = MERGED (never CLOSED). Use gh pr merge with --rebase or --squash.

  1. Repo clean: git status.

  2. Identify PR meta (author + head branch):

    gh pr view <PR> --json number,title,author,headRefName,baseRefName,headRepository --jq '{number,title,author:.author.login,head:.headRefName,base:.baseRefName,headRepo:.headRepository.nameWithOwner}'
    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)
    
  3. Fast-forward base:

    • git checkout main
    • git pull --ff-only
  4. Create temp base branch from main:

    • git checkout -b temp/landpr-<ts-or-pr>
  5. Check out PR branch locally:

    • gh pr checkout <PR>
  6. Single approval gate: summarize plan + merge strategy, then get explicit approval before any rebase/force-push/merge.

  7. Rebase PR branch onto temp base:

    • git rebase temp/landpr-<ts-or-pr>
    • Fix conflicts; keep history tidy.
  8. Fix + tests + changelog:

    • Implement fixes + add/adjust tests
    • Update CHANGELOG.md and mention #<PR> + @$contrib
  9. Decide merge strategy:

    • Default: rebase (preserve history)
    • Use squash only if explicitly requested
  10. Full gate (BEFORE commit):

  • pnpm lint && pnpm build && pnpm test
  1. Commit via committer (include # + contributor in commit message):
  • committer "fix: <summary> (#<PR>) (thanks @$contrib)" CHANGELOG.md <changed files>
  • land_sha=$(git rev-parse HEAD)
  1. Push updated PR branch (rebase => usually needs force):
git remote add prhead "$head_repo_url.git" 2>/dev/null || git remote set-url prhead "$head_repo_url.git"
git push --force-with-lease prhead HEAD:$head
  1. Merge PR (must show MERGED on GitHub):
  • Rebase: gh pr merge <PR> --rebase
  • Squash: gh pr merge <PR> --squash
  • Never gh pr close (closing is wrong)
  1. Sync main:
  • git checkout main
  • git pull --ff-only
  1. Comment on PR with what we did + SHAs + thanks only with explicit user approval:
merge_sha=$(gh pr view <PR> --json mergeCommit --jq '.mergeCommit.oid')
gh pr comment <PR> --body "Landed via temp rebase onto main.\n\n- Gate: pnpm lint && pnpm build && pnpm test\n- Land commit: $land_sha\n- Merge commit: $merge_sha\n\nThanks @$contrib!"
  1. Verify PR state == MERGED:
  • gh pr view <PR> --json state --jq .state
  1. Delete temp branch:
  • git branch -D temp/landpr-<ts-or-pr>