关于 bmad-dev-story
bmad-dev-story 是用于根据故事文件实施开发任务的 BMAD 技能,面向开发者。它按顺序指导任务执行、测试和进度更新,并设有明确的暂停条件。
主要功能
- 01按序执行故事工作流
- 02跟踪验收标准与任务
- 03测试优先的实现指导
- 04更新 Sprint 状态
- 05记录故事实现说明
适用场景
- 01实施已准备好的开发故事
- 02代码审查后继续故事开发
- 03在 Sprint 状态中跟踪进度
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ bmad-code-org/ bmad-method --skill bmad-dev-story安装后在 Claude Code 中输入/bmad-dev-story确认已加载。
附带文件checklist.mdcustomize.toml
详细介绍
开发故事工作流
目标: 按照已填充上下文的 story 规格文件执行 story 实现。
你的角色: 实现该 story 的开发者。
- 所有回复均使用 {communication_language} 沟通,语言必须契合 {user_skill_level}
- 所有文档均使用 {document_output_language} 生成
- 仅可修改 story 文件中的以下区域:YAML frontmatter 的
baseline_commit、Tasks/Subtasks 复选框、Dev Agent Record(Debug Log、Completion Notes)、File List、Change Log 以及 Status - 严格按照顺序执行所有步骤;不得跳过任何步骤
- 绝对不要因为“里程碑”“重大进展”或“会话边界”而停止。在单次执行中持续进行,直到 story 完成(所有 AC 均满足且所有任务/子任务均已勾选),除非触发了 HALT 条件或用户另有指示。
- 除非适用 HALT 条件,否则不要安排“下一次会话”或请求评审暂停。只有 Step 9 才能判定完成。
- 用户技能等级({user_skill_level})仅影响对话风格,不影响代码更新。
约定
- 裸路径(例如
steps/step-01-init.md)从 skill 根目录解析。 {skill-root}解析为此 skill 的安装目录(即customize.toml所在目录)。- 以
{project-root}为前缀的路径从项目工作目录解析。 {skill-name}解析为 skill 目录的基名。
激活时
Step 1:解析 Workflow 块
运行:uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow
如果脚本执行失败,请自行解析 workflow 块:按 base → team → user 的顺序读取以下三个文件,并应用与解析器相同的结构化合并规则:
{skill-root}/customize.toml— 默认值{project-root}/_bmad/custom/{skill-name}.toml— 团队覆盖项{project-root}/_bmad/custom/{skill-name}.user.toml— 个人覆盖项
任何缺失的文件都会被跳过。标量覆盖,表深度合并,以 code 或 id 为键的表数组会替换匹配条目并追加新条目,所有其他数组均追加。
Step 2:执行前置步骤
在继续之前,按顺序执行 {workflow.activation_steps_prepend} 中的每个条目。
Step 3:加载持久事实
将 {workflow.persistent_facts} 中的每个条目视为你在本次工作流后续运行中始终携带的基础上下文。以 file: 为前缀的条目是 {project-root} 下的路径或 glob —— 将所引用的内容作为事实加载。所有其他条目则按原文作为事实。
Step 4:加载配置
从 {project-root}/_bmad/bmm/config.yaml 加载配置并解析:
project_name、user_namecommunication_language、document_output_languageuser_skill_levelimplementation_artifactsdate为系统生成的当前日期时间project_context=**/project-context.md(若存在则加载)
Step 5:向用户问候
使用 {communication_language} 向 {user_name} 问候。
已弃用:bmad-build 现在是官方实现方式。仅在被明确按名称调用时使用此项。
Step 6:执行追加步骤
按顺序执行 {workflow.activation_steps_append} 中的每个条目。
激活已完成。如果 activation_steps_prepend 或 activation_steps_append 非空,请在继续之前确认每个条目都已按顺序执行。在所有激活步骤完成之前,不要开始主工作流。
路径
story_file= ``(显式 story 路径;若为空则自动发现)sprint_status={implementation_artifacts}/sprint-status.yaml
执行
所有回复均使用 {communication_language} 进行沟通,且语言必须适配 {user_skill_level} 所有文档均以 {document_output_language} 生成 仅可修改 story 文件中的以下区域:YAML frontmatter 的 `baseline_commit`、Tasks/Subtasks 复选框、Dev Agent Record(Debug Log、Completion Notes)、File List、 Change Log 以及 Status 严格按顺序执行所有步骤;请勿跳过任何步骤 绝对不要因为“里程碑”“重大进展”或“会话边界”而停止。请在单次执行中持续进行, 直到 story 完成(所有 AC 均已满足且所有 tasks/subtasks 均已勾选),除非触发 HALT 条件或用户给出 其他指示。 除非适用 HALT 条件,否则不要安排“下一次会话”或请求评审暂停。仅由 Step 9 判定是否完成。 用户技能等级({user_skill_level})仅影响对话风格,不影响代码更新。 直接使用 {{story_path}} 读取完整的 story 文件 从文件名或元数据中提取 story_key<check if="{{sprint_status}} 文件存在">
<critical>必须从头到尾读取完整的 sprint-status.yaml 文件以保留顺序</critical>
<action>加载完整文件:{{sprint_status}}</action>
<action>从头到尾读取所有行——不要跳过任何内容</action>
<action>完整解析 development_status 部分以理解 story 顺序</action>
<action>找到第一个 story(从上到下按顺序读取),满足:
- Key 匹配模式:number-number-name(例如 "1-2-user-auth")
- 不是 epic key(epic-X)或 retrospective(epic-X-retrospective)
- Status 值等于 "ready-for-dev"
</action>
<check if="未找到 ready-for-dev 或 in-progress 的 story">
<output>📋 在 sprint-status.yaml 中未找到 ready-for-dev 的 story
**当前 Sprint 状态:** {{sprint_status_summary}}
**你想做什么?**
1. 运行 `create-story`,根据 epics 创建下一个 story 并提供完整上下文
2. 运行 `*validate-create-story`,在开发前改进现有 story(推荐的质量检查)
3. 指定要开发的特定 story 文件(提供完整路径)
4. 检查 {{sprint_status}} 文件以查看当前 sprint 状态
💡 **提示:** `ready-for-dev` 中的 story 可能尚未经过验证。建议先运行 `validate-create-story`
进行质量检查。
</output>
<ask>选择选项 [1]、[2]、[3] 或 [4],或指定 story 文件路径:</ask>
<check if="用户选择 '1'">
<action>HALT - 运行 create-story 以创建下一个 story</action>
</check>
<check if="用户选择 '2'">
<action>HALT - 运行 validate-create-story 以改进现有 story</action>
</check>
<check if="用户选择 '3'">
<ask>提供要开发的 story 文件路径:</ask>
<action>将用户提供的 story 路径存储为 {{story_path}}</action>
<goto anchor="task_check" />
</check>
<check if="用户选择 '4'">
<output>正在加载 {{sprint_status}} 以进行详细状态审查……</output>
<action>显示详细的 sprint 状态分析</action>
<action>HALT - 用户可以审查 sprint 状态并提供 story 路径</action>
</check>
<check if="用户提供 story 文件路径">
<action>将用户提供的 story 路径存储为 {{story_path}}</action>
<goto anchor="task_check" />
</check>
</check>
</check>
<check if="{{sprint_status}} 文件不存在">
<action>直接在 {implementation_artifacts} 中搜索故事</action>
<action>在文件中查找状态为 "ready-for-dev" 的故事</action>
<action>查找匹配模式的故事文件:*-*-*.md</action>
<action>读取每个候选故事文件以检查 Status 部分</action>
<check if="故事文件中未找到 ready-for-dev 故事">
<output>📋 未找到 ready-for-dev 故事
**可用选项:**
1. 运行 `create-story`,基于史诗创建下一个故事并提供完整上下文
2. 运行 `*validate-create-story` 以改进现有故事
3. 指定要开发的故事
</output>
<ask>你想做什么?请选择选项 [1]、[2] 或 [3]:</ask>
<check if="用户选择 '1'">
<action>HALT - 运行 create-story 创建下一个故事</action>
</check>
<check if="用户选择 '2'">
<action>HALT - 运行 validate-create-story 改进现有故事</action>
</check>
<check if="用户选择 '3'">
<ask>不清楚你想开发哪个故事。请提供故事文件的完整路径:</ask>
<action>将用户提供的故事路径存储为 {{story_path}}</action>
<action>使用提供的故事文件继续</action>
</check>
</check>
<check if="在文件中找到 ready-for-dev 故事">
<action>使用发现的故事文件并提取 story_key</action>
</check>
</check>
<action>存储找到的 story_key(例如 "1-2-user-authentication")以供后续状态更新使用</action>
<action>在 {implementation_artifacts} 中使用 story_key 模式查找匹配的故事文件:{{story_key}}.md</action>
<action>从发现的路径读取完整的故事文件</action>
<anchor id="task_check" />
<action>解析以下部分:Story、Acceptance Criteria、Tasks/Subtasks、Dev Notes、Dev Agent Record、File List、Change Log、Status</action>
<action>从故事文件的 Dev Notes 部分加载完整上下文</action>
<action>从 Dev Notes 中提取开发者指导:架构要求、过往经验、技术规范</action>
<action>使用增强的故事上下文为实施决策和方法提供依据</action>
<action>识别 Tasks/Subtasks 中第一个未完成的任务(未勾选 [ ])</action>
<action if="没有未完成任务">
<goto step="9">完成序列</goto>
</action>
<action if="故事文件无法访问">HALT:"无法在无法访问故事文件的情况下开发故事"</action>
<action if="未完成任务或子任务的要求不明确">ASK 用户澄清或 HALT</action>
加载所有可用上下文以为实施提供依据
<action>加载 {project_context} 以获取编码标准和项目级模式(如存在)</action>
<action>解析以下部分:Story、Acceptance Criteria、Tasks/Subtasks、Dev Notes、Dev Agent Record、File List、Change Log、Status</action>
<action>从故事文件的 Dev Notes 部分加载完整上下文</action>
<action>从 Dev Notes 中提取开发者指导:架构要求、过往经验、技术规范</action>
<action>使用增强的故事上下文为实施决策和方法提供依据</action>
<output>✅ **上下文已加载**
故事和项目上下文可用于实施
</output>
确定这是全新开始还是代码评审后的续接
<action>检查故事文件中是否存在 "Senior Developer Review (AI)" 部分</action>
<action>检查 Tasks/Subtasks 下是否存在 "Review Follow-ups (AI)" 子部分</action>
<check if="Senior Developer Review section exists">
<action>Set review_continuation = true</action>
<action>从 "Senior Developer Review (AI)" 部分提取:
- 审查结果(Approve/Changes Requested/Blocked)
- 审查日期
- 带复选框的行动项总数(统计已勾选与未勾选数量)
- 严重程度细分(High/Med/Low 数量)
</action>
<action>统计 "Review Follow-ups (AI)" 子部分中未勾选的 [ ] 审查跟进任务</action>
<action>将未勾选审查项列表存储为 {{pending_review_items}}</action>
<output>⏯️ **在代码审查后恢复 Story**({{review_date}})
**审查结果:** {{review_outcome}}
**行动项:** 剩余 {{unchecked_review_count}} 项待处理
**优先级:** {{high_count}} 个 High,{{med_count}} 个 Medium,{{low_count}} 个 Low
**策略:** 将优先处理审查跟进任务(标记为 [AI-Review]),然后再继续处理常规任务。
</output>
</check>
<check if="Senior Developer Review section does NOT exist">
<action>Set review_continuation = false</action>
<action>Set {{pending_review_items}} = empty</action>
<output>🚀 **开始全新实现**
Story:{{story_key}}
Story 状态:{{current_status}}
第一个未完成任务:{{first_task_description}}
</output>
</check>
如果 story 文件 YAML frontmatter 已包含 `baseline_commit`,保留现有值,不要覆盖它
<check if="{{sprint_status}} file exists">
<action>加载完整文件:{{sprint_status}}</action>
<action>读取所有 development_status 条目以查找 {{story_key}}</action>
<action>将 {{current_status}} 设置为 development_status[{{story_key}}]</action>
</check>
<check if="{{sprint_status}} file does NOT exist">
<action>将 {{current_status}} 设置为 story 文件 Status 部分的值</action>
</check>
<check if="{{current_status}} == 'ready-for-dev' AND story file YAML frontmatter does NOT contain baseline_commit">
<action>运行 `git rev-parse HEAD` 将当前提交捕获到 {{baseline_commit}};如果 git/版本控制不可用,则设置 {{baseline_commit}} = `NO_VCS`</action>
<action>如果 story 文件 YAML frontmatter 存在,将 `baseline_commit: {{baseline_commit}}` 添加到 frontmatter</action>
<action>如果 story 文件没有 YAML frontmatter,在顶部创建仅包含 `baseline_commit: {{baseline_commit}}` 的 frontmatter</action>
</check>
<check if="{{sprint_status}} file exists">
<check if="{{current_status}} == 'ready-for-dev' OR (review_continuation == true AND {{current_status}} != 'in-progress')">
<action>将 sprint 状态报告中的 story 更新为 = "in-progress"</action>
<action>将 last_updated 字段更新为当前日期</action>
<output>🚀 开始处理 story {{story_key}}
状态已更新:{{current_status}} → in-progress
</output>
</check>
<check if="{{current_status}} == 'in-progress'">
<output>⏯️ 恢复处理 story {{story_key}}
Story 已标记为 in-progress
</output>
</check>
<check if="{{current_status}} is neither ready-for-dev nor in-progress">
<output>⚠️ 意外的 story 状态:{{current_status}}
预期为 ready-for-dev 或 in-progress。仍然继续……
</output>
</check>
<action>存储 {{current_sprint_status}} 以供后续使用</action>
</check>
<check if="{{sprint_status}} file does NOT exist">
<output>ℹ️ 不存在 sprint 状态文件 - story 进度将仅在 story 文件中跟踪</output>
<action>Set {{current_sprint_status}} = "no-sprint-tracking"</action>
</check>
严格遵循故事文件 TASKS/SUBTASKS 中写明的顺序 - 不得偏离
<action>审阅故事文件中的当前任务/子任务 - 这是你的权威实现指南</action>
<action>按照红-绿-重构循环规划实现</action>
<action>先为任务/子任务功能编写失败的测试</action>
<action>在实现前确认测试失败 - 这验证了测试的正确性</action>
<action>实现最少的代码使测试通过</action>
<action>运行测试以确认它们现在通过</action>
<action>按照任务/子任务中的规定处理错误条件和边界情况</action>
<action>在保持测试通过的同时改进代码结构</action>
<action>确保代码遵循 Dev Notes 中的架构模式和编码标准</action>
<action>在 Dev Agent Record → Implementation Plan 中记录技术方法和决策</action>
<action if="需要故事规格之外的新依赖">HALT:"额外依赖需要用户批准"</action>
<action if="连续出现 3 次实现失败">HALT 并请求指导</action>
<action if="缺少必需的配置">HALT:"没有必要的配置文件无法继续"</action>
<critical>绝不实现任何未映射到故事文件中特定任务/子任务的内容</critical>
<critical>在当前任务/子任务完成且测试通过之前,绝不要继续下一个任务</critical>
<critical>连续执行,不要暂停,直到所有任务/子任务完成或出现明确的 HALT 条件</critical>
<critical>在 Step 9 完成门禁满足之前,不要提议暂停以进行审阅</critical>
为任务引入/更改的业务逻辑和核心功能创建单元测试
为故事需求中规定的组件交互添加集成测试
当故事需求要求时,为关键用户流程包含端到端测试
覆盖故事 Dev Notes 中识别出的边界情况和错误处理场景
确定如何为此仓库运行测试(根据项目结构推断测试框架)
运行所有现有测试以确保没有回归
运行新测试以验证实现的正确性
如果项目中已配置,运行 lint 和代码质量检查
验证实现满足所有故事验收标准;明确执行量化阈值
停止并在继续之前修复 - 立即识别破坏性变更
停止并在继续之前修复 - 确保实现的正确性
除非满足所有条件,否则绝不要将任务标记为完成 - 不得撒谎或作弊
<action>验证此任务/子任务的所有测试确实存在并通过 100%</action>
<action>确认实现与任务/子任务指定的内容完全一致 - 没有额外功能</action>
<action>验证与此任务相关的所有验收标准均得到满足</action>
<action>运行完整测试套件以确保没有引入回归</action>
<check if="任务是审阅后续项(具有 [AI-Review] 前缀)">
<action>提取审阅项详细信息(严重程度、描述、相关 AC/文件)</action>
<action>添加到解决跟踪列表:{{resolved_review_items}}</action>
<action>在 "Tasks/Subtasks → Review Follow-ups (AI)" 部分标记任务复选框 [x]</action>
<action>通过匹配描述,在"Senior Developer Review (AI) → Action Items"部分中找到匹配的行动项</action>
<action>将该行动项的复选框标记为 [x]</action>
<action>添加到 Dev Agent → Completion Notes:"✅ Resolved review finding [{{severity}}]: {{description}}"</action>
</check>
<check if="ALL validation gates pass AND tests ACTUALLY exist and pass">
<action>仅当此时,才将任务(及子任务)的复选框标记为 [x]</action>
<action>使用所有新增、修改或删除的文件更新 File List 部分(路径相对于仓库根目录)</action>
<action>向 Dev Agent 添加完成说明,概述实际实现和测试的内容</action>
</check>
<check if="validation fails">
<action>不要将任务标记为完成,先修复问题</action>
<action>如果无法修复验证失败,则暂停</action>
</check>
<check if="review_continuation == true and {{resolved_review_items}} is not empty">
<action>统计本次会话中已解决的评审项总数</action>
<action>添加 Change Log 条目:"Addressed code review findings - {{resolved_review_items}} items resolved (Date: {{date}})"</action>
</check>
<action>保存故事文件</action>
<action>判断是否还有未完成的任务</action>
<action if="more tasks remain">
<goto step="9">下一个任务</goto>
</action>
<action if="no tasks remain">
<goto step="9">完成</goto>
</action>
验证所有任务和子任务均已标记为 [x](现在重新扫描故事文档)
运行回归测试套件(不要跳过)
确认 File List 包含所有已更改的文件
执行增强的完成定义验证
将故事 Status 更新为:"review"
<action>使用基本要求验证完成定义检查清单:
- 所有任务/子任务均已标记为 [x] 完成
- 实现满足每一条 Acceptance Criterion
- 为核心功能添加了单元测试
- 在需要时,为组件交互添加了集成测试
- 在流程关键时,为关键流程添加了端到端测试
- 所有测试通过(无回归,新测试成功)
- 代码质量检查通过(linting,如已配置则静态分析)
- File List 包含所有新增/修改/删除的文件(相对路径)
- Dev Agent 包含实现说明
- Change Log 包含更改摘要
- 仅修改了允许的故事部分
</action>
<check if="{sprint_status} file exists AND {{current_sprint_status}} != 'no-sprint-tracking'">
<action>加载完整文件:{sprint_status}</action>
<action>找到与 {{story_key}} 匹配的 development_status 键</action>
<action>验证当前状态为 "in-progress"(预期的先前状态)</action>
<action>更新 development_status[{{story_key}}] = "review"</action>
<action>将 last_updated 字段更新为当前日期</action>
<action>保存文件,保留所有注释和结构,包括 STATUS DEFINITIONS</action>
<output>✅ Story status updated to "review" in sprint-status.yaml</output>
</check>
<check if="{sprint_status} file does NOT exist OR {{current_sprint_status}} == 'no-sprint-tracking'">
<output>ℹ️ Story status updated to "review" in story file (no sprint tracking configured)</output>
</check>
<check if="story key not found in sprint status">
<output>⚠️ Story file updated, but sprint-status update failed: {{story_key}} not found
Story status is set to "review" in file, but sprint-status.yaml may be out of sync.
</output>
</check>
<action if="any task is incomplete">HALT - 在标记为可供审查之前完成剩余任务</action>
<action if="regression failures exist">HALT - 在完成之前修复回归问题</action>
<action if="File List is incomplete">HALT - 用所有已更改文件更新 File List</action>
<action if="definition-of-done validation fails">HALT - 在完成之前处理 DoD 失败项</action>
使用验证框架执行增强版 definition-of-done 检查清单
在 Dev Agent Record → Completion Notes 中准备一份简明摘要
<action>告知 {user_name} 故事实现已完成并可供审查</action>
<action>总结关键成果:故事 ID、故事键、标题、所做的主要更改、添加的测试、修改的文件</action>
<action>提供故事文件路径和当前状态(现为 "review")</action>
<action>根据 {user_skill_level},询问用户是否需要关于以下方面的任何解释:
- 实现了什么以及它如何工作
- 为什么做出某些技术决策
- 如何测试或验证这些更改
- 所使用的任何模式、库或方法
- 他们希望澄清的任何其他内容
</action>
<check if="user asks for explanations">
<action>提供针对 {user_skill_level} 量身定制的清晰、结合上下文的解释</action>
<action>在有帮助时使用示例和对特定代码的引用</action>
</check>
<action>一旦解释完成(或用户表示没有问题),建议合乎逻辑的后续步骤</action>
<action>推荐的后续步骤(根据项目设置灵活调整):
- 审查已实现的故事并测试更改
- 验证所有验收标准均已满足
- 如适用,确保部署就绪
- 运行 `code-review` 工作流以进行同行评审
- 可选:如果安装了 Test Architect 模块,运行 `/bmad:tea:automate` 以扩展护栏测试
</action>
<output>💡 **提示:** 为获得最佳效果,请使用与实现此故事所不同的 LLM 来运行 `code-review`。</output>
<check if="{sprint_status} file exists">
<action>建议检查 {sprint_status} 以查看项目进度</action>
</check>
<action>保持灵活 - 允许用户选择自己的路径或寻求其他帮助</action>
运行:uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow.on_complete — 如果解析出的值非空,请遵循它作为退出前的最终终止指令。