Files
.pouch/skills/manage-release/references/forge-adapters.md
T
2026-08-04 13:55:16 +08:00

84 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 代码托管平台适配
## 区分 Git 与 Forge 能力
fetch、查询 remote refs、推送分支和推送单个 tag 属于 Git transport 能力,可直接通过
已配置的 Git remote 完成。创建或查看 PR/MR、合并以及创建 Forge Release 才需要平台
CLI。只发布 tag 时,不要因为缺少 Forge CLI 而停止;仍要验证 remote、认证目标和推送
授权,并在 push 后读回远端 ref。
## 选择 Forge 适配器
从 push remote URL 识别平台,并使用对应官方 CLI:
| 平台 | CLI | PR/MR 命令域 | Release 命令域 |
|---|---|---|---|
| GitHub | `gh` | `gh pr` | `gh release` |
| GitLab | `glab` | `glab mr` | `glab release` |
| Gitea / Forgejo | `tea` | `tea pulls` | `tea releases` |
先运行 CLI 的版本、认证状态和只读查看命令。记录匹配 remote host 的活动账号;存在多
个账号或 profile 时,必须唯一确定本次使用的身份。CLI 版本之间的 flags 可能不同,
每次执行写操作前读取对应子命令的 `--help`,不要凭记忆拼接参数。
直接从目标 worktree 的当前 shell 运行 `git` 与平台 CLI,让它们使用各自正常的登录机制。
Gitea/Forgejo 使用 `tea whoami``tea` 对应子命令;不要由 Agent 读取 tea 配置文件、
调用 credential helper 导出 token,或把 token 转存到命令参数、环境文件和发布说明。
当请求确实涉及 PR/MR、合并或 Forge Release,且 remote host 无法识别、CLI 缺失、认证
失败或 CLI 指向另一个实例时,停止对应平台阶段并报告:
- host、owner/repository、remote 名称。
- base、head 和当前 commit。
- 已完成的本地验证。
- 尚需人工执行的创建 PR/MR、合并或 release 步骤。
不要自动安装 CLI,也不要把 token 放进命令行后改用 `curl`。用户明确提供受支持的其他
集成时,可以使用该集成,但仍遵守同一套授权和验证闸门。
## 创建 PR/MR
使用显式的 repository、base、head、title 和 body,避免交互式默认值改变目标。把动态
值作为独立 argv 或结构化输入传递,不拼接 shell 命令。创建前:
1. 确认当前分支已经推送到计划中的 remote。
2. 查询同一 head/base 是否已有 open PR/MR,有则复用并更新状态,不重复创建。
3. 确认 head commit 与本地已验证 commit 相同。
4. 确认 CLI 不会隐式创建 fork 或推送到另一个 remote。
5. 再次读取活动账号,向用户展示 host、repository、账号和授权的最远阶段。
PR/MR body 包含目标版本、变更摘要、验证命令与结果、发布后续。创建后读取平台返回的
URL、编号、head/base 和状态,不以命令退出码代替远端读回。
## 检查和合并
用结构化输出读取 draft、head commit、base、review、required checks、冲突或
mergeability、允许的合并方式。平台字段缺失时,使用平台提供的只读详情命令补足;不能
证明闸门通过时保持未合并。
GitHub 使用 `gh pr view``gh pr checks``gh pr merge`GitLab 使用
`glab mr view`、pipeline 状态和 `glab mr merge`Gitea 或 Forgejo 使用
`tea pulls` 的查看、检查和合并能力。实际参数以当前 CLI 的 `--help` 为准。
若用户要求检查通过后自动合并,优先使用仓库已经启用的 auto-merge 或 merge queue。
不要用管理员选项绕过 review、CI、conversation resolution 或 protected branch。
合并后重新读取 PR/MR,取得平台确认的 merged commit。随后 fetch 远端 base,并验证该
commit 已进入远端 base。只看到本地 merge commit 或分支关闭不足以证明平台已合并。
## 创建 Forge Release
把 Git tag 和 Forge Release 当成两个独立状态。先创建、推送并验证包含完整更新说明的
annotated tag,再创建 release。Forge Release 正文复用已经冻结并验证的 tag 更新说明,
不要重新生成另一份内容。
- GitHub 创建 release 时使用能够拒绝缺失 tag 的选项,例如当前 CLI 支持的
`--verify-tag`
- GitLab、Gitea 或 Forgejo 创建 release 前,先用只读命令证明 tag 已存在并指向计划的
commit、tag object 包含计划的更新说明;不要使用会顺便创建 tag 的默认行为。
- 预发布版本按项目规则标记 prerelease,不要自动把它标为 latest 或 stable。
- 发布后重新读取 release URL、tag、正文和可见性,确认正文与 tag 更新说明一致。
Forge Release 创建失败但 tag 已成功推送时,保留 tag 并从 release 阶段恢复,不要重新
合并或创建另一个 tag。