GitHub IssueのIDまたは計画ドキュメントのパスを引数に取り、計画を実装タスクに分解して .agents/workflow/tasks.md と state.json を生成する。マルチエージェント実装ワークフローの計画フェーズ。
Install
npx skillscat add musasaby/multi-ai-agents-workflow/agent-task-plan Install via the SkillsCat registry.
計画参照とタスク分解
引数で与えられた計画ソースを読み、子エージェントに依頼可能な粒度のタスクに分解する。
引数
- 数値(例:
42)または#42形式 → GitHub Issue とみなしgh issue view <ID> --commentsで取得 - それ以外 → 計画ドキュメントのパスとみなし Read で読む
引数がない場合はユーザーに計画ソースを質問する。
手順
0. 開始時判定(新規 or 追加)
この skill に入ったら、新規・追加のどちらのモードに関わらず、まずagent-branch-guard skill の手順でブランチを確かめる(branch-check を実行し、main 上やマージ済みブランチなら利用者の承認を得て develop/<作業名>-plan 等の
専用ブランチを切ってから進む)。
既存の .agents/workflow/state.json の有無と状態で分岐する:
- state.json が無い → 通常モード(§1〜§5)で新規作成する
- state.json があり、全タスクが
done→ まず、確認なしでscripts/workflow-archive(PowerShell:.agents/workflow/scripts/workflow-archive.ps1
/ POSIX:workflow-archive.sh)にスラッグを渡して実行する。スクリプトが作業ブランチの
PR の状態を確かめ、マージ済みのときだけアーカイブする.agents/workflow/scripts/workflow-archive.ps1 <スラッグ>
スラッグは計画ソースやIssue番号から簡潔に生成する(例:.agents/workflow/scripts/workflow-archive.sh <スラッグ>issue-42)。
exit code ごとの次の行動:- exit 0 → アーカイブされた。通常モードで新規作成する
- exit 2(
Next: escalate reason=pr-open。PR が未マージ)→ 何も移動されていない。
全タスクがdoneでも、PR がマージされるまでサイクルは終わっていない。- 計画ソースがその PR のレビューで見つかった残課題なら、追加モードで今のサイクルに追記する。
state.json のgroupが空でなければ、追記するタスクに- **グループ**: <group>を付けて
今の PR のグループに入れる - 別件なら、PR のマージを待つか、
--force(PowerShell:-Force)でアーカイブして
新規作成するかを利用者に確認する
- 計画ソースがその PR のレビューで見つかった残課題なら、追加モードで今のサイクルに追記する。
- exit 3(
pr-closed)・exit 5(pr-not-created)・exit 4(gh-unavailable)→
利用者に状況を伝え、追加モードにするか、--forceでアーカイブして新規作成するかを確認する
- state.json があり、未完了タスクが残っている → 「進行中のワークフローがあるが
破棄してよいか」をユーザーに確認する。破棄する場合も削除ではなくworkflow-archiveでアーカイブする(履歴が残るため安全に「破棄」できる)。
利用者が破棄を承認しているので、--forceを付けて PR の状態の判定を飛ばす.agents/workflow/scripts/workflow-archive.ps1 <スラッグ> -Force
破棄しない場合は §「追加モード」に進む(ユーザーが途中追加を意図している場合)か、.agents/workflow/scripts/workflow-archive.sh <スラッグ> --force
作業を中断する。
1. 計画の読解
計画ソースを読み、目的・スコープ・制約を把握する。関連する既存コードを Grep/Glob で
調査し、変更対象の見当をつける。
続けて、計画ソースから要件の抽出と解釈の確認を行う:
- 要望を番号付き(R1, R2, ...)で抜き出す。1要件 = 利用者が確かめられる1つの要望
- あいまいな点・解釈が複数ありうる点・置いた前提・対象外(意図的に外すもの)を列挙する
- あいまいな点は、タスク分解(§2)の前に利用者に質問する。質問には、選択肢ごとの違いが
分かる前提の説明を添える。あいまいな点が無ければ質問は省略する - 結果を tasks.md の
## 要件(- R1: ...)・## 前提・解釈・## 対象外の節に書く
(書式は README の tasks.md 節。§3 で tasks.md を生成するときに書く)
2. タスク分解
以下の基準でタスクに分解する:
- 1タスク = 子エージェントへの1回の依頼で完結する粒度(目安: 変更ファイル数個、1コミット相当)
- 子に設計判断を委ねない: 実装方法が複数ありうる箇所(プロセス境界の値の受け渡し、引用符の入れ子、
ハッシュの計算方法、正規表現 等)は計画時に決めておく。必要なら、コードの骨格(関数シグネチャ・
データ構造・アルゴリズムの流れ)を目的欄に書く。子が判断に迷って推論を続け、出力トークン上限に
達して止まることがあるため - 1タスクの受け入れ基準は5件まで、変更するファイルは3件までにする(参照ファイル欄で
変更対象のファイルに(変更対象という理由注記を付ける)。dispatch-prompt-genがこれを
超えるとWARN:を出す(超過は警告のみで生成は続くが、タスクを分割できないか検討する) - 1タスクで追加するテストケースは数件までにする。
tests/test-*.shとtests/test-*.ps1の
ような sh/ps1 の対については、変更が小さければ同じタスクに入れてよい。大きい場合は別タスクに
分け、tests/case-parity-allow.txt等にケース名を書いて一時的な sh/ps1 の差を許可する
(sh/ps1 の対の仕組みが無い利用先では、前者だけでよい) - スクリプトの変更とドキュメントの変更は別タスクにする。ドキュメントの変更も大きい場合は、
ファイルごと(さらに大きいファイルは節ごと)にタスクを分ける - 各タスクに検証可能な受け入れ基準を必ず書く(「〜が動く」ではなく「〜を実行すると〜になる」)
- タスク間の依存関係を明示し、依存順に並べる
- テスト方法が自明でないタスクには、受け入れ基準にテストコマンド・確認手順を含める
- 各タスクに参照ファイル欄を書く: 子が最初に読むべきファイルを数件(5件以内)まで、
ルート相対のパスをバッククォートで囲んだ箇条書きで挙げる。範囲を絞れる場合は`path:10-40`のように行範囲を付け、括弧で読む理由(真似る既存実装・使う関数 等)を添える。
読ませるものが無ければ- **参照ファイル**: なしと書く。dispatch-prompt-genが、存在しない
パスをエラー(exit 1)、欄が無い・6件以上を警告にする。子は参照ファイル以外を必要になってから
読むよう指示されるため、README 全体のような大きいファイルは挙げず、該当の節に範囲を絞る - 外部コマンドの挙動は事実で書く: 受け入れ基準や目的に外部コマンド(gh・git 等)の出力・
exit code を書くときは、「〜相当」「〜のはず」のような推測を誘う表現を使わず、計画時に実際に
実行して確かめた結果を書く(例: 「gh pr list --head <branch> --state merged --json urlは
PR が無いとき[]を出力して exit 0」)。子は書かれていない挙動を確かめようとして
プロジェクト外で試し、権限拒否で止まることがある - タスク数が多い場合は、意味的なまとまり(機能グループ)ごとにタスクを並べ、グループ境界を
厳密フォーマットの区切り行で示す:<!-- グループ <名前>: <説明> -->(: <説明>は省略可。<名前>は空白と:を
含まない文字列。大文字小文字を区別する)。区切りが無い領域のタスクは既定グループ
(空の名前)に属する。依存関係の記述だけで十分に整理できている場合は無理にグループ化
しなくてよい。このグループ境界はagent-workflowskill の「グループ単位の PR と
ブランチ切替」で PR 作成・ブランチ切替の機械的な単位として使われる - グループ間依存の制約: タスクが依存できるのは同じグループまたは前のグループの
タスクのみ(後のグループのタスクへの依存は、そのタスクが永久に実行できないため、state-sync/next-taskがエラー(exit 1)にする)
依存欄の指針:
- 機械パース可能な厳密フォーマットを厳守する:
- **依存**: なし | T1, T2
(依存が無い場合はなし、ある場合はカンマ区切りのタスクID列。この行をstate-sync/next-task/dispatch-prompt-genが機械的にパースするため、フォーマットを崩さない) - 依存欄に注記を書かない:
T30(Prometheus 基盤。完了済み)のような括弧書き・状態の説明は
書かない。前提タスクについての補足(何を使うか等)は目的欄に書く。タスクの完了状態は
state.json で機械的に判定されるため、依存欄にも目的欄にも書かない - 依存行はすべてのタスクに必須(依存が無い場合も
- **依存**: なしと書く) - 形式違反・tasks.md に存在しないタスクID・自分自身への依存・循環依存は、
state-syncが
state.json を作る前にエラー(exit 1)にする。エラーになったら stderr の内容に従って
tasks.md を直し、再実行する - 依存は真の前提となるタスクのみ記載する。単に記述の並び順を揃えたいだけの理由で
依存を張らない - 依存欄 = 引き継ぎが発生する欄であることを踏まえる: 依存に挙げたタスクの完了報告
(runs/<依存ID>-<試行番号>/report.md)が dispatch 時に自動結合される。不要な依存を
書くと不要な引き継ぎ文がプロンプトに混入し、依存漏れがあると引き継ぎガードで
dispatch が止まる(依存タスクがdoneかつ報告が存在することが条件)。グループ区切りを
使う場合は、依存先は同じグループまたは前のグループのタスクに限る(「グループ間依存の
制約」を参照)
要件欄の指針(## 要件 節を書いた場合):
- 各タスクに
- **要件**: R1, R3(カンマ区切りの要件ID)または- **要件**: なしを書く。なしは、要件に直接対応しないタスク(例: 他タスクの前提となる基盤整備、後始末)に使う - どのタスクにも対応しない要件があると、
state-syncがエラー(exit 1)にする。タスクを足すか、
意図的に外す要件なら## 要件節から消して## 対象外に移す - 要件欄の欠落、
## 要件節に無いIDもエラーになる(詳細は README の「要件の節と要件欄」)
3. ファイル生成
.agents/workflow/README.md に記載のフォーマットに従って生成する(.agents/workflow/README.md が存在しない場合は .agents/skills/_templates/workflow/README.md(配布元リポジトリではルートの _templates/workflow/README.md)を参照する。本来は /agents-md-setup の再実行で .agents/workflow/README.md が配置されるため、利用先で欠落している場合はセットアップ手順を見直すこと):
.agents/workflow/tasks.md— タスク定義の正本(子エージェントも参照する)。LLMが
生成するのはこのファイルのみ.agents/workflow/state.json— LLMは生成しない。tasks.md を書き終えたらscripts/state-sync(PowerShell:.agents/workflow/scripts/state-sync.ps1/ POSIX:state-sync.sh)を--initオプションで実行し、機械生成する。--sourceには
計画ソース(Issue URL やドキュメントパス)を渡す。branch は git から自動取得される.agents/workflow/scripts/state-sync.ps1 -Init -Source "<計画ソース>".agents/workflow/scripts/state-sync.sh --init --source "<計画ソース>"実行後、全タスクが
"status": "pending","retries": 0,"commit": nullで
初期化された state.json が生成される。state.json が既に存在する場合はエラー
終了する(§0 の分岐で新規作成が確定している状態でのみ実行すること)。
4. 進捗表示への登録(任意)
親エージェントに進捗表示用のタスク機能がある場合だけ(例: Claude Code の TaskCreate)、各タスクを登録する。無い場合はこの手順を
飛ばす(正本はファイル側)。
5. ユーザー承認
提示前のセルフチェック: 分解結果を提示する前に、各タスクが §2 の目安を満たすかを
一覧に照らして確かめる。
- 照らす目安: 設計判断を子に委ねていないか(実装方法が複数ありうる箇所を計画時に
決めているか)、受け入れ基準が5件までか、(変更対象の理由注記を付けた変更対象
ファイルが3件までか、追加するテストケースが数件までか、スクリプトの変更と
ドキュメントの変更が分かれているか dispatch-prompt-gen <ID>を実行してWARN:を出す方法は、state.json を作った後
(§3 の後)でないと使えない上に、runs/<ID>-1/prompt.mdを書き出してしまうため
このチェックでは使わない。§2 の目安を一覧にして各タスクを照らすこと- 満たさないタスクは、提示の前に分割・修正しておく
- 提示する一覧には、各タスクの受け入れ基準の件数と変更対象ファイルの件数を添える
提示の中心は「要件 → タスク」の対応表にする。## 要件 節がある場合、表は state-sync の
stdout の Requirement 行(Requirement R1: T1, T3 / Requirement なし: T5)から作る
(要件の本文は tasks.md の ## 要件 節から取る)。表に続けて、## 前提・解釈 と ## 対象外 の
内容を示し、その後に各タスクの受け入れ基準の件数と変更対象ファイルの件数を添える。
利用者は、要件の取りこぼしや解釈の違いを対応表で確かめて承認する。
対応表と分解結果(タスク一覧と受け入れ基準)を提示し、承認を得る。修正を求められた場合は
tasks.md を直し、state-sync(--init なし)で state.json を同期してから再提示する。
タスクの見出し(タイトル)を修正した場合も同期対象で、tasks.md に合わせて state.json のtitle が更新される(変更があったタスクごとに Updated title: <ID> が出力される)。
6. 計画のコミット
承認後、次フェーズ(/agent-dispatch または /agent-workflow のループ)に進む前に、
tasks.md と state.json をコミットする。agent-dispatch の事前チェックは作業ツリーが
クリーンであることを求めるため、コミットしないと最初の dispatch で止まる。
git add .agents/workflow/tasks.md .agents/workflow/state.json
git commit -m "chore: <計画ソース> のタスク計画を作成"- 一巡後のアーカイブ(§0)で旧 tasks.md / state.json を退避した場合も、同じコミットに含まれる
(同じパスのファイルが新しい内容に置き換わるため) .agents/を追跡していないリポジトリ(本ワークフローの配布元など)ではコミット対象が無いので、
この手順は不要
追加モード(タスクの途中追加)
サイクル途中でレビューにより派生タスクが見つかった場合や、ユーザーが要件を
追加した場合に使う。LLM は既存タスクを一切書き換えず、追記のみで完結させる
(既存タスクの間に挿入する場合も、既存タスクの依存欄の書き換えはスクリプトが行う)。
追加モードの作業自体もファイル変更・コミットを伴うため、まずagent-branch-guard skill の手順でブランチを確かめる
(main 上やマージ済みブランチなら専用ブランチを作ってから進む)。
専用ブランチを作った場合は、state-sync --set-branch で state.json の branch を
更新してから追記を始める。
新IDの採番:
.agents/workflow/state.jsonから既存の最大タスクID
(例: 既存最大がT7なら次はT8)を取得する。tasks.md 全文は読み直さない
(state.json だけで採番が完結する)追記専用:
.agents/workflow/tasks.mdの末尾に、新IDのセクションのみを
§2 と同じ基準(検証可能な受け入れ基準・依存欄の厳密フォーマット・グループ間依存の
制約・要件欄)で追記する。既存セクションには一切触れない
(例外: 新しい要件が出た場合は、## 要件節の末尾に次の番号(既存の最大がR4ならR5)で- R5: ...を追記してよい。既存の要件行は書き換えない。追記するタスクにも要件欄を書く。
また、要件の充足確認で合意した対象外は、## 対象外節の末尾に追記してよい。既存行は書き換えない)
追記タスクの所属グループは記述位置で決まる(tasks.md 上の最後の区切りのグループ)。
現在の作業グループ(state.json のgroup)など別のグループに属させたい場合は、
タスク欄に- **グループ**: <名前>(区切り行で宣言済みのグループ名)を書く
(この欄が位置より優先される)。既定グループは名前が空文字列のためこの欄では
参照できない(空欄はstate-syncがエラーにする)。未宣言の名前もエラーになる。
挿入モードで tasks.md 末尾に追記したセクションも同じ扱いである依存: 既存タスク(
done済みタスクも含む)を依存先にしてよい。done
タスクへの依存は、引き継ぎガードがreport.mdの存在を保証しているため
問題なく解決できるstate.json への反映:
state-syncを--initなしで実行し、追加分のみをpendingとして追記する(既存タスクのstatus/retries/commitは
一切変更されない).agents/workflow/scripts/state-sync.ps1.agents/workflow/scripts/state-sync.sh既存タスクの間に挿入する場合(例: T3 → T4 の間に T8 を挟み、T4 を T8 の完了後に
実行したい場合)は、--insert <新ID> --before <後続ID>を付けて実行する。
スクリプトが後続タスクの依存欄に新IDを追加する(例: T4 のT3→T3, T8)。
新タスク自身の依存欄(例:T3)は手順2で LLM が書く。--beforeにはカンマ区切りで
複数の後続タスクを指定できる.agents/workflow/scripts/state-sync.ps1 -Insert T8 -Before T4.agents/workflow/scripts/state-sync.sh --insert T8 --before T4- 書き換えてよいのは
pendingの後続タスクだけ。done/in_progress/in_review/failedのタスクを--beforeに指定すると拒否される(exit 1) - 循環依存になる挿入(例: T8 が T4 に依存しているのに T4 の前に挿入する)も拒否される。
拒否された場合、tasks.md と state.json は変更されない - タスクの実行順は tasks.md の記述順や ID 順ではなく依存関係で決まる。挿入した T8 は
state.json の末尾に追加されるが、next-taskが依存関係に従って T4 より先に選ぶ
- 書き換えてよいのは
進捗表示への登録(§4。任意)も追加分のみ行う(既存タスクの再登録はしない)
ユーザー承認も追加分のみ提示する(既存タスク一覧の再提示はしない)。§5 と同様に、
追加分の「要件 → タスク」の対応表(追加した要件と追加したタスクの行だけ)を中心に示すコミット: 承認後、§6 と同様に tasks.md と state.json をコミットする
(chore: <追加したタスクID> を追加。挿入した場合はchore: <新ID> を <後続ID> の前に挿入)。
dispatch 前に作業ツリーをクリーンにするため
このモードでの親のLLM出力は「追加するタスクのセクション」だけに限る。既存部分の
再読・再出力・state.json の手書き編集は行わない。