レゴ計画 は何をしますか?
決定済みの変更を、シンプルなプリミティブから実動機能へと積み上げる階層化DAGに変換します。計画のみ。その後は停止します。
グラフはピラミッド構造です。最下層に独立したブロック、その上に合成されたブロック、そして1つの完了ノードが最上位にあります。後続のドライバーは、同じレイヤーのノードを並行実行したり、statusを切り替えたり、このグラフを再描画できます。このスキルはサブエージェントを起動しません。他のスキルをロードしません。
使用するタイミング
決定済みの変更を、ドライバーが従える実装マップに変換する作業が発生したらロードします。
- 必要なとき: 構築するものがすでに選択されている場合。この会話内にすでにファイルリストやパスの選定がある場合はそれを使用します。ない場合は、確定した意図とコードから導出します。第二のシステムマップを発明してはいけません。
- スキップ: タイプミス、コメント、フォーマット、コードを伴わないドキュメント。
- 意図がまだ確定していない場合: 停止します。変更が確定するまで質問します。選択されていない機能のためにブロックを積み上げてはいけません。
ノードが1つだけでもDAGです。完全な契約を出力します。
厳格なゲート
- 計画のみ。 プロダクションコードを書かないでください。テストを書かないでください。
done whenにチェック方法を記述し、ここで実装しないでください。 - 出力後に停止。 チャットのDAGとスクラッチファイルのみ。サブエージェントを起動しないでください。次のスキルをロードしないでください。
- サイクル禁止。 ブロックが後続のブロックに依存している場合、分割が間違っています。再分割してください。
- 承認を待たない。 DAGを表示して停止します。間違っている場合はユーザーが割り込みます。
- ユーザーにスクラッチファイルを開かないでください。
docs/以下に計画を書き込まないでください。
ノードの粒度
グラフノード(並行単位): サブエージェントが他の進行中のノードを待たずに所有できる、独立した出荷可能なプリミティブ。
例:write fetchOrder、write OrderCard、wire fetchOrder into the loader。
大きすぎる例:implement auth。分割してください。小さすぎる例:rename a variable。それを必要とするノードに統合してください。
パーツ(ノード内部): そのノードがコンパイルできるようにするために一緒に実装されなければならない関数群。1つのサブエージェントがパーツを順番に実行します。パーツをファンアウトしてはいけません。
ノード fetch-order の例:
files:src/fetchOrder.ts,src/fetchOrder.test.tsparts:Order型、次にfetchOrder、次にsrc/fetchOrder.test.tsを書くか拡張する- これらのパーツは別々のグラフノードではありません
グラフの形状
- レイヤー0:
depends on: noneのノード。ドライバーはこれらすべてを並行実行できます。 - レイヤーN: 依存関係がすべて前のレイヤーにあるノード。
- 最終レイヤー: 機能がエンドツーエンドで動作することを意味する1つのノード(または密接に関連したセット)。
- 相互に依存しない2つのノードは同じレイヤーを共有する(または互いに待たないレイヤーに配置する)必要があります。
depends onはノードIDのリストであり、ファイル名ではありません。
同一ファイル: 2つのノードが同じパスを作成または編集する場合、それらは同じレイヤーを共有してはいけません。マージするか、depends on のエッジを追加して一方を待たせてください。並行実行のためにファイルを分割してはいけません。パスを読み取り専用で使用する2つのノードは同じレイヤーを共有できます。files は作成または編集するパスのみをリストします。同一ファイルルールにはテストファイルも含まれます。
ノードのフィールド
すべてのノードは以下の7つのフィールドを持ちます:
- id: ケバブケース。この計画内で一意で、安定している(後続のドライバーがこのIDを完了としてマークします)。
- name: 短い英語の名前。
- depends on: 他のID、または
none。 - files: 作成または編集するパス。
done whenのテストパスを含めてください。 - parts: 順序付きリスト。最後のパーツはそのテストを書くか拡張します。
done whenが手動チェックでテストファイルがない場合、最後のパーツはそのチェックであり、filesにはテストパスは含まれません。 - done when: ドライバーが依存ノードを開始する前に実行できるテストファイルまたはコマンド。
- status: このスキルは常に
pendingと書きます。後続のドライバーがin-progressまたはdoneを設定できます。このスキルはこれらの2つを書きません。
計画に完全なソースコードを入れないでください。
ライブボード
パス: <repo>/.agent/scratch/lego-plan.json
チャットのフェンスと同じJSON。エージェントはこのファイルに従います。ユーザー向けの成果物はチャットの図です。
- 必要に応じて
.agent/scratch/を作成します。 - 常に上書きします。既存のノードが
in-progressまたはdoneであっても、尋ねないでください。 - リポジトリにgitがある場合、
.gitignoreに.agent/scratch/が含まれていることを確認します。.gitignoreが存在し行がない場合は追記します。.gitignoreがない場合はその1行だけを含むファイルを作成します。 - ファイルを開かないでください。チャットに2番目のコピーとしてダンプしないでください。JSONフェンスがユーザーが見るコピーです。
手順
手順 1: 決定済みの変更を確認する
- 変更が明確であれば続行します。
- ユーザーがまだ何を望むか選択している場合は、停止します。質問します。決定後にここに戻ります。
手順 2: セッション内の入力を収集する
- この会話にすでに完了ラインのファイルリスト、パーツ、またはパスの選定がある場合は、それらを開始セットとして使用します。
- ない場合は、決定済みの意図と、ファイルに名前を付けるために読む必要のあるコードからブロックを導出します。リポジトリ全体をツアーしないでください。
手順 3: ノードとパーツに分割する
- 候補となるプリミティブ(B粒度)をリストします。
- 各プリミティブについて、一緒にコンパイルする必要があるCパーツをリストします。最後にテストを書くか拡張する(または手動チェック)で終わります。
depends onを描画します。ノードは、そのノードの結果を呼び出すか埋め込む場合にのみ、別のノードに依存します。- 依存関係からレイヤーを割り当てます。独立したノード→同じレイヤー。
- 2つのノードが同じパスを作成または編集し、同じレイヤーを共有する場合、マージするかエッジを追加します。その後、再レイヤリングします。
- サイクルが発生した場合、間違ったノードを分割し、この手順を繰り返します。
手順 4: 各ノードに入力する
7つのフィールドを入力します。すべてのノードで status は pending です。
手順 5: チャットでDAGを表示する
以下の順序で表示します:
- レイヤー: レイヤー0から最終レイヤーまで。各レイヤーの下に、そのレイヤーのノード。
- ノード: 各IDの7つのフィールド。
- Mermaid: 常に。1つの
flowchart(またはgraph TD)。図内のノードIDは計画IDと一致している必要があります。classDefは使用しません。ステータスの色は使用しません。すべてのノードはpendingです。 - JSONフェンス: ライブボードオブジェクトを含む
jsonブロック。ID、依存関係、ファイル、パーツ、doneWhen、statusの信頼できる情報源。レイヤーはdependsから導出されます。layerフィールドは保存しないでください。
次に手順6に進みます。
Mermaid形式:
flowchart TD
fetch-order[fetch-order]
order-card[order-card]
wire-loader[wire-loader]
fetch-order --> wire-loader
order-card --> wire-loader
同じレイヤーのノード間にはエッジがありません。
JSON形式:
{
"version": 1,
"nodes": [
{
"id": "fetch-order",
"name": "fetch order",
"depends": [],
"files": ["src/fetchOrder.ts", "src/fetchOrder.test.ts"],
"parts": ["Order type", "fetchOrder", "write or extend src/fetchOrder.test.ts"],
"doneWhen": "pnpm test src/fetchOrder.test.ts",
"status": "pending"
}
]
}
depends はIDの配列です。空はなしを意味します。
手順 6: ライブボードを書き込む
- 同じJSONを
.agent/scratch/lego-plan.jsonに書き込みます(上書き)。 - ライブボードの説明に従い、
.gitignoreが.agent/scratch/を無視することを確認します。 - ファイルを開かないでください。
手順 7: 停止
手順6の後、停止します。コードを書かないでください。サブエージェントを起動しないでください。他のスキルをロードしないでください。
決定木
- 意図が確定していない → 手順1。
- 決定済みの変更、実装マップが必要 → 手順2 → 3 → 4 → 5 → 6 → 7。
- ノードが1つ → それでも手順2 → 7(完全な契約)。
- タイプミス / フォーマット / ドキュメントのみ → このスキルは適用されません。
- 依存関係にサイクル → 手順3のステップ6。
- 同じレイヤーの2つのノードが同じパスを編集 → 手順3のステップ5。
- ノードが「機能全体を実装」 → 分割(手順3)。
レッドフラグ
| 信号 | 意味 | 代わりにするべきこと |
|---|---|---|
| このスキルでfetch関数を書いている | 計画が実装になってしまった | 手順7。停止。 |
| レイヤーのない1つの線形リスト | ファンアウトできない | 独立したノードを同じレイヤーに配置する。 |
| ここからサブエージェントを起動 | リーフがドライバーになってしまった | 手順7。停止。 |
| MermaidのIDがノードIDと異なる | ドライバーが完了をマークできない | 両方の場所で同じケバブケースIDを使用する。 |
| JSONフェンスがスクラッチファイルと異なる | 2つの情報源 | 1つのオブジェクトを書き、両方にコピーする。 |
サイクル(a → b → a) | 分割が間違っている | 分割して再レイヤリングする。 |
同じレイヤーの2つのノードが order.ts を編集 | 並行書き込みの衝突 | マージするか、depends on のエッジを追加する。 |
| 2つのノードを並行実行するためにファイルを分割 | 要求されていない設計 | ファイルを維持し、ノードを順序付ける。 |
テストパスが files / 最後のパーツにない | ノードが出荷可能でない | 手順3のステップ2。 |
計画Mermaidに classDef やステータスの色がある | このスキルが進捗を描いている | スタイルなし。すべてpending。 |
| 1つのノードのパーツが、単独ではコンパイルできない並列ノードに分割されている | CがBとして扱われている | それらのパーツを1つのノード内に保持する。 |
| 1つのノードとしての「Implement auth」 | 大きすぎる | プリミティブに分割する。 |
| 「looks good?」と待つ | ゲートは表示して停止 | 出力して停止する。 |
| スクラッチファイルの上書き前に確認を求める | ライブボードは1つのスロット | 手順6。上書き。 |
.agent/scratch/lego-plan.json を開く | ユーザー向けの余分なもの | チャットのみ。ファイルはエージェント用。 |
docs/lego-plan.md を書く | 余分なアーティファクト | チャット+スクラッチ。docsの計画ファイルはなし。 |
エラーハンドリング
- セッションにファイルリストがない: 意図と対象を絞った読み取りから導出します。ファイルに名前を付けられない場合は、停止して何が不足しているかを伝えます。パスを発明しないでください。
- サイクル: IDでサイクルを報告します。分割します。手順3を再実行します。循環Mermaidを計画として表示しないでください。
- 最終レイヤーが機能を意味しない: 構成されたピース(ワイヤーアップ)に依存する完了ノードを追加するか、現在の最終レイヤーがすでにエンドツーエンドのパスである理由を説明します。
- ユーザーがノードが間違っていると割り込む: そのノードと、それを指していたすべての
depends onを編集します。ノードがまだ存在する場合はIDを安定に保ちます。ノードを削除する場合は、MermaidとJSONからも削除します。スクラッチファイルを上書きします。DAGを再度表示します。停止します。 done whenがあいまい(「it works」): コマンドまたはテストパスに置き換えます。プロジェクトにまだテストコマンドがない場合は、手動チェックを1行で命名します。最後のパーツはそのチェックです。- gitリポジトリでない: ワークスペースが書き込み可能であれば、それでも
.agent/scratch/lego-plan.jsonを書き込みます。gitignoreの手順はスキップします。1行でチャットに伝えます。 - スクラッチ書き込みに失敗(権限、ディスク): それでもチャットのDAGとJSONフェンスを表示します。ライブボードが書き込まれなかったことを伝えます。ファイルが存在するふりをしないでください。
- 既存のスクラッチJSONが無効または実行中: 上書きします。マージしないでください。質問しないでください。