分享一个AI管理本地issue的工作流
国庆这几天参与到一个朋友写的minecraft mod项目里面,用来让AI玩minecraft。原本我也基于mineflayer写过一个maicraft-mcp-server,但是受限于mineflayer只能游玩原版minecraft。这个项目以mod的形式可以兼容其他的mod,且可以直接以第一人称视角而不必进入旁观者模式来直播,可以作为另一个我作为主力开发者的AI Vtuber项目Amaidesu 的minecraft agent实现。
花了一两天搞明白项目整体架构之后,我就开始让AI对此进行实机测试了,因为它本身是一个mcp server,让AI来测试是很自然的。
随后我便发现,既然AI自己就是用户,那么AI自己测出问题提issue,自己修,再自己回去游戏里面验证,这个循环好像不用我管,可以省很多事情。而且重要的事情让它挑出来给我决策,也不会出什么大事。
于是参考github的issue设计了一套本地issue的方式,在这个项目里面使用,本文分享一下这个方法。
AGENTS.md
1 | .omo/issue/ |
具体的内容比较长,我用人话总结一下核心内容,可以自行让AI扩展出属于读者自己的:
- 在本地不被版本管理的目录(我这里就复用oh-my-opencode的.omo目录了)里面建一个issue子目录,
- 其根目录里面放待修复的问题(3位数编号,每个问题一个md文件)
- 修完的问题放在待验证目录(pending-verify);
- 验证没问题的放在关闭目录(closed);
- 需要人来决策开发方向的放在待决策区(pending-decision);
- 给我朋友去处理的放在外发区(outbound。当然,为了避免AI issue污染仓库,我基本上都是直接私信他的);
- 在提issue之前,需要在公共文件取号占号,避免思考过程中编号被人抢了导致重复;
- 在修复issue的时候,需要在
.omo/worktree.md选一个没有被占用的常驻worktree,如果都满了,就再在项目父级目录再扩充一个,完成后不删除。
本地issue结构
其实没有固定的结构,只要把复现方式写清楚,就可以让负责验证的AI来复现并且验证修复情况。
如下列出的例子是多个AI多次修改后的结果,实机测试的AI只负责以用户视角提出issue,修复问题的AI编写原因和修复方式,接着再交还实机测试。
1 | # 063:craft 能力不把背包内的合成台计为可用工作面,导致配方规划爆炸 |
工作流
原本我是自己手动执行上面的流程的,也就是开多个会话让AI去修复各个issue,以及进行实机测试,之后猛然意识到,都有固定流程了那肯定得让AI来干活啊。
于是我就让agent自己派子agent去干活了,甚至结合idea的mcp和Computer Use能力,还能让它自己重启游戏客户端并点进存档派子代理测试。
最后隔一段时间就让其rebase回dev,然后用cherry-pick和filter-branch –msg-filter进行提交信息改写,把那些不像人话的提交信息改一改,提交之后compact上下文,开始下一轮。
# 管家调度规则(issue 派单与实机验收)
会话管家的工作手册。管家不亲自占坑开发:修复由派出的 agent 会话在常驻工作树完成,
实机环境(游戏客户端、IDEA 界面)由管家直接操作。目标是 open 与 pending-verify
两区的 issue 全部按本规则流转到 closed。
## 区位与流转
| 区 | 含义 | 管家动作 |
|---|---|---|
| `issue/`(根) | open,可开工 | 派单修复;拿不准修法的移 pending-decision |
| `issue/pending-decision/` | 待用户拍板 | 只进不出:存量不代答不改动;新增项移入时写明待决策问题与可选项 |
| `issue/pending-verify/` | 代码已收口,只差实机 | 安排实机验证批次,按文内剧本取证 |
| `issue/closed/` | 实机验证通过 | 终点;移入时补实机验证结论(场景、任务 ID、净变化) |
| `issue/outbound/` | 已外发 GitHub 公开池 | 本地不自行开工;上游修复合并进 dev 后按正常流转实机收口 |
流转路径:
- open → 修复提交(回归通过)→ pending-verify(状态改"已修复待实机",写提交 hash 与代码级验证方式)
- pending-verify → 实机验证通过 → closed(补实机验证结论)
- pending-verify → 实机验证失败或部分成功 → 退回 open(附失败证据),继续修
- open → 修法涉及产品语义/授权边界/多方案取舍 → pending-decision
- 移区不改号;REGISTRY.md 位置列与文件实际位置保持一致;issue 认领行与 `worktree.md` 占坑表一致
## 派单流程
1. 盘点:open 区无认领项 × 占坑表空闲 worktree;汇报时活跃任务置顶。
2. 交集预检:新任务目标文件集与主工作区、其他占用 worktree 的未提交变更求交集,非零重叠换 issue 或协调串行;对已提交待并入分支的同文件改动,登记并入顺序预期。在途分支的交集判定用树差异 `git diff --name-only <dev头> <分支名>`(内容级真实差异),不用提交范围 `git log A..B`——任务分支基于历史重写前的旧 dev 时,重写前原始件(内容已并入但 hash 不同)会被错算成未并入提交产生假重叠。
3. 占坑:管家代写 `worktree.md` 占用节与 issue 认领行(先占坑后开工);分支 `task/<slug>` 基于 dev。
4. 派发:agent 会话提示词自足(规约指向 AGENTS.md,列明 issue 路径、修复范围与验证纪律——**代理在任务分支自行 git commit**(2026-10-06 晚起提交交回子代理),提交信息按 AGENTS.md「提交信息起草自查」全项执行、含机械禁用词 grep,回报分支名、提交 hash、改动文件清单与套件结论;同时要求同步更新受影响的文档/知识卡/能力契约与注释,文档过时与缺失同罪;**派单提示词必须写明提交规范与机械扫描要求**);验证/实机会话立新 issue 时执行 AGENTS.md「issue 文风同人话纪律」与「issue 场景必须自足」——禁用「腿」「露天柱」等直译黑话,场景按四要素写全,**派单与回报文案同样执行机械禁用词扫描**;agent 只改自己认领的 issue 文件与生产代码,`worktree.md` 与 `REGISTRY.md` 由管家统一收口改写。
5. 收口与并入:回报到达后管家复核任务分支 diff 与提交信息(黑话/编号/模板痕迹不合即退回改写),线性重放(cherry-pick)到最新 dev 完成增量并入——不等其它分支;若子代理已跑过的套件与并入后同树则结论沿用,跨支并入后由下一轮全量 check 兜底。占坑表、账本位置列、issue 移区由管家统一改写;工作树切回占位分支、任务分支待推送后清理。
## 实机验证流程
- 环境:两个游戏客户端,IDEA 运行配置 NeoForge Client (1)/(2),MCP 端口 8766/8767,各占一块副屏;一个客户端同一时刻只服务一个验证会话。
- 待验物必须是客户端里真实包含的代码:修复未并入 dev 的先由用户并入(管家不自行合并/推送),或明确按任务分支构建验证。
- 证据标准:任务终态 data 加背包/世界净变化对账,两者齐才下结论;回执状态不作实物裁决。
- 等待游戏内任务一律 `perceive attention`(wait_ms),禁止 sleep 无人看管。
- 含中文的 MCP 参数走 `tools/maicraft_cli.py` 的 `@file` UTF-8 载荷;游戏重启后先 `init` 重握手;界面弹窗、崩溃报告、重启客户端由管家操作。
## 流水账
`.omo/butler-log.md`:顶部「当前活跃」表跟踪进行中的派单与验证(收口后移入日志);
每次派单、验收、移区、实机操作记一行(时刻 | 动作 | 对象 | 结果/下一手)。并发写纪律:写前重读、写后复读——多个会话与管家并发追加时,整文件读改写会用旧内容覆盖他人新行(2026-10-05 实发),丢失的行以最新事实补写。
分享一个AI管理本地issue的工作流