auto-merge 是一个用于自动合并开放 PR 的技能。其定位是在 CI 完全通过并且符合一套明确安全策略的前提下,自动合并 PR。资料说明该策略之所以存在,是因为该技能以写权限自主运行,门控逻辑中的 bug 会直接影响主分支。
用途与目标范围
技能接受一个仓库参数(owner/repo)。如果为空,则使用 memory/watched-repos.md 中记录的所有仓库。它会读取 memory/MEMORY.md 与 memory/watched-repos.md 来决定目标仓库,并读取最近 2 天的 memory/logs/,避免对已合并的 PR 重复记录。
主要能力
自动合并满足安全策略的开放 PR。安全策略包含以下条件:作者白名单(author.login 为 dependabot[bot]、renovate[bot]、github-actions[bot] 之一,或出现在 memory/watched-repos.md 的 ## Trusted Authors 小节中;无白名单时仅上述三个 bot 登录名有资格);规模上限(additions + deletions ≤ 500,可通过在 PR 上打 auto-merge-large 标签覆盖);基分支为 main 或 master;非 fork(isCrossRepository == false);非草稿(isDraft == false);未已被排队(autoMergeRequest == null 且 mergeQueueEntry == null);无退出标签(do-not-merge、wip、hold、needs-review、blocked 均不存在);mergeable 状态为 CLEAN(比 MERGEABLE 更严格,还要求满足分支保护门控);评审状态 reviewDecision != CHANGES_REQUESTED;状态检查 statusCheckRollup 中每一项的 conclusion 均为 SUCCESS、NEUTRAL 或 SKIPPED,出现 FAILURE、TIMED_OUT、CANCELLED、PENDING 或 null 均不合格;重试上限(该 PR 被尝试次数少于 3 次,达到 3 次 MERGE_FAIL 的 PR 会被暂停)。
使用方式与运行流程
状态引导:创建 memory/topics 目录,并确保 memory/topics/auto-merge-state.json 存在。状态文件记录 last_run 以及按 owner/repo#number 为键的 PR 条目,包含 first_seen、last_attempt、attempts、last_outcome、last_error 等字段。状态最多保留最近 50 条记录(按 last_attempt 做 LRU),写入后用 jq empty 校验,失败则从 .bak 恢复。
列出每个受监控仓库的开放 PR,使用 gh pr list 并请求完整字段集。处理 UNKNOWN 状态:GitHub 的 mergeStateStatus 是惰性计算的,若返回 UNKNOWN 则 sleep 3 秒后重查一次,仍为 UNKNOWN 则以 UNKNOWN-persistent 理由跳过,留给下一次运行重试。
跳过已进入合并队列的 PR:由于 gh pr list 不暴露队列信息,需通过 GraphQL 对每个 PR 查询 mergeQueueEntry.state。非空状态(如 QUEUED、AWAITING_CHECKS、MERGEABLE)以 SKIP:already-queued:<state> 跳过;查询失败则以 SKIP:merge-queue-unknown 跳过。这两种情况都不计为一次尝试,也不改动其状态条目。
对每个 PR 应用安全策略并记录结论,要么是 MERGE,要么是 SKIP:<具体原因>。原因必须指明失败的门控,例如 SKIP:author-not-allowlisted:contributor123、SKIP:size-cap:823-lines、SKIP:mergeStateStatus=BEHIND、SKIP:label:do-not-merge、SKIP:check-failed:lint、SKIP:retry-cap:3-attempts。不接受笼统的原因如 SKIP:not-ready。
执行合并,最多 MAX_AUTO_MERGE(默认 3)。若 AUTO_MERGE_DRY_RUN=1,则记录 DRY_RUN:would-merge #N 并继续,不调用合并。否则运行 gh pr merge NUMBER -R owner/repo --squash --delete-branch。退出码为 0 并不代表已合并:在启用了合并队列的仓库上,gh pr merge 可能只在把 PR 加入队列后返回 0。因此需要用 gh pr view 确认 state 与 mergeCommit;只有状态为 MERGED 且带 commit SHA 才算合并,并报告该 SHA。OPEN 表示已排队,记录为 QUEUED,last_outcome: queued,并按排队而非已合并来报告。其他结果或查询失败记录为 MERGE_UNCONFIRMED。排队与未确认都计入 MAX_AUTO_MERGE。无论结果如何,每次尝试都要递增 attempts;对不再出现在开放列表中的 PR 重置为 0(删除条目)。合并失败(非零退出)时捕获 stderr 并记录 MERGE_FAIL,写入 last_outcome 与 last_error(≤200 字符)。失败的合并不计入每次运行的上限,继续处理下一个合格 PR。
通知:仅当至少一次真实(非 dry-run)合并成功,或至少一个 PR 达到重试上限时才发送通知。有合并成功时发送合并摘要,包含已合并数量、每个 PR 的标题、规模、作者与 mergeCommit SHA。达到重试上限时发送重试上限通知。若同一组达到上限的 PR 键在最近 24 小时内已通知过,则去重抑制。
持久化状态:写入更新后的 memory/topics/auto-merge-state.json,更新 last_run 为当前时间戳,用 jq empty 校验,失败则从本次运行前写入的 .bak 恢复。并写入日志到 memory/logs/${today}.md 的 ### auto-merge 标题下,记录模式(live 或 dry-run)、仓库列表、Merged、Queued、Skipped、Retry-capped 与 Totals 统计;若合格数为零,给出结论细分。
环境与网络
gh 通过工作流的 GITHUB_TOKEN 进行认证,无需 curl。若 gh pr merge 因 Resource not accessible by integration 失败,说明工作流令牌在該仓库缺少合并权限;此时记录一次并至多每 7 天通知一次,避免告警刷屏。
约束与限制
绝不合并作者不在白名单中的 PR,即使其他所有门控都为绿色。没有明确的 auto-merge-large 标签(由人而非 bot 设置)绝不绕过规模上限。同一次运行内绝不自动重试 MERGE_FAIL,首次合并失败则记录并继续。跨运行累计 3 次失败后停止重试该 PR,通过重试上限通知提示一次,交由运维人员排查。除合并外不修改 PR 状态(不评论、不编辑标签、不更新分支)。
作为智能体交付环路使用
若要闭环处理智能体自身开启的 PR(来自 feature、external-feature、self-improve 等),可在 memory/watched-repos.md 的 ## Trusted Authors 小节中加入该智能体的 GitHub 身份。一旦加入白名单,智能体 PR 就会像 bot PR 一样经过同一套安全策略,并在 CI 绿色时被自动合并。重试上限可防止卡住的 PR 引发失控行为。
关于平台、收费与价格等信息,资料中暂未提供。