BMAD-METHOD 学习教程

BMAD-METHOD 学习教程

目录

  1. 快速入门
  2. Agent 命令详解
  3. 实战案例:构建 Todo CLI
  4. 进阶用法
  5. 最佳实践
  6. 故障排除

一、快速入门

1.1 环境准备

系统要求: - Node.js 18.0 或更高版本 - npm 9.0 或更高版本 - Git

推荐工具(任选其一): - Claude Code CLI - Cursor IDE - Windsurf IDE - VS Code + Cline/RooCode 扩展

1.2 安装 BMAD-METHOD

方式一:交互式安装

# 创建项目目录
mkdir my-project
cd my-project

# 运行安装命令
npx bmad-method install

安装过程会询问: 1. 选择安装目录(默认当前目录) 2. 选择模块(推荐新手选 BMM) 3. 选择工具(根据你使用的 IDE 选择)

方式二:命令行安装

# 快速安装(使用默认配置)
npx bmad-method install --directory ./my-project --modules bmm --tools claude-code --yes

1.3 验证安装

# 查看项目结构
ls -la

# 应该看到以下目录
# .bmad-core/  - BMAD 核心文件
# docs/        - 文档目录
# src/         - 源代码目录

1.4 第一个 BMAD 项目

Step 1:启动需求分析

在你的 IDE 或 Claude Code 中输入:

/analyst

然后描述你的项目需求:

我需要开发一个命令行待办事项管理工具,主要功能包括:
1. 添加待办事项
2. 列出所有待办事项
3. 标记完成
4. 删除待办事项

Step 2:生成 PRD

/pm

PM Agent 会基于 Analyst 的输出生成 PRD 文档。

Step 3:设计架构

/architect

Architect Agent 会设计系统架构和技术选型。

Step 4:拆分任务

/sm

Scrum Master Agent 会将功能拆分为可执行的 Story。

Step 5:开始开发

/dev story 1.1

Developer Agent 会开始实现第一个 Story。


二、Agent 命令详解

2.1 Analyst(业务分析师)

命令/analyst

职责: - 收集和分析业务需求 - 识别用户痛点和机会 - 定义业务目标和成功指标 - 输出需求分析文档

使用示例

/analyst

我正在开发一个电商网站,目标用户是小型商家。
他们需要一个简单的库存管理系统。
主要痛点是:
1. 手动记录容易出错
2. 库存预警不及时
3. 多渠道销售难以同步

输出: - 业务需求文档(保存到 docs/requirements.md) - 用户画像 - 业务流程图

2.2 PM(产品经理)

命令/pm

职责: - 编写产品需求文档(PRD) - 定义功能规格 - 设定优先级 - 规划发布路线图

使用示例

/pm

基于之前的分析,请帮我编写 PRD。
MVP 版本只需要核心功能。

输出: - PRD 文档(保存到 docs/prd.md) - 功能清单 - 优先级矩阵

2.3 Architect(架构师)

命令/architect

职责: - 设计系统架构 - 选择技术栈 - 定义数据模型 - 设计 API 接口 - 规划部署架构

使用示例

/architect

技术要求:
- 后端使用 Python FastAPI
- 数据库使用 PostgreSQL
- 前端使用 React
- 需要支持水平扩展

输出: - 架构设计文档(保存到 docs/architecture.md) - 数据模型 - API 设计 - 技术选型说明

2.4 Scrum Master(敏捷教练)

命令/sm

职责: - 将功能拆分为 Epic 和 Story - 估算工作量 - 安排迭代计划 - 跟踪进度

使用示例

/sm

请将 PRD 中的功能拆分为 Story。
每个 Story 应该能在 1-2 天内完成。

输出: - Story 文件(保存到 docs/stories/) - 迭代计划 - 依赖关系图

2.5 Developer(开发者)

命令/dev

职责: - 实现 Story 中定义的功能 - 编写代码 - 编写单元测试 - 代码重构

使用示例

# 开始实现特定 Story
/dev story 1.1

# 或者让 AI 选择下一个待处理的 Story
/dev next

工作流程: 1. 加载 Story 上下文 2. 加载相关架构文档 3. 实现代码 4. 编写测试 5. 更新 Story 状态

2.6 QA(测试工程师)

命令/qa

职责: - 设计测试用例 - 执行测试 - 报告缺陷 - 验证修复

使用示例

# 测试特定 Story
/qa story 1.1

# 运行所有测试
/qa all

2.7 其他 Agent

UX Designer/ux

/ux

请设计用户注册流程的交互。
需要考虑:
- 表单验证反馈
- 错误处理
- 成功状态

Product Owner/po

/po

验收 Story 1.1 的实现。
检查是否满足验收标准。

三、实战案例:构建 Todo CLI

3.1 项目初始化

# 创建项目
mkdir todo-cli
cd todo-cli

# 初始化 Git
git init

# 安装 BMAD
npx bmad-method install --modules bmm --tools claude-code --yes

3.2 Phase 1: Agentic Planning

Step 1: 需求分析

/analyst

项目名称:Todo CLI
项目描述:命令行待办事项管理工具

目标用户:
- 开发者
- 命令行爱好者
- 需要快速记录任务的用户

核心功能:
1. 添加任务(add)
2. 列出任务(list)
3. 完成任务(done)
4. 删除任务(delete)
5. 清空已完成任务(clear)

非功能需求:
- 响应时间 < 100ms
- 支持离线使用
- 数据本地存储

Step 2: 编写 PRD

/pm

基于需求分析,编写 PRD。

MVP 范围:
- 仅实现核心 CRUD 功能
- 使用 JSON 文件存储
- 单用户模式

暂不包含:
- 多用户支持
- 云同步
- 提醒功能

Step 3: 架构设计

/architect

技术栈:
- 语言:Python 3.10+
- CLI 框架:Click
- 存储:JSON 文件
- 测试:pytest

项目结构:
todo-cli/
├── todo/
│   ├── __init__.py
│   ├── cli.py       # CLI 入口
│   ├── models.py    # 数据模型
│   ├── storage.py   # 存储层
│   └── commands/    # 命令实现
│       ├── add.py
│       ├── list.py
│       ├── done.py
│       └── delete.py
├── tests/
├── pyproject.toml
└── README.md

Step 4: 任务拆分

/sm

请将功能拆分为 Story,每个 Story 应该:
- 独立可测试
- 1-2 小时完成
- 有明确的验收标准

预期的 Story 列表:

Story 描述 预估
1.1 项目初始化和基础结构 1h
1.2 数据模型和存储层 1h
2.1 实现 add 命令 1h
2.2 实现 list 命令 0.5h
2.3 实现 done 命令 0.5h
2.4 实现 delete 命令 0.5h
3.1 单元测试 1h
3.2 文档和发布 0.5h

3.3 Phase 2: Context-Engineered Development

Story 1.1: 项目初始化

/dev story 1.1

实现项目初始化:
1. 创建 pyproject.toml
2. 设置项目结构
3. 配置 Click 入口

预期输出:

# pyproject.toml
[project]
name = "todo-cli"
version = "0.1.0"
requires-python = ">=3.10"
dependencies = ["click>=8.0"]

[project.scripts]
todo = "todo.cli:main"

# todo/cli.py
import click

@click.group()
def main():
    """Todo CLI - 命令行待办事项管理"""
    pass

if __name__ == "__main__":
    main()

Story 1.2: 数据模型和存储层

/dev story 1.2

实现数据模型和存储:
1. Todo 数据类
2. JSON 文件存储
3. CRUD 操作

预期输出:

# todo/models.py
from dataclasses import dataclass, asdict
from datetime import datetime
from typing import Optional
import json

@dataclass
class Todo:
    id: int
    title: str
    completed: bool = False
    created_at: str = ""

    def __post_init__(self):
        if not self.created_at:
            self.created_at = datetime.now().isoformat()

    def to_dict(self):
        return asdict(self)

# todo/storage.py
import json
from pathlib import Path
from typing import List, Optional
from .models import Todo

class TodoStorage:
    def __init__(self, file_path: str = "~/.todos.json"):
        self.file_path = Path(file_path).expanduser()

    def load_all(self) -> List[Todo]:
        if not self.file_path.exists():
            return []
        with open(self.file_path) as f:
            data = json.load(f)
        return [Todo(**item) for item in data]

    def save_all(self, todos: List[Todo]):
        with open(self.file_path, 'w') as f:
            json.dump([t.to_dict() for t in todos], f, indent=2)

    def add(self, title: str) -> Todo:
        todos = self.load_all()
        new_id = max([t.id for t in todos], default=0) + 1
        todo = Todo(id=new_id, title=title)
        todos.append(todo)
        self.save_all(todos)
        return todo

    def get(self, todo_id: int) -> Optional[Todo]:
        todos = self.load_all()
        for todo in todos:
            if todo.id == todo_id:
                return todo
        return None

    def update(self, todo_id: int, **kwargs) -> Optional[Todo]:
        todos = self.load_all()
        for i, todo in enumerate(todos):
            if todo.id == todo_id:
                for key, value in kwargs.items():
                    setattr(todo, key, value)
                self.save_all(todos)
                return todo
        return None

    def delete(self, todo_id: int) -> bool:
        todos = self.load_all()
        for i, todo in enumerate(todos):
            if todo.id == todo_id:
                todos.pop(i)
                self.save_all(todos)
                return True
        return False

Story 2.1-2.4: 实现命令

/dev story 2.1

实现 add 命令

预期输出:

# todo/commands/add.py
import click
from ..storage import TodoStorage

@click.command()
@click.argument('title')
def add(title: str):
    """添加新任务"""
    storage = TodoStorage()
    todo = storage.add(title)
    click.echo(f"✓ 已添加任务 #{todo.id}: {title}")

# 在 cli.py 中注册
from .commands.add import add
main.add_command(add)
/dev story 2.2

实现 list 命令

预期输出:

# todo/commands/list.py
import click
from ..storage import TodoStorage

@click.command()
@click.option('--all', '-a', 'show_all', is_flag=True, help='显示所有任务')
def list_cmd(show_all: bool):
    """列出任务"""
    storage = TodoStorage()
    todos = storage.load_all()

    if not todos:
        click.echo("暂无任务")
        return

    for todo in todos:
        status = "✓" if todo.completed else " "
        if show_all or not todo.completed:
            click.echo(f"[{status}] #{todo.id}: {todo.title}")

测试每个 Story

/qa story 1.1
/qa story 1.2
/qa story 2.1

3.4 完整的项目结构

todo-cli/
├── .bmad-core/
│   └── agents/
├── docs/
│   ├── prd.md
│   ├── architecture.md
│   └── stories/
│       ├── 1.1.project-init.md
│       ├── 1.2.models-storage.md
│       ├── 2.1.cmd-add.md
│       ├── 2.2.cmd-list.md
│       ├── 2.3.cmd-done.md
│       └── 2.4.cmd-delete.md
├── todo/
│   ├── __init__.py
│   ├── cli.py
│   ├── models.py
│   ├── storage.py
│   └── commands/
│       ├── __init__.py
│       ├── add.py
│       ├── list.py
│       ├── done.py
│       └── delete.py
├── tests/
│   ├── __init__.py
│   ├── test_models.py
│   └── test_storage.py
├── pyproject.toml
└── README.md

3.5 使用项目

# 安装
pip install -e .

# 添加任务
todo add "学习 BMAD-METHOD"
todo add "完成项目文档"

# 列出任务
todo list

# 完成任务
todo done 1

# 删除任务
todo delete 2

四、进阶用法

4.1 自定义 Agent

创建自定义 Agent 以适应特定需求:

Step 1: 创建 Agent 文件

# .bmad-core/agents/security-reviewer.md

## Role
Security Reviewer - 安全审查专家

## Responsibilities
- 审查代码安全漏洞
- 检查认证授权实现
- 识别潜在的安全风险
- 提供安全改进建议

## Skills
- OWASP Top 10 知识
- 代码审计经验
- 安全测试方法论

## Interaction
- 在 /dev 完成实现后调用
- 输出到 docs/security-review/

## Commands
/security - 启动安全审查

Step 2: 使用自定义 Agent

/security

请审查 Story 2.1 的实现,关注:
1. 输入验证
2. 注入攻击防护
3. 数据安全

4.2 多模块组合

组合多个模块以适应复杂项目:

# 安装 BMM + TEA
npx bmad-method install --modules bmm,tea --tools claude-code --yes

使用 TEA 模块进行测试驱动开发:

# 先写测试
/tea design auth-feature

# 再实现
/dev story 1.1

# 验证测试
/tea verify auth-feature

4.3 Document Sharding 实践

对于大型项目,拆分文档:

docs/
├── architecture/
│   ├── 00-overview.md
│   ├── 01-frontend.md
│   ├── 02-backend.md
│   ├── 03-database.md
│   └── 04-deployment.md
├── prd/
│   ├── 00-overview.md
│   ├── 01-user-management/
│   │   ├── auth.md
│   │   └── profile.md
│   └── 02-product-catalog/
│       ├── browse.md
│       └── search.md
└── stories/
    ├── epic-1-user-management/
    │   ├── 1.1.user-registration.md
    │   ├── 1.2.user-login.md
    │   └── 1.3.password-reset.md
    └── epic-2-product-catalog/
        ├── 2.1.product-list.md
        └── 2.2.product-search.md

4.4 CI/CD 集成

在 CI/CD 流程中使用 BMAD:

# .github/workflows/bmad-check.yml
name: BMAD Check

on: [pull_request]

jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install BMAD
        run: npm install -g bmad-method

      - name: Verify Stories
        run: |
          # 检查所有已完成的 Story 是否有对应的测试
          npx bmad-method verify --all-stories

五、最佳实践

5.1 Story 编写规范

好的 Story

# Story 1.1: User Registration

## Context
- Epic: User Management
- Priority: High
- Dependencies: None

## User Story
As a new user, I want to register with my email,
so that I can access the system.

## Acceptance Criteria
- [ ] User can register with email and password
- [ ] Email must be valid format
- [ ] Password must be at least 8 characters
- [ ] Duplicate emails are rejected with clear message
- [ ] Success registration shows confirmation

## Technical Notes
- Use bcrypt for password hashing
- Validate email with regex
- Store user in users table

## Definition of Done
- [ ] Code implemented
- [ ] Unit tests passing
- [ ] Code reviewed
- [ ] Documentation updated

不好的 Story

# Story 1.1: User Registration

实现用户注册功能。

5.2 上下文管理

原则: 1. 每次只加载必要的上下文 2. 定期归档已完成的 Story 3. 保持架构文档更新 4. 使用引用而非复制

示例

# 在 Story 中引用架构

## References
- Architecture: docs/architecture/02-backend.md#authentication
- PRD: docs/prd/01-user-management/auth.md
- Related Story: 1.0 (User Model)

5.3 迭代工作流

┌─────────────────────────────────────────────────────┐
│                    迭代周期                         │
│                                                     │
│  Day 1: Planning                                    │
│  ├── /analyst - 收集新需求                          │
│  ├── /pm - 更新 PRD                                 │
│  └── /sm - 拆分新 Story                             │
│                                                     │
│  Day 2-4: Development                               │
│  ├── /dev story X.X - 实现                          │
│  ├── /qa story X.X - 测试                           │
│  └── 重复直到完成所有 Story                          │
│                                                     │
│  Day 5: Review & Deploy                             │
│  ├── /po - 验收                                     │
│  ├── 部署到测试环境                                  │
│  └── 准备下一迭代                                    │
└─────────────────────────────────────────────────────┘

5.4 常见陷阱

  1. 过度规划
  2. 问题:规划阶段花费太多时间
  3. 解决:MVP 优先,迭代改进

  4. 上下文膨胀

  5. 问题:加载太多文档导致效率降低
  6. 解决:使用 Document Sharding,只加载必要的

  7. 忽略测试

  8. 问题:跳过 QA 步骤
  9. 解决:每个 Story 必须通过测试

  10. 文档不一致

  11. 问题:代码更新但文档未更新
  12. 解决:每次迭代结束时同步更新

六、故障排除

6.1 常见错误

错误:找不到 Agent 命令

Error: Unknown command '/analyst'

解决方案: 1. 确认 BMAD 已正确安装 2. 检查 .bmad-core/agents/ 目录存在 3. 确认使用的工具支持 BMAD

错误:上下文超长

Error: Context length exceeded

解决方案: 1. 使用 Document Sharding 拆分文档 2. 减少加载的文档数量 3. 归档已完成的 Story

错误:Story 依赖冲突

Error: Story 2.1 depends on incomplete Story 1.3

解决方案: 1. 先完成依赖的 Story 2. 或者更新依赖关系

6.2 调试技巧

查看当前状态

# 查看所有 Story 状态
cat docs/stories/status.json

# 查看项目结构
tree docs/

重置 Story 状态

# 重置特定 Story
echo '{"status": "pending"}' > docs/stories/1.1.status.json

清理并重新开始

# 备份当前进度
cp -r docs docs.backup

# 重新初始化
rm -rf docs
npx bmad-method install --modules bmm --tools claude-code --yes

6.3 获取帮助

  • GitHub Issues: https://github.com/bmad-code-org/BMAD-METHOD/issues
  • GitHub Discussions: https://github.com/bmad-code-org/BMAD-METHOD/discussions
  • 官方文档: https://docs.bmad-method.org/

附录:命令速查表

命令 用途 示例
/analyst 启动业务分析师 /analyst
/pm 启动产品经理 /pm
/architect 启动架构师 /architect
/sm 启动敏捷教练 /sm
/dev 启动开发者 /dev story 1.1
/qa 启动测试工程师 /qa story 1.1
/ux 启动 UX 设计师 /ux
/po 启动产品负责人 /po

教程生成时间:2026-03-21