关于 spec-kit-implement
spec-kit-implement 按任务清单和 FRAMEWORK.md 工作流实施变更,面向遵循 TDD 的开发者。它逐阶段执行任务,维护清单状态,并要求完成文档更新及最终验证。
主要功能
- 01检查清单并显示任务进度
- 02按依赖顺序逐阶段执行任务
- 03先编写失败测试再实现
- 04运行针对性测试与代码检查
- 05更新受影响文档并核验完成情况
适用场景
- 01按已批准的计划实现功能变更
- 02用 TDD 完成任务清单中的工作
- 03检查实现后的规范、测试和文档状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aircury/ ai-framework --skill spec-kit-implement安装后在 Claude Code 中输入/spec-kit-implement确认已加载。
详细介绍
按照 TDD 和 FRAMEWORK.md 变更工作流,执行 tasks.md 中的任务列表。
输入:可选指定变更名称。如果省略,请根据上下文推断,或向用户询问。
步骤
-
检查清单
如果
specs/changes/<name>/checklists/存在,统计每份清单中已勾选和未勾选的项目,并显示一个表格:| Checklist | Total | Checked | Unchecked | Status | |-----------------|-------|---------|-----------|--------| | requirements.md | 14 | 14 | 0 | PASS | | security.md | 8 | 5 | 3 | FAIL |requirements.md是由spec-kit-specify和spec-kit-clarify维护的规范质量清单;其他清单由spec-kit-checklist生成,归审查者所有。勾选表示满足了需求质量标准,而不是表示工作已完成。 这些清单是只读关卡:绝不更改其中的标记。 如果有任何未勾选项,询问用户是否仍要继续;除非用户答应,否则停止。 -
加载资料
加载
specs/changes/<name>/tasks.md、plan.md和spec.md,以及FRAMEWORK.md(包括FRAMEWORK.local.md和它链接的能力文档),了解工作必须遵循的规则。如果缺少
tasks.md或其内容不完整,请提示先使用spec-kit-tasks技能。 -
显示当前进度
显示:
- 变更名称
- 进度:“已完成 N/M 项任务”
- 剩余任务概览
-
按阶段执行任务
按依赖顺序处理每项待办任务:
- 宣布即将处理的任务。
- 开始处理前,根据当前代码树确认任务目标:任务列表可能比其编写时所依据的代码树存在得更久,文件可能已移动,规则也可能已更改。 在勾选任务时,将任何修正写入任务内容,让后续阅读者知道实际完成了什么。
- 遵循 TDD:先编写会失败的测试,确认它因预期原因失败,然后实现满足测试的最小改动,最后进行重构。
- 保持改动最小,并限定在任务范围内。
- 遵守分层边界:domain → application → infrastructure。绝不反向依赖。
- 运行针对该任务的检查:覆盖相关行为的测试,以及针对所改文件运行项目的代码检查、格式化和类型检查。
- 任务完成后立即在 tasks.md 中标记:将
- [ ]改为- [x]。 - 完成本阶段并检查通过后,再进入下一阶段。
标记为
[P]的任务涉及不同文件,且不依赖任何尚未完成的任务,因此可以并行执行;如果 Agent 支持,也可以使用子 Agent。 这只是许可,并非必须;绝不要将涉及相同文件或存在执行顺序的任务拆分给多个子 Agent,以免编辑冲突。 父 Agent 仍负责整合结果、勾选任务,并继续执行,直至列表完成。 如果并行任务失败,继续处理其他任务,并报告失败情况。遇到以下情况时暂停:
- 任务不明确——在实现前请求澄清。
- 实现过程中发现设计问题——建议使用
spec-kit-plan技能更新 plan.md。 - 测试意外失败——报告情况并等待指示。
- 用户中断。
-
处理文档阶段
任务列表以文档阶段结束:变更导致每份现存规范、决策记录或文档不再准确,都应有一项任务;如果没有,则注明“(无可观察到的行为变化)”。 像处理其他任务一样完成这些任务并勾选:
- 使用 FRAMEWORK.md 中规定的规范格式(WHEN/THEN 场景、RFC 2119 用语)。
- 现存规范描述的是已构建的内容,绝不能悄悄降低要求。
如果实现未达到变更
spec.md中的要求,不要将现存规范改写成与未达标的实现一致。 完成工作,或询问用户;如果用户接受未达标项,须在变更的spec.md中记录该决策及理由,以便审查者一并评估。
-
检查变更是否导致测试过时 未修改文件中的测试仍可能引用该变更删除的函数、选择器或字面值,而被修改文件中的测试无法发现这些问题。 将工作树与该变更起始时所基于的提交进行比较,列出已修改源文件中移除的名称,保留所有其余源文件均不再包含的名称,并在测试文件中搜索它们。 使用 Git,并根据项目布局调整测试匹配模式:
BASE=$(git merge-base origin/main HEAD) # or the commit the change started from T=(':(glob)**/*_test.*' ':(glob)**/*.test.*' ':(glob)**/*.spec.*' ':(glob)**/tests/**' ':(glob)**/test/**') X=("${T[@]/#:(glob)/:(exclude,glob)}") git diff -U0 "$BASE" -- . "${X[@]}" | grep '^-' | grep -v '^---' | grep -oE '[A-Za-z_][A-Za-z0-9_]{2,}' | sort -u | while read -r name; do git grep -q -w -F -e "$name" -- . "${X[@]}" || git grep -l -w -F -e "$name" -- "${T[@]}" done | sort -u | grep -vxF -f <(git diff --name-only "$BASE"; echo /dev/null)将列出的每个测试文件都作为针对性检查运行;大多数测试文件都会包含的名称属于套件的术语,而非过时测试。
-
验证是否完成
- 每项任务都已勾选;若未勾选,则附注说明由谁负责。
- 实现的行为符合规范,代码遵循计划。
- 项目中针对受影响范围的测试和检查均已通过。
- 架构边界仍然成立。
实施期间的输出
## Implementing: <change-name>
Task 3/7: <description>
[implementation]
✓ Done
Task 4/7: <description>
[implementation]
✓ Done
完成时的输出
## Complete: <change-name>
7/7 tasks complete.
Documentation phase worked: specs/features/<area>/spec.md updated.
Definition of done:
✓ Tests written before implementation
✓ Architecture boundaries hold
✓ Documentation phase's tasks ticked
下一步:“使用 spec-kit-converge 技能,根据 spec.md、plan.md 和 tasks.md 评估工作,并将任何差距转化为任务。”
护栏
- TDD 不容妥协。失败测试通过前,绝不编写实现代码。
- 非并行任务失败时立即停止,不要跳过。
- 任务完成后立即更新任务复选框。
- 优先保护领域模型;围绕它调整基础设施。
- 在认定工作完成之前,必须勾选 Documentation 阶段的任务,并更新 specs/features/。
- 测试必须覆盖生产环境实际采用的调用方式。 如果代码从调用方获取路径、根目录、模式或选项,应覆盖调用方实际使用的值,而不只是方便测试的情况。
- 追踪新值直到它离开系统。 对视图模型或内部对象的测试只能证明值已计算出来,并不能证明它会被输出:如果响应或输出是手动组装的,新字段可能会在过程中丢失。应通过读取实际输出的测试覆盖它。
- 当缺少依赖会导致功能关闭时,验证依赖接线。 如果不设置依赖,应用就会跳过某项检查,那么应编写一个测试,构建真实的组合并断言该依赖已设置。
- 没有布局的组件测试只能证明控件可以渲染,不能证明它可用。 应在真实浏览器中检查此变更新增或重新设置样式的每个交互控件,而非只检查其中一个。
- 删除标记或标识符可能会破坏远处读取它的代码;删除前应搜索所有读取它的代码。
- 确保文本断言确实能够失败。 当测试断言文件文本而非行为时,应在副本中修改该文件,确认修改确实生效,并观察测试失败。使用模式提取时,应断言提取到了内容后再检查其值,否则不匹配任何内容的模式也会通过,检查形同虚设。如果警告文本本身包含测试要查找的内容,则只匹配可执行代码行。应直接写出预期值,而不是从此变更正在编辑的版本中读取。
- 彻底移除所有探测内容,包括其创建的任何目录,并使用绝对路径恢复文件;随后将恢复的文件与预期变更进行比较。
- 绝不能把管道的退出状态当作命令本身的退出状态。
test-suite | tail-20报告的是tail的状态,因此失败的运行可能会被误判为成功。应将输出重定向到日志,并先记录命令本身的状态(<command> > run.log 2>&1; echo "EXIT=$?" >> run.log),再据此判断。 - 长时间运行的命令正在执行某脚本时,绝不要编辑该脚本;应等待命令结束,或编辑副本。