编写计划
概览
编写全面的实现计划,假设工程师对我们的代码库毫无上下文,并且品味存疑。记录他们需要知道的一切:每个任务要触碰哪些文件、代码、测试、可能需要检查的文档、如何测试。把整个计划作为小步任务交给他。DRY。YAGNI。TDD。频繁提交。
假设他们是熟练的开发人员,但几乎不了解我们的工具集或问题域。假设他们不太了解良好的测试设计。
开始时宣布: “我正在使用 writing-plans 技能创建实现计划。”
上下文: 如果在隔离的 worktree 中工作,它应该在执行时通过 superpowers:using-git-worktrees 技能创建。
保存计划到: docs/superpowers/plans/YYYY-MM-DD-<feature-name>.md
- (用户对计划位置的偏好会覆盖此默认值)
范围检查
如果 spec 覆盖多个独立子系统,它应该在头脑风暴期间被拆分为子项目 spec。如果没有,建议将其拆分为单独的计划 — 每个子系统一个。每个计划都应该自行产出可工作、可测试的软件。
文件结构
在定义任务之前,规划哪些文件将被创建或修改,以及每个文件负责什么。这里会锁定分解决策。
- 设计具有清晰边界和良好定义接口的单元。每个文件应该有一个清晰职责。
- 你最能推理的是你可以一次性保留在上下文中的代码,并且当文件保持专注时你的编辑更可靠。优先选择更小、更专注的文件,而不是承担过多职责的大文件。
- 一起变化的文件应该放在一起。按职责拆分,而不是按技术层拆分。
- 在现有代码库中,遵循既有模式。如果代码库使用大文件,不要单方面重构 - 但如果你正在修改的文件已经变得笨重,在计划中包含拆分是合理的。
这个结构会指导任务分解。每个任务应该产出独立自包含、单独合理的变更。
任务大小适配
任务是最小单元,它拥有自己的测试周期,并且值得一个 新审查者的关卡。在划定任务边界时:将设置、 配置、脚手架和文档步骤折叠到需要这些内容的 交付物所在任务中;只有在审查者可以有意义地 拒绝一个任务同时批准其相邻任务的地方才拆分。每个任务以 可独立测试的交付物结束。
小步任务粒度
每个步骤是一个动作(2-5 分钟):
- “编写失败的测试” - 步骤
- “运行它以确保它失败” - 步骤
- “实现使测试通过的最小代码” - 步骤
- “运行测试并确保它们通过” - 步骤
- “提交” - 步骤
计划文档头部
每个计划必须以这个头部开始:
# [Feature Name] Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** [One sentence describing what this builds]
**Architecture:** [2-3 sentences about approach]
**Tech Stack:** [Key technologies/libraries]
**Spec:** [path to the spec/design doc this plan implements — the plan
argues from the spec, so the spec travels with it; executors read both]
## Global Constraints
[The spec's project-wide requirements — version floors, dependency limits,
naming and copy rules, platform requirements — one line each, with exact
values copied verbatim from the spec. Every task's requirements implicitly
include this section.]
---
任务结构
### Task N: [Component Name]
**Files:**
- Create: `exact/path/to/file.py`
- Modify: `exact/path/to/existing.py:123-145`
- Test: `tests/exact/path/to/test.py`
**Interfaces:**
- Consumes: [what this task uses from earlier tasks — exact signatures]
- Produces: [what later tasks rely on — exact function names, parameter
and return types. A task's implementer sees only their own task; this
block is how they learn the names and types neighboring tasks use.]
- [ ] **Step 1: Write the failing test**
def test_specific_behavior(): result = function(input) assert result == expected
- [ ] **Step 2: Run test to verify it fails**
Run: `pytest tests/path/test.py::test_name -v`
Expected: FAIL with "function not defined"
- [ ] **Step 3: Write minimal implementation**
def function(input): return expected
- [ ] **Step 4: Run test to verify it passes**
Run: `pytest tests/path/test.py::test_name -v`
Expected: PASS
- [ ] **Step 5: Commit**
git add tests/path/test.py src/path/file.py git commit -m "feat: add specific feature"
无占位符
每个步骤必须包含工程师需要的实际内容。这些是 计划失败 — 绝不写它们:
- “TBD”、“TODO”、“implement later”、“fill in details”
- “Add appropriate error handling” / “add validation” / “handle edge cases”
- “Write tests for the above”(没有实际测试代码)
- “Similar to Task N”(重复代码 — 工程师可能按乱序阅读任务)
- 描述要做什么但没有展示如何做的步骤(代码步骤需要代码块)
- 引用任何任务中未定义的类型、函数或方法
自我审查
写完完整计划后,以全新眼光查看 spec,并根据它检查计划。这是你自己运行的检查清单 — 不是子代理调度。
1. Spec 覆盖: 快速浏览 spec 中的每个章节/需求。你能指出一个实现它的任务吗?列出任何缺口。
2. 占位符扫描: 在你的计划中搜索危险信号 — 上面“No Placeholders”章节中的任何模式。修复它们。
3. 类型一致性: 你在后续任务中使用的类型、方法签名和属性名称是否与你早期任务中定义的内容匹配?在 Task 3 中调用 clearLayers() 但在 Task 7 中调用 clearFullLayers() 的函数是一个 bug。
如果你发现问题,就地修复。无需重新审查 — 只需修复并继续。如果你发现某个 spec 需求没有任务,添加任务。
执行交接
保存计划后,提供执行选择:
“计划已完成并保存到 docs/superpowers/plans/<filename>.md。有两个执行选项:
1. 子代理驱动(推荐) - 我为每个任务派发一个全新的子代理,在任务之间审查,快速迭代
2. 内联执行 - 在此会话中使用 executing-plans 执行任务,带检查点的批量执行
选择哪种方法?”
如果选择子代理驱动:
- REQUIRED SUB-SKILL: 使用 superpowers:subagent-driven-development
- 每个任务一个全新子代理 + 两阶段审查
如果选择内联执行:
- REQUIRED SUB-SKILL: 使用 superpowers:executing-plans
- 带检查点的批量执行以供审查