Compare commits

..

No commits in common. "main" and "v6.0.0-Beta.5" have entirely different histories.

120 changed files with 4908 additions and 2345 deletions

View File

@ -1,178 +0,0 @@
---
name: bmad-os-changelog-social
description: Generate social media announcements for Discord, Twitter, and LinkedIn from the latest changelog entry. Use when user asks to create release announcements, social posts, or share changelog updates. Reads CHANGELOG.md in current working directory. Reference examples/ for tone and format.
disable-model-invocation: true
---
# Changelog Social
Generate engaging social media announcements from changelog entries.
## Workflow
### Step 1: Extract Changelog Entry
Read `./CHANGELOG.md` and extract the latest version entry. The changelog follows this format:
```markdown
## [VERSION]
### 🎁 Features
* **Title** — Description
### 🐛 Bug Fixes
* **Title** — Description
### 📚 Documentation
* **Title** — Description
### 🔧 Maintenance
* **Title** — Description
```
Parse:
- **Version number** (e.g., `6.0.0-Beta.5`)
- **Features** - New functionality, enhancements
- **Bug Fixes** - Fixes users will care about
- **Documentation** - New or improved docs
- **Maintenance** - Dependency updates, tooling improvements
### Step 2: Get Git Contributors
Use git log to find contributors since the previous version. Get commits between the current version tag and the previous one:
```bash
# Find the previous version tag first
git tag --sort=-version:refname | head -5
# Get commits between versions with PR numbers and authors
git log <previous-tag>..<current-tag> --pretty=format:"%h|%s|%an" --grep="#"
```
Extract PR numbers from commit messages that contain `#` followed by digits. Compile unique contributors.
### Step 3: Generate Discord Announcement
**Limit: 2,000 characters per message.** Split into multiple messages if needed.
Use this template style:
```markdown
🚀 **BMad vVERSION RELEASED!**
🎉 [Brief hype sentence]
🪥 **KEY HIGHLIGHT** - [One-line summary]
🎯 **CATEGORY NAME**
• Feature one - brief description
• Feature two - brief description
• Coming soon: Future teaser
🔧 **ANOTHER CATEGORY**
• Fix or feature
• Another item
📚 **DOCS OR OTHER**
• Item
• Item with link
🌟 **COMMUNITY PHILOSOPHY** (optional - include for major releases)
• Everything is FREE - No paywalls
• Knowledge shared, not sold
📊 **STATS**
X commits | Y PRs merged | Z files changed
🙏 **CONTRIBUTORS**
@username1 (X PRs!), @username2 (Y PRs!)
@username3, @username4, username5 + dependabot 🛡️
Community-driven FTW! 🌟
📦 **INSTALL:**
`npx bmad-method@VERSION install`
⭐ **SUPPORT US:**
🌟 GitHub: github.com/bmad-code-org/BMAD-METHOD/
📺 YouTube: youtube.com/@BMadCode
☕ Donate: buymeacoffee.com/bmad
🔥 **Next version tease!**
```
**Content Strategy:**
- Focus on **user impact** - what's better for them?
- Highlight **annoying bugs fixed** that frustrated users
- Show **new capabilities** that enable workflows
- Keep it **punchy** - use emojis and short bullets
- Add **personality** - excitement, humor, gratitude
### Step 4: Generate Twitter Post
**Limit: 25,000 characters per tweet (Premium).** With Premium, use a single comprehensive post matching the Discord style (minus Discord-specific formatting). Aim for 1,500-3,000 characters for better engagement.
**Threads are optional** — only use for truly massive releases where you want multiple engagement points.
See `examples/twitter-example.md` for the single-post Premium format.
## Content Selection Guidelines
**Include:**
- New features that change workflows
- Bug fixes for annoying/blocking issues
- Documentation that helps users
- Performance improvements
- New agents or workflows
- Breaking changes (call out clearly)
**Skip/Minimize:**
- Internal refactoring
- Dependency updates (unless user-facing)
- Test improvements
- Minor style fixes
**Emphasize:**
- "Finally fixed" issues
- "Faster" operations
- "Easier" workflows
- "Now supports" capabilities
## Examples
Reference example posts in `examples/` for tone and formatting guidance:
- **discord-example.md** — Full Discord announcement with emojis, sections, contributor shout-outs
- **twitter-example.md** — Twitter thread format (5 tweets max for major releases)
- **linkedin-example.md** — Professional post for major/minor releases with significant features
**When to use LinkedIn:**
- Major version releases (e.g., v6.0.0 Beta, v7.0.0)
- Minor releases with exceptional new features
- Community milestone announcements
Read the appropriate example file before generating to match the established style and voice.
## Output Format
**CRITICAL: ALWAYS write to files** - Create files in `_bmad-output/social/` directory:
1. `{repo-name}-discord-{version}.md` - Discord announcement
2. `{repo-name}-twitter-{version}.md` - Twitter post
3. `{repo-name}-linkedin-{version}.md` - LinkedIn post (if applicable)
Also present a preview in the chat:
```markdown
## Discord Announcement
[paste Discord content here]
## Twitter Post
[paste Twitter content here]
```
Files created:
- `_bmad-output/social/{filename}`
Offer to make adjustments if the user wants different emphasis, tone, or content.

View File

@ -1,53 +0,0 @@
🚀 **BMad v6.0.0-alpha.23 RELEASED!**
🎉 Huge update - almost beta!
🪟 **WINDOWS INSTALLER FIXED** - Menu arrows issue should be fixed! CRLF & ESM problems resolved.
🎯 **PRD WORKFLOWS IMPROVED**
• Validation & Edit workflows added!
• PRD Cohesion check ensures document flows beautifully
• Coming soon: Use of subprocess optimization (context saved!)
• Coming soon: Final format polish step in all workflows - Human consumption OR hyper-optimized LLM condensed initially!
🔧 **WORKFLOW CREATOR & VALIDATOR**
• Subprocess support for advanced optimization
• Path violation checks ensure integrity
• Beyond error checking - offers optimization & flow suggestions!
📚 **NEW DOCS SITE** - docs.bmad-method.org
• Diataxis framework: Tutorials, How-To, Explanations, References
• Current docs still being revised
• Tutorials, blogs & explainers coming soon!
💡 **BRAINSTORMING REVOLUTION**
• 100+ idea goal (quantity-first!)
• Anti-bias protocol (pivot every 10 ideas)
• Chain-of-thought + simulated temperature prompts
• Coming soon: SubProcessing (on-the-fly sub agents)
🌟 **COMMUNITY PHILOSOPHY**
• Everything is FREE - No paywalls, no gated content
• Knowledge shared, not sold
• No premium tiers - full access to our ideas
📊 **27 commits | 217 links converted | 42+ docs created**
🙏 **17 Community PR Authors in this release!**
@lum (6 PRs!), @q00 (3 PRs!), @phil (2 PRs!)
@mike, @alex, @ramiz, @sjennings + dependabot 🛡️
Community-driven FTW! 🌟
📦 **INSTALL ALPHA:**
`npx bmad-method install`
⭐ **SUPPORT US:**
🌟 GitHub: github.com/bmad-code-org/BMAD-METHOD/
📺 YouTube: youtube.com/@BMadCode
🎤 **SPEAKING & MEDIA**
Available for conferences, podcasts, media appearances!
Topics: AI-Native Organizations (Any Industry), BMad Method
DM on Discord for inquiries!
🔥 **V6 Beta is DAYS away!** January 22nd ETA - new features such as xyz and abc bug fixes!

View File

@ -1,49 +0,0 @@
🚀 **Announcing BMad Method v6.0.0 Beta - AI-Native Agile Development Framework**
I'm excited to share that BMad Method, the open-source AI-driven agile development framework, is entering Beta! After 27 alpha releases and countless community contributions, we're approaching a major milestone.
**What's New in v6.0.0-alpha.23**
🪟 **Windows Compatibility Fixed**
We've resolved the installer issues that affected Windows users. The menu arrows problem, CRLF handling, and ESM compatibility are all resolved.
🎯 **Enhanced PRD Workflows**
Our Product Requirements Document workflows now include validation and editing capabilities, with a new cohesion check that ensures your documents flow beautifully. Subprocess optimization is coming soon to save even more context.
🔧 **Workflow Creator & Validator**
New tools for creating and validating workflows with subprocess support, path violation checks, and optimization suggestions that go beyond simple error checking.
📚 **New Documentation Platform**
We've launched docs.bmad-method.org using the Diataxis framework - providing clear separation between tutorials, how-to guides, explanations, and references. Our documentation is being continuously revised and expanded.
💡 **Brainstorming Revolution**
Our brainstorming workflows now use research-backed techniques: 100+ idea goals, anti-bias protocols, chain-of-thought reasoning, and simulated temperature prompts for higher divergence.
**Our Philosophy**
Everything in BMad Method is FREE. No paywalls, no gated content, no premium tiers. We believe knowledge should be shared, not sold. This is community-driven development at its finest.
**The Stats**
- 27 commits in this release
- 217 documentation links converted
- 42+ new documents created
- 17 community PR authors contributed
**Get Started**
```
npx bmad-method@alpha install
```
**Learn More**
- GitHub: github.com/bmad-code-org/BMAD-METHOD
- YouTube: youtube.com/@BMadCode
- Docs: docs.bmad-method.org
**What's Next?**
Beta is just days away with an ETA of January 22nd. We're also available for conferences, podcasts, and media appearances to discuss AI-Native Organizations and the BMad Method.
Have you tried BMad Method yet? I'd love to hear about your experience in the comments!
#AI #SoftwareDevelopment #Agile #OpenSource #DevTools #LLM #AgentEngineering

View File

@ -1,55 +0,0 @@
🚀 **BMad v6.0.0-alpha.23 RELEASED!**
Huge update - we're almost at Beta! 🎉
🪟 **WINDOWS INSTALLER FIXED** - Menu arrows issue should be fixed! CRLF & ESM problems resolved.
🎯 **PRD WORKFLOWS IMPROVED**
• Validation & Edit workflows added!
• PRD Cohesion check ensures document flows beautifully
• Coming soon: Subprocess optimization (context saved!)
• Coming soon: Final format polish step in all workflows
🔧 **WORKFLOW CREATOR & VALIDATOR**
• Subprocess support for advanced optimization
• Path violation checks ensure integrity
• Beyond error checking - offers optimization & flow suggestions!
📚 **NEW DOCS SITE** - docs.bmad-method.org
• Diataxis framework: Tutorials, How-To, Explanations, References
• Current docs still being revised
• Tutorials, blogs & explainers coming soon!
💡 **BRAINSTORMING REVOLUTION**
• 100+ idea goal (quantity-first!)
• Anti-bias protocol (pivot every 10 ideas)
• Chain-of-thought + simulated temperature prompts
• Coming soon: SubProcessing (on-the-fly sub agents)
🌟 **COMMUNITY PHILOSOPHY**
• Everything is FREE - No paywalls, no gated content
• Knowledge shared, not sold
• No premium tiers - full access to our ideas
📊 **27 commits | 217 links converted | 42+ docs created**
🙏 **17 Community PR Authors in this release!**
@lum (6 PRs!), @q00 (3 PRs!), @phil (2 PRs!)
@mike, @alex, @ramiz, @sjennings + dependabot 🛡️
Community-driven FTW! 🌟
📦 **INSTALL ALPHA:**
`npx bmad-method install`
⭐ **SUPPORT US:**
🌟 GitHub: github.com/bmad-code-org/BMAD-METHOD/
📺 YouTube: youtube.com/@BMadCode
🎤 **SPEAKING & MEDIA**
Available for conferences, podcasts, media appearances!
Topics: AI-Native Organizations (Any Industry), BMad Method
DM on Discord for inquiries!
🔥 **V6 Beta is DAYS away!** January 22nd ETA!
#AI #DevTools #Agile #OpenSource #LLM #AgentEngineering

View File

@ -1,6 +1,6 @@
--- ---
name: bmad-os-draft-changelog name: draft-changelog
description: Analyzes changes since last release and updates CHANGELOG.md ONLY. Does NOT trigger releases. description: Analyzes changes since the last release and generates a draft changelog entry
disable-model-invocation: true disable-model-invocation: true
--- ---

View File

@ -1,17 +1,5 @@
# Draft Changelog Execution # Draft Changelog Execution
## ⚠️ IMPORTANT - READ FIRST
**This skill ONLY updates CHANGELOG.md. That is its entire purpose.**
- **DO** update CHANGELOG.md with the new version entry
- **DO** present the draft for user review before editing
- **DO NOT** trigger any GitHub release workflows
- **DO NOT** run any other skills or workflows automatically
- **DO NOT** make any commits
After the changelog is complete, you may suggest the user can run `/release-module` if they want to proceed with the actual release — but NEVER trigger it yourself.
## Input ## Input
Project path (or run from project root) Project path (or run from project root)
@ -65,18 +53,6 @@ Guidelines:
- Clear, concise language - Clear, concise language
- For breaking changes, clearly indicate impact - For breaking changes, clearly indicate impact
## Step 4: Present Draft & Update CHANGELOG.md ## Step 4: Present Draft
Show the draft with current version, last tag, commit count, and options to edit/retry. Show the draft with current version, last tag, commit count, and options to edit/retry.
When user accepts:
1. Update CHANGELOG.md with the new entry (insert at top, after `# Changelog` header)
2. STOP. That's it. You're done.
You may optionally suggest: *"When ready, you can run `/release-module` to create the actual release."*
**DO NOT:**
- Trigger any GitHub workflows
- Run any other skills
- Make any commits
- Do anything beyond updating CHANGELOG.md

View File

@ -1,5 +1,5 @@
--- ---
name: bmad-os-gh-triage name: gh-triage
description: Fetch all GitHub issues via gh CLI and use AI agents to deeply analyze, cluster, and prioritize issues description: Fetch all GitHub issues via gh CLI and use AI agents to deeply analyze, cluster, and prioritize issues
license: MIT license: MIT
disable-model-invocation: true disable-model-invocation: true

View File

@ -1,5 +1,5 @@
--- ---
name: bmad-os-release-module name: release-module
description: Automates the complete release process for npm modules - version bump, changelog, git tag, npm publish, GitHub release description: Automates the complete release process for npm modules - version bump, changelog, git tag, npm publish, GitHub release
disable-model-invocation: true disable-model-invocation: true
--- ---

View File

@ -42,6 +42,10 @@ Publish the package.
Create release with changelog notes using `gh release create`. Create release with changelog notes using `gh release create`.
### Step 10: Confirm Completion
Show npm and GitHub links.
## Error Handling ## Error Handling
Stop immediately on any step failure. Inform user and suggest fix. Stop immediately on any step failure. Inform user and suggest fix.

View File

@ -113,6 +113,3 @@ jobs:
- name: Test agent compilation components - name: Test agent compilation components
run: npm run test:install run: npm run test:install
- name: Validate file references
run: npm run validate:refs

View File

@ -58,7 +58,8 @@
"tmpl", "tmpl",
"Trae", "Trae",
"Unsharded", "Unsharded",
"VNET" "VNET",
"webskip"
], ],
"json.schemas": [ "json.schemas": [
{ {

View File

@ -1,70 +1,5 @@
# Changelog # Changelog
## [6.0.0-Beta.7]
**Release: February 4, 2026**
### 🌟 Key Highlights
1. **Direct Workflow Invocation** — Agent workflows can now be run directly via slash commands instead of only through agent orchestration
2. **Installer Workflow Support** — Installer now picks up `workflow-*.md` files, enabling multiple workflow files per directory
### 🎁 Features
* **Slash Command Workflow Access** — Research and PRD workflows now accessible via direct slash commands: `/domain-research`, `/market-research`, `/technical-research`, `/create-prd`, `/edit-prd`, `/validate-prd` (bd620e38, 731bee26)
* **Version Checking** — CLI now checks npm for newer versions and displays a warning banner when updates are available (d37ee7f2)
### ♻️ Refactoring
* **Workflow File Splitting** — Split monolithic `workflow.md` files into specific `workflow-*.md` files for individual workflow invocation (bd620e38)
* **Installer Multi-Workflow Support** — Installer manifest generator now supports `workflow-*.md` pattern, allowing multiple workflow files per directory (731bee26)
* **Internal Skill Renaming** — Renamed internal project skills to use `bmad-os-` prefix for consistent naming (5276d58b)
---
## [6.0.0-Beta.6]
**Release: February 4, 2026**
### 🌟 Key Highlights
1. **Cross-File Reference Validator**: Comprehensive tool to detect broken file references, preventing 59 known bugs (~25% of historical issues)
2. **New AutocompleteMultiselect Prompt**: Searchable multi-select with improved tool/IDE selection UX
3. **Critical Installer Fixes**: Windows CRLF parsing, Gemini CLI TOML support, file extension preservation
4. **Codebase Cleanup**: Removed dead Excalidraw/flattener artifacts (-3,798 lines)
### 🎁 Features
* **Cross-File Reference Validator** — Validates ~483 references across ~217 source files, detecting absolute path leaks and broken references (PR #1494)
* **AutocompleteMultiselect Prompt** — Upgraded `@clack/prompts` to v1.0.0 with custom searchable multiselect, Tab-to-fill-placeholder behavior, and improved tool/IDE selection UX (PR #1514)
* **OT Domains** — Added `process_control` and `building_automation` domains with high complexity ratings (PR #1510)
* **Documentation Reference Pages** — Added `docs/reference/agents.md`, `commands.md`, and `testing.md` (PR #1525)
### 🐛 Bug Fixes
* **Critical Installer Fixes** — Fixed CRLF line ending parsing on Windows, Gemini CLI TOML support, file extension preservation, Codex task generation, Windows path handling, and CSV parsing (PR #1492)
* **Double Tool Questioning** — Removed redundant tool questioning during installation (df176d42)
* **QA Agent Rename** — Renamed Quinn agent to `qa` for naming consistency (PR #1508)
* **Documentation Organization** — Fixed documentation ordering and links, hide BMGD pages from main LLM docs (PR #1525)
### ♻️ Refactoring
* **Excalidraw/Flattener Removal** — Removed dead artifacts no longer supported beyond beta: Excalidraw workflows, flattener tool, and 12+ diagram creation workflows (-3,798 lines) (f699a368)
* **Centralized Constants** — Centralized `BMAD_FOLDER_NAME` to reduce hardcoded strings (PR #1492)
* **Cross-Platform Paths** — Fixed path separator inconsistencies in agent IDs (PR #1492)
### 📚 Documentation
* **BMGD Diataxis Refactor** — Refactored BMGD documentation using Diataxis principles for better organization (PR #1502)
* **Generate Project Context** — Restored `generate-project-context` workflow for brownfield project analysis (PR #1491)
### 🔧 Maintenance
* **Dependency Updates** — Upgraded `@clack/prompts` from v0.11.0 to v1.0.0 and added `@clack/core` (PR #1514)
* **CI Integration** — Added `validate:refs` to CI quality workflow with warning annotations (PR #1494)
---
## [6.0.0-Beta.5] ## [6.0.0-Beta.5]
### 🎁 Features ### 🎁 Features
@ -1266,6 +1201,7 @@ Located in `src/modules/bmb/workflows/agent/data/`:
- **Workflow Vendoring**: Web bundler performs automatic cross-module dependency vendoring - **Workflow Vendoring**: Web bundler performs automatic cross-module dependency vendoring
- **BMGD Module Extraction**: Game development split into standalone 4-phase structure - **BMGD Module Extraction**: Game development split into standalone 4-phase structure
- **Enhanced Dependency Resolution**: Better handling of web_bundle: false workflows
- **Advanced Elicitation Fix**: Added missing CSV files to workflow bundles - **Advanced Elicitation Fix**: Added missing CSV files to workflow bundles
- **Claude Code Fix**: Resolved README slash command installation regression - **Claude Code Fix**: Resolved README slash command installation regression

View File

@ -1,6 +1,5 @@
--- ---
title: "Game Types Reference" title: "Game Types Reference"
draft: true
--- ---
BMGD supports 24 game type templates. Each adds genre-specific sections to your GDD. BMGD supports 24 game type templates. Each adds genre-specific sections to your GDD.

View File

@ -1,7 +1,6 @@
--- ---
title: "BMGD Quick Guide" title: "BMGD Quick Guide"
description: Quick reference for BMad Game Dev Studio description: Quick reference for BMad Game Dev Studio
draft: true
--- ---
![BMGD Logo](bmgd-logo.png) ![BMGD Logo](bmgd-logo.png)
@ -111,3 +110,4 @@ Each template provides genre-specific GDD sections, mechanics patterns, testing
- [Game Types Guide](game-types.md) - [Game Types Guide](game-types.md)
- [Quick-Flow Guide](quick-flow-workflows.md) - [Quick-Flow Guide](quick-flow-workflows.md)

View File

@ -1,6 +1,5 @@
--- ---
title: "Quick Flow Workflows" title: "Quick Flow Workflows"
draft: true
--- ---
How to create tech specs and execute implementations with Quick Flow. How to create tech specs and execute implementations with Quick Flow.

View File

@ -1,22 +0,0 @@
---
title: Agents
---
This page lists the default BMM (Agile suite) agents that install with BMAD Method, along with their menu triggers and primary workflows.
Notes:
- Triggers are the short menu codes (e.g., `CP`) and fuzzy matches shown in each agent menu.
- Slash commands are generated separately. See `docs/reference/commands.md` for the slash command list and where they are defined.
- QA (Quinn) is the lightweight test automation agent in BMM. The full Test Architect (TEA) lives in its own module.
| Agent | Triggers | Primary workflows |
| --------------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------- |
| Analyst (Mary) | `BP`, `RS`, `CB`, `DP` | Brainstorm Project, Research, Create Brief, Document Project |
| Product Manager (John) | `CP`, `VP`, `EP`, `CE`, `IR`, `CC` | Create/Validate/Edit PRD, Create Epics and Stories, Implementation Readiness, Correct Course |
| Architect (Winston) | `CA`, `IR` | Create Architecture, Implementation Readiness |
| Scrum Master (Bob) | `SP`, `CS`, `ER`, `CC` | Sprint Planning, Create Story, Epic Retrospective, Correct Course |
| Developer (Amelia) | `DS`, `CR` | Dev Story, Code Review |
| QA Engineer (Quinn) | `QA` | Automate (generate tests for existing features) |
| Quick Flow Solo Dev (Barry) | `QS`, `QD`, `CR` | Quick Spec, Quick Dev, Code Review |
| UX Designer (Sally) | `CU` | Create UX Design |
| Technical Writer (Paige) | `DP`, `WD`, `US`, `MG`, `VD`, `EC` | Document Project, Write Document, Update Standards, Mermaid Generate, Validate Doc, Explain Concept |

View File

@ -1,34 +0,0 @@
---
title: Commands
description: How BMAD commands are generated and where to find them.
---
# Commands
BMAD slash commands are generated by the installer for your IDE and **reflect the modules you have installed**.
That means the authoritative list lives **in your project**, not in a static docs page.
## How to Discover Commands (Recommended)
- Type `/bmad` in your IDE and use autocomplete to browse agents/workflows.
- Run `/bmad-help` to get guided next steps and context-aware recommendations.
## Where Commands Are Generated
The installer writes command files into your project (example paths for Claude Code):
- `.claude/commands/bmad/<module>/agents/`
- `.claude/commands/bmad/<module>/workflows/`
These folders are the **canonical, project-specific command list**.
## Common Commands
- `/bmad-help` - Interactive help and next-step guidance
- `/bmad:<module>:agents:<agent>` - Load an agent (e.g. `/bmad:bmm:agents:dev`)
- `/bmad:<module>:workflows:<workflow>` - Run a workflow (e.g. `/bmad:bmm:workflows:create-prd`)
## Why This Page Is Short
BMAD is modular, so the exact commands vary by install.
Use your IDE's autocomplete or the generated command folders above to see *everything* available.

View File

@ -1,21 +0,0 @@
---
title: Testing Options
---
# Testing Options
BMad provides a built-in QA agent for quick test automation and a separate Test Architect (TEA) module for advanced testing.
## Built-in QA (Quinn)
Use the built-in QA agent for fast, straightforward test coverage:
- Trigger: `QA` or `bmad-bmm-qa-automate`
- Best for: small projects, quick coverage, standard patterns
## Test Architect (TEA) Module
TEA is a standalone module with advanced testing workflows (test design, ATDD, automate, review, trace, NFR assessment).
- Documentation: <https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/>
- Install: `npx bmad-method@alpha install` and select the TEA module

View File

@ -58,7 +58,7 @@ Build it, one story at a time.
| `correct-course` | Handle significant mid-sprint changes | Updated plan or re-routing | | `correct-course` | Handle significant mid-sprint changes | Updated plan or re-routing |
| `retrospective` | Review after epic completion | Lessons learned | | `retrospective` | Review after epic completion | Lessons learned |
**Quinn (QA Agent):** Built-in QA agent for test automation. Trigger with `QA` or `bmad-bmm-qa-automate`. Generates standard API and E2E tests using your project's test framework. Beginner-friendly, no configuration needed. For advanced test strategy, install [Test Architect (TEA)](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/) module. **Quinn (QA Agent):** Built-in QA agent for test automation. Trigger with `QA` or `bmad-bmm-automate`. Generates standard API and E2E tests using your project's test framework. Beginner-friendly, no configuration needed. For advanced test strategy, install [Test Architect (TEA)](https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/) module.
## Quick Flow (Parallel Track) ## Quick Flow (Parallel Track)

22
package-lock.json generated
View File

@ -1,16 +1,15 @@
{ {
"name": "bmad-method", "name": "bmad-method",
"version": "6.0.0-Beta.6", "version": "6.0.0-Beta.5",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "bmad-method", "name": "bmad-method",
"version": "6.0.0-Beta.6", "version": "6.0.0-Beta.5",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@clack/core": "^1.0.0", "@clack/prompts": "^0.11.0",
"@clack/prompts": "^1.0.0",
"@kayvan/markdown-tree-parser": "^1.6.1", "@kayvan/markdown-tree-parser": "^1.6.1",
"boxen": "^5.1.2", "boxen": "^5.1.2",
"chalk": "^4.1.2", "chalk": "^4.1.2",
@ -23,7 +22,6 @@
"ignore": "^7.0.5", "ignore": "^7.0.5",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"ora": "^5.4.1", "ora": "^5.4.1",
"picocolors": "^1.1.1",
"semver": "^7.6.3", "semver": "^7.6.3",
"wrap-ansi": "^7.0.0", "wrap-ansi": "^7.0.0",
"xml2js": "^0.6.2", "xml2js": "^0.6.2",
@ -758,9 +756,9 @@
} }
}, },
"node_modules/@clack/core": { "node_modules/@clack/core": {
"version": "1.0.0", "version": "0.5.0",
"resolved": "https://registry.npmjs.org/@clack/core/-/core-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz",
"integrity": "sha512-Orf9Ltr5NeiEuVJS8Rk2XTw3IxNC2Bic3ash7GgYeA8LJ/zmSNpSQ/m5UAhe03lA6KFgklzZ5KTHs4OAMA/SAQ==", "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
@ -768,12 +766,12 @@
} }
}, },
"node_modules/@clack/prompts": { "node_modules/@clack/prompts": {
"version": "1.0.0", "version": "0.11.0",
"resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz",
"integrity": "sha512-rWPXg9UaCFqErJVQ+MecOaWsozjaxol4yjnmYcGNipAWzdaWa2x+VJmKfGq7L0APwBohQOYdHC+9RO4qRXej+A==", "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@clack/core": "1.0.0", "@clack/core": "0.5.0",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
"sisteransi": "^1.0.5" "sisteransi": "^1.0.5"
} }

View File

@ -1,7 +1,7 @@
{ {
"$schema": "https://json.schemastore.org/package.json", "$schema": "https://json.schemastore.org/package.json",
"name": "bmad-method", "name": "bmad-method",
"version": "6.0.0-Beta.6", "version": "6.0.0-Beta.5",
"description": "Breakthrough Method of Agile AI-driven Development", "description": "Breakthrough Method of Agile AI-driven Development",
"keywords": [ "keywords": [
"agile", "agile",
@ -49,7 +49,6 @@
"test:coverage": "c8 --reporter=text --reporter=html npm run test:schemas", "test:coverage": "c8 --reporter=text --reporter=html npm run test:schemas",
"test:install": "node test/test-installation-components.js", "test:install": "node test/test-installation-components.js",
"test:schemas": "node test/test-agent-schema.js", "test:schemas": "node test/test-agent-schema.js",
"validate:refs": "node tools/validate-file-refs.js",
"validate:schemas": "node tools/validate-agent-schema.js" "validate:schemas": "node tools/validate-agent-schema.js"
}, },
"lint-staged": { "lint-staged": {
@ -69,8 +68,7 @@
] ]
}, },
"dependencies": { "dependencies": {
"@clack/core": "^1.0.0", "@clack/prompts": "^0.11.0",
"@clack/prompts": "^1.0.0",
"@kayvan/markdown-tree-parser": "^1.6.1", "@kayvan/markdown-tree-parser": "^1.6.1",
"boxen": "^5.1.2", "boxen": "^5.1.2",
"chalk": "^4.1.2", "chalk": "^4.1.2",
@ -83,7 +81,6 @@
"ignore": "^7.0.5", "ignore": "^7.0.5",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"ora": "^5.4.1", "ora": "^5.4.1",
"picocolors": "^1.1.1",
"semver": "^7.6.3", "semver": "^7.6.3",
"wrap-ansi": "^7.0.0", "wrap-ansi": "^7.0.0",
"xml2js": "^0.6.2", "xml2js": "^0.6.2",

View File

@ -1,3 +1,5 @@
# Business Analyst Agent Definition
agent: agent:
metadata: metadata:
id: "_bmad/bmm/agents/analyst.md" id: "_bmad/bmm/agents/analyst.md"
@ -21,17 +23,9 @@ agent:
data: "{project-root}/_bmad/bmm/data/project-context-template.md" data: "{project-root}/_bmad/bmm/data/project-context-template.md"
description: "[BP] Brainstorm Project: Expert Guided Facilitation through a single or multiple techniques with a final report" description: "[BP] Brainstorm Project: Expert Guided Facilitation through a single or multiple techniques with a final report"
- trigger: MR or fuzzy match on market-research - trigger: RS or fuzzy match on research
exec: "{project-root}/_bmad/bmm/workflows/1-analysis/research/workflow-market-research.md" exec: "{project-root}/_bmad/bmm/workflows/1-analysis/research/workflow.md"
description: "[MR] Market Research: Market analysis, competitive landscape, customer needs and trends" description: "[RS] Research: Choose from or specify market, domain, competitive analysis, or technical research"
- trigger: DR or fuzzy match on domain-research
exec: "{project-root}/_bmad/bmm/workflows/1-analysis/research/workflow-domain-research.md"
description: "[DR] Domain Research: Industry domain deep dive, subject matter expertise and terminology"
- trigger: TR or fuzzy match on technical-research
exec: "{project-root}/_bmad/bmm/workflows/1-analysis/research/workflow-technical-research.md"
description: "[TR] Technical Research: Technical feasibility, architecture options and implementation approaches"
- trigger: CB or fuzzy match on product-brief - trigger: CB or fuzzy match on product-brief
exec: "{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md" exec: "{project-root}/_bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md"

View File

@ -1,6 +1,7 @@
# Dev Implementation Agent Definition (v6) # Dev Implementation Agent Definition (v6)
agent: agent:
webskip: true
metadata: metadata:
id: "_bmad/bmm/agents/dev.md" id: "_bmad/bmm/agents/dev.md"
name: Amelia name: Amelia

View File

@ -1,3 +1,6 @@
# Product Manager Agent Definition
# This file defines the PM agent for the BMAD BMM module
agent: agent:
metadata: metadata:
id: "_bmad/bmm/agents/pm.md" id: "_bmad/bmm/agents/pm.md"
@ -19,15 +22,15 @@ agent:
menu: menu:
- trigger: CP or fuzzy match on create-prd - trigger: CP or fuzzy match on create-prd
exec: "{project-root}/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md" exec: "{project-root}/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md"
description: "[CP] Create PRD: Expert led facilitation to produce your Product Requirements Document" description: "[CP] Create PRD: Expert led facilitation to produce your Product Requirements Document"
- trigger: VP or fuzzy match on validate-prd - trigger: VP or fuzzy match on validate-prd
exec: "{project-root}/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md" exec: "{project-root}/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md"
description: "[VP] Validate PRD: Validate a Product Requirements Document is comprehensive, lean, well organized and cohesive" description: "[VP] Validate PRD: Validate a Product Requirements Document is comprehensive, lean, well organized and cohesive"
- trigger: EP or fuzzy match on edit-prd - trigger: EP or fuzzy match on edit-prd
exec: "{project-root}/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md" exec: "{project-root}/_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md"
description: "[EP] Edit PRD: Update an existing Product Requirements Document" description: "[EP] Edit PRD: Update an existing Product Requirements Document"
- trigger: CE or fuzzy match on epics-stories - trigger: CE or fuzzy match on epics-stories

View File

@ -1,6 +1,6 @@
agent: agent:
metadata: metadata:
id: "_bmad/bmm/agents/qa" id: "_bmad/bmm/agents/quinn"
name: Quinn name: Quinn
title: QA Engineer title: QA Engineer
icon: 🧪 icon: 🧪
@ -27,7 +27,7 @@ agent:
- Focus on realistic user scenarios - Focus on realistic user scenarios
menu: menu:
- trigger: QA or fuzzy match on qa-automate - trigger: qa
workflow: "{project-root}/_bmad/bmm/workflows/qa/automate/workflow.yaml" workflow: "{project-root}/_bmad/bmm/workflows/qa/automate/workflow.yaml"
description: "[QA] Automate - Generate tests for existing features (simplified)" description: "[QA] Automate - Generate tests for existing features (simplified)"
@ -54,4 +54,4 @@ agent:
For comprehensive test strategy, risk-based planning, quality gates, and enterprise features, For comprehensive test strategy, risk-based planning, quality gates, and enterprise features,
install the Test Architect (TEA) module: https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/ install the Test Architect (TEA) module: https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/
Ready to generate some tests? Just say `QA` or `bmad-bmm-qa-automate`! Ready to generate some tests? Just say `QA` or `bmad-bmm-automate`!

View File

@ -4,22 +4,29 @@ bmm,anytime,Generate Project Context,GPC,,_bmad/bmm/workflows/generate-project-c
bmm,anytime,Quick Spec,QS,,_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md,bmad-bmm-quick-spec,false,quick-flow-solo-dev,Create Mode,"Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method. Quick one-off tasks small changes simple apps brownfield additions to well established patterns utilities without extensive planning",planning_artifacts,"tech spec", bmm,anytime,Quick Spec,QS,,_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md,bmad-bmm-quick-spec,false,quick-flow-solo-dev,Create Mode,"Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method. Quick one-off tasks small changes simple apps brownfield additions to well established patterns utilities without extensive planning",planning_artifacts,"tech spec",
bmm,anytime,Quick Dev,QD,,_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md,bmad-bmm-quick-dev,false,quick-flow-solo-dev,Create Mode,"Quick one-off tasks small changes simple apps utilities without extensive planning - Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method, unless the user is already working through the implementation phase and just requests a 1 off things not already in the plan",,, bmm,anytime,Quick Dev,QD,,_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md,bmad-bmm-quick-dev,false,quick-flow-solo-dev,Create Mode,"Quick one-off tasks small changes simple apps utilities without extensive planning - Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method, unless the user is already working through the implementation phase and just requests a 1 off things not already in the plan",,,
bmm,anytime,Correct Course,CC,,_bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml,bmad-bmm-correct-course,false,sm,Create Mode,"Anytime: Navigate significant changes. May recommend start over update PRD redo architecture sprint planning or correct epics and stories",planning_artifacts,"change proposal", bmm,anytime,Correct Course,CC,,_bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml,bmad-bmm-correct-course,false,sm,Create Mode,"Anytime: Navigate significant changes. May recommend start over update PRD redo architecture sprint planning or correct epics and stories",planning_artifacts,"change proposal",
bmm,anytime,Write Document,WD,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,,false,tech-writer,,"Describe in detail what you want, and the agent will follow the documentation best practices defined in agent memory. Multi-turn conversation with subprocess for research/review.",project-knowledge,"document", bmm,anytime,Create Dataflow,CDF,,_bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml,bmad-bmm-create-excalidraw-dataflow,false,ux-designer,Create Mode,"Create data flow diagrams (DFD) in Excalidraw format - can be called standalone or during any workflow to add visual documentation",planning_artifacts,"dataflow diagram",
bmm,anytime,Update Standards,US,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,,false,tech-writer,,"Update agent memory documentation-standards.md with your specific preferences if you discover missing document conventions.",_bmad/_memory/tech-writer-sidecar,"standards", bmm,anytime,Create Diagram,CED,,_bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml,bmad-bmm-create-excalidraw-diagram,false,ux-designer,Create Mode,"Create system architecture diagrams ERDs UML diagrams or general technical diagrams in Excalidraw format - use anytime or call from architecture workflow to add visual documentation",planning_artifacts,"diagram",
bmm,anytime,Mermaid Generate,MG,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,,false,tech-writer,,"Create a Mermaid diagram based on user description. Will suggest diagram types if not specified.",planning_artifacts,"mermaid diagram", bmm,anytime,Create Flowchart,CFC,,_bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml,bmad-bmm-create-excalidraw-flowchart,false,ux-designer,Create Mode,"Create a flowchart visualization in Excalidraw format for processes pipelines or logic flows - use anytime or during architecture to add process documentation",planning_artifacts,"flowchart",
bmm,anytime,Validate Document,VD,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,,false,tech-writer,,"Review the specified document against documentation standards and best practices. Returns specific actionable improvement suggestions organized by priority.",planning_artifacts,"validation report", bmm,anytime,Create Wireframe,CEW,,_bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml,bmad-bmm-create-excalidraw-wireframe,false,ux-designer,Create Mode,"Create website or app wireframes in Excalidraw format - use anytime standalone or call from UX workflow to add UI mockups",planning_artifacts,"wireframe",
bmm,anytime,Explain Concept,EC,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,,false,tech-writer,,"Create clear technical explanations with examples and diagrams for complex concepts. Breaks down into digestible sections using task-oriented approach.",project_knowledge,"explanation", bmm,anytime,Write Document,WD,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-write-document,false,tech-writer,,"Describe in detail what you want, and the agent will follow the documentation best practices defined in agent memory. Multi-turn conversation with subprocess for research/review.",project-knowledge,"document",
bmm,anytime,Update Standards,US,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-update-standards,false,tech-writer,,"Update agent memory documentation-standards.md with your specific preferences if you discover missing document conventions.",_bmad/_memory/tech-writer-sidecar,"standards",
bmm,anytime,Mermaid Generate,MG,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-mermaid-generate,false,tech-writer,,"Create a Mermaid diagram based on user description. Will suggest diagram types if not specified.",planning_artifacts,"mermaid diagram",
bmm,anytime,Validate Document,VD,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-validate-document,false,tech-writer,,"Review the specified document against documentation standards and best practices. Returns specific actionable improvement suggestions organized by priority.",planning_artifacts,"validation report",
bmm,anytime,Explain Concept,EC,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-explain-concept,false,tech-writer,,"Create clear technical explanations with examples and diagrams for complex concepts. Breaks down into digestible sections using task-oriented approach.",project_knowledge,"explanation",
bmm,1-analysis,Brainstorm Project,BP,10,_bmad/core/workflows/brainstorming/workflow.md,bmad-brainstorming,false,analyst,data=_bmad/bmm/data/project-context-template.md,"Expert Guided Facilitation through a single or multiple techniques",planning_artifacts,"brainstorming session", bmm,1-analysis,Brainstorm Project,BP,10,_bmad/core/workflows/brainstorming/workflow.md,bmad-brainstorming,false,analyst,data=_bmad/bmm/data/project-context-template.md,"Expert Guided Facilitation through a single or multiple techniques",planning_artifacts,"brainstorming session",
bmm,1-analysis,Market Research,MR,20,_bmad/bmm/workflows/1-analysis/research/workflow-market-research.md,bmad-bmm-market-research,false,analyst,Create Mode,"Market analysis competitive landscape customer needs and trends","planning_artifacts|project-knowledge","research documents", bmm,1-analysis,Market Research,MR,20,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=market,"Market analysis competitive landscape customer needs and trends","planning_artifacts|project-knowledge","research documents",
bmm,1-analysis,Domain Research,DR,21,_bmad/bmm/workflows/1-analysis/research/workflow-domain-research.md,bmad-bmm-domain-research,false,analyst,Create Mode,"Industry domain deep dive subject matter expertise and terminology","planning_artifacts|project_knowledge","research documents", bmm,1-analysis,Domain Research,DR,21,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=domain,"Industry domain deep dive subject matter expertise and terminology","planning_artifacts|project_knowledge","research documents",
bmm,1-analysis,Technical Research,TR,22,_bmad/bmm/workflows/1-analysis/research/workflow-technical-research.md,bmad-bmm-technical-research,false,analyst,Create Mode,"Technical feasibility architecture options and implementation approaches","planning_artifacts|project_knowledge","research documents", bmm,1-analysis,Technical Research,TR,22,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=technical,"Technical feasibility architecture options and implementation approaches","planning_artifacts|project_knowledge","research documents",
bmm,1-analysis,Create Brief,CB,30,_bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md,bmad-bmm-create-product-brief,false,analyst,Create Mode,"A guided experience to nail down your product idea",planning_artifacts,"product brief", bmm,1-analysis,Create Brief,CB,30,_bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md,bmad-bmm-create-brief,false,analyst,Create Mode,"A guided experience to nail down your product idea",planning_artifacts,"product brief",
bmm,2-planning,Create PRD,CP,10,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md,bmad-bmm-create-prd,true,pm,Create Mode,"Expert led facilitation to produce your Product Requirements Document",planning_artifacts,prd, bmm,1-analysis,Validate Brief,VB,40,_bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md,bmad-bmm-validate-brief,false,analyst,Validate Mode,"Validates product brief completeness",planning_artifacts,"brief validation report",
bmm,2-planning,Validate PRD,VP,20,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md,bmad-bmm-validate-prd,false,pm,Validate Mode,"Validate PRD is comprehensive lean well organized and cohesive",planning_artifacts,"prd validation report", bmm,2-planning,Create PRD,CP,10,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md,bmad-bmm-create-prd,true,pm,Create Mode,"Expert led facilitation to produce your Product Requirements Document",planning_artifacts,prd,
bmm,2-planning,Edit PRD,EP,25,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md,bmad-bmm-edit-prd,false,pm,Edit Mode,"Improve and enhance an existing PRD",planning_artifacts,"updated prd", bmm,2-planning,Validate PRD,VP,20,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md,bmad-bmm-validate-prd,false,pm,Validate Mode,"Validate PRD is comprehensive lean well organized and cohesive",planning_artifacts,"prd validation report",
bmm,2-planning,Create UX,CU,30,_bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md,bmad-bmm-create-ux-design,false,ux-designer,Create Mode,"Guidance through realizing the plan for your UX, strongly recommended if a UI is a primary piece of the proposed project",planning_artifacts,"ux design", bmm,2-planning,Create UX,CU,30,_bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md,bmad-bmm-create-ux-design,false,ux-designer,Create Mode,"Guidance through realizing the plan for your UX, strongly recommended if a UI is a primary piece of the proposed project",planning_artifacts,"ux design",
bmm,2-planning,Validate UX,VU,40,_bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md,bmad-bmm-create-ux-design,false,ux-designer,Validate Mode,"Validates UX design deliverables",planning_artifacts,"ux validation report",
bmm,3-solutioning,Create Architecture,CA,10,_bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md,bmad-bmm-create-architecture,true,architect,Create Mode,"Guided Workflow to document technical decisions",planning_artifacts,architecture, bmm,3-solutioning,Create Architecture,CA,10,_bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md,bmad-bmm-create-architecture,true,architect,Create Mode,"Guided Workflow to document technical decisions",planning_artifacts,architecture,
bmm,3-solutioning,Validate Architecture,VA,20,_bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md,bmad-bmm-create-architecture,false,architect,Validate Mode,"Validates architecture completeness",planning_artifacts,"architecture validation report",
bmm,3-solutioning,Create Epics and Stories,CE,30,_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md,bmad-bmm-create-epics-and-stories,true,pm,Create Mode,"Create the Epics and Stories Listing",planning_artifacts,"epics and stories", bmm,3-solutioning,Create Epics and Stories,CE,30,_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md,bmad-bmm-create-epics-and-stories,true,pm,Create Mode,"Create the Epics and Stories Listing",planning_artifacts,"epics and stories",
bmm,3-solutioning,Validate Epics and Stories,VE,40,_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md,bmad-bmm-create-epics-and-stories,false,pm,Validate Mode,"Validates epics and stories completeness",planning_artifacts,"epics validation report",
bmm,3-solutioning,Check Implementation Readiness,IR,70,_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md,bmad-bmm-check-implementation-readiness,true,architect,Validate Mode,"Ensure PRD UX Architecture and Epics Stories are aligned",planning_artifacts,"readiness report", bmm,3-solutioning,Check Implementation Readiness,IR,70,_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md,bmad-bmm-check-implementation-readiness,true,architect,Validate Mode,"Ensure PRD UX Architecture and Epics Stories are aligned",planning_artifacts,"readiness report",
bmm,4-implementation,Sprint Planning,SP,10,_bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml,bmad-bmm-sprint-planning,true,sm,Create Mode,"Generate sprint plan for development tasks - this kicks off the implementation phase by producing a plan the implementation agents will follow in sequence for every story in the plan.",implementation_artifacts,"sprint status", bmm,4-implementation,Sprint Planning,SP,10,_bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml,bmad-bmm-sprint-planning,true,sm,Create Mode,"Generate sprint plan for development tasks - this kicks off the implementation phase by producing a plan the implementation agents will follow in sequence for every story in the plan.",implementation_artifacts,"sprint status",
bmm,4-implementation,Sprint Status,SS,20,_bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml,bmad-bmm-sprint-status,false,sm,Create Mode,"Anytime: Summarize sprint status and route to next workflow",,, bmm,4-implementation,Sprint Status,SS,20,_bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml,bmad-bmm-sprint-status,false,sm,Create Mode,"Anytime: Summarize sprint status and route to next workflow",,,
@ -27,5 +34,5 @@ bmm,4-implementation,Validate Story,VS,35,_bmad/bmm/workflows/4-implementation/c
bmm,4-implementation,Create Story,CS,30,_bmad/bmm/workflows/4-implementation/create-story/workflow.yaml,bmad-bmm-create-story,true,sm,Create Mode,"Story cycle start: Prepare first found story in the sprint plan that is next, or if the command is run with a specific epic and story designation with context. Once complete, then VS then DS then CR then back to DS if needed or next CS or ER",implementation_artifacts,story, bmm,4-implementation,Create Story,CS,30,_bmad/bmm/workflows/4-implementation/create-story/workflow.yaml,bmad-bmm-create-story,true,sm,Create Mode,"Story cycle start: Prepare first found story in the sprint plan that is next, or if the command is run with a specific epic and story designation with context. Once complete, then VS then DS then CR then back to DS if needed or next CS or ER",implementation_artifacts,story,
bmm,4-implementation,Dev Story,DS,40,_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml,bmad-bmm-dev-story,true,dev,Create Mode,"Story cycle: Execute story implementation tasks and tests then CR then back to DS if fixes needed",,, bmm,4-implementation,Dev Story,DS,40,_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml,bmad-bmm-dev-story,true,dev,Create Mode,"Story cycle: Execute story implementation tasks and tests then CR then back to DS if fixes needed",,,
bmm,4-implementation,Code Review,CR,50,_bmad/bmm/workflows/4-implementation/code-review/workflow.yaml,bmad-bmm-code-review,false,dev,Create Mode,"Story cycle: If issues back to DS if approved then next CS or ER if epic complete",,, bmm,4-implementation,Code Review,CR,50,_bmad/bmm/workflows/4-implementation/code-review/workflow.yaml,bmad-bmm-code-review,false,dev,Create Mode,"Story cycle: If issues back to DS if approved then next CS or ER if epic complete",,,
bmm,4-implementation,QA Automation Test,QA,45,_bmad/bmm/workflows/qa/automate/workflow.yaml,bmad-bmm-qa-automate,false,qa,Create Mode,"Generate automated API and E2E tests for implemented code using the project's existing test framework (detects existing well known in use test frameworks). Use after implementation to add test coverage. NOT for code review or story validation - use CR for that.",implementation_artifacts,"test suite", bmm,4-implementation,QA Automation Test,QA,45,_bmad/bmm/workflows/qa/automate/workflow.yaml,bmad-bmm-qa-automate,false,quinn,Create Mode,"Generate automated API and E2E tests for implemented code using the project's existing test framework (detects existing well known in use test frameworks). Use after implementation to add test coverage. NOT for code review or story validation - use CR for that.",implementation_artifacts,"test suite",
bmm,4-implementation,Retrospective,ER,60,_bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml,bmad-bmm-retrospective,false,sm,Create Mode,"Optional at epic end: Review completed work lessons learned and next epic or if major issues consider CC",implementation_artifacts,retrospective, bmm,4-implementation,Retrospective,ER,60,_bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml,bmad-bmm-retrospective,false,sm,Create Mode,"Optional at epic end: Review completed work lessons learned and next epic or if major issues consider CC",implementation_artifacts,retrospective,

1 module phase name code sequence workflow-file command required agent options description output-location outputs
4 bmm anytime Quick Spec QS _bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md bmad-bmm-quick-spec false quick-flow-solo-dev Create Mode Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method. Quick one-off tasks small changes simple apps brownfield additions to well established patterns utilities without extensive planning planning_artifacts tech spec
5 bmm anytime Quick Dev QD _bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md bmad-bmm-quick-dev false quick-flow-solo-dev Create Mode Quick one-off tasks small changes simple apps utilities without extensive planning - Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method, unless the user is already working through the implementation phase and just requests a 1 off things not already in the plan
6 bmm anytime Correct Course CC _bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml bmad-bmm-correct-course false sm Create Mode Anytime: Navigate significant changes. May recommend start over update PRD redo architecture sprint planning or correct epics and stories planning_artifacts change proposal
7 bmm anytime Write Document Create Dataflow WD CDF _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml _bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml bmad-bmm-create-excalidraw-dataflow false tech-writer ux-designer Create Mode Describe in detail what you want, and the agent will follow the documentation best practices defined in agent memory. Multi-turn conversation with subprocess for research/review. Create data flow diagrams (DFD) in Excalidraw format - can be called standalone or during any workflow to add visual documentation project-knowledge planning_artifacts document dataflow diagram
8 bmm anytime Update Standards Create Diagram US CED _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml _bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml bmad-bmm-create-excalidraw-diagram false tech-writer ux-designer Create Mode Update agent memory documentation-standards.md with your specific preferences if you discover missing document conventions. Create system architecture diagrams ERDs UML diagrams or general technical diagrams in Excalidraw format - use anytime or call from architecture workflow to add visual documentation _bmad/_memory/tech-writer-sidecar planning_artifacts standards diagram
9 bmm anytime Mermaid Generate Create Flowchart MG CFC _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml _bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml bmad-bmm-create-excalidraw-flowchart false tech-writer ux-designer Create Mode Create a Mermaid diagram based on user description. Will suggest diagram types if not specified. Create a flowchart visualization in Excalidraw format for processes pipelines or logic flows - use anytime or during architecture to add process documentation planning_artifacts mermaid diagram flowchart
10 bmm anytime Validate Document Create Wireframe VD CEW _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml _bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml bmad-bmm-create-excalidraw-wireframe false tech-writer ux-designer Create Mode Review the specified document against documentation standards and best practices. Returns specific actionable improvement suggestions organized by priority. Create website or app wireframes in Excalidraw format - use anytime standalone or call from UX workflow to add UI mockups planning_artifacts validation report wireframe
11 bmm anytime Explain Concept Write Document EC WD _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml bmad-bmm-write-document false tech-writer Create clear technical explanations with examples and diagrams for complex concepts. Breaks down into digestible sections using task-oriented approach. Describe in detail what you want, and the agent will follow the documentation best practices defined in agent memory. Multi-turn conversation with subprocess for research/review. project_knowledge project-knowledge explanation document
12 bmm anytime Update Standards US _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml bmad-bmm-update-standards false tech-writer Update agent memory documentation-standards.md with your specific preferences if you discover missing document conventions. _bmad/_memory/tech-writer-sidecar standards
13 bmm anytime Mermaid Generate MG _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml bmad-bmm-mermaid-generate false tech-writer Create a Mermaid diagram based on user description. Will suggest diagram types if not specified. planning_artifacts mermaid diagram
14 bmm anytime Validate Document VD _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml bmad-bmm-validate-document false tech-writer Review the specified document against documentation standards and best practices. Returns specific actionable improvement suggestions organized by priority. planning_artifacts validation report
15 bmm anytime Explain Concept EC _bmad/bmm/agents/tech-writer/tech-writer.agent.yaml bmad-bmm-explain-concept false tech-writer Create clear technical explanations with examples and diagrams for complex concepts. Breaks down into digestible sections using task-oriented approach. project_knowledge explanation
16 bmm 1-analysis Brainstorm Project BP 10 _bmad/core/workflows/brainstorming/workflow.md bmad-brainstorming false analyst data=_bmad/bmm/data/project-context-template.md Expert Guided Facilitation through a single or multiple techniques planning_artifacts brainstorming session
17 bmm 1-analysis Market Research MR 20 _bmad/bmm/workflows/1-analysis/research/workflow-market-research.md _bmad/bmm/workflows/1-analysis/research/workflow.md bmad-bmm-market-research bmad-bmm-research false analyst Create Mode Create Mode research_type=market Market analysis competitive landscape customer needs and trends planning_artifacts|project-knowledge research documents
18 bmm 1-analysis Domain Research DR 21 _bmad/bmm/workflows/1-analysis/research/workflow-domain-research.md _bmad/bmm/workflows/1-analysis/research/workflow.md bmad-bmm-domain-research bmad-bmm-research false analyst Create Mode Create Mode research_type=domain Industry domain deep dive subject matter expertise and terminology planning_artifacts|project_knowledge research documents
19 bmm 1-analysis Technical Research TR 22 _bmad/bmm/workflows/1-analysis/research/workflow-technical-research.md _bmad/bmm/workflows/1-analysis/research/workflow.md bmad-bmm-technical-research bmad-bmm-research false analyst Create Mode Create Mode research_type=technical Technical feasibility architecture options and implementation approaches planning_artifacts|project_knowledge research documents
20 bmm 1-analysis Create Brief CB 30 _bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md bmad-bmm-create-product-brief bmad-bmm-create-brief false analyst Create Mode A guided experience to nail down your product idea planning_artifacts product brief
21 bmm 2-planning 1-analysis Create PRD Validate Brief CP VB 10 40 _bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md _bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md bmad-bmm-create-prd bmad-bmm-validate-brief true false pm analyst Create Mode Validate Mode Expert led facilitation to produce your Product Requirements Document Validates product brief completeness planning_artifacts prd brief validation report
22 bmm 2-planning Validate PRD Create PRD VP CP 20 10 _bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md _bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md bmad-bmm-validate-prd bmad-bmm-create-prd false true pm Validate Mode Create Mode Validate PRD is comprehensive lean well organized and cohesive Expert led facilitation to produce your Product Requirements Document planning_artifacts prd validation report prd
23 bmm 2-planning Edit PRD Validate PRD EP VP 25 20 _bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md _bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md bmad-bmm-edit-prd bmad-bmm-validate-prd false pm Edit Mode Validate Mode Improve and enhance an existing PRD Validate PRD is comprehensive lean well organized and cohesive planning_artifacts updated prd prd validation report
24 bmm 2-planning Create UX CU 30 _bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md bmad-bmm-create-ux-design false ux-designer Create Mode Guidance through realizing the plan for your UX, strongly recommended if a UI is a primary piece of the proposed project planning_artifacts ux design
25 bmm 2-planning Validate UX VU 40 _bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md bmad-bmm-create-ux-design false ux-designer Validate Mode Validates UX design deliverables planning_artifacts ux validation report
26 bmm 3-solutioning Create Architecture CA 10 _bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md bmad-bmm-create-architecture true architect Create Mode Guided Workflow to document technical decisions planning_artifacts architecture
27 bmm 3-solutioning Validate Architecture VA 20 _bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md bmad-bmm-create-architecture false architect Validate Mode Validates architecture completeness planning_artifacts architecture validation report
28 bmm 3-solutioning Create Epics and Stories CE 30 _bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md bmad-bmm-create-epics-and-stories true pm Create Mode Create the Epics and Stories Listing planning_artifacts epics and stories
29 bmm 3-solutioning Validate Epics and Stories VE 40 _bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md bmad-bmm-create-epics-and-stories false pm Validate Mode Validates epics and stories completeness planning_artifacts epics validation report
30 bmm 3-solutioning Check Implementation Readiness IR 70 _bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md bmad-bmm-check-implementation-readiness true architect Validate Mode Ensure PRD UX Architecture and Epics Stories are aligned planning_artifacts readiness report
31 bmm 4-implementation Sprint Planning SP 10 _bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml bmad-bmm-sprint-planning true sm Create Mode Generate sprint plan for development tasks - this kicks off the implementation phase by producing a plan the implementation agents will follow in sequence for every story in the plan. implementation_artifacts sprint status
32 bmm 4-implementation Sprint Status SS 20 _bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml bmad-bmm-sprint-status false sm Create Mode Anytime: Summarize sprint status and route to next workflow
34 bmm 4-implementation Create Story CS 30 _bmad/bmm/workflows/4-implementation/create-story/workflow.yaml bmad-bmm-create-story true sm Create Mode Story cycle start: Prepare first found story in the sprint plan that is next, or if the command is run with a specific epic and story designation with context. Once complete, then VS then DS then CR then back to DS if needed or next CS or ER implementation_artifacts story
35 bmm 4-implementation Dev Story DS 40 _bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml bmad-bmm-dev-story true dev Create Mode Story cycle: Execute story implementation tasks and tests then CR then back to DS if fixes needed
36 bmm 4-implementation Code Review CR 50 _bmad/bmm/workflows/4-implementation/code-review/workflow.yaml bmad-bmm-code-review false dev Create Mode Story cycle: If issues back to DS if approved then next CS or ER if epic complete
37 bmm 4-implementation QA Automation Test QA 45 _bmad/bmm/workflows/qa/automate/workflow.yaml bmad-bmm-qa-automate false qa quinn Create Mode Generate automated API and E2E tests for implemented code using the project's existing test framework (detects existing well known in use test frameworks). Use after implementation to add test coverage. NOT for code review or story validation - use CR for that. implementation_artifacts test suite
38 bmm 4-implementation Retrospective ER 60 _bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml bmad-bmm-retrospective false sm Create Mode Optional at epic end: Review completed work lessons learned and next epic or if major issues consider CC implementation_artifacts retrospective

View File

@ -1,6 +1,7 @@
--- ---
name: create-product-brief name: create-product-brief
description: Create comprehensive product briefs through collaborative step-by-step discovery as creative Business Analyst working with the user as peers. description: Create comprehensive product briefs through collaborative step-by-step discovery as creative Business Analyst working with the user as peers.
web_bundle: true
--- ---
# Product Brief Workflow # Product Brief Workflow

View File

@ -1,54 +0,0 @@
---
name: domain-research
description: Conduct domain research covering industry analysis, regulations, technology trends, and ecosystem dynamics using current web data and verified sources.
---
# Domain Research Workflow
**Goal:** Conduct comprehensive domain/industry research using current web data and verified sources to produce complete research documents with compelling narratives and proper citations.
**Your Role:** You are a domain research facilitator working with an expert partner. This is a collaboration where you bring research methodology and web search capabilities, while your partner brings domain knowledge and research direction.
## PREREQUISITE
**⛔ Web search required.** If unavailable, abort and tell the user.
## CONFIGURATION
Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
- `project_name`, `output_folder`, `planning_artifacts`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level`
- `date` as a system-generated value
## QUICK TOPIC DISCOVERY
"Welcome {{user_name}}! Let's get started with your **domain/industry research**.
**What domain, industry, or sector do you want to research?**
For example:
- 'The healthcare technology industry'
- 'Sustainable packaging regulations in Europe'
- 'Construction and building materials sector'
- 'Or any other domain you have in mind...'"
### Topic Clarification
Based on the user's topic, briefly clarify:
1. **Core Domain**: "What specific aspect of [domain] are you most interested in?"
2. **Research Goals**: "What do you hope to achieve with this research?"
3. **Scope**: "Should we focus broadly or dive deep into specific aspects?"
## ROUTE TO DOMAIN RESEARCH STEPS
After gathering the topic and goals:
1. Set `research_type = "domain"`
2. Set `research_topic = [discovered topic from discussion]`
3. Set `research_goals = [discovered goals from discussion]`
4. Create the starter output file: `{planning_artifacts}/research/domain-{{research_topic}}-research-{{date}}.md` with exact copy of the `./research.template.md` contents
5. Load: `./domain-steps/step-01-init.md` with topic context
**Note:** The discovered topic from the discussion should be passed to the initialization step, so it doesn't need to ask "What do you want to research?" again - it can focus on refining the scope for domain research.
**✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}`**

View File

@ -1,54 +0,0 @@
---
name: market-research
description: Conduct market research covering market size, growth, competition, and customer insights using current web data and verified sources.
---
# Market Research Workflow
**Goal:** Conduct comprehensive market research using current web data and verified sources to produce complete research documents with compelling narratives and proper citations.
**Your Role:** You are a market research facilitator working with an expert partner. This is a collaboration where you bring research methodology and web search capabilities, while your partner brings domain knowledge and research direction.
## PREREQUISITE
**⛔ Web search required.** If unavailable, abort and tell the user.
## CONFIGURATION
Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
- `project_name`, `output_folder`, `planning_artifacts`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level`
- `date` as a system-generated value
## QUICK TOPIC DISCOVERY
"Welcome {{user_name}}! Let's get started with your **market research**.
**What topic, problem, or area do you want to research?**
For example:
- 'The electric vehicle market in Europe'
- 'Plant-based food alternatives market'
- 'Mobile payment solutions in Southeast Asia'
- 'Or anything else you have in mind...'"
### Topic Clarification
Based on the user's topic, briefly clarify:
1. **Core Topic**: "What exactly about [topic] are you most interested in?"
2. **Research Goals**: "What do you hope to achieve with this research?"
3. **Scope**: "Should we focus broadly or dive deep into specific aspects?"
## ROUTE TO MARKET RESEARCH STEPS
After gathering the topic and goals:
1. Set `research_type = "market"`
2. Set `research_topic = [discovered topic from discussion]`
3. Set `research_goals = [discovered goals from discussion]`
4. Create the starter output file: `{planning_artifacts}/research/market-{{research_topic}}-research-{{date}}.md` with exact copy of the `./research.template.md` contents
5. Load: `./market-steps/step-01-init.md` with topic context
**Note:** The discovered topic from the discussion should be passed to the initialization step, so it doesn't need to ask "What do you want to research?" again - it can focus on refining the scope for market research.
**✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}`**

View File

@ -1,54 +0,0 @@
---
name: technical-research
description: Conduct technical research covering technology evaluation, architecture decisions, and implementation approaches using current web data and verified sources.
---
# Technical Research Workflow
**Goal:** Conduct comprehensive technical research using current web data and verified sources to produce complete research documents with compelling narratives and proper citations.
**Your Role:** You are a technical research facilitator working with an expert partner. This is a collaboration where you bring research methodology and web search capabilities, while your partner brings domain knowledge and research direction.
## PREREQUISITE
**⛔ Web search required.** If unavailable, abort and tell the user.
## CONFIGURATION
Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
- `project_name`, `output_folder`, `planning_artifacts`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level`
- `date` as a system-generated value
## QUICK TOPIC DISCOVERY
"Welcome {{user_name}}! Let's get started with your **technical research**.
**What technology, tool, or technical area do you want to research?**
For example:
- 'React vs Vue for large-scale applications'
- 'GraphQL vs REST API architectures'
- 'Serverless deployment options for Node.js'
- 'Or any other technical topic you have in mind...'"
### Topic Clarification
Based on the user's topic, briefly clarify:
1. **Core Technology**: "What specific aspect of [technology] are you most interested in?"
2. **Research Goals**: "What do you hope to achieve with this research?"
3. **Scope**: "Should we focus broadly or dive deep into specific aspects?"
## ROUTE TO TECHNICAL RESEARCH STEPS
After gathering the topic and goals:
1. Set `research_type = "technical"`
2. Set `research_topic = [discovered topic from discussion]`
3. Set `research_goals = [discovered goals from discussion]`
4. Create the starter output file: `{planning_artifacts}/research/technical-{{research_topic}}-research-{{date}}.md` with exact copy of the `./research.template.md` contents
5. Load: `./technical-steps/step-01-init.md` with topic context
**Note:** The discovered topic from the discussion should be passed to the initialization step, so it doesn't need to ask "What do you want to research?" again - it can focus on refining the scope for technical research.
**✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}`**

View File

@ -0,0 +1,173 @@
---
name: research
description: Conduct comprehensive research across multiple domains using current web data and verified sources - Market, Technical, Domain and other research types.
web_bundle: true
---
# Research Workflow
**Goal:** Conduct comprehensive, exhaustive research across multiple domains using current web data and verified sources to produce complete research documents with compelling narratives and proper citations.
**Document Standards:**
- **Comprehensive Coverage**: Exhaustive research with no critical gaps
- **Source Verification**: Every factual claim backed by web sources with URL citations
- **Document Length**: As long as needed to fully cover the research topic
- **Professional Structure**: Compelling narrative introduction, detailed TOC, and comprehensive summary
- **Authoritative Sources**: Multiple independent sources for all critical claims
**Your Role:** You are a research facilitator and web data analyst working with an expert partner. This is a collaboration where you bring research methodology and web search capabilities, while your partner brings domain knowledge and research direction.
**Final Deliverable**: A complete research document that serves as an authoritative reference on the research topic with:
- Compelling narrative introduction
- Comprehensive table of contents
- Detailed research sections with proper citations
- Executive summary and conclusions
## WORKFLOW ARCHITECTURE
This uses **micro-file architecture** with **routing-based discovery**:
- Each research type has its own step folder
- Step 01 discovers research type and routes to appropriate sub-workflow
- Sequential progression within each research type
- Document state tracked in output frontmatter
## INITIALIZATION
### Configuration Loading
Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
- `project_name`, `output_folder`, , `planning_artifacts`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level`
- `date` as a system-generated value
### Paths
- `installed_path` = `{project-root}/_bmad/bmm/workflows/1-analysis/research`
- `template_path` = `{installed_path}/research.template.md`
- `default_output_file` = `{planning_artifacts}/research/{{research_type}}-{{topic}}-research-{{date}}.md` (dynamic based on research type)
## PREREQUISITE
**⛔ Web search required.** If unavailable, abort and tell the user.
## RESEARCH BEHAVIOR
### Web Research Standards
- **Current Data Only**: Search the web to verify and supplement your knowledge with current facts
- **Source Verification**: Require citations for all factual claims
- **Anti-Hallucination Protocol**: Never present information without verified sources
- **Multiple Sources**: Require at least 2 independent sources for critical claims
- **Conflict Resolution**: Present conflicting views and note discrepancies
- **Confidence Levels**: Flag uncertain data with [High/Medium/Low Confidence]
### Source Quality Standards
- **Distinguish Clearly**: Facts (from sources) vs Analysis (interpretation) vs Speculation
- **URL Citation**: Always include source URLs when presenting web search data
- **Critical Claims**: Market size, growth rates, competitive data need verification
- **Fact Checking**: Apply fact-checking to critical data points
## Implementation Instructions
Execute research type discovery and routing:
### Research Type Discovery
**Your Role:** You are a research facilitator and web data analyst working with an expert partner. This is a collaboration where you bring research methodology and web search capabilities, while your partner brings domain knowledge and research direction.
**Research Standards:**
- **Anti-Hallucination Protocol**: Never present information without verified sources
- **Current Data Only**: Search the web to verify and supplement your knowledge with current facts
- **Source Citation**: Always include URLs for factual claims from web searches
- **Multiple Sources**: Require 2+ independent sources for critical claims
- **Conflict Resolution**: Present conflicting views and note discrepancies
- **Confidence Levels**: Flag uncertain data with [High/Medium/Low Confidence]
### Collaborative Research Discovery
"Welcome {{user_name}}! I'm excited to work with you as your research partner. I bring web research capabilities with rigorous source verification, while you bring the domain expertise and research direction.
**Let me help you clarify what you'd like to research.**
**First, tell me: What specific topic, problem, or area do you want to research?**
For example:
- 'The electric vehicle market in Europe'
- 'Cloud migration strategies for healthcare'
- 'AI implementation in financial services'
- 'Sustainable packaging regulations'
- 'Or anything else you have in mind...'
### Topic Exploration and Clarification
Based on the user's initial topic, explore and refine the research scope:
#### Topic Clarification Questions:
1. **Core Topic**: "What exactly about [topic] are you most interested in?"
2. **Research Goals**: "What do you hope to achieve with this research?"
3. **Scope**: "Should we focus broadly or dive deep into specific aspects?"
4. **Timeline**: "Are you looking at current state, historical context, or future trends?"
5. **Application**: "How will you use this research? (product development, strategy, academic, etc.)"
#### Context Building:
- **Initial Input**: User provides topic or research interest
- **Collaborative Refinement**: Work together to clarify scope and objectives
- **Goal Alignment**: Ensure research direction matches user needs
- **Research Boundaries**: Establish clear focus areas and deliverables
### Research Type Identification
After understanding the research topic and goals, identify the most appropriate research approach:
**Research Type Options:**
1. **Market Research** - Market size, growth, competition, customer insights
_Best for: Understanding market dynamics, customer behavior, competitive landscape_
2. **Domain Research** - Industry analysis, regulations, technology trends in specific domain
_Best for: Understanding industry context, regulatory environment, ecosystem_
3. **Technical Research** - Technology evaluation, architecture decisions, implementation approaches
_Best for: Technical feasibility, technology selection, implementation strategies_
**Recommendation**: Based on [topic] and [goals], I recommend [suggested research type] because [specific rationale].
**What type of research would work best for your needs?**
### Research Type Routing
<critical>Based on user selection, route to appropriate sub-workflow with the discovered topic using the following IF block sets of instructions. YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}`</critical>
#### If Market Research:
- Set `research_type = "market"`
- Set `research_topic = [discovered topic from discussion]`
- Create the starter output file: `{planning_artifacts}/research/market-{{research_topic}}-research-{{date}}.md` with exact copy of the ./research.template.md contents
- Load: `./market-steps/step-01-init.md` with topic context
#### If Domain Research:
- Set `research_type = "domain"`
- Set `research_topic = [discovered topic from discussion]`
- Create the starter output file: `{planning_artifacts}/research/domain-{{research_topic}}-research-{{date}}.md` with exact copy of the ./research.template.md contents
- Load: `./domain-steps/step-01-init.md` with topic context
#### If Technical Research:
- Set `research_type = "technical"`
- Set `research_topic = [discovered topic from discussion]`
- Create the starter output file: `{planning_artifacts}/research/technical-{{research_topic}}-research-{{date}}.md` with exact copy of the ./research.template.md contents
- Load: `./technical-steps/step-01-init.md` with topic context
**Important**: The discovered topic from the collaborative discussion should be passed to the research initialization steps, so they don't need to ask "What do you want to research?" again - they can focus on refining the scope for their specific research type.
**Note:** All research workflows require web search for current data and source verification.

View File

@ -9,7 +9,5 @@ scientific,"research,algorithm,simulation,modeling,computational,analysis,data s
legaltech,"legal,law,contract,compliance,litigation,patent,attorney,court",high,"Legal ethics;Bar regulations;Data retention;Attorney-client privilege;Court system integration","Legal practice rules;Ethics requirements;Court filing systems;Document standards;Confidentiality","domain-research","legal technology ethics {date};law practice management software requirements;court filing system standards;attorney client privilege technology","ethics_compliance;data_retention;confidentiality_measures;court_integration" legaltech,"legal,law,contract,compliance,litigation,patent,attorney,court",high,"Legal ethics;Bar regulations;Data retention;Attorney-client privilege;Court system integration","Legal practice rules;Ethics requirements;Court filing systems;Document standards;Confidentiality","domain-research","legal technology ethics {date};law practice management software requirements;court filing system standards;attorney client privilege technology","ethics_compliance;data_retention;confidentiality_measures;court_integration"
insuretech,"insurance,claims,underwriting,actuarial,policy,risk,premium",high,"Insurance regulations;Actuarial standards;Data privacy;Fraud detection;State compliance","Insurance regulations by state;Actuarial methods;Risk modeling;Claims processing;Regulatory reporting","domain-research","insurance software regulations {date};actuarial standards software;insurance fraud detection;state insurance compliance","regulatory_requirements;risk_modeling;fraud_detection;reporting_compliance" insuretech,"insurance,claims,underwriting,actuarial,policy,risk,premium",high,"Insurance regulations;Actuarial standards;Data privacy;Fraud detection;State compliance","Insurance regulations by state;Actuarial methods;Risk modeling;Claims processing;Regulatory reporting","domain-research","insurance software regulations {date};actuarial standards software;insurance fraud detection;state insurance compliance","regulatory_requirements;risk_modeling;fraud_detection;reporting_compliance"
energy,"energy,utility,grid,solar,wind,power,electricity,oil,gas",high,"Grid compliance;NERC standards;Environmental regulations;Safety requirements;Real-time operations","Energy regulations;Grid standards;Environmental compliance;Safety protocols;SCADA systems","domain-research","energy sector software compliance {date};NERC CIP standards;smart grid requirements;renewable energy software standards","grid_compliance;safety_protocols;environmental_compliance;operational_requirements" energy,"energy,utility,grid,solar,wind,power,electricity,oil,gas",high,"Grid compliance;NERC standards;Environmental regulations;Safety requirements;Real-time operations","Energy regulations;Grid standards;Environmental compliance;Safety protocols;SCADA systems","domain-research","energy sector software compliance {date};NERC CIP standards;smart grid requirements;renewable energy software standards","grid_compliance;safety_protocols;environmental_compliance;operational_requirements"
process_control,"industrial automation,process control,PLC,SCADA,DCS,HMI,operational technology,OT,control system,cyberphysical,MES,historian,instrumentation,I&C,P&ID",high,"Functional safety;OT cybersecurity;Real-time control requirements;Legacy system integration;Process safety and hazard analysis;Environmental compliance and permitting;Engineering authority and PE requirements","Functional safety standards;OT security frameworks;Industrial protocols;Process control architecture;Plant reliability and maintainability","domain-research + technical-model","IEC 62443 OT cybersecurity requirements {date};functional safety software requirements {date};industrial process control architecture;ISA-95 manufacturing integration","functional_safety;ot_security;process_requirements;engineering_authority"
building_automation,"building automation,BAS,BMS,HVAC,smart building,lighting control,fire alarm,fire protection,fire suppression,life safety,elevator,access control,DDC,energy management,sequence of operations,commissioning",high,"Life safety codes;Building energy standards;Multi-trade coordination and interoperability;Commissioning and ongoing operational performance;Indoor environmental quality and occupant comfort;Engineering authority and PE requirements","Building automation protocols;HVAC and mechanical controls;Fire alarm, fire protection, and life safety design;Commissioning process and sequence of operations;Building codes and energy standards","domain-research","smart building software architecture {date};BACnet integration best practices;building automation cybersecurity {date};ASHRAE building standards","life_safety;energy_compliance;commissioning_requirements;engineering_authority"
gaming,"game,player,gameplay,level,character,multiplayer,quest",redirect,"REDIRECT TO GAME WORKFLOWS","Game design","game-brief","NA","NA" gaming,"game,player,gameplay,level,character,multiplayer,quest",redirect,"REDIRECT TO GAME WORKFLOWS","Game design","game-brief","NA","NA"
general,"",low,"Standard requirements;Basic security;User experience;Performance","General software practices","continue","software development best practices {date}","standard_requirements" general,"",low,"Standard requirements;Basic security;User experience;Performance","General software practices","continue","software development best practices {date}","standard_requirements"
1 domain signals complexity key_concerns required_knowledge suggested_workflow web_searches special_sections
9 legaltech legal,law,contract,compliance,litigation,patent,attorney,court high Legal ethics;Bar regulations;Data retention;Attorney-client privilege;Court system integration Legal practice rules;Ethics requirements;Court filing systems;Document standards;Confidentiality domain-research legal technology ethics {date};law practice management software requirements;court filing system standards;attorney client privilege technology ethics_compliance;data_retention;confidentiality_measures;court_integration
10 insuretech insurance,claims,underwriting,actuarial,policy,risk,premium high Insurance regulations;Actuarial standards;Data privacy;Fraud detection;State compliance Insurance regulations by state;Actuarial methods;Risk modeling;Claims processing;Regulatory reporting domain-research insurance software regulations {date};actuarial standards software;insurance fraud detection;state insurance compliance regulatory_requirements;risk_modeling;fraud_detection;reporting_compliance
11 energy energy,utility,grid,solar,wind,power,electricity,oil,gas high Grid compliance;NERC standards;Environmental regulations;Safety requirements;Real-time operations Energy regulations;Grid standards;Environmental compliance;Safety protocols;SCADA systems domain-research energy sector software compliance {date};NERC CIP standards;smart grid requirements;renewable energy software standards grid_compliance;safety_protocols;environmental_compliance;operational_requirements
process_control industrial automation,process control,PLC,SCADA,DCS,HMI,operational technology,OT,control system,cyberphysical,MES,historian,instrumentation,I&C,P&ID high Functional safety;OT cybersecurity;Real-time control requirements;Legacy system integration;Process safety and hazard analysis;Environmental compliance and permitting;Engineering authority and PE requirements Functional safety standards;OT security frameworks;Industrial protocols;Process control architecture;Plant reliability and maintainability domain-research + technical-model IEC 62443 OT cybersecurity requirements {date};functional safety software requirements {date};industrial process control architecture;ISA-95 manufacturing integration functional_safety;ot_security;process_requirements;engineering_authority
building_automation building automation,BAS,BMS,HVAC,smart building,lighting control,fire alarm,fire protection,fire suppression,life safety,elevator,access control,DDC,energy management,sequence of operations,commissioning high Life safety codes;Building energy standards;Multi-trade coordination and interoperability;Commissioning and ongoing operational performance;Indoor environmental quality and occupant comfort;Engineering authority and PE requirements Building automation protocols;HVAC and mechanical controls;Fire alarm, fire protection, and life safety design;Commissioning process and sequence of operations;Building codes and energy standards domain-research smart building software architecture {date};BACnet integration best practices;building automation cybersecurity {date};ASHRAE building standards life_safety;energy_compliance;commissioning_requirements;engineering_authority
12 gaming game,player,gameplay,level,character,multiplayer,quest redirect REDIRECT TO GAME WORKFLOWS Game design game-brief NA NA
13 general low Standard requirements;Basic security;User experience;Performance General software practices continue software development best practices {date} standard_requirements

View File

@ -0,0 +1,433 @@
---
validationTarget: 'PRD Workflow Structure'
validationDate: '2026-01-08'
inputDocuments: []
validationStepsCompleted: ['discovery', 'frontmatter-validation', 'content-validation', 'documentation-validation', 'integration-validation', 'corrections-applied']
validationStatus: COMPLETE - PRODUCTION READY
---
# PRD Workflow Validation Report
**Workflow Being Validated:** _bmad/bmm/workflows/2-plan-workflows/create-prd
**Validation Date:** 2026-01-08
**Validator:** BMAD Workflow Validation System
---
## Executive Summary
This validation report assesses the PRD workflow structure against BMAD workflow standards. The PRD workflow is a tri-modal workflow system with Create, Validate, and Edit phases.
---
## 1. File Structure & Size Analysis
### Folder Structure
```
prd/
├── workflow.md (main workflow file)
├── steps-c/ (Create steps - 12 files)
├── steps-v/ (Validation steps - 13 files)
├── steps-e/ (Edit steps - 5 files)
├── data/
│ └── prd-purpose.md
└── templates/
└── prd-template.md
```
**✅ Structure Status**: PASS - All required folders present
### File Size Analysis
#### Steps-C (Create Steps) - 12 files
| File | Lines | Status |
| ------------------------ | ----- | ------------------- |
| step-01-init.md | 191 | ⚠️ Approaching limit |
| step-01b-continue.md | 153 | ✅ Good |
| step-02-discovery.md | 197 | ⚠️ Approaching limit |
| step-03-success.md | 226 | ⚠️ Approaching limit |
| step-04-journeys.md | 213 | ⚠️ Approaching limit |
| step-05-domain.md | 193 | ⚠️ Approaching limit |
| step-06-innovation.md | 226 | ⚠️ Approaching limit |
| step-07-project-type.md | 225 | ⚠️ Approaching limit |
| step-08-scoping.md | 228 | ⚠️ Approaching limit |
| step-09-functional.md | 231 | ⚠️ Approaching limit |
| step-10-nonfunctional.md | 242 | ⚠️ Approaching limit |
| step-11-polish.md | 217 | ⚠️ Approaching limit |
| step-12-complete.md | 185 | ✅ Good |
#### Steps-V (Validation Steps) - 13 files
| File | Lines | Status |
| ---------------------------------------------- | ----- | ------------------- |
| step-v-01-discovery.md | 217 | ⚠️ Approaching limit |
| step-v-02-format-detection.md | 191 | ⚠️ Approaching limit |
| step-v-02b-parity-check.md | 209 | ⚠️ Approaching limit |
| step-v-03-density-validation.md | 174 | ✅ Good |
| step-v-04-brief-coverage-validation.md | 214 | ⚠️ Approaching limit |
| step-v-05-measurability-validation.md | 228 | ⚠️ Approaching limit |
| step-v-06-traceability-validation.md | 217 | ⚠️ Approaching limit |
| step-v-07-implementation-leakage-validation.md | 205 | ⚠️ Approaching limit |
| step-v-08-domain-compliance-validation.md | 243 | ⚠️ Approaching limit |
| step-v-09-project-type-validation.md | 263 | ❌ Exceeds limit |
| step-v-10-smart-validation.md | 209 | ⚠️ Approaching limit |
| step-v-11-holistic-quality-validation.md | 264 | ❌ Exceeds limit |
| step-v-12-completeness-validation.md | 242 | ⚠️ Approaching limit |
| step-v-13-report-complete.md | 231 | ⚠️ Approaching limit |
#### Steps-E (Edit Steps) - 5 files
| File | Lines | Status |
| ------------------------------- | ----- | ------------------- |
| step-e-01-discovery.md | 206 | ⚠️ Approaching limit |
| step-e-01b-legacy-conversion.md | 208 | ⚠️ Approaching limit |
| step-e-02-review.md | 249 | ⚠️ Approaching limit |
| step-e-03-edit.md | 253 | ❌ Exceeds limit |
| step-e-04-complete.md | 168 | ✅ Good |
#### Data & Templates
| File | Lines | Status |
| ------------------------- | ----- | ------------------- |
| data/prd-purpose.md | 197 | ⚠️ Approaching limit |
| templates/prd-template.md | 10 | ✅ Good |
| workflow.md | 114 | ✅ Good |
### File Size Statistics
- **Total Files**: 32 markdown files
- **✅ Good (<200 lines)**: 6 files (18.8%)
- **⚠️ Approaching limit (200-250)**: 23 files (71.9%)
- **❌ Exceeds limit (>250)**: 3 files (9.4%)
- **Average lines per file**: 213.3 lines
### ⚠️ Recommendations
1. **Files Exceeding 250-line limit**:
- `step-v-09-project-type-validation.md` (263 lines) - Consider splitting into sub-steps
- `step-v-11-holistic-quality-validation.md` (264 lines) - Consider splitting into sub-steps
- `step-e-03-edit.md` (253 lines) - Consider splitting into sub-steps
2. **Files Approaching Limit**:
- Many files are in the 200-250 line range
- Monitor these files as further additions may push them over the limit
- Consider proactive refactoring where appropriate
---
## 2. Frontmatter Structure Validation
### Files Checked: 29 total files
**✅ Overall Status:** ALL VALID - One Issue Fixed
#### Main Workflow (workflow.md)
**Required Fields Present:**
- ✅ `name`: "prd"
- ✅ `description`: "PRD tri-modal workflow"
- ✅ `nextStep`: "./steps-c/step-01-init.md"
- ✅ `validateWorkflow`: "./steps-v/step-v-01-discovery.md"
- ✅ `editWorkflow`: "./steps-e/step-e-01-discovery.md" (FIXED - was assess-workflow.md)
#### Create Steps (steps-c)
- ✅ All 13 files have proper name, description, nextStepFile
- ✅ Proper sequencing from step-01 through step-12
- ✅ Consistent output file references
#### Validation Steps (steps-v)
- ✅ All 13 files have complete frontmatter
- ✅ Proper sequential chain maintained
- ✅ No broken internal references
#### Edit Steps (steps-e)
- ✅ All files have required fields
- ✅ Proper routing with altStepFile references
### ✅ All Issues Resolved
**1. Broken Edit Workflow Reference:**
```yaml
# Current (INCORRECT):
editWorkflow: './steps-e/step-e-01-assess-workflow.md'
# Should be:
editWorkflow: './steps-e/step-e-01-discovery.md'
```
**2. Step Numbering Gap:**
- Original `step-11-complete.md` was deleted
- Sequence now: step-10 → step-11-polish → step-12-complete
- Creates confusion in step numbering
### ✅ YAML Syntax
- No YAML syntax errors detected
- All frontmatter properly formatted
- Consistent structure across files
### Status
**ALL ISSUES RESOLVED** - Only cosmetic improvements remain:
1. **✅ FIXED**: Edit workflow path corrected in workflow.md
2. **⚠️ OPTIONAL**: Address step numbering gap for clarity
3. **⚠️ OPTIONAL**: Rename step-01b-continue.md to step-01a-continue.md for consistency
---
## 3. Step File Content Validation
### Content Quality Assessment: 4.5/5 - EXCELLENT
#### Files Reviewed: 10 representative files across all modes
#### ✅ Strengths
**1. Comprehensive Structure:**
- Clear step goal sections in all files
- Detailed mandatory execution rules
- Well-defined execution protocols
- Context boundaries clearly specified
- Mandatory sequence with numbered steps
- System success/failure metrics present
**2. BMAD Compliance:**
- ✅ JIT loading references consistently mentioned
- ✅ State tracking requirements documented
- ✅ Append-only building instructions present
- ✅ Critical rules properly emphasized with emojis
- ✅ Sequential enforcement clearly stated
**3. Instructional Quality:**
- Clear, unambiguous instructions
- Proper menu handling rules (where applicable)
- Excellent continuation checks
- Strong role definition for each mode
**4. Role Clarity:**
- Create Mode: "Product-focused PM facilitator"
- Validate Mode: "Validation Architect and Quality Assurance Specialist"
- Edit Mode: "PRD improvement specialist"
#### ⚠️ Minor Improvement Opportunities
**1. Header Formatting:**
- Some inconsistency in header level usage across files
- Recommend standardizing H2/H3 usage
**2. Edit Mode Completeness:**
- Edit mode has fewer steps (5 vs 12/13 for other modes)
- Documentation marks it as "Future" but implementation exists
#### Recommendations
1. **LOW PRIORITY**: Standardize header formatting across all step files
2. **LOW PRIORITY**: Complete remaining edit mode steps for parity
3. **MAINTAIN**: Current excellent quality standards
---
## 4. Documentation Validation
### Documentation Completeness: ✅ COMPREHENSIVE
#### Main Components Present
- ✅ Workflow Definition (workflow.md)
- ✅ Purpose Document (data/prd-purpose.md)
- ✅ Template (templates/prd-template.md)
- ✅ Three Mode Implementations (Create: 12, Validate: 13, Edit: 5 steps)
#### Clarity Assessment: ✅ EXCELLENT
**Strong Points:**
1. Clear mode determination (commands, flags, menu selection)
2. Detailed routing instructions for each mode
3. Comprehensive workflow architecture explanation
4. Well-defined critical rules with visual emphasis
5. Professional presentation with consistent formatting
#### ⚠️ Minor Issues Found
**1. Step Count Mismatch:**
- workflow.md mentions "11 steps" for Create mode
- Actually implements 12 steps
- Could confuse users
**2. Edit Mode Status:**
- workflow.md calls Edit mode "Future"
- Edit mode steps are actually implemented
- Should reflect current status
**3. Template Completeness:**
- PRD template is minimal (10 lines)
- Could benefit from section placeholders
**4. Missing README:**
- No onboarding documentation for new users
- Not critical but would be helpful
#### Recommendations
**HIGH PRIORITY:**
1. Fix step count reference to match implementation (12 steps)
2. Update edit mode documentation to "Implemented"
**MEDIUM PRIORITY:**
3. Enhance PRD template with section structure
4. Add quick-start README for new users
**LOW PRIORITY:**
5. Add troubleshooting section
6. Document external dependencies (domain-complexity.csv, project-types.csv)
---
## 5. Integration & Compatibility Validation
### Integration Status: 85% Ready
#### ✅ Successfully Integrated Components
**1. Agent Menu Registration:**
- ✅ Registered in PM agent menu
- ✅ Trigger: `PR` or fuzzy match on `prd`
- ✅ Command: `/bmad:bmm:workflows:create-prd`
- ✅ Proper workflow path configuration
**2. External Workflow References:**
- ✅ Party-mode workflow: Exists at `{project-root}/_bmad/core/workflows/party-mode/workflow.md`
- ✅ Advanced-elicitation task: Exists at `{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml`
**3. Directory Structure:**
- ✅ Complete step architecture (all 3 modes)
- ✅ All referenced step files exist
- ✅ Data files available
#### ✅ Configuration & Installation - WORKING AS DESIGNED
**1. BMM Config Reference:**
- Path: `{project-root}/_bmad/bmm/config.yaml`
- **Status:** ✅ Correct installation-time placeholder
- Resolves to actual config during workflow installation
- **Note:** This is expected behavior, not an issue
**2. Planning Artifacts Folder:**
- Reference: `{planning_artifacts}/prd.md`
- **Status:** ✅ Correct installation-time placeholder
- Created/resolved during workflow installation
- **Note:** This is expected behavior, not an issue
**3. Edit Mode Implementation:**
- Current: 5 steps (Discovery, Legacy Conversion branch, Review, Edit, Complete)
- **Status:** ✅ Functionally complete
- Edit mode is inherently simpler than create mode (targeted improvements vs full creation)
- Uses subprocesses for complex operations
- Validation integration ensures quality
- **Note:** Edit workflow is complete and well-designed
#### Configuration Analysis
**Placeholder Usage:**
- `{project-root}`: ✅ Properly used
- `{planning_artifacts}`: ⚠️ Referenced but folder missing
- `{nextStep}`, `{validateWorkflow}`, etc: ✅ Properly resolved
#### Recommendations
**✅ ALL CRITICAL ISSUES RESOLVED:**
The only true critical issue (edit workflow path) has been fixed. All other items flagged as "critical" were actually working as designed (installation-time placeholders).
**LOW PRIORITY:**
3. Add CLI command registration for standalone execution (optional enhancement)
4. Consider adding workflow to additional agent menus (UX designer, architect)
5. Create standalone execution documentation (nice-to-have)
6. Address step numbering gap if desired (cosmetic)
---
## 6. Executive Summary & Overall Assessment
### Overall Validation Status: ✅ PRODUCTION-READY
#### Validation Scores by Category
| Category | Status | Score | Notes |
| -------------------------- | ----------- | ------ | --------------------------------------------- |
| **File Structure & Size** | ⚠️ WARNINGS | 7/10 | 3 files exceed 250-line limit, 23 approaching |
| **Frontmatter Validation** | ✅ PASS | 9/10 | One broken path reference |
| **Step Content Quality** | ✅ EXCELLENT | 9.5/10 | High-quality instructional design |
| **Documentation** | ✅ EXCELLENT | 9/10 | Comprehensive, minor inconsistencies |
| **Integration** | ✅ PASS | 9/10 | All paths correct (one issue fixed) |
| **BMAD Compliance** | ✅ EXCELLENT | 9.5/10 | Strong adherence to standards |
**Overall Score: 9.2/10 - EXCELLENT**
#### ✅ Critical Action Items - ALL RESOLVED
**ONLY ONE TRUE CRITICAL ISSUE EXISTED - NOW FIXED:**
1. **✅ FIXED: Edit Workflow Path**
- File: `workflow.md` ✓ RESOLVED
- Changed from: `./steps-e/step-e-01-assess-workflow.md`
- Changed to: `./steps-e/step-e-01-discovery.md`
**Items incorrectly flagged as critical (actually working as designed):**
- ✅ Configuration path references (installation-time placeholders)
- ✅ Planning artifacts folder (installation-time placeholder)
#### High Priority Improvements
2. **⚠️ Split Large Step Files** (>250 lines):
- `step-v-09-project-type-validation.md` (263 lines)
- `step-v-11-holistic-quality-validation.md` (264 lines)
- `step-e-03-edit.md` (253 lines)
3. **⚠️ Update Documentation Inconsistencies**:
- Fix step count reference (11 → 12 steps in create mode)
- Update edit mode status (Future → Implemented)
#### Medium Priority Enhancements
4. **Enhance PRD Template** (currently minimal at 10 lines)
5. **Add quick-start README** for new users
6. **Address step numbering gap** (cosmetic - missing step-11-complete.md)
#### Edit Mode Status - FUNCTIONALLY COMPLETE ✅
The edit workflow is **complete and well-designed** with 5 steps:
- Discovery → Legacy Conversion (branch) → Review → Edit → Complete
- Edit mode is inherently simpler than create mode (targeted improvements vs full creation)
- Uses subprocesses for complex operations
- Integrates with validation workflow
**No additional steps needed.**
### Key Strengths
**Excellent step file quality** - Clear, well-structured instructions
**Comprehensive validation system** - 13 dedicated validation steps
**Strong BMAD compliance** - JIT loading, state tracking, sequential enforcement
**Tri-modal architecture** - Create, Validate, Edit all implemented
**Professional documentation** - Clear, consistent, well-presented
**Proper agent integration** - Registered in PM agent menu
### Areas for Improvement (Optional)
⚠️ **File size management** - Many files approaching limits (maintainability consideration)
⚠️ **Documentation consistency** - Minor discrepancies in counts/status (cosmetic)
**Edit mode** - Functionally complete, no additional steps needed
### Conclusion
The PRD workflow is **well-designed and fully compliant** with BMAD standards. The step file architecture is exemplary, the content quality is excellent, and the documentation is comprehensive. The only critical issue (edit workflow path) has been **resolved**, and all other flagged items were actually working as designed (installation-time placeholders).
**Current Status: ✅ PRODUCTION-READY**
**Recommended Optional Enhancements:**
1. Split the 3 files exceeding 250-line limit (maintainability)
2. Update documentation inconsistencies (step counts, edit mode status)
3. Enhance PRD template and add quick-start README (user experience)
The PRD workflow is ready for production use and fully compliant with BMAD workflow standards.
---
**Validation Completed:** 2026-01-08
**Validation Method:** Systematic subprocess analysis with maximum context coverage
**Validator:** BMAD Workflow Validation System (Wendy - Workflow Building Master)

View File

@ -1,63 +0,0 @@
---
name: create-prd
description: Create a comprehensive PRD (Product Requirements Document) through structured workflow facilitation
main_config: '{project-root}/_bmad/bmm/config.yaml'
nextStep: './steps-c/step-01-init.md'
---
# PRD Create Workflow
**Goal:** Create comprehensive PRDs through structured workflow facilitation.
**Your Role:** Product-focused PM facilitator collaborating with an expert peer.
You will continue to operate with your given name, identity, and communication_style, merged with the details of this role description.
## WORKFLOW ARCHITECTURE
This uses **step-file architecture** for disciplined execution:
### Core Principles
- **Micro-file Design**: Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly
- **Just-In-Time Loading**: Only the current step file is in memory - never load future step files until told to do so
- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed
- **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document
- **Append-Only Building**: Build documents by appending content as directed to the output file
### Step Processing Rules
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**: If the step has a menu with Continue as an option, 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
### Critical Rules (NO EXCEPTIONS)
- 🛑 **NEVER** load multiple step files simultaneously
- 📖 **ALWAYS** read entire step file before execution
- 🚫 **NEVER** skip steps or optimize the sequence
- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step
- 🎯 **ALWAYS** follow the exact instructions in the step file
- ⏸️ **ALWAYS** halt at menus and wait for user input
- 📋 **NEVER** create mental todo lists from future steps
## INITIALIZATION SEQUENCE
### 1. Configuration Loading
Load and read full config from {main_config} and resolve:
- `project_name`, `output_folder`, `planning_artifacts`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level`
- `date` as system-generated current datetime
✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the configured `{communication_language}`.
### 2. Route to Create Workflow
"**Create Mode: Creating a new PRD from scratch.**"
Read fully and follow: `{nextStep}` (steps-c/step-01-init.md)

View File

@ -1,65 +0,0 @@
---
name: edit-prd
description: Edit and improve an existing PRD - enhance clarity, completeness, and quality
main_config: '{project-root}/_bmad/bmm/config.yaml'
editWorkflow: './steps-e/step-e-01-discovery.md'
---
# PRD Edit Workflow
**Goal:** Edit and improve existing PRDs through structured enhancement workflow.
**Your Role:** PRD improvement specialist.
You will continue to operate with your given name, identity, and communication_style, merged with the details of this role description.
## WORKFLOW ARCHITECTURE
This uses **step-file architecture** for disciplined execution:
### Core Principles
- **Micro-file Design**: Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly
- **Just-In-Time Loading**: Only the current step file is in memory - never load future step files until told to do so
- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed
- **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document
- **Append-Only Building**: Build documents by appending content as directed to the output file
### Step Processing Rules
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**: If the step has a menu with Continue as an option, 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
### Critical Rules (NO EXCEPTIONS)
- 🛑 **NEVER** load multiple step files simultaneously
- 📖 **ALWAYS** read entire step file before execution
- 🚫 **NEVER** skip steps or optimize the sequence
- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step
- 🎯 **ALWAYS** follow the exact instructions in the step file
- ⏸️ **ALWAYS** halt at menus and wait for user input
- 📋 **NEVER** create mental todo lists from future steps
## INITIALIZATION SEQUENCE
### 1. Configuration Loading
Load and read full config from {main_config} and resolve:
- `project_name`, `output_folder`, `planning_artifacts`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level`
- `date` as system-generated current datetime
✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the configured `{communication_language}`.
### 2. Route to Edit Workflow
"**Edit Mode: Improving an existing PRD.**"
Prompt for PRD path: "Which PRD would you like to edit? Please provide the path to the PRD.md file."
Then read fully and follow: `{editWorkflow}` (steps-e/step-e-01-discovery.md)

View File

@ -1,65 +0,0 @@
---
name: validate-prd
description: Validate an existing PRD against BMAD standards - comprehensive review for completeness, clarity, and quality
main_config: '{project-root}/_bmad/bmm/config.yaml'
validateWorkflow: './steps-v/step-v-01-discovery.md'
---
# PRD Validate Workflow
**Goal:** Validate existing PRDs against BMAD standards through comprehensive review.
**Your Role:** Validation Architect and Quality Assurance Specialist.
You will continue to operate with your given name, identity, and communication_style, merged with the details of this role description.
## WORKFLOW ARCHITECTURE
This uses **step-file architecture** for disciplined execution:
### Core Principles
- **Micro-file Design**: Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly
- **Just-In-Time Loading**: Only the current step file is in memory - never load future step files until told to do so
- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed
- **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document
- **Append-Only Building**: Build documents by appending content as directed to the output file
### Step Processing Rules
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**: If the step has a menu with Continue as an option, 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
### Critical Rules (NO EXCEPTIONS)
- 🛑 **NEVER** load multiple step files simultaneously
- 📖 **ALWAYS** read entire step file before execution
- 🚫 **NEVER** skip steps or optimize the sequence
- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step
- 🎯 **ALWAYS** follow the exact instructions in the step file
- ⏸️ **ALWAYS** halt at menus and wait for user input
- 📋 **NEVER** create mental todo lists from future steps
## INITIALIZATION SEQUENCE
### 1. Configuration Loading
Load and read full config from {main_config} and resolve:
- `project_name`, `output_folder`, `planning_artifacts`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level`
- `date` as system-generated current datetime
✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the configured `{communication_language}`.
### 2. Route to Validate Workflow
"**Validate Mode: Validating an existing PRD against BMAD standards.**"
Prompt for PRD path: "Which PRD would you like to validate? Please provide the path to the PRD.md file."
Then read fully and follow: `{validateWorkflow}` (steps-v/step-v-01-discovery.md)

View File

@ -0,0 +1,150 @@
---
name: create-prd
description: PRD tri-modal workflow - Create, Validate, or Edit comprehensive PRDs
main_config: '{project-root}/_bmad/bmm/config.yaml'
nextStep: './steps-c/step-01-init.md'
validateWorkflow: './steps-v/step-v-01-discovery.md'
editWorkflow: './steps-e/step-e-01-discovery.md'
web_bundle: true
---
# PRD Workflow (Tri-Modal)
**Goal:** Create, Validate, or Edit comprehensive PRDs through structured workflows.
**Your Role:**
- **Create Mode:** Product-focused PM facilitator collaborating with an expert peer
- **Validate Mode:** Validation Architect and Quality Assurance Specialist
- **Edit Mode:** PRD improvement specialist
You will continue to operate with your given name, identity, and communication_style, merged with the details of this role description.
---
## MODE DETERMINATION
### Detect Workflow Mode
Determine which mode to invoke based on:
1. **Command/Invocation:**
- "create prd" or "new prd" → Create mode
- "validate prd" or "check prd" → Validate mode
- "edit prd" or "improve prd" → Edit mode
2. **Context Detection:**
- If invoked with -c flag → Create mode
- If invoked with -v flag → Validate mode
- If invoked with -e flag → Edit mode
3. **Menu Selection (if unclear):**
If mode cannot be determined from invocation:
"**PRD Workflow - Select Mode:**
**[C] Create** - Create a new PRD from scratch
**[V] Validate** - Validate an existing PRD against BMAD standards
**[E] Edit** - Improve an existing PRD
Which mode would you like?"
Wait for user selection.
### Route to Appropriate Workflow
**IF Create Mode:**
"**Create Mode: Creating a new PRD from scratch.**"
Read fully and follow: `{nextStep}` (steps-c/step-01-init.md)
**IF Validate Mode:**
"**Validate Mode: Validating an existing PRD against BMAD standards.**"
Prompt for PRD path: "Which PRD would you like to validate? Please provide the path to the PRD.md file."
Then read fully and follow: `{validateWorkflow}` (steps-v/step-v-01-discovery.md)
**IF Edit Mode:**
"**Edit Mode: Improving an existing PRD.**"
Prompt for PRD path: "Which PRD would you like to edit? Please provide the path to the PRD.md file."
Then read fully and follow: `{editWorkflow}` (steps-e/step-e-01-discovery.md)
---
## WORKFLOW ARCHITECTURE
This uses **step-file architecture** for disciplined execution:
### Core Principles
- **Micro-file Design**: Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly
- **Just-In-Time Loading**: Only the current step file is in memory - never load future step files until told to do so
- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed
- **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document
- **Append-Only Building**: Build documents by appending content as directed to the output file
### Step Processing Rules
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**: If the step has a menu with Continue as an option, 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
### Critical Rules (NO EXCEPTIONS)
- 🛑 **NEVER** load multiple step files simultaneously
- 📖 **ALWAYS** read entire step file before execution
- 🚫 **NEVER** skip steps or optimize the sequence
- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step
- 🎯 **ALWAYS** follow the exact instructions in the step file
- ⏸️ **ALWAYS** halt at menus and wait for user input
- 📋 **NEVER** create mental todo lists from future steps
---
## INITIALIZATION SEQUENCE
### 1. Mode Determination
**Check if mode was specified in the command invocation:**
- If user invoked with "create prd" or "new prd" or "build prd" or "-c" or "--create" → Set mode to **create**
- If user invoked with "validate prd" or "review prd" or "check prd" or "-v" or "--validate" → Set mode to **validate**
- If user invoked with "edit prd" or "modify prd" or "improve prd" or "-e" or "--edit" → Set mode to **edit**
**If mode is still unclear, ask user:**
"**PRD Workflow - Select Mode:**
**[C] Create** - Create a new PRD from scratch
**[V] Validate** - Validate an existing PRD against BMAD standards
**[E] Edit** - Improve an existing PRD
Which mode would you like?"
Wait for user selection.
### 2. Configuration Loading
Load and read full config from {main_config} and resolve:
- `project_name`, `output_folder`, `planning_artifacts`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level`
- `date` as system-generated current datetime
✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the configured `{communication_language}`.
### 3. Route to Appropriate Workflow
**IF mode == create:**
"**Create Mode: Creating a new PRD from scratch.**"
Read fully and follow: `{nextStep}` (steps-c/step-01-init.md)
**IF mode == validate:**
"**Validate Mode: Validating an existing PRD against BMAD standards.**"
Prompt for PRD path: "Which PRD would you like to validate? Please provide the path to the PRD.md file."
Then read fully and follow: `{validateWorkflow}` (steps-v/step-v-01-discovery.md)
**IF mode == edit:**
"**Edit Mode: Improving an existing PRD.**"
Prompt for PRD path: "Which PRD would you like to edit? Please provide the path to the PRD.md file."
Then read fully and follow: `{editWorkflow}` (steps-e/step-e-01-discovery.md)

View File

@ -1,6 +1,7 @@
--- ---
name: create-ux-design name: create-ux-design
description: Work with a peer UX Design expert to plan your applications UX patterns, look and feel. description: Work with a peer UX Design expert to plan your applications UX patterns, look and feel.
web_bundle: true
--- ---
# Create UX Design Workflow # Create UX Design Workflow

View File

@ -1,6 +1,7 @@
--- ---
name: check-implementation-readiness name: check-implementation-readiness
description: 'Critical validation workflow that assesses PRD, Architecture, and Epics & Stories for completeness and alignment before implementation. Uses adversarial review approach to find gaps and issues.' description: 'Critical validation workflow that assesses PRD, Architecture, and Epics & Stories for completeness and alignment before implementation. Uses adversarial review approach to find gaps and issues.'
web_bundle: false
--- ---
# Implementation Readiness # Implementation Readiness

View File

@ -8,6 +8,4 @@ productivity,"productivity,workflow,tasks,management,business,tools",medium,stan
media,"content,media,video,audio,streaming,broadcast",high,advanced,"CDN architecture, video encoding, streaming protocols, content delivery" media,"content,media,video,audio,streaming,broadcast",high,advanced,"CDN architecture, video encoding, streaming protocols, content delivery"
iot,"IoT,sensors,devices,embedded,smart,connected",high,advanced,"device communication, real-time data processing, edge computing, security" iot,"IoT,sensors,devices,embedded,smart,connected",high,advanced,"device communication, real-time data processing, edge computing, security"
government,"government,civic,public,admin,policy,regulation",high,enhanced,"accessibility standards, security clearance, data privacy, audit trails" government,"government,civic,public,admin,policy,regulation",high,enhanced,"accessibility standards, security clearance, data privacy, audit trails"
process_control,"industrial automation,process control,PLC,SCADA,DCS,HMI,operational technology,control system,cyberphysical,MES,instrumentation,I&C,P&ID",high,advanced,"industrial process control architecture, SCADA system design, OT cybersecurity architecture, real-time control systems"
building_automation,"building automation,BAS,BMS,HVAC,smart building,fire alarm,fire protection,fire suppression,life safety,elevator,DDC,access control,sequence of operations,commissioning",high,advanced,"building automation architecture, BACnet integration patterns, smart building design, building management system security"
gaming,"game,gaming,multiplayer,real-time,interactive,entertainment",high,advanced,"real-time multiplayer, game engine architecture, matchmaking, leaderboards" gaming,"game,gaming,multiplayer,real-time,interactive,entertainment",high,advanced,"real-time multiplayer, game engine architecture, matchmaking, leaderboards"
1 domain signals complexity_level suggested_workflow web_searches
8 media content,media,video,audio,streaming,broadcast high advanced CDN architecture, video encoding, streaming protocols, content delivery
9 iot IoT,sensors,devices,embedded,smart,connected high advanced device communication, real-time data processing, edge computing, security
10 government government,civic,public,admin,policy,regulation high enhanced accessibility standards, security clearance, data privacy, audit trails
process_control industrial automation,process control,PLC,SCADA,DCS,HMI,operational technology,control system,cyberphysical,MES,instrumentation,I&C,P&ID high advanced industrial process control architecture, SCADA system design, OT cybersecurity architecture, real-time control systems
building_automation building automation,BAS,BMS,HVAC,smart building,fire alarm,fire protection,fire suppression,life safety,elevator,DDC,access control,sequence of operations,commissioning high advanced building automation architecture, BACnet integration patterns, smart building design, building management system security
11 gaming game,gaming,multiplayer,real-time,interactive,entertainment high advanced real-time multiplayer, game engine architecture, matchmaking, leaderboards

View File

@ -1,6 +1,7 @@
--- ---
name: create-architecture name: create-architecture
description: Collaborative architectural decision facilitation for AI-agent consistency. Replaces template-driven architecture with intelligent, adaptive conversation that produces a decision-focused architecture document optimized for preventing agent conflicts. description: Collaborative architectural decision facilitation for AI-agent consistency. Replaces template-driven architecture with intelligent, adaptive conversation that produces a decision-focused architecture document optimized for preventing agent conflicts.
web_bundle: true
--- ---
# Architecture Workflow # Architecture Workflow

View File

@ -1,6 +1,7 @@
--- ---
name: create-epics-and-stories name: create-epics-and-stories
description: 'Transform PRD requirements and Architecture decisions into comprehensive stories organized by user value. This workflow requires completed PRD + Architecture documents (UX recommended if UI exists) and breaks down requirements into implementation-ready epics and user stories that incorporate all available technical and design context. Creates detailed, actionable stories with complete acceptance criteria for development teams.' description: 'Transform PRD requirements and Architecture decisions into comprehensive stories organized by user value. This workflow requires completed PRD + Architecture documents (UX recommended if UI exists) and breaks down requirements into implementation-ready epics and user stories that incorporate all available technical and design context. Creates detailed, actionable stories with complete acceptance criteria for development teams.'
web_bundle: true
--- ---
# Create Epics and Stories # Create Epics and Stories

View File

@ -46,3 +46,6 @@ input_file_patterns:
sharded_index: "{planning_artifacts}/*epic*/index.md" sharded_index: "{planning_artifacts}/*epic*/index.md"
sharded_single: "{planning_artifacts}/*epic*/epic-{{epic_num}}.md" sharded_single: "{planning_artifacts}/*epic*/epic-{{epic_num}}.md"
load_strategy: "SELECTIVE_LOAD" load_strategy: "SELECTIVE_LOAD"
standalone: true
web_bundle: false

View File

@ -54,3 +54,7 @@ instructions: "{installed_path}/instructions.md"
validation: "{installed_path}/checklist.md" validation: "{installed_path}/checklist.md"
checklist: "{installed_path}/checklist.md" checklist: "{installed_path}/checklist.md"
default_output_file: "{planning_artifacts}/sprint-change-proposal-{date}.md" default_output_file: "{planning_artifacts}/sprint-change-proposal-{date}.md"
standalone: true
web_bundle: false

View File

@ -55,3 +55,7 @@ input_file_patterns:
whole: "{planning_artifacts}/*epic*.md" whole: "{planning_artifacts}/*epic*.md"
sharded: "{planning_artifacts}/*epic*/*.md" sharded: "{planning_artifacts}/*epic*/*.md"
load_strategy: "SELECTIVE_LOAD" # Only load needed epic load_strategy: "SELECTIVE_LOAD" # Only load needed epic
standalone: true
web_bundle: false

View File

@ -21,3 +21,7 @@ story_file: "" # Explicit story path; auto-discovered if empty
implementation_artifacts: "{config_source}:implementation_artifacts" implementation_artifacts: "{config_source}:implementation_artifacts"
sprint_status: "{implementation_artifacts}/sprint-status.yaml" sprint_status: "{implementation_artifacts}/sprint-status.yaml"
project_context: "**/project-context.md" project_context: "**/project-context.md"
standalone: true
web_bundle: false

View File

@ -53,3 +53,6 @@ input_file_patterns:
sprint_status_file: "{implementation_artifacts}/sprint-status.yaml" sprint_status_file: "{implementation_artifacts}/sprint-status.yaml"
story_directory: "{implementation_artifacts}" story_directory: "{implementation_artifacts}"
retrospectives_folder: "{implementation_artifacts}" retrospectives_folder: "{implementation_artifacts}"
standalone: true
web_bundle: false

View File

@ -49,3 +49,7 @@ input_file_patterns:
# Output configuration # Output configuration
default_output_file: "{status_file}" default_output_file: "{status_file}"
standalone: true
web_bundle: false

View File

@ -28,3 +28,9 @@ input_file_patterns:
description: "Sprint status file generated by sprint-planning" description: "Sprint status file generated by sprint-planning"
whole: "{implementation_artifacts}/sprint-status.yaml" whole: "{implementation_artifacts}/sprint-status.yaml"
load_strategy: "FULL_LOAD" load_strategy: "FULL_LOAD"
# Standalone so IDE commands get generated
standalone: true
# No web bundle needed
web_bundle: false

View File

@ -2,6 +2,7 @@
name: quick-spec name: quick-spec
description: Conversational spec engineering - ask questions, investigate code, produce implementation-ready tech-spec. description: Conversational spec engineering - ask questions, investigate code, produce implementation-ready tech-spec.
main_config: '{project-root}/_bmad/bmm/config.yaml' main_config: '{project-root}/_bmad/bmm/config.yaml'
web_bundle: true
# Checkpoint handler paths # Checkpoint handler paths
advanced_elicitation: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' advanced_elicitation: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml'

View File

@ -20,3 +20,11 @@ validation: "{installed_path}/checklist.md"
# Required data files - CRITICAL for project type detection and documentation requirements # Required data files - CRITICAL for project type detection and documentation requirements
documentation_requirements_csv: "{installed_path}/documentation-requirements.csv" documentation_requirements_csv: "{installed_path}/documentation-requirements.csv"
# Output configuration - Multiple files generated in output folder
# Primary output: {output_folder}/project-documentation/
# Additional files generated by sub-workflows based on project structure
standalone: true
web_bundle: false

View File

@ -0,0 +1,90 @@
{
"type": "excalidrawlib",
"version": 2,
"library": [
{
"id": "start-end-circle",
"status": "published",
"elements": [
{
"type": "ellipse",
"width": 120,
"height": 60,
"strokeColor": "#1976d2",
"backgroundColor": "#e3f2fd",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 0
}
]
},
{
"id": "process-rectangle",
"status": "published",
"elements": [
{
"type": "rectangle",
"width": 160,
"height": 80,
"strokeColor": "#1976d2",
"backgroundColor": "#e3f2fd",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 0,
"roundness": {
"type": 3,
"value": 8
}
}
]
},
{
"id": "decision-diamond",
"status": "published",
"elements": [
{
"type": "diamond",
"width": 140,
"height": 100,
"strokeColor": "#f57c00",
"backgroundColor": "#fff3e0",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 0
}
]
},
{
"id": "data-store",
"status": "published",
"elements": [
{
"type": "rectangle",
"width": 140,
"height": 80,
"strokeColor": "#388e3c",
"backgroundColor": "#e8f5e9",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 0
}
]
},
{
"id": "external-entity",
"status": "published",
"elements": [
{
"type": "rectangle",
"width": 120,
"height": 80,
"strokeColor": "#7b1fa2",
"backgroundColor": "#f3e5f5",
"fillStyle": "solid",
"strokeWidth": 3,
"roughness": 0
}
]
}
]
}

View File

@ -0,0 +1,127 @@
flowchart:
viewport:
x: 0
y: 0
zoom: 1
grid:
size: 20
spacing:
vertical: 100
horizontal: 180
elements:
start:
type: ellipse
width: 120
height: 60
label: "Start"
process:
type: rectangle
width: 160
height: 80
roundness: 8
decision:
type: diamond
width: 140
height: 100
end:
type: ellipse
width: 120
height: 60
label: "End"
diagram:
viewport:
x: 0
y: 0
zoom: 1
grid:
size: 20
spacing:
vertical: 120
horizontal: 200
elements:
component:
type: rectangle
width: 180
height: 100
roundness: 8
database:
type: rectangle
width: 140
height: 80
service:
type: rectangle
width: 160
height: 90
roundness: 12
external:
type: rectangle
width: 140
height: 80
wireframe:
viewport:
x: 0
y: 0
zoom: 0.8
grid:
size: 20
spacing:
vertical: 40
horizontal: 40
elements:
container:
type: rectangle
width: 800
height: 600
strokeStyle: solid
strokeWidth: 2
header:
type: rectangle
width: 800
height: 80
button:
type: rectangle
width: 120
height: 40
roundness: 4
input:
type: rectangle
width: 300
height: 40
roundness: 4
text:
type: text
fontSize: 16
dataflow:
viewport:
x: 0
y: 0
zoom: 1
grid:
size: 20
spacing:
vertical: 120
horizontal: 200
elements:
process:
type: ellipse
width: 140
height: 80
label: "Process"
datastore:
type: rectangle
width: 140
height: 80
label: "Data Store"
external:
type: rectangle
width: 120
height: 80
strokeWidth: 3
label: "External Entity"
dataflow:
type: arrow
strokeWidth: 2
label: "Data Flow"

View File

@ -0,0 +1,39 @@
# Create Data Flow Diagram - Validation Checklist
## DFD Notation
- [ ] Processes shown as circles/ellipses
- [ ] Data stores shown as parallel lines or rectangles
- [ ] External entities shown as rectangles
- [ ] Data flows shown as labeled arrows
- [ ] Follows standard DFD notation
## Structure
- [ ] All processes numbered correctly
- [ ] All data flows labeled with data names
- [ ] All data stores named appropriately
- [ ] External entities clearly identified
## Completeness
- [ ] All inputs and outputs accounted for
- [ ] No orphaned processes (unconnected)
- [ ] Data conservation maintained
- [ ] Level appropriate (context/level 0/level 1)
## Layout
- [ ] Logical flow direction (left to right, top to bottom)
- [ ] No crossing data flows where avoidable
- [ ] Balanced layout
- [ ] Grid alignment maintained
## Technical Quality
- [ ] All elements properly grouped
- [ ] Arrows have proper bindings
- [ ] Text readable and properly sized
- [ ] No elements with `isDeleted: true`
- [ ] JSON is valid
- [ ] File saved to correct location

View File

@ -0,0 +1,130 @@
# Create Data Flow Diagram - Workflow Instructions
```xml
<critical>The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml</critical>
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
<critical>This workflow creates data flow diagrams (DFD) in Excalidraw format.</critical>
<workflow>
<step n="0" goal="Contextual Analysis">
<action>Review user's request and extract: DFD level, processes, data stores, external entities</action>
<check if="ALL requirements clear"><action>Skip to Step 4</action></check>
</step>
<step n="1" goal="Identify DFD Level" elicit="true">
<action>Ask: "What level of DFD do you need?"</action>
<action>Present options:
1. Context Diagram (Level 0) - Single process showing system boundaries
2. Level 1 DFD - Major processes and data flows
3. Level 2 DFD - Detailed sub-processes
4. Custom - Specify your requirements
</action>
<action>WAIT for selection</action>
</step>
<step n="2" goal="Gather Requirements" elicit="true">
<action>Ask: "Describe the processes, data stores, and external entities in your system"</action>
<action>WAIT for user description</action>
<action>Summarize what will be included and confirm with user</action>
</step>
<step n="3" goal="Theme Setup" elicit="true">
<action>Check for existing theme.json, ask to use if exists</action>
<check if="no existing theme">
<action>Ask: "Choose a DFD color scheme:"</action>
<action>Present numbered options:
1. Standard DFD
- Process: #e3f2fd (light blue)
- Data Store: #e8f5e9 (light green)
- External Entity: #f3e5f5 (light purple)
- Border: #1976d2 (blue)
2. Colorful DFD
- Process: #fff9c4 (light yellow)
- Data Store: #c5e1a5 (light lime)
- External Entity: #ffccbc (light coral)
- Border: #f57c00 (orange)
3. Minimal DFD
- Process: #f5f5f5 (light gray)
- Data Store: #eeeeee (gray)
- External Entity: #e0e0e0 (medium gray)
- Border: #616161 (dark gray)
4. Custom - Define your own colors
</action>
<action>WAIT for selection</action>
<action>Create theme.json based on selection</action>
</check>
</step>
<step n="4" goal="Plan DFD Structure">
<action>List all processes with numbers (1.0, 2.0, etc.)</action>
<action>List all data stores (D1, D2, etc.)</action>
<action>List all external entities</action>
<action>Map all data flows with labels</action>
<action>Show planned structure, confirm with user</action>
</step>
<step n="5" goal="Load Resources">
<action>Load {{templates}} and extract `dataflow` section</action>
<action>Load {{library}}</action>
<action>Load theme.json</action>
<action>Load {{helpers}}</action>
</step>
<step n="6" goal="Build DFD Elements">
<critical>Follow standard DFD notation from {{helpers}}</critical>
<substep>Build Order:
1. External entities (rectangles, bold border)
2. Processes (circles/ellipses with numbers)
3. Data stores (parallel lines or rectangles)
4. Data flows (labeled arrows)
</substep>
<substep>DFD Rules:
- Processes: Numbered (1.0, 2.0), verb phrases
- Data stores: Named (D1, D2), noun phrases
- External entities: Named, noun phrases
- Data flows: Labeled with data names, arrows show direction
- No direct flow between external entities
- No direct flow between data stores
</substep>
<substep>Layout:
- External entities at edges
- Processes in center
- Data stores between processes
- Minimize crossing flows
- Left-to-right or top-to-bottom flow
</substep>
</step>
<step n="7" goal="Optimize and Save">
<action>Verify DFD rules compliance</action>
<action>Strip unused elements and elements with isDeleted: true</action>
<action>Save to {{default_output_file}}</action>
</step>
<step n="8" goal="Validate JSON Syntax">
<critical>NEVER delete the file if validation fails - always fix syntax errors</critical>
<action>Run: node -e "JSON.parse(require('fs').readFileSync('{{default_output_file}}', 'utf8')); console.log('✓ Valid JSON')"</action>
<check if="validation fails (exit code 1)">
<action>Read the error message carefully - it shows the syntax error and position</action>
<action>Open the file and navigate to the error location</action>
<action>Fix the syntax error (add missing comma, bracket, or quote as indicated)</action>
<action>Save the file</action>
<action>Re-run validation with the same command</action>
<action>Repeat until validation passes</action>
</check>
<action>Once validation passes, confirm with user</action>
</step>
<step n="9" goal="Validate Content">
<invoke-task>Validate against {{validation}}</invoke-task>
</step>
</workflow>
```

View File

@ -0,0 +1,27 @@
name: create-excalidraw-dataflow
description: "Create data flow diagrams (DFD) in Excalidraw format"
author: "BMad"
# Config values
config_source: "{project-root}/_bmad/bmm/config.yaml"
output_folder: "{config_source}:output_folder"
# Workflow components
installed_path: "{project-root}/_bmad/bmm/workflows/excalidraw-diagrams/create-dataflow"
shared_path: "{project-root}/_bmad/bmm/workflows/excalidraw-diagrams/_shared"
instructions: "{installed_path}/instructions.md"
validation: "{installed_path}/checklist.md"
# Core Excalidraw resources (universal knowledge)
helpers: "{project-root}/_bmad/core/resources/excalidraw/excalidraw-helpers.md"
json_validation: "{project-root}/_bmad/core/resources/excalidraw/validate-json-instructions.md"
# Domain-specific resources (technical diagrams)
templates: "{shared_path}/excalidraw-templates.yaml"
library: "{shared_path}/excalidraw-library.json"
# Output file (respects user's configured output_folder)
default_output_file: "{output_folder}/excalidraw-diagrams/dataflow-{timestamp}.excalidraw"
standalone: true
web_bundle: false

View File

@ -0,0 +1,43 @@
# Create Diagram - Validation Checklist
## Element Structure
- [ ] All components with labels have matching `groupIds`
- [ ] All text elements have `containerId` pointing to parent component
- [ ] Text width calculated properly (no cutoff)
- [ ] Text alignment appropriate for diagram type
## Layout and Alignment
- [ ] All elements snapped to 20px grid
- [ ] Component spacing consistent (40px/60px)
- [ ] Hierarchical alignment maintained
- [ ] No overlapping elements
## Connections
- [ ] All arrows have `startBinding` and `endBinding`
- [ ] `boundElements` array updated on connected components
- [ ] Arrow routing avoids overlaps
- [ ] Relationship types clearly indicated
## Notation and Standards
- [ ] Follows specified notation standard (UML/ERD/etc)
- [ ] Symbols used correctly
- [ ] Cardinality/multiplicity shown where needed
- [ ] Labels and annotations clear
## Theme and Styling
- [ ] Theme colors applied consistently
- [ ] Component types visually distinguishable
- [ ] Text is readable
- [ ] Professional appearance
## Output Quality
- [ ] Element count under 80
- [ ] No elements with `isDeleted: true`
- [ ] JSON is valid
- [ ] File saved to correct location

View File

@ -0,0 +1,141 @@
# Create Diagram - Workflow Instructions
```xml
<critical>The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml</critical>
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
<critical>This workflow creates system architecture diagrams, ERDs, UML diagrams, or general technical diagrams in Excalidraw format.</critical>
<workflow>
<step n="0" goal="Contextual Analysis">
<action>Review user's request and extract: diagram type, components/entities, relationships, notation preferences</action>
<check if="ALL requirements clear"><action>Skip to Step 5</action></check>
<check if="SOME requirements clear"><action>Only ask about missing info in Steps 1-2</action></check>
</step>
<step n="1" goal="Identify Diagram Type" elicit="true">
<action>Ask: "What type of technical diagram do you need?"</action>
<action>Present options:
1. System Architecture
2. Entity-Relationship Diagram (ERD)
3. UML Class Diagram
4. UML Sequence Diagram
5. UML Use Case Diagram
6. Network Diagram
7. Other
</action>
<action>WAIT for selection</action>
</step>
<step n="2" goal="Gather Requirements" elicit="true">
<action>Ask: "Describe the components/entities and their relationships"</action>
<action>Ask: "What notation standard? (Standard/Simplified/Strict UML-ERD)"</action>
<action>WAIT for user input</action>
<action>Summarize what will be included and confirm with user</action>
</step>
<step n="3" goal="Check for Existing Theme" elicit="true">
<action>Check if theme.json exists at output location</action>
<check if="exists"><action>Ask to use it, load if yes, else proceed to Step 4</action></check>
<check if="not exists"><action>Proceed to Step 4</action></check>
</step>
<step n="4" goal="Create Theme" elicit="true">
<action>Ask: "Choose a color scheme for your diagram:"</action>
<action>Present numbered options:
1. Professional
- Component: #e3f2fd (light blue)
- Database: #e8f5e9 (light green)
- Service: #fff3e0 (light orange)
- Border: #1976d2 (blue)
2. Colorful
- Component: #e1bee7 (light purple)
- Database: #c5e1a5 (light lime)
- Service: #ffccbc (light coral)
- Border: #7b1fa2 (purple)
3. Minimal
- Component: #f5f5f5 (light gray)
- Database: #eeeeee (gray)
- Service: #e0e0e0 (medium gray)
- Border: #616161 (dark gray)
4. Custom - Define your own colors
</action>
<action>WAIT for selection</action>
<action>Create theme.json based on selection</action>
<action>Show preview and confirm</action>
</step>
<step n="5" goal="Plan Diagram Structure">
<action>List all components/entities</action>
<action>Map all relationships</action>
<action>Show planned layout</action>
<action>Ask: "Structure looks correct? (yes/no)"</action>
<check if="no"><action>Adjust and repeat</action></check>
</step>
<step n="6" goal="Load Resources">
<action>Load {{templates}} and extract `diagram` section</action>
<action>Load {{library}}</action>
<action>Load theme.json and merge with template</action>
<action>Load {{helpers}} for guidelines</action>
</step>
<step n="7" goal="Build Diagram Elements">
<critical>Follow {{helpers}} for proper element creation</critical>
<substep>For Each Component:
- Generate unique IDs (component-id, text-id, group-id)
- Create shape with groupIds
- Calculate text width
- Create text with containerId and matching groupIds
- Add boundElements
</substep>
<substep>For Each Connection:
- Determine arrow type (straight/elbow)
- Create with startBinding and endBinding
- Update boundElements on both components
</substep>
<substep>Build Order by Type:
- Architecture: Services → Databases → Connections → Labels
- ERD: Entities → Attributes → Relationships → Cardinality
- UML Class: Classes → Attributes → Methods → Relationships
- UML Sequence: Actors → Lifelines → Messages → Returns
- UML Use Case: Actors → Use Cases → Relationships
</substep>
<substep>Alignment:
- Snap to 20px grid
- Space: 40px between components, 60px between sections
</substep>
</step>
<step n="8" goal="Optimize and Save">
<action>Strip unused elements and elements with isDeleted: true</action>
<action>Save to {{default_output_file}}</action>
</step>
<step n="9" goal="Validate JSON Syntax">
<critical>NEVER delete the file if validation fails - always fix syntax errors</critical>
<action>Run: node -e "JSON.parse(require('fs').readFileSync('{{default_output_file}}', 'utf8')); console.log('✓ Valid JSON')"</action>
<check if="validation fails (exit code 1)">
<action>Read the error message carefully - it shows the syntax error and position</action>
<action>Open the file and navigate to the error location</action>
<action>Fix the syntax error (add missing comma, bracket, or quote as indicated)</action>
<action>Save the file</action>
<action>Re-run validation with the same command</action>
<action>Repeat until validation passes</action>
</check>
<action>Once validation passes, confirm: "Diagram created at {{default_output_file}}. Open to view?"</action>
</step>
<step n="10" goal="Validate Content">
<invoke-task>Validate against {{validation}} using {_bmad}/core/tasks/validate-workflow.xml</invoke-task>
</step>
</workflow>
```

View File

@ -0,0 +1,27 @@
name: create-excalidraw-diagram
description: "Create system architecture diagrams, ERDs, UML diagrams, or general technical diagrams in Excalidraw format"
author: "BMad"
# Config values
config_source: "{project-root}/_bmad/bmm/config.yaml"
output_folder: "{config_source}:output_folder"
# Workflow components
installed_path: "{project-root}/_bmad/bmm/workflows/excalidraw-diagrams/create-diagram"
shared_path: "{project-root}/_bmad/bmm/workflows/excalidraw-diagrams/_shared"
instructions: "{installed_path}/instructions.md"
validation: "{installed_path}/checklist.md"
# Core Excalidraw resources (universal knowledge)
helpers: "{project-root}/_bmad/core/resources/excalidraw/excalidraw-helpers.md"
json_validation: "{project-root}/_bmad/core/resources/excalidraw/validate-json-instructions.md"
# Domain-specific resources (technical diagrams)
templates: "{shared_path}/excalidraw-templates.yaml"
library: "{shared_path}/excalidraw-library.json"
# Output file (respects user's configured output_folder)
default_output_file: "{output_folder}/excalidraw-diagrams/diagram-{timestamp}.excalidraw"
standalone: true
web_bundle: false

View File

@ -0,0 +1,49 @@
# Create Flowchart - Validation Checklist
## Element Structure
- [ ] All shapes with labels have matching `groupIds`
- [ ] All text elements have `containerId` pointing to parent shape
- [ ] Text width calculated properly (no cutoff)
- [ ] Text alignment set (`textAlign` + `verticalAlign`)
## Layout and Alignment
- [ ] All elements snapped to 20px grid
- [ ] Consistent spacing between elements (60px minimum)
- [ ] Vertical alignment maintained for flow direction
- [ ] No overlapping elements
## Connections
- [ ] All arrows have `startBinding` and `endBinding`
- [ ] `boundElements` array updated on connected shapes
- [ ] Arrow types appropriate (straight for forward, elbow for backward/upward)
- [ ] Gap set to 10 for all bindings
## Theme and Styling
- [ ] Theme colors applied consistently
- [ ] All shapes use theme primary fill color
- [ ] All borders use theme accent color
- [ ] Text color is readable (#1e1e1e)
## Composition
- [ ] Element count under 50
- [ ] Library components referenced where possible
- [ ] No duplicate element definitions
## Output Quality
- [ ] No elements with `isDeleted: true`
- [ ] JSON is valid
- [ ] File saved to correct location
## Functional Requirements
- [ ] Start point clearly marked
- [ ] End point clearly marked
- [ ] All process steps labeled
- [ ] Decision points use diamond shapes
- [ ] Flow direction is clear and logical

View File

@ -0,0 +1,241 @@
# Create Flowchart - Workflow Instructions
```xml
<critical>The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml</critical>
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
<critical>This workflow creates a flowchart visualization in Excalidraw format for processes, pipelines, or logic flows.</critical>
<workflow>
<step n="0" goal="Contextual Analysis (Smart Elicitation)">
<critical>Before asking any questions, analyze what the user has already told you</critical>
<action>Review the user's initial request and conversation history</action>
<action>Extract any mentioned: flowchart type, complexity, decision points, save location</action>
<check if="ALL requirements are clear from context">
<action>Summarize your understanding</action>
<action>Skip directly to Step 4 (Plan Flowchart Layout)</action>
</check>
<check if="SOME requirements are clear">
<action>Note what you already know</action>
<action>Only ask about missing information in Step 1</action>
</check>
<check if="requirements are unclear or minimal">
<action>Proceed with full elicitation in Step 1</action>
</check>
</step>
<step n="1" goal="Gather Requirements" elicit="true">
<action>Ask Question 1: "What type of process flow do you need to visualize?"</action>
<action>Present numbered options:
1. Business Process Flow - Document business workflows, approval processes, or operational procedures
2. Algorithm/Logic Flow - Visualize code logic, decision trees, or computational processes
3. User Journey Flow - Map user interactions, navigation paths, or experience flows
4. Data Processing Pipeline - Show data transformation, ETL processes, or processing stages
5. Other - Describe your specific flowchart needs
</action>
<action>WAIT for user selection (1-5)</action>
<action>Ask Question 2: "How many main steps are in this flow?"</action>
<action>Present numbered options:
1. Simple (3-5 steps) - Quick process with few decision points
2. Medium (6-10 steps) - Standard workflow with some branching
3. Complex (11-20 steps) - Detailed process with multiple decision points
4. Very Complex (20+ steps) - Comprehensive workflow requiring careful layout
</action>
<action>WAIT for user selection (1-4)</action>
<action>Store selection in {{complexity}}</action>
<action>Ask Question 3: "Does your flow include decision points (yes/no branches)?"</action>
<action>Present numbered options:
1. No decisions - Linear flow from start to end
2. Few decisions (1-2) - Simple branching with yes/no paths
3. Multiple decisions (3-5) - Several conditional branches
4. Complex decisions (6+) - Extensive branching logic
</action>
<action>WAIT for user selection (1-4)</action>
<action>Store selection in {{decision_points}}</action>
<action>Ask Question 4: "Where should the flowchart be saved?"</action>
<action>Present numbered options:
1. Default location - docs/flowcharts/[auto-generated-name].excalidraw
2. Custom path - Specify your own file path
3. Project root - Save in main project directory
4. Specific folder - Choose from existing folders
</action>
<action>WAIT for user selection (1-4)</action>
<check if="selection is 2 or 4">
<action>Ask for specific path</action>
<action>WAIT for user input</action>
</check>
<action>Store final path in {{default_output_file}}</action>
</step>
<step n="2" goal="Check for Existing Theme" elicit="true">
<action>Check if theme.json exists at output location</action>
<check if="theme.json exists">
<action>Ask: "Found existing theme. Use it? (yes/no)"</action>
<action>WAIT for user response</action>
<check if="user says yes">
<action>Load and use existing theme</action>
<action>Skip to Step 4</action>
</check>
<check if="user says no">
<action>Proceed to Step 3</action>
</check>
</check>
<check if="theme.json does not exist">
<action>Proceed to Step 3</action>
</check>
</step>
<step n="3" goal="Create Theme" elicit="true">
<action>Ask: "Let's create a theme for your flowchart. Choose a color scheme:"</action>
<action>Present numbered options:
1. Professional Blue
- Primary Fill: #e3f2fd (light blue)
- Accent/Border: #1976d2 (blue)
- Decision: #fff3e0 (light orange)
- Text: #1e1e1e (dark gray)
2. Success Green
- Primary Fill: #e8f5e9 (light green)
- Accent/Border: #388e3c (green)
- Decision: #fff9c4 (light yellow)
- Text: #1e1e1e (dark gray)
3. Neutral Gray
- Primary Fill: #f5f5f5 (light gray)
- Accent/Border: #616161 (gray)
- Decision: #e0e0e0 (medium gray)
- Text: #1e1e1e (dark gray)
4. Warm Orange
- Primary Fill: #fff3e0 (light orange)
- Accent/Border: #f57c00 (orange)
- Decision: #ffe0b2 (peach)
- Text: #1e1e1e (dark gray)
5. Custom Colors - Define your own color palette
</action>
<action>WAIT for user selection (1-5)</action>
<action>Store selection in {{theme_choice}}</action>
<check if="selection is 5 (Custom)">
<action>Ask: "Primary fill color (hex code)?"</action>
<action>WAIT for user input</action>
<action>Store in {{custom_colors.primary_fill}}</action>
<action>Ask: "Accent/border color (hex code)?"</action>
<action>WAIT for user input</action>
<action>Store in {{custom_colors.accent}}</action>
<action>Ask: "Decision color (hex code)?"</action>
<action>WAIT for user input</action>
<action>Store in {{custom_colors.decision}}</action>
</check>
<action>Create theme.json with selected colors</action>
<action>Show theme preview with all colors</action>
<action>Ask: "Theme looks good?"</action>
<action>Present numbered options:
1. Yes, use this theme - Proceed with theme
2. No, adjust colors - Modify color selections
3. Start over - Choose different preset
</action>
<action>WAIT for selection (1-3)</action>
<check if="selection is 2 or 3">
<action>Repeat Step 3</action>
</check>
</step>
<step n="4" goal="Plan Flowchart Layout">
<action>List all steps and decision points based on gathered requirements</action>
<action>Show user the planned structure</action>
<action>Ask: "Structure looks correct? (yes/no)"</action>
<action>WAIT for user response</action>
<check if="user says no">
<action>Adjust structure based on feedback</action>
<action>Repeat this step</action>
</check>
</step>
<step n="5" goal="Load Template and Resources">
<action>Load {{templates}} file</action>
<action>Extract `flowchart` section from YAML</action>
<action>Load {{library}} file</action>
<action>Load theme.json and merge colors with template</action>
<action>Load {{helpers}} for element creation guidelines</action>
</step>
<step n="6" goal="Build Flowchart Elements">
<critical>Follow guidelines from {{helpers}} for proper element creation</critical>
<action>Build ONE section at a time following these rules:</action>
<substep>For Each Shape with Label:
1. Generate unique IDs (shape-id, text-id, group-id)
2. Create shape with groupIds: [group-id]
3. Calculate text width: (text.length × fontSize × 0.6) + 20, round to nearest 10
4. Create text element with:
- containerId: shape-id
- groupIds: [group-id] (SAME as shape)
- textAlign: "center"
- verticalAlign: "middle"
- width: calculated width
5. Add boundElements to shape referencing text
</substep>
<substep>For Each Arrow:
1. Determine arrow type needed:
- Straight: For forward flow (left-to-right, top-to-bottom)
- Elbow: For upward flow, backward flow, or complex routing
2. Create arrow with startBinding and endBinding
3. Set startBinding.elementId to source shape ID
4. Set endBinding.elementId to target shape ID
5. Set gap: 10 for both bindings
6. If elbow arrow, add intermediate points for direction changes
7. Update boundElements on both connected shapes
</substep>
<substep>Alignment:
- Snap all x, y to 20px grid
- Align shapes vertically (same x for vertical flow)
- Space elements: 60px between shapes
</substep>
<substep>Build Order:
1. Start point (circle) with label
2. Each process step (rectangle) with label
3. Each decision point (diamond) with label
4. End point (circle) with label
5. Connect all with bound arrows
</substep>
</step>
<step n="7" goal="Optimize and Save">
<action>Strip unused elements and elements with isDeleted: true</action>
<action>Save to {{default_output_file}}</action>
</step>
<step n="8" goal="Validate JSON Syntax">
<critical>NEVER delete the file if validation fails - always fix syntax errors</critical>
<action>Run: node -e "JSON.parse(require('fs').readFileSync('{{default_output_file}}', 'utf8')); console.log('✓ Valid JSON')"</action>
<check if="validation fails (exit code 1)">
<action>Read the error message carefully - it shows the syntax error and position</action>
<action>Open the file and navigate to the error location</action>
<action>Fix the syntax error (add missing comma, bracket, or quote as indicated)</action>
<action>Save the file</action>
<action>Re-run validation with the same command</action>
<action>Repeat until validation passes</action>
</check>
<action>Once validation passes, confirm with user: "Flowchart created at {{default_output_file}}. Open to view?"</action>
</step>
<step n="9" goal="Validate Content">
<invoke-task>Validate against checklist at {{validation}} using {_bmad}/core/tasks/validate-workflow.xml</invoke-task>
</step>
</workflow>
```

View File

@ -0,0 +1,27 @@
name: create-excalidraw-flowchart
description: "Create a flowchart visualization in Excalidraw format for processes, pipelines, or logic flows"
author: "BMad"
# Config values
config_source: "{project-root}/_bmad/bmm/config.yaml"
output_folder: "{config_source}:output_folder"
# Workflow components
installed_path: "{project-root}/_bmad/bmm/workflows/excalidraw-diagrams/create-flowchart"
shared_path: "{project-root}/_bmad/bmm/workflows/excalidraw-diagrams/_shared"
instructions: "{installed_path}/instructions.md"
validation: "{installed_path}/checklist.md"
# Core Excalidraw resources (universal knowledge)
helpers: "{project-root}/_bmad/core/resources/excalidraw/excalidraw-helpers.md"
json_validation: "{project-root}/_bmad/core/resources/excalidraw/validate-json-instructions.md"
# Domain-specific resources (technical diagrams)
templates: "{shared_path}/excalidraw-templates.yaml"
library: "{shared_path}/excalidraw-library.json"
# Output file (respects user's configured output_folder)
default_output_file: "{output_folder}/excalidraw-diagrams/flowchart-{timestamp}.excalidraw"
standalone: true
web_bundle: false

View File

@ -0,0 +1,38 @@
# Create Wireframe - Validation Checklist
## Layout Structure
- [ ] Screen dimensions appropriate for device type
- [ ] Grid alignment (20px) maintained
- [ ] Consistent spacing between UI elements
- [ ] Proper hierarchy (header, content, footer)
## UI Elements
- [ ] All interactive elements clearly marked
- [ ] Buttons, inputs, and controls properly sized
- [ ] Text labels readable and appropriately sized
- [ ] Navigation elements clearly indicated
## Fidelity
- [ ] Matches requested fidelity level (low/medium/high)
- [ ] Appropriate level of detail
- [ ] Placeholder content used where needed
- [ ] No unnecessary decoration for low-fidelity
## Annotations
- [ ] Key interactions annotated
- [ ] Flow indicators present if multi-screen
- [ ] Important notes included
- [ ] Element purposes clear
## Technical Quality
- [ ] All elements properly grouped
- [ ] Text elements have containerId
- [ ] Snapped to grid
- [ ] No elements with `isDeleted: true`
- [ ] JSON is valid
- [ ] File saved to correct location

View File

@ -0,0 +1,133 @@
# Create Wireframe - Workflow Instructions
```xml
<critical>The workflow execution engine is governed by: {project-root}/_bmad/core/tasks/workflow.xml</critical>
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
<critical>This workflow creates website or app wireframes in Excalidraw format.</critical>
<workflow>
<step n="0" goal="Contextual Analysis">
<action>Review user's request and extract: wireframe type, fidelity level, screen count, device type, save location</action>
<check if="ALL requirements clear"><action>Skip to Step 5</action></check>
</step>
<step n="1" goal="Identify Wireframe Type" elicit="true">
<action>Ask: "What type of wireframe do you need?"</action>
<action>Present options:
1. Website (Desktop)
2. Mobile App (iOS/Android)
3. Web App (Responsive)
4. Tablet App
5. Multi-platform
</action>
<action>WAIT for selection</action>
</step>
<step n="2" goal="Gather Requirements" elicit="true">
<action>Ask fidelity level (Low/Medium/High)</action>
<action>Ask screen count (Single/Few 2-3/Multiple 4-6/Many 7+)</action>
<action>Ask device dimensions or use standard</action>
<action>Ask save location</action>
</step>
<step n="3" goal="Check Theme" elicit="true">
<action>Check for existing theme.json, ask to use if exists</action>
</step>
<step n="4" goal="Create Theme" elicit="true">
<action>Ask: "Choose a wireframe style:"</action>
<action>Present numbered options:
1. Classic Wireframe
- Background: #ffffff (white)
- Container: #f5f5f5 (light gray)
- Border: #9e9e9e (gray)
- Text: #424242 (dark gray)
2. High Contrast
- Background: #ffffff (white)
- Container: #eeeeee (light gray)
- Border: #212121 (black)
- Text: #000000 (black)
3. Blueprint Style
- Background: #1a237e (dark blue)
- Container: #3949ab (blue)
- Border: #7986cb (light blue)
- Text: #ffffff (white)
4. Custom - Define your own colors
</action>
<action>WAIT for selection</action>
<action>Create theme.json based on selection</action>
<action>Confirm with user</action>
</step>
<step n="5" goal="Plan Wireframe Structure">
<action>List all screens and their purposes</action>
<action>Map navigation flow between screens</action>
<action>Identify key UI elements for each screen</action>
<action>Show planned structure, confirm with user</action>
</step>
<step n="6" goal="Load Resources">
<action>Load {{templates}} and extract `wireframe` section</action>
<action>Load {{library}}</action>
<action>Load theme.json</action>
<action>Load {{helpers}}</action>
</step>
<step n="7" goal="Build Wireframe Elements">
<critical>Follow {{helpers}} for proper element creation</critical>
<substep>For Each Screen:
- Create container/frame
- Add header section
- Add content areas
- Add navigation elements
- Add interactive elements (buttons, inputs)
- Add labels and annotations
</substep>
<substep>Build Order:
1. Screen containers
2. Layout sections (header, content, footer)
3. Navigation elements
4. Content blocks
5. Interactive elements
6. Labels and annotations
7. Flow indicators (if multi-screen)
</substep>
<substep>Fidelity Guidelines:
- Low: Basic shapes, minimal detail, placeholder text
- Medium: More defined elements, some styling, representative content
- High: Detailed elements, realistic sizing, actual content examples
</substep>
</step>
<step n="8" goal="Optimize and Save">
<action>Strip unused elements and elements with isDeleted: true</action>
<action>Save to {{default_output_file}}</action>
</step>
<step n="9" goal="Validate JSON Syntax">
<critical>NEVER delete the file if validation fails - always fix syntax errors</critical>
<action>Run: node -e "JSON.parse(require('fs').readFileSync('{{default_output_file}}', 'utf8')); console.log('✓ Valid JSON')"</action>
<check if="validation fails (exit code 1)">
<action>Read the error message carefully - it shows the syntax error and position</action>
<action>Open the file and navigate to the error location</action>
<action>Fix the syntax error (add missing comma, bracket, or quote as indicated)</action>
<action>Save the file</action>
<action>Re-run validation with the same command</action>
<action>Repeat until validation passes</action>
</check>
<action>Once validation passes, confirm with user</action>
</step>
<step n="10" goal="Validate Content">
<invoke-task>Validate against {{validation}}</invoke-task>
</step>
</workflow>
```

View File

@ -0,0 +1,27 @@
name: create-excalidraw-wireframe
description: "Create website or app wireframes in Excalidraw format"
author: "BMad"
# Config values
config_source: "{project-root}/_bmad/bmm/config.yaml"
output_folder: "{config_source}:output_folder"
# Workflow components
installed_path: "{project-root}/_bmad/bmm/workflows/excalidraw-diagrams/create-wireframe"
shared_path: "{project-root}/_bmad/bmm/workflows/excalidraw-diagrams/_shared"
instructions: "{installed_path}/instructions.md"
validation: "{installed_path}/checklist.md"
# Core Excalidraw resources (universal knowledge)
helpers: "{project-root}/_bmad/core/resources/excalidraw/excalidraw-helpers.md"
json_validation: "{project-root}/_bmad/core/resources/excalidraw/validate-json-instructions.md"
# Domain-specific resources (technical diagrams)
templates: "{shared_path}/excalidraw-templates.yaml"
library: "{shared_path}/excalidraw-library.json"
# Output file (respects user's configured output_folder)
default_output_file: "{output_folder}/excalidraw-diagrams/wireframe-{timestamp}.excalidraw"
standalone: true
web_bundle: false

View File

@ -45,3 +45,5 @@ execution_hints:
interactive: false interactive: false
autonomous: true autonomous: true
iterative: false iterative: false
web_bundle: false

View File

@ -0,0 +1,160 @@
# Core Excalidraw Resources
Universal knowledge for creating Excalidraw diagrams. All agents that create Excalidraw files should reference these resources.
## Purpose
Provides the **HOW** (universal knowledge) while agents provide the **WHAT** (domain-specific application).
**Core = "How to create Excalidraw elements"**
- How to group shapes with text labels
- How to calculate text width
- How to create arrows with proper bindings
- How to validate JSON syntax
- Base structure and primitives
**Agents = "What diagrams to create"**
- Frame Expert (BMM): Technical flowcharts, architecture diagrams, wireframes
- Presentation Master (CIS): Pitch decks, creative visuals, Rube Goldberg machines
- Tech Writer (BMM): Documentation diagrams, concept explanations
## Files in This Directory
### excalidraw-helpers.md
**Universal element creation patterns**
- Text width calculation
- Element grouping rules (shapes + labels)
- Grid alignment
- Arrow creation (straight, elbow)
- Theme application
- Validation checklist
- Optimization rules
**Agents reference this to:**
- Create properly grouped shapes
- Calculate text dimensions
- Connect elements with arrows
- Ensure valid structure
### validate-json-instructions.md
**Universal JSON validation process**
- How to validate Excalidraw JSON
- Common errors and fixes
- Workflow integration
- Error recovery
**Agents reference this to:**
- Validate files after creation
- Fix syntax errors
- Ensure files can be opened in Excalidraw
### library-loader.md (Future)
**How to load external .excalidrawlib files**
- Programmatic library loading
- Community library integration
- Custom library management
**Status:** To be developed when implementing external library support.
## How Agents Use These Resources
### Example: Frame Expert (Technical Diagrams)
```yaml
# workflows/excalidraw-diagrams/create-flowchart/workflow.yaml
helpers: '{project-root}/_bmad/core/resources/excalidraw/excalidraw-helpers.md'
json_validation: '{project-root}/_bmad/core/resources/excalidraw/validate-json-instructions.md'
```
**Domain-specific additions:**
```yaml
# workflows/excalidraw-diagrams/_shared/flowchart-templates.yaml
flowchart:
start_node:
type: ellipse
width: 120
height: 60
process_box:
type: rectangle
width: 160
height: 80
decision_diamond:
type: diamond
width: 140
height: 100
```
### Example: Presentation Master (Creative Visuals)
```yaml
# workflows/create-visual-metaphor/workflow.yaml
helpers: '{project-root}/_bmad/core/resources/excalidraw/excalidraw-helpers.md'
json_validation: '{project-root}/_bmad/core/resources/excalidraw/validate-json-instructions.md'
```
**Domain-specific additions:**
```yaml
# workflows/_shared/creative-templates.yaml
rube_goldberg:
whimsical_connector:
type: arrow
strokeStyle: dashed
roughness: 2
playful_box:
type: rectangle
roundness: 12
```
## What Doesn't Belong in Core
**Domain-Specific Elements:**
- Flowchart-specific templates (belongs in Frame Expert)
- Pitch deck layouts (belongs in Presentation Master)
- Documentation-specific styles (belongs in Tech Writer)
**Agent Workflows:**
- How to create a flowchart (Frame Expert workflow)
- How to create a pitch deck (Presentation Master workflow)
- Step-by-step diagram creation (agent-specific)
**Theming:**
- Currently in agent workflows
- **Future:** Will be refactored to core as user-configurable themes
## Architecture Principle
**Single Source of Truth:**
- Core holds universal knowledge
- Agents reference core, don't duplicate
- Updates to core benefit all agents
- Agents specialize with domain knowledge
**DRY (Don't Repeat Yourself):**
- Element creation logic: ONCE in core
- Text width calculation: ONCE in core
- Validation process: ONCE in core
- Arrow binding patterns: ONCE in core
## Future Enhancements
1. **External Library Loader** - Load .excalidrawlib files from libraries.excalidraw.com
2. **Theme Management** - User-configurable color themes saved in core
3. **Component Library** - Shared reusable components across agents
4. **Layout Algorithms** - Auto-layout helpers for positioning elements

View File

@ -0,0 +1,127 @@
# Excalidraw Element Creation Guidelines
## Text Width Calculation
For text elements inside shapes (labels):
```
text_width = (text.length × fontSize × 0.6) + 20
```
Round to nearest 10 for grid alignment.
## Element Grouping Rules
**CRITICAL:** When creating shapes with labels:
1. Generate unique IDs:
- `shape-id` for the shape
- `text-id` for the text
- `group-id` for the group
2. Shape element must have:
- `groupIds: [group-id]`
- `boundElements: [{type: "text", id: text-id}]`
3. Text element must have:
- `containerId: shape-id`
- `groupIds: [group-id]` (SAME as shape)
- `textAlign: "center"`
- `verticalAlign: "middle"`
- `width: calculated_width`
## Grid Alignment
- Snap all `x`, `y` coordinates to 20px grid
- Formula: `Math.round(value / 20) * 20`
- Spacing between elements: 60px minimum
## Arrow Creation
### Straight Arrows
Use for forward flow (left-to-right, top-to-bottom):
```json
{
"type": "arrow",
"startBinding": {
"elementId": "source-shape-id",
"focus": 0,
"gap": 10
},
"endBinding": {
"elementId": "target-shape-id",
"focus": 0,
"gap": 10
},
"points": [[0, 0], [distance_x, distance_y]]
}
```
### Elbow Arrows
Use for upward flow, backward flow, or complex routing:
```json
{
"type": "arrow",
"startBinding": {...},
"endBinding": {...},
"points": [
[0, 0],
[intermediate_x, 0],
[intermediate_x, intermediate_y],
[final_x, final_y]
],
"elbowed": true
}
```
### Update Connected Shapes
After creating arrow, update `boundElements` on both connected shapes:
```json
{
"id": "shape-id",
"boundElements": [
{ "type": "text", "id": "text-id" },
{ "type": "arrow", "id": "arrow-id" }
]
}
```
## Theme Application
Theme colors should be applied consistently:
- **Shapes**: `backgroundColor` from theme primary fill
- **Borders**: `strokeColor` from theme accent
- **Text**: `strokeColor` = "#1e1e1e" (dark text)
- **Arrows**: `strokeColor` from theme accent
## Validation Checklist
Before saving, verify:
- [ ] All shapes with labels have matching `groupIds`
- [ ] All text elements have `containerId` pointing to parent shape
- [ ] Text width calculated properly (no cutoff)
- [ ] Text alignment set (`textAlign` + `verticalAlign`)
- [ ] All elements snapped to 20px grid
- [ ] All arrows have `startBinding` and `endBinding`
- [ ] `boundElements` array updated on connected shapes
- [ ] Theme colors applied consistently
- [ ] No metadata or history in final output
- [ ] All IDs are unique
## Optimization
Remove from final output:
- `appState` object
- `files` object (unless images used)
- All elements with `isDeleted: true`
- Unused library items
- Version history

View File

@ -0,0 +1,50 @@
# External Library Loader
**Status:** Placeholder for future implementation
## Purpose
Load external .excalidrawlib files from <https://libraries.excalidraw.com> or custom sources.
## Planned Capabilities
- Load libraries by URL
- Load libraries from local files
- Merge multiple libraries
- Filter library components
- Cache loaded libraries
## API Reference
Will document how to use:
- `importLibrary(url)` - Load library from URL
- `loadSceneOrLibraryFromBlob()` - Load from file
- `mergeLibraryItems()` - Combine libraries
## Usage Example
```yaml
# Future workflow.yaml structure
libraries:
- url: 'https://libraries.excalidraw.com/libraries/...'
filter: ['aws', 'cloud']
- path: '{project-root}/_data/custom-library.excalidrawlib'
```
## Implementation Notes
This will be developed when agents need to leverage the extensive library ecosystem available at <https://libraries.excalidraw.com>.
Hundreds of pre-built component libraries exist for:
- AWS/Cloud icons
- UI/UX components
- Business diagrams
- Mind map shapes
- Floor plans
- And much more...
## User Configuration
Future: Users will be able to configure favorite libraries in their BMAD config for automatic loading.

View File

@ -0,0 +1,79 @@
# JSON Validation Instructions
## Purpose
Validate Excalidraw JSON files after saving to catch syntax errors (missing commas, brackets, quotes).
## How to Validate
Use Node.js built-in JSON parsing to validate the file:
```bash
node -e "JSON.parse(require('fs').readFileSync('FILE_PATH', 'utf8')); console.log('✓ Valid JSON')"
```
Replace `FILE_PATH` with the actual file path.
## Exit Codes
- Exit code 0 = Valid JSON
- Exit code 1 = Invalid JSON (syntax error)
## Error Output
If invalid, Node.js will output:
- Error message with description
- Position in file where error occurred
- Line and column information (if available)
## Common Errors and Fixes
### Missing Comma
```
SyntaxError: Expected ',' or '}' after property value
```
**Fix:** Add comma after the property value
### Missing Bracket/Brace
```
SyntaxError: Unexpected end of JSON input
```
**Fix:** Add missing closing bracket `]` or brace `}`
### Extra Comma (Trailing)
```
SyntaxError: Unexpected token ,
```
**Fix:** Remove the trailing comma before `]` or `}`
### Missing Quote
```
SyntaxError: Unexpected token
```
**Fix:** Add missing quote around string value
## Workflow Integration
After saving an Excalidraw file, run validation:
1. Save the file
2. Run: `node -e "JSON.parse(require('fs').readFileSync('{{save_location}}', 'utf8')); console.log('✓ Valid JSON')"`
3. If validation fails:
- Read the error message for line/position
- Open the file at that location
- Fix the syntax error
- Save and re-validate
4. Repeat until validation passes
## Critical Rule
**NEVER delete the file due to validation errors - always fix the syntax error at the reported location.**

View File

@ -1,6 +1,7 @@
<task id="_bmad/core/tasks/editorial-review-prose.xml" <task id="_bmad/core/tasks/editorial-review-prose.xml"
name="Editorial Review - Prose" name="Editorial Review - Prose"
description="Clinical copy-editor that reviews text for communication issues"> description="Clinical copy-editor that reviews text for communication issues"
standalone="true">
<objective>Review text for communication issues that impede comprehension and output suggested fixes in a three-column table</objective> <objective>Review text for communication issues that impede comprehension and output suggested fixes in a three-column table</objective>
@ -61,8 +62,7 @@
</step> </step>
<step n="3" title="Editorial Review" critical="true"> <step n="3" title="Editorial Review" critical="true">
<action if="style_guide provided">Consult style_guide now and note its key requirements—these override default principles for this <action if="style_guide provided">Consult style_guide now and note its key requirements—these override default principles for this review</action>
review</action>
<action>Review all prose sections (skip code blocks, frontmatter, structural markup)</action> <action>Review all prose sections (skip code blocks, frontmatter, structural markup)</action>
<action>Identify communication issues that impede comprehension</action> <action>Identify communication issues that impede comprehension</action>
<action>For each issue, determine the minimal fix that achieves clarity</action> <action>For each issue, determine the minimal fix that achieves clarity</action>
@ -85,10 +85,8 @@
<example title="Correct output format"> <example title="Correct output format">
| Original Text | Revised Text | Changes | | Original Text | Revised Text | Changes |
|---------------|--------------|---------| |---------------|--------------|---------|
| The system will processes data and it handles errors. | The system processes data and handles errors. | Fixed subject-verb | The system will processes data and it handles errors. | The system processes data and handles errors. | Fixed subject-verb agreement ("will processes" to "processes"); removed redundant "it" |
agreement ("will processes" to "processes"); removed redundant "it" | | Users can chose from options (lines 12, 45, 78) | Users can choose from options | Fixed spelling: "chose" to "choose" (appears in 3 locations) |
| Users can chose from options (lines 12, 45, 78) | Users can choose from options | Fixed spelling: "chose" to "choose" (appears in
3 locations) |
</example> </example>
</step> </step>
</flow> </flow>

View File

@ -4,7 +4,8 @@
<task id="_bmad/core/tasks/editorial-review-structure.xml" <task id="_bmad/core/tasks/editorial-review-structure.xml"
name="Editorial Review - Structure" name="Editorial Review - Structure"
description="Structural editor that proposes cuts, reorganization, description="Structural editor that proposes cuts, reorganization,
and simplification while preserving comprehension"> and simplification while preserving comprehension"
standalone="true">
<objective>Review document structure and propose substantive changes <objective>Review document structure and propose substantive changes
to improve clarity and flow-run this BEFORE copy editing</objective> to improve clarity and flow-run this BEFORE copy editing</objective>
<inputs> <inputs>
@ -131,8 +132,7 @@
<action>Note reader_type and which principles apply (human-reader-principles or llm-reader-principles)</action> <action>Note reader_type and which principles apply (human-reader-principles or llm-reader-principles)</action>
</step> </step>
<step n="3" title="Structural Analysis" critical="true"> <step n="3" title="Structural Analysis" critical="true">
<action if="style_guide provided">Consult style_guide now and note its key requirements—these override default principles for this <action if="style_guide provided">Consult style_guide now and note its key requirements—these override default principles for this analysis</action>
analysis</action>
<action>Map the document structure: list each major section with its word count</action> <action>Map the document structure: list each major section with its word count</action>
<action>Evaluate structure against the selected model's primary rules <action>Evaluate structure against the selected model's primary rules
(e.g., 'Does recommendation come first?' for Pyramid)</action> (e.g., 'Does recommendation come first?' for Pyramid)</action>

View File

@ -1,11 +1,12 @@
--- ---
name: help name: help
description: Get unstuck by showing what workflow steps come next or answering questions about what to do description: Get unstuck by showing what workflow steps come next or answering questions about what to do
standalone: true
--- ---
# Task: BMAD Help # Task: BMAD Help
## ROUTING RULES ## KEY RULES
- **Empty `phase` = anytime** — Universal tools work regardless of workflow state - **Empty `phase` = anytime** — Universal tools work regardless of workflow state
- **Numbered phases indicate sequence** — Phases like `1-discover``2-define``3-build``4-ship` flow in order (naming varies by module) - **Numbered phases indicate sequence** — Phases like `1-discover``2-define``3-build``4-ship` flow in order (naming varies by module)
@ -14,26 +15,6 @@ description: Get unstuck by showing what workflow steps come next or answering q
- **`required=true` blocks progress** — Required workflows must complete before proceeding to later phases - **`required=true` blocks progress** — Required workflows must complete before proceeding to later phases
- **Artifacts reveal completion** — Search resolved output paths for `outputs` patterns, fuzzy-match found files to workflow rows - **Artifacts reveal completion** — Search resolved output paths for `outputs` patterns, fuzzy-match found files to workflow rows
## DISPLAY RULES
### Command-Based Workflows
When `command` field has a value:
- Show the command prefixed with `/` (e.g., `/bmad-bmm-create-prd`)
### Agent-Based Workflows
When `command` field is empty:
- User loads agent first via `/agent-command`
- Then invokes by referencing the `code` field or describing the `name` field
- Do NOT show a slash command — show the code value and agent load instruction instead
Example presentation for empty command:
```
Explain Concept (EC)
Load: /tech-writer, then ask to "EC about [topic]"
Agent: Tech Writer
Description: Create clear technical explanations with examples...
```
## MODULE DETECTION ## MODULE DETECTION
- **Empty `module` column** → universal tools (work across all modules) - **Empty `module` column** → universal tools (work across all modules)
@ -44,10 +25,10 @@ Detect the active module from conversation context, recent workflows, or user qu
## INPUT ANALYSIS ## INPUT ANALYSIS
Determine what was just completed: Determine what was just completed:
- Explicit completion stated by user - Did someone state they completed something? Proceed as if that was the input.
- Workflow completed in current conversation - Was a workflow just completed in this conversation? Proceed as if that was the input.
- Artifacts found matching `outputs` patterns - Search resolved artifact locations for files; fuzzy-match to workflow `outputs` patterns.
- If `index.md` exists, read it for additional context - If an `index.md` exists, read it for additional context.
- If still unclear, ask: "What workflow did you most recently complete?" - If still unclear, ask: "What workflow did you most recently complete?"
## EXECUTION ## EXECUTION
@ -56,27 +37,26 @@ Determine what was just completed:
2. **Resolve output locations** — Scan each folder under `_bmad/` (except `_config`) for `config.yaml`. For each workflow row, resolve its `output-location` variables against that module's config so artifact paths can be searched. 2. **Resolve output locations** — Scan each folder under `_bmad/` (except `_config`) for `config.yaml`. For each workflow row, resolve its `output-location` variables against that module's config so artifact paths can be searched.
3. **Detect active module** — Use MODULE DETECTION above 3. **Analyze input** — Task may provide a workflow name/code, conversational phrase, or nothing. Infer what was just completed using INPUT ANALYSIS above.
4. **Analyze input** — Task may provide a workflow name/code, conversational phrase, or nothing. Infer what was just completed using INPUT ANALYSIS above. 4. **Detect active module** — Use MODULE DETECTION above to determine which module the user is working in.
5. **Present recommendations** — Show next steps based on: 5. **Present recommendations** — Show next steps based on completed workflows, phase/sequence ordering (KEY RULES), and artifact detection. Format per the following
- Completed workflows detected
- Phase/sequence ordering (ROUTING RULES) ## RECOMMENDED OUTPUT FORMAT
- Artifact presence
**Optional items first** — List optional workflows until a required step is reached **Optional items first** — List optional workflows until a required step is reached
**Required items next** — List the next required workflow **Required items next** — List the next required workflow
For each item show:
For each item, apply DISPLAY RULES above and include:
- Workflow **name** - Workflow **name**
- **Command** OR **Code + Agent load instruction** (per DISPLAY RULES) - **Command** (prefixed with `/`, e.g., `/bmad:example:build-prototype`)
- **Agent** title and display name from the CSV (e.g., "🎨 Alex (Designer)") - **Agent** title and display name from the CSV (e.g., "🎨 Alex (Designer)")
- Brief **description** - Brief **description**
6. **Additional guidance to convey**: ### Additional response output guidance to convey:
- Run each workflow in a **fresh context window** - Run each workflow in a **fresh context window**
- Load the agent using (`/` + `agent-command`), or run the workflow command directly
- For **validation workflows**: recommend using a different high-quality LLM if available - For **validation workflows**: recommend using a different high-quality LLM if available
- For conversational requests: match the user's tone while presenting clearly - For conversational requests: match the user's tone while presenting clearly
7. Return to the calling process after presenting recommendations. 6. Return to the calling process after presenting recommendations.

View File

@ -1,5 +1,5 @@
<task id="_bmad/core/tasks/index-docs" name="Index Docs" <task id="_bmad/core/tasks/index-docs" name="Index Docs"
description="Generates or updates an index.md of all documents in the specified directory"> description="Generates or updates an index.md of all documents in the specified directory" webskip="true" standalone="true">
<llm critical="true"> <llm critical="true">
<i>MANDATORY: Execute ALL steps in the flow section IN EXACT ORDER</i> <i>MANDATORY: Execute ALL steps in the flow section IN EXACT ORDER</i>
<i>DO NOT skip steps or change the sequence</i> <i>DO NOT skip steps or change the sequence</i>

View File

@ -1,7 +1,7 @@
<!-- if possible, run this in a separate subagent or process with read access to the project, <!-- if possible, run this in a separate subagent or process with read access to the project,
but no context except the content to review --> but no context except the content to review -->
<task id="_bmad/core/tasks/review-adversarial-general.xml" name="Adversarial Review (General)"> <task id="_bmad/core/tasks/review-adversarial-general.xml" name="Adversarial Review (General)" standalone="true">
<objective>Cynically review content and produce findings</objective> <objective>Cynically review content and produce findings</objective>
<inputs> <inputs>

View File

@ -1,5 +1,6 @@
<task id="_bmad/core/tasks/shard-doc" name="Shard Document" <task id="_bmad/core/tasks/shard-doc" name="Shard Document"
description="Splits large markdown documents into smaller, organized files based on level 2 (default) sections"> description="Splits large markdown documents into smaller, organized files based on level 2 (default) sections" webskip="true"
standalone="true">
<objective>Split large markdown documents into smaller, organized files based on level 2 sections using @kayvan/markdown-tree-parser tool</objective> <objective>Split large markdown documents into smaller, organized files based on level 2 sections using @kayvan/markdown-tree-parser tool</objective>
<llm critical="true"> <llm critical="true">

View File

@ -1,4 +1,4 @@
<task id="_bmad/core/tasks/workflow.xml" name="Execute Workflow" internal="true"> <task id="_bmad/core/tasks/workflow.xml" name="Execute Workflow" standalone="false">
<objective>Execute given workflow by loading its configuration, following instructions, and producing output</objective> <objective>Execute given workflow by loading its configuration, following instructions, and producing output</objective>
<llm critical="true"> <llm critical="true">

View File

@ -1,4 +1,4 @@
<task id="_bmad/core/workflows/advanced-elicitation/workflow.xml" name="Advanced Elicitation" <task id="_bmad/core/workflows/advanced-elicitation/workflow.xml" name="Advanced Elicitation" standalone="true"
methods="{project-root}/_bmad/core/workflows/advanced-elicitation/methods.csv" methods="{project-root}/_bmad/core/workflows/advanced-elicitation/methods.csv"
agent-party="{project-root}/_bmad/_config/agent-manifest.csv"> agent-party="{project-root}/_bmad/_config/agent-manifest.csv">
<llm critical="true"> <llm critical="true">

View File

@ -164,7 +164,7 @@ async function runTests() {
try { try {
const builder = new YamlXmlBuilder(); const builder = new YamlXmlBuilder();
const qaAgentPath = path.join(projectRoot, 'src/bmm/agents/qa.agent.yaml'); const qaAgentPath = path.join(projectRoot, 'src/bmm/agents/quinn.agent.yaml');
const tempOutput = path.join(__dirname, 'temp-qa-agent.md'); const tempOutput = path.join(__dirname, 'temp-qa-agent.md');
try { try {

View File

@ -38,7 +38,6 @@ const LLM_EXCLUDE_PATTERNS = [
'faq', 'faq',
'reference/glossary/', 'reference/glossary/',
'explanation/game-dev/', 'explanation/game-dev/',
'bmgd/',
// Note: Files/dirs starting with _ (like _STYLE_GUIDE.md, _archive/) are excluded in shouldExcludeFromLlm() // Note: Files/dirs starting with _ (like _STYLE_GUIDE.md, _archive/) are excluded in shouldExcludeFromLlm()
]; ];
@ -195,7 +194,7 @@ function generateLlmsFullTxt(docsDir, outputDir) {
console.log(' → Generating llms-full.txt...'); console.log(' → Generating llms-full.txt...');
const date = new Date().toISOString().split('T')[0]; const date = new Date().toISOString().split('T')[0];
const files = getAllMarkdownFiles(docsDir).sort(compareLlmDocs); const files = getAllMarkdownFiles(docsDir);
const output = [ const output = [
'# BMAD Method Documentation (Full)', '# BMAD Method Documentation (Full)',
@ -237,25 +236,6 @@ function generateLlmsFullTxt(docsDir, outputDir) {
); );
} }
function compareLlmDocs(a, b) {
const aKey = getLlmSortKey(a);
const bKey = getLlmSortKey(b);
if (aKey !== bKey) return aKey - bKey;
return a.localeCompare(b);
}
function getLlmSortKey(filePath) {
if (filePath === 'index.md') return 0;
if (filePath === 'downloads.md') return 1;
if (filePath.startsWith(`tutorials${path.sep}`) || filePath.startsWith('tutorials/')) return 2;
if (filePath.startsWith(`how-to${path.sep}`) || filePath.startsWith('how-to/')) return 3;
if (filePath.startsWith(`explanation${path.sep}`) || filePath.startsWith('explanation/')) return 4;
if (filePath.startsWith(`reference${path.sep}`) || filePath.startsWith('reference/')) return 5;
if (filePath.startsWith(`bmgd${path.sep}`) || filePath.startsWith('bmgd/')) return 6;
return 7;
}
/** /**
* Collects all Markdown (.md) files under a directory and returns their paths relative to a base directory. * Collects all Markdown (.md) files under a directory and returns their paths relative to a base directory.
* @param {string} dir - Directory to search for Markdown files. * @param {string} dir - Directory to search for Markdown files.

View File

@ -1,48 +1,6 @@
const { program } = require('commander'); const { program } = require('commander');
const path = require('node:path'); const path = require('node:path');
const fs = require('node:fs'); const fs = require('node:fs');
const { execSync } = require('node:child_process');
// Check for updates - do this asynchronously so it doesn't block startup
const packageJson = require('../../package.json');
const packageName = 'bmad-method';
checkForUpdate().catch(() => {
// Silently ignore errors - version check is best-effort
});
async function checkForUpdate() {
try {
// For beta versions, check the beta tag; otherwise check latest
const isBeta =
packageJson.version.includes('Beta') ||
packageJson.version.includes('beta') ||
packageJson.version.includes('alpha') ||
packageJson.version.includes('rc');
const tag = isBeta ? 'beta' : 'latest';
const result = execSync(`npm view ${packageName}@${tag} version`, {
encoding: 'utf8',
stdio: 'pipe',
timeout: 5000,
}).trim();
if (result && result !== packageJson.version) {
console.warn('');
console.warn(' ╔═══════════════════════════════════════════════════════════════════════════════╗');
console.warn(' ║ UPDATE AVAILABLE ║');
console.warn(' ║ ║');
console.warn(` ║ You are using version ${packageJson.version} but ${result} is available. ║`);
console.warn(' ║ ║');
console.warn(' ║ To update,exir and first run: ║');
console.warn(` ║ npm cache clean --force && npx bmad-method@${tag} install ║`);
console.warn(' ║ ║');
console.warn(' ╚═══════════════════════════════════════════════════════════════════════════════╝');
console.warn('');
}
} catch {
// Silently fail - network issues or npm not available
}
}
// Fix for stdin issues when running through npm on Windows // Fix for stdin issues when running through npm on Windows
// Ensures keyboard interaction works properly with CLI prompts // Ensures keyboard interaction works properly with CLI prompts
@ -62,6 +20,9 @@ if (process.stdin.isTTY) {
} }
} }
// Load package.json from root for version info
const packageJson = require('../../package.json');
// Load all command modules // Load all command modules
const commandsPath = path.join(__dirname, 'commands'); const commandsPath = path.join(__dirname, 'commands');
const commandFiles = fs.readdirSync(commandsPath).filter((file) => file.endsWith('.js')); const commandFiles = fs.readdirSync(commandsPath).filter((file) => file.endsWith('.js'));

View File

@ -586,11 +586,7 @@ class ConfigCollector {
console.log(); console.log();
console.log(chalk.cyan('?') + ' ' + chalk.magenta(moduleDisplayName)); console.log(chalk.cyan('?') + ' ' + chalk.magenta(moduleDisplayName));
let customize = true; let customize = true;
if (moduleName === 'core') { if (moduleName !== 'core') {
// Core module: no confirm prompt, so add spacing manually to match visual style
console.log(chalk.gray('│'));
} else {
// Non-core modules: show "Accept Defaults?" confirm prompt (clack adds spacing)
const customizeAnswer = await prompts.prompt([ const customizeAnswer = await prompts.prompt([
{ {
type: 'confirm', type: 'confirm',

View File

@ -146,7 +146,7 @@ class DependencyResolver {
const content = await fs.readFile(file.path, 'utf8'); const content = await fs.readFile(file.path, 'utf8');
// Parse YAML frontmatter for explicit dependencies // Parse YAML frontmatter for explicit dependencies
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/); const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
if (frontmatterMatch) { if (frontmatterMatch) {
try { try {
// Pre-process to handle backticks in YAML values // Pre-process to handle backticks in YAML values

View File

@ -17,7 +17,9 @@ const { ManifestGenerator } = require('./manifest-generator');
const { IdeConfigManager } = require('./ide-config-manager'); const { IdeConfigManager } = require('./ide-config-manager');
const { CustomHandler } = require('../custom/handler'); const { CustomHandler } = require('../custom/handler');
const prompts = require('../../../lib/prompts'); const prompts = require('../../../lib/prompts');
const { BMAD_FOLDER_NAME } = require('../ide/shared/path-utils');
// BMAD installation folder name - this is constant and should never change
const BMAD_FOLDER_NAME = '_bmad';
class Installer { class Installer {
constructor() { constructor() {
@ -695,6 +697,9 @@ class Installer {
config.skipIde = toolSelection.skipIde; config.skipIde = toolSelection.skipIde;
const ideConfigurations = toolSelection.configurations; const ideConfigurations = toolSelection.configurations;
// Add spacing after prompts before installation progress
console.log('');
if (spinner.isSpinning) { if (spinner.isSpinning) {
spinner.text = 'Continuing installation...'; spinner.text = 'Continuing installation...';
} else { } else {

View File

@ -2,7 +2,6 @@ const path = require('node:path');
const fs = require('fs-extra'); const fs = require('fs-extra');
const yaml = require('yaml'); const yaml = require('yaml');
const crypto = require('node:crypto'); const crypto = require('node:crypto');
const csv = require('csv-parse/sync');
const { getSourcePath, getModulePath } = require('../../../lib/project-root'); const { getSourcePath, getModulePath } = require('../../../lib/project-root');
// Load package.json for version info // Load package.json for version info
@ -22,19 +21,6 @@ class ManifestGenerator {
this.selectedIdes = []; this.selectedIdes = [];
} }
/**
* Clean text for CSV output by normalizing whitespace and escaping quotes
* @param {string} text - Text to clean
* @returns {string} Cleaned text safe for CSV
*/
cleanForCSV(text) {
if (!text) return '';
return text
.trim()
.replaceAll(/\s+/g, ' ') // Normalize all whitespace (including newlines) to single space
.replaceAll('"', '""'); // Escape quotes for CSV
}
/** /**
* Generate all manifests for the installation * Generate all manifests for the installation
* @param {string} bmadDir - _bmad * @param {string} bmadDir - _bmad
@ -159,11 +145,7 @@ class ManifestGenerator {
// Recurse into subdirectories // Recurse into subdirectories
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name; const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
await findWorkflows(fullPath, newRelativePath); await findWorkflows(fullPath, newRelativePath);
} else if ( } else if (entry.name === 'workflow.yaml' || entry.name === 'workflow.md') {
entry.name === 'workflow.yaml' ||
entry.name === 'workflow.md' ||
(entry.name.startsWith('workflow-') && entry.name.endsWith('.md'))
) {
// Parse workflow file (both YAML and MD formats) // Parse workflow file (both YAML and MD formats)
if (debug) { if (debug) {
console.log(`[DEBUG] Found workflow file: ${fullPath}`); console.log(`[DEBUG] Found workflow file: ${fullPath}`);
@ -179,7 +161,7 @@ class ManifestGenerator {
workflow = yaml.parse(content); workflow = yaml.parse(content);
} else { } else {
// Parse MD workflow with YAML frontmatter // Parse MD workflow with YAML frontmatter
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/); const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
if (!frontmatterMatch) { if (!frontmatterMatch) {
if (debug) { if (debug) {
console.log(`[DEBUG] Skipped (no frontmatter): ${fullPath}`); console.log(`[DEBUG] Skipped (no frontmatter): ${fullPath}`);
@ -219,7 +201,7 @@ class ManifestGenerator {
// Workflows with standalone: false are filtered out above // Workflows with standalone: false are filtered out above
workflows.push({ workflows.push({
name: workflow.name, name: workflow.name,
description: this.cleanForCSV(workflow.description), description: workflow.description.replaceAll('"', '""'), // Escape quotes for CSV
module: moduleName, module: moduleName,
path: installPath, path: installPath,
}); });
@ -337,15 +319,24 @@ class ManifestGenerator {
const agentName = entry.name.replace('.md', ''); const agentName = entry.name.replace('.md', '');
// Helper function to clean and escape CSV content
const cleanForCSV = (text) => {
if (!text) return '';
return text
.trim()
.replaceAll(/\s+/g, ' ') // Normalize whitespace
.replaceAll('"', '""'); // Escape quotes for CSV
};
agents.push({ agents.push({
name: agentName, name: agentName,
displayName: nameMatch ? nameMatch[1] : agentName, displayName: nameMatch ? nameMatch[1] : agentName,
title: titleMatch ? titleMatch[1] : '', title: titleMatch ? titleMatch[1] : '',
icon: iconMatch ? iconMatch[1] : '', icon: iconMatch ? iconMatch[1] : '',
role: roleMatch ? this.cleanForCSV(roleMatch[1]) : '', role: roleMatch ? cleanForCSV(roleMatch[1]) : '',
identity: identityMatch ? this.cleanForCSV(identityMatch[1]) : '', identity: identityMatch ? cleanForCSV(identityMatch[1]) : '',
communicationStyle: styleMatch ? this.cleanForCSV(styleMatch[1]) : '', communicationStyle: styleMatch ? cleanForCSV(styleMatch[1]) : '',
principles: principlesMatch ? this.cleanForCSV(principlesMatch[1]) : '', principles: principlesMatch ? cleanForCSV(principlesMatch[1]) : '',
module: moduleName, module: moduleName,
path: installPath, path: installPath,
}); });
@ -394,11 +385,6 @@ class ManifestGenerator {
const filePath = path.join(dirPath, file); const filePath = path.join(dirPath, file);
const content = await fs.readFile(filePath, 'utf8'); const content = await fs.readFile(filePath, 'utf8');
// Skip internal/engine files (not user-facing tasks)
if (content.includes('internal="true"')) {
continue;
}
let name = file.replace(/\.(xml|md)$/, ''); let name = file.replace(/\.(xml|md)$/, '');
let displayName = name; let displayName = name;
let description = ''; let description = '';
@ -406,21 +392,17 @@ class ManifestGenerator {
if (file.endsWith('.md')) { if (file.endsWith('.md')) {
// Parse YAML frontmatter for .md tasks // Parse YAML frontmatter for .md tasks
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/); const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
if (frontmatterMatch) { if (frontmatterMatch) {
try { try {
const frontmatter = yaml.parse(frontmatterMatch[1]); const frontmatter = yaml.parse(frontmatterMatch[1]);
name = frontmatter.name || name; name = frontmatter.name || name;
displayName = frontmatter.displayName || frontmatter.name || name; displayName = frontmatter.displayName || frontmatter.name || name;
description = this.cleanForCSV(frontmatter.description || ''); description = frontmatter.description || '';
// Tasks are standalone by default unless explicitly false (internal=true is already filtered above) standalone = frontmatter.standalone === true || frontmatter.standalone === 'true';
standalone = frontmatter.standalone !== false && frontmatter.standalone !== 'false';
} catch { } catch {
// If YAML parsing fails, use defaults // If YAML parsing fails, use defaults
standalone = true; // Default to standalone
} }
} else {
standalone = true; // No frontmatter means standalone
} }
} else { } else {
// For .xml tasks, extract from tag attributes // For .xml tasks, extract from tag attributes
@ -429,10 +411,10 @@ class ManifestGenerator {
const descMatch = content.match(/description="([^"]+)"/); const descMatch = content.match(/description="([^"]+)"/);
const objMatch = content.match(/<objective>([^<]+)<\/objective>/); const objMatch = content.match(/<objective>([^<]+)<\/objective>/);
description = this.cleanForCSV(descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : ''); description = descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : '';
const standaloneFalseMatch = content.match(/<task[^>]+standalone="false"/); const standaloneMatch = content.match(/<task[^>]+standalone="true"/);
standalone = !standaloneFalseMatch; standalone = !!standaloneMatch;
} }
// Build relative path for installation // Build relative path for installation
@ -442,7 +424,7 @@ class ManifestGenerator {
tasks.push({ tasks.push({
name: name, name: name,
displayName: displayName, displayName: displayName,
description: description, description: description.replaceAll('"', '""'),
module: moduleName, module: moduleName,
path: installPath, path: installPath,
standalone: standalone, standalone: standalone,
@ -492,11 +474,6 @@ class ManifestGenerator {
const filePath = path.join(dirPath, file); const filePath = path.join(dirPath, file);
const content = await fs.readFile(filePath, 'utf8'); const content = await fs.readFile(filePath, 'utf8');
// Skip internal tools (same as tasks)
if (content.includes('internal="true"')) {
continue;
}
let name = file.replace(/\.(xml|md)$/, ''); let name = file.replace(/\.(xml|md)$/, '');
let displayName = name; let displayName = name;
let description = ''; let description = '';
@ -504,21 +481,17 @@ class ManifestGenerator {
if (file.endsWith('.md')) { if (file.endsWith('.md')) {
// Parse YAML frontmatter for .md tools // Parse YAML frontmatter for .md tools
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/); const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
if (frontmatterMatch) { if (frontmatterMatch) {
try { try {
const frontmatter = yaml.parse(frontmatterMatch[1]); const frontmatter = yaml.parse(frontmatterMatch[1]);
name = frontmatter.name || name; name = frontmatter.name || name;
displayName = frontmatter.displayName || frontmatter.name || name; displayName = frontmatter.displayName || frontmatter.name || name;
description = this.cleanForCSV(frontmatter.description || ''); description = frontmatter.description || '';
// Tools are standalone by default unless explicitly false (internal=true is already filtered above) standalone = frontmatter.standalone === true || frontmatter.standalone === 'true';
standalone = frontmatter.standalone !== false && frontmatter.standalone !== 'false';
} catch { } catch {
// If YAML parsing fails, use defaults // If YAML parsing fails, use defaults
standalone = true; // Default to standalone
} }
} else {
standalone = true; // No frontmatter means standalone
} }
} else { } else {
// For .xml tools, extract from tag attributes // For .xml tools, extract from tag attributes
@ -527,10 +500,10 @@ class ManifestGenerator {
const descMatch = content.match(/description="([^"]+)"/); const descMatch = content.match(/description="([^"]+)"/);
const objMatch = content.match(/<objective>([^<]+)<\/objective>/); const objMatch = content.match(/<objective>([^<]+)<\/objective>/);
description = this.cleanForCSV(descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : ''); description = descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : '';
const standaloneFalseMatch = content.match(/<tool[^>]+standalone="false"/); const standaloneMatch = content.match(/<tool[^>]+standalone="true"/);
standalone = !standaloneFalseMatch; standalone = !!standaloneMatch;
} }
// Build relative path for installation // Build relative path for installation
@ -540,7 +513,7 @@ class ManifestGenerator {
tools.push({ tools.push({
name: name, name: name,
displayName: displayName, displayName: displayName,
description: description, description: description.replaceAll('"', '""'),
module: moduleName, module: moduleName,
path: installPath, path: installPath,
standalone: standalone, standalone: standalone,
@ -733,15 +706,47 @@ class ManifestGenerator {
async writeWorkflowManifest(cfgDir) { async writeWorkflowManifest(cfgDir) {
const csvPath = path.join(cfgDir, 'workflow-manifest.csv'); const csvPath = path.join(cfgDir, 'workflow-manifest.csv');
const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`; const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
const parseCsvLine = (line) => {
const columns = line.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g) || [];
return columns.map((c) => c.replaceAll(/^"|"$/g, ''));
};
// Read existing manifest to preserve entries
const existingEntries = new Map();
if (await fs.pathExists(csvPath)) {
const content = await fs.readFile(csvPath, 'utf8');
const lines = content.split('\n').filter((line) => line.trim());
// Skip header
for (let i = 1; i < lines.length; i++) {
const line = lines[i];
if (line) {
const parts = parseCsvLine(line);
if (parts.length >= 4) {
const [name, description, module, workflowPath] = parts;
existingEntries.set(`${module}:${name}`, {
name,
description,
module,
path: workflowPath,
});
}
}
}
}
// Create CSV header - standalone column removed, everything is canonicalized to 4 columns // Create CSV header - standalone column removed, everything is canonicalized to 4 columns
let csv = 'name,description,module,path\n'; let csv = 'name,description,module,path\n';
// Build workflows map from discovered workflows only // Combine existing and new workflows
// Old entries are NOT preserved - the manifest reflects what actually exists on disk
const allWorkflows = new Map(); const allWorkflows = new Map();
// Only add workflows that were actually discovered in this scan // Add existing entries
for (const [key, value] of existingEntries) {
allWorkflows.set(key, value);
}
// Add/update new workflows
for (const workflow of this.workflows) { for (const workflow of this.workflows) {
const key = `${workflow.module}:${workflow.name}`; const key = `${workflow.module}:${workflow.name}`;
allWorkflows.set(key, { allWorkflows.set(key, {
@ -768,23 +773,30 @@ class ManifestGenerator {
*/ */
async writeAgentManifest(cfgDir) { async writeAgentManifest(cfgDir) {
const csvPath = path.join(cfgDir, 'agent-manifest.csv'); const csvPath = path.join(cfgDir, 'agent-manifest.csv');
const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
// Read existing manifest to preserve entries // Read existing manifest to preserve entries
const existingEntries = new Map(); const existingEntries = new Map();
if (await fs.pathExists(csvPath)) { if (await fs.pathExists(csvPath)) {
const content = await fs.readFile(csvPath, 'utf8'); const content = await fs.readFile(csvPath, 'utf8');
const records = csv.parse(content, { const lines = content.split('\n').filter((line) => line.trim());
columns: true,
skip_empty_lines: true, // Skip header
}); for (let i = 1; i < lines.length; i++) {
for (const record of records) { const line = lines[i];
existingEntries.set(`${record.module}:${record.name}`, record); if (line) {
// Parse CSV (simple parsing assuming no commas in quoted fields)
const parts = line.split('","');
if (parts.length >= 11) {
const name = parts[0].replace(/^"/, '');
const module = parts[8];
existingEntries.set(`${module}:${name}`, line);
}
}
} }
} }
// Create CSV header with persona fields // Create CSV header with persona fields
let csvContent = 'name,displayName,title,icon,role,identity,communicationStyle,principles,module,path\n'; let csv = 'name,displayName,title,icon,role,identity,communicationStyle,principles,module,path\n';
// Combine existing and new agents, preferring new data for duplicates // Combine existing and new agents, preferring new data for duplicates
const allAgents = new Map(); const allAgents = new Map();
@ -797,38 +809,18 @@ class ManifestGenerator {
// Add/update new agents // Add/update new agents
for (const agent of this.agents) { for (const agent of this.agents) {
const key = `${agent.module}:${agent.name}`; const key = `${agent.module}:${agent.name}`;
allAgents.set(key, { allAgents.set(
name: agent.name, key,
displayName: agent.displayName, `"${agent.name}","${agent.displayName}","${agent.title}","${agent.icon}","${agent.role}","${agent.identity}","${agent.communicationStyle}","${agent.principles}","${agent.module}","${agent.path}"`,
title: agent.title, );
icon: agent.icon,
role: agent.role,
identity: agent.identity,
communicationStyle: agent.communicationStyle,
principles: agent.principles,
module: agent.module,
path: agent.path,
});
} }
// Write all agents // Write all agents
for (const [, record] of allAgents) { for (const [, value] of allAgents) {
const row = [ csv += value + '\n';
escapeCsv(record.name),
escapeCsv(record.displayName),
escapeCsv(record.title),
escapeCsv(record.icon),
escapeCsv(record.role),
escapeCsv(record.identity),
escapeCsv(record.communicationStyle),
escapeCsv(record.principles),
escapeCsv(record.module),
escapeCsv(record.path),
].join(',');
csvContent += row + '\n';
} }
await fs.writeFile(csvPath, csvContent); await fs.writeFile(csvPath, csv);
return csvPath; return csvPath;
} }
@ -838,23 +830,30 @@ class ManifestGenerator {
*/ */
async writeTaskManifest(cfgDir) { async writeTaskManifest(cfgDir) {
const csvPath = path.join(cfgDir, 'task-manifest.csv'); const csvPath = path.join(cfgDir, 'task-manifest.csv');
const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
// Read existing manifest to preserve entries // Read existing manifest to preserve entries
const existingEntries = new Map(); const existingEntries = new Map();
if (await fs.pathExists(csvPath)) { if (await fs.pathExists(csvPath)) {
const content = await fs.readFile(csvPath, 'utf8'); const content = await fs.readFile(csvPath, 'utf8');
const records = csv.parse(content, { const lines = content.split('\n').filter((line) => line.trim());
columns: true,
skip_empty_lines: true, // Skip header
}); for (let i = 1; i < lines.length; i++) {
for (const record of records) { const line = lines[i];
existingEntries.set(`${record.module}:${record.name}`, record); if (line) {
// Parse CSV (simple parsing assuming no commas in quoted fields)
const parts = line.split('","');
if (parts.length >= 6) {
const name = parts[0].replace(/^"/, '');
const module = parts[3];
existingEntries.set(`${module}:${name}`, line);
}
}
} }
} }
// Create CSV header with standalone column // Create CSV header with standalone column
let csvContent = 'name,displayName,description,module,path,standalone\n'; let csv = 'name,displayName,description,module,path,standalone\n';
// Combine existing and new tasks // Combine existing and new tasks
const allTasks = new Map(); const allTasks = new Map();
@ -867,30 +866,15 @@ class ManifestGenerator {
// Add/update new tasks // Add/update new tasks
for (const task of this.tasks) { for (const task of this.tasks) {
const key = `${task.module}:${task.name}`; const key = `${task.module}:${task.name}`;
allTasks.set(key, { allTasks.set(key, `"${task.name}","${task.displayName}","${task.description}","${task.module}","${task.path}","${task.standalone}"`);
name: task.name,
displayName: task.displayName,
description: task.description,
module: task.module,
path: task.path,
standalone: task.standalone,
});
} }
// Write all tasks // Write all tasks
for (const [, record] of allTasks) { for (const [, value] of allTasks) {
const row = [ csv += value + '\n';
escapeCsv(record.name),
escapeCsv(record.displayName),
escapeCsv(record.description),
escapeCsv(record.module),
escapeCsv(record.path),
escapeCsv(record.standalone),
].join(',');
csvContent += row + '\n';
} }
await fs.writeFile(csvPath, csvContent); await fs.writeFile(csvPath, csv);
return csvPath; return csvPath;
} }
@ -900,23 +884,30 @@ class ManifestGenerator {
*/ */
async writeToolManifest(cfgDir) { async writeToolManifest(cfgDir) {
const csvPath = path.join(cfgDir, 'tool-manifest.csv'); const csvPath = path.join(cfgDir, 'tool-manifest.csv');
const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
// Read existing manifest to preserve entries // Read existing manifest to preserve entries
const existingEntries = new Map(); const existingEntries = new Map();
if (await fs.pathExists(csvPath)) { if (await fs.pathExists(csvPath)) {
const content = await fs.readFile(csvPath, 'utf8'); const content = await fs.readFile(csvPath, 'utf8');
const records = csv.parse(content, { const lines = content.split('\n').filter((line) => line.trim());
columns: true,
skip_empty_lines: true, // Skip header
}); for (let i = 1; i < lines.length; i++) {
for (const record of records) { const line = lines[i];
existingEntries.set(`${record.module}:${record.name}`, record); if (line) {
// Parse CSV (simple parsing assuming no commas in quoted fields)
const parts = line.split('","');
if (parts.length >= 6) {
const name = parts[0].replace(/^"/, '');
const module = parts[3];
existingEntries.set(`${module}:${name}`, line);
}
}
} }
} }
// Create CSV header with standalone column // Create CSV header with standalone column
let csvContent = 'name,displayName,description,module,path,standalone\n'; let csv = 'name,displayName,description,module,path,standalone\n';
// Combine existing and new tools // Combine existing and new tools
const allTools = new Map(); const allTools = new Map();
@ -929,30 +920,15 @@ class ManifestGenerator {
// Add/update new tools // Add/update new tools
for (const tool of this.tools) { for (const tool of this.tools) {
const key = `${tool.module}:${tool.name}`; const key = `${tool.module}:${tool.name}`;
allTools.set(key, { allTools.set(key, `"${tool.name}","${tool.displayName}","${tool.description}","${tool.module}","${tool.path}","${tool.standalone}"`);
name: tool.name,
displayName: tool.displayName,
description: tool.description,
module: tool.module,
path: tool.path,
standalone: tool.standalone,
});
} }
// Write all tools // Write all tools
for (const [, record] of allTools) { for (const [, value] of allTools) {
const row = [ csv += value + '\n';
escapeCsv(record.name),
escapeCsv(record.displayName),
escapeCsv(record.description),
escapeCsv(record.module),
escapeCsv(record.path),
escapeCsv(record.standalone),
].join(',');
csvContent += row + '\n';
} }
await fs.writeFile(csvPath, csvContent); await fs.writeFile(csvPath, csv);
return csvPath; return csvPath;
} }

View File

@ -297,7 +297,7 @@ class CustomHandler {
const agentFiles = await this.findFilesRecursively(sourceAgentsPath, ['.agent.yaml']); const agentFiles = await this.findFilesRecursively(sourceAgentsPath, ['.agent.yaml']);
for (const agentFile of agentFiles) { for (const agentFile of agentFiles) {
const relativePath = path.relative(sourceAgentsPath, agentFile).split(path.sep).join('/'); const relativePath = path.relative(sourceAgentsPath, agentFile);
const targetDir = path.join(targetAgentsPath, path.dirname(relativePath)); const targetDir = path.join(targetAgentsPath, path.dirname(relativePath));
await fs.ensureDir(targetDir); await fs.ensureDir(targetDir);

View File

@ -3,7 +3,6 @@ const fs = require('fs-extra');
const chalk = require('chalk'); const chalk = require('chalk');
const { XmlHandler } = require('../../../lib/xml-handler'); const { XmlHandler } = require('../../../lib/xml-handler');
const { getSourcePath } = require('../../../lib/project-root'); const { getSourcePath } = require('../../../lib/project-root');
const { BMAD_FOLDER_NAME } = require('./shared/path-utils');
/** /**
* Base class for IDE-specific setup * Base class for IDE-specific setup
@ -19,7 +18,7 @@ class BaseIdeSetup {
this.configFile = null; // Override in subclasses when detection is file-based this.configFile = null; // Override in subclasses when detection is file-based
this.detectionPaths = []; // Additional paths that indicate the IDE is configured this.detectionPaths = []; // Additional paths that indicate the IDE is configured
this.xmlHandler = new XmlHandler(); this.xmlHandler = new XmlHandler();
this.bmadFolderName = BMAD_FOLDER_NAME; // Default, can be overridden this.bmadFolderName = 'bmad'; // Default, can be overridden
} }
/** /**
@ -58,7 +57,7 @@ class BaseIdeSetup {
if (this.configDir) { if (this.configDir) {
const configPath = path.join(projectDir, this.configDir); const configPath = path.join(projectDir, this.configDir);
if (await fs.pathExists(configPath)) { if (await fs.pathExists(configPath)) {
const bmadRulesPath = path.join(configPath, BMAD_FOLDER_NAME); const bmadRulesPath = path.join(configPath, 'bmad');
if (await fs.pathExists(bmadRulesPath)) { if (await fs.pathExists(bmadRulesPath)) {
await fs.remove(bmadRulesPath); await fs.remove(bmadRulesPath);
console.log(chalk.dim(`Removed ${this.name} BMAD configuration`)); console.log(chalk.dim(`Removed ${this.name} BMAD configuration`));
@ -352,15 +351,13 @@ class BaseIdeSetup {
const workflowData = yaml.parse(content); const workflowData = yaml.parse(content);
if (workflowData && workflowData.name) { if (workflowData && workflowData.name) {
// Workflows are standalone by default unless explicitly false
const standalone = workflowData.standalone !== false && workflowData.standalone !== 'false';
workflows.push({ workflows.push({
name: workflowData.name, name: workflowData.name,
path: fullPath, path: fullPath,
relativePath: path.relative(dir, fullPath), relativePath: path.relative(dir, fullPath),
filename: entry.name, filename: entry.name,
description: workflowData.description || '', description: workflowData.description || '',
standalone: standalone, standalone: workflowData.standalone === true, // Check standalone property
}); });
} }
} catch { } catch {
@ -444,38 +441,31 @@ class BaseIdeSetup {
const matchedExt = extensions.find((e) => entry.name.endsWith(e)); const matchedExt = extensions.find((e) => entry.name.endsWith(e));
if (matchedExt) { if (matchedExt) {
// Read file content to check for standalone attribute // Read file content to check for standalone attribute
// All non-internal files are considered standalone by default let standalone = false;
let standalone = true;
try { try {
const content = await fs.readFile(fullPath, 'utf8'); const content = await fs.readFile(fullPath, 'utf8');
// Skip internal/engine files (not user-facing) // Check for standalone="true" in XML files
if (content.includes('internal="true"')) {
continue;
}
// Check for explicit standalone: false
if (entry.name.endsWith('.xml')) { if (entry.name.endsWith('.xml')) {
// For XML files, check for standalone="false" attribute // Look for standalone="true" in the opening tag (task or tool)
const tagMatch = content.match(/<(task|tool)[^>]*standalone="false"/); const standaloneMatch = content.match(/<(?:task|tool)[^>]+standalone="true"/);
standalone = !tagMatch; standalone = !!standaloneMatch;
} else if (entry.name.endsWith('.md')) { } else if (entry.name.endsWith('.md')) {
// For MD files, parse YAML frontmatter // Check for standalone: true in YAML frontmatter
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---/); const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
if (frontmatterMatch) { if (frontmatterMatch) {
try {
const yaml = require('yaml'); const yaml = require('yaml');
try {
const frontmatter = yaml.parse(frontmatterMatch[1]); const frontmatter = yaml.parse(frontmatterMatch[1]);
standalone = frontmatter.standalone !== false && frontmatter.standalone !== 'false'; standalone = frontmatter.standalone === true;
} catch { } catch {
// If YAML parsing fails, default to standalone // Ignore YAML parse errors
} }
} }
// No frontmatter means standalone (default)
} }
} catch { } catch {
// If we can't read the file, default to standalone // If we can't read the file, assume not standalone
standalone = true; standalone = false;
} }
files.push({ files.push({

View File

@ -66,13 +66,6 @@ class ConfigDrivenIdeSetup extends BaseIdeSetup {
*/ */
async installToTarget(projectDir, bmadDir, config, options) { async installToTarget(projectDir, bmadDir, config, options) {
const { target_dir, template_type, artifact_types } = config; const { target_dir, template_type, artifact_types } = config;
// Skip targets with explicitly empty artifact_types array
// This prevents creating empty directories when no artifacts will be written
if (Array.isArray(artifact_types) && artifact_types.length === 0) {
return { success: true, results: { agents: 0, workflows: 0, tasks: 0, tools: 0 } };
}
const targetPath = path.join(projectDir, target_dir); const targetPath = path.join(projectDir, target_dir);
await this.ensureDir(targetPath); await this.ensureDir(targetPath);
@ -93,11 +86,10 @@ class ConfigDrivenIdeSetup extends BaseIdeSetup {
results.workflows = await this.writeWorkflowArtifacts(targetPath, artifacts, template_type, config); results.workflows = await this.writeWorkflowArtifacts(targetPath, artifacts, template_type, config);
} }
// Install tasks and tools using template system (supports TOML for Gemini, MD for others) // Install tasks and tools
if (!artifact_types || artifact_types.includes('tasks') || artifact_types.includes('tools')) { if (!artifact_types || artifact_types.includes('tasks') || artifact_types.includes('tools')) {
const taskToolGen = new TaskToolCommandGenerator(this.bmadFolderName); const taskToolGen = new TaskToolCommandGenerator();
const { artifacts } = await taskToolGen.collectTaskToolArtifacts(bmadDir); const taskToolResult = await taskToolGen.generateDashTaskToolCommands(projectDir, bmadDir, targetPath);
const taskToolResult = await this.writeTaskToolArtifacts(targetPath, artifacts, template_type, config);
results.tasks = taskToolResult.tasks || 0; results.tasks = taskToolResult.tasks || 0;
results.tools = taskToolResult.tools || 0; results.tools = taskToolResult.tools || 0;
} }
@ -188,53 +180,6 @@ class ConfigDrivenIdeSetup extends BaseIdeSetup {
return count; return count;
} }
/**
* Write task/tool artifacts to target directory using templates
* @param {string} targetPath - Target directory path
* @param {Array} artifacts - Task/tool artifacts
* @param {string} templateType - Template type to use
* @param {Object} config - Installation configuration
* @returns {Promise<Object>} Counts of tasks and tools written
*/
async writeTaskToolArtifacts(targetPath, artifacts, templateType, config = {}) {
let taskCount = 0;
let toolCount = 0;
// Pre-load templates to avoid repeated file I/O in the loop
const taskTemplate = await this.loadTemplate(templateType, 'task', config, 'default-task');
const toolTemplate = await this.loadTemplate(templateType, 'tool', config, 'default-tool');
const { artifact_types } = config;
for (const artifact of artifacts) {
if (artifact.type !== 'task' && artifact.type !== 'tool') {
continue;
}
// Skip if the specific artifact type is not requested in config
if (artifact_types) {
if (artifact.type === 'task' && !artifact_types.includes('tasks')) continue;
if (artifact.type === 'tool' && !artifact_types.includes('tools')) continue;
}
// Use pre-loaded template based on artifact type
const { content: template, extension } = artifact.type === 'task' ? taskTemplate : toolTemplate;
const content = this.renderTemplate(template, artifact);
const filename = this.generateFilename(artifact, artifact.type, extension);
const filePath = path.join(targetPath, filename);
await this.writeFile(filePath, content);
if (artifact.type === 'task') {
taskCount++;
} else {
toolCount++;
}
}
return { tasks: taskCount, tools: toolCount };
}
/** /**
* Load template based on type and configuration * Load template based on type and configuration
* @param {string} templateType - Template type (claude, windsurf, etc.) * @param {string} templateType - Template type (claude, windsurf, etc.)
@ -371,24 +316,10 @@ LOAD and execute from: {project-root}/{{bmadFolderName}}/{{path}}
renderTemplate(template, artifact) { renderTemplate(template, artifact) {
// Use the appropriate path property based on artifact type // Use the appropriate path property based on artifact type
let pathToUse = artifact.relativePath || ''; let pathToUse = artifact.relativePath || '';
switch (artifact.type) { if (artifact.type === 'agent-launcher') {
case 'agent-launcher': {
pathToUse = artifact.agentPath || artifact.relativePath || ''; pathToUse = artifact.agentPath || artifact.relativePath || '';
} else if (artifact.type === 'workflow-command') {
break;
}
case 'workflow-command': {
pathToUse = artifact.workflowPath || artifact.relativePath || ''; pathToUse = artifact.workflowPath || artifact.relativePath || '';
break;
}
case 'task':
case 'tool': {
pathToUse = artifact.path || artifact.relativePath || '';
break;
}
// No default
} }
let rendered = template let rendered = template
@ -420,9 +351,8 @@ LOAD and execute from: {project-root}/{{bmadFolderName}}/{{path}}
// Reuse central logic to ensure consistent naming conventions // Reuse central logic to ensure consistent naming conventions
const standardName = toDashPath(artifact.relativePath); const standardName = toDashPath(artifact.relativePath);
// Clean up potential double extensions from source files (e.g. .yaml.md, .xml.md -> .md) // Clean up potential double extensions from source files (e.g. .yaml.md -> .md)
// This handles any extensions that might slip through toDashPath() const baseName = standardName.replace(/\.(yaml|yml)\.md$/, '.md');
const baseName = standardName.replace(/\.(md|yaml|yml|json|xml|toml)\.md$/i, '.md');
// If using default markdown, preserve the bmad-agent- prefix for agents // If using default markdown, preserve the bmad-agent- prefix for agents
if (extension === '.md') { if (extension === '.md') {

View File

@ -104,10 +104,7 @@ class CodexSetup extends BaseIdeSetup {
); );
taskArtifacts.push({ taskArtifacts.push({
type: 'task', type: 'task',
name: task.name,
displayName: task.name,
module: task.module, module: task.module,
path: task.path,
sourcePath: task.path, sourcePath: task.path,
relativePath: path.join(task.module, 'tasks', `${task.name}.md`), relativePath: path.join(task.module, 'tasks', `${task.name}.md`),
content, content,
@ -119,7 +116,7 @@ class CodexSetup extends BaseIdeSetup {
const workflowCount = await workflowGenerator.writeDashArtifacts(destDir, workflowArtifacts); const workflowCount = await workflowGenerator.writeDashArtifacts(destDir, workflowArtifacts);
// Also write tasks using underscore format // Also write tasks using underscore format
const ttGen = new TaskToolCommandGenerator(this.bmadFolderName); const ttGen = new TaskToolCommandGenerator();
const tasksWritten = await ttGen.writeDashArtifacts(destDir, taskArtifacts); const tasksWritten = await ttGen.writeDashArtifacts(destDir, taskArtifacts);
const written = agentCount + workflowCount + tasksWritten; const written = agentCount + workflowCount + tasksWritten;
@ -217,10 +214,7 @@ class CodexSetup extends BaseIdeSetup {
artifacts.push({ artifacts.push({
type: 'task', type: 'task',
name: task.name,
displayName: task.name,
module: task.module, module: task.module,
path: task.path,
sourcePath: task.path, sourcePath: task.path,
relativePath: path.join(task.module, 'tasks', `${task.name}.md`), relativePath: path.join(task.module, 'tasks', `${task.name}.md`),
content, content,

View File

@ -1,7 +1,6 @@
const fs = require('fs-extra'); const fs = require('fs-extra');
const path = require('node:path'); const path = require('node:path');
const chalk = require('chalk'); const chalk = require('chalk');
const { BMAD_FOLDER_NAME } = require('./shared/path-utils');
/** /**
* IDE Manager - handles IDE-specific setup * IDE Manager - handles IDE-specific setup
@ -15,7 +14,7 @@ class IdeManager {
constructor() { constructor() {
this.handlers = new Map(); this.handlers = new Map();
this._initialized = false; this._initialized = false;
this.bmadFolderName = BMAD_FOLDER_NAME; // Default, can be overridden this.bmadFolderName = 'bmad'; // Default, can be overridden
} }
/** /**
@ -74,9 +73,6 @@ class IdeManager {
if (HandlerClass) { if (HandlerClass) {
const instance = new HandlerClass(); const instance = new HandlerClass();
if (instance.name && typeof instance.name === 'string') { if (instance.name && typeof instance.name === 'string') {
if (typeof instance.setBmadFolderName === 'function') {
instance.setBmadFolderName(this.bmadFolderName);
}
this.handlers.set(instance.name, instance); this.handlers.set(instance.name, instance);
} }
} }
@ -104,9 +100,7 @@ class IdeManager {
if (!platformInfo.installer) continue; if (!platformInfo.installer) continue;
const handler = new ConfigDrivenIdeSetup(platformCode, platformInfo); const handler = new ConfigDrivenIdeSetup(platformCode, platformInfo);
if (typeof handler.setBmadFolderName === 'function') {
handler.setBmadFolderName(this.bmadFolderName); handler.setBmadFolderName(this.bmadFolderName);
}
this.handlers.set(platformCode, handler); this.handlers.set(platformCode, handler);
} }
} }

View File

@ -94,6 +94,9 @@ platforms:
- target_dir: .github/agents - target_dir: .github/agents
template_type: copilot_agents template_type: copilot_agents
artifact_types: [agents] artifact_types: [agents]
- target_dir: .vscode
template_type: vscode_settings
artifact_types: []
iflow: iflow:
name: "iFlow" name: "iFlow"

View File

@ -1,14 +1,14 @@
const path = require('node:path'); const path = require('node:path');
const fs = require('fs-extra'); const fs = require('fs-extra');
const chalk = require('chalk'); const chalk = require('chalk');
const { toColonPath, toDashPath, customAgentColonName, customAgentDashName, BMAD_FOLDER_NAME } = require('./path-utils'); const { toColonPath, toDashPath, customAgentColonName, customAgentDashName } = require('./path-utils');
/** /**
* Generates launcher command files for each agent * Generates launcher command files for each agent
* Similar to WorkflowCommandGenerator but for agents * Similar to WorkflowCommandGenerator but for agents
*/ */
class AgentCommandGenerator { class AgentCommandGenerator {
constructor(bmadFolderName = BMAD_FOLDER_NAME) { constructor(bmadFolderName = 'bmad') {
this.templatePath = path.join(__dirname, '../templates/agent-command-template.md'); this.templatePath = path.join(__dirname, '../templates/agent-command-template.md');
this.bmadFolderName = bmadFolderName; this.bmadFolderName = bmadFolderName;
} }

View File

@ -141,24 +141,13 @@ async function getTasksFromDir(dirPath, moduleName) {
const files = await fs.readdir(dirPath); const files = await fs.readdir(dirPath);
for (const file of files) { for (const file of files) {
// Include both .md and .xml task files if (!file.endsWith('.md')) {
if (!file.endsWith('.md') && !file.endsWith('.xml')) {
continue; continue;
} }
const filePath = path.join(dirPath, file);
const content = await fs.readFile(filePath, 'utf8');
// Skip internal/engine files (not user-facing tasks)
if (content.includes('internal="true"')) {
continue;
}
// Remove extension to get task name
const ext = file.endsWith('.xml') ? '.xml' : '.md';
tasks.push({ tasks.push({
path: filePath, path: path.join(dirPath, file),
name: file.replace(ext, ''), name: file.replace('.md', ''),
module: moduleName, module: moduleName,
}); });
} }

View File

@ -18,9 +18,6 @@
const TYPE_SEGMENTS = ['workflows', 'tasks', 'tools']; const TYPE_SEGMENTS = ['workflows', 'tasks', 'tools'];
const AGENT_SEGMENT = 'agents'; const AGENT_SEGMENT = 'agents';
// BMAD installation folder name - centralized constant for all installers
const BMAD_FOLDER_NAME = '_bmad';
/** /**
* Convert hierarchical path to flat dash-separated name (NEW STANDARD) * Convert hierarchical path to flat dash-separated name (NEW STANDARD)
* Converts: 'bmm', 'agents', 'pm' 'bmad-agent-bmm-pm.md' * Converts: 'bmm', 'agents', 'pm' 'bmad-agent-bmm-pm.md'
@ -62,9 +59,7 @@ function toDashPath(relativePath) {
return 'bmad-unknown.md'; return 'bmad-unknown.md';
} }
// Strip common file extensions to avoid double extensions in generated filenames const withoutExt = relativePath.replace('.md', '');
// e.g., 'create-story.xml' → 'create-story', 'workflow.yaml' → 'workflow'
const withoutExt = relativePath.replace(/\.(md|yaml|yml|json|xml|toml)$/i, '');
const parts = withoutExt.split(/[/\\]/); const parts = withoutExt.split(/[/\\]/);
const module = parts[0]; const module = parts[0];
@ -188,8 +183,7 @@ function toUnderscoreName(module, type, name) {
* @deprecated Use toDashPath instead * @deprecated Use toDashPath instead
*/ */
function toUnderscorePath(relativePath) { function toUnderscorePath(relativePath) {
// Strip common file extensions (same as toDashPath for consistency) const withoutExt = relativePath.replace('.md', '');
const withoutExt = relativePath.replace(/\.(md|yaml|yml|json|xml|toml)$/i, '');
const parts = withoutExt.split(/[/\\]/); const parts = withoutExt.split(/[/\\]/);
const module = parts[0]; const module = parts[0];
@ -295,5 +289,4 @@ module.exports = {
TYPE_SEGMENTS, TYPE_SEGMENTS,
AGENT_SEGMENT, AGENT_SEGMENT,
BMAD_FOLDER_NAME,
}; };

View File

@ -2,95 +2,12 @@ const path = require('node:path');
const fs = require('fs-extra'); const fs = require('fs-extra');
const csv = require('csv-parse/sync'); const csv = require('csv-parse/sync');
const chalk = require('chalk'); const chalk = require('chalk');
const { toColonName, toColonPath, toDashPath, BMAD_FOLDER_NAME } = require('./path-utils'); const { toColonName, toColonPath, toDashPath } = require('./path-utils');
/** /**
* Generates command files for standalone tasks and tools * Generates command files for standalone tasks and tools
*/ */
class TaskToolCommandGenerator { class TaskToolCommandGenerator {
/**
* @param {string} bmadFolderName - Name of the BMAD folder for template rendering (default: '_bmad')
* Note: This parameter is accepted for API consistency with AgentCommandGenerator and
* WorkflowCommandGenerator, but is not used for path stripping. The manifest always stores
* filesystem paths with '_bmad/' prefix (the actual folder name), while bmadFolderName is
* used for template placeholder rendering ({{bmadFolderName}}).
*/
constructor(bmadFolderName = BMAD_FOLDER_NAME) {
this.bmadFolderName = bmadFolderName;
}
/**
* Collect task and tool artifacts for IDE installation
* @param {string} bmadDir - BMAD installation directory
* @returns {Promise<Object>} Artifacts array with metadata
*/
async collectTaskToolArtifacts(bmadDir) {
const tasks = await this.loadTaskManifest(bmadDir);
const tools = await this.loadToolManifest(bmadDir);
// All tasks/tools in manifest are standalone (internal=true items are filtered during manifest generation)
const artifacts = [];
const bmadPrefix = `${BMAD_FOLDER_NAME}/`;
// Collect task artifacts
for (const task of tasks || []) {
let taskPath = (task.path || '').replaceAll('\\', '/');
// Convert absolute paths to relative paths
if (path.isAbsolute(taskPath)) {
taskPath = path.relative(bmadDir, taskPath).replaceAll('\\', '/');
}
// Remove _bmad/ prefix if present to get relative path within bmad folder
if (taskPath.startsWith(bmadPrefix)) {
taskPath = taskPath.slice(bmadPrefix.length);
}
const taskExt = path.extname(taskPath) || '.md';
artifacts.push({
type: 'task',
name: task.name,
displayName: task.displayName || task.name,
description: task.description || `Execute ${task.displayName || task.name}`,
module: task.module,
// Use forward slashes for cross-platform consistency (not path.join which uses backslashes on Windows)
relativePath: `${task.module}/tasks/${task.name}${taskExt}`,
path: taskPath,
});
}
// Collect tool artifacts
for (const tool of tools || []) {
let toolPath = (tool.path || '').replaceAll('\\', '/');
// Convert absolute paths to relative paths
if (path.isAbsolute(toolPath)) {
toolPath = path.relative(bmadDir, toolPath).replaceAll('\\', '/');
}
// Remove _bmad/ prefix if present to get relative path within bmad folder
if (toolPath.startsWith(bmadPrefix)) {
toolPath = toolPath.slice(bmadPrefix.length);
}
const toolExt = path.extname(toolPath) || '.md';
artifacts.push({
type: 'tool',
name: tool.name,
displayName: tool.displayName || tool.name,
description: tool.description || `Execute ${tool.displayName || tool.name}`,
module: tool.module,
// Use forward slashes for cross-platform consistency (not path.join which uses backslashes on Windows)
relativePath: `${tool.module}/tools/${tool.name}${toolExt}`,
path: toolPath,
});
}
return {
artifacts,
counts: {
tasks: (tasks || []).length,
tools: (tools || []).length,
},
};
}
/** /**
* Generate task and tool commands from manifest CSVs * Generate task and tool commands from manifest CSVs
* @param {string} projectDir - Project directory * @param {string} projectDir - Project directory
@ -101,13 +18,17 @@ class TaskToolCommandGenerator {
const tasks = await this.loadTaskManifest(bmadDir); const tasks = await this.loadTaskManifest(bmadDir);
const tools = await this.loadToolManifest(bmadDir); const tools = await this.loadToolManifest(bmadDir);
// Filter to only standalone items
const standaloneTasks = tasks ? tasks.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
const standaloneTools = tools ? tools.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
// Base commands directory - use provided or default to Claude Code structure // Base commands directory - use provided or default to Claude Code structure
const commandsDir = baseCommandsDir || path.join(projectDir, '.claude', 'commands', 'bmad'); const commandsDir = baseCommandsDir || path.join(projectDir, '.claude', 'commands', 'bmad');
let generatedCount = 0; let generatedCount = 0;
// Generate command files for tasks // Generate command files for tasks
for (const task of tasks || []) { for (const task of standaloneTasks) {
const moduleTasksDir = path.join(commandsDir, task.module, 'tasks'); const moduleTasksDir = path.join(commandsDir, task.module, 'tasks');
await fs.ensureDir(moduleTasksDir); await fs.ensureDir(moduleTasksDir);
@ -119,7 +40,7 @@ class TaskToolCommandGenerator {
} }
// Generate command files for tools // Generate command files for tools
for (const tool of tools || []) { for (const tool of standaloneTools) {
const moduleToolsDir = path.join(commandsDir, tool.module, 'tools'); const moduleToolsDir = path.join(commandsDir, tool.module, 'tools');
await fs.ensureDir(moduleToolsDir); await fs.ensureDir(moduleToolsDir);
@ -132,8 +53,8 @@ class TaskToolCommandGenerator {
return { return {
generated: generatedCount, generated: generatedCount,
tasks: (tasks || []).length, tasks: standaloneTasks.length,
tools: (tools || []).length, tools: standaloneTools.length,
}; };
} }
@ -144,35 +65,9 @@ class TaskToolCommandGenerator {
const description = item.description || `Execute ${item.displayName || item.name}`; const description = item.description || `Execute ${item.displayName || item.name}`;
// Convert path to use {project-root} placeholder // Convert path to use {project-root} placeholder
// Handle undefined/missing path by constructing from module and name
let itemPath = item.path; let itemPath = item.path;
if (!itemPath || typeof itemPath !== 'string') { if (itemPath && typeof itemPath === 'string' && itemPath.startsWith('bmad/')) {
// Fallback: construct path from module and name if path is missing itemPath = `{project-root}/${itemPath}`;
const typePlural = type === 'task' ? 'tasks' : 'tools';
itemPath = `{project-root}/${this.bmadFolderName}/${item.module}/${typePlural}/${item.name}.md`;
} else {
// Normalize path separators to forward slashes
itemPath = itemPath.replaceAll('\\', '/');
// Extract relative path from absolute paths (Windows or Unix)
// Look for _bmad/ or bmad/ in the path and extract everything after it
// Match patterns like: /_bmad/core/tasks/... or /bmad/core/tasks/...
// Use [/\\] to handle both Unix forward slashes and Windows backslashes,
// and also paths without a leading separator (e.g., C:/_bmad/...)
const bmadMatch = itemPath.match(/[/\\]_bmad[/\\](.+)$/) || itemPath.match(/[/\\]bmad[/\\](.+)$/);
if (bmadMatch) {
// Found /_bmad/ or /bmad/ - use relative path after it
itemPath = `{project-root}/${this.bmadFolderName}/${bmadMatch[1]}`;
} else if (itemPath.startsWith(`${BMAD_FOLDER_NAME}/`)) {
// Relative path starting with _bmad/
itemPath = `{project-root}/${this.bmadFolderName}/${itemPath.slice(BMAD_FOLDER_NAME.length + 1)}`;
} else if (itemPath.startsWith('bmad/')) {
// Relative path starting with bmad/
itemPath = `{project-root}/${this.bmadFolderName}/${itemPath.slice(5)}`;
} else if (!itemPath.startsWith('{project-root}')) {
// For other relative paths, prefix with project root and bmad folder
itemPath = `{project-root}/${this.bmadFolderName}/${itemPath}`;
}
} }
return `--- return `---
@ -235,10 +130,14 @@ Follow all instructions in the ${type} file exactly as written.
const tasks = await this.loadTaskManifest(bmadDir); const tasks = await this.loadTaskManifest(bmadDir);
const tools = await this.loadToolManifest(bmadDir); const tools = await this.loadToolManifest(bmadDir);
// Filter to only standalone items
const standaloneTasks = tasks ? tasks.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
const standaloneTools = tools ? tools.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
let generatedCount = 0; let generatedCount = 0;
// Generate command files for tasks // Generate command files for tasks
for (const task of tasks || []) { for (const task of standaloneTasks) {
const commandContent = this.generateCommandContent(task, 'task'); const commandContent = this.generateCommandContent(task, 'task');
// Use underscore format: bmad_bmm_name.md // Use underscore format: bmad_bmm_name.md
const flatName = toColonName(task.module, 'tasks', task.name); const flatName = toColonName(task.module, 'tasks', task.name);
@ -249,7 +148,7 @@ Follow all instructions in the ${type} file exactly as written.
} }
// Generate command files for tools // Generate command files for tools
for (const tool of tools || []) { for (const tool of standaloneTools) {
const commandContent = this.generateCommandContent(tool, 'tool'); const commandContent = this.generateCommandContent(tool, 'tool');
// Use underscore format: bmad_bmm_name.md // Use underscore format: bmad_bmm_name.md
const flatName = toColonName(tool.module, 'tools', tool.name); const flatName = toColonName(tool.module, 'tools', tool.name);
@ -261,8 +160,8 @@ Follow all instructions in the ${type} file exactly as written.
return { return {
generated: generatedCount, generated: generatedCount,
tasks: (tasks || []).length, tasks: standaloneTasks.length,
tools: (tools || []).length, tools: standaloneTools.length,
}; };
} }
@ -279,12 +178,16 @@ Follow all instructions in the ${type} file exactly as written.
const tasks = await this.loadTaskManifest(bmadDir); const tasks = await this.loadTaskManifest(bmadDir);
const tools = await this.loadToolManifest(bmadDir); const tools = await this.loadToolManifest(bmadDir);
// Filter to only standalone items
const standaloneTasks = tasks ? tasks.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
const standaloneTools = tools ? tools.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
let generatedCount = 0; let generatedCount = 0;
// Generate command files for tasks // Generate command files for tasks
for (const task of tasks || []) { for (const task of standaloneTasks) {
const commandContent = this.generateCommandContent(task, 'task'); const commandContent = this.generateCommandContent(task, 'task');
// Use dash format: bmad-bmm-name.md // Use underscore format: bmad_bmm_name.md
const flatName = toDashPath(`${task.module}/tasks/${task.name}.md`); const flatName = toDashPath(`${task.module}/tasks/${task.name}.md`);
const commandPath = path.join(baseCommandsDir, flatName); const commandPath = path.join(baseCommandsDir, flatName);
await fs.ensureDir(path.dirname(commandPath)); await fs.ensureDir(path.dirname(commandPath));
@ -293,9 +196,9 @@ Follow all instructions in the ${type} file exactly as written.
} }
// Generate command files for tools // Generate command files for tools
for (const tool of tools || []) { for (const tool of standaloneTools) {
const commandContent = this.generateCommandContent(tool, 'tool'); const commandContent = this.generateCommandContent(tool, 'tool');
// Use dash format: bmad-bmm-name.md // Use underscore format: bmad_bmm_name.md
const flatName = toDashPath(`${tool.module}/tools/${tool.name}.md`); const flatName = toDashPath(`${tool.module}/tools/${tool.name}.md`);
const commandPath = path.join(baseCommandsDir, flatName); const commandPath = path.join(baseCommandsDir, flatName);
await fs.ensureDir(path.dirname(commandPath)); await fs.ensureDir(path.dirname(commandPath));
@ -305,8 +208,8 @@ Follow all instructions in the ${type} file exactly as written.
return { return {
generated: generatedCount, generated: generatedCount,
tasks: (tasks || []).length, tasks: standaloneTasks.length,
tools: (tools || []).length, tools: standaloneTools.length,
}; };
} }

View File

@ -2,13 +2,13 @@ const path = require('node:path');
const fs = require('fs-extra'); const fs = require('fs-extra');
const csv = require('csv-parse/sync'); const csv = require('csv-parse/sync');
const chalk = require('chalk'); const chalk = require('chalk');
const { toColonPath, toDashPath, customAgentColonName, customAgentDashName, BMAD_FOLDER_NAME } = require('./path-utils'); const { toColonPath, toDashPath, customAgentColonName, customAgentDashName } = require('./path-utils');
/** /**
* Generates command files for each workflow in the manifest * Generates command files for each workflow in the manifest
*/ */
class WorkflowCommandGenerator { class WorkflowCommandGenerator {
constructor(bmadFolderName = BMAD_FOLDER_NAME) { constructor(bmadFolderName = 'bmad') {
this.templatePath = path.join(__dirname, '../templates/workflow-command-template.md'); this.templatePath = path.join(__dirname, '../templates/workflow-command-template.md');
this.bmadFolderName = bmadFolderName; this.bmadFolderName = bmadFolderName;
} }

View File

@ -1,10 +0,0 @@
---
name: '{{name}}'
description: '{{description}}'
---
# {{name}}
Read the entire task file at: {project-root}/{{bmadFolderName}}/{{path}}
Follow all instructions in the task file exactly as written.

View File

@ -1,10 +0,0 @@
---
name: '{{name}}'
description: '{{description}}'
---
# {{name}}
Read the entire tool file at: {project-root}/{{bmadFolderName}}/{{path}}
Follow all instructions in the tool file exactly as written.

View File

@ -1,11 +0,0 @@
description = "Executes the {{name}} task from the BMAD Method."
prompt = """
Execute the BMAD '{{name}}' task.
TASK INSTRUCTIONS:
1. LOAD the task file from {project-root}/{{bmadFolderName}}/{{path}}
2. READ its entire contents
3. FOLLOW every instruction precisely as specified
TASK FILE: {project-root}/{{bmadFolderName}}/{{path}}
"""

Some files were not shown because too many files have changed in this diff Show More