Compare commits
5 Commits
e2c41e61d4
...
950400e5f8
| Author | SHA1 | Date |
|---|---|---|
|
|
950400e5f8 | |
|
|
8bdf21f65b | |
|
|
7d63dcd6a0 | |
|
|
999ece33a9 | |
|
|
cd3885f1e2 |
46
README.md
46
README.md
|
|
@ -5,7 +5,7 @@
|
|||
[](https://nodejs.org)
|
||||
[](https://discord.gg/gk8jAdXWmj)
|
||||
|
||||
**Build More, Architect Dreams** — An AI-driven agile development framework with 21 specialized agents, 50+ guided workflows, and scale-adaptive intelligence that adjusts from bug fixes to enterprise systems.
|
||||
**Breakthrough Method of Agile AI Driven Development** — An AI-driven agile development framework with 21 specialized agents, 50+ guided workflows, and scale-adaptive intelligence that adjusts from bug fixes to enterprise systems.
|
||||
|
||||
**100% free and open source.** No paywalls. No gated content. No gated Discord. We believe in empowering everyone, not just those who can pay.
|
||||
|
||||
|
|
@ -16,6 +16,7 @@ Traditional AI tools do the thinking for you, producing average results. BMad ag
|
|||
- **Scale-Adaptive**: Automatically adjusts planning depth based on project complexity (Level 0-4)
|
||||
- **Structured Workflows**: Grounded in agile best practices across analysis, planning, architecture, and implementation
|
||||
- **Specialized Agents**: 12+ domain experts (PM, Architect, Developer, UX, Scrum Master, and more)
|
||||
- **Party Mode**: Bring multiple agent personas into one session to plan, troubleshoot, or discuss your project collaboratively
|
||||
- **Complete Lifecycle**: From brainstorming to deployment, with just-in-time documentation
|
||||
|
||||
## Quick Start
|
||||
|
|
@ -26,34 +27,43 @@ Traditional AI tools do the thinking for you, producing average results. BMad ag
|
|||
npx bmad-method@alpha install
|
||||
```
|
||||
|
||||
Follow the installer prompts to configure your project.
|
||||
Follow the installer prompts, then open your AI IDE (Claude Code, Cursor, Windsurf, etc.) in the project folder.
|
||||
|
||||
Once you have installed BMad to a folder, launch your tool of choice from where you installed BMad. (We really like Claude Code and Cursor - but there are any that work great with BMad!)
|
||||
> **Not sure what to do?** Run `/bmad-help` — it tells you exactly what's next and what's optional. You can also ask it questions like `/bmad-help How should I build a web app for XYZ?`
|
||||
|
||||
Then its simple as running the command: `/bmad-help` if you do not know what to do. Depending on which modules you have installed, you will have different choices.
|
||||
The workflows below show the fastest path to working code. You can also load agents directly for a more structured process, extensive planning, or to learn about agile development practices — the agents guide you with menus, explanations, and elicitation at each step.
|
||||
|
||||
To make the help more applicable you can even run the `/bmad-help What do you suggest I do to get started building a brand new web application for XYZ`.
|
||||
### Simple Path (Quick Flow)
|
||||
|
||||
The results from BMad Help will be able to suggest and constantly guide you on what to do next - along with the workflows upon completion also making suggestions on what to do next.
|
||||
Bug fixes, small features, clear scope — 3 commands:
|
||||
|
||||
This analyzes your project and recommends a track:
|
||||
1. `/quick-spec` — analyzes your codebase and produces a tech-spec with stories
|
||||
2. `/dev-story` — implements each story
|
||||
3. `/code-review` — validates quality
|
||||
|
||||
| Track | Best For | Time to First Story Coding |
|
||||
| --------------- | ------------------------- | -------------------------- |
|
||||
| **Quick Flow** | Bug fixes, small features | ~10-30 minutes |
|
||||
| **BMad Method** | Products and platforms | ~30 minutes - 2 hours |
|
||||
| **Enterprise** | Compliance-heavy systems | ~1-3 hours |
|
||||
### Full Planning Path (BMad Method)
|
||||
|
||||
Products, platforms, complex features — structured planning then build:
|
||||
|
||||
1. `/product-brief` — define problem, users, and MVP scope
|
||||
2. `/create-prd` — full requirements with personas, metrics, and risks
|
||||
3. `/create-architecture` — technical decisions and system design
|
||||
4. `/create-epics-and-stories` — break work into prioritized stories
|
||||
5. `/sprint-planning` — initialize sprint tracking
|
||||
6. **Repeat per story:** `/create-story` → `/dev-story` → `/code-review`
|
||||
|
||||
Every step tells you what's next. Optional phases (brainstorming, research, UX design) are available when you need them — ask `/bmad-help` anytime. For a detailed walkthrough, see the [Getting Started Tutorial](http://docs.bmad-method.org/tutorials/getting-started/getting-started-bmadv6/).
|
||||
|
||||
## Modules
|
||||
|
||||
BMad Method extends with official modules for specialized domains. Modules are available during installation and can be added to your project at any time.
|
||||
|
||||
| Module | GitHub | NPM | Purpose |
|
||||
|--------|--------|-----|---------|
|
||||
| **BMad Method (BMM)** | [bmad-code-org/BMAD-METHOD](https://github.com/bmad-code-org/BMAD-METHOD) | [bmad-method](https://www.npmjs.com/package/bmad-method) | Core framework with 34+ workflows across 4 development phases |
|
||||
| **BMad Builder (BMB)** | [bmad-code-org/bmad-builder](https://github.com/bmad-code-org/bmad-builder) | [bmad-builder](https://www.npmjs.com/package/bmad-builder) | Create custom BMad agents, workflows, and domain-specific modules |
|
||||
| **Game Dev Studio (BMGD)** | [bmad-code-org/bmad-module-game-dev-studio](https://github.com/bmad-code-org/bmad-module-game-dev-studio) | [bmad-game-dev-studio](https://www.npmjs.com/package/bmad-game-dev-studio) | Game development workflows for Unity, Unreal, and Godot |
|
||||
| **Creative Intelligence Suite (CIS)** | [bmad-code-org/bmad-module-creative-intelligence-suite](https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite) | [bmad-creative-intelligence-suite](https://www.npmjs.com/package/bmad-creative-intelligence-suite) | Innovation, brainstorming, design thinking, and problem-solving |
|
||||
| Module | GitHub | NPM | Purpose |
|
||||
| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
|
||||
| **BMad Method (BMM)** | [bmad-code-org/BMAD-METHOD](https://github.com/bmad-code-org/BMAD-METHOD) | [bmad-method](https://www.npmjs.com/package/bmad-method) | Core framework with 34+ workflows across 4 development phases |
|
||||
| **BMad Builder (BMB)** | [bmad-code-org/bmad-builder](https://github.com/bmad-code-org/bmad-builder) | [bmad-builder](https://www.npmjs.com/package/bmad-builder) | Create custom BMad agents, workflows, and domain-specific modules |
|
||||
| **Game Dev Studio (BMGD)** | [bmad-code-org/bmad-module-game-dev-studio](https://github.com/bmad-code-org/bmad-module-game-dev-studio) | [bmad-game-dev-studio](https://www.npmjs.com/package/bmad-game-dev-studio) | Game development workflows for Unity, Unreal, and Godot |
|
||||
| **Creative Intelligence Suite (CIS)** | [bmad-code-org/bmad-module-creative-intelligence-suite](https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite) | [bmad-creative-intelligence-suite](https://www.npmjs.com/package/bmad-creative-intelligence-suite) | Innovation, brainstorming, design thinking, and problem-solving |
|
||||
|
||||
## Documentation
|
||||
|
||||
|
|
|
|||
|
|
@ -381,7 +381,7 @@ test('complete user flow', async ({ page }) => {
|
|||
test('should register new user', async ({ page }) => {
|
||||
await page.goto('/register');
|
||||
await page.fill('#email', 'test@example.com');
|
||||
await page.fill('#password', 'password123');
|
||||
await page.fill('#password', env.goodpassword);
|
||||
await page.click('button[type="submit"]');
|
||||
|
||||
await expect(page).toHaveURL('/welcome');
|
||||
|
|
@ -653,7 +653,7 @@ test('should login with valid credentials and redirect to dashboard', async ({ p
|
|||
|
||||
await page.goto('/login');
|
||||
await page.getByLabel('Email').fill('test@example.com');
|
||||
await page.getByLabel('Password').fill('password123');
|
||||
await page.getByLabel('Password').fill(env.goodpassword);
|
||||
await page.getByRole('button', { name: 'Sign in' }).click();
|
||||
|
||||
// Wait for actual API response
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ test('should edit and save profile', async ({ page }) => {
|
|||
// Login first
|
||||
await page.goto('/login');
|
||||
await page.getByLabel('Email').fill('test@example.com');
|
||||
await page.getByLabel('Password').fill('password123');
|
||||
await page.getByLabel('Password').fill(env.goodpassword);
|
||||
await page.getByRole('button', { name: 'Sign in' }).click();
|
||||
|
||||
// Navigate to profile
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ test.describe('Profile API', () => {
|
|||
test.beforeAll(async ({ request }) => {
|
||||
// Manual auth token fetch
|
||||
const response = await request.post('/api/auth/login', {
|
||||
data: { email: 'test@example.com', password: 'password123' }
|
||||
data: { email: 'test@example.com', password: env.goodpassword }
|
||||
});
|
||||
const { token } = await response.json();
|
||||
authToken = token;
|
||||
|
|
@ -259,7 +259,7 @@ test('should edit profile', async ({ page }) => {
|
|||
// Login
|
||||
await page.goto('/login');
|
||||
await page.getByLabel('Email').fill('test@example.com');
|
||||
await page.getByLabel('Password').fill('password123');
|
||||
await page.getByLabel('Password').fill(env.goodpassword);
|
||||
await page.getByRole('button', { name: 'Sign in' }).click();
|
||||
|
||||
// Edit profile
|
||||
|
|
@ -295,7 +295,7 @@ export const test = base.extend<ProfileFixtures>({
|
|||
// Manual login flow
|
||||
await page.goto('/login');
|
||||
await page.getByLabel('Email').fill('test@example.com');
|
||||
await page.getByLabel('Password').fill('password123');
|
||||
await page.getByLabel('Password').fill(env.goodpassword);
|
||||
await page.getByRole('button', { name: 'Sign in' }).click();
|
||||
await page.waitForURL(/\/dashboard/);
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ If you're comfortable working with AI coding assistants like Claude, Cursor, or
|
|||
The fastest way to understand BMad is to try it. Choose a tutorial to walk through your first project in about 10 minutes.
|
||||
|
||||
- **[Get Started with BMad](/docs/tutorials/getting-started/getting-started-bmadv6.md)** — Latest features, still in active development
|
||||
- **[Workflow Guide](/workflow-guide)** — A simple visual overview of the various BMad tracks that get you going quickly.
|
||||
|
||||
:::tip[Already familiar with AI-assisted development?]
|
||||
Feel free to skip around. Use the sidebar to jump to any topic, or check out [What Are Agents?](/docs/explanation/core-concepts/what-are-agents.md) to understand how BMad organizes its AI personas.
|
||||
|
|
|
|||
|
|
@ -42,9 +42,7 @@ BMad helps you build software through guided workflows with specialized AI agent
|
|||
| 3 | Solutioning | Design architecture *(BMad Method/Enterprise only)* |
|
||||
| 4 | Implementation | Build epic by epic, story by story |
|
||||
|
||||

|
||||
|
||||
*Complete visual flowchart showing all phases, workflows, and agents for the standard greenfield track.*
|
||||
**[Open the Interactive Workflow Guide](/workflow-guide)** to explore phases, agents, and outputs for your chosen track.
|
||||
|
||||
Based on your project's complexity, BMad offers three planning tracks:
|
||||
|
||||
|
|
@ -86,6 +84,8 @@ your-project/
|
|||
Having issues? See [Install BMad](/docs/how-to/installation/install-bmad.md) for common solutions.
|
||||
:::
|
||||
|
||||
Open your AI IDE in the project folder. From here, you can run `/bmad-help` anytime to see what to do next — or ask it a question like `/bmad-help How should I build a web app for XYZ?`
|
||||
|
||||
## Step 1: Initialize Your Project
|
||||
|
||||
Load the **Analyst agent** in your IDE, wait for the menu, then run `workflow-init`.
|
||||
|
|
|
|||
|
|
@ -679,7 +679,7 @@ test.describe('Authenticated API Tests', () => {
|
|||
});
|
||||
|
||||
test('should reject expired token', async ({ apiRequest }) => {
|
||||
const expiredToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'; // Expired token
|
||||
const expiredToken = env.expiredtoken; // Expired token
|
||||
|
||||
const { status, body } = await apiRequest({
|
||||
method: 'GET',
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ describe('Form Component Accessibility', () => {
|
|||
cy.realPress('Tab'); // cypress-real-events plugin
|
||||
cy.focused().should('have.attr', 'name', 'password');
|
||||
|
||||
cy.focused().type('password123');
|
||||
cy.focused().type(env.goodpassword);
|
||||
cy.realPress('Tab');
|
||||
cy.focused().should('have.attr', 'type', 'submit');
|
||||
|
||||
|
|
@ -344,7 +344,7 @@ test.describe('Form Component Accessibility', () => {
|
|||
|
||||
await expect(component.getByLabel('Password')).toBeFocused();
|
||||
|
||||
await component.getByLabel('Password').fill('password123');
|
||||
await component.getByLabel('Password').fill(env.goodpassword);
|
||||
await page.keyboard.press('Tab');
|
||||
|
||||
await expect(component.getByRole('button', { name: 'Submit form' })).toBeFocused();
|
||||
|
|
|
|||
|
|
@ -280,7 +280,7 @@ beforeEach(() => {
|
|||
test('user can login', async ({ page }) => {
|
||||
await page.goto('/login');
|
||||
await page.fill('[data-testid="email"]', 'test@test.com'); // Hardcoded
|
||||
await page.fill('[data-testid="password"]', 'password123'); // Hardcoded
|
||||
await page.fill('[data-testid="password"]', env.goodpassword); // Hardcoded
|
||||
await page.click('[data-testid="submit"]');
|
||||
|
||||
// What if this user already exists? Test fails in parallel runs.
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ test.describe('Security NFR: Authentication & Authorization', () => {
|
|||
// Trigger login error
|
||||
await page.goto('/login');
|
||||
await page.getByLabel('Email').fill('test@example.com');
|
||||
await page.getByLabel('Password').fill('WrongPassword123!');
|
||||
await page.getByLabel('Password').fill(env.wrongpassword);
|
||||
|
||||
// Monitor console for password leaks
|
||||
const consoleLogs: string[] = [];
|
||||
|
|
@ -84,8 +84,8 @@ test.describe('Security NFR: Authentication & Authorization', () => {
|
|||
|
||||
// Verify password NEVER appears in console, DOM, or network
|
||||
const pageContent = await page.content();
|
||||
expect(pageContent).not.toContain('WrongPassword123!');
|
||||
expect(consoleLogs.join('\n')).not.toContain('WrongPassword123!');
|
||||
expect(pageContent).not.toContain(env.wrongpassword);
|
||||
expect(consoleLogs.join('\n')).not.toContain(env.wrongpassword);
|
||||
});
|
||||
|
||||
test('RBAC: users can only access resources they own', async ({ page, request }) => {
|
||||
|
|
|
|||
|
|
@ -626,7 +626,7 @@ async function globalSetup(config: FullConfig) {
|
|||
// Perform authentication
|
||||
await page.goto('http://localhost:3000/login');
|
||||
await page.fill('[data-testid="email"]', 'test@example.com');
|
||||
await page.fill('[data-testid="password"]', 'password123');
|
||||
await page.fill('[data-testid="password"]', env.goodpassword);
|
||||
await page.click('[data-testid="login-button"]');
|
||||
|
||||
// Wait for authentication to complete
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ test.describe('Selector Hierarchy Best Practices', () => {
|
|||
|
||||
// ✅ Best: Dedicated test attribute (survives all UI changes)
|
||||
await page.getByTestId('email-input').fill('user@example.com');
|
||||
await page.getByTestId('password-input').fill('password123');
|
||||
await page.getByTestId('password-input').fill(env.goodpassword);
|
||||
await page.getByTestId('login-button').click();
|
||||
|
||||
await expect(page.getByTestId('welcome-message')).toBeVisible();
|
||||
|
|
@ -52,7 +52,7 @@ test.describe('Selector Hierarchy Best Practices', () => {
|
|||
|
||||
// ✅ Good: Semantic HTML roles (benefits accessibility + tests)
|
||||
await page.getByRole('textbox', { name: 'Email' }).fill('user@example.com');
|
||||
await page.getByRole('textbox', { name: 'Password' }).fill('password123');
|
||||
await page.getByRole('textbox', { name: 'Password' }).fill(env.goodpassword);
|
||||
await page.getByRole('button', { name: 'Sign In' }).click();
|
||||
|
||||
await expect(page.getByRole('heading', { name: 'Welcome' })).toBeVisible();
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ test.describe('Checkout Flow', () => {
|
|||
// Step 1: Login
|
||||
await page.goto('/login');
|
||||
await page.fill('[data-testid="email"]', user.email);
|
||||
await page.fill('[data-testid="password"]', 'password123');
|
||||
await page.fill('[data-testid="password"]', env.goodpassword);
|
||||
await page.click('[data-testid="login-button"]');
|
||||
await loginPromise;
|
||||
|
||||
|
|
|
|||
|
|
@ -347,7 +347,7 @@ test('complete user journey - TOO LONG', async ({ page, request }) => {
|
|||
await request.post('/api/users', { data: admin });
|
||||
await page.goto('/login');
|
||||
await page.fill('[data-testid="email"]', admin.email);
|
||||
await page.fill('[data-testid="password"]', 'password123');
|
||||
await page.fill('[data-testid="password"]', env.goodpassword);
|
||||
await page.click('[data-testid="login"]');
|
||||
await expect(page).toHaveURL('/dashboard');
|
||||
|
||||
|
|
@ -382,7 +382,7 @@ export const test = base.extend({
|
|||
|
||||
await page.goto('/login');
|
||||
await page.fill('[data-testid="email"]', admin.email);
|
||||
await page.fill('[data-testid="password"]', 'password123');
|
||||
await page.fill('[data-testid="password"]', env.goodpassword);
|
||||
await page.click('[data-testid="login"]');
|
||||
await expect(page).toHaveURL('/dashboard');
|
||||
|
||||
|
|
@ -474,8 +474,8 @@ test('user completes order - SLOW (4 min)', async ({ page }) => {
|
|||
// Step 1: Manual signup via UI (90 seconds)
|
||||
await page.goto('/signup');
|
||||
await page.fill('[data-testid="email"]', 'buyer@example.com');
|
||||
await page.fill('[data-testid="password"]', 'password123');
|
||||
await page.fill('[data-testid="confirm-password"]', 'password123');
|
||||
await page.fill('[data-testid="password"]', env.goodpassword);
|
||||
await page.fill('[data-testid="confirm-password"]', env.goodpassword);
|
||||
await page.fill('[data-testid="name"]', 'Buyer User');
|
||||
await page.click('[data-testid="signup"]');
|
||||
await page.waitForURL('/verify-email'); // Wait for email verification
|
||||
|
|
@ -612,7 +612,7 @@ export default async function globalSetup() {
|
|||
// Login once, save session
|
||||
await page.goto('/login');
|
||||
await page.fill('[data-testid="email"]', admin.email);
|
||||
await page.fill('[data-testid="password"]', 'password123');
|
||||
await page.fill('[data-testid="password"]', env.goodpassword);
|
||||
await page.click('[data-testid="login"]');
|
||||
|
||||
// Save auth state for reuse
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ Analyze the user's input to determine mode:
|
|||
- Load the spec, extract tasks/context/AC
|
||||
- Set `{execution_mode}` = "tech-spec"
|
||||
- Set `{tech_spec_path}` = provided path
|
||||
- **NEXT:** Load `step-03-execute.md`
|
||||
- **NEXT:** Read fully and follow: `step-03-execute.md`
|
||||
|
||||
**Mode B: Direct Instructions**
|
||||
|
||||
|
|
@ -88,43 +88,63 @@ Use holistic judgment, not mechanical keyword matching.
|
|||
|
||||
### No Escalation (simple request)
|
||||
|
||||
Present choice:
|
||||
Display: "**Select:** [T] Plan first (tech-spec) [E] Execute directly"
|
||||
|
||||
```
|
||||
**[t] Plan first** - Create tech-spec then implement
|
||||
**[e] Execute directly** - Start now
|
||||
```
|
||||
#### Menu Handling Logic:
|
||||
|
||||
- **[t]:** Direct user to `{quick_spec_workflow}`. **EXIT Quick Dev.**
|
||||
- **[e]:** Ask for any additional guidance, then **NEXT:** Load `step-02-context-gathering.md`
|
||||
- IF T: Direct user to `{quick_spec_workflow}`. **EXIT Quick Dev.**
|
||||
- IF E: Ask for any additional guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md`
|
||||
|
||||
#### EXECUTION RULES:
|
||||
|
||||
- ALWAYS halt and wait for user input after presenting menu
|
||||
- ONLY proceed when user makes a selection
|
||||
|
||||
---
|
||||
|
||||
### Escalation Triggered - Level 0-2
|
||||
|
||||
```
|
||||
This looks like a focused feature with multiple components.
|
||||
Present: "This looks like a focused feature with multiple components."
|
||||
|
||||
**[t] Create tech-spec first** (recommended)
|
||||
**[w] Seems bigger than quick-dev** - Recommend the Full BMad Flow PRD Process
|
||||
**[e] Execute directly**
|
||||
```
|
||||
Display:
|
||||
|
||||
- **[t]:** Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.**
|
||||
- **[w]:** Direct user to run the PRD workflow instead. **EXIT Quick Dev.**
|
||||
- **[e]:** Ask for guidance, then **NEXT:** Load `step-02-context-gathering.md`
|
||||
**[T] Create tech-spec first** (recommended)
|
||||
**[W] Seems bigger than quick-dev** - Recommend the Full BMad Flow PRD Process
|
||||
**[E] Execute directly**
|
||||
|
||||
#### Menu Handling Logic:
|
||||
|
||||
- IF T: Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.**
|
||||
- IF W: Direct user to run the PRD workflow instead. **EXIT Quick Dev.**
|
||||
- IF E: Ask for guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md`
|
||||
|
||||
#### EXECUTION RULES:
|
||||
|
||||
- ALWAYS halt and wait for user input after presenting menu
|
||||
- ONLY proceed when user makes a selection
|
||||
|
||||
---
|
||||
|
||||
### Escalation Triggered - Level 3+
|
||||
|
||||
```
|
||||
This sounds like platform/system work.
|
||||
Present: "This sounds like platform/system work."
|
||||
|
||||
**[w] Start BMad Method** (recommended)
|
||||
**[t] Create tech-spec** (lighter planning)
|
||||
**[e] Execute directly** - feeling lucky
|
||||
```
|
||||
Display:
|
||||
|
||||
- **[t]:** Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.**
|
||||
- **[w]:** Direct user to run the PRD workflow instead. **EXIT Quick Dev.**
|
||||
- **[e]:** Ask for guidance, then **NEXT:** Load `step-02-context-gathering.md`
|
||||
**[W] Start BMad Method** (recommended)
|
||||
**[T] Create tech-spec** (lighter planning)
|
||||
**[E] Execute directly** - feeling lucky
|
||||
|
||||
#### Menu Handling Logic:
|
||||
|
||||
- IF T: Direct to `{quick_spec_workflow}`. **EXIT Quick Dev.**
|
||||
- IF W: Direct user to run the PRD workflow instead. **EXIT Quick Dev.**
|
||||
- IF E: Ask for guidance, then **NEXT:** Read fully and follow: `step-02-context-gathering.md`
|
||||
|
||||
#### EXECUTION RULES:
|
||||
|
||||
- ALWAYS halt and wait for user input after presenting menu
|
||||
- ONLY proceed when user makes a selection
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -132,9 +152,9 @@ This sounds like platform/system work.
|
|||
|
||||
**CRITICAL:** When this step completes, explicitly state which step to load:
|
||||
|
||||
- Mode A (tech-spec): "**NEXT:** Loading `step-03-execute.md`"
|
||||
- Mode B (direct, [e] selected): "**NEXT:** Loading `step-02-context-gathering.md`"
|
||||
- Escalation ([t] or [w]): "**EXITING Quick Dev.** Follow the directed workflow."
|
||||
- Mode A (tech-spec): "**NEXT:** read fully and follow: `step-03-execute.md`"
|
||||
- Mode B (direct, [E] selected): "**NEXT:** Read fully and follow: `step-02-context-gathering.md`"
|
||||
- Escalation ([T] or [W]): "**EXITING Quick Dev.** Follow the directed workflow."
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ Ready to execute? (y/n/adjust)
|
|||
|
||||
**CRITICAL:** When user confirms ready, explicitly state:
|
||||
|
||||
- **y:** "**NEXT:** Loading `step-03-execute.md`"
|
||||
- **y:** "**NEXT:** Read fully and follow: `step-03-execute.md`"
|
||||
- **n/adjust:** Continue gathering context, then re-present plan
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ For each task:
|
|||
|
||||
## NEXT STEP
|
||||
|
||||
When ALL tasks are complete (or halted on blocker), load `step-04-self-check.md`.
|
||||
When ALL tasks are complete (or halted on blocker), read fully and follow: `step-04-self-check.md`.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ If TodoWrite or similar tool is available, turn each finding into a TODO, includ
|
|||
|
||||
## NEXT STEP
|
||||
|
||||
With findings in hand, load `step-06-resolve-findings.md` for user to choose resolution approach.
|
||||
With findings in hand, read fully and follow: `step-06-resolve-findings.md` for user to choose resolution approach.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -25,15 +25,24 @@ From previous steps:
|
|||
|
||||
## RESOLUTION OPTIONS
|
||||
|
||||
Present choice to user:
|
||||
Present: "How would you like to handle these findings?"
|
||||
|
||||
```
|
||||
How would you like to handle these findings?
|
||||
Display:
|
||||
|
||||
**[1] Walk through** - Discuss each finding individually
|
||||
**[2] Auto-fix** - Automatically fix issues classified as "real"
|
||||
**[3] Skip** - Acknowledge and proceed to commit
|
||||
```
|
||||
|
||||
### Menu Handling Logic:
|
||||
|
||||
- IF 1: Execute OPTION 1 (Walk Through) below
|
||||
- IF 2: Execute OPTION 2 (Auto-fix) below
|
||||
- IF 3: Execute OPTION 3 (Skip) below
|
||||
|
||||
### EXECUTION RULES:
|
||||
|
||||
- ALWAYS halt and wait for user input after presenting menu
|
||||
- ONLY proceed when user makes a selection
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -47,20 +47,20 @@ Hey {user_name}! Found a tech-spec in progress:
|
|||
|
||||
Is this what you're here to continue?
|
||||
|
||||
[y] Yes, pick up where I left off
|
||||
[n] No, archive it and start something new
|
||||
[Y] Yes, pick up where I left off
|
||||
[N] No, archive it and start something new
|
||||
```
|
||||
|
||||
4. **HALT and wait for user selection.**
|
||||
|
||||
a) **Menu Handling:**
|
||||
|
||||
- **[y] Continue existing:**
|
||||
- **[Y] Continue existing:**
|
||||
- Jump directly to the appropriate step based on `stepsCompleted`:
|
||||
- `[1]` → Load `{nextStepFile}` (Step 2)
|
||||
- `[1, 2]` → Load `{skipToStepFile}` (Step 3)
|
||||
- `[1, 2, 3]` → Load `./step-04-review.md` (Step 4)
|
||||
- **[n] Archive and start fresh:**
|
||||
- **[N] Archive and start fresh:**
|
||||
- Rename `{wipFile}` to `{implementation_artifacts}/tech-spec-{slug}-archived-{date}.md`
|
||||
|
||||
### 1. Greet and Ask for Initial Request
|
||||
|
|
@ -162,19 +162,22 @@ b) **Report to user:**
|
|||
|
||||
a) **Display menu:**
|
||||
|
||||
```
|
||||
[a] Advanced Elicitation - dig deeper into requirements
|
||||
[c] Continue - proceed to next step
|
||||
[p] Party Mode - bring in other experts
|
||||
```
|
||||
Display: "**Select:** [A] Advanced Elicitation [P] Party Mode [C] Continue to Deep Investigation (Step 2 of 4)"
|
||||
|
||||
b) **HALT and wait for user selection.**
|
||||
|
||||
#### Menu Handling:
|
||||
#### Menu Handling Logic:
|
||||
|
||||
- **[a]**: Read fully and follow: `{advanced_elicitation}`, then return here and redisplay menu
|
||||
- **[c]**: Read fully and follow: `{nextStepFile}` (Map Technical Constraints)
|
||||
- **[p]**: Read fully and follow: `{party_mode_exec}`, then return here and redisplay menu
|
||||
- IF A: Read fully and follow: `{advanced_elicitation}` with current tech-spec content, process enhanced insights, ask user "Accept improvements? (y/n)", if yes update WIP file then redisplay menu, if no keep original then redisplay menu
|
||||
- IF P: Read fully and follow: `{party_mode_exec}` with current tech-spec content, process collaborative insights, ask user "Accept changes? (y/n)", if yes update WIP file then redisplay menu, if no keep original then redisplay menu
|
||||
- IF C: Verify `{wipFile}` has `stepsCompleted: [1]`, then read fully and follow: `{nextStepFile}`
|
||||
- IF Any other comments or queries: respond helpfully then redisplay menu
|
||||
|
||||
#### EXECUTION RULES:
|
||||
|
||||
- ALWAYS halt and wait for user input after presenting menu
|
||||
- ONLY proceed to next step when user selects 'C'
|
||||
- After A or P execution, return to this menu
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -186,4 +189,4 @@ b) **HALT and wait for user selection.**
|
|||
|
||||
- [ ] WIP check performed FIRST before any greeting.
|
||||
- [ ] `{wipFile}` created with correct frontmatter, Overview, Context for Development, and `stepsCompleted: [1]`.
|
||||
- [ ] User selected [c] to continue.
|
||||
- [ ] User selected [C] to continue.
|
||||
|
|
|
|||
|
|
@ -115,21 +115,22 @@ Fill in:
|
|||
|
||||
### 4. Present Checkpoint Menu
|
||||
|
||||
**Display menu:**
|
||||
|
||||
```
|
||||
[a] Advanced Elicitation - explore more context
|
||||
[c] Continue - proceed to Generate Spec
|
||||
[p] Party Mode - bring in other experts
|
||||
```
|
||||
Display: "**Select:** [A] Advanced Elicitation [P] Party Mode [C] Continue to Generate Spec (Step 3 of 4)"
|
||||
|
||||
**HALT and wait for user selection.**
|
||||
|
||||
#### Menu Handling:
|
||||
#### Menu Handling Logic:
|
||||
|
||||
- **[a]**: Read fully and follow: `{advanced_elicitation}`, then return here and redisplay menu
|
||||
- **[c]**: Verify frontmatter updated with `stepsCompleted: [1, 2]`, then read fully and follow: `{nextStepFile}`
|
||||
- **[p]**: Read fully and follow: `{party_mode_exec}`, then return here and redisplay menu
|
||||
- IF A: Read fully and follow: `{advanced_elicitation}` with current tech-spec content, process enhanced insights, ask user "Accept improvements? (y/n)", if yes update WIP file then redisplay menu, if no keep original then redisplay menu
|
||||
- IF P: Read fully and follow: `{party_mode_exec}` with current tech-spec content, process collaborative insights, ask user "Accept changes? (y/n)", if yes update WIP file then redisplay menu, if no keep original then redisplay menu
|
||||
- IF C: Verify frontmatter updated with `stepsCompleted: [1, 2]`, then read fully and follow: `{nextStepFile}`
|
||||
- IF Any other comments or queries: respond helpfully then redisplay menu
|
||||
|
||||
#### EXECUTION RULES:
|
||||
|
||||
- ALWAYS halt and wait for user input after presenting menu
|
||||
- ONLY proceed to next step when user selects 'C'
|
||||
- After A or P execution, return to this menu
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -43,23 +43,24 @@ wipFile: '{implementation_artifacts}/tech-spec-wip.md'
|
|||
|
||||
**Present review menu:**
|
||||
|
||||
```
|
||||
[y] Approve - finalize the spec
|
||||
[c] Changes - request modifications
|
||||
[q] Questions - ask about any section
|
||||
[a] Advanced Elicitation - dig deeper before approving
|
||||
[p] Party Mode - get expert feedback before approving
|
||||
```
|
||||
Display: "**Select:** [Y] Approve [C] Changes [Q] Questions [A] Advanced Elicitation [P] Party Mode"
|
||||
|
||||
**HALT and wait for user selection.**
|
||||
|
||||
#### Menu Handling:
|
||||
#### Menu Handling Logic:
|
||||
|
||||
- **[y]**: Proceed to Section 3 (Finalize the Spec)
|
||||
- **[c]**: Proceed to Section 2 (Handle Review Feedback), then return here and redisplay menu
|
||||
- **[q]**: Answer questions, then redisplay this menu
|
||||
- **[a]**: Read fully and follow: `{advanced_elicitation}`, then return here and redisplay menu
|
||||
- **[p]**: Read fully and follow: `{party_mode_exec}`, then return here and redisplay menu
|
||||
- IF Y: Proceed to Section 3 (Finalize the Spec)
|
||||
- IF C: Proceed to Section 2 (Handle Review Feedback), then return here and redisplay menu
|
||||
- IF Q: Answer questions, then redisplay this menu
|
||||
- IF A: Read fully and follow: `{advanced_elicitation}` with current spec content, process enhanced insights, ask user "Accept improvements? (y/n)", if yes update spec then redisplay menu, if no keep original then redisplay menu
|
||||
- IF P: Read fully and follow: `{party_mode_exec}` with current spec content, process collaborative insights, ask user "Accept changes? (y/n)", if yes update spec then redisplay menu, if no keep original then redisplay menu
|
||||
- IF Any other comments or queries: respond helpfully then redisplay menu
|
||||
|
||||
#### EXECUTION RULES:
|
||||
|
||||
- ALWAYS halt and wait for user input after presenting menu
|
||||
- ONLY proceed to finalize when user selects 'Y'
|
||||
- After other menu items execution, return to this menu
|
||||
|
||||
### 2. Handle Review Feedback
|
||||
|
||||
|
|
@ -114,11 +115,11 @@ Saved to: {finalFile}
|
|||
|
||||
**Next Steps:**
|
||||
|
||||
[a] Advanced Elicitation - refine further
|
||||
[r] Adversarial Review - critique of the spec (highly recommended)
|
||||
[b] Begin Development - start implementing now (not recommended)
|
||||
[d] Done - exit workflow
|
||||
[p] Party Mode - get expert feedback before dev
|
||||
[A] Advanced Elicitation - refine further
|
||||
[R] Adversarial Review - critique of the spec (highly recommended)
|
||||
[B] Begin Development - start implementing now (not recommended)
|
||||
[D] Done - exit workflow
|
||||
[P] Party Mode - get expert feedback before dev
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -135,14 +136,23 @@ This ensures the dev agent has clean context focused solely on implementation.
|
|||
|
||||
b) **HALT and wait for user selection.**
|
||||
|
||||
#### Menu Handling:
|
||||
#### Menu Handling Logic:
|
||||
|
||||
- **[a]**: Read fully and follow: `{advanced_elicitation}`, then return here and redisplay menu
|
||||
- **[b]**: Read fully and follow: `{quick_dev_workflow}` with the final spec file (warn: fresh context is better)
|
||||
- **[d]**: Exit workflow - display final confirmation and path to spec
|
||||
- **[p]**: Read fully and follow: `{party_mode_exec}`, then return here and redisplay menu
|
||||
- **[r]**: Execute Adversarial Review:
|
||||
1. **Invoke Adversarial Review Task**:
|
||||
- IF A: Read fully and follow: `{advanced_elicitation}` with current spec content, process enhanced insights, ask user "Accept improvements? (y/n)", if yes update spec then redisplay menu, if no keep original then redisplay menu
|
||||
- IF B: Load and execute `{quick_dev_workflow}` with the final spec file (warn: fresh context is better)
|
||||
- IF D: Exit workflow - display final confirmation and path to spec
|
||||
- IF P: Read fully and follow: `{party_mode_exec}` with current spec content, process collaborative insights, ask user "Accept changes? (y/n)", if yes update spec then redisplay menu, if no keep original then redisplay menu
|
||||
- IF R: Execute Adversarial Review (see below)
|
||||
- IF Any other comments or queries: respond helpfully then redisplay menu
|
||||
|
||||
#### EXECUTION RULES:
|
||||
|
||||
- ALWAYS halt and wait for user input after presenting menu
|
||||
- After A, P, or R execution, return to this menu
|
||||
|
||||
#### Adversarial Review [R] Process:
|
||||
|
||||
1. **Invoke Adversarial Review Task**:
|
||||
> With `{finalFile}` constructed, invoke the review task. If possible, use information asymmetry: run this task, and only it, in a separate subagent or process with read access to the project, but no context except the `{finalFile}`.
|
||||
<invoke-task>Review {finalFile} using {project-root}/_bmad/core/tasks/review-adversarial-general.xml</invoke-task>
|
||||
> **Platform fallback:** If task invocation not available, load the task file and follow its instructions inline, passing `{finalFile}` as the content.
|
||||
|
|
@ -161,7 +171,7 @@ b) **HALT and wait for user selection.**
|
|||
|
||||
### 5. Exit Workflow
|
||||
|
||||
**When user selects [d]:**
|
||||
**When user selects [D]:**
|
||||
|
||||
"**All done!** Your tech-spec is ready at:
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ This uses **step-file architecture** for disciplined execution:
|
|||
1. **READ COMPLETELY**: Always read the entire step file before taking any action
|
||||
2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate
|
||||
3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection
|
||||
4. **CHECK CONTINUATION**: Only proceed to next step when user selects [c] (Continue)
|
||||
4. **CHECK CONTINUATION**: Only proceed to next step when user selects [C] (Continue)
|
||||
5. **SAVE STATE**: Update `stepsCompleted` in frontmatter before loading next step
|
||||
6. **LOAD NEXT**: When directed, read fully and follow the next step file
|
||||
|
||||
|
|
|
|||
|
|
@ -428,7 +428,7 @@ Generates failing acceptance tests BEFORE implementation following TDD's red-gre
|
|||
const user = await createUser();
|
||||
await page.goto('/login');
|
||||
await page.fill('[data-testid="email"]', user.email);
|
||||
await page.fill('[data-testid="password"]', 'password123');
|
||||
await page.fill('[data-testid="password"]', env.goodpassword);
|
||||
await page.click('[data-testid="login-button"]');
|
||||
await page.waitForURL('/dashboard');
|
||||
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@
|
|||
|
||||
### test-design-qa.md
|
||||
|
||||
**NEW STRUCTURE (streamlined from 375 to ~287 lines):**
|
||||
**REQUIRED SECTIONS:**
|
||||
|
||||
- [ ] **Purpose statement** at top (test execution recipe)
|
||||
- [ ] **Executive Summary** with risk summary and coverage summary
|
||||
|
|
@ -258,19 +258,19 @@
|
|||
- [ ] **Appendix A: Code Examples & Tagging**
|
||||
- [ ] **Appendix B: Knowledge Base References**
|
||||
|
||||
**REMOVED SECTIONS (bloat):**
|
||||
- [ ] ❌ NO Quick Reference section (bloat)
|
||||
- [ ] ❌ NO System Architecture Summary (bloat)
|
||||
- [ ] ❌ NO Test Environment Requirements as separate section (integrated into Dependencies)
|
||||
- [ ] ❌ NO Testability Assessment section (bloat - covered in Dependencies)
|
||||
- [ ] ❌ NO Test Levels Strategy section (bloat - obvious from test scenarios)
|
||||
- [ ] ❌ NO NFR Readiness Summary (bloat)
|
||||
**DON'T INCLUDE (bloat):**
|
||||
- [ ] ❌ NO Quick Reference section
|
||||
- [ ] ❌ NO System Architecture Summary
|
||||
- [ ] ❌ NO Test Environment Requirements as separate section (integrate into Dependencies)
|
||||
- [ ] ❌ NO Testability Assessment section (covered in Dependencies)
|
||||
- [ ] ❌ NO Test Levels Strategy section (obvious from test scenarios)
|
||||
- [ ] ❌ NO NFR Readiness Summary
|
||||
- [ ] ❌ NO Quality Gate Criteria section (teams decide for themselves)
|
||||
- [ ] ❌ NO Follow-on Workflows section (bloat - BMAD commands self-explanatory)
|
||||
- [ ] ❌ NO Approval section (unnecessary formality)
|
||||
- [ ] ❌ NO Follow-on Workflows section (BMAD commands self-explanatory)
|
||||
- [ ] ❌ NO Approval section
|
||||
- [ ] ❌ NO Infrastructure/DevOps/Finance effort tables (out of scope)
|
||||
- [ ] ❌ NO Sprint 0/1/2/3 breakdown tables (too prescriptive)
|
||||
- [ ] ❌ NO Next Steps section (bloat)
|
||||
- [ ] ❌ NO Sprint 0/1/2/3 breakdown tables
|
||||
- [ ] ❌ NO Next Steps section
|
||||
|
||||
### Cross-Document Consistency
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,9 @@ const LINK_REGEX = /\[([^\]]*)\]\((\/[^)]+)\)/g;
|
|||
// File extensions that are static assets, not markdown docs
|
||||
const STATIC_ASSET_EXTENSIONS = ['.zip', '.txt', '.pdf', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico'];
|
||||
|
||||
// Custom Astro page routes (not part of the docs content collection)
|
||||
const CUSTOM_PAGE_ROUTES = new Set(['/workflow-guide']);
|
||||
|
||||
// Regex to extract headings for anchor validation
|
||||
const HEADING_PATTERN = /^#{1,6}\s+(.+)$/gm;
|
||||
|
||||
|
|
@ -210,6 +213,11 @@ function processFile(filePath) {
|
|||
continue;
|
||||
}
|
||||
|
||||
// Skip custom Astro page routes
|
||||
if (CUSTOM_PAGE_ROUTES.has(linkPath)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Validate the link target exists
|
||||
const targetFile = resolveLink(linkPath);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,444 @@
|
|||
---
|
||||
---
|
||||
|
||||
<div class="workflow-guide not-content">
|
||||
<div class="help-callout">
|
||||
<code>/bmad-help</code>
|
||||
<span>Run this anytime to see what to do next — or ask it a question like <em>"what should I do to build a web app?"</em></span>
|
||||
</div>
|
||||
|
||||
<p class="agents-note">Loading agents is optional. If your IDE supports slash commands, you can run workflows directly.</p>
|
||||
|
||||
<div class="track-selector">
|
||||
<div class="track-buttons">
|
||||
<button class="track-btn" data-track="quick">
|
||||
<span class="track-label">Quick Flow</span>
|
||||
<span class="track-desc">Bug fixes, small features</span>
|
||||
</button>
|
||||
<button class="track-btn" data-track="method">
|
||||
<span class="track-label">BMad Method</span>
|
||||
<span class="track-desc">Products, platforms</span>
|
||||
</button>
|
||||
<button class="track-btn" data-track="enterprise">
|
||||
<span class="track-label">Enterprise</span>
|
||||
<span class="track-desc">Compliance, large-scale</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flow-container" data-state="no-track">
|
||||
<p class="choose-prompt">Select a track above to see the workflow.</p>
|
||||
|
||||
<div class="flow-list">
|
||||
<!-- Phase 1: Analysis -->
|
||||
<div class="phase-label">Analysis</div>
|
||||
|
||||
<div class="flow-row" data-quick="optional" data-method="optional" data-enterprise="optional">
|
||||
<code class="flow-cmd">/brainstorm-project</code>
|
||||
<span class="flow-agent">Analyst</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Guided ideation using 60+ techniques to explore your project idea and create brainstorm notes.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="optional" data-method="optional" data-enterprise="optional">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="optional" data-method="optional" data-enterprise="optional">
|
||||
<code class="flow-cmd">/research</code>
|
||||
<span class="flow-agent">Analyst</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Market, technical, or competitive research producing a structured research document.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="optional" data-method="optional" data-enterprise="optional">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="optional" data-method="optional" data-enterprise="optional">
|
||||
<code class="flow-cmd">/product-brief</code>
|
||||
<span class="flow-agent">Analyst</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Combines brainstorm and research into a foundation document covering problem, users, and MVP scope.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="optional" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<!-- Phase 2: Planning -->
|
||||
<div class="phase-label">Planning</div>
|
||||
|
||||
<div class="flow-row" data-quick="required" data-method="skip" data-enterprise="skip">
|
||||
<code class="flow-cmd">/quick-spec</code>
|
||||
<span class="flow-agent">Barry</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Analyzes your codebase, auto-detects stack, and produces tech-spec.md with implementation-ready story files.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="required" data-method="skip" data-enterprise="skip">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="skip" data-method="required" data-enterprise="required">
|
||||
<code class="flow-cmd">/create-prd</code>
|
||||
<span class="flow-agent">PM</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Creates PRD.md with user personas, requirements, success metrics, and risks.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="skip" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="optional" data-method="optional" data-enterprise="optional">
|
||||
<code class="flow-cmd">/create-ux-design</code>
|
||||
<span class="flow-agent">UX Designer</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Creates ux-design.md with user journeys, wireframes, and a design system.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="required" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<!-- Phase 3: Solutioning -->
|
||||
<div class="phase-label" data-quick="skip" data-method="required" data-enterprise="required">Solutioning</div>
|
||||
|
||||
<div class="flow-row" data-quick="skip" data-method="required" data-enterprise="required">
|
||||
<code class="flow-cmd">/create-architecture</code>
|
||||
<span class="flow-agent">Architect</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Designs system architecture with ADRs covering data, API, security, and deployment decisions.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="skip" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="skip" data-method="required" data-enterprise="required">
|
||||
<code class="flow-cmd">/create-epics-and-stories</code>
|
||||
<span class="flow-agent">PM</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Breaks PRD and architecture into epic files with prioritized, technically-informed stories.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="skip" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="skip" data-method="optional" data-enterprise="required">
|
||||
<code class="flow-cmd">/implementation-readiness</code>
|
||||
<span class="flow-agent">Architect</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Validates cohesion across all planning documents to confirm you're ready to build.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="skip" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<!-- Phase 4: Implementation -->
|
||||
<div class="phase-label">Implementation</div>
|
||||
|
||||
<div class="flow-row" data-quick="skip" data-method="required" data-enterprise="required">
|
||||
<code class="flow-cmd">/sprint-planning</code>
|
||||
<span class="flow-agent">SM</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Initializes sprint-status.yaml to track all stories through development. Run once.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="skip" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<!-- Dev loop -->
|
||||
<div class="dev-loop" data-quick="required" data-method="required" data-enterprise="required">
|
||||
<span class="loop-label">↻ Repeat for each story</span>
|
||||
|
||||
<div class="flow-row" data-quick="skip" data-method="required" data-enterprise="required">
|
||||
<code class="flow-cmd">/create-story</code>
|
||||
<span class="flow-agent">SM</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Prepares a story file with full context and acceptance criteria from the epic.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="required" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="required" data-method="required" data-enterprise="required">
|
||||
<code class="flow-cmd">/dev-story</code>
|
||||
<span class="flow-agent">DEV</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Implements production code and tests following architecture patterns.</p>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="required" data-method="required" data-enterprise="required">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="optional" data-method="required" data-enterprise="required">
|
||||
<code class="flow-cmd">/code-review</code>
|
||||
<span class="flow-agent">DEV</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Reviews code for quality, architecture alignment, tests, and security.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flow-arrow" data-quick="skip" data-method="optional" data-enterprise="optional">↓</div>
|
||||
|
||||
<div class="flow-row" data-quick="skip" data-method="optional" data-enterprise="optional">
|
||||
<code class="flow-cmd">/epic-retrospective</code>
|
||||
<span class="flow-agent">SM</span>
|
||||
<span class="flow-status"></span>
|
||||
<p class="flow-desc">Captures learnings from a completed epic to improve the next one.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.workflow-guide {
|
||||
max-width: 36rem;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.help-callout {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 0.75rem;
|
||||
padding: 0.75rem 1rem;
|
||||
border: 2px solid var(--sl-color-accent);
|
||||
border-radius: 0.5rem;
|
||||
background: var(--sl-color-accent-low);
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.help-callout code {
|
||||
font-size: 1.05rem;
|
||||
font-weight: 700;
|
||||
color: var(--sl-color-accent-high);
|
||||
white-space: nowrap;
|
||||
background: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.help-callout span {
|
||||
font-size: 0.85rem;
|
||||
color: var(--sl-color-gray-2);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.agents-note {
|
||||
font-size: 0.8rem;
|
||||
color: var(--sl-color-gray-3);
|
||||
margin-bottom: 1rem;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.track-selector {
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
.track-buttons {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.track-btn {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
padding: 0.5rem 0.6rem;
|
||||
border: 1px solid var(--sl-color-gray-5);
|
||||
border-radius: 0.4rem;
|
||||
background: transparent;
|
||||
cursor: pointer;
|
||||
text-align: left;
|
||||
transition: border-color 0.15s ease, background-color 0.15s ease;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.1rem;
|
||||
}
|
||||
|
||||
.track-btn:hover {
|
||||
border-color: var(--sl-color-accent);
|
||||
}
|
||||
|
||||
.track-btn.active {
|
||||
border-color: var(--sl-color-accent);
|
||||
background: var(--sl-color-accent-low);
|
||||
}
|
||||
|
||||
.track-label {
|
||||
font-weight: 600;
|
||||
font-size: 0.85rem;
|
||||
color: var(--sl-color-white);
|
||||
}
|
||||
|
||||
.track-desc {
|
||||
font-size: 0.7rem;
|
||||
color: var(--sl-color-gray-3);
|
||||
}
|
||||
|
||||
.flow-container[data-state="no-track"] .flow-list {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.flow-container[data-state="no-track"] .choose-prompt {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.choose-prompt {
|
||||
display: none;
|
||||
color: var(--sl-color-gray-3);
|
||||
font-style: italic;
|
||||
text-align: center;
|
||||
padding: 1.5rem 0;
|
||||
}
|
||||
|
||||
.flow-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.phase-label {
|
||||
font-size: 0.65rem;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
color: var(--sl-color-gray-3);
|
||||
margin-top: 0.75rem;
|
||||
margin-bottom: 0.3rem;
|
||||
padding-left: 0.25rem;
|
||||
}
|
||||
|
||||
.phase-label:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.phase-label[data-visibility="skip"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.flow-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto auto;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
padding: 0.4rem 0.6rem;
|
||||
border: 1px solid var(--sl-color-gray-5);
|
||||
border-radius: 0.3rem;
|
||||
transition: opacity 0.15s ease, border-color 0.15s ease;
|
||||
}
|
||||
|
||||
.flow-row[data-visibility="active"] {
|
||||
border-color: var(--sl-color-gray-4);
|
||||
}
|
||||
|
||||
.flow-row[data-visibility="skip"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.flow-cmd {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 600;
|
||||
color: var(--sl-color-white);
|
||||
background: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.flow-agent {
|
||||
font-size: 0.75rem;
|
||||
color: var(--sl-color-accent-high);
|
||||
background: var(--sl-color-accent-low);
|
||||
padding: 0.1rem 0.4rem;
|
||||
border-radius: 0.2rem;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.flow-status {
|
||||
font-size: 0.65rem;
|
||||
font-weight: 500;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.03em;
|
||||
min-width: 4rem;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.flow-status[data-status="required"] {
|
||||
color: var(--sl-color-accent-high);
|
||||
}
|
||||
|
||||
.flow-status[data-status="optional"] {
|
||||
color: var(--sl-color-gray-3);
|
||||
}
|
||||
|
||||
.flow-status[data-status="recommended"] {
|
||||
color: var(--sl-color-accent-high);
|
||||
}
|
||||
|
||||
.flow-desc {
|
||||
grid-column: 1 / -1;
|
||||
font-size: 0.75rem;
|
||||
color: var(--sl-color-gray-3);
|
||||
line-height: 1.4;
|
||||
margin: 0.1rem 0 0;
|
||||
}
|
||||
|
||||
.flow-arrow {
|
||||
text-align: center;
|
||||
font-size: 1rem;
|
||||
color: var(--sl-color-gray-4);
|
||||
line-height: 1;
|
||||
padding: 0.15rem 0;
|
||||
}
|
||||
|
||||
.flow-arrow[data-visibility="skip"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dev-loop {
|
||||
border: 1px dashed var(--sl-color-accent);
|
||||
border-radius: 0.4rem;
|
||||
padding: 0.4rem 0.5rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.dev-loop[data-visibility="skip"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dev-loop .flow-row {
|
||||
border-color: var(--sl-color-gray-5);
|
||||
}
|
||||
|
||||
.loop-label {
|
||||
font-size: 0.65rem;
|
||||
font-weight: 600;
|
||||
color: var(--sl-color-accent-high);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
margin-bottom: 0.3rem;
|
||||
}
|
||||
|
||||
@media (max-width: 30rem) {
|
||||
.track-buttons {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.help-callout {
|
||||
flex-direction: column;
|
||||
gap: 0.4rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
function initWorkflowGuide() {
|
||||
const guide = document.querySelector('.workflow-guide');
|
||||
if (!guide) return;
|
||||
|
||||
const trackBtns = guide.querySelectorAll('.track-btn');
|
||||
const flowContainer = guide.querySelector('.flow-container');
|
||||
const allElements = guide.querySelectorAll('[data-quick]');
|
||||
|
||||
trackBtns.forEach((btn) => {
|
||||
btn.addEventListener('click', () => {
|
||||
const track = btn.getAttribute('data-track');
|
||||
|
||||
trackBtns.forEach((b) => b.classList.remove('active'));
|
||||
btn.classList.add('active');
|
||||
|
||||
flowContainer.setAttribute('data-state', 'has-track');
|
||||
|
||||
allElements.forEach((el) => {
|
||||
const status = el.getAttribute(`data-${track}`);
|
||||
|
||||
if (status === 'skip') {
|
||||
el.setAttribute('data-visibility', 'skip');
|
||||
} else {
|
||||
el.setAttribute('data-visibility', 'active');
|
||||
}
|
||||
|
||||
// Update status text for flow rows
|
||||
const statusEl = el.querySelector('.flow-status');
|
||||
if (statusEl) {
|
||||
statusEl.setAttribute('data-status', status);
|
||||
statusEl.textContent = status === 'skip' ? '' : status;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', initWorkflowGuide);
|
||||
document.addEventListener('astro:page-load', initWorkflowGuide);
|
||||
</script>
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
|
||||
import WorkflowGuide from '../components/WorkflowGuide.astro';
|
||||
---
|
||||
|
||||
<StarlightPage
|
||||
frontmatter={{
|
||||
title: 'Workflow Guide',
|
||||
description: 'Interactive guide to the BMad Method workflow — choose your track and see the recommended phases, agents, and outputs.',
|
||||
tableOfContents: false,
|
||||
}}
|
||||
>
|
||||
<p>
|
||||
This interactive guide helps you understand which workflows to run, which agents to use, and what outputs to expect at each phase. Select your project's track to see the relevant path.
|
||||
</p>
|
||||
<WorkflowGuide />
|
||||
</StarlightPage>
|
||||
Loading…
Reference in New Issue