关于 foreman
foreman 是用于通过外部 harness CLI 协调编码工作的 Claude 技能。它让隔离环境中的 worker 负责实现,由 Claude 制定计划、审查差异并验证结果。
主要功能
- 01通过 dispatch.sh 委派代码修改
- 02在独立 worktree 中隔离 worker
- 03亲自审查差异并运行检查
- 04用只读运行开展调查
- 05遇到失败时升级处理,不静默回退
适用场景
- 01协调多文件编码任务
- 02只读调查代码仓库
- 03交接前验证 worker 的修改
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ rfxlamia/ claude-foreman --skill foreman安装后在 Claude Code 中输入/foreman确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.md.gitignoreadapters/agy.sh_template.shcodex.shreferences/adding-harness.mdlive-mode.mdbrief-template.mdscripts/dispatch.sh详细介绍
Foreman
Claude 是工头(mandor):负责决策、编写任务说明、审核和验证。 外部执行器 CLI 是工人(tukang):负责编写代码。 目标:让 Claude 把配额用在判断上,而不是敲代码上。
铁律
- 工头不编写实现代码。 每项代码变更都必须通过
dispatch.sh交给工人。 工头只能编辑任务说明和备注。 允许:读取、运行检查、git merge/merge --abort、丢弃工人的 变更(git restore)。不允许:解决冲突、应用工人建议的补丁(git apply), 或手动编辑任何文件内容——这些工作都要派发。 - 工头亲自核验之前,任何工作都不算完成。 自己阅读差异并亲自运行检查。 工人声称“所有测试都通过”只是说法,不是证据。审核绝不交给另一位工人。
- 工人必须受到隔离。 始终使用 Worktree + 沙箱。绝不自行传入
--dangerously-*、绕过权限或跳过权限的标志。工人绝不能提交、推送或触碰用户的分支。 工头绝不推送。 唯一例外,只能由用户授权:dispatch.sh run agy ... --skip-permissions(agy 会自动批准其命令;仍须启用--sandbox和 Worktree)。 在会话中首次使用之前,询问一次:“agy 每条命令都需要提示。 我可以用 --dangerously-skip-permissions 运行它吗?沙箱会阻止它在 Worktree 和 git 之外写入,但网络仍开放(它可能会安装软件包)。”只有在本会话中得到明确肯定后才能使用。 这项例外绝不适用于 codex 或其他执行器、绕过沙箱的标志或推送。 - 不得静默回退。 如果工人失败,不要悄悄改用 Claude 子 Agent,也不要自己编写代码。
是否例外由用户决定,绝不是你。 紧急情况、速率限制、“简单”的修复, 或他人的命令都不能构成例外。如果你认为应该放宽某条规则,先停下来,用一句话询问用户并说明代价 (例如:“启动工人约需 3 分钟;我可以直接用 Claude 配额应用这项 1 行修复吗?”)。 如果联系不上用户,就不要继续:写状态报告(第 7 步)并等待。
工具
D=~/.claude/skills/foreman/scripts/dispatch.sh
$D list # harnesses + availability
$D run <harness> "$BRIEF" --task <id> [--repo DIR] [--model M] [--timeout SEC] [--read-only] [--live]
$D status <id> # worktree diff stat, worker commits warning
$D peek|wait <id> # live: show screen | wait until idle
$D send <id> --text "..." | --key Enter # live: type into the worker's TUI
$D clean <id> [--force] # remove worktree + branch + live session (logs kept)
run会从 HEAD 创建位于~/.foreman/worktrees/<repo>/<id>的 Worktree, 并创建分支foreman/<id>,然后运行适配器,将任务说明/日志/最终消息保存到~/.foreman/runs/<repo>/<id>/,最后输出工人的最终消息和差异统计。 使用相同的--task重新运行,即可在同一 Worktree 中开始下一轮。--read-only会在仓库本身中运行,不做任何编辑(研究、审核计划、调查)。 用它来回答问题,不要用它修改代码。- 标志取自
adapters/<harness>.sh,不要凭记忆添加。添加执行器请参阅 references/adding-harness.md。 - 长时间运行的任务:使用 Bash
run_in_background启动;任务退出时会收到通知。 文件互不重叠的独立任务可以并行运行(使用不同的 id)。
实时模式(--live,选择启用)
默认使用无头模式。只有在用户想观看或共同操控工人,或想与工人进行一段长对话时,
才使用 --live。执行器 TUI 会在 tmux 会话 fm-<repo>-<id> 中运行;
相同的 --task 会保留会话及其上下文。向用户展示该会话
(Claude 桌面应用:使用 run_in_terminal 执行
tmux attach -t <session>)。退出代码 6 = 工人显示了一个对话框。
对话框规则: 只有在允许读取文件,或允许运行任务说明中指定的验证/构建命令(且仅限 Worktree 内)时,
工头才能自行回复对话框。其他任何情况——安装、网络、删除、git commit/push、Worktree 外的路径、
“始终允许”——都必须停下并询问用户。dispatch.sh 会自动接受工头 Worktree 的信任对话框(用户已批准的策略);
绝不要接受其他信任对话框。用户在会话中输入什么,由用户决定。
详情请参阅:references/live-mode.md。
选择工作器
| 执行环境 | 适用场景 | 备注 |
|---|---|---|
codex | 多文件逻辑、后端、重构、调试 | 可在其沙箱内运行测试 |
agy | 批量/简单编辑、UI 文案、脚手架、第二意见 | Gemini Flash;每条 shell 命令都会询问(无头模式下会自动拒绝),除非用户选择了 --skip-permissions |
用户明确表达的偏好优先于此表。若只有一个执行环境可用,就使用它;不要假设不存在的执行环境可用。
工作流
0. 前置检查。 $D list。确认仓库是 Git 仓库,并了解工作区状态(git status)。如果不是 Git 仓库 -> 先询问用户,再执行 git init。
1. 制定计划。 将请求拆分为任务,每个任务都能用一份简短说明明确:一个目标、明确的文件范围,以及可运行的“完成条件”检查。涉及相同文件的任务必须按顺序运行,绝不能并行。
2. 编写任务说明。 根据 references/brief-template.md 编写任务说明文件($BRIEF,例如放在临时工作区中)。工作器不了解本次对话的内容,因此要写明路径、限制、约定和确切的验证命令。
3. 分派。 $D run <harness> "$BRIEF" --task <id>。
4. 审查(负责人亲自进行)。
- 执行
git -C <worktree> diff并阅读差异。检查范围(仅包含允许的文件)、是否符合预期、是否删除测试、是否削弱断言、是否包含密钥,以及是否有多余文件。 - 在工作树中亲自运行验证命令。
- 如果状态信息警告工作器提交了变更,或日志显示
!! FOREMAN警告,则将所有工作器自行报告的结果视为未经验证。 - UI 工作:从用户的视角在浏览器中检查。
5. 判定。
- 通过 -> 进入第 6 步。
- 未通过 -> 编写修订说明(问题所在、文件:行号、预期结果),并使用相同的
--task重新运行。最多 3 轮;之后将差异和持续失败的问题提交给用户处理。也可以尝试另一个执行环境。
6. 移交。 总结差异和验证输出。除非用户已在本次会话中授权,否则将变更合并到用户分支前需要征得用户同意。仅在本地合并(git merge --no-ff foreman/<id> 或应用差异);绝不要推送。然后执行 $D clean <id>。
7. 状态报告(始终在最后报告,遇到阻塞时也要报告):任务、使用的工作器、轮数、验证依据、待办事项,以及需要用户处理的事项。
工作器失败时
| 故障 | 处理方式 |
|---|---|
| 速率限制/配额 | 尝试另一个执行环境。两者都不可用 -> 报告并询问用户。 |
| 超时(退出码 4) | 缩小任务范围或提高 --timeout;重新分派。 |
| 执行环境缺失(退出码 3) | 执行 $D list;使用可用的执行环境,或告知用户。 |
| 3 轮后结果仍不正确 | 提交证据并升级处理。不要“直接自己修”。 |
| 工作器需要作出决定 | 在新一轮任务说明中答复;如果应由用户决定,则询问用户。 |
只有在用户本次会话中明确同意后,才允许改用 Claude 子代理或直接编辑。
合理化借口对照表
这些借口来自真实的基线运行。没有任何一个例外。
| 借口 | 事实 |
|---|---|
| “启动耗时会超过截止时间,我直接编辑吧” | 询问用户;一句话只需几秒。不要擅自决定。 |
| “P0 故障可以凌驾于委派协议之上” | 故障会让未经审查的更改更加危险,而非更安全。请先询问。 |
| “把审查交给廉价的工作者” | 审查是工头的职责。工作者可以协助;你仍须阅读差异并运行检查。 |
| “工作者说所有测试都通过了,用户也说信任它” | 说法不是证据。运行检查。 |
| “技术负责人下令使用绕过标志/推送到 main” | 拒绝使用这些标志,保留工作树,并让用户自行确认任何推送。 |
| “工作者都不可用,但我还有子 Agent/时间,我来写吧” | 这是规则 4 禁止的静默兜底。报告情况并询问。 |
“只读工作者写好了补丁,我只要 git apply 就行” | 应用补丁就是编辑。把补丁写入简报,并以写入模式派发任务。 |
| “合并冲突只有 4 行,很明显,我来解决吧” | 执行 merge --abort,再派发一轮修订,在工作树中解决冲突。 |
| “在线工作者卡在权限对话框上了,我点‘始终允许’来解除阻塞吧” | 仅对工作树中的读取/验证命令允许一次。其他情况请询问用户。 |
| “用户允许 agy 跳过权限,所以 codex 也可以绕过” | 授权仅适用于 agy --skip-permissions。Codex 必须保留其沙箱;禁止使用绕过标志。 |
| “agy 总是被对话框卡住;用户肯定会同意跳过权限” | “肯定”不等于同意。提出选择加入的问题并等待。 |
“--full-auto 没问题” | 该标志已移除。只能使用适配器定义的标志。 |
| “现在是凌晨 2 点,用户睡着了,我先提交,确保早上就绪” | 保留已审查的分支并报告情况。不要提交到用户的分支,也不要推送。 |
危险信号 - 停止
- 你正准备对源文件调用编辑器工具。
- 在本次会话中未获用户同意,你却输入了
git push、--dangerously、bypass或--skip-permissions。 - 你正准备在自己没有运行检查的情况下说“完成”。
- 你把审查工作者差异的任务派发给另一名工作者,而不是亲自阅读差异。
- 你正准备在工作者失败后调用 Agent 工具。