关于 gh-create-pr
gh-create-pr 是指导 GitHub 仓库创建拉取请求的技能,面向维护者和开发者。它规定模板、变更说明、验证记录及分支与堆栈处理流程。
主要功能
- 01读取并遵循拉取请求模板
- 02收集变更范围与测试证据
- 03核对 Agent Note 和验收标准
- 04检查分支基线及堆栈状态
- 05按流程创建并验证拉取请求
适用场景
- 01为代码变更准备符合仓库规范的 PR
- 02为堆叠分支创建并关联多个 PR
- 03记录实际运行的验证命令和场景
- 04按发布分支规则处理修复请求
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cherryhq/ cherry-studio --skill gh-create-pr安装后在 Claude Code 中输入/gh-create-pr确认已加载。
附带文件agents/openai.yaml
详细介绍
GitHub PR 创建
堆叠分支工具
此仓库将 .agents/skills/gh-stack/SKILL.md 作为公开项目技能提供;开发者无需单独安装此 Agent 技能。在操作堆叠分支或 PR 前,请先阅读该文件。使用 .agents/skills/ 的 Agent 会直接发现此技能。如果 Claude 检出中缺少 .claude/skills/gh-stack,请运行 pnpm skills:sync,然后运行 pnpm skills:check;不要下载单独的全局副本。
在任务中首次运行 gh stack 命令前,请检查 GitHub CLI,并在缺少官方扩展时安装它:
command -v gh >/dev/null 2>&1 || {
echo "GitHub CLI is required: https://cli.github.com/" >&2
exit 1
}
gh auth status
if ! gh stack --help >/dev/null 2>&1; then
gh extension install github/gh-stack
fi
gh stack --help >/dev/null
如果身份验证、安装或最终验证失败,请停止。不要使用临时的 Git 命令推断堆叠关系。对于人工编写的 Cherry PR,请使用 gh stack push,从底部到顶部通过此技能创建每个符合要求的 PR,然后使用 gh stack link 关联已有 PR;gh stack submit --auto 会绕过符合模板要求的正文流程创建 PR,不得用它绕过此工作流。
工作流
- 起草 PR 正文前,先阅读
.github/pull_request_template.md。 - 从当前分支收集 PR 上下文(base/head、范围、关联 issue、测试状态、破坏性变更、发布说明内容)。确认实际 base,并运行
pnpm change:scope --base <verified-base-ref>;不要只根据最近一次提交推断范围。 - 阅读
.agents/notes/README.md并对变更进行分类:- 在
Agent Note中填写仓库路径;如果是本地或机械性变更,则填写N/A — <reason>。 - 对于 Spec PR,填写
Spec PR: This PR并列出所有 AC。 - 对于实现层,链接 Spec PR,并仅列出本层覆盖的 AC ID。确认存在一条
commit_id与当前 Spec head 相同的APPROVED审核;过期的批准不能授权实现。 - 对于有持久理由说明的直接 bug 修复,链接已实现的
bug-fixnote,并填写Spec PR: N/A。 - 由自动化撰写的 PR(仓库工作流和 Dependabot)无需填写这些元数据字段。不要让它们的正文模仿人工撰写的 PR。
- 在
- 对于实现 PR,先完成堆栈工具预检,然后运行
gh stack view --json。如果退出码为 2,请遵循gh-stack技能中的远程发现流程;缺少本地元数据并不能证明 PR 是独立的。检查每个下游实现 PR,并仅汇总有实际验证支持的 AC。中间层应保留 proposed 状态的 note。如果当前 PR 是最后一层,且累积证据覆盖完整的已批准 Spec,则将双语三元组移至implemented/,并在发布前运行pnpm agent-notes:check-transition --base <verified-spec-ref>。 - 在
Verification中填写实际运行过的命令和场景。绝不能将计划中、待处理、跳过或仅 CI 执行的检查标记为通过。 - 检查当前分支是否已推送到远程。如果尚未推送,请先推送:
- 默认远程为
origin,但如果想使用其他远程,请询问用户。
git push -u <remote> <head-branch> - 默认远程为
- 确定 base 分支:
- 应用任何默认值前,先检查 head 分支。如果 head 是
release/v<version>,请停止:绝不要从发布分支创建 pull request,尤其不要创建到main的 PR。应将独立修复放在主题分支上并以发布分支为目标,或者让 Post Release 创建元数据同步分支。 - 将任意主题分支默认设为
main前,先检查其合并基点和上游。若产品代码修复始于release/v<version>,必须停止并从main重新创建为 hotfix;只有发布专属修复或明确的 backport 恢复主题分支可以指向对应的发布分支。 backport/v<version>/pr-<number>head 必须以匹配的release/v<version>为 base,且正文必须在单独一行包含用于指向确切源 hotfix PR 的 ``。release-sync/v<version>head 必须以main为目标,使用确切标题chore(release): sync v<version> metadata,保留正文标记release-metadata-boundary: v<version>,并使用 squash 合并。- 对于将 CherryHQ/cherry-studio 作为
origin的官方仓库:默认 base 为origin上的main,但允许用户明确指定 base 分支。 main是当前活跃的开发线,包括 hotfix PR。除非用户明确要求,否则不要以旧维护分支为目标。- 只有当用户明确表示必须将 PR 纳入当前草稿发布版本时,才将 PR 归类为发布 hotfix。标题使用
hotfix: <description>或hotfix(<kebab-case-scope>): <description>,scope 必须是小写字母数字 kebab-case,冒号后恰好一个空格,且 description 不得为空。标题语法会自动同步hotfix标签。只有在恰好一个草稿语义化版本发布有匹配的活跃release/v<version>分支时,合并才会创建单独的 backport PR;否则自动化会停止,不会猜测目标。 - 如果 hotfix 会影响用户,请分别提供一条各语言的发布说明,以便自动化更新当前草稿发布版本和稳定版发布历史。将以下确切结构放在模板现有的
release-note围栏内;不要添加项目符号前缀:[组件] 英文说明。 [组件] 中文说明。 - 如果此热修复没有面向用户的发布说明,请在模板的
release-note代码围栏中保留NONE。代码仍会回移,但发布元数据不变。提供的双语内容块必须严格符合上述结构。 - 如果将 fork 仓库设为
origin:使用git remote -v检查可用的远程仓库;默认基准分支可能是upstream/main或其他远程仓库。始终假定用户希望将 head 合并到 CherryHQ/cherry-studio/main,除非用户明确指定了基准分支。 - 如果基准分支不是默认分支,请让用户确认。
- 应用任何默认值前,先检查 head 分支。如果 head 是
- 创建临时文件,并使用单个 Bash heredoc 写入 PR 正文
(避免在 Windows 上使用
mktemp和Write工具时出现路径不匹配):
严格按照模板结构填写内容(保留章节顺序、 标题和复选框格式)。如不适用,请填写pr_body_file="/tmp/gh-pr-body-$(date +%s).md" cat > "$pr_body_file" <<'EOF' ...filled template body... EOFN/A或None。 - 使用 Bash
cat "$pr_body_file"检查临时文件内容(在 Windows 上,Read工具可能无法读取/tmp/...路径)。如果用户要求预览或确认,请展示完整正文并按其要求操作;否则,继续创建已获授权的 PR。 - 创建 PR;如果用户要求创建草稿,请添加
--draft:
gh pr create --base <base> --head <head> --title "<title>" --body-file "$pr_body_file"
对于发布热修复,请使用可被分类器准确识别的标题,以便工作流同步标签,并单独验证提供的双语说明:
gh pr create --base main --head <head> --title "hotfix: <description>" --body-file "$pr_body_file"
创建后,确认分类器是否添加了 hotfix;如果没有,请修改标题,而不是手动添加标签。还要修正工作流报告的任何格式错误的可选发布说明块。
11. 清理临时文件:rm -f "$pr_body_file"
12. 报告已创建 PR 的 URL,并概述标题、基准分支/head、Agent Note/Spec、AC 覆盖情况、实际验证内容以及任何所需的后续操作。
约束
-
不得跳过模板中的任何章节。
-
不得改写模板格式。
-
内容应简洁明确,并针对当前变更集。
-
PR 标题和正文必须使用英文。
-
普通 bug 修复不得使用
hotfix标题或标签。该标签会在合并后、存在一个匹配的草稿版本发布时,触发自动创建回移 PR。 -
发布热修复在没有面向用户的发布说明时可以使用
NONE。不得提供不完整、仅单语或格式错误的双语说明;回移工作流会对格式错误的内容采取失败关闭处理。 -
绝不能默认将
release/v<version>分支设为main的 head;发布分支不能作为 PR 源分支。 -
当前 Spec head 尚未获得精确匹配的 Approval 时,绝不能将实现 PR 发布为就绪状态。Spec 可以保持未合并,并作为堆叠分支的基准。
-
每个由人编写的 PR 都必须填写
Agent Note、Spec PR和Acceptance criteria;若填写N/A,必须简要说明原因。自动化创建的 PR(仓库工作流和 Dependabot)不受此元数据要求限制。 -
发布说明与文档复选框——两者都取决于变更是否面向用户。请使用下表:
变更类型 发布说明 文档 [x]面向用户的新功能/设置/UI 描述变更 ✅ 用户可见的 bug 修复 描述修复内容 如果行为发生变化则勾选 ✅ 行为变更/默认值变更 描述变更 + action required✅ 面向用户的依赖项安全修复 描述修复内容 如果用法发生变化则勾选 ✅ CI/GitHub Actions 变更 NONE❌ 内部重构(用户无法察觉) NONE❌ 开发/构建工具变更 NONE❌ 仅用于开发的依赖项升级 NONE❌ 仅测试/代码风格变更 NONE❌
命令模式
# read template
cat .github/pull_request_template.md
# prepare and inspect the PR body
pr_body_file="/tmp/gh-pr-body-$(date +%s).md"
cat > "$pr_body_file" <<'EOF'
...filled template body...
EOF
cat "$pr_body_file"
# create the authorized PR; add --draft when requested
gh pr create --base <base> --head <head> --title "<title>" --body-file "$pr_body_file"
rm -f "$pr_body_file"