feat: add /landpr skill + checklist

- add landpr workspace skill to expose /landpr command
- add scripts/landpr.md checklist for OpenClaw PR landings
This commit is contained in:
Josh Palmer 2026-02-01 17:10:24 +01:00
parent 3f04ee8675
commit 9a4d467f05
2 changed files with 94 additions and 0 deletions

View File

@ -0,0 +1,27 @@
---
name: landpr
description: Land an OpenClaw PR end-to-end using the repo landpr checklist. Use when someone requests “/landpr” or asks to merge/land a PR.
user-invocable: true
---
# Land PR (OpenClaw)
Use this skill to land **openclaw/openclaw** PRs only.
## Safety + Scope
- **Repo restriction:** only `openclaw/openclaw`. If the PR is in any other repo, stop and ask.
- **Confirmation required:** before rebase/force-push/merge, summarize the plan and ask for explicit approval.
- **Never close PRs.** PR must end in GitHub state **MERGED**.
- **No GitHub comments** unless the user explicitly approves (global policy).
## Instructions
Follow the checklist here:
- `/var/lib/clawd/repos/clawdinators/scripts/landpr.md`
If the user did not specify a PR, use the most recent PR mentioned in the conversation. If ambiguous, ask.
When ready to execute the merge step, confirm which strategy to use (rebase vs squash). If unclear, ask.
After completion, verify PR state == MERGED.

67
scripts/landpr.md Normal file
View File

@ -0,0 +1,67 @@
/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):
```sh
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) Rebase PR branch onto temp base:
- `git rebase temp/landpr-<ts-or-pr>`
- Fix conflicts; keep history tidy.
7) Fix + tests + changelog:
- Implement fixes + add/adjust tests
- Update `CHANGELOG.md` and mention `#<PR>` + `@$contrib`
8) Decide merge strategy:
- Rebase if we want to preserve commit history
- Squash if we want a single clean commit
- If unclear, ask
9) Full gate (BEFORE commit):
- `pnpm lint && pnpm build && pnpm test`
10) Commit via committer (include # + contributor in commit message):
- `committer "fix: <summary> (#<PR>) (thanks @$contrib)" CHANGELOG.md <changed files>`
- `land_sha=$(git rev-parse HEAD)`
11) Push updated PR branch (rebase => usually needs force):
```sh
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
```
12) 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)
13) Sync main:
- `git checkout main`
- `git pull --ff-only`
14) Comment on PR with what we did + SHAs + thanks **only with explicit user approval**:
```sh
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!"
```
15) Verify PR state == MERGED:
- `gh pr view <PR> --json state --jq .state`
16) Delete temp branch:
- `git branch -D temp/landpr-<ts-or-pr>`