乐高计划 是做什么的?
将一个已确定的变更转化为一个从简单原语到工作特性的分层DAG。仅做规划。然后停止。
该图是一个金字塔结构:底层为独立模块,上层为组合模块,顶部为一个完成节点。后续驱动者可以并行运行同一层节点,翻转status,并重绘此图。本技能不调度子代理。也不加载其他技能。
何时使用
当任务是将一个已确定的变更转化为驱动者可遵循的实现地图时加载。
- 需求: 要构建的内容已选定。如果本次对话中已有文件列表或路径选择,请使用它们。如果没有,则从已确定的意图和代码入手。不要发明第二个系统地图。
- 跳过: 打字错误、注释、格式化、不包含代码的文档。
- 如果意图仍不确定: 停止。询问直到变更确定。不要为未选定的功能堆叠模块。
一个节点仍然是一个DAG。输出完整的合同。
硬性门控
- 仅做规划。 不要编写生产代码。不要编写测试。在
done when中命名检查。不要在此处实现它。 - 输出后停止。 在聊天中输出DAG并写入暂存文件。不要调度。不要加载下一个技能。
- 无循环。 如果一个模块依赖于后面的模块,则拆分错误。重新拆分。
- 不要等待批准。 展示DAG并停止。用户如果认为错误会中断。
- 不要为用户打开暂存文件。 不要将计划写入
docs/目录下。
节点粒度
图节点(并行单元): 一个可以独立交付的原语,子代理可以拥有它而无需等待另一个正在处理中的节点。
示例:write fetchOrder、write OrderCard、wire fetchOrder into the loader。
太大:implement auth。拆分之。太小:rename a variable。将其合并到需要它的节点中。
部分(节点内部): 必须一起落地才能使该节点编译通过的函数。一个子代理按顺序执行部分。不要将部分分散出去。
示例节点 fetch-order:
files:src/fetchOrder.ts、src/fetchOrder.test.tsparts:Order类型,然后fetchOrder,然后编写或扩展src/fetchOrder.test.ts- 这些部分不是单独的图节点
图形形状
- 第0层:
depends on: none的节点。驱动者可以并行运行所有节点。 - 第N层: 其依赖项全部位于较早层级的节点。
- 最后一层: 一个节点(或紧密的集合),表示该功能端到端运行正常。
- 两个相互不依赖的节点必须共享同一层(或位于互不等待的层级中)。
depends on列出节点ID,绝不是文件名。
同一文件: 如果两个节点创建或编辑同一路径,它们不得共享同一层。合并它们,或者添加一条depends on边以便一个等待另一个。不要为了并行运行而拆分文件。两个仅读取路径的节点可以共享同一层。files仅列出创建或编辑的路径。同一文件规则包括测试文件。
节点字段
每个节点都有全部七个字段:
- id: kebab-case,在此计划中唯一,稳定(后续驱动者标记此id为完成)。
- name: 简短的英文名称。
- depends on: 其他id,或
none。 - files: 创建或编辑(路径)。包括来自
done when的测试路径。 - parts: 有序的C列表。最后一部分是编写或扩展该测试。如果
done when是手动检查且没有测试文件,则最后一部分是该检查,并且files中没有测试路径。 - done when: 驱动者在启动依赖项之前可以运行的测试文件或命令。
- status: 本技能始终写入
pending。后续驱动者可以设置为in-progress或done。本技能从不写入这两个值。
不要在计划中放入完整源代码。
实时看板
路径:<repo>/.agent/scratch/lego-plan.json
与聊天围栏相同的JSON。代理遵循此文件。用户面向的产品是聊天中的图示。
- 如有需要,创建
.agent/scratch/目录。 - 始终覆盖。不要询问,即使现有节点是
in-progress或done。 - 如果仓库有git,确保
.gitignore包含.agent/scratch/。如果.gitignore存在且缺少该行,则追加。如果缺少.gitignore,则创建它并包含该行。 - 不要打开文件。不要将其作为第二个副本转储到聊天中。JSON围栏是用户看到的副本。
程序
程序1:确认已确定的变更
- 如果变更明确,继续。
- 如果用户仍在选择他们想要的内容,停止。询问。变更确定后返回此处。
程序2:收集会话中已有的输入
- 如果本次对话已有完成线文件列表、部分或路径选择,将其作为起始集合。
- 如果没有,则从已确定的意图和必须读取以命名文件的代码中推导模块。不要遍历整个仓库。
程序3:拆分为节点和部分
- 列出候选原语(B粒度)。
- 对于每个原语,列出必须一起编译的C部分。以编写或扩展测试(或手动检查)结束。
- 绘制
depends on:一个节点仅在调用或嵌入该节点的结果时才依赖于另一个节点。 - 根据依赖项分配层级。独立节点→同一层。
- 如果两个节点创建或编辑同一路径且共享一层,合并它们或添加一条边。然后重新分层。
- 如果出现循环,拆分错误的节点并重复此程序。
程序4:填充每个节点
填充七个字段。每个节点的status为pending。
程序5:在聊天中展示DAG
按以下顺序展示:
- 层级: 第0层到最后一层。在每个层级下,该层中的节点。
- 节点: 每个id的七个字段。
- Mermaid: 始终使用。一个
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。
- 一个节点 → 仍然执行程序2 → 7(完整合同)。
- 打字错误/格式/纯文档 → 本技能不适用。
- 依赖项中出现循环 → 程序3步骤6。
- 两个同层节点编辑同一路径 → 程序3步骤5。
- 节点是“实现整个功能” → 拆分(程序3)。
红旗
| 信号 | 含义 | 改为执行 |
|---|---|---|
| 在本技能中编写fetch函数 | 计划变成了实现 | 程序7。停止。 |
| 一个线性列表,没有层级 | 无法并行扩展 | 将独立节点放在同一层。 |
| 从此处调度子代理 | 叶子变成了驱动者 | 程序7。停止。 |
| Mermaid id与节点id不同 | 驱动者无法标记完成 | 在两个地方使用相同的kebab-case id。 |
| JSON围栏与暂存文件不同 | 两个来源 | 写入一个对象。复制到两者。 |
循环(a → b → a) | 拆分错误 | 拆分并重新分层。 |
两个同层节点编辑order.ts | 并行写入冲突 | 合并或添加depends on边。 |
| 拆分文件以便两个节点并行运行 | 未要求的设计 | 保留文件。对节点进行排序。 |
files/最后部分缺少测试路径 | 节点不可交付 | 程序3步骤2。 |
计划Mermaid上有classDef或状态颜色 | 本技能描绘进度 | 无样式。全部pending。 |
| 一个节点的部分被拆分为无法单独编译的并行节点 | 将C视为B | 将这些部分保留在一个节点内。 |
| 将“实现auth”作为单个节点 | 太大 | 拆分为原语。 |
| 等待“看起来不错?” | 门控是展示后停止 | 输出并停止。 |
| 覆盖暂存文件前询问 | 实时看板只有一个槽 | 程序6。覆盖。 |
打开.agent/scratch/lego-plan.json | 面向用户的额外文件 | 仅在聊天中。文件是给代理的。 |
写入docs/lego-plan.md | 额外产物 | 聊天加暂存。没有docs计划文件。 |
错误处理
- 会话中没有要触碰的文件: 从意图和针对性读取中推导。如果无法命名文件,停止并说明缺少什么。不要发明路径。
- 循环: 按id报告循环。拆分。重新运行程序3。不要将循环的Mermaid展示为计划。
- 最后一层不代表功能正常工作: 添加一个依赖于组合部分(接线)的完成节点,或者说明为什么当前最后一层已经是端到端路径。
- 用户中断表示某个节点错误: 编辑该节点以及任何指向它的
depends on。如果节点仍然存在,保持id稳定。如果删除了一个节点,同时从Mermaid和JSON中移除它。覆盖暂存文件。再次展示DAG。停止。 done when模糊(“它应该能工作”): 替换为命令或测试路径。如果项目尚无测试命令,用一行命名手动检查。最后一部分是该检查。- 不是git仓库: 如果工作区可写,仍然在其下写入
.agent/scratch/lego-plan.json。跳过gitignore步骤。在聊天中用一行说明。 - 暂存写入失败(权限、磁盘): 仍然显示聊天DAG和JSON围栏。说明实时看板未写入。不要假装文件存在。
- 现有暂存JSON无效或正在运行中: 覆盖。不要合并。不要询问。