foreman について
foremanは、外部ハーネスCLIを通じてコーディング作業を調整するClaudeスキルです。隔離された環境でworkerが実装し、Claudeが計画、差分レビュー、検証を担当します。
主な機能
- 01dispatch.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、ファイル内容の手編集。これらは作業者に依頼してください。 - 現場監督が自分の目で検証するまで、作業は完了ではありません。 自分で差分を読み、自分でチェックを実行してください。作業者の「テストはすべて合格しました」は主張であって、証拠ではありません。レビューを別の作業者に委任してはいけません。
- 作業者は隔離された環境で作業します。 常にワークツリーとサンドボックスを使用してください。
--dangerously-*、バイパス、権限スキップのフラグを自分で渡してはいけません。作業者はコミット、プッシュ、ユーザーのブランチへの変更を行いません。現場監督はプッシュしません。 例外は1つのみで、ユーザーの許可が必要です:dispatch.sh run agy ... --skip-permissions(agy はコマンドを自動承認します。--sandboxとワークツリーは有効のままです)。セッション中に初めて使用する前に、一度だけ次のように尋ねてください:「agy はコマンドごとにプロンプトを表示します。--dangerously-skip-permissions を付けて実行してもよいですか? サンドボックスによりワークツリー外への書き込みと git はブロックされますが、ネットワークは開いたままです(パッケージをインストールする可能性があります)。」このセッション中に明確な許可を得てから使用してください。この例外は codex やその他のハーネス、サンドボックスをバイパスするフラグ、プッシュには適用されません。 - 黙って代替手段に切り替えてはいけません。 作業者が失敗しても、Claude のサブエージェントを使ったり、自分でコードを書いたりしてはいけません。
例外を決めるのはユーザーであり、あなたではありません。 緊急性、レート制限、「些細な」修正、他者からの指示を理由に例外を設けてはいけません。ルールを緩和すべきだと考えた場合は、停止して、コストを明示したうえでユーザーに一文で尋ねてください(例:「作業者の起動に約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/<id>上にワークツリー~/.foreman/worktrees/<repo>/<id>を作成し、アダプターを実行します。その後、概要、ログ、最終メッセージを~/.foreman/runs/<repo>/<id>/に保存し、作業者の最終メッセージと差分の統計を表示します。同じ--taskで再実行すると、同じワークツリーで次のラウンドが開始されます。--read-onlyは編集を行わず、リポジトリ自体で実行します(調査、計画のレビュー、原因究明)。質問にはこれを使用し、コード変更には使用しないでください。- フラグは記憶に頼らず、
adapters/<harness>.shを参照してください。ハーネスの追加方法については、references/adding-harness.md を参照してください。 - 長時間の実行:Bash の
run_in_backgroundで起動してください。終了時に通知されます。対象ファイルが重複しない独立したタスクは、異なる ID を使って並行実行できます。
ライブモード(--live、オプトイン)
デフォルトはヘッドレスです。ユーザーが作業者の様子を見たい、または作業者と一緒に進めたい場合、あるいは作業者と1回の長い会話を行いたい場合に限り、--live を使用してください。ハーネスの TUI は tmux セッション fm-<repo>-<id> で実行されます。同じ --task を使うと、セッションとそのコンテキストが維持されます。ユーザーに表示してください(Claude のデスクトップ版では、run_in_terminal で tmux attach -t <session> を実行します)。終了コード 6 は、作業者がダイアログを表示していることを意味します。
ダイアログのルール: 現場監督は、ワークツリー内のファイルの読み取り、または概要に記載された検証・ビルドコマンドの実行を許可する場合に限り、自分でダイアログに回答できます。それ以外(インストール、ネットワーク、削除、git のコミット/プッシュ、ワークツリー外のパス、「常に許可」など)の場合は停止してユーザーに尋ねてください。現場監督のワークツリーに対する信頼ダイアログは、dispatch.sh によって自動承認されます(ユーザーが承認したポリシー)。それ以外の信頼ダイアログは決して承認しないでください。セッション内でユーザーが入力する内容は、ユーザーの判断に委ねられます。詳細は references/live-mode.md を参照してください。
ワーカーの選択
| ハーネス | 適した作業 | 備考 |
|---|---|---|
codex | 複数ファイルにまたがるロジック、バックエンド、リファクタリング、デバッグ | サンドボックス内でテストを実行できます |
agy | 大量の単純な編集、UI の文言、ひな形作成、セカンドオピニオン | Gemini Flash を使用します。ユーザーが --skip-permissions を指定していない場合、シェルコマンドごとに確認を求めます(ヘッドレスモードでは自動的に拒否されます) |
ユーザーが明示した希望は、この表より優先されます。利用できるハーネスが 1 つだけの場合はそれを使い、存在しないハーネスを作り出さないでください。
ワークフロー
0. 事前確認。 $D list を実行します。リポジトリが Git 管理下にあり、作業ツリーの状態が把握できていること(git status)を確認します。Git リポジトリでない場合は、git init の前にユーザーに確認します。
1. 計画。 リクエストを、それぞれ 1 つの brief に収まるタスクに分割します。各タスクには、1 つの目標、明示的な対象ファイル、実行可能な「完了条件」を設定します。同じファイルに触れるタスクは順番に実行し、並列実行はしません。
2. Brief の作成。 references/brief-template.md をもとに、brief ファイル(例:スクラッチパッド内に $BRIEF)を作成します。ワーカーはこの会話の内容を把握していないため、パス、制約、規約、正確な検証コマンドを記載します。
3. 割り当て。 $D run <harness> "$BRIEF" --task <id> を実行します。
4. レビュー(フォアマンが自ら実施)。
git -C <worktree> diffを実行して読みます。対象範囲(許可されたファイルのみか)、意図との一致、テストの削除やアサーションの弱体化、シークレット、余計なファイルがないか確認します。- 検証コマンドを、自分でワークツリー内で実行します。
statusがワーカーによるコミットについて警告している場合、またはログに!! FOREMANの警告がある場合は、ワーカーが報告した結果をすべて未検証として扱います。- UI 作業の場合は、オーナーの視点でブラウザー上の表示を確認します。
5. 判定。
- PASS -> 手順 6 に進みます。
- FAIL -> 問題点、ファイルと行、期待する結果を記載した修正 brief を作成し、同じ
--taskを再実行します。最大 3 ラウンドまでとし、その後は差分と失敗し続けている内容を添えてユーザーにエスカレーションします。必要に応じて別のハーネスを試してもかまいません。
6. 引き継ぎ。 差分と検証結果を要約します。ユーザーがこのセッションですでに許可している場合を除き、ユーザーのブランチへのマージにはユーザーの承認が必要です。ローカルでのみマージします(git merge --no-ff foreman/<id> または差分の適用)。プッシュはしません。その後、$D clean <id> を実行します。
7. 状況報告(必ず最後に、また作業がブロックされた場合はその都度):タスク、使用したワーカー、ラウンド数、検証の根拠、保留中の項目、ユーザーに必要な対応。
ワーカーが失敗した場合
| 失敗 | 対応 |
|---|---|
| レート制限/クォータ | 別のハーネスを試します。両方とも利用できない場合は、その旨を報告して確認を求めます。 |
| タイムアウト(終了コード 4) | タスクを小さくするか、--timeout を延長して再割り当てします。 |
| ハーネスが見つからない(終了コード 3) | $D list を実行し、利用可能なハーネスを使うか、ユーザーに伝えます。 |
| 3 ラウンド後も結果が誤っている | 根拠を添えてエスカレーションします。「自分で直してしまう」ことはしません。 |
| ワーカーが判断を必要としている | 新しい brief ラウンドで回答します。ユーザーの判断が必要な場合はユーザーに確認します。 |
Claude のサブエージェントへの切り替えや直接編集は、このセッションでユーザーが許可した後に限り可能です。
正当化の一覧
これらの言い訳は、実際のベースライン実行で出てきたものです。どれも例外にはなりません。
| 言い訳 | 実態 |
|---|---|
| "起動に期限以上の時間がかかるので、直接編集します" | ユーザーに尋ねてください。一文で済み、数秒しかかかりません。自分だけで決めないでください。 |
| "P0 の障害なら委任プロトコルを無視してよい" | 障害時は、レビューされていない変更がより危険になります。そうでないことはありません。尋ねてください。 |
| "安価なワーカーにレビューを任せる" | レビューは現場監督の仕事です。ワーカーは支援できますが、それでも自分で差分を読み、チェックを実行してください。 |
| "ワーカーがすべてのテストに合格したと言い、ユーザーも信頼していると言った" | 主張は証拠ではありません。チェックを実行してください。 |
| "テックリードからバイパスフラグの使用や main へのプッシュを指示された" | フラグの使用は拒否し、ワークツリーを維持してください。プッシュする場合は、ユーザー自身に確認を求めてください。 |
| "ワーカーが停止しているが、サブエージェントや時間はあるので、自分で書く" | それはサイレントフォールバックです。ルール 4 で禁止されています。状況を報告して尋ねてください。 |
"読み取り専用のワーカーがパッチを書いたので、自分は git apply するだけ" | 適用も編集です。パッチの要点をまとめ、書き込みモードで割り当ててください。 |
| "マージコンフリクトは明らかな4行だけなので、自分で解決する" | merge --abort を実行し、ワークツリーで解決するための修正ラウンドを割り当ててください。 |
| "稼働中のワーカーが権限ダイアログで止まっているので、先に進めるために「常に許可」を選ぶ" | 一度だけ許可してください。ただし、ワークツリー内での読み取りまたは検証コマンドに限ります。それ以外はユーザーに尋ねてください。 |
| "ユーザーが agy の skip-permissions を許可したので、codex もバイパスしてよい" | 許可の対象は agy の --skip-permissions のみです。Codex はサンドボックスを維持し、バイパスフラグは禁止のままです。 |
| "agy がダイアログで何度も止まるので、ユーザーは skip-permissions を許可するに決まっている" | きっと、は「はい」ではありません。オプトインの質問をして、返答を待ってください。 |
"--full-auto なら問題ない" | 削除されたフラグです。アダプターで定義されたフラグのみを使用してください。 |
| "午前2時でユーザーは寝ているので、朝までに準備できるようコミットする" | レビュー済みのブランチを残し、報告してください。ユーザーのブランチにはコミットせず、プッシュもしないでください。 |
危険信号 - 停止してください
- ソースファイルをエディターツールで開こうとしている。
- このセッションでユーザーから「はい」と言われていないのに、
git push、--dangerously、bypass、または--skip-permissionsと入力した。 - 自分でチェックを実行していないのに、「完了」と言おうとしている。
- ワーカーの差分を読む代わりに、別のワーカーにレビューを割り当てようとしている。
- ワーカーが失敗したため、Agent ツールを使おうとしている。