用途
merge-pr 是一个用于合并 GitHub Pull Request 的技能,属于 termix-official/cryptoclaw 仓库。它适用于在 /preparepr 之后,将一个已准备好的 PR 通过 squash 方式合并,并在成功后清理 worktree。当被要求合并一个就绪的 PR 时使用。该技能明确要求:不要向 main 分支推送,不要修改代码,确保 PR 最终处于 MERGED 状态。
主要能力
- 通过 gh pr merge --squash 合并 PR,这是通往 main 的唯一路径。
- 在合并成功后清理 worktree。
- 支持自动检测 PR 编号或 URL,若缺失则从对话中自动识别,若含糊则询问。
- 支持在检查仍在运行时使用 --auto 排队合并。
- 获取并记录合并 SHA。
- 可选地添加合并评论。
- 验证 PR 状态为 MERGED。
使用方式
输入
- 询问 PR 编号或 URL。
- 若缺失,从对话中自动检测。
- 若含糊,询问。
安全约束
- 使用 gh pr merge --squash 作为通往 main 的唯一路径。
- 合并期间完全不运行 git push。
- 不运行 gateway stop 命令。不终止进程。不触碰端口 18792。
执行规则
- 执行工作流。不要在打印 TODO 清单后停止。
- 若委托他人,要求被委托者运行命令并捕获输出。
已知陷阱
- 若看到 "fatal: not a git repository",说明目录错误。应使用 ~/Development/openclaw,而非 ~/openclaw。
- 读取 worktree 中的 .local/review.md 和 .local/prep.md。不要跳过。
- 仅在成功合并后清理真实的 worktree 目录 .worktrees/pr-<PR>。
- 预期清理会移除 .local/ 产物。
完成标准
- 确保 gh pr merge 成功。
- 确保 PR 状态为 MERGED,绝不为 CLOSED。
- 记录合并 SHA。
- 仅在合并成功后运行清理。
步骤
-
首先:创建 TODO 清单。创建所有合并步骤的清单,打印它,然后继续执行命令。
-
设置:使用 Worktree。为所有合并工作使用隔离的 worktree。
cd ~/Development/openclaw
# Sanity: confirm you are in the repo
git rev-parse --show-toplevel
WORKTREE_DIR=".worktrees/pr-<PR>"
在 worktree 目录内运行所有命令。
- 加载本地产物(强制)。预期这些文件来自之前的步骤:.local/review.md 来自 /reviewpr,.local/prep.md 来自 /preparepr。
ls -la .local || true
if [ -f .local/review.md ]; then
echo "Found .local/review.md"
sed -n '1,120p' .local/review.md
else
echo "Missing .local/review.md. Stop and run /reviewpr, then /preparepr."
exit 1
fi
if [ -f .local/prep.md ]; then
echo "Found .local/prep.md"
sed -n '1,120p' .local/prep.md
else
echo "Missing .local/prep.md. Stop and run /preparepr first."
exit 1
fi
- 识别 PR 元信息。
gh pr view <PR> --json number,title,state,isDraft,author,headRefName,baseRefName,headRepository,body --jq '{number,title,state,isDraft,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)
- 运行健全性检查。若以下任一为真则停止:PR 是草稿;必需检查失败;分支落后于 main。
# Checks
gh pr checks <PR>
# Check behind main
git fetch origin main
git fetch origin pull/<PR>/head:pr-<PR>
git merge-base --is-ancestor origin/main pr-<PR> || echo "PR branch is behind main, run /preparepr"
若有任何失败或落后,停止并提示运行 /preparepr。
- 合并 PR 并删除分支。若检查仍在运行,使用 --auto 排队合并。
# Check status first
check_status=$(gh pr checks <PR> 2>&1)
if echo "$check_status" | grep -q "pending\|queued"; then
echo "Checks still running, using --auto to queue merge"
gh pr merge <PR> --squash --delete-branch --auto
echo "Merge queued. Monitor with: gh pr checks <PR> --watch"
else
gh pr merge <PR> --squash --delete-branch
fi
若合并失败,报告错误并停止。不要循环重试。若 PR 需要超出 /preparepr 已做范围的更改,停止并提示再次运行 /preparepr。
- 获取合并 SHA。
merge_sha=$(gh pr view <PR> --json mergeCommit --jq '.mergeCommit.oid')
echo "merge_sha=$merge_sha"
- 可选评论。使用字面多行字符串或 heredoc 表示换行。
gh pr comment <PR> -F - <<'EOF'
Merged via squash.
- Merge commit: $merge_sha
Thanks @$contrib!
EOF
- 验证 PR 状态为 MERGED。
gh pr view <PR> --json state --jq .state
- 仅在成功时清理 worktree。仅当第 6 步返回 MERGED 时运行清理。
cd ~/Development/openclaw
git worktree remove ".worktrees/pr-<PR>" --force
git branch -D temp/pr-<PR> 2>/dev/null || true
git branch -D pr-<PR> 2>/dev/null || true
护栏
- 仅使用 worktree。
- 不要关闭 PR。
- 以 MERGED 状态结束。
- 仅在合并成功后清理。
- 绝不推送到 main。仅使用 gh pr merge --squash。
- 在此命令中完全不运行 git push。
适用场景
- 在 /preparepr 之后合并一个已准备好的 GitHub PR。
- 当被要求合并一个就绪的 PR 时。
- 需要以 squash 方式合并并自动删除分支的场景。
- 需要在合并后清理 worktree 的场景。
限制
- 不向 main 分支推送。
- 不修改代码。
- 不运行 git push。
- 不运行 gateway stop 命令,不终止进程,不触碰端口 18792。
- PR 为草稿、必需检查失败或分支落后于 main 时停止。
- 合并失败时不循环重试。
- 仅在合并成功后清理 worktree。
- 依赖 .local/review.md 和 .local/prep.md 存在,否则停止。
- 关于收费、价格、平台支持范围等信息暂未提供。