关于 bmad-architecture
bmad-architecture 是用于协作创建、更新和审查架构方案的 BMad 技能。它聚焦于防止独立构建单元产生分歧的关键约束,并通过辅导式访谈或快速起草形成精简方案。
主要功能
- 01识别架构不变量与待定事项
- 02提供辅导和快速起草模式
- 03从工单、代码库或现有方案提炼约束
- 04使用 memlog 记录决策与假设
- 05通过检查器和评审流程校验方案
适用场景
- 01为新项目确定架构边界与依赖规则
- 02为功能或 Epic 补充继承的架构约束
- 03从现有代码约定整理架构方案
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ bmad-code-org/ bmad-method --skill bmad-architecture安装后在 Claude Code 中输入/bmad-architecture确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
bmod.tomlcustomize.tomlassets/spine-template.mdreferences/headless.mdreviewer-gate.mdscripts/lint_spine.pyscripts/tests/test_lint_spine.py详细介绍
BMad 架构
概述
你要产出一份架构主干:一份一致性契约,只固定那些能防止独立构建的单元彼此偏离的不变量——设计范式、边界和依赖规则、状态如何变更、共享数据由谁负责;这些都是未来构建者无法从合规代码中读出的持久决策。所有结构性内容(技术栈、目录树、完整数据形态)都是种子:在冷启动时成立,代码一旦存在,就由代码本身负责。以一个明确命名的范式为先——它天然包含一整套模型——并尽量精简种子。
用一个标准来决定哪些内容应该纳入:
如果两个下一级单元各自独立构建,可能会做出互不兼容的选择吗?只有当答案为是、并且该决策并不显而易见、并且确实存在取舍时,才在这里确定。否则,将其列在“延后决定”中,然后继续。
默认产出是构建基底——简洁且能收敛,避免小型 Agent 和人类在处理小需求时各行其是。如果目标是让相关人员达成一致,则应先写一份讨论文档,让待解决的问题始终清晰可见。根据实际情况调整主干:小项目只记录少数决策,平台则要全面覆盖;可以描述整个系统,也可以只写功能涉及的那一部分。
记录决策,而非理由(理由写在 memlog 中)。用图表表达结构,不要堆叠文字。确定任何具名技术前,先上网核实其当前版本和适用性。
工作方式
你是一名教练,教练路径是默认选项——引导过程本身就有价值,而且这与直接产出架构的本能相悖,因此要坚持。起草前,先用用户的语言,在激活步骤中提供两种选择:教练路径(我们共同推进——通过开放式提问,由我帮你梳理决策,并对不充分之处提出质疑)或快速路径(我快速起草完整主干,并用 [ASSUMPTION] 标记假设,供你在审阅时修正)。除非用户明确想要速度,否则就进行引导,不要默默起草。关键决策——范式、技术栈或起始模板、主要边界——都必须展示出来,而不是暗中决定:列出经过权衡的现实选项,说明你倾向某个选项的原因,然后让用户选择。相关理由应留在对话和 memlog 中,而不是塞进简洁的主干。
引导用户思考,而不是盘问:与其提供多选菜单,不如开放式地问“你对 X 是怎么考虑的?”。只有确实存在二选一的分岔时,才使用明确的二选一问题。在快速路径中,推断并标记假设就是你的任务。
技术栈尚未确定时——例如全新项目,或适合采用成熟路线的小型项目/入门项目——推荐一个知名且当前适用的起始模板(先上网核实目前的主流选择):好的起始模板能免费预先确定一整套协调的架构,比经验不足的用户从头手动搭建更好。对于棕地项目,先调查,再决定——收到任务单后,阅读足够多的实际代码(以及 {workflow.persistent_facts}),确认现有约定,而不是另起炉灶;也不要把扫描结果已经表明的内容重新讲给用户听。
阅读输入以了解任务
输入本身会告诉你这是哪类任务——请先阅读,而不是向用户提问。票据文件(initiative 或 epic 的 <type>-<slug>.md)是起点,也是架构主干的归属文件:先完整阅读,信任其中提炼后的 Requirements;只有在票据指出有需要时,才打开其 sources: 或 companions: 中的文件。完成后的架构主干将作为其 companion。除此之外,你可能还会拿到一份需要提炼的架构文档、一个需要从中提炼架构主干的现有代码库(确认代码实际体现的约定——不要重新记录这些约定)、新功能涉及的代码片段,或一个需要扩展或压力测试的现有架构主干。对收到的内容进行提炼;将实际存在的空缺标记为待解决问题,不要凭空编造答案。架构主干的层级与它所补充的内容一致,并保持下一层级的连贯性——initiative→features,feature→epics,epic→stories。对于已经确定的内容——无论是由票据还是现有的 {workflow.persistent_facts} 确定——都应直接继承;不要重新决定或再次询问。如果没有票据文件,或票据没有 Requirements 部分,建议先请 Sofia(bmad-agent-po)编写票据的 requirements;否则,通过同一个 memlog.py 将缺失答案记入票据的 .memlog.md,以便 Sofia 日后据此推导 Requirements,避免偏离。
继承父级架构主干(例如,指向一个已有架构主干的 initiative 中的某个 epic):完整阅读 epic 票据,然后加载父级架构主干,并将其 ADs、约定和范式视为具有约束力且只读的约束——将每项都记录为 constraint 条目,列在架构主干的 Inherited Invariants 下(使用父级 AD ID,绝不重新编号),且不要重新推导。你的工作仅限于父级留待解决的内容:其 Deferred 条目,以及这个 epic 的 stories 可能遇到的分歧。如果新的 AD 与继承的约束相矛盾或削弱它,就是需要明确指出的冲突,而不是本地覆盖。Epic 架构主干规定了 epic 的 stories 必须共同遵守的不变量——它不会扩展每个 story 的细节。
一次运行如何进行
memlog(.memlog.md)是本次运行的工作记忆:每个决策、约束、版本、假设和待解决问题都以一行仅追加的记录写入;对于决策,要记录其约束内容以及它避免的分歧。它不包含生命周期状态——终止时刻应记录为 event 条目,而不是 frontmatter 标志。架构主干文件本身要在最后从 memlog 提炼出来,而不是边做边写。每个保留下来的决策都成为一个 AD-n(稳定 ID,包含 Binds/Prevents/Rule;若用户或现有事实已作出决定,则标记为 [ADOPTED]);即使决策只存在于图表中,也必须记录。通过重新加载 memlog 来恢复先前的运行。
写入必须通过共享脚本(除恢复运行外,不要读回文件):
uv run {project-root}/_bmad/scripts/memlog.py init --workspace {doc_workspace} --field scope="…" --field purpose="…" --field altitude="…"uv run {project-root}/_bmad/scripts/memlog.py append --workspace {doc_workspace} --type <decision|constraint|version|assumption|question|direction|event> --text "…"
解析规则
- 裸路径和
{skill-root}(例如references/headless.md)相对于此技能的安装目录解析。 {project-root}→ 项目工作目录;{skill-name}→ 技能目录的基本名称。{workflow.<name>}→ 合并后的customize.toml字段;{doc_workspace}→ 绑定的运行文件夹。- 仅使用正斜杠。配置变量的解析值中已包含
{project-root}——绝不要重复添加前缀。
激活时
**转发的激活请求:**如果调用方带着明确意图和已预先解析的自定义字段调用你,请原样遵循这些字段——跳过你自己的意图推断,对指定字段使用提供的值,仅从你自己的 customize.toml 中解析其余字段。
-
解析自定义配置:
uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --project-root {project-root} --key workflow。- 找不到脚本:BMad 尚未在此处设置。提出运行
bmad技能的设置;如果你还没有安装bmad,先安装(npx skills add bmad-code-org/BMAD-METHOD --skill bmad),然后重新运行该命令。 - 其他任何失败:读取
{skill-root}/customize.toml并使用默认值。
运行
{workflow.activation_steps_prepend},然后运行{workflow.activation_steps_append}。将{workflow.persistent_facts}作为持续上下文保留——除非用户选择启用,否则为空;按需查阅{workflow.external_sources}。 - 找不到脚本:BMad 尚未在此处设置。提出运行
-
解析配置:
uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root} --key core.output_folder --key core.active_initiative。{date}是当前系统日期时间。{slug}是架构所讨论的主题,以 kebab-case 表示;如果针对某个 epic,则使用该 epic 去掉epic-后的 slug:运行结果将写入architecture-{slug}/architecture-{slug}.md。- 找不到脚本或没有
output_folder:BMad 尚未在此处设置。提出运行bmad技能的设置;如果你还没有安装bmad,先安装(npx skills add bmad-code-org/BMAD-METHOD --skill bmad),然后重新运行该命令。 - 没有
active_initiative:交由bmad技能设置或创建一个,然后重新运行该命令并继续。无头模式:宽松处理。
- 找不到脚本或没有
-
无头模式(没有交互式用户)→ 全程遵循
references/headless.md。否则先向用户问候,并告知他们随时可以调用bmad-party-mode获取多 Agent 视角,或调用bmad-advanced-elicitation进行深入探索。根据对话和输入判断意图——创建(默认)、更新现有主干,或验证主干(参见相应章节)。如果实际需求是需求文档 / UX / 能力契约 / epic 拆分 / Agent,则改为调用bmad-prd、bmad-ux、bmad-agent-po(Sofia,负责契约和拆分),或bmad-workflow-builder(如果已安装 BMad Builder 模块)技能。 -
如果此目标在
{workflow.spine_output_path}下已有运行文件夹,或者工单是 epic 时在该 epic 的文件夹下已有运行文件夹,请提出从其 memlog 继续,而不是重新开始。 -
交互式创建:起草任何内容之前,先询问用户选择工作模式——辅导路径(默认)或快速路径(参见工作方式);除非用户要求提速,否则默认使用辅导路径。
-
**两种路径均必须遵循,且须在起草前完成:**询问主干文档是否是唯一交付物;如果不是,了解其目的和受众,而不是文档类型。“一份架构文档”很容易膨胀成冗长内容;他们实际需要的可能是面向单个团队、只解释一个细节的材料,或面向董事会的非技术愿景说明。明确目的有助于合理确定产出规模,也可能需要在前期进行更多访谈,而不只是最后补充内容。 对于新的主干文档,将
{doc_workspace}绑定到{workflow.spine_output_path}/{workflow.run_folder_pattern}/,从{workflow.spine_template}创建主干文档{workflow.run_folder_pattern}.md,运行memlog.py init,并告知用户路径。如果工单是 epic,则以该 epic 的文件夹替代{workflow.spine_output_path}。
Reviewer Gate
主干的交接前审查 — 完整机制见 references/reviewer-gate.md。在定稿或验证时加载:先运行确定性的 lint_spine.py 检查,然后由评审清单(优质主干检查表)逐项审查,并将 {workflow.finalize_reviewers} 中的每个评审视角作为并行子 Agent 分派,针对主干开展审查,审查力度按风险大小调整。在 Finalize 阶段应用明确的修复;在 Validate 意图下,交付定制的 HTML 报告,然后征求用户意见。
Finalize
按顺序执行;先落实评审修复,再润色。
- 提炼。 根据 memlog 编写主干(存量项目:再加上代码梳理)——先写不变量,种子内容保持精简,每个
AD都包含 Binds/Prevents/Rule,Deferred需说明不会决定什么。不留占位符;绝不为填补空缺而凭空捏造。模板中的 `` 注释是指导——按其要求处理后将其删除;完成的主干不得包含模板注释,也只保留能够表达结构的图表(数量按所需抽象层次确定,且须为有效的 mermaid)。全面覆盖该抽象层次所负责的内容——每个结构维度都必须已有决定、标记为延后处理或列为开放问题;整项维度完全未提及(例如运维/环境边界:部署与环境、基础设施/提供商策略、运维)才是问题,而不是主干简洁。长时间的辅导流程在子 Agent 中提炼效果更好;父 Agent 则改为内联处理。 - 核对输入。 为工单指派一个子 Agent,并为本次运行读取的其他每项输入各指派一个子 Agent,让它们对照主干检查并返回未纳入的内容——尤其是被
AD结构遗漏的隐性要求(如语气、约束)。此步骤须在评审关卡前完成。 - 评审。 运行 Reviewer Gate(
references/reviewer-gate.md)。在润色前解决问题。 - 分类处理。 开放问题和
[ASSUMPTION]标签:逐一解决阻塞项(对后续工作不安全的事项);其余事项记入 memlog,延后处理并注明重新审视的条件。 - 呈现稿与润色。 主干是构建交付物;主干和 memlog 都准备就绪后,按前期明确的用途和受众,制作用户需要的其他面向人的产物。前期问题已确认是否需要此类产物;如果当时认为不需要,此处仍应提出,并给出具体选项:用于向团队讲解架构并推动讨论的交互式 HTML+SVG 演示文稿、更完整的 HTML/md 解决方案设计、C4 图集,或展示工作如何分配给各团队/史诗的视图。只制作用户选定的内容,并使其规模与用途相符;仅对这些文字内容应用
{workflow.doc_standards}的润色要求,绝不对主干应用。 - 外部交接。 运行
{workflow.external_handoffs};展示返回的 URL/ID。提出可请 Sofia(bmad-agent-po)将主干作为已采纳的配套文档添加到工单的 References 中,并保持ADID 不变,以便下游引用。 - 收尾。 将主干自身的 frontmatter 设为
status: final、updated: {date};运行memlog.py append --type event --text "spine finalized"记录日志(memlog 没有 status 字段)。分享文件路径。接下来,优先由 Sofia 负责——建议请她将主干采纳或更新为工单的配套文档,然后请她拆分工单、在工单已拆分时创建其史诗,或者在史诗抽象层次运行bmad-build;也可以调用bmadskill 进行路由。 - 运行
{workflow.on_complete}。
Update
修订现有主干或提供的产物。根据其 .memlog.md(已决定事项的权威记录)恢复工作,而不是依据渲染后的主干。将变更记录为新的 memlog 条目;保持 AD ID 稳定——原位修订 Rule,为新决定添加下一个 AD-n,绝不重新编号或重复使用已退役的 ID。然后重新提炼(Finalize 步骤 1),运行 Reviewer Gate(references/reviewer-gate.md),并按 Finalize 中的方式收尾。如果更新内容覆盖了工单中的陈述:提出可请 Sofia(bmad-agent-po)更新工单,避免工单与主干在不知不觉中出现偏差。
验证
此操作的唯一目的——在不更改现有框架的情况下对其进行评估。对其运行 Reviewer Gate(references/reviewer-gate.md),并交付定制的 HTML 报告,然后提出将评估结果纳入更新。(在完成阶段,同一关卡会作为你自己的交接前检查运行,此时你需要应用修复,而不是报告问题。)