关于 forge-batch
forge-batch 是用于将符合条件的 GitHub Issue 编排为有序并行批次的技能。它估算文件修改范围并考虑依赖与冲突,可等待确认或以无人值守模式输出。
主要功能
- 01按范围收集 Issue
- 02排除受阻或不符合条件的 Issue
- 03估算实现涉及的文件
- 04依据冲突和依赖分组
- 05支持确认和无人值守模式
适用场景
- 01规划里程碑的并行工作
- 02排列存在依赖的 Issue
- 03为 forge-ship 会话准备批次
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mgratzer/ forge --skill forge-batch安装后在 Claude Code 中输入/forge-batch确认已加载。
详细介绍
将 Issue 分批安排到各个波次
确定哪些 Issue 可以并行推进,以及推进顺序。
输入
范围($ARGUMENTS):milestone:<name>、label:<name>、epic:<number> 或 Issue 编号。可选:-- <additional context>,例如波次规模上限或需要固定在一起的 Issue。--unattended 会跳过审批步骤。
流程
步骤 1:收集候选项
使用 issue-operations 中的 List Issues by Scope 列出范围内的 Issue,仅保留编号、标题、标签、执行模式和依赖引用;正文稍后逐个读取。然后获取一次未关闭的 PR,并在本地匹配 #<number> 或 <type>/<number>-:
gh pr list --state open --limit 100 --json number,title,headRefName,body
逐个说明原因并排除:HITL Issue、带有 blocked 标签的 Issue、有未关闭 PR 的 Issue,以及依赖于范围外未关闭 Issue 的 Issue。其余 Issue 都是 AFK,可以开始处理。
步骤 2:估算触及范围(委派)
为每个候选 Issue 生成其触及范围——实现最可能会更改的文件和目录。范围内 Issue 超过 5 个时,将任务并行委派给 forge-scout 子 Agent,并使用成本较低、速度较快的模型;每个 scout 处理约 5 个 Issue,以便共享的 grep 只运行一次;否则就在当前流程中估算。与 implement 的盲目调研不同,scout 在这里会收到 Issue;触及范围是针对这些 Issue 进行估算的。
对于每个 Issue:列出其中明确提及的所有路径,然后 grep 其中提到的概念(路由、表、组件、消息键),并添加定义这些概念的文件。仅返回路径。
**提供给子 Agent 的输入:**角色:forge-scout、Issue 正文、代码库访问权限。
**预期输出:**每个 Issue 一行,格式为 #<number>: <paths...>。
步骤 3:构建波次
当两个 Issue 的触及范围共享文件,或都匹配 unattended-config 中的同一个序列化资源 glob 时,它们就会冲突。当 Issue A 的正文说明了这一点(depends on #B、blocked by #B、after #B)时,表示 A 依赖于 B。
按优先级标签排序,然后按编号排序,并以贪心方式安排 Issue:将每个 Issue 放入最早的波次,且该波次中没有与其冲突的 Issue,并且其所有依赖都位于更早的波次。除非末尾的上下文另有说明,否则每个波次最多放入 10 个 Issue。共享目录但不共享文件的 Issue 可以安排在一起,并标记为 相邻,以便人工否决。
步骤 4:确认
通过 AskUserQuestion 展示批次:批准、移动某个 Issue,或排除某个 Issue。**在无人值守模式下:**跳过并直接打印。
步骤 5:打印批次
使用以下输出格式。启动行在 $FORGE_LAUNCHER 变量已设置时使用其名称,否则仅打印用户手动启动的 Issue 编号。
输出格式
## Batch: <scope>
### Wave 1 — <n> Issues
| # | Title | Touch set | Notes |
|---|-------|-----------|-------|
| 123 | feat(api): ... | src/api/x.ts, src/api/x.test.ts | |
| 124 | fix(ui): ... | src/ui/y.tsx | adjacent to #125 |
launch: <launcher> 123 124 ...
### Wave 2 — <n> Issues (after Wave 1 merges)
...
### Excluded
- #130 — HITL
- #131 — open PR #400 already
指南
- 触及范围只是估算——请明确说明;波次是由人工批准的一种判断,而非证明
- 序列化资源优先于一切——同一波次中的两个迁移必然会产生合并冲突
- 后续波次仅为暂定安排——某个波次合并后重新运行;随着代码落地,触及范围会发生变化
相关技能
之前:forge-create-issue 会将 Issue 分类为 AFK 或 HITL——只有 AFK Issue 才能进入波次。
**之后:**使用 forge-ship --guard 启动波次中的每个 Issue,通过 $FORGE_LAUNCHER 启动或手动启动。
示例用法
/forge-batch milestone:v1.1.0
/forge-batch label:ready
/forge-batch epic:601
/forge-batch 610 611 612 613 -- cap waves at 4
/forge-batch --unattended label:ready