关于 open-pr
open-pr 是用于 GitHub 仓库的编码工作流技能,可推送分支、创建或复用 PR,并评审改动。它也支持链式 PR 入栈和 Project 状态更新;合并与 CI 预检交由其他流程处理。
主要功能
- 01推送分支并创建或复用 PR
- 02按提交信息生成标题与正文
- 03支持链式 PR 入栈
- 04评审改动并标记阻塞项
- 05更新 PR 的 Project 状态
适用场景
- 01为已完成的分支创建 PR
- 02提交基于下层分支的链式 PR
- 03创建 PR 前检查改动并报告问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ouyangjiahong26/ skills --skill open-pr安装后在 Claude Code 中输入/open-pr确认已加载。
详细介绍
来自项目 README推送分支、创建带 AI 标记的 PR、评审改动,报告结果。合并、CI 预检与清理交由 /merge-pr。分支属于 GitHub 栈时,base 指向下层分支,并把这一层入栈。
1. 确认分支与 base
- 分支取参数第一项。没有参数则运行
git rev-parse --abbrev-ref HEAD。 - 识别默认分支:
git remote show origin取 HEAD 分支。查询失败时用仓库中存在的main/master。 - 确定 base(本分支是栈的一层时为下层分支,否则为默认分支):
- 参数给了下层分支:base 取它。
- 否则查当前分支已有 PR:
gh pr list --head <branch> --json baseRefName --jq '.[0].baseRefName'。有值且不是默认分支时 base 取它。 - 否则 base 是默认分支。
- 当前分支是默认分支、没有 GitHub remote,或
git log <base>..<branch> --oneline为空时,停止并说明原因。 - base 不是默认分支时(本分支是栈的一层):
- 下层分支必须有 open PR(
gh pr list --head <base> --json number,state --jq '.[0]')。没有就停止,提示用户先对下层分支跑/open-pr。gh stack link会给缺 PR 的下层自动建 draft PR,不借它做这件事。 gh stack --version失败时停止,请用户跑gh extension install github/gh-stack。链式 PR 不入栈时,上层 PR 的 CI 与分支规则不会按栈底分支触发。
- 下层分支必须有 open PR(
2. 推送并创建 PR
- 执行
git push origin <branch>。 - 检查已有 PR:
gh pr list --head <branch> --json url,number --jq '.[0]'
- 已有 PR 时复用其 URL 和编号,标题保持不动,正文默认不改写。需要更新正文时,先用
gh pr view <number> --json author --jq .author.login与gh api user --jq .login比对作者。作者是本人时,询问用户并得到明确同意后,用gh pr edit <number> --body-file <文件>更新。作者不是本人时,不改正文,只用评论提出更新建议,评论首行写 AI 贡献标记(> **[AI Generated]** 本评论由 AI 完成。)。没有已有 PR 时:- 从
git log <base>..<branch> --pretty=%s找关联#N。标题写[AI Generated][<类型>] <描述>:类型取[FIX]、[DOCS]、[FEAT]、[REFACTOR]、[TEST]、[CHORE]、[STYLE]中的一个,描述取第一条 commit message 去掉type(scope):前缀后的部分。 - 起草 body:关联 issue、改动摘要、测试命令及结果。分支上有多条 commit 时改动摘要覆盖全部 commit。没有关联 issue 时明确写无关联 issue。
- 用
gh pr create --base <base> --head <branch> --title "<标题>" --body "<body>"创建。
- 从
- base 不是默认分支时把这一层入栈(新建 PR 和复用已有 PR 都要做)。
gh stack link自己会 push 分支,且要求给全链:- 下层 PR 已在栈里时,用
<owner>/<repo>(gh repo view --json nameWithOwner --jq .nameWithOwner)读栈:
- 下层 PR 已在栈里时,用
gh api /repos/<owner>/<repo>/pulls/<下层PR号> --jq '.stack.number // empty'
gh api /repos/<owner>/<repo>/stacks/<栈号> --jq '.base.ref, ([.pull_requests[].head.ref] | join(" "))'
第一行给出栈号(空即下层还没入栈)。第二行给出 trunk 与自底向上的分支链,当前分支不在链里就补到末尾。
2. 只有两层时链是 <下层分支> <分支>,trunk 取下层 PR 的 baseRefName。
3. gh stack link --base <trunk> <链…>。缺层会报 Cannot update stack: this would remove #N from the stack,报错即停止,不自行拼链。
4. 复核:gh api /repos/<owner>/<repo>/pulls/<PR号> --jq '.stack' 应给出 number、position、size。
5. 把 PR 自身加入 Project,Status 置 In review,按 github-project skill 的 references/sync-discipline.md 执行,失败处理见该文件的失败处理表。之后报告 PR URL。
gh 未登录时提示用户运行 gh auth login。不要猜测或替代认证方式。
3. 评审
本轮会话已有同一分支且其后无新 commit 的评审结论,则复用。否则以 git merge-base <base> <branch> 为固定点调用 code-review skill。base 是下层分支时,这个固定点正好是下层分支的最新提交,评审范围就是本层 diff。
将安全漏洞、数据丢失或崩溃风险、任务要求缺失、范围蔓延和错误实现视为阻塞项。风格与可维护性建议不阻塞。
- 存在阻塞项:按来源列出阻塞项和非阻塞建议,停止等待修复。
- 评审执行失败:报告错误,询问用户是否跳过评审。只有明确同意才继续。
- 无阻塞项:报告评审结论。
4. 报告
报告:分支已推送、PR URL、评审结论、PR 的 Project 状态。入栈时另报栈号与层级(stack #<number> 第 <position>/<size> 层)。CI 与可合并性由 /merge-pr 在合并前预检。下一步提示用户运行 /merge-pr。
边界
| 情况 | 处理方式 |
|---|---|
| 用户只要求创建 PR | 创建并报告 PR URL 后停止,不评审 |
| 评审发现阻塞项 | 停止等待修复。修复后重新提交、推送并重跑本 skill |
gh pr create 失败 | 报告错误与原因,不做替代操作 |
gh stack 扩展未安装 | 停止,请用户 gh extension install github/gh-stack |
| 下层分支没有 open PR | 停止,提示先对下层分支跑 /open-pr |
gh stack link 失败 | 报告错误与原因。不自行拼链,也不改用 gh stack submit(它自造标题并新建 draft PR) |