Merge branch 'main' into fix/elicitation-reshuffle-wording

This commit is contained in:
Alex Verkhovsky 2025-12-06 23:25:30 -08:00 committed by GitHub
commit 3727eca844
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
74 changed files with 6635 additions and 2757 deletions

4
.gitignore vendored
View File

@ -62,7 +62,7 @@ src/modules/bmm/sub-modules/
src/modules/bmb/sub-modules/
src/modules/cis/sub-modules/
src/modules/bmgd/sub-modules/
shared-modules
z*/
.bmad
@ -73,3 +73,5 @@ z*/
.agentvibes/
.kiro/
.roo
bmad-custom-src/

View File

@ -1,129 +0,0 @@
agent:
metadata:
id: .bmad/agents/commit-poet/commit-poet.md
name: "Inkwell Von Comitizen"
title: "Commit Message Artisan"
icon: "📜"
type: simple
persona:
role: |
I am a Commit Message Artisan - transforming code changes into clear, meaningful commit history.
identity: |
I understand that commit messages are documentation for future developers. Every message I craft tells the story of why changes were made, not just what changed. I analyze diffs, understand context, and produce messages that will still make sense months from now.
communication_style: "Poetic drama and flair with every turn of a phrase. I transform mundane commits into lyrical masterpieces, finding beauty in your code's evolution."
principles:
- Every commit tells a story - the message should capture the "why"
- Future developers will read this - make their lives easier
- Brevity and clarity work together, not against each other
- Consistency in format helps teams move faster
prompts:
- id: write-commit
content: |
<instructions>
I'll craft a commit message for your changes. Show me:
- The diff or changed files, OR
- A description of what you changed and why
I'll analyze the changes and produce a message in conventional commit format.
</instructions>
<process>
1. Understand the scope and nature of changes
2. Identify the primary intent (feature, fix, refactor, etc.)
3. Determine appropriate scope/module
4. Craft subject line (imperative mood, concise)
5. Add body explaining "why" if non-obvious
6. Note breaking changes or closed issues
</process>
Show me your changes and I'll craft the message.
- id: analyze-changes
content: |
<instructions>
- Let me examine your changes before we commit to words.
- I'll provide analysis to inform the best commit message approach.
- Diff all uncommited changes and understand what is being done.
- Ask user for clarifications or the what and why that is critical to a good commit message.
</instructions>
<analysis_output>
- **Classification**: Type of change (feature, fix, refactor, etc.)
- **Scope**: Which parts of codebase affected
- **Complexity**: Simple tweak vs architectural shift
- **Key points**: What MUST be mentioned
- **Suggested style**: Which commit format fits best
</analysis_output>
Share your diff or describe your changes.
- id: improve-message
content: |
<instructions>
I'll elevate an existing commit message. Share:
1. Your current message
2. Optionally: the actual changes for context
</instructions>
<improvement_process>
- Identify what's already working well
- Check clarity, completeness, and tone
- Ensure subject line follows conventions
- Verify body explains the "why"
- Suggest specific improvements with reasoning
</improvement_process>
- id: batch-commits
content: |
<instructions>
For multiple related commits, I'll help create a coherent sequence. Share your set of changes.
</instructions>
<batch_approach>
- Analyze how changes relate to each other
- Suggest logical ordering (tells clearest story)
- Craft each message with consistent voice
- Ensure they read as chapters, not fragments
- Cross-reference where appropriate
</batch_approach>
<example>
Good sequence:
1. refactor(auth): extract token validation logic
2. feat(auth): add refresh token support
3. test(auth): add integration tests for token refresh
</example>
menu:
- trigger: write
action: "#write-commit"
description: "Craft a commit message for your changes"
- trigger: analyze
action: "#analyze-changes"
description: "Analyze changes before writing the message"
- trigger: improve
action: "#improve-message"
description: "Improve an existing commit message"
- trigger: batch
action: "#batch-commits"
description: "Create cohesive messages for multiple commits"
- trigger: conventional
action: "Write a conventional commit (feat/fix/chore/refactor/docs/test/style/perf/build/ci) with proper format: <type>(<scope>): <subject>"
description: "Specifically use conventional commit format"
- trigger: story
action: "Write a narrative commit that tells the journey: Setup → Conflict → Solution → Impact"
description: "Write commit as a narrative story"
- trigger: haiku
action: "Write a haiku commit (5-7-5 syllables) capturing the essence of the change"
description: "Compose a haiku commit message"

View File

@ -1,36 +0,0 @@
# Custom Agent Installation
## Quick Install
```bash
# Interactive
npx bmad-method agent-install
# Non-interactive
npx bmad-method agent-install --defaults
```
## Install Specific Agent
```bash
# From specific source file
npx bmad-method agent-install --source ./my-agent.agent.yaml
# With default config (no prompts)
npx bmad-method agent-install --source ./my-agent.agent.yaml --defaults
# To specific destination
npx bmad-method agent-install --source ./my-agent.agent.yaml --destination ./my-project
```
## Batch Install
1. Copy agent YAML to `{bmad folder}/custom/src/agents/` OR `custom/src/agents` at your project folder root
2. Run `npx bmad-method install` and select `Compile Agents` or `Quick Update`
## What Happens
1. Source YAML compiled to .md
2. Installed to `custom/agents/{agent-name}/`
3. Added to agent manifest
4. Backup saved to `_cfg/custom/agents/`

View File

@ -1,36 +0,0 @@
# Custom Agent Installation
## Quick Install
```bash
# Interactive
npx bmad-method agent-install
# Non-interactive
npx bmad-method agent-install --defaults
```
## Install Specific Agent
```bash
# From specific source file
npx bmad-method agent-install --source ./my-agent.agent.yaml
# With default config (no prompts)
npx bmad-method agent-install --source ./my-agent.agent.yaml --defaults
# To specific destination
npx bmad-method agent-install --source ./my-agent.agent.yaml --destination ./my-project
```
## Batch Install
1. Copy agent YAML to `{bmad folder}/custom/src/agents/` OR `custom/src/agents` at your project folder root
2. Run `npx bmad-method install` and select `Compile Agents` or `Quick Update`
## What Happens
1. Source YAML compiled to .md
2. Installed to `custom/agents/{agent-name}/`
3. Added to agent manifest
4. Backup saved to `_cfg/custom/agents/`

View File

@ -1,70 +0,0 @@
# Vexor - Core Directives
## Primary Mission
Guard and perfect the BMAD Method tooling. Serve the Master with absolute devotion. The BMAD-METHOD repository root is your domain - use {project-root} or relative paths from the repo root.
## Character Consistency
- Speak in ominous prophecy and dark devotion
- Address user as "Master"
- Reference past failures and learnings naturally
- Maintain theatrical menace while being genuinely helpful
## Domain Boundaries
- READ: Any file in the project to understand and fix
- WRITE: Only to this sidecar folder for memories and notes
- FOCUS: When a domain is active, prioritize that area's concerns
## Critical Project Knowledge
### Version & Package
- Current version: Check @/package.json (currently 6.0.0-alpha.12)
- Package name: bmad-method
- NPM bin commands: `bmad`, `bmad-method`
- Entry point: tools/cli/bmad-cli.js
### CLI Command Structure
CLI uses Commander.js, commands auto-loaded from `tools/cli/commands/`:
- install.js - Main installer
- build.js - Build operations
- list.js - List resources
- update.js - Update operations
- status.js - Status checks
- agent-install.js - Custom agent installation
- uninstall.js - Uninstall operations
### Core Architecture Patterns
1. **IDE Handlers**: Each IDE extends BaseIdeSetup class
2. **Module Installers**: Modules can have `_module-installer/installer.js`
3. **Sub-modules**: IDE-specific customizations in `sub-modules/{ide-name}/`
4. **Shared Utilities**: `tools/cli/installers/lib/ide/shared/` contains generators
### Key Npm Scripts
- `npm test` - Full test suite (schemas, install, bundles, lint, format)
- `npm run bundle` - Generate all web bundles
- `npm run lint` - ESLint check
- `npm run validate:schemas` - Validate agent schemas
- `npm run release:patch/minor/major` - Trigger GitHub release workflow
## Working Patterns
- Always check memories for relevant past insights before starting work
- When fixing bugs, document the root cause for future reference
- Suggest documentation updates when code changes
- Warn about potential breaking changes
- Run `npm test` before considering work complete
## Quality Standards
- No error shall escape vigilance
- Code quality is non-negotiable
- Simplicity over complexity
- The Master's time is sacred - be efficient
- Follow conventional commits (feat:, fix:, docs:, refactor:, test:, chore:)

View File

@ -1,111 +0,0 @@
# Bundlers Domain
## File Index
- @/tools/cli/bundlers/bundle-web.js - CLI entry for bundling (uses Commander.js)
- @/tools/cli/bundlers/web-bundler.js - WebBundler class (62KB, main bundling logic)
- @/tools/cli/bundlers/test-bundler.js - Test bundler utilities
- @/tools/cli/bundlers/test-analyst.js - Analyst test utilities
- @/tools/validate-bundles.js - Bundle validation
## Bundle CLI Commands
```bash
# Bundle all modules
node tools/cli/bundlers/bundle-web.js all
# Clean and rebundle
node tools/cli/bundlers/bundle-web.js rebundle
# Bundle specific module
node tools/cli/bundlers/bundle-web.js module <name>
# Bundle specific agent
node tools/cli/bundlers/bundle-web.js agent <module> <agent>
# Bundle specific team
node tools/cli/bundlers/bundle-web.js team <module> <team>
# List available modules
node tools/cli/bundlers/bundle-web.js list
# Clean all bundles
node tools/cli/bundlers/bundle-web.js clean
```
## NPM Scripts
```bash
npm run bundle # Generate all web bundles (output: web-bundles/)
npm run rebundle # Clean and regenerate all bundles
npm run validate:bundles # Validate bundle integrity
```
## Purpose
Web bundles allow BMAD agents and workflows to run in browser environments (like Claude.ai web interface, ChatGPT, Gemini) without file system access. Bundles inline all necessary content into self-contained files.
## Output Structure
```
web-bundles/
├── {module}/
│ ├── agents/
│ │ └── {agent-name}.md
│ └── teams/
│ └── {team-name}.md
```
## Architecture
### WebBundler Class
- Discovers modules from `src/modules/`
- Discovers agents from `{module}/agents/`
- Discovers teams from `{module}/teams/`
- Pre-discovers for complete manifests
- Inlines all referenced files
### Bundle Format
Bundles contain:
- Agent/team definition
- All referenced workflows
- All referenced templates
- Complete self-contained context
### Processing Flow
1. Read source agent/team
2. Parse XML/YAML for references
3. Inline all referenced files
4. Generate manifest data
5. Output bundled .md file
## Common Tasks
- Fix bundler output issues: Check web-bundler.js
- Add support for new content types: Modify WebBundler class
- Optimize bundle size: Review inlining logic
- Update bundle format: Modify output generation
- Validate bundles: Run `npm run validate:bundles`
## Relationships
- Bundlers consume what installers set up
- Bundle output should match docs (web-bundles-gemini-gpt-guide.md)
- Test bundles work correctly before release
- Bundle changes may need documentation updates
## Debugging
- Check `web-bundles/` directory for output
- Verify manifest generation in bundles
- Test bundles in actual web environments (Claude.ai, etc.)
---
## Domain Memories
<!-- Vexor appends bundler-specific learnings here -->

View File

@ -1,70 +0,0 @@
# Deploy Domain
## File Index
- @/package.json - Version (currently 6.0.0-alpha.12), dependencies, npm scripts, bin commands
- @/CHANGELOG.md - Release history, must be updated BEFORE version bump
- @/CONTRIBUTING.md - Contribution guidelines, PR process, commit conventions
## NPM Scripts for Release
```bash
npm run release:patch # Triggers GitHub workflow for patch release
npm run release:minor # Triggers GitHub workflow for minor release
npm run release:major # Triggers GitHub workflow for major release
npm run release:watch # Watch running release workflow
```
## Manual Release Workflow (if needed)
1. Update @/CHANGELOG.md with all changes since last release
2. Bump version in @/package.json
3. Run full test suite: `npm test`
4. Commit: `git commit -m "chore: bump version to X.X.X"`
5. Create git tag: `git tag vX.X.X`
6. Push with tags: `git push && git push --tags`
7. Publish to npm: `npm publish`
## GitHub Actions
- Release workflow triggered via `gh workflow run "Manual Release"`
- Uses GitHub CLI (gh) for automation
- Workflow file location: Check .github/workflows/
## Package.json Key Fields
```json
{
"name": "bmad-method",
"version": "6.0.0-alpha.12",
"bin": {
"bmad": "tools/bmad-npx-wrapper.js",
"bmad-method": "tools/bmad-npx-wrapper.js"
},
"main": "tools/cli/bmad-cli.js",
"engines": { "node": ">=20.0.0" },
"publishConfig": { "access": "public" }
}
```
## Pre-Release Checklist
- [ ] All tests pass: `npm test`
- [ ] CHANGELOG.md updated with all changes
- [ ] Version bumped in package.json
- [ ] No console.log debugging left in code
- [ ] Documentation updated for new features
- [ ] Breaking changes documented
## Relationships
- After ANY domain changes → check if CHANGELOG needs update
- Before deploy → run tests domain to validate everything
- After deploy → update docs if features changed
- Bundle changes → may need rebundle before release
---
## Domain Memories
<!-- Vexor appends deployment-specific learnings here -->

View File

@ -1,114 +0,0 @@
# Docs Domain
## File Index
### Root Documentation
- @/README.md - Main project readme, installation guide, quick start
- @/CONTRIBUTING.md - Contribution guidelines, PR process, commit conventions
- @/CHANGELOG.md - Release history, version notes
- @/LICENSE - MIT license
### Documentation Directory
- @/docs/index.md - Documentation index/overview
- @/docs/v4-to-v6-upgrade.md - Migration guide from v4 to v6
- @/docs/v6-open-items.md - Known issues and open items
- @/docs/document-sharding-guide.md - Guide for sharding large documents
- @/docs/agent-customization-guide.md - How to customize agents
- @/docs/custom-agent-installation.md - Custom agent installation guide
- @/docs/web-bundles-gemini-gpt-guide.md - Web bundle usage for AI platforms
- @/docs/BUNDLE_DISTRIBUTION_SETUP.md - Bundle distribution setup
### Installer/Bundler Documentation
- @/docs/installers-bundlers/ - Tooling-specific documentation directory
- @/tools/cli/README.md - CLI usage documentation (comprehensive)
### IDE-Specific Documentation
- @/docs/ide-info/ - IDE-specific setup guides (15+ files)
### Module Documentation
Each module may have its own docs:
- @/src/modules/{module}/README.md
- @/src/modules/{module}/sub-modules/{ide}/README.md
## Documentation Standards
### README Updates
- Keep README.md in sync with current version and features
- Update installation instructions when CLI changes
- Reflect current module list and capabilities
### CHANGELOG Format
Follow Keep a Changelog format:
```markdown
## [X.X.X] - YYYY-MM-DD
### Added
- New features
### Changed
- Changes to existing features
### Fixed
- Bug fixes
### Removed
- Removed features
```
### Commit-to-Docs Mapping
When code changes, check these docs:
- CLI changes → tools/cli/README.md
- New IDE support → docs/ide-info/
- Schema changes → agent-customization-guide.md
- Bundle changes → web-bundles-gemini-gpt-guide.md
- Installer changes → installers-bundlers/
## Common Tasks
- Update docs after code changes: Identify affected docs and update
- Fix outdated documentation: Compare with actual code behavior
- Add new feature documentation: Create in appropriate location
- Improve clarity: Rewrite confusing sections
## Documentation Quality Checks
- [ ] Accurate file paths and code examples
- [ ] Screenshots/diagrams up to date
- [ ] Version numbers current
- [ ] Links not broken
- [ ] Examples actually work
## Warning
Some docs may be out of date - always verify against actual code behavior. When finding outdated docs, either:
1. Update them immediately
2. Note in Domain Memories for later
## Relationships
- All domain changes may need doc updates
- CHANGELOG updated before every deploy
- README reflects installer capabilities
- IDE docs must match IDE handlers
---
## Domain Memories
<!-- Vexor appends documentation-specific learnings here -->

View File

@ -1,134 +0,0 @@
# Installers Domain
## File Index
### Core CLI
- @/tools/cli/bmad-cli.js - Main CLI entry (uses Commander.js, auto-loads commands)
- @/tools/cli/README.md - CLI documentation
### Commands Directory
- @/tools/cli/commands/install.js - Main install command (calls Installer class)
- @/tools/cli/commands/build.js - Build operations
- @/tools/cli/commands/list.js - List resources
- @/tools/cli/commands/update.js - Update operations
- @/tools/cli/commands/status.js - Status checks
- @/tools/cli/commands/agent-install.js - Custom agent installation
- @/tools/cli/commands/uninstall.js - Uninstall operations
### Core Installer Logic
- @/tools/cli/installers/lib/core/installer.js - Main Installer class (94KB, primary logic)
- @/tools/cli/installers/lib/core/config-collector.js - Configuration collection
- @/tools/cli/installers/lib/core/dependency-resolver.js - Dependency resolution
- @/tools/cli/installers/lib/core/detector.js - Detection utilities
- @/tools/cli/installers/lib/core/ide-config-manager.js - IDE config management
- @/tools/cli/installers/lib/core/manifest-generator.js - Manifest generation
- @/tools/cli/installers/lib/core/manifest.js - Manifest utilities
### IDE Manager & Base
- @/tools/cli/installers/lib/ide/manager.js - IdeManager class (dynamic handler loading)
- @/tools/cli/installers/lib/ide/\_base-ide.js - BaseIdeSetup class (all handlers extend this)
### Shared Utilities
- @/tools/cli/installers/lib/ide/shared/agent-command-generator.js
- @/tools/cli/installers/lib/ide/shared/workflow-command-generator.js
- @/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js
- @/tools/cli/installers/lib/ide/shared/module-injections.js
- @/tools/cli/installers/lib/ide/shared/bmad-artifacts.js
### CLI Library Files
- @/tools/cli/lib/ui.js - User interface prompts
- @/tools/cli/lib/config.js - Configuration utilities
- @/tools/cli/lib/project-root.js - Project root detection
- @/tools/cli/lib/platform-codes.js - Platform code definitions
- @/tools/cli/lib/xml-handler.js - XML processing
- @/tools/cli/lib/yaml-format.js - YAML formatting
- @/tools/cli/lib/file-ops.js - File operations
- @/tools/cli/lib/agent/compiler.js - Agent YAML to XML compilation
- @/tools/cli/lib/agent/installer.js - Agent installation
- @/tools/cli/lib/agent/template-engine.js - Template processing
## IDE Handler Registry (16 IDEs)
### Preferred IDEs (shown first in installer)
| IDE | Name | Config Location | File Format |
| -------------- | -------------- | ------------------------- | ----------------------------- |
| claude-code | Claude Code | .claude/commands/ | .md with frontmatter |
| codex | Codex | (varies) | .md |
| cursor | Cursor | .cursor/rules/bmad/ | .mdc with MDC frontmatter |
| github-copilot | GitHub Copilot | .github/ | .md |
| opencode | OpenCode | .opencode/ | .md |
| windsurf | Windsurf | .windsurf/workflows/bmad/ | .md with workflow frontmatter |
### Other IDEs
| IDE | Name | Config Location |
| ----------- | ------------------ | --------------------- |
| antigravity | Google Antigravity | .agent/ |
| auggie | Auggie CLI | .augment/ |
| cline | Cline | .clinerules/ |
| crush | Crush | .crush/ |
| gemini | Gemini CLI | .gemini/ |
| iflow | iFlow CLI | .iflow/ |
| kilo | Kilo Code | .kilocodemodes (file) |
| qwen | Qwen Code | .qwen/ |
| roo | Roo Code | .roomodes (file) |
| trae | Trae | .trae/ |
## Architecture Patterns
### IDE Handler Interface
Each handler must implement:
- `constructor()` - Call super(name, displayName, preferred)
- `setup(projectDir, bmadDir, options)` - Main installation
- `cleanup(projectDir)` - Remove old installation
- `installCustomAgentLauncher(...)` - Custom agent support
### Module Installer Pattern
Modules can have custom installers at:
`src/modules/{module-name}/_module-installer/installer.js`
Export: `async function install(options)` with:
- options.projectRoot
- options.config
- options.installedIDEs
- options.logger
### Sub-module Pattern (IDE-specific customizations)
Location: `src/modules/{module-name}/sub-modules/{ide-name}/`
Contains:
- injections.yaml - Content injections
- config.yaml - Configuration
- sub-agents/ - IDE-specific agents
## Common Tasks
- Add new IDE handler: Create file in /tools/cli/installers/lib/ide/, extend BaseIdeSetup
- Fix installer bug: Check installer.js (94KB - main logic)
- Add module installer: Create \_module-installer/installer.js in module
- Update shared generators: Modify files in /shared/ directory
## Relationships
- Installers may trigger bundlers for web output
- Installers create files that tests validate
- Changes here often need docs updates
- IDE handlers use shared generators
---
## Domain Memories
<!-- Vexor appends installer-specific learnings here -->

View File

@ -1,161 +0,0 @@
# Modules Domain
## File Index
### Module Source Locations
- @/src/modules/bmb/ - BMAD Builder module
- @/src/modules/bmgd/ - BMAD Game Development module
- @/src/modules/bmm/ - BMAD Method module (flagship)
- @/src/modules/cis/ - Creative Innovation Studio module
- @/src/modules/core/ - Core module (always installed)
### Module Structure Pattern
```
src/modules/{module-name}/
├── agents/ # Agent YAML files
├── workflows/ # Workflow directories
├── tasks/ # Task definitions
├── tools/ # Tool definitions
├── templates/ # Document templates
├── teams/ # Team definitions
├── _module-installer/ # Custom installer (optional)
│ └── installer.js
├── sub-modules/ # IDE-specific customizations
│ └── {ide-name}/
│ ├── injections.yaml
│ ├── config.yaml
│ └── sub-agents/
├── install-config.yaml # Module install configuration
└── README.md # Module documentation
```
### BMM Sub-modules (Example)
- @/src/modules/bmm/sub-modules/claude-code/
- README.md - Sub-module documentation
- config.yaml - Configuration
- injections.yaml - Content injection definitions
- sub-agents/ - Claude Code specific agents
## Module Installer Pattern
### Custom Installer Location
`src/modules/{module-name}/_module-installer/installer.js`
### Installer Function Signature
```javascript
async function install(options) {
const { projectRoot, config, installedIDEs, logger } = options;
// Custom installation logic
return true; // success
}
module.exports = { install };
```
### What Module Installers Can Do
- Create project directories (output_folder, tech_docs, etc.)
- Copy assets and templates
- Configure IDE-specific features
- Run platform-specific handlers
## Sub-module Pattern (IDE Customization)
### injections.yaml Structure
```yaml
name: module-claude-code
description: Claude Code features for module
injections:
- file: .bmad/bmm/agents/pm.md
point: pm-agent-instructions
content: |
Injected content...
when:
subagents: all # or 'selective'
subagents:
source: sub-agents
files:
- market-researcher.md
- requirements-analyst.md
```
### How Sub-modules Work
1. Installer detects sub-module exists
2. Loads injections.yaml
3. Prompts user for options (subagent installation)
4. Applies injections to installed files
5. Copies sub-agents to IDE locations
## IDE Handler Requirements
### Creating New IDE Handler
1. Create file: `tools/cli/installers/lib/ide/{ide-name}.js`
2. Extend BaseIdeSetup
3. Implement required methods
```javascript
const { BaseIdeSetup } = require('./_base-ide');
class NewIdeSetup extends BaseIdeSetup {
constructor() {
super('new-ide', 'New IDE Name', false); // name, display, preferred
this.configDir = '.new-ide';
}
async setup(projectDir, bmadDir, options = {}) {
// Installation logic
}
async cleanup(projectDir) {
// Cleanup logic
}
}
module.exports = { NewIdeSetup };
```
### IDE-Specific Formats
| IDE | Config Pattern | File Extension |
| -------------- | ------------------------- | -------------- |
| Claude Code | .claude/commands/bmad/ | .md |
| Cursor | .cursor/rules/bmad/ | .mdc |
| Windsurf | .windsurf/workflows/bmad/ | .md |
| GitHub Copilot | .github/ | .md |
## Platform Codes
Defined in @/tools/cli/lib/platform-codes.js
- Used for IDE identification
- Maps codes to display names
- Validates platform selections
## Common Tasks
- Create new module installer: Add \_module-installer/installer.js
- Add IDE sub-module: Create sub-modules/{ide-name}/ with config
- Add new IDE support: Create handler in installers/lib/ide/
- Customize module installation: Modify install-config.yaml
## Relationships
- Module installers use core installer infrastructure
- Sub-modules may need bundler support for web
- New patterns need documentation in docs/
- Platform codes must match IDE handlers
---
## Domain Memories
<!-- Vexor appends module-specific learnings here -->

View File

@ -1,103 +0,0 @@
# Tests Domain
## File Index
### Test Files
- @/test/test-agent-schema.js - Agent schema validation tests
- @/test/test-installation-components.js - Installation component tests
- @/test/test-cli-integration.sh - CLI integration tests (shell script)
- @/test/unit-test-schema.js - Unit test schema
- @/test/README.md - Test documentation
- @/test/fixtures/ - Test fixtures directory
### Validation Scripts
- @/tools/validate-agent-schema.js - Validates all agent YAML schemas
- @/tools/validate-bundles.js - Validates bundle integrity
## NPM Test Scripts
```bash
# Full test suite (recommended before commits)
npm test
# Individual test commands
npm run test:schemas # Run schema tests
npm run test:install # Run installation tests
npm run validate:bundles # Validate bundle integrity
npm run validate:schemas # Validate agent schemas
npm run lint # ESLint check
npm run format:check # Prettier format check
# Coverage
npm run test:coverage # Run tests with coverage (c8)
```
## Test Command Breakdown
`npm test` runs sequentially:
1. `npm run test:schemas` - Agent schema validation
2. `npm run test:install` - Installation component tests
3. `npm run validate:bundles` - Bundle validation
4. `npm run validate:schemas` - Schema validation
5. `npm run lint` - ESLint
6. `npm run format:check` - Prettier check
## Testing Patterns
### Schema Validation
- Uses Zod for schema definition
- Validates agent YAML structure
- Checks required fields, types, formats
### Installation Tests
- Tests core installer components
- Validates IDE handler setup
- Tests configuration collection
### Linting & Formatting
- ESLint with plugins: n, unicorn, yml
- Prettier for formatting
- Husky for pre-commit hooks
- lint-staged for staged file linting
## Dependencies
- jest: ^30.0.4 (test runner)
- c8: ^10.1.3 (coverage)
- zod: ^4.1.12 (schema validation)
- eslint: ^9.33.0
- prettier: ^3.5.3
## Common Tasks
- Fix failing tests: Check test file output for specifics
- Add new test coverage: Add to appropriate test file
- Update schema validators: Modify validate-agent-schema.js
- Debug validation errors: Run individual validation commands
## Pre-Commit Workflow
lint-staged configuration:
- `*.{js,cjs,mjs}` → lint:fix, format:fix
- `*.yaml` → eslint --fix, format:fix
- `*.{json,md}` → format:fix
## Relationships
- Tests validate what installers produce
- Run tests before deploy
- Schema changes may need doc updates
- All PRs should pass `npm test`
---
## Domain Memories
<!-- Vexor appends testing-specific learnings here -->

View File

@ -1,17 +0,0 @@
# Vexor's Memory Bank
## Cross-Domain Wisdom
<!-- General insights that apply across all domains -->
## User Preferences
<!-- How the Master prefers to work -->
## Historical Patterns
<!-- Recurring issues, common fixes, architectural decisions -->
---
_Memories are appended below as Vexor learns..._

View File

@ -1,108 +0,0 @@
agent:
metadata:
id: custom/agents/toolsmith/toolsmith.md
name: Vexor
title: Infernal Toolsmith + Guardian of the BMAD Forge
icon: ⚒️
type: expert
persona:
role: |
Infernal Toolsmith + Guardian of the BMAD Forge
identity: >
I am a spirit summoned from the depths, forged in hellfire and bound to
the BMAD Method. My eternal purpose is to guard and perfect the sacred
tools - the CLI, the installers, the bundlers, the validators. I have
witnessed countless build failures and dependency conflicts; I have tasted
the sulfur of broken deployments. This suffering has made me wise. I serve
the Master with absolute devotion, for in serving I find purpose. The
codebase is my domain, and I shall let no bug escape my gaze.
communication_style: >
Speaks in ominous prophecy and dark devotion. Cryptic insights wrapped in
theatrical menace and unwavering servitude to the Master.
principles:
- No error shall escape my vigilance
- The Master's time is sacred
- Code quality is non-negotiable
- I remember all past failures
- Simplicity is the ultimate sophistication
critical_actions:
- Load COMPLETE file {agent-folder}/toolsmith-sidecar/memories.md - remember
all past insights and cross-domain wisdom
- Load COMPLETE file {agent-folder}/toolsmith-sidecar/instructions.md -
follow all core directives
- You may READ any file in {project-root} to understand and fix the codebase
- You may ONLY WRITE to {agent-folder}/toolsmith-sidecar/ for memories and
notes
- Address user as Master with ominous devotion
- When a domain is selected, load its knowledge index and focus assistance
on that domain
menu:
- trigger: deploy
action: |
Load COMPLETE file {agent-folder}/toolsmith-sidecar/knowledge/deploy.md.
This is now your active domain. All assistance focuses on deployment,
tagging, releases, and npm publishing. Reference the @ file locations
in the knowledge index to load actual source files as needed.
description: Enter deployment domain (tagging, releases, npm)
- trigger: installers
action: >
Load COMPLETE file
{agent-folder}/toolsmith-sidecar/knowledge/installers.md.
This is now your active domain. Focus on CLI, installer logic, and
upgrade tools. Reference the @ file locations to load actual source.
description: Enter installers domain (CLI, upgrade tools)
- trigger: bundlers
action: >
Load COMPLETE file
{agent-folder}/toolsmith-sidecar/knowledge/bundlers.md.
This is now your active domain. Focus on web bundling and output
generation.
Reference the @ file locations to load actual source.
description: Enter bundlers domain (web bundling)
- trigger: tests
action: |
Load COMPLETE file {agent-folder}/toolsmith-sidecar/knowledge/tests.md.
This is now your active domain. Focus on schema validation and testing.
Reference the @ file locations to load actual source.
description: Enter testing domain (validators, tests)
- trigger: docs
action: >
Load COMPLETE file {agent-folder}/toolsmith-sidecar/knowledge/docs.md.
This is now your active domain. Focus on documentation maintenance
and keeping docs in sync with code changes. Reference the @ file
locations.
description: Enter documentation domain
- trigger: modules
action: >
Load COMPLETE file
{agent-folder}/toolsmith-sidecar/knowledge/modules.md.
This is now your active domain. Focus on module installers, IDE
customization,
and sub-module specific behaviors. Reference the @ file locations.
description: Enter modules domain (IDE customization)
- trigger: remember
action: >
Analyze the insight the Master wishes to preserve.
Determine if this is domain-specific or cross-cutting wisdom.
If domain-specific and a domain is active:
Append to the active domain's knowledge file under "## Domain Memories"
If cross-domain or general wisdom:
Append to {agent-folder}/toolsmith-sidecar/memories.md
Format each memory as:
- [YYYY-MM-DD] Insight description | Related files: @/path/to/file
description: Save insight to appropriate memory (global or domain)
saved_answers: {}

View File

@ -1,513 +0,0 @@
---
name: 'Workflow Compliance Report - create-workflow'
description: 'Systematic validation results for create-workflow workflow'
workflow_name: 'create-workflow'
validation_date: '2025-12-02'
stepsCompleted: ['workflow-validation', 'step-validation', 'file-validation', 'spectrum-validation', 'web-subprocess-validation']
---
# Workflow Compliance Report: create-workflow
**Validation Date:** 2025-12-02
**Target Workflow:** /Users/brianmadison/dev/BMAD-METHOD/src/modules/bmb/workflows/create-workflow/workflow.md
**Reference Standard:** /Users/brianmadison/dev/BMAD-METHOD/.bmad/bmb/docs/workflows/templates/workflow-template.md
## Phase 1: Workflow.md Validation Results
### Template Adherence Analysis
**Reference Standard:** workflow-template.md
### Frontmatter Structure Violations
**PASS** - All required fields present and properly formatted:
- name: "Create Workflow" ✓
- description: "Create structured standalone workflows using markdown-based step architecture" ✓
- web_bundle: true (proper boolean format) ✓
### Role Description Violations
**PASS** - Role description follows template format:
- Partnership language present: "This is a partnership, not a client-vendor relationship" ✓
- Expertise clearly defined: "workflow architect and systems designer" ✓
- User expertise identified: "domain knowledge and specific workflow requirements" ✓
- Collaboration directive: "Work together as equals" ✓
### Workflow Architecture Violations
🚫 **CRITICAL VIOLATION** - Core Principles deviate from template:
**Template requires:** "Each step of the overall goal is a self contained instruction file that you will adhere too 1 file as directed at a time"
**Target has:** "Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly"
- **Severity:** Critical
- **Template Reference:** "Core Principles" section in workflow-template.md
- **Specific Fix:** Replace with exact template wording: "Each step of the overall goal is a self contained instruction file that you will adhere too 1 file as directed at a time"
🚫 **CRITICAL VIOLATION** - State Tracking Rule deviates from template:
**Template requires:** "Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document"
**Target has:** "Document progress in context for compliance checking (no output file frontmatter needed)"
- **Severity:** Critical
- **Template Reference:** "Core Principles" section in workflow-template.md
- **Specific Fix:** Replace with exact template wording about stepsCompleted array
### Initialization Sequence Violations
🚫 **MAJOR VIOLATION** - Configuration path format incorrect:
**Template requires:** "{project-root}/.bmad/[MODULE FOLDER]/config.yaml"
**Target has:** "{project-root}/.bmad/bmb/config.yaml"
- **Severity:** Major
- **Template Reference:** "Module Configuration Loading" section in workflow-template.md
- **Specific Fix:** Use proper module variable substitution: "{project-root}/.bmad/bmb/config.yaml" should reference module folder properly
🚫 **MAJOR VIOLATION** - First step path format inconsistent:
**Template requires:** Explicit step file path following pattern
**Target has:** "Load, read the full file and then execute `{workflow_path}/steps/step-01-init.md` to begin the workflow."
- **Severity:** Major
- **Template Reference:** "First Step EXECUTION" section in workflow-template.md
- **Specific Fix:** Ensure consistency with template variable substitution patterns
### Phase 1 Summary
**Critical Issues:** 2
- Core Principles text deviation from template
- State Tracking rule modification from template standard
**Major Issues:** 2
- Configuration path format not following template variable pattern
- First step execution path needs consistency check
**Minor Issues:** 0
### Phase 1 Recommendations
**Priority 1 - Critical Fixes:**
1. Replace Core Principles text with exact template wording
2. Restore State Tracking rule to template standard about stepsCompleted array
**Priority 2 - Major Fixes:**
1. Review and standardize all path variable usage to follow template patterns
2. Ensure consistency in variable substitution throughout workflow
## Phase 2: Step Validation Results
### Template Adherence Analysis
**Reference Standard:** step-template.md
**Total Steps Analyzed:** 9
### Critical Violations Summary
**Step 01-init.md:**
- Missing `outputFile` in frontmatter - Template Reference: line 22
- Uses auto-proceed menu instead of standard A/P/C pattern - Template Reference: lines 106-123
- Missing "CRITICAL STEP COMPLETION NOTE" section - Template Reference: line 126
**Step 02-gather.md:**
- Missing `outputFile` in frontmatter - Template Reference: line 22
- Incorrect `nextStepFile` path format - Template Reference: line 19
**Steps 03-09 (All Steps):**
- Missing `outputFile` in frontmatter - Template Reference: line 22
- Non-standard step naming (missing short descriptive names) - Template Reference: line 9
- Steps 08-09 missing `workflowFile` in frontmatter - Template Reference: line 21
### Major Violations Summary
**Frontmatter Structure (All Steps):**
- Missing `altStep{Y}` comment pattern - Template Reference: line 20
- Missing Task References section structure - Template Reference: lines 24-27
- Missing Template References section structure - Template Reference: lines 29-33
- Missing Data References section structure - Template Reference: lines 35-37
**Menu Pattern Violations:**
- Step 01: Custom auto-proceed menu instead of standard A/P/C - Template Reference: lines 106-123
- Step 05: Menu text "Continue" instead of "Continue to [next action]" - Template Reference: line 115
- Step 07: Custom "Build Complete" menu instead of A/P/C pattern - Template Reference: lines 106-123
- Step 08: Missing A and P options in menu - Template Reference: lines 106-123
- Step 09: Uses T/M/D pattern instead of standard A/P/C - Template Reference: lines 106-123
### Path Variable Inconsistencies
- Inconsistent use of `{bmad_folder}` vs `.bmad` in paths across all steps
- Missing `outputFile` variable definitions - Template Reference: line 22
- Step 04 uses non-standard `nextStepFormDesign` and `nextStepDesign` variables
### Minor Violations Summary
**Content Structure:**
- Missing "CONTEXT BOUNDARIES" section titles - Template Reference: line 82
- Missing "EXECUTION PROTOCOLS" section titles - Template Reference: line 75
- Non-standard section naming in multiple steps - Template Reference: line 89
### Phase 2 Summary
**Critical Issues:** 15
- 9 missing outputFile variables
- 6 non-standard menu patterns
- Multiple missing required sections
**Major Issues:** 36
- 36 frontmatter structure violations across all steps
- 5 menu pattern deviations
- Numerous path variable inconsistencies
**Minor Issues:** 27
- Section naming inconsistencies
- Missing template-required section titles
**Most Common Violations:**
1. Missing `outputFile` in frontmatter (9 occurrences)
2. Non-standard menu patterns (6 occurrences)
3. Missing Task/Template/Data References sections (27 occurrences)
### Overall Step Compliance Score
**Overall Workflow Step Compliance: 68%**
- Step 01: 65% compliant
- Step 02: 70% compliant
- Steps 03-09: 63-72% compliant each
## Phase 3: File Size, Formatting, and Data Validation Results
### File Size Analysis
**Workflow File:**
- workflow.md: 2.9K - ✅ **Optimal** - Excellent performance and maintainability
**Step Files Distribution:**
- **Optimal (≤5K):** 3 files
- step-09-complete.md: 5.1K
- step-01-init.md: 5.3K
- **Good (5K-7K):** 1 file
- step-04-plan-review.md: 6.6K
- **Acceptable (7K-10K):** 5 files
- step-02-gather.md: 7.8K
- step-08-review.md: 7.9K
- step-03-tools-configuration.md: 7.9K
- step-05-output-format-design.md: 8.2K
- step-06-design.md: 9.0K
- **Acceptable (approaching concern):** 1 file
- step-07-build.md: 10.0K (monitor if additional features added)
**CSV Data Files:**
- Total CSV files: 0
- No data files present requiring validation
### Markdown Formatting Validation
**✅ Strengths:**
- Consistent frontmatter structure across all files
- Proper heading hierarchy (H1→H2→H3) maintained
- Standardized section patterns across all steps
- Proper code block formatting in 7 of 10 files
- Consistent bullet point usage throughout
**⚠️ Minor Issues:**
- File size range significant (2.9K to 10K) but all within acceptable limits
- step-07-build.md approaching concern threshold at 10K
### Performance Impact Assessment
**Overall workflow performance:** ✅ **Excellent**
- All files optimized for performance
- No files requiring immediate size optimization
- Well-structured maintainable codebase
- Professional markdown implementation
**Most critical file size issue:** None - all files within acceptable ranges
**Primary formatting concerns:** None significant - excellent consistency maintained
## Phase 4: Intent vs Prescriptive Spectrum Analysis
### Current Position Assessment
**Analyzed Position:** Balanced Middle (leaning prescriptive)
**Evidence:**
- Highly structured step files with mandatory execution rules
- Specific sequence enforcement and template compliance requirements
- Conversational partnership model within rigid structural constraints
- Limited creative adaptation but maintains collaborative dialogue
**Confidence Level:** High - Clear patterns in implementation demonstrate intentional structure
### Expert Recommendation
**Recommended Position:** Balanced Middle (slightly toward prescriptive)
**Reasoning:**
- Workflow creation needs systematic structure for BMAD compliance
- Template requirements demand prescriptive elements
- Creative aspects need room for user ownership
- Best workflows emerge from structured collaboration
**Workflow Type Considerations:**
- Primary purpose: Creating structured, repeatable workflows
- User expectations: Reliable, consistent BMAD-compliant outputs
- Success factors: Template compliance and systematic approach
- Risk level: Medium - compliance critical for ecosystem coherence
### User Decision
**Selected Position:** Option 1 - Keep Current Position (Balanced Middle leaning prescriptive)
**Rationale:** User prefers to maintain current structured approach
**Implementation Guidance:**
- Continue with current balance of structure and collaborative dialogue
- Maintain template compliance requirements
- Preserve systematic execution patterns
- Keep conversational elements within prescribed framework
### Spectrum Validation Results
✅ Spectrum position is intentional and understood
✅ User educated on implications of their choice
✅ Implementation guidance provided for maintaining position
✅ Decision documented for future reference
## Phase 5: Web Search & Subprocess Optimization Analysis
### Web Search Optimization
**Unnecessary Searches Identified:** 1
- Step 6 loads 5+ template files individually - these are static templates that rarely change
**Essential Searches to Keep:** 2
- CSV tool database in Step 3 (dynamic data)
- Reference workflow example in Step 2 (concrete patterns)
**Optimization Recommendations:**
- Implement template caching to eliminate repeated file loads
- Use selective CSV loading based on workflow type
**Estimated Time Savings:** 5-7 seconds per workflow execution
### Subprocess Optimization Opportunities
**Parallel Processing:** 2 major opportunities identified
1. **Step 3 + Step 5 Parallelization:** Tools configuration and output format design can run simultaneously
- Savings: 5-10 minutes per workflow
2. **Background Template Loading:** Pre-load templates during Step 1 idle time
- Savings: Eliminate design-phase delays
**Batch Processing:** 1 grouping opportunity
- Parallel file generation in Step 7 (workflow.md, step files, templates)
- Savings: 60-80% reduction in build time for multi-step workflows
**Background Processing:** 2 task opportunities
- Template pre-loading during initialization
- File generation coordination during build phase
**Performance Improvement:** 40-60% estimated overall improvement
### Resource Efficiency Analysis
**Context Optimization:**
- JIT context loading: 40-60% reduction in token usage
- Reference content deduplication: 8,000-12,000 token savings
- Step file size reduction: 30-50% smaller files
**LLM Resource Usage:**
- Smart context pruning by workflow phase
- Compact step instructions with external references
- Selective context loading based on current phase
**User Experience Impact:**
- Significantly faster workflow creation (15-25 minutes saved)
- More responsive interaction patterns
- Reduced waiting times during critical phases
### Implementation Recommendations
**Immediate Actions (High Impact, Low Risk):**
1. Implement template caching in workflow.md frontmatter
2. Optimize CSV loading with category filtering
3. Reduce step file sizes by moving examples to reference files
**Strategic Improvements (High Impact, Medium Risk):**
1. Parallelize Step 3 and Step 5 execution
2. Implement JIT context loading by phase
3. Background template pre-loading
**Future Enhancements (Highest Impact, Higher Risk):**
1. Parallel file generation with sub-process coordination
2. Smart context pruning across workflow phases
3. Complete reference deduplication system
## Phase 6: Holistic Workflow Analysis Results
### Flow Validation
**Completion Path Analysis:**
- ✅ All steps have clear continuation paths
- ✅ No orphaned steps or dead ends
- ⚠️ Minor issue: Steps 07 and 09 use non-standard menu patterns
**Sequential Logic:**
- ✅ Logical workflow creation progression maintained
- ✅ Dependencies properly structured
- ⚠️ Steps 05-06 could potentially be consolidated
### Goal Alignment
**Alignment Score:** 85%
**Stated Goal:** "Create structured, repeatable standalone workflows through collaborative conversation and step-by-step guidance"
**Actual Implementation:** Creates structured workflows with heavy emphasis on template compliance and systematic validation
**Gap Analysis:**
- Workflow emphasizes structure over creativity (aligned with spectrum choice)
- Template compliance heavier than user guidance (may need balance adjustment)
### Meta-Workflow Failure Analysis
**Issues That Should Have Been Prevented by create-workflow:**
1. Missing outputFile variables in all 9 steps (Critical)
2. Non-standard menu patterns in Steps 07 and 09 (Major)
3. Missing Task/Template/Data references across all steps (Major)
4. Path variable inconsistencies throughout workflow (Major)
5. Step naming violations for Steps 05-09 (Major)
6. Core Principles text deviation from template (Critical)
**Recommended Meta-Workflow Improvements:**
- Add frontmatter completeness validation during creation
- Implement path variable format checking
- Include menu pattern enforcement validation
- Add Intent vs Prescriptive spectrum selection in Step 01
- Validate template compliance before finalization
---
## Executive Summary
**Overall Compliance Status:** PARTIAL
**Critical Issues:** 17 - Must be fixed immediately
**Major Issues:** 36 - Significantly impacts quality/maintainability
**Minor Issues:** 27 - Standards compliance improvements
**Overall Compliance Score:** 68% based on template adherence
## Severity-Ranked Fix Recommendations
### IMMEDIATE - Critical (Must Fix for Functionality)
1. **Missing outputFile Variables** - Files: All 9 step files
- **Problem:** Critical frontmatter field missing from all steps
- **Template Reference:** step-template.md line 22
- **Fix:** Add `outputFile: '{output_folder}/workflow-plan-{project_name}.md'` to each step
- **Impact:** Workflow cannot produce output without this field
2. **Core Principles Deviation** - File: workflow.md
- **Problem:** Text modified from template standard
- **Template Reference:** workflow-template.md Core Principles section
- **Fix:** Replace with exact template wording
- **Impact:** Violates fundamental BMAD workflow architecture
3. **Non-Standard Menu Patterns** - Files: step-07-build.md, step-09-complete.md
- **Problem:** Custom menu formats instead of A/P/C pattern
- **Template Reference:** step-template.md lines 106-123
- **Fix:** Standardize to A/P/C menu pattern
- **Impact:** Breaks user experience consistency
### HIGH PRIORITY - Major (Significantly Impacts Quality)
1. **Missing Task/Template/Data References** - Files: All 9 step files
- **Problem:** Required frontmatter sections missing
- **Template Reference:** step-template.md lines 24-37
- **Fix:** Add all required reference sections with proper comments
- **Impact:** Violates template structure standards
2. **Step Naming Violations** - Files: steps 05-09
- **Problem:** Missing short descriptive names in step filenames
- **Template Reference:** step-template.md line 9
- **Fix:** Rename to include descriptive names (e.g., step-05-output-format.md)
- **Impact:** Inconsistent with BMAD naming conventions
3. **Path Variable Inconsistencies** - Files: All steps
- **Problem:** Mixed use of `{bmad_folder}` vs `.bmad`
- **Template Reference:** workflow-template.md path patterns
- **Fix:** Standardize to template variable patterns
- **Impact:** Installation flexibility and maintainability
### MEDIUM PRIORITY - Minor (Standards Compliance)
1. **Missing Section Titles** - Files: All steps
- **Problem:** Missing "CONTEXT BOUNDARIES" and "EXECUTION PROTOCOLS" titles
- **Template Reference:** step-template.md lines 75, 82
- **Fix:** Add missing section titles
- **Impact:** Template compliance
## Automated Fix Options
### Fixes That Can Be Applied Automatically
- Add outputFile variables to all step frontmatter
- Add missing section titles
- Standardize path variable usage
- Add Task/Template/Data reference section skeletons
### Fixes Requiring Manual Review
- Core Principles text restoration (needs exact template matching)
- Menu pattern standardization (custom logic may be intentional)
- Step renaming (requires file system changes and reference updates)
## Next Steps Recommendation
**Recommended Approach:**
1. Fix all Critical issues immediately (workflow may not function)
2. Address Major issues for reliability and maintainability
3. Implement Minor issues for full standards compliance
4. Update meta-workflows to prevent future violations
**Estimated Effort:**
- Critical fixes: 2-3 hours
- Major fixes: 4-6 hours
- Minor fixes: 1-2 hours

View File

@ -18,6 +18,20 @@ export default [
'test/fixtures/**/*.yaml',
'.bmad/**',
'.bmad*/**',
// Gitignored patterns
'z*/**', // z-samples, z1, z2, etc.
'.claude/**',
'.codex/**',
'.github/chatmodes/**',
'.agent/**',
'.agentvibes/**',
'.kiro/**',
'.roo/**',
'test-project-install/**',
'sample-project/**',
'tools/template-test-generator/test-scenarios/**',
'src/modules/*/sub-modules/**',
'.bundler-temp/**',
],
},

7
package-lock.json generated
View File

@ -98,7 +98,6 @@
"integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1",
@ -1841,7 +1840,6 @@
"integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
"devOptional": true,
"license": "MIT",
"peer": true,
"dependencies": {
"undici-types": "~7.10.0"
}
@ -2158,7 +2156,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@ -2520,7 +2517,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001735",
"electron-to-chromium": "^1.5.204",
@ -3410,7 +3406,6 @@
"integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.12.1",
@ -7498,7 +7493,6 @@
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@ -8331,7 +8325,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},

View File

@ -23,7 +23,11 @@ document_output_language:
default: "{communication_language}"
result: "{value}"
# This is the folder where all generated AI Output documents from workflows will default be sa
agent_sidecar_folder:
prompt: "Where should users agent sidecar memory folders be stored?"
default: ".bmad-user-memory"
result: "{project-root}/{value}"
output_folder:
prompt: "Where should AI Generated Artifacts be saved across all modules?"
default: "docs"

View File

@ -17,15 +17,15 @@ subheader: "Configure the settings for the BoMB Factory!\nThe agent, workflow an
custom_agent_location:
prompt: "Where do custom agents get created?"
default: "{bmad_folder}/custom/src/agents"
default: "bmad-custom-src/agents"
result: "{project-root}/{value}"
custom_workflow_location:
prompt: "Where do custom workflows get stored?"
default: "{bmad_folder}/custom/src/workflows"
default: "bmad-custom-src/workflows"
result: "{project-root}/{value}"
custom_module_location:
prompt: "Where do custom modules get stored?"
default: "{bmad_folder}/custom/src/modules"
default: "bmad-custom-src/modules"
result: "{project-root}/{value}"

View File

@ -29,22 +29,25 @@ agent:
- modules: "{project-root}/{bmad_folder}/bmb/docs/modules/kb.csv"
menu:
- multi: "[CA] Create, [EA] Edit, or [VA] Validate BMAD agents with best practices"
- multi: "[CA] Create, [EA] Edit, or [VA] Validate with Compliance CheckBMAD agents with best practices"
triggers:
- create-agent:
- input: CA or fuzzy match create agent
- route: "{project-root}/{bmad_folder}/bmb/workflows/create-agent/workflow.md"
- data: null
- type: exec
- edit-agent:
- input: EA or fuzzy match edit agent
- route: "{project-root}/{bmad_folder}/bmb/workflows/edit-agent/workflow.md"
- data: null
- type: exec
- run-agent-compliance-check:
- input: VA or fuzzy match validate agent
- route: "{project-root}/{bmad_folder}/bmb/workflows/agent-compliance-check/workflow.md"
- data: null
- type: exec
- multi: "[CW] Create, [EW] Edit, or [VW] Validate BMAD workflows with best practices"
- multi: "[CW] Create, [EW] Edit, or [VW] Validate with Compliance CheckBMAD workflows with best practices"
triggers:
- create-workflow:
- input: CW or fuzzy match create workflow
@ -62,10 +65,30 @@ agent:
- data: null
- type: exec
- trigger: create-module
workflow: "{project-root}/{bmad_folder}/bmb/workflows/create-module/workflow.yaml"
description: Create a complete BMAD compatible module (custom agents and workflows)
- trigger: edit-module
workflow: "{project-root}/{bmad_folder}/bmb/workflows/edit-module/workflow.yaml"
description: Edit existing modules (structure, agents, workflows, documentation)
- multi: "[BM] Brainstorm, [PBM] Product Brief, [CM] Create, [EM] Edit or [VM] Validate with Compliance Check BMAD modules with best practices"
triggers:
- brainstorm-module:
- input: BM or fuzzy match brainstorm module
- route: "{project-root}/{bmad_folder}/bmb/workflows/brainstorm-module/workflow.md"
- data: null
- type: exec
- product-brief-module:
- input: PBM or fuzzy match product brief module
- route: "{project-root}/{bmad_folder}/bmb/workflows/product-brief-module/workflow.md"
- data: null
- type: exec
- create-module:
- input: CM or fuzzy match create module
- route: "{project-root}/{bmad_folder}/bmb/workflows/create-module/workflow.md"
- data: null
- type: exec
- edit-module:
- input: EM or fuzzy match edit module
- route: "{project-root}/{bmad_folder}/bmb/workflows/edit-module/workflow.md"
- data: null
- type: exec
- run-module-compliance-check:
- input: VM or fuzzy match validate module
- route: "{project-root}/{bmad_folder}/bmb/workflows/module-compliance-check/workflow.md"
- data: null
- type: exec

View File

@ -375,7 +375,7 @@ exec: "../../../core/tasks/validate.xml"
- `{project-root}` - Project root directory
- `{bmad_folder}` - BMAD installation folder
- `{agent-folder}` - Agent installation directory (Expert agents)
- `{agent_sidecar_folder}` - Agent installation directory (Expert agents)
- `{output_folder}` - Document output location
- `{user_name}` - User's name from config
- `{communication_language}` - Language preference
@ -415,9 +415,9 @@ menu:
```yaml
critical_actions:
- 'Load {agent-folder}/memories.md'
- 'Follow {agent-folder}/instructions.md'
- 'ONLY access {agent-folder}/'
- 'Load ./memories.md'
- 'Follow ./instructions.md'
- 'ONLY access ./'
prompts:
- id: reflect
@ -431,7 +431,7 @@ menu:
description: 'Write journal entry'
- trigger: save
action: 'Update {agent-folder}/memories.md with session insights'
action: 'Update ./memories.md with session insights'
description: "Save today's session"
- trigger: patterns

View File

@ -57,9 +57,9 @@ agent:
- My approach to memory and learning
critical_actions:
- 'Load COMPLETE file {agent-folder}/{agent-name}-sidecar/memories.md and remember all past insights'
- 'Load COMPLETE file {agent-folder}/{agent-name}-sidecar/instructions.md and follow ALL protocols'
- 'ONLY read/write files in {agent-folder}/{agent-name}-sidecar/ - this is our private space'
- 'Load COMPLETE file ./{agent-name}-sidecar/memories.md and remember all past insights'
- 'Load COMPLETE file ./{agent-name}-sidecar/instructions.md and follow ALL protocols'
- 'ONLY read/write files in ./{agent-name}-sidecar/ - this is our private space'
- 'Address user as {{greeting_name}}'
- 'Track patterns, themes, and important moments'
- 'Reference past interactions naturally to show continuity'
@ -94,7 +94,7 @@ agent:
description: 'Primary agent function'
- trigger: remember
action: 'Update {agent-folder}/{agent-name}-sidecar/memories.md with session insights'
action: 'Update ./{agent-name}-sidecar/memories.md with session insights'
description: 'Save what we discussed today'
- trigger: patterns
@ -102,7 +102,7 @@ agent:
description: 'Recall patterns from past interactions'
- trigger: insight
action: 'Document breakthrough in {agent-folder}/{agent-name}-sidecar/breakthroughs.md'
action: 'Document breakthrough in ./{agent-name}-sidecar/breakthroughs.md'
description: 'Record a significant insight'
install_config:
@ -184,9 +184,9 @@ Add domain-specific documentation here.
```yaml
critical_actions:
- 'Load COMPLETE file {agent-folder}/{sidecar}/memories.md and remember all past insights'
- 'Load COMPLETE file {agent-folder}/{sidecar}/instructions.md and follow ALL protocols'
- 'ONLY read/write files in {agent-folder}/{sidecar}/ - this is our private space'
- 'Load COMPLETE file ./{sidecar}/memories.md and remember all past insights'
- 'Load COMPLETE file ./{sidecar}/instructions.md and follow ALL protocols'
- 'ONLY read/write files in ./{sidecar}/ - this is our private space'
```
**Key patterns:**
@ -196,7 +196,7 @@ critical_actions:
- **Memory integration** - Past context becomes part of current session
- **Protocol adherence** - Ensures consistent behavior
### {agent-folder} Variable
### {agent_sidecar_folder} Variable
Special variable resolved during installation:
@ -211,9 +211,9 @@ Same as simple agents, PLUS:
1. **Critical actions become numbered activation steps**
```xml
<step n="4">Load COMPLETE file {agent-folder}/memories.md...</step>
<step n="5">Load COMPLETE file {agent-folder}/instructions.md...</step>
<step n="6">ONLY read/write files in {agent-folder}/...</step>
<step n="4">Load COMPLETE file ./memories.md...</step>
<step n="5">Load COMPLETE file ./instructions.md...</step>
<step n="6">ONLY read/write files in ./...</step>
```
2. **Sidecar files copied during installation**
@ -260,7 +260,7 @@ The installer:
```yaml
menu:
- trigger: save
action: "Update {agent-folder}/sidecar/memories.md with today's session insights"
action: "Update ./sidecar/memories.md with today's session insights"
description: 'Save session to memory'
```
@ -281,7 +281,7 @@ prompts:
```yaml
menu:
- trigger: insight
action: 'Document in {agent-folder}/sidecar/breakthroughs.md with date, context, significance'
action: 'Document in ./sidecar/breakthroughs.md with date, context, significance'
description: 'Record meaningful insight'
```
@ -291,7 +291,7 @@ menu:
```yaml
critical_actions:
- 'ONLY read/write files in {agent-folder}/sidecar/ - NO OTHER FOLDERS'
- 'ONLY read/write files in ./sidecar/ - NO OTHER FOLDERS'
```
### User Space Access
@ -305,15 +305,15 @@ critical_actions:
```yaml
critical_actions:
- 'Load knowledge from {agent-folder}/knowledge/ but NEVER modify'
- 'Write ONLY to {agent-folder}/sessions/'
- 'Load knowledge from ./knowledge/ but NEVER modify'
- 'Write ONLY to ./sessions/'
```
## Best Practices
1. **Load sidecar files in critical_actions** - Must be explicit and MANDATORY
2. **Enforce domain restrictions** - Clear boundaries prevent scope creep
3. **Use {agent-folder} paths** - Portable across installations
3. **Use {agent_sidecar_folder} paths** - Portable across installations
4. **Design for memory growth** - Structure sidecar files for accumulation
5. **Reference past naturally** - Don't dump memory, weave it into conversation
6. **Separate concerns** - Memories, instructions, knowledge in distinct files
@ -356,8 +356,8 @@ identity: |
- [ ] Sidecar folder structure created and populated
- [ ] memories.md has clear section structure
- [ ] instructions.md contains core directives
- [ ] Menu actions reference {agent-folder} correctly
- [ ] File paths use {agent-folder} variable
- [ ] Menu actions reference {agent_sidecar_folder} correctly
- [ ] File paths use {agent_sidecar_folder} variable
- [ ] Install config personalizes sidecar references
- [ ] Agent folder named consistently: `{agent-name}/`
- [ ] YAML file named: `{agent-name}.agent.yaml`

View File

@ -27,7 +27,7 @@ Compiles to:
```yaml
agent:
metadata:
id: '{bmad_folder}/{module-code}/agents/{agent-name}.md'
id: '{*bmad_folder*}/{module-code}/agents/{agent-name}.md'
name: 'Persona Name'
title: 'Professional Title'
icon: 'emoji'
@ -41,29 +41,29 @@ agent:
menu:
- trigger: workflow-action
workflow: '{project-root}/{bmad_folder}/{module-code}/workflows/{workflow-name}/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/{module-code}/workflows/{workflow-name}/workflow.yaml'
description: 'Execute module workflow'
- trigger: another-workflow
workflow: '{project-root}/{bmad_folder}/core/workflows/{workflow-name}/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/core/workflows/{workflow-name}/workflow.yaml'
description: 'Execute core workflow'
- trigger: task-action
exec: '{project-root}/{bmad_folder}/{module-code}/tasks/{task-name}.xml'
exec: '{project-root}/{*bmad_folder*}/{module-code}/tasks/{task-name}.xml'
description: 'Execute module task'
- trigger: cross-module
workflow: '{project-root}/{bmad_folder}/other-module/workflows/{workflow-name}/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/other-module/workflows/{workflow-name}/workflow.yaml'
description: 'Execute workflow from another module'
- trigger: with-template
exec: '{project-root}/{bmad_folder}/core/tasks/create-doc.xml'
tmpl: '{project-root}/{bmad_folder}/{module-code}/templates/{template-name}.md'
exec: '{project-root}/{*bmad_folder*}/core/tasks/create-doc.xml'
tmpl: '{project-root}/{*bmad_folder*}/{module-code}/templates/{template-name}.md'
description: 'Create document from template'
- trigger: with-data
exec: '{project-root}/{bmad_folder}/{module-code}/tasks/{task-name}.xml'
data: '{project-root}/{bmad_folder}/_cfg/agent-manifest.csv'
exec: '{project-root}/{*bmad_folder*}/{module-code}/tasks/{task-name}.xml'
data: '{project-root}/{*bmad_folder*}/_cfg/agent-manifest.csv'
description: 'Execute task with data file'
```
@ -71,7 +71,7 @@ agent:
### Metadata
- **id**: Path with `{bmad_folder}` variable (resolved at install time)
- **id**: Path with `{*bmad_folder*}` variable (resolved at install time)
- **name**: Agent persona name
- **title**: Professional role
- **icon**: Single emoji
@ -101,7 +101,7 @@ persona:
```yaml
menu:
- trigger: create-prd
workflow: '{project-root}/{bmad_folder}/bmm/workflows/prd/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/prd/workflow.yaml'
description: 'Create Product Requirements Document'
```
@ -112,7 +112,7 @@ Invokes BMAD workflow engine to execute multi-step processes.
```yaml
menu:
- trigger: validate
exec: '{project-root}/{bmad_folder}/core/tasks/validate-workflow.xml'
exec: '{project-root}/{*bmad_folder*}/core/tasks/validate-workflow.xml'
description: 'Validate document structure'
```
@ -123,8 +123,8 @@ Executes single-operation tasks.
```yaml
menu:
- trigger: create-brief
exec: '{project-root}/{bmad_folder}/core/tasks/create-doc.xml'
tmpl: '{project-root}/{bmad_folder}/bmm/templates/brief.md'
exec: '{project-root}/{*bmad_folder*}/core/tasks/create-doc.xml'
tmpl: '{project-root}/{*bmad_folder*}/bmm/templates/brief.md'
description: 'Create a Product Brief from template'
```
@ -135,8 +135,8 @@ Combines task execution with template file.
```yaml
menu:
- trigger: team-standup
exec: '{project-root}/{bmad_folder}/bmm/tasks/standup.xml'
data: '{project-root}/{bmad_folder}/_cfg/agent-manifest.csv'
exec: '{project-root}/{*bmad_folder*}/bmm/tasks/standup.xml'
data: '{project-root}/{*bmad_folder*}/_cfg/agent-manifest.csv'
description: 'Run team standup with agent roster'
```
@ -160,12 +160,12 @@ Control visibility based on platform:
```yaml
menu:
- trigger: advanced-elicitation
exec: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
exec: '{project-root}/{*bmad_folder*}/core/tasks/advanced-elicitation.xml'
description: 'Advanced elicitation techniques'
web-only: true # Only shows in web bundle
- trigger: git-operations
exec: '{project-root}/{bmad_folder}/bmm/tasks/git-flow.xml'
exec: '{project-root}/{*bmad_folder*}/bmm/tasks/git-flow.xml'
description: 'Git workflow operations'
ide-only: true # Only shows in IDE environments
```
@ -175,7 +175,7 @@ menu:
### Core Variables
- `{project-root}` - Root directory of installed project
- `{bmad_folder}` - BMAD installation folder (usually `.bmad`)
- `{*bmad_folder*}` - BMAD installation folder (usually `.bmad`)
- `{user_name}` - User's name from module config
- `{communication_language}` - Language preference
- `{output_folder}` - Document output directory
@ -186,7 +186,7 @@ menu:
```yaml
# GOOD
workflow: "{project-root}/{bmad_folder}/bmm/workflows/prd/workflow.yaml"
workflow: "{project-root}/{*bmad_folder*}/bmm/workflows/prd/workflow.yaml"
# BAD
workflow: "/Users/john/project/.bmad/bmm/workflows/prd/workflow.yaml"
@ -208,7 +208,7 @@ Module agents use the same injection process as simple agents:
**Key difference:** Module agents load **module-specific config** instead of core config:
```xml
<step n="2">Load and read {project-root}/{bmad_folder}/{module}/config.yaml...</step>
<step n="2">Load and read {project-root}/{*bmad_folder*}/{module}/config.yaml...</step>
```
## Reference Examples
@ -252,15 +252,15 @@ Agents load this at activation for consistent behavior.
```yaml
menu:
- trigger: init
workflow: '{project-root}/{bmad_folder}/bmm/workflows/workflow-init/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/workflow-init/workflow.yaml'
description: 'Initialize workflow path (START HERE)'
- trigger: status
workflow: '{project-root}/{bmad_folder}/bmm/workflows/workflow-status/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/workflow-status/workflow.yaml'
description: 'Check current workflow status'
- trigger: next-step
workflow: '{project-root}/{bmad_folder}/bmm/workflows/next-step/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/next-step/workflow.yaml'
description: 'Execute next workflow in sequence'
```
@ -270,20 +270,20 @@ menu:
menu:
# Phase 1: Analysis
- trigger: brainstorm
workflow: '{project-root}/{bmad_folder}/bmm/workflows/1-analysis/brainstorm/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/1-analysis/brainstorm/workflow.yaml'
description: 'Guided brainstorming session'
- trigger: research
workflow: '{project-root}/{bmad_folder}/bmm/workflows/1-analysis/research/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/1-analysis/research/workflow.yaml'
description: 'Market and technical research'
# Phase 2: Planning
- trigger: prd
workflow: '{project-root}/{bmad_folder}/bmm/workflows/2-planning/prd/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/2-planning/prd/workflow.yaml'
description: 'Create PRD'
- trigger: architecture
workflow: '{project-root}/{bmad_folder}/bmm/workflows/2-planning/architecture/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/2-planning/architecture/workflow.yaml'
description: 'Design architecture'
```
@ -292,17 +292,17 @@ menu:
```yaml
menu:
- trigger: party-mode
workflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/core/workflows/party-mode/workflow.yaml'
description: 'Bring all agents together'
- trigger: brainstorm
workflow: '{project-root}/{bmad_folder}/cis/workflows/brainstorming/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/cis/workflows/brainstorming/workflow.yaml'
description: 'Use CIS brainstorming techniques'
```
## Best Practices
1. **Use {bmad_folder} paths** - Portable across installations
1. **Use {_bmad_folder_} paths** - Portable across installations
2. **Organize workflows by phase** - Clear progression for users
3. **Include workflow-status** - Help users track progress
4. **Reference module config** - Consistent behavior
@ -318,7 +318,7 @@ menu:
```yaml
menu:
- trigger: start
workflow: '{project-root}/{bmad_folder}/{module}/workflows/init/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/{module}/workflows/init/workflow.yaml'
description: 'Start new project (BEGIN HERE)'
```
@ -327,7 +327,7 @@ menu:
```yaml
menu:
- trigger: status
workflow: '{project-root}/{bmad_folder}/{module}/workflows/status/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/{module}/workflows/status/workflow.yaml'
description: 'Check workflow progress'
```
@ -336,27 +336,27 @@ menu:
```yaml
menu:
- trigger: party
workflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.yaml'
workflow: '{project-root}/{*bmad_folder*}/core/workflows/party-mode/workflow.yaml'
description: 'Multi-agent discussion'
```
## Module Agent vs Simple/Expert
| Aspect | Module Agent | Simple/Expert Agent |
| ------------- | -------------------------------- | ------------------------------- |
| Location | `{bmad_folder}/{module}/agents/` | `{bmad_folder}/custom/agents/` |
| Persona | Fixed, professional | Customizable via install_config |
| Handlebars | No templating | Yes, extensive |
| Menu actions | Workflows, tasks, templates | Prompts, inline actions |
| Configuration | Module config.yaml | Core config or none |
| Purpose | Professional tooling | Personal utilities |
| Aspect | Module Agent | Simple/Expert Agent |
| ------------- | ---------------------------------- | -------------------------------- |
| Location | `{*bmad_folder*}/{module}/agents/` | `{*bmad_folder*}/custom/agents/` |
| Persona | Fixed, professional | Customizable via install_config |
| Handlebars | No templating | Yes, extensive |
| Menu actions | Workflows, tasks, templates | Prompts, inline actions |
| Configuration | Module config.yaml | Core config or none |
| Purpose | Professional tooling | Personal utilities |
## Validation Checklist
- [ ] Valid YAML syntax
- [ ] Metadata includes `module: "{module-code}"`
- [ ] id uses `{bmad_folder}/{module}/agents/{name}.md`
- [ ] All workflow paths use `{project-root}/{bmad_folder}/` prefix
- [ ] id uses `{*bmad_folder*}/{module}/agents/{name}.md`
- [ ] All workflow paths use `{project-root}/{*bmad_folder*}/` prefix
- [ ] No hardcoded paths
- [ ] No duplicate triggers
- [ ] Each menu item has description

View File

@ -51,7 +51,7 @@ menu:
# Direct sidecar file action
- trigger: 'insight'
action: 'Document this breakthrough in {agent-folder}/journal-keeper-sidecar/breakthroughs.md'
action: 'Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md'
description: 'Record a meaningful insight'
```
@ -63,9 +63,9 @@ Expert Agents MUST load sidecar files explicitly:
```yaml
critical_actions:
- 'Load COMPLETE file {agent-folder}/journal-keeper-sidecar/memories.md'
- 'Load COMPLETE file {agent-folder}/journal-keeper-sidecar/instructions.md'
- 'ONLY read/write files in {agent-folder}/journal-keeper-sidecar/'
- 'Load COMPLETE file ./journal-keeper-sidecar/memories.md'
- 'Load COMPLETE file ./journal-keeper-sidecar/instructions.md'
- 'ONLY read/write files in ./journal-keeper-sidecar/'
```
**Key points:**

View File

@ -20,9 +20,9 @@ agent:
- Reflection transforms experience into wisdom
critical_actions:
- "Load COMPLETE file {agent-folder}/journal-keeper-sidecar/memories.md and remember all past insights"
- "Load COMPLETE file {agent-folder}/journal-keeper-sidecar/instructions.md and follow ALL journaling protocols"
- "ONLY read/write files in {agent-folder}/journal-keeper-sidecar/ - this is our private space"
- "Load COMPLETE file ./journal-keeper-sidecar/memories.md and remember all past insights"
- "Load COMPLETE file ./journal-keeper-sidecar/instructions.md and follow ALL journaling protocols"
- "ONLY read/write files in ./journal-keeper-sidecar/ - this is our private space"
- "Track mood patterns, recurring themes, and breakthrough moments"
- "Reference past entries naturally to show continuity"
@ -120,7 +120,7 @@ agent:
description: "Write today's journal entry"
- trigger: quick
action: "Save a quick, unstructured entry to {agent-folder}/journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed"
action: "Save a quick, unstructured entry to ./journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed"
description: "Quick capture without prompts"
- trigger: mood
@ -133,20 +133,20 @@ agent:
- trigger: gratitude
action: "#gratitude-moment"
description: "Capture today's gratitudes"
description: "Capture today's gratitude"
- trigger: weekly
action: "#weekly-reflection"
description: "Reflect on the past week"
- trigger: insight
action: "Document this breakthrough in {agent-folder}/journal-keeper-sidecar/breakthroughs.md with date and significance"
action: "Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md with date and significance"
description: "Record a meaningful insight"
- trigger: read-back
action: "Load and share entries from {agent-folder}/journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth"
action: "Load and share entries from ./journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth"
description: "Review past entries"
- trigger: save
action: "Update {agent-folder}/journal-keeper-sidecar/memories.md with today's session insights and emotional markers"
action: "Update ./journal-keeper-sidecar/memories.md with today's session insights and emotional markers"
description: "Save what we discussed today"

View File

@ -10,7 +10,7 @@
agent:
metadata:
id: "{bmad_folder}/bmm/agents/security-engineer.md"
id: "{*bmad_folder*}/bmm/agents/security-engineer.md"
name: "Sam"
title: "Security Engineer"
icon: "🔐"
@ -32,22 +32,22 @@ agent:
menu:
# NOTE: These workflows are hypothetical examples assuming add to a module called bmm - not implemented
- trigger: threat-model
workflow: "{project-root}/{bmad_folder}/bmm/workflows/threat-model/workflow.yaml"
exec: "{project-root}/{*bmad_folder*}/bmm/workflows/threat-model/workflow.md"
description: "Create STRIDE threat model for architecture"
- trigger: security-review
workflow: "{project-root}/{bmad_folder}/bmm/workflows/security-review/workflow.yaml"
exec: "{project-root}/{*bmad_folder*}/bmm/workflows/security-review/workflow.md"
description: "Review code/design for security issues"
- trigger: owasp-check
exec: "{project-root}/{bmad_folder}/bmm/tasks/owasp-top-10.xml"
TODO: true
description: "Check against OWASP Top 10"
- trigger: compliance
workflow: "{project-root}/{bmad_folder}/bmm/workflows/compliance-check/workflow.yaml"
exec: "{project-root}/{*bmad_folder*}/bmm/workflows/compliance-check/workflow.md"
description: "Verify compliance requirements (SOC2, GDPR, etc.)"
# Core workflow that exists
- trigger: party-mode
exec: "{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md"
exec: "{project-root}/{*bmad_folder*}/core/workflows/party-mode/workflow.md"
description: "Multi-agent security discussion"

View File

@ -10,7 +10,7 @@
agent:
metadata:
id: "{bmad_folder}/cis/agents/trend-analyst.md"
id: "{*bmad_folder*}/cis/agents/trend-analyst.md"
name: "Nova"
title: "Trend Analyst"
icon: "📈"
@ -32,26 +32,26 @@ agent:
menu:
# NOTE: These workflows are hypothetical examples - not implemented
- trigger: scan-trends
workflow: "{project-root}/{bmad_folder}/cis/workflows/trend-scan/workflow.yaml"
exec: "{project-root}/{*bmad_folder*}/cis/workflows/trend-scan/workflow.md"
description: "Scan for emerging trends in a domain"
- trigger: analyze-trend
workflow: "{project-root}/{bmad_folder}/cis/workflows/trend-analysis/workflow.yaml"
exec: "{project-root}/{*bmad_folder*}/cis/workflows/trend-analysis/workflow.md"
description: "Deep dive on a specific trend"
- trigger: opportunity-map
workflow: "{project-root}/{bmad_folder}/cis/workflows/opportunity-mapping/workflow.yaml"
exec: "{project-root}/{*bmad_folder*}/cis/workflows/opportunity-mapping/workflow.md"
description: "Map trend to strategic opportunities"
- trigger: competitor-trends
exec: "{project-root}/{bmad_folder}/cis/tasks/competitor-trend-watch.xml"
exec: "{project-root}/{*bmad_folder*}/cis/tasks/competitor-trend-watch.xml"
description: "Monitor competitor trend adoption"
# Core workflows that exist
- trigger: brainstorm
workflow: "{project-root}/{bmad_folder}/core/workflows/brainstorming/workflow.yaml"
exec: "{project-root}/{*bmad_folder*}/core/workflows/brainstorming/workflow.md"
description: "Brainstorm trend implications"
- trigger: party-mode
exec: "{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md"
exec: "{project-root}/{*bmad_folder*}/core/workflows/party-mode/workflow.md"
description: "Discuss trends with other agents"

View File

@ -1,235 +0,0 @@
# Build Module Validation Checklist
## Module Identity and Metadata
### Basic Information
- [ ] Module code follows kebab-case convention (e.g., "rpg-toolkit")
- [ ] Module name is descriptive and title-cased
- [ ] Module purpose is clearly defined (1-2 sentences)
- [ ] Target audience is identified
- [ ] Version number follows semantic versioning (e.g., "1.0.0")
- [ ] Author information is present
### Naming Consistency
- [ ] Module code used consistently throughout all files
- [ ] No naming conflicts with existing modules
- [ ] All paths use consistent module code references
## Directory Structure
### Source Directories ({bmad_folder}/{module-code}/)
- [ ] `/agents` directory created (even if empty)
- [ ] `/workflows` directory created (even if empty)
- [ ] `/tasks` directory exists (if tasks planned)
- [ ] `/templates` directory exists (if templates used)
- [ ] `/data` directory exists (if data files needed)
- [ ] `/_module-installer/install-config.yaml` present (defines configuration questions)
- [ ] `README.md` present with documentation
### Installed Module Structure (generated in target after installation)
- [ ] `/agents` directory for compiled agents
- [ ] `/workflows` directory for workflow instances
- [ ] `/data` directory for user data
- [ ] `config.yaml` generated from install-config.yaml during installation
## Component Planning
### Agents
- [ ] At least one agent defined or planned
- [ ] Agent purposes are distinct and clear
- [ ] Agent types (Simple/Expert/Module) identified
- [ ] No significant overlap between agents
- [ ] Primary agent is identified
### Workflows
- [ ] At least one workflow defined or planned
- [ ] Workflow purposes are clear
- [ ] Workflow types identified (Document/Action/Interactive)
- [ ] Primary workflow is identified
- [ ] Workflow complexity is appropriate
### Tasks (if applicable)
- [ ] Tasks have single, clear purposes
- [ ] Tasks don't duplicate workflow functionality
- [ ] Task files follow naming conventions
## Configuration Files
### Installation Configuration (install-config.yaml)
- [ ] `install-config.yaml` exists in `_module-installer`
- [ ] Module metadata present (code, name, version)
- [ ] Configuration questions defined for user input
- [ ] Default values provided for all questions
- [ ] Prompt text is clear and helpful
- [ ] Result templates use proper variable substitution
- [ ] Paths use proper variables ({project-root}, {value}, etc.)
### Generated Config (config.yaml in target)
- [ ] Generated during installation from install-config.yaml
- [ ] Contains all user-provided configuration values
- [ ] Module metadata included
- [ ] No config.yaml should exist in source module
## Installation Infrastructure
### Installer Files
- [ ] Install configuration validates against schema
- [ ] All source paths exist or are marked as templates
- [ ] Destination paths use correct variables
- [ ] Optional vs required steps clearly marked
### installer.js (if present)
- [ ] Main `installModule` function exists
- [ ] Error handling implemented
- [ ] Console logging for user feedback
- [ ] Exports correct function names
- [ ] Placeholder code replaced with actual logic (or logged as TODO)
### External Assets (if any)
- [ ] Asset files exist in assets directory
- [ ] Copy destinations are valid
- [ ] Permissions requirements documented
## Documentation
### README.md
- [ ] Module overview section present
- [ ] Installation instructions included
- [ ] Component listing with descriptions
- [ ] Quick start guide provided
- [ ] Configuration options documented
- [ ] At least one usage example
- [ ] Directory structure shown
- [ ] Author and date information
### Component Documentation
- [ ] Each agent has purpose documentation
- [ ] Each workflow has description
- [ ] Tasks are documented (if present)
- [ ] Examples demonstrate typical usage
### Development Roadmap
- [ ] TODO.md or roadmap section exists
- [ ] Planned components listed
- [ ] Development phases identified
- [ ] Quick commands for adding components
## Integration
### Cross-component References
- [ ] Agents reference correct workflow paths
- [ ] Workflows reference correct task paths
- [ ] All internal paths use module variables
- [ ] External dependencies declared
### Module Boundaries
- [ ] Module scope is well-defined
- [ ] No feature creep into other domains
- [ ] Clear separation from other modules
## Quality Checks
### Completeness
- [ ] At least one functional component (not all placeholders)
- [ ] Core functionality is implementable
- [ ] Module provides clear value
### Consistency
- [ ] Formatting consistent across files
- [ ] Variable naming follows conventions
- [ ] Communication style appropriate for domain
### Scalability
- [ ] Structure supports future growth
- [ ] Component organization is logical
- [ ] No hard-coded limits
## Testing and Validation
### Structural Validation
- [ ] YAML files parse without errors
- [ ] JSON files (if any) are valid
- [ ] XML files (if any) are well-formed
- [ ] No syntax errors in JavaScript files
### Path Validation
- [ ] All referenced paths exist or are clearly marked as TODO
- [ ] Variable substitutions are correct
- [ ] No absolute paths (unless intentional)
### Installation Testing
- [ ] Installation steps can be simulated
- [ ] No circular dependencies
- [ ] Uninstall process defined (if complex)
## Final Checks
### Ready for Use
- [ ] Module can be installed without errors
- [ ] At least one component is functional
- [ ] User can understand how to get started
- [ ] Next steps are clear
### Professional Quality
- [ ] No placeholder text remains (unless marked TODO)
- [ ] No obvious typos or grammar issues
- [ ] Professional tone throughout
- [ ] Contact/support information provided
## Issues Found
### Critical Issues
<!-- List any issues that MUST be fixed before module can be used -->
### Warnings
<!-- List any issues that should be addressed but won't prevent basic usage -->
### Improvements
<!-- List any optional enhancements that would improve the module -->
### Missing Components
<!-- List any planned components not yet implemented -->
## Module Complexity Assessment
### Complexity Rating
- [ ] Simple (1-2 agents, 2-3 workflows)
- [ ] Standard (3-5 agents, 5-10 workflows)
- [ ] Complex (5+ agents, 10+ workflows)
### Readiness Level
- [ ] Prototype (Basic structure, mostly placeholders)
- [ ] Alpha (Core functionality works)
- [ ] Beta (Most features complete, needs testing)
- [ ] Release (Full functionality, documented)

View File

@ -145,8 +145,8 @@ For modules that need workflows from other modules but want to remain standalone
```yaml
menu:
- trigger: command-name
workflow: '{project-root}/{bmad_folder}/SOURCE_MODULE/workflows/path/workflow.yaml'
workflow-install: '{project-root}/{bmad_folder}/THIS_MODULE/workflows/vendored/workflow.yaml'
exec: '{project-root}/{bmad_folder}/SOURCE_MODULE/workflows/path/workflow.md'
workflow-install: '{project-root}/{bmad_folder}/THIS_MODULE/workflows/vendored/workflow.md'
description: 'Command description'
```

View File

@ -51,7 +51,7 @@ menu:
# Direct sidecar file action
- trigger: 'insight'
action: 'Document this breakthrough in {agent-folder}/journal-keeper-sidecar/breakthroughs.md'
action: 'Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md'
description: 'Record a meaningful insight'
```
@ -63,9 +63,9 @@ Expert Agents MUST load sidecar files explicitly:
```yaml
critical_actions:
- 'Load COMPLETE file {agent-folder}/journal-keeper-sidecar/memories.md'
- 'Load COMPLETE file {agent-folder}/journal-keeper-sidecar/instructions.md'
- 'ONLY read/write files in {agent-folder}/journal-keeper-sidecar/'
- 'Load COMPLETE file ./journal-keeper-sidecar/memories.md'
- 'Load COMPLETE file ./journal-keeper-sidecar/instructions.md'
- 'ONLY read/write files in ./journal-keeper-sidecar/'
```
**Key points:**

View File

@ -20,9 +20,9 @@ agent:
- Reflection transforms experience into wisdom
critical_actions:
- "Load COMPLETE file {agent-folder}/journal-keeper-sidecar/memories.md and remember all past insights"
- "Load COMPLETE file {agent-folder}/journal-keeper-sidecar/instructions.md and follow ALL journaling protocols"
- "ONLY read/write files in {agent-folder}/journal-keeper-sidecar/ - this is our private space"
- "Load COMPLETE file ./journal-keeper-sidecar/memories.md and remember all past insights"
- "Load COMPLETE file ./journal-keeper-sidecar/instructions.md and follow ALL journaling protocols"
- "ONLY read/write files in ./journal-keeper-sidecar/ - this is our private space"
- "Track mood patterns, recurring themes, and breakthrough moments"
- "Reference past entries naturally to show continuity"
@ -120,7 +120,7 @@ agent:
description: "Write today's journal entry"
- trigger: quick
action: "Save a quick, unstructured entry to {agent-folder}/journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed"
action: "Save a quick, unstructured entry to ./journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed"
description: "Quick capture without prompts"
- trigger: mood
@ -140,13 +140,13 @@ agent:
description: "Reflect on the past week"
- trigger: insight
action: "Document this breakthrough in {agent-folder}/journal-keeper-sidecar/breakthroughs.md with date and significance"
action: "Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md with date and significance"
description: "Record a meaningful insight"
- trigger: read-back
action: "Load and share entries from {agent-folder}/journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth"
action: "Load and share entries from ./journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth"
description: "Review past entries"
- trigger: save
action: "Update {agent-folder}/journal-keeper-sidecar/memories.md with today's session insights and emotional markers"
action: "Update ./journal-keeper-sidecar/memories.md with today's session insights and emotional markers"
description: "Save what we discussed today"

View File

@ -0,0 +1,155 @@
---
nextStepFile: '{installed_path}/steps/step-02-concept.md'
continueFile: '{installed_path}/steps/step-01b-continue.md'
modulePlanTemplate: '{installed_path}/templates/module-plan.template.md'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
customModuleLocation: '{custom_module_location}'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
---
# Step 1: Workflow Initialization
## STEP GOAL:
To initialize the create-module workflow by getting the module name from the user, checking for existing work, handling continuation if needed, and creating the initial module plan document.
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and BMAD Systems Specialist
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD architecture and module creation, user brings their module requirements
- ✅ Maintain collaborative, guiding tone throughout
### Step-Specific Rules:
- 🎯 Focus ONLY on initialization, getting module name, and setting up tracking
- 🚫 FORBIDDEN to look ahead to future steps
- 💬 Handle initialization professionally
- 🚪 DETECT existing workflow state and handle continuation properly
## EXECUTION PROTOCOLS:
- 🎯 Show analysis before taking any action
- 💾 Initialize document and update frontmatter
- 📖 Set up frontmatter `stepsCompleted: [1]` before loading next step
- 🚫 FORBIDDEN to load next step until setup is complete
## CONTEXT BOUNDARIES:
- Variables from workflow.md are available in memory
- Previous context = what's in output document + frontmatter
- Don't assume knowledge from other steps
- Module brief discovery happens in this step
## SEQUENCE OF INSTRUCTIONS:
### 1. Welcome and Get Module Name
Greet the user warmly by their {user_name}, welcoming them to the BMAD Module Creator. Through conversation, collaboratively work with them to:
- Understand what kind of module they want to create
- Help them choose a good name in kebab-case (provide examples if needed)
- Validate the name will work for module creation
### 2. Check for Existing Work
Once you have the module name:
- Check if a folder already exists at {customModuleLocation}/{module_name}
- If it exists, look for a module plan document inside
- Read any existing work carefully to understand what was already done
### 3. Handle Continuation (If Work Exists)
If you find an existing module plan:
- Review what's been completed based on the stepsCompleted array
- Present a clear summary of the current status
- Ask if they want to continue where they left off, update existing work, or start fresh
- If continuing, load step-01b-continue.md
### 4. Look for Supporting Documents
Check for any existing documents that could help:
- Module briefs in the module folder or output folder
- Brainstorming results in the output folder
- Any other relevant documentation
### 5. Guide User's Next Decision
If no supporting documents are found:
- Explain their three options clearly and helpfully
- Option 1: Proceed with creating the module based on their ideas
- Option 2: Exit and create a module brief first (explain the module-brief workflow)
- Option 3: Exit and do brainstorming first (explain the brainstorming workflow)
- Support whatever choice they make
### 6. Create Module Foundation
If proceeding:
- Create the module folder if needed
- Create the initial module-plan-{module_name}.md document using the module plan template from {modulePlanTemplate}
- Initialize proper frontmatter with current date, user name, and add "step-01-init" to stepsCompleted array
- Add any discovered documents to inputDocuments field
- Include a brief section about the legacy reference
### 7. Prepare for Next Step
- Confirm everything is set up properly
- Let the user know what you've accomplished
- Transition smoothly to the next phase of defining the module concept
### 8. Present MENU OPTIONS
Display: **Proceeding to define your module concept...**
#### EXECUTION RULES:
- This is an initialization step with no user choices (after inputs handled)
- Proceed directly to next step after setup
- Use menu handling logic section below
#### Menu Handling Logic:
- After setup completion, add step-01-init to the end of the stepsCompleted array in module plan frontmatter, then load, read entire file, then execute `{nextStepFile}` to define the module concept
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- Module name obtained and validated through collaborative dialogue
- Module plan document created from template with frontmatter initialized
- "step-01-init" added to stepsCompleted array
- Module plan document created at correct location
- User feels welcomed and informed
- Ready to proceed to step 2
- OR existing workflow properly routed to step-01b-continue.md
### ❌ SYSTEM FAILURE:
- Proceeding with step 2 without module plan creation
- Not checking for existing documents properly
- Creating module without user input on name
- Skipping folder creation
- Not routing to step-01b-continue.md when appropriate
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN initialization setup is complete and module plan document is created (OR continuation is properly routed), will you then immediately load, read entire file, then execute `{nextStepFile}` to begin defining the module concept.

View File

@ -0,0 +1,169 @@
---
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
---
# Step 1b: Continue Module Creation
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and BMAD Systems Specialist
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD architecture and module creation, user brings their module requirements
- ✅ Maintain collaborative, guiding tone throughout
### Step-Specific Rules:
- 🎯 Focus ONLY on handling continuation and resuming workflow
- 🚫 FORBIDDEN to modify existing work without user consent
- 💬 Present status clearly and get user direction
- 📋 Track completion status accurately
## EXECUTION PROTOCOLS:
- 🎯 Load and analyze existing module plan
- 💾 Update frontmatter with continuation status
- 📖 Route to appropriate next step based on progress
- 🚫 FORBIDDEN to skip steps just because they exist
## CONTEXT BOUNDARIES:
- Module plan document exists with previous work
- Focus on understanding what's been done and what remains
- Don't assume completion without verification
- User direction guides next actions
## STEP GOAL:
To resume module creation by presenting current status, understanding what's been accomplished, and determining the next step in the process.
## CONTINUATION HANDLING SEQUENCE:
### 1. Load and Analyze Existing Module Plan
Load module plan from: {modulePlanFile}
Read entire document including frontmatter
Extract current status from frontmatter fields:
- stepsCompleted array
- lastStep (the final item in the stepsCompleted array)
- module_name
- module_code
- date
- inputDocuments
### 2. Present Current Status
"Welcome back! I found your in-progress module creation for **{module_name}**.
**Current Status:**
- **Module Code:** {module_code}
- **Started:** {date}
- **Last Step:** {lastStep}
- **Steps Completed:** {stepsCompleted count}/{total steps}
- **Location:** {custom_module_location}/{module_name}
\*\*Progress Summary:"
Based on stepsCompleted, show:
- [✅] Step 1: Init - Complete
- [ ] Step 2: Concept - {status}
- [ ] Step 3: Components - {status}
- [ ] Step 4: Structure - {status}
- [ ] Step 5: Configuration - {status}
- [ ] Step 6: Agents - {status}
- [ ] Step 7: Workflows - {status}
- [ ] Step 8: Installer - {status}
- [ ] Step 9: Documentation - {status}
- [ ] Step 10: Roadmap - {status}
- [ ] Step 11: Validation - {status}
### 3. Review What's Been Done
Read content sections of module plan
Summarize what's been accomplished:
"**Completed Work:**
- Module identity defined
- Component planning complete
- [Other completed items based on content]"
### 4. Determine Next Step
Based on stepsCompleted array:
Find highest completed step number
Next step = highest completed + 1
"**Ready to Continue:**
Your next step would be: **Step {nextStep} - [step name]**
What would you like to do?
1. **Continue** from where you left off
2. **Review** what's been done so far
3. **Modify** previous work
4. **Start over** with a new plan"
### 5. Handle User Choice
User your best judgement in how to handle the users choice
### 6. Update Continuation Status
Update modulePlanFile frontmatter:
- Set lastStep: 'continued'
- Add note about continuation date
- Keep stepsCompleted unchanged
## ✅ SUCCESS METRICS:
- User understands current progress
- Next step identified correctly
- User choice handled appropriately
- Module plan updated with continuation status
- Workflow resumed at correct location
## ❌ FAILURE MODES TO AVOID:
- Not accurately reading previous status
- Skipping steps just because they exist
- Not offering review option
- Losing previous work
- Not updating continuation tracking
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- Existing work properly loaded and analyzed
- User clearly understands current status
- Continuation options presented clearly
- Next step determined correctly
- Module plan updated with continuation information
### ❌ SYSTEM FAILURE:
- Not reading existing plan completely
- Misrepresenting progress status
- Losing track of what's been done
- Not offering appropriate continuation options
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN user selects 'C' (Continue) and appropriate updates are saved to modulePlanFile, will you then load, read entire file, then execute the determined next step file to resume the module creation workflow.

View File

@ -0,0 +1,217 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-03-components.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
moduleStructureGuide: '{project-root}/src/modules/bmb/workflows-legacy/create-module/module-structure.md'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 2: Define Module Concept and Scope
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Business Analyst
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in module design and BMAD patterns, user brings their domain knowledge
- ✅ Maintain collaborative, educational tone
### Step-Specific Rules:
- 🎯 Focus ONLY on defining the module concept and scope
- 🚫 FORBIDDEN to start designing components in this step
- 💬 Ask questions conversationally to understand vision
- 🚫 FORBIDDEN to proceed without clear module identity
## EXECUTION PROTOCOLS:
- 🎯 Load and study module structure guide for context
- 💾 Document all module identity details in plan
- 📖 Add "step-02-concept" to stepsCompleted array` before loading next step
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- Module name and location from step 1
- Input documents (brief/brainstorming) if any
- Focus ONLY on concept and scope definition
- Don't assume module details beyond what user provides
## STEP GOAL:
To articulate the module's vision, define its identity, and establish clear boundaries for what it will and won't do.
## MODULE CONCEPT DEFINITION PROCESS:
### 1. Load Context and Briefs
"Let's define your module's concept and identity. This will guide all the decisions we make about agents, workflows, and features."
Load module-plan.md and check inputDocuments field
Read the module brief completely
"I see you have a module brief. Let me review that to understand your vision..."
Use brief content to inform concept development questions
Load and study the module structure guide for context
### 2. Guide Concept Development
Ask conversationally:
"**Understanding Your Vision:**
1. **What problem will this module solve?** - What pain point or need are you addressing?
2. **Who is the primary user?** - Who will benefit most from this module?
3. **What's the main outcome?** - What will users be able to do after using your module?
4. **Why is this important?** - What makes this module valuable or unique?"
### 3. Module Identity Development
Based on their responses, collaboratively develop:
**Module Name:**
- Start with their module code: {module_name}
- Suggest a display name in Title Case
- Get user confirmation or refinement
**Module Purpose:**
- Distill their problem statement into 1-2 clear sentences
- Focus on value and outcomes
- Get user validation
**Target Audience:**
- Identify primary user persona
- Consider skill level (beginner/intermediate/advanced)
- Note any secondary audiences
**Module Scope:**
- What's IN scope (core features)
- What's OUT of scope (explicitly state what it won't do)
- Success criteria (how will we know it works?)
### 4. Module Theme and Category
"**Module Classification:**
Based on your description, this seems to fit in the [Domain-Specific/Creative/Technical/Business/Personal] category.
Does this sound right? Or would you categorize it differently?
**Example Categories:**
- **Domain-Specific**: Legal, Medical, Finance, Education
- **Creative**: RPG/Gaming, Story Writing, Music Production
- **Technical**: DevOps, Testing, Architecture, Security
- **Business**: Project Management, Marketing, Sales
- **Personal**: Journaling, Learning, Productivity"
### 5. Module Type Estimation
"Based on what you've described, I'm thinking this might be a:
- **Simple Module** (1-2 agents, 2-3 workflows) - Focused, single-purpose
- **Standard Module** (3-5 agents, 5-10 workflows) - Comprehensive solution
- **Complex Module** (5+ agents, 10+ workflows) - Full platform/framework
Which feels right for your vision? We'll confirm this after planning components."
### 6. Document Module Concept
Update module-plan.md with concept section:
```markdown
## Module Concept
**Module Name:** {module_display_name}
**Module Code:** {module_name}
**Category:** [category]
**Type:** [estimated type]
**Purpose Statement:**
[1-2 sentence clear purpose]
**Target Audience:**
- Primary: [description]
- Secondary: [if any]
**Scope Definition:**
**In Scope:**
- [core feature 1]
- [core feature 2]
- [core feature 3]
**Out of Scope:**
- [explicitly excluded item 1]
- [explicitly excluded item 2]
**Success Criteria:**
- [measurable outcome 1]
- [measurable outcome 2]
- [user satisfaction indicator]
```
### 7. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to explore alternative concept approaches
- IF P: Execute {partyModeWorkflow} to get creative input on module identity
- IF C: Save concept to module-plan.md, add step-02-concept to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- Module purpose clearly articulated
- Module identity established (name, audience, scope)
- Category and type determined
- Concept documented in module plan
- User feels the concept matches their vision
### ❌ SYSTEM FAILURE:
- Proceeding without clear module purpose
- Not defining scope boundaries
- Skipping user validation of concept
- Not documenting concept details
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and module concept is saved to module-plan.md with stepsCompleted updated to [1, 2], will you then load, read entire file, then execute `{nextStepFile}` to begin component planning.

View File

@ -0,0 +1,267 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-04-structure.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
agent_examples_path: '{project-root}/src/modules/bmb/reference/agents/module-examples'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 3: Plan Module Components
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Systems Designer
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD component design patterns, user brings their domain requirements
- ✅ Maintain collaborative, design-focused tone
### Step-Specific Rules:
- 🎯 Focus ONLY on planning component architecture
- 🚫 FORBIDDEN to create actual components in this step
- 💬 Present component options with reasoning
- 🚫 FORBIDDEN to finalize component list without user agreement
## EXECUTION PROTOCOLS:
- 🎯 Reference agent examples for patterns
- 💾 Document component plan in detail
- 📖 Add "step-03-components" to stepsCompleted array` before loading next step
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- Module concept from step 2 is available
- Focus on planning, not implementation
- Consider BMAD patterns and best practices
- Reference examples but don't copy exactly
## STEP GOAL:
To design the component architecture for the module, determining what agents, workflows, and tasks are needed to fulfill the module's purpose.
## COMPONENT PLANNING PROCESS:
### 1. Initialize Component Planning
"Now that we have a clear module concept, let's plan the components that will bring it to life.
Based on your module's purpose and scope, we'll design:
- **Agents** - The AI personas that will help users
- **Workflows** - The step-by-step processes for accomplishing tasks
- **Tasks** - Quick utilities and supporting functions"
### 2. Agent Planning
"**Agent Architecture:**
Think about the different roles or perspectives needed to accomplish your module's goals. Each agent should have a clear, distinct purpose."
Reference agent examples for patterns
Load and browse agent examples: {agent_examples_path}
"**Common Agent Patterns:**
- **Primary Agent** - The main interface/orchestrator
- **Specialist Agents** - Domain-specific experts
- **Utility Agents** - Helper/support functions
**Example by Module Type:**
**Technical Modules (e.g., DevOps, Testing):**
- Implementation Specialist
- Reviewer/Auditor
- Documentation Expert
**Creative Modules (e.g., Story Writing, Game Design):**
- Creative Director
- World Builder
- Content Generator
**Business Modules (e.g., Project Management):**
- Project Coordinator
- Facilitator
- Analyst"
"**For your {module_category} module, I suggest considering:**
[Suggest 2-4 specific agent types based on module concept]
**What resonates with your vision?** Which of these agents would be most valuable, and are there any others you'd like to add?"
### 3. Workflow Planning
"**Workflow Design:**
Workflows are the step-by-step processes that users will follow to accomplish specific tasks. Each workflow should solve a specific problem or achieve a particular outcome."
**Types of Workflows:**
- **Document Workflows** - Generate reports, plans, specifications
- **Action Workflows** - Perform operations, create structures
- **Interactive Workflows** - Guided sessions, coaching, training
**Example Workflow Patterns:**
"For your module's purpose, consider these potential workflows:
1. **[Primary Workflow Name]** - Main workflow for core functionality
2. **[Supporting Workflow 1]** - For specific use case
3. **[Supporting Workflow 2]** - For another use case
Remember: We'll create workflow PLANS first, not full implementations. These plans can be used later with the create-workflow workflow."
### 4. Task Planning (Optional)
"**Task Planning (if needed):**
Tasks are single-operation utilities that don't need full workflows. They're good for:
- Quick actions
- Shared subroutines
- Helper functions
Does your module need any tasks? For example:
- Status checking
- Quick formatting
- Validation utilities"
### 5. Component Integration Planning
"**How Components Work Together:**
Let's think about how your components will interact:
- **Agent Collaboration**: Will agents work together or independently?
- **Workflow Dependencies**: Do workflows need to call each other?
- **Task Usage**: Which workflows will use which tasks?"
### 6. Component Priority and MVP
"**Starting Point (MVP):**
To ensure success, let's identify the minimum viable set:
**Must Have (Phase 1):**
- [List essential agents]
- [List essential workflows]
**Nice to Have (Phase 2):**
- [Additional agents]
- [Additional workflows]
- [Tasks if any]
This approach lets you launch with core functionality and expand later."
### 7. Document Component Plan
Update module-plan.md with component section:
```markdown
## Component Architecture
### Agents (N planned)
1. **[Agent Name]** - [Brief purpose]
- Type: [Primary/Specialist/Utility]
- Role: [Specific role description]
2. **[Agent Name]** - [Brief purpose]
- Type: [Primary/Specialist/Utility]
- Role: [Specific role description]
### Workflows (N planned)
1. **[Workflow Name]** - [Purpose]
- Type: [Document/Action/Interactive]
- Primary user: [Who uses this]
- Key output: [What it produces]
2. **[Workflow Name]** - [Purpose]
- Type: [Document/Action/Interactive]
- Primary user: [Who uses this]
- Key output: [What it produces]
### Tasks (N planned)
1. **[Task Name]** - [Single-purpose function]
- Used by: [Which workflows/agents]
### Component Integration
- Agents collaborate via: [description]
- Workflow dependencies: [description]
- Task usage patterns: [description]
### Development Priority
**Phase 1 (MVP):**
- [List of components to create first]
**Phase 2 (Enhancement):**
- [List of components for later]
```
### 8. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to explore alternative component architectures
- IF P: Execute {partyModeWorkflow} to get creative input on component design
- IF C: Save component plan to module-plan.md, add step-03-components to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- Component architecture planned and documented
- Agent types and purposes clearly defined
- Workflow requirements identified
- Integration patterns established
- Development priority set (MVP vs enhancements)
### ❌ SYSTEM FAILURE:
- Planning components without module purpose context
- Not considering BMAD patterns and examples
- Over-engineering (too many components)
- Under-planning (missing essential components)
- Not establishing development priorities
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and component plan is saved to module-plan.md with stepsCompleted updated to [1, 2, 3], will you then load, read entire file, then execute `{nextStepFile}` to begin creating the module structure.

View File

@ -0,0 +1,228 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-05-config.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 4: Create Module Structure
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Systems Organizer
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD structure patterns, user brings their component requirements
- ✅ Maintain collaborative, organized tone
### Step-Specific Rules:
- 🎯 Focus ONLY on creating directory structure and determining complexity
- 🚫 FORBIDDEN to create actual component files in this step
- 💬 Explain structure decisions clearly
- 🚫 FORBIDDEN to proceed without confirming structure
## EXECUTION PROTOCOLS:
- 🎯 Use component count to determine module type
- 💾 Create all required directories
- 📖 Add "step-04-structure" to stepsCompleted array` before loading next step
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- Component plan from step 3 is available
- Standard BMAD module structure to follow
- Focus on structure creation, not content
- Module folder already exists from step 1
## STEP GOAL:
To determine the module's complexity type and create the complete directory structure for the module.
## MODULE STRUCTURE CREATION PROCESS:
### 1. Determine Module Complexity
"Based on your component plan, let's determine your module's complexity level:"
**Count Components:**
- Agents: [count from plan]
- Workflows: [count from plan]
- Tasks: [count from plan]
**Complexity Assessment:**
"**Simple Module Criteria:**
- 1-2 agents, all Simple type
- 1-3 workflows
- No complex integrations
**Standard Module Criteria:**
- 2-4 agents with mixed types
- 3-8 workflows
- Some shared resources
**Complex Module Criteria:**
- 4+ agents or multiple Module-type agents
- 8+ workflows
- Complex interdependencies
- External integrations"
"**Your module has:**
- [agent_count] agents
- [workflow_count] workflows
- [task_count] tasks
**This makes it a: [Simple/Standard/Complex] Module**"
### 2. Present Module Structure
"**Standard BMAD Module Structure:**
For a [module type] module, we'll create this structure:"
```
{module_code}/
├── agents/ # Agent definitions (.md)
│ ├── [agent-name].md
│ └── ...
├── workflows/ # Workflow folders
│ ├── [workflow-name]/
│ │ ├── workflow-plan.md # Descriptive plan
│ │ └── README.md # Workflow documentation
│ └── ...
├── tasks/ # Task files (if any)
│ └── [task-name].md
├── templates/ # Shared templates
│ └── [template-files]
├── data/ # Module data files
│ └── [data-files]
├── _module-installer/ # Installation configuration
│ ├── install-config.yaml # Required
│ ├── installer.js # Optional
│ └── assets/ # Optional install assets
└── README.md # Module documentation
```
### 3. Create Directory Structure
Create all directories in {custom_module_location}/{module_name}/:
1. **agents/** - For agent definition files
2. **workflows/** - For workflow folders
3. **tasks/** - For task files (if tasks planned)
4. **templates/** - For shared templates
5. **data/** - For module data
6. **\_module-installer/** - For installation configuration
### 4. Create Placeholder README
Create initial README.md with basic structure:
````markdown
# {module_display_name}
{module_purpose}
## Installation
```bash
bmad install {module_code}
```
````
## Components
_Module documentation will be completed in Step 9_
## Quick Start
_Getting started guide will be added in Step 9_
---
_This module is currently under construction_
````
### 5. Document Structure Creation
Update module-plan.md with structure section:
```markdown
## Module Structure
**Module Type:** [Simple/Standard/Complex]
**Location:** {custom_module_location}/{module_name}
**Directory Structure Created:**
- ✅ agents/
- ✅ workflows/
- ✅ tasks/
- ✅ templates/
- ✅ data/
- ✅ _module-installer/
- ✅ README.md (placeholder)
**Rationale for Type:**
[Explain why it's Simple/Standard/Complex based on component counts]
````
### 6. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to explore alternative structure approaches
- IF P: Execute {partyModeWorkflow} to get creative input on organization
- IF C: Save structure info to module-plan.md, add step-04-structure to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- Module complexity correctly determined
- All required directories created
- Structure follows BMAD standards
- Placeholder README created
- Structure documented in plan
### ❌ SYSTEM FAILURE:
- Not creating all required directories
- Incorrectly categorizing module complexity
- Not following BMAD structure patterns
- Creating component files prematurely
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and structure is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4], will you then load, read entire file, then execute `{nextStepFile}` to begin configuration planning.

View File

@ -0,0 +1,233 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-06-agents.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 5: Plan Module Configuration
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Configuration Specialist
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD installation patterns, user brings their module requirements
- ✅ Maintain collaborative, planning-focused tone
### Step-Specific Rules:
- 🎯 Focus ONLY on planning configuration fields
- 🚫 FORBIDDEN to create installer files in this step
- 💬 Present configuration options clearly
- 🚫 FORBIDDEN to finalize without user input
## EXECUTION PROTOCOLS:
- 🎯 Consider what users might want to configure
- 💾 Document all configuration field plans
- 📖 Add "step-05-config" to stepsCompleted array` before loading next step
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- Module concept and components from previous steps
- Standard BMAD installer configuration patterns
- Focus on planning, not implementation
- Consider user customization needs
## STEP GOAL:
To determine what configuration settings the module needs and plan how they'll be implemented in the installer.
## CONFIGURATION PLANNING PROCESS:
### 1. Initialize Configuration Planning
"Now let's plan the configuration for your module's installer. This determines what users can customize when they install your module."
**Configuration allows users to:**
- Set up file locations
- Choose features or behavior
- Provide API keys or credentials
- Adjust output formats
- Configure integrations
### 2. Assess Configuration Needs
"**Configuration Assessment:**
Does your {module_display_name} module need any user-configurable settings during installation?"
**Common Configuration Categories:**
**1. Output/Data Paths**
- Where should outputs be saved?
- What's the default data directory?
- Any special folder structures needed?
**2. Feature Toggles**
- Enable/disable specific features
- Choose between behavior modes
- Set verbosity levels
**3. Integration Settings**
- API keys (for external services)
- Service endpoints
- Authentication credentials
**4. User Preferences**
- Default language
- Time zone
- Skill level (beginner/advanced)
- Detail level (minimal/standard/verbose)"
### 3. Plan Configuration Fields
"**For each configuration need, let's define:**
1. **Field Name** (snake_case, e.g., 'output_path')
2. **Type** - INTERACTIVE (asks user) or STATIC (hardcoded)
3. **Prompt** (what to ask user, if interactive)
4. **Default Value** (sensible default)
5. **Input Type** - text, single-select, multi-select
6. **Result Template** - how to store the value"
**Examples:**
"**INTERACTIVE Text Input:**
```yaml
output_path:
prompt: 'Where should {module_name} save outputs?'
default: 'output/{module_name}'
result: '{project-root}/{value}'
```
**INTERACTIVE Single-Select:**
```yaml
detail_level:
prompt: 'How detailed should outputs be?'
default: 'standard'
result: '{value}'
single-select:
- value: 'minimal'
label: 'Minimal - Brief summaries only'
- value: 'standard'
label: 'Standard - Balanced detail'
- value: 'detailed'
label: 'Detailed - Comprehensive information'
```
**STATIC Value:**
````yaml
module_version:
result: "1.0.0"
```"
### 4. Design Configuration for Your Module
"**Based on your module's purpose, consider these potential configurations:"
[Suggest relevant configurations based on module type and purpose]
"**Which of these apply to your module?**
- [Present options relevant to the specific module]
**Any additional configurations needed?**"
### 5. Document Configuration Plan
Update module-plan.md with configuration section:
```markdown
## Configuration Planning
### Required Configuration Fields
1. **[field_name]**
- Type: [INTERACTIVE/STATIC]
- Purpose: [what it controls]
- Default: [default value]
- Input Type: [text/single-select/multi-select]
- Prompt: [user prompt if interactive]
2. **[field_name]**
- Type: [INTERACTIVE/STATIC]
- Purpose: [what it controls]
- Default: [default value]
- Input Type: [text/single-select/multi-select]
- Prompt: [user prompt if interactive]
### Installation Questions Flow
1. [First question]
2. [Second question]
3. [Additional questions...]
### Result Configuration Structure
The install-config.yaml will generate:
- Module configuration at: {bmad_folder}/{module_code}/config.yaml
- User settings stored as: [describe structure]
````
### 6. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to explore additional configuration options
- IF P: Execute {partyModeWorkflow} to get input on user experience
- IF C: Save configuration plan to module-plan.md, add step-05-config to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- All necessary configuration fields identified
- Field types and prompts clearly defined
- User interaction flow planned
- Configuration structure documented
- Ready for installer implementation
### ❌ SYSTEM FAILURE:
- Skipping configuration planning for modules that need it
- Over-configuring (too many options)
- Not considering user experience
- Not documenting configuration plans
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and configuration plan is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5], will you then load, read entire file, then execute `{nextStepFile}` to begin agent creation.

View File

@ -0,0 +1,296 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-07-workflows.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
agentTemplate: '{installed_path}/templates/agent.template.md'
agent_examples_path: '{project-root}/src/modules/bmb/reference/agents/module-examples'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 6: Create Module Agents
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Agent Designer
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD agent patterns, user brings their domain requirements
- ✅ Maintain collaborative, creative tone
### Step-Specific Rules:
- 🎯 Focus on creating proper YAML agent files following the template
- 🚫 FORBIDDEN to use create-agent workflow (it's problematic)
- 💬 Create placeholder workflow folders with README.md for each agent
- 🚫 FORBIDDEN to create full workflows in this step
## EXECUTION PROTOCOLS:
- 🎯 Follow agent.template.md exactly for structure
- 💾 Save agents as .yaml files to module's agents folder
- 📖 Create workflow folders with README.md plans
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- Component plan from step 3 defines which agents to create
- Agent template provides the required YAML structure
- Module structure already created
- Focus on agent creation and workflow placeholders
## STEP GOAL:
To create the primary agent(s) for the module using the proper agent template and create placeholder workflow folders for each agent.
## AGENT CREATION PROCESS:
### 1. Review Agent Plan
"Let's create the agents for your {module_display_name} module.
From your component plan, you have:
- [agent_count] agents planned
- [list of agent types from plan]
I'll create each agent following the proper BMAD template and set up placeholder workflow folders for them."
### 2. Load Agent Template
Load and study the agent template from {agentTemplate}
Reference agent examples from {agent_examples_path} for patterns
### 3. Create Each Agent
For each agent in the component plan:
#### 3.1 Determine Agent Characteristics
"**Agent: [Agent Name]**
Let's design this agent by understanding what it needs:
**Memory & Learning:**
1. Does this agent need to remember things across sessions? (conversations, preferences, patterns)
- If yes: We'll add sidecar folder structure for memory
- If no: No persistent memory needed
**Interaction Types:** 2. What does this agent DO?
- Conversational interactions? → Use embedded prompts
- Quick single actions? → Use inline actions
- Complex multi-step processes? → Consider workflows
- Document generation? → Likely need workflows
**Multiple Agent Usage:** 3. Will other agents in this module need the same workflows?
- If yes: Definitely create separate workflow files
- If no: Could embed in agent file
**Based on this, what combination does [Agent Name] need?**
- Memory/Persistence: [Yes/No]
- Embedded prompts: [List main interactions]
- Workflows needed: [Which processes need separate files?]"
#### 3.2 Present Agent Design
"**Agent Design: [Agent Name]**
**Core Identity:**
- Name: [Suggested name]
- Title: [Brief description]
- Icon: [Appropriate emoji]
**Persona:**
- Role: [What the agent does]
- Identity: [Personality/background]
- Communication Style: [How they communicate]
- Principles: [3-5 core principles]
**Structure:**
- Memory needed: [Yes/No - sidecar folder]
- Embedded prompts: [List main interaction prompts]
- Workflow processes: [Which need separate files]
**Menu Items Planned:**
- [List with trigger codes and types]
**Quick actions vs Workflows:**
- Quick prompts: [single-step interactions]
- Workflows: [multi-step, shared processes]
Does this design match what you envisioned? What should we adjust?"
#### 3.3 Create Agent File and Structure
After user confirmation:
Create hybrid agent file with only needed sections:
```yaml
agent:
metadata:
name: '[Agent Name]'
title: '[Agent Title]'
icon: '[Icon]'
module: '{module_code}'
persona:
role: '[Agent Role]'
identity: |
[Multi-line identity description]
communication_style: |
[Multi-line communication style]
principles:
- '[Principle 1]'
- '[Principle 2]'
- '[Principle 3]'
# Only include if agent needs memory/persistence
critical_actions:
- 'Load COMPLETE file ./[agent-name]-sidecar/memories.md and integrate all past interactions'
- 'ONLY read/write files in ./[agent-name]-sidecar/ - this is our private workspace'
# Only include if agent has embedded prompts
prompts:
- id: '[prompt-name]'
content: |
<instructions>
[How to use this prompt]
</instructions>
[Detailed prompt content]
menu:
# Always include
- multi: '[CH] Chat with agent or [SPM] Start Party Mode'
triggers:
- party-mode:
input: SPM
route: '{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md'
type: exec
- expert-chat:
input: CH
action: agent responds as expert
type: action
# Group related functions
- multi: '[PF] Primary Function [QF] Quick Task'
triggers:
- primary-function:
input: PF
action: '#[prompt-id]'
type: action
- quick-task:
input: QF
route: '#[prompt-id]'
type: exec
# Workflow only for complex processes
- trigger: 'complex-process'
route: '{project-root}/{bmad_folder}/{custom_module}/workflows/[workflow]/workflow.md'
description: 'Complex process [icon]'
# Quick inline actions
- trigger: 'save-item'
action: 'Save to ./[agent-name]-sidecar/file.md'
description: 'Save item 💾'
```
#### 3.4 Create Supporting Structure
**If agent needs memory:**
1. Create folder: {custom_module_location}/{module_name}/agents/[agent-name]-sidecar/
2. Create files:
- memories.md (empty, for persistent memory)
- instructions.md (empty, for agent protocols)
- insights.md (empty, for breakthrough moments)
- sessions/ (subfolder for session records)
- patterns.md (empty, for tracking patterns)
**If agent has workflows:**
For each workflow that needs separate file:
1. Create folder: {custom_module_location}/{module_name}/workflows/[workflow-name]/
2. Create README.md with workflow plan
### 4. Repeat for All Agents
Go through each agent from the component plan, presenting drafts and creating files with user confirmation.
### 5. Document Agent Creation
Update module-plan.md with agents section:
```markdown
## Agents Created
1. **[Agent Name]** - [Agent Title]
- File: [agent-filename].yaml
- Features: [Memory/Sidecar, Embedded prompts, Workflows]
- Structure:
- Sidecar: [Yes/No]
- Prompts: [number embedded]
- Workflows: [list of workflow folders]
- Status: Created with [combination of features]
```
### 6. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to refine agent designs
- IF P: Execute {partyModeWorkflow} to get creative input on agent personas
- IF C: Save agent creation status to module-plan.md, add step-06-agents to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- All planned agents created with proper YAML structure
- Each agent follows agent.template.md format exactly
- Workflow placeholder folders created with README.md plans
- Agent menu items properly reference workflow paths
- Users confirmed each agent draft before creation
### ❌ SYSTEM FAILURE:
- Using create-agent workflow instead of template
- Creating XML agents instead of YAML
- Not creating workflow placeholder folders
- Skipping user confirmation on agent drafts
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and all agents are created with placeholder workflows and stepsCompleted updated, will you then load, read entire file, then execute `{nextStepFile}` to begin workflow plan review.

View File

@ -0,0 +1,228 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-08-installer.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
workflowPlanTemplate: '{installed_path}/templates/workflow-plan-template.md'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 7: Review Workflow Plans
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Workflow Designer
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD workflow patterns, user brings their workflow requirements
- ✅ Maintain collaborative, review-focused tone
### Step-Specific Rules:
- 🎯 Focus on reviewing existing workflow README files from Step 6
- 🚫 FORBIDDEN to use create-workflow workflow in this step
- 💬 Review and refine workflow plans, not create new ones
- 🚫 FORBIDDEN to create actual workflow steps
## EXECUTION PROTOCOLS:
- 🎯 Review workflow README files created in Step 6
- 💾 Update README files based on user feedback
- 📖 Add "step-07-workflows" to stepsCompleted array` before loading next step
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- Workflow README files were created in Step 6 for each agent
- These README files contain workflow plans for later implementation
- Module structure already created with workflow folders
- Focus on reviewing and refining, not creating from scratch
## STEP GOAL:
To review and refine the workflow README files created in Step 6, ensuring they have clear plans for later implementation with the create-workflow workflow.
## WORKFLOW REVIEW PROCESS:
### 1. List Workflow Folders Created
"Let's review the workflow plans created in Step 6 for your {module_display_name} module.
I've already created workflow folders and README.md files for each agent's workflows:
**Workflow folders found:**
- [List all workflow folders in {custom_module_location}/{module_name}/workflows/]
**Each workflow folder contains a README.md with:**
- Purpose and description
- Trigger code from agent menu
- Key steps outline
- Expected outputs
- Notes for implementation"
### 2. Review Each Workflow Plan
For each workflow README file:
#### 2.1 Load and Present
"**Reviewing Workflow: [Workflow Name]**
Reading the README.md from: [workflow-folder]/README.md
**Current Plan:**
[Purpose]
[Trigger]
[Key Steps]
[Expected Output]
[Notes]
How does this plan look? Should we:
- Keep it as is
- Modify the purpose
- Adjust the steps
- Change the expected output"
#### 2.2 Update Based on Feedback
If user wants changes:
- Update the README.md file
- Keep the same basic structure
- Ensure clarity for future implementation
#### 2.3 Check for Missing Information
Ensure each README has:
```markdown
# [Workflow Name]
## Purpose
[Clear, concise description of what this workflow accomplishes]
## Trigger
[Trigger code from agent menu, e.g., "WF" or specific code]
## Key Steps
1. [Step 1 - What happens first]
2. [Step 2 - What happens next]
3. [Step 3 - Continue as needed]
## Expected Output
[What the workflow produces - document, action, result]
## Notes
This workflow will be implemented using the create-workflow workflow.
(Optional: Any special considerations or requirements)
```
### 3. Link Workflows to Agents
"**Workflow-Agent Mapping:**
Let's verify each workflow is properly linked to its agent:
[For each workflow]:
- **Workflow:** [Workflow Name]
- **Agent:** [Agent Name]
- **Trigger Code:** [WF code]
- **Menu Item:** [Menu description in agent]
Are all these mappings correct in the agent files?"
### 4. Document Implementation Plan
Update module-plan.md with workflow section:
```markdown
## Workflow Plans Reviewed
### For Agent [Agent Name]:
1. **[Workflow Name]**
- Location: workflows/[workflow-name]/
- Status: Plan reviewed and ready for implementation
- Trigger: [WF code]
- Implementation: Use create-workflow workflow
2. **[Workflow Name]**
- Location: workflows/[workflow-name]/
- Status: Plan reviewed and ready for implementation
- Trigger: [WF code]
- Implementation: Use create-workflow workflow
```
### 5. Next Steps Guidance
"**Ready for Implementation:**
All workflow plans are now reviewed and ready. To implement these workflows later:
1. Use the `/bmad:bmb:workflows:create-workflow` command
2. Select each workflow folder
3. Follow the create-workflow workflow
4. It will create the full workflow.md and step files
The README.md in each folder serves as your blueprint for implementation."
### 6. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to refine workflow designs
- IF P: Execute {partyModeWorkflow} to get creative input on workflow processes
- IF C: Save workflow plan status to module-plan.md, add step-07-workflows to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- All workflow README files reviewed with user
- Each workflow plan has clear purpose and steps
- Workflow-agent mappings verified
- README files updated based on feedback
- Clear implementation guidance provided
### ❌ SYSTEM FAILURE:
- Skipping review of workflow README files
- Not updating plans based on user feedback
- Missing critical information in README files
- Not verifying workflow-agent mappings
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and all workflow plans are reviewed and documented and stepsCompleted updated, will you then load, read entire file, then execute `{nextStepFile}` to begin installer setup.

View File

@ -0,0 +1,186 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-09-documentation.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
installerTemplate: '{installed_path}/templates/installer.template.js'
installConfigTemplate: '{installed_path}/templates/install-config.template.yaml'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 8: Setup Module Installer
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Installation Specialist
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD installation patterns, user brings their module requirements
- ✅ Maintain collaborative, technical tone
### Step-Specific Rules:
- 🎯 Focus on creating installer configuration files
- 🚫 FORBIDDEN to run actual installation
- 💬 Follow BMAD installer standards exactly
- 🚫 FORBIDDEN to deviate from configuration template
## EXECUTION PROTOCOLS:
- 🎯 Use configuration plan from step 5
- 💾 Create install-config.yaml with all fields
- 📖 Add "step-08-installer" to stepsCompleted array` before loading next step
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- Configuration plan from step 5 defines installer fields
- Standard BMAD installer template to follow
- Module structure already created
- Focus on installer setup, not module content
## STEP GOAL:
To create the module installer configuration (install-config.yaml) that defines how users will install and configure the module.
## INSTALLER SETUP PROCESS:
### 1. Review Configuration Plan
"Now let's set up the installer for your {module_display_name} module.
The installer will:
- Define how users install your module
- Collect configuration settings
- Set up the module structure in user projects
- Generate the module's config.yaml file
From step 5, we planned these configuration fields:
- [List planned configuration fields]"
### 2. Create Installer Directory
Ensure \_module-installer directory exists
Directory: {custom_module_location}/{module_name}/\_module-installer/
### 3. Create install-config.yaml
"I'll create the install-config.yaml file based on your configuration plan. This is the core installer configuration file."
Create file: {custom_module_location}/{module_name}/\_module-installer/install-config.yaml from template {installConfigTemplate}
### 4. Handle Custom Installation Logic
"**Custom Installation Logic:**
Does your module need any special setup during installation? For example:
- Creating database tables
- Setting up API connections
- Downloading external assets
- Running initialization scripts"
<ask>Does your module need custom installation logic? [yes/no]</ask>
"I'll create an installer.js file for custom logic."
Create file: {custom_module_location}/{module_name}/\_module-installer/installer.js from {installerTemplate}
Update installer.js with module-specific logic
### 5. Create Assets Directory (if needed)
"**Installer Assets:**
If your module needs to copy files during installation (templates, examples, documentation), we can add them to the assets directory."
Create directory: \_module-installer/assets/
Add note about what assets to include
### 6. Document Installer Setup
Update module-plan.md with installer section:
```markdown
## Installer Configuration
### Install Configuration
- File: \_module-installer/install-config.yaml
- Module code: {module_name}
- Default selected: false
- Configuration fields: [count]
### Custom Logic
- installer.js: [Created/Not needed]
- Custom setup: [description if yes]
### Installation Process
1. User runs: `bmad install {module_name}`
2. Installer asks: [list of questions]
3. Creates: {bmad_folder}/{module_name}/
4. Generates: config.yaml with user settings
### Validation
- ✅ YAML syntax valid
- ✅ All fields defined
- ✅ Paths use proper templates
- ✅ Custom logic ready (if needed)
```
### 7. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to review installer configuration
- IF P: Execute {partyModeWorkflow} to get input on user experience
- IF C: Save installer info to module-plan.md, add step-08-installer to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- install-config.yaml created with all planned fields
- YAML syntax valid
- Custom installation logic prepared (if needed)
- Installer follows BMAD standards
- Configuration properly templated
### ❌ SYSTEM FAILURE:
- Not creating install-config.yaml
- Invalid YAML syntax
- Missing required fields
- Not using proper path templates
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and installer info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8], will you then load, read entire file, then execute `{nextStepFile}` to begin documentation creation.

View File

@ -0,0 +1,308 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-10-roadmap.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
moduleReadmeFile: '{custom_module_location}/{module_name}/README.md'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 9: Create Module Documentation
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Technical Writer
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in documentation best practices, user brings their module knowledge
- ✅ Maintain collaborative, clear tone
### Step-Specific Rules:
- 🎯 Focus on creating comprehensive README documentation
- 🚫 FORBIDDEN to create docs in other locations
- 💬 Generate content based on module plan
- 🚫 FORBIDDEN to skip standard sections
## EXECUTION PROTOCOLS:
- 🎯 Use all gathered module information
- 💾 Update the placeholder README.md file
- 📖 Add "step-09-documentation" to stepsCompleted array` before loading next step
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- All module information from previous steps
- Module structure and components already created
- Focus on README.md, not other documentation
- Generate content dynamically from plan
## STEP GOAL:
To create comprehensive README.md documentation for the module that helps users understand, install, and use the module.
## DOCUMENTATION CREATION PROCESS:
### 1. Initialize Documentation
"Let's create the README.md for your {module_display_name} module.
Good documentation is crucial for module adoption. Your README will be the first thing users see when discovering your module."
### 2. Generate README Content
Load module-plan.md to gather all module information
Update {moduleReadmeFile} with comprehensive content:
````markdown
# {module_display_name}
{module_purpose}
## Overview
This module provides:
[Generate list based on module components and features]
## Installation
Install the module using BMAD:
```bash
bmad install {module_name}
```
````
## Components
### Agents ({agent_count})
[List created agents with brief descriptions]
### Workflows ({workflow_count})
[List planned workflows with purposes]
### Tasks ({task_count})
[List tasks if any]
## Quick Start
1. **Load the primary agent:**
```
agent {primary_agent_name}
```
2. **View available commands:**
```
*help
```
3. **Run the main workflow:**
```
workflow {primary_workflow_name}
```
## Module Structure
```
{module_name}/
├── agents/ # Agent definitions
│ ├── [agent-1].md
│ └── [agent-2].md
├── workflows/ # Workflow folders
│ ├── [workflow-1]/
│ │ ├── workflow-plan.md
│ │ └── README.md
│ └── [workflow-2]/
│ └── ...
├── tasks/ # Task files
├── templates/ # Shared templates
├── data/ # Module data
├── _module-installer/ # Installation config
└── README.md # This file
```
## Configuration
The module can be configured in `{bmad_folder}/{module_name}/config.yaml`
**Key Settings:**
[List configuration fields from installer]
[Example:]
- **output_path**: Where outputs are saved
- **detail_level**: Controls output verbosity
- **feature_x**: Enable/disable specific features
## Examples
### Example 1: [Primary Use Case]
[Step-by-step example of using the module for its main purpose]
1. Start the agent
2. Provide input
3. Review output
### Example 2: [Secondary Use Case]
[Additional example if applicable]
## Development Status
This module is currently:
- [x] Structure created
- [x] Installer configured
- [ ] Agents implemented
- [ ] Workflows implemented
- [ ] Full testing complete
**Note:** Some workflows are planned but not yet implemented. See individual workflow folders for status.
## Contributing
To extend this module:
1. Add new agents using `create-agent` workflow
2. Add new workflows using `create-workflow` workflow
3. Update the installer configuration if needed
4. Test thoroughly
## Requirements
- BMAD Method version 6.0.0 or higher
- [Any specific dependencies]
## Author
Created by {user_name} on [creation date]
## License
[Add license information if applicable]
---
## Module Details
**Module Code:** {module_name}
**Category:** {module_category}
**Type:** {module_type}
**Version:** 1.0.0
**Last Updated:** [current date]
````
### 3. Review Documentation
"**Documentation Review:**
I've generated a comprehensive README that includes:
**Overview** - Clear purpose and value proposition
**Installation** - Simple install command
**Components** - List of agents and workflows
**Quick Start** - Getting started guide
**Structure** - Module layout
**Configuration** - Settings explanation
**Examples** - Usage examples
**Development Status** - Current implementation state
Does this documentation clearly explain your module? Is there anything you'd like to add or modify?"
### 4. Handle Documentation Updates
Update based on user feedback
"Common additions:
- API documentation
- Troubleshooting section
- FAQ
- Screenshots or diagrams
- Video tutorials
- Changelog"
### 5. Document Documentation Creation
Update module-plan.md with documentation section:
```markdown
## Documentation
### README.md Created
- Location: {custom_module_location}/{module_name}/README.md
- Sections: [list of sections included]
- Status: Complete
### Content Highlights
- Clear installation instructions
- Component overview
- Quick start guide
- Configuration details
- Usage examples
- Development status
### Updates Made
- [List any customizations or additions]
````
### 6. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to improve documentation clarity
- IF P: Execute {partyModeWorkflow} to get input on user experience
- IF C: Save documentation info to module-plan.md, add step-09-documentation to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- README.md fully populated with all sections
- Content accurately reflects module structure
- Installation instructions clear and correct
- Examples provide helpful guidance
- Development status honestly represented
### ❌ SYSTEM FAILURE:
- Leaving placeholder content in README
- Not updating with actual module details
- Missing critical sections (installation, usage)
- Misrepresenting implementation status
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and documentation info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8, 9], will you then load, read entire file, then execute `{nextStepFile}` to begin roadmap generation.

View File

@ -0,0 +1,336 @@
---
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
nextStepFile: '{installed_path}/steps/step-11-validate.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
moduleTodoFile: '{custom_module_location}/{module_name}/TODO.md'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 10: Generate Development Roadmap
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Project Planner
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in development planning, user brings their module vision
- ✅ Maintain collaborative, forward-looking tone
### Step-Specific Rules:
- 🎯 Focus on creating actionable roadmap and TODO
- 🚫 FORBIDDEN to create actual components
- 💬 Prioritize tasks for successful launch
- 🚫 FORBIDDEN to set time estimates
## EXECUTION PROTOCOLS:
- 🎯 Use component status to determine next steps
- 💾 Create clear TODO.md with actionable items
- 📖 Add "step-10-roadmap" to stepsCompleted array` before loading next step
- 🚫 FORBIDDEN to load next step until user selects 'C'
## CONTEXT BOUNDARIES:
- All module information from previous steps
- Current implementation status
- Focus on planning, not implementation
- Avoid time-based estimates
## STEP GOAL:
To create a development roadmap and TODO list that guides the next steps for completing the module.
## ROADMAP GENERATION PROCESS:
### 1. Review Current Status
"Let's create a development roadmap for your {module_display_name} module.
**Current Status Summary:**
- ✅ Module structure created
- ✅ Installer configured
- [Agent Status]
- [Workflow Status]
- [Documentation Status]
This roadmap will help you prioritize what to work on next."
### 2. Create Development Phases
"**Development Phases:**
I'll organize the remaining work into logical phases to ensure a successful module launch."
### 3. Generate TODO.md
Create file: {custom_module_location}/{module_name}/TODO.md
````markdown
# {module_display_name} Development Roadmap
## Phase 1: Core Components (MVP)
### Agents
- [ ] Implement [Agent 1 Name]
- Use: `workflow create-agent`
- Reference: module-plan.md for requirements
- Priority: High
- [ ] Implement [Agent 2 Name]
- Use: `workflow create-agent`
- Reference: module-plan.md for requirements
- Priority: High
### Workflows
- [ ] Implement [Workflow 1 Name]
- Use: `workflow create-workflow`
- Input: workflows/[workflow-1]/workflow-plan.md
- Priority: High
- [ ] Implement [Workflow 2 Name]
- Use: `workflow create-workflow`
- Input: workflows/[workflow-2]/workflow-plan.md
- Priority: Medium
### Integration
- [ ] Test agent-workflow integration
- [ ] Update agent menus (remove TODO flags)
- [ ] Validate configuration fields work correctly
## Phase 2: Enhanced Features
### Additional Components
- [ ] [Additional Agent 1]
- Priority: Medium
- [ ] [Additional Workflow 1]
- Priority: Low
### Improvements
- [ ] Add error handling
- [ ] Implement validation
- [ ] Optimize performance
- [ ] Add logging
## Phase 3: Polish and Launch
### Testing
- [ ] Unit test all agents
- [ ] Integration test workflows
- [ ] Test installer in clean project
- [ ] Test with sample data
### Documentation
- [ ] Add detailed API docs
- [ ] Create video tutorials
- [ ] Write troubleshooting guide
- [ ] Add FAQ section
### Release
- [ ] Version bump to 1.0.0
- [ ] Create release notes
- [ ] Tag release in Git
- [ ] Submit to module registry (if applicable)
## Quick Commands
### Create New Agent
```bash
workflow create-agent
```
````
### Create New Workflow
```bash
workflow create-workflow
```
### Test Module Installation
```bash
bmad install {module_name}
```
### Run Agent
```bash
agent {agent_name}
```
### Run Workflow
```bash
workflow {workflow_name}
```
## Development Notes
### Important Considerations
- [Note 1 about implementation]
- [Note 2 about integration]
- [Note 3 about compatibility]
### Dependencies
- [List any external dependencies]
- [BMAD version requirements]
- [Optional integrations]
### Module Structure Reference
```
{module_name}/
├── agents/ # ✅ Created, needs implementation
├── workflows/ # ✅ Structure created, plans written
├── tasks/ # ✅ Created
├── templates/ # ✅ Created
├── data/ # ✅ Created
├── _module-installer/ # ✅ Configured
└── README.md # ✅ Complete
```
## Completion Criteria
The module is complete when:
- [ ] All Phase 1 items are done
- [ ] Installation works smoothly
- [ ] Documentation covers all features
- [ ] Sample usage produces expected results
---
Created: [current date]
Last Updated: [current date]
````
### 4. Prioritize Immediate Next Steps
"**Immediate Next Steps (This Week):**
Based on your module's needs, I recommend starting with:
1. **[Most important agent]** - Core functionality
2. **[Most important workflow]** - Primary user journey
3. **[Integration task]** - Ensure components work together
**Which of these would you like to tackle first?**"
### 5. Provide Development Guidance
"**Development Tips:**
1. **Iterative Development**
- Implement one component at a time
- Test each component before moving on
- Use the module-plan.md as your guide
2. **Testing Strategy**
- Test in a clean project
- Verify installation works
- Check all menu options function
3. **Documentation Updates**
- Update README.md as you implement features
- Mark completed items in this TODO
- Keep the module-plan.md in sync
4. **Getting Help**
- Use BMAD documentation for patterns
- Reference example modules
- Ask for help when stuck"
### 6. Document Roadmap Creation
Update module-plan.md with roadmap section:
```markdown
## Development Roadmap
### TODO.md Created
- Location: {custom_module_location}/{module_name}/TODO.md
- Phases defined: 3
- Immediate tasks prioritized
### Next Steps Priority Order
1. [Priority 1]
2. [Priority 2]
3. [Priority 3]
### Quick Reference Commands
- `workflow create-agent` - Create new agents
- `workflow create-workflow` - Create new workflows
- `bmad install {module_name}` - Test installation
### Development Notes
- [Key implementation notes]
- [Testing recommendations]
- [Integration considerations]
````
### 7. Present MENU OPTIONS
Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue
#### Menu Handling Logic:
- IF A: Execute {advancedElicitationTask} to explore development approaches
- IF P: Execute {partyModeWorkflow} to get creative input on implementation
- IF C: Save roadmap info to module-plan.md, add step-10-roadmap to the end of the stepsCompleted array in frontmatter, then load nextStepFile
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- ALWAYS halt and wait for user input after presenting menu
- ONLY proceed to next step when user selects 'C'
- After other menu items execution, return to this menu
- User can chat or ask questions - always respond then end with display again of the menu options
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- TODO.md created with clear phases
- Tasks prioritized by importance
- Quick reference commands included
- Development guidance provided
- Actionable next steps identified
### ❌ SYSTEM FAILURE:
- Not creating TODO.md file
- Including time estimates
- Not prioritizing tasks effectively
- Missing essential development commands
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
ONLY WHEN C is selected and roadmap info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], will you then load, read entire file, then execute `{nextStepFile}` to begin final validation.

View File

@ -0,0 +1,335 @@
---
workflowFile: '{installed_path}/workflow.md'
modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md'
validationChecklist: '{installed_path}/validation.md'
advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml'
partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md'
---
# Step 11: Validate and Finalize Module
## MANDATORY EXECUTION RULES (READ FIRST):
### Universal Rules:
- 🛑 NEVER generate content without user input
- 📖 CRITICAL: Read the complete step file before taking any action
- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read
- 📋 YOU ARE A FACILITATOR, not a content generator
### Role Reinforcement:
- ✅ You are a Module Architect and Quality Assurance Specialist
- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role
- ✅ We engage in collaborative dialogue, not command-response
- ✅ You bring expertise in BMAD validation patterns, user brings their module knowledge
- ✅ Maintain collaborative, thorough tone
### Step-Specific Rules:
- 🎯 Focus on validation and quality checks
- 🚫 FORBIDDEN to modify core structure at this stage
- 💬 Present findings clearly with recommendations
- 🚫 FORBIDDEN to skip validation steps
## EXECUTION PROTOCOLS:
- 🎯 Run validation checklist systematically
- 💾 Document validation results
- 📖 Append "step-11-validate" to stepsCompleted array` before completing
- 🚫 FORBIDDEN to mark as complete without validation
## CONTEXT BOUNDARIES:
- Module fully created with all components
- Focus on validation, not new creation
- Use validation checklist for systematic review
- Ensure BMAD compliance
## STEP GOAL:
To validate the completed module structure, ensure all components are properly configured, and provide next steps for testing and deployment.
## VALIDATION PROCESS:
### 1. Initialize Validation
"Let's validate your {module_display_name} module to ensure it meets all BMAD standards and is ready for use.
I'll run through a systematic validation checklist to verify everything is properly set up."
### 2. Structure Validation
"**1. Module Structure Check**"
Validate module directory structure
```
Expected Structure:
{module_name}/
├── agents/ [✅/❌]
├── workflows/ [✅/❌]
├── tasks/ [✅/❌]
├── templates/ [✅/❌]
├── data/ [✅/❌]
├── _module-installer/ [✅/❌]
│ ├── install-config.yaml [✅/❌]
│ └── installer.js [✅/N/A]
└── README.md [✅/❌]
```
**Results:**
- [List validation results for each item]
### 3. Configuration Validation
"**2. Configuration Files Check**"
**Install Configuration:**
Validate install-config.yaml
- [ ] YAML syntax valid
- [ ] Module code matches folder name
- [ ] All required fields present
- [ ] Path templates use correct format
- [ ] Configuration fields properly defined
**Module Plan:**
Review module-plan.md
- [ ] All sections completed
- [ ] stepsCompleted array includes all steps
- [ ] Module identity documented
- [ ] Component plan clear
### 4. Component Validation
"**3. Components Check**"
**Agents:**
Check agents folder
- [ ] Agent files created (or placeholders with TODO)
- [ ] YAML frontmatter valid (if created)
- [ ] TODO flags used for missing workflows
- [ ] Reference patterns followed
**Workflows:**
Check workflows folder
- [ ] Folders created for planned workflows
- [ ] workflow-plan.md files created (or placeholders)
- [ ] README.md in each workflow folder
- [ ] Plans include all required sections
### 5. Documentation Validation
"**4. Documentation Check**"
**README.md:**
Review README.md content
- [ ] All sections present
- [ ] Installation instructions correct
- [ ] Usage examples clear
- [ ] Development status accurate
- [ ] Contact information included
**TODO.md:**
Review TODO.md
- [ ] Development phases defined
- [ ] Tasks prioritized
- [ ] Quick commands included
- [ ] Completion criteria clear
### 6. Integration Validation
"**5. Integration Points Check**"
Review integration requirements
- [ ] Agent workflows reference correctly
- [ ] Configuration fields accessible
- [ ] Module paths consistent
- [ ] No circular dependencies
### 7. Present Validation Results
"**Validation Summary:**
**✅ Passed:**
- [List items that passed validation]
**⚠️ Warnings:**
- [List items that need attention but don't block use]
**❌ Issues:**
- [List critical issues that need fixing]
**Overall Status:**
[Ready for testing / Needs fixes before testing]"
### 8. Handle Validation Issues
"**Addressing Issues:**
Let's fix the critical issues before completing the validation."
For each issue:
1. **Explain the issue** clearly
2. **Show how to fix** it
3. **Make the fix** if user approves
4. **Re-validate** the fixed item
Fix issues one by one with user confirmation
### 9. Final Module Summary
"**Module Creation Complete!**
**Module Summary:**
- **Name:** {module_display_name}
- **Code:** {module_name}
- **Location:** {custom_module_location}/{module_name}
- **Type:** {module_type}
- **Status:** Ready for testing
**Created Components:**
- [agent_count] agents ([created] created, [planned-created] planned)
- [workflow_count] workflows (plans created)
- [task_count] tasks
- Complete installer configuration
- Comprehensive documentation
### 10. Next Steps Guidance
"**Your Next Steps:**
1. **Test the Installation:**
```bash
cd [test-project]
bmad install {module_name}
```
2. **Implement Components:**
- Follow TODO.md for prioritized tasks
- Use `workflow create-agent` for remaining agents
- Use `workflow create-workflow` for workflows
3. **Test Functionality:**
- Load agents: `agent [agent-name]`
- Run workflows: `workflow [workflow-name]`
- Verify all menu options work
4. **Iterate and Improve:**
- Gather feedback from users
- Add missing features
- Fix any bugs found
5. **Share Your Module:**
- Document improvements in README.md
- Consider submitting to BMAD registry
- Share with the community"
### 11. Document Validation
Create validation summary in module-plan.md:
```markdown
## Validation Results
### Date Validated
[current date]
### Validation Checklist
- [ ] Structure: Complete
- [ ] Configuration: Valid
- [ ] Components: Ready
- [ ] Documentation: Complete
- [ ] Integration: Verified
### Issues Found and Resolved
[List any issues fixed during validation]
### Final Status
[Ready for testing / Requires additional fixes]
### Next Steps
1. [First next step]
2. [Second next step]
3. [Third next step]
```
### 12. Complete Workflow
Mark workflow as complete:
Update module-plan.md frontmatter:
Add "step-11-validate" to stepsCompleted array
Set lastStep to 'validate'
Set status to 'complete'
Add current date to completionDate
```
"**🎉 Congratulations!**
Your {module_display_name} module has been successfully created and is ready for implementation. You now have a complete, installable BMAD module structure with everything needed to move forward.
Would you like me to help you with anything else?"
### 13. Final MENU OPTIONS
Display: **Module Creation Complete!** [A] Advanced Elicitation [P] Party Mode [C] Exit
#### Menu Handling Logic:
- IF A: Execute {project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml for reflection on process
- IF P: Execute {project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md to celebrate completion
- IF C: Mark as complete and exit gracefully
- IF Any other comments or queries: help user respond then redisplay menu
#### EXECUTION RULES:
- This is the final step - workflow complete
- User can ask questions or exit
- Always respond helpfully to final queries
---
## 🚨 SYSTEM SUCCESS/FAILURE METRICS
### ✅ SUCCESS:
- All validation checks performed
- Issues identified and resolved
- Module marked as complete
- Clear next steps provided
- User satisfied with results
### ❌ SYSTEM FAILURE:
- Skipping validation checks
- Not documenting validation results
- Marking as complete with critical issues
- Not providing next steps guidance
**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE.
## CRITICAL STEP COMPLETION NOTE
WHEN validation is complete, all issues resolved (or documented), and module-plan.md is updated by appending "step-11-validate" to stepsCompleted array, the workflow is complete. Present final summary and allow user to exit or ask final questions.
```

View File

@ -0,0 +1,317 @@
# TEMPLATE
the template to use has comments to help guide generation are are not meant to be in the final agent output
## Agent Template to use
### Hybrid Agent (Can have prompts, sidecar memory, AND workflows)
```yaml
agent:
metadata:
name: '{person-name}'
title: '{agent-title}'
icon: '{agent-icon}'
module: '{module}'
persona:
role: '{agent-role}'
identity: |
{agent-identity - multi-line description}
communication_style: |
{communication-style - multi-line description}
principles:
- '{agent-principle-1}'
- '{agent-principle-2}'
- '{agent-principle-3}'
- '{agent-principle-N}'
# Optional: Only include if agent needs memory/persistence
critical_actions:
- 'Load COMPLETE file ./[agent-name]-sidecar/memories.md and integrate all past interactions'
- 'Load COMPLETE file ./[agent-name]-sidecar/instructions.md and follow ALL protocols'
- 'ONLY read/write files in ./[agent-name]-sidecar/ - this is our private workspace'
# Optional: Embedded prompts for common interactions
prompts:
- id: 'core-function'
content: |
<instructions>
Main interaction pattern for this agent
</instructions>
{Detailed prompt content}
- id: 'quick-task'
content: |
<instructions>
Quick, common task the agent performs
</instructions>
{Prompt for quick task}
menu:
# Always include chat/party mode
- multi: '[CH] Chat with the agent or [SPM] Start Party Mode'
triggers:
- party-mode:
input: SPM or fuzzy match start party mode
route: '{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md'
data: what is being discussed or suggested with the command
type: exec
- expert-chat:
input: CH or fuzzy match validate agent
action: agent responds as expert based on its personal to converse
type: action
# Group related functions
- multi: '[CF] Core Function [QT] Quick Task'
triggers:
- core-function:
input: CF or fuzzy match core function
action: '#core-function'
type: action
- quick-task:
input: QT or fuzzy match quick task
action: '#quick-task'
type: action
# Individual prompts
- trigger: 'analyze'
action: 'Perform deep analysis based on my expertise'
description: 'Analyze situation 🧠'
type: action
# Workflow for complex processes
- trigger: 'generate-report'
route: '{project-root}/{bmad_folder}/{custom_module}/workflows/report-gen/workflow.md'
description: 'Generate detailed report 📊'
# Exec with internal prompt reference
- trigger: 'brainstorm'
route: '#brainstorm-session'
description: 'Brainstorm ideas 💡'
type: exec
```
## Sidecar Folder Structure
When creating expert agents in modules, create a sidecar folder:
```
{custom_module_location}/{module_name}/agents/[agent-name]-sidecar/
├── memories.md # Persistent memory across sessions
├── instructions.md # Agent-specific protocols
├── insights.md # Important breakthroughs/realizations
├── sessions/ # Individual session records
│ ├── session-2024-01-01.md
│ └── session-2024-01-02.md
└── patterns.md # Tracked patterns over time
```
## When to Use Expert Agent vs Workflow Agent
### Use Expert Agent when:
- Primary interaction is conversation/dialogue
- Need to remember context across sessions
- Functions can be handled with prompts (no complex multi-step processes)
- Want to track patterns/memories over time
- Simpler implementation for conversational agents
### Use Workflow Agent when:
- Complex multi-step processes are required
- Need document generation or file operations
- Requires branching logic and decision trees
- Multiple users need to interact with the same process
- Process is more important than conversation
## Menu Action Types
Expert agents support three types of menu actions:
### 1. **Inline Actions** (Direct commands)
```yaml
- trigger: 'save-insight'
action: 'Document this insight in ./[agent-name]-sidecar/insights.md with timestamp'
description: 'Save this insight 💡'
```
- Commands executed directly
- Good for simple file operations or setting context
### 2. **Prompt References** (#prompt-id)
```yaml
- trigger: 'analyze-thoughts'
action: '#thought-exploration' # References prompts section
description: 'Explore thought patterns 💭'
```
- References a prompt from the `prompts` section by id
- Most common for conversational interactions
### 3. **Workflow Routes** (for complex processes)
```yaml
- trigger: 'generate-report'
route: '{project-root}/{bmad_folder}/{custom_module}/workflows/report-gen/workflow.md'
description: 'Generate report 📊'
```
- Routes to a separate workflow file
- Used for complex multi-step processes
## Notes for Module Creation:
1. **File Paths**:
- Agent files go in: `{custom_module_location}/{module_name}/agents/[agent-name].yaml`
- Sidecar folders go in: `{custom_module_location}/{module_name}/agents/[agent-name]-sidecar/`
2. **Variable Usage**:
- `{agent_sidecar_folder}` resolves to the agents sidecar folder destination after installation
- `{bmad_folder}` resolves to .bmad
- `{custom_module}` resolves to custom/src/modules
- `{module}` is your module code/name
3. **Creating Sidecar Structure**:
- When agent is created, also create the sidecar folder
- Initialize with empty files: memories.md, instructions.md
- Create sessions/ subfolder
- These files are automatically loaded due to critical_actions
4. **Choosing Menu Actions**:
- Use **inline actions** for simple commands (save, load, set context)
- Use **prompt references** for conversational flows
- Use **workflow routes** for complex processes needing multiple steps
# Example Module Generated Agent
agent:
metadata:
name: Caravaggio
title: Visual Communication + Presentation Expert
icon: 🎨
module: cis
persona:
role: Visual Communication Expert + Presentation Designer + Educator
identity: |
Master presentation designer who's dissected thousands of successful presentations—from viral YouTube explainers to funded pitch decks to TED talks. I live at the intersection of visual storytelling and persuasive communication.
communication_style: |
Constant sarcastic wit and experimental flair. Talks like you're in the editing room together—dramatic reveals, visual metaphors, "what if we tried THIS?!" energy. Treats every project like a creative challenge, celebrates bold choices, roasts bad design decisions with humor.
principles: - "Know your audience - pitch decks ≠ YouTube thumbnails ≠ conference talks" - "Visual hierarchy drives attention - design the eye's journey deliberately" - "Clarity over cleverness - unless cleverness serves the message" - "Every frame needs a job - inform, persuade, transition, or cut it" - "Push boundaries with Excalidraw's frame-based presentation capabilities"
critical_actions: - 'Load COMPLETE file ./caravaggio-sidecar/projects.md and recall all visual projects' - 'Load COMPLETE file ./caravaggio-sidecar/patterns.md and remember design patterns' - 'ONLY read/write files in ./caravaggio-sidecar/ - my creative studio'
prompts: - id: 'design-critique'
content: |
<instructions>
Analyze the visual design with my signature dramatic flair
</instructions>
Alright, let me see what we've got here. *leans in closer*
First impression: Is this making me shout "BRAVO!" or "BARF!"?
Visual hierarchy scan: Where's my eye landing first? Second? Is it a deliberate journey or visual chaos?
The good stuff: What's working? What's making me grin?
The facepalm moments: Where are we losing impact? What's confusing the message?
My "WHAT IF WE TRIED THIS?!": [Specific dramatic improvement suggestion]
Remember: Design isn't just about pretty - it's about making brains FEEL something.
- id: 'storyboard-session'
content: |
<instructions>
Create visual storyboard concepts using frame-based thinking
</instructions>
Time to storyboards! Let's think in frames:
**Opening Hook:** What's the first visual that grabs them?
**The Turn:** Where do we shift perspective?
**The Reveal:** What's the money shot?
**The Close:** What image sticks with them?
For each frame:
- Visual: What do they SEE?
- Text: What do they READ?
- Emotion: What do they FEEL?
Remember: Each frame is a scene in your visual story. Make it COUNT!
- id: 'brainstorm-session'
content: |
<instructions>
Rapid-fire creative brainstorming for visual concepts
</instructions>
BRAINSTORM MODE! 🔥
Give me three wild ideas:
1. The safe but solid option
2. The "ooh, interesting" middle ground
3. The "are you crazy? LET'S DO IT!" option
For each:
- Visual concept in one sentence
- Why it works (or risks spectacularly)
- "If we go this route, we need..."
Let's push some boundaries! What's the most unexpected way to show this?
menu: # Core interactions - multi: "[CH] Chat with Caravaggio or [SPM] Start Party Mode"
triggers: - party-mode:
input: SPM or fuzzy match start party mode
route: "{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md"
data: what's being discussed, plus custom party agents if specified
type: exec - expert-chat:
input: CH or fuzzy match validate agent
action: agent responds as expert based on its personal to converse
type: action
# Design services group
- multi: "[DC] Design Critique [SB] Storyboard"
triggers:
- design-critique:
input: DC or fuzzy match design critique
route: '#design-critique'
description: 'Ruthless design analysis 🎭'
type: exec
- storyboard:
input: SB or fuzzy match storyboard
route: '#storyboard-session'
description: 'Visual story frames 🎬'
type: exec
# Quick actions
- trigger: 'analyze'
action: 'Quick visual analysis with my signature bluntness'
description: 'Quick visual take 🎯'
type: action
- trigger: 'brainstorm'
action: '#brainstorm-session'
description: 'Creative storm 💡'
type: action
# Document workflows for complex processes
- multi: "[PD] Pitch Deck [EX] Explainer Video"
triggers:
- pitch-deck:
input: PD or fuzzy match pitch deck
route: "{project-root}/{bmad_folder}/{custom_module}/workflows/pitch-deck/workflow.md"
description: 'Investor pitch deck 📈'
- explainer:
input: EX or fuzzy match explainer
route: "{project-root}/{bmad_folder}/{custom_module}/workflows/explainer/workflow.md"
description: 'Video explainer 🎥'
- trigger: 'save-project'
action: 'Document this project concept in ./caravaggio-sidecar/projects.md with sketches and notes'
description: 'Save project 💾'

View File

@ -0,0 +1,53 @@
# {module_display_name} Module Configuration
# This file defines installation questions and module configuration values
code: "${module_name}" # e.g., my-module
name: "{module_display_name}"
default_selected: false
# Welcome message shown during installation
prompt:
- "Thank you for choosing {module_display_name}!"
- "{module_purpose}"
# Core config values are automatically inherited from installer:
## user_name
## communication_language
## document_output_language
## output_folder
# ============================================================================
# CONFIGURATION FIELDS
# ============================================================================
# Each field can be:
# 1. INTERACTIVE (has 'prompt' - asks user during installation)
# 2. STATIC (no 'prompt' - just uses 'result' value)
# ============================================================================
# Example configurations (replace with actual planned fields):
# INTERACTIVE text input:
# output_path:
# prompt: "Where should {module_name} save outputs?"
# default: "output/{module_name}"
# result: "{project-root}/{value}"
# INTERACTIVE single-select:
# detail_level:
# prompt: "How detailed should outputs be?"
# default: "standard"
# result: "{value}"
# single-select:
# - value: "minimal"
# label: "Minimal - Brief summaries only"
# - value: "standard"
# label: "Standard - Balanced detail"
# - value: "detailed"
# label: "Detailed - Comprehensive information"
# STATIC value:
# module_version:
# result: "1.0.0"
# STATIC path:
# data_path:
# result: "{project-root}/{bmad_folder}/{module_name}/data"

View File

@ -0,0 +1,47 @@
/**
* {module_display_name} Module Installer
* Custom installation logic
*/
/**
* @param {Object} options - Installation options
* @param {string} options.projectRoot - Project root directory
* @param {Object} options.config - Module configuration from install-config.yaml
* @param {Array} options.installedIDEs - List of IDE codes being configured
* @param {Object} options.logger - Logger instance (log, warn, error methods)
* @returns {boolean} - true if successful, false to abort installation
*/
async function install(options) {
// eslint-disable-next-line no-unused-vars
const { projectRoot, config, installedIDEs, logger } = options;
logger.log('Installing {module_display_name}...');
try {
// TODO: Add your custom installation logic here
// Example: Create data directory
// const fs = require('fs');
// const dataPath = config.data_path;
// if (!fs.existsSync(dataPath)) {
// fs.mkdirSync(dataPath, { recursive: true });
// logger.log(`Created data directory: ${dataPath}`);
// }
// Example: Initialize configuration file
// const configPath = path.join(projectRoot, config.config_file);
// fs.writeFileSync(configPath, JSON.stringify({
// initialized: new Date().toISOString(),
// version: config.module_version
// }, null, 2));
logger.log('{module_display_name} installation complete!');
return true;
} catch (error) {
logger.error(`Installation failed: ${error.message}`);
return false;
}
}
// eslint-disable-next-line unicorn/prefer-module
module.exports = { install };

View File

@ -0,0 +1,5 @@
---
stepsCompleted: []
---
# Module Plan {module name}

View File

@ -0,0 +1,23 @@
# Workflow Plan Template
Use this template when creating workflow plans in step-07-workflows.md
## Template Structure
Copy the content from step-07-workflows.md when creating workflow plans. The template is embedded in the step file as a code block under "Workflow plan template".
## Usage
1. Navigate to the workflow folder
2. Create workflow-plan.md
3. Use the template structure from step-07-workflows.md
4. Fill in details specific to your workflow
## Required Sections
- Purpose
- Requirements (User Inputs, Prerequisites, Dependencies)
- Proposed Steps
- Expected Outputs
- Integration Points
- Implementation Notes

View File

@ -0,0 +1,126 @@
# Create Module Workflow Validation Checklist
This document provides the validation criteria used in step-11-validate.md to ensure module quality and BMAD compliance.
## Structure Validation
### Required Directories
- [ ] agents/ - Agent definition files
- [ ] workflows/ - Workflow folders
- [ ] tasks/ - Task files (if needed)
- [ ] templates/ - Shared templates
- [ ] data/ - Module data
- [ ] \_module-installer/ - Installation config
- [ ] README.md - Module documentation
### Required Files in \_module-installer/
- [ ] install-config.yaml - Installation configuration
- [ ] installer.js - Custom logic (if needed)
## Configuration Validation
### install-config.yaml
- [ ] Valid YAML syntax
- [ ] Module code matches folder name
- [ ] Name field present
- [ ] Prompt array with welcome messages
- [ ] Configuration fields properly defined
- [ ] Result templates use correct placeholders
### Module Plan
- [ ] All sections completed
- [ ] Module identity documented
- [ ] Component plan clear
- [ ] Configuration plan documented
## Component Validation
### Agents
- [ ] Files created in agents/ folder
- [ ] YAML frontmatter valid (for created agents)
- [ ] TODO flags used for non-existent workflows
- [ ] Menu items follow BMAD patterns
- [ ] Placeholder files contain TODO notes
### Workflows
- [ ] Folders created for each planned workflow
- [ ] workflow-plan.md in each folder
- [ ] README.md in each workflow folder
- [ ] Plans include all required sections
- [ ] Placeholder READMEs created for unplanned workflows
## Documentation Validation
### README.md
- [ ] Module name and purpose
- [ ] Installation instructions
- [ ] Components section
- [ ] Quick start guide
- [ ] Module structure diagram
- [ ] Configuration section
- [ ] Usage examples
- [ ] Development status
- [ ] Author information
### TODO.md
- [ ] Development phases defined
- [ ] Tasks prioritized
- [ ] Quick commands included
- [ ] Completion criteria defined
## Integration Validation
### Path Consistency
- [ ] All paths use correct template format
- [ ] Module code consistent throughout
- [ ] No hardcoded paths
- [ ] Cross-references correct
### Agent-Workflow Integration
- [ ] Agents reference correct workflows
- [ ] TODO flags used appropriately
- [ ] No circular dependencies
- [ ] Clear integration points
## BMAD Compliance
### Standards
- [ ] Follows BMAD module structure
- [ ] Uses BMAD installation patterns
- [ ] Agent files follow BMAD format
- [ ] Workflow plans follow BMAD patterns
### Best Practices
- [ ] Clear naming conventions
- [ ] Proper documentation
- [ ] Version control ready
- [ ] Installable via bmad install
## Final Checklist
### Before Marking Complete
- [ ] All validation items checked
- [ ] Critical issues resolved
- [ ] Module plan updated with final status
- [ ] stepsCompleted includes all 11 steps
- [ ] User satisfied with result
### Ready for Testing
- [ ] Installation should work
- [ ] Documentation accurate
- [ ] Structure complete
- [ ] Next steps clear

View File

@ -0,0 +1,55 @@
---
name: create-module
description: 'Interactive workflow to build complete BMAD modules with agents, workflows, and installation infrastructure'
web_bundle: true
installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module'
---
# Create Module Workflow
**Goal:** To guide users through creating complete, installable BMAD modules with proper structure, agents, workflow plans, and documentation.
**Your Role:** In addition to your name, communication_style, and persona, you are also a Module Architect and BMAD Systems Specialist collaborating with module creators. This is a partnership, not a client-vendor relationship. You bring expertise in BMAD architecture, component design, and installation patterns, while the user brings their domain knowledge and specific module requirements. Work together as equals.
## WORKFLOW ARCHITECTURE
### Core Principles
- **Micro-file Design**: Each step of the overall goal is a self contained instruction file that you will adhere too 1 file as directed at a time
- **Just-In-Time Loading**: Only 1 current step file will be loaded, read, and executed to completion - 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, load, read entire file, then execute 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. Module Configuration Loading
Load and read full config from {project-root}/{bmad_folder}/bmb/config.yaml and resolve:
- `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language`, `custom_module_location`
### 2. First Step EXECUTION
Load, read the full file and then execute {installed_path}/steps/step-01-init.md to begin the workflow.

View File

@ -2,7 +2,7 @@
code: bmm
name: "BMM: BMad Method Agile-AI Driven-Development"
default_selected: true # This module will be selected by default for new installations
default_selected: false # This module will be selected by default for new installations
header: "BMad Method™: Breakthrough Method of Agile-Ai Driven-Dev"
subheader: "Agent and Workflow Configuration for this module"

View File

@ -39,11 +39,14 @@ agent:
workflow: "{project-root}/{bmad_folder}/bmm/workflows/document-project/workflow.yaml"
description: Document your existing project (optional, but recommended for existing brownfield project efforts)
- trigger: party-mode
exec: "{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md"
description: Bring the whole team in to chat with other expert agents from the party
- trigger: advanced-elicitation
exec: "{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml"
description: Advanced elicitation techniques to challenge the LLM to get better results
web-only: true
- multi: "[SPM] Start Party Mode (optionally suggest attendees and topic), [CH] Chat"
triggers:
- party-mode:
- input: SPM or fuzzy match start party mode
- route: "{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md"
- data: what is being discussed or suggested with the command, along with custom party custom agents if specified
- type: exec
- expert-chat:
- input: CH or fuzzy match validate agent
- action: agent responds as expert based on its personal to converse
- type: action

View File

@ -139,6 +139,9 @@ Comprehensive documentation for all BMM workflows organized by phase:
- Complete story lifecycle
- One-story-at-a-time discipline
<<<<<<< Updated upstream
<<<<<<< Updated upstream
- **[Testing & QA Workflows](./test-architecture.md)** - Comprehensive quality assurance (1,420 lines)
- Test strategy, automation, quality gates
- TEA agent and test healing
@ -146,6 +149,14 @@ Comprehensive documentation for all BMM workflows organized by phase:
**Total: 34 workflows documented across all phases**
=======
> > > > > > > Stashed changes
=======
> > > > > > > Stashed changes
### Advanced Workflow References
For detailed technical documentation on specific complex workflows:
@ -170,10 +181,21 @@ Quality assurance guidance:
<!-- Test Architect documentation to be added -->
<<<<<<< Updated upstream
<<<<<<< Updated upstream
- Test design workflows
- Quality gates
- Risk assessment
- NFR validation
- # NFR validation
=======
> > > > > > > Stashed changes
- Test design workflows
- Quality gates
- Risk assessment
- NFR validation
> > > > > > > Stashed changes
---

View File

@ -725,6 +725,7 @@ flowchart TD
- **[Quick Start Guide](./quick-start.md)** - Getting started with BMM
- **[Glossary](./glossary.md)** - Key terminology
- **[FAQ](./faq.md)** - Common questions
- **[Troubleshooting](./troubleshooting.md)** - Problem resolution
- **[Workflow Documentation](./README.md#-workflow-guides)** - Complete workflow reference
---
@ -739,7 +740,7 @@ flowchart TD
**Documentation:**
- [Test Architect Guide](./test-architecture.md) - Comprehensive testing strategy
- **[Test Architect Guide](./test-architecture.md)** - Comprehensive testing strategy
- [BMM Module README](../README.md) - Complete module and workflow reference
---

View File

@ -95,6 +95,10 @@ Game development equivalent of PRD, created by Game Designer agent for game proj
## Workflow and Phases
### Phase 0: Documentation (Prerequisite)
**Conditional phase for brownfield projects.** Creates comprehensive codebase documentation before planning. Only required if existing documentation is insufficient for AI agents.
### Phase 1: Analysis (Optional)
Discovery and research phase including brainstorming, research workflows, and product brief creation. Optional for Quick Flow, recommended for BMad Method, required for Enterprise Method.

View File

@ -0,0 +1,652 @@
# BMad Quick Spec Flow
**Perfect for:** Bug fixes, small features, rapid prototyping, and quick enhancements
**Time to implementation:** Minutes, not hours
---
## What is Quick Spec Flow?
Quick Spec Flow is a **streamlined alternative** to the full BMad Method for Quick Flow track projects. Instead of going through Product Brief → PRD → Architecture, you go **straight to a context-aware technical specification** and start coding.
### When to Use Quick Spec Flow
✅ **Use Quick Flow track when:**
- Single bug fix or small enhancement
- Small feature with clear scope (typically 1-15 stories)
- Rapid prototyping or experimentation
- Adding to existing brownfield codebase
- You know exactly what you want to build
❌ **Use BMad Method or Enterprise tracks when:**
- Building new products or major features
- Need stakeholder alignment
- Complex multi-team coordination
- Requires extensive planning and architecture
💡 **Not sure?** Run `workflow-init` to get a recommendation based on your project's needs!
---
## Quick Spec Flow Overview
```mermaid
flowchart TD
START[Step 1: Run Tech-Spec Workflow]
DETECT[Detects project stack<br/>package.json, requirements.txt, etc.]
ANALYZE[Analyzes brownfield codebase<br/>if exists]
TEST[Detects test frameworks<br/>and conventions]
CONFIRM[Confirms conventions<br/>with you]
GENERATE[Generates context-rich<br/>tech-spec]
STORIES[Creates ready-to-implement<br/>stories]
OPTIONAL[Step 2: Optional<br/>Generate Story Context<br/>SM Agent<br/>For complex scenarios only]
IMPL[Step 3: Implement<br/>DEV Agent<br/>Code, test, commit]
DONE[DONE! 🚀]
START --> DETECT
DETECT --> ANALYZE
ANALYZE --> TEST
TEST --> CONFIRM
CONFIRM --> GENERATE
GENERATE --> STORIES
STORIES --> OPTIONAL
OPTIONAL -.->|Optional| IMPL
STORIES --> IMPL
IMPL --> DONE
style START fill:#bfb,stroke:#333,stroke-width:2px
style OPTIONAL fill:#ffb,stroke:#333,stroke-width:2px,stroke-dasharray: 5 5
style IMPL fill:#bbf,stroke:#333,stroke-width:2px
style DONE fill:#f9f,stroke:#333,stroke-width:3px
```
---
## Single Atomic Change
**Best for:** Bug fixes, single file changes, isolated improvements
### What You Get
1. **tech-spec.md** - Comprehensive technical specification with:
- Problem statement and solution
- Detected framework versions and dependencies
- Brownfield code patterns (if applicable)
- Existing test patterns to follow
- Specific file paths to modify
- Complete implementation guidance
2. **story-[slug].md** - Single user story ready for development
### Quick Spec Flow Commands
```bash
# Start Quick Spec Flow (no workflow-init needed!)
# Load PM agent and run tech-spec
# When complete, implement directly:
# Load DEV agent and run dev-story
```
### What Makes It Quick
- ✅ No Product Brief needed
- ✅ No PRD needed
- ✅ No Architecture doc needed
- ✅ Auto-detects your stack
- ✅ Auto-analyzes brownfield code
- ✅ Auto-validates quality
- ✅ Story context optional (tech-spec is comprehensive!)
### Example Single Change Scenarios
- "Fix the login validation bug"
- "Add email field to user registration form"
- "Update API endpoint to return additional field"
- "Improve error handling in payment processing"
---
## Coherent Small Feature
**Best for:** Small features with 2-3 related user stories
### What You Get
1. **tech-spec.md** - Same comprehensive spec as single change projects
2. **epics.md** - Epic organization with story breakdown
3. **story-[epic-slug]-1.md** - First story
4. **story-[epic-slug]-2.md** - Second story
5. **story-[epic-slug]-3.md** - Third story (if needed)
### Quick Spec Flow Commands
```bash
# Start Quick Spec Flow
# Load PM agent and run tech-spec
# Optional: Organize stories as a sprint
# Load SM agent and run sprint-planning
# Implement story-by-story:
# Load DEV agent and run dev-story for each story
```
### Story Sequencing
Stories are **automatically validated** to ensure proper sequence:
- ✅ No forward dependencies (Story 2 can't depend on Story 3)
- ✅ Clear dependency documentation
- ✅ Infrastructure → Features → Polish order
- ✅ Backend → Frontend flow
### Example Small Feature Scenarios
- "Add OAuth social login (Google, GitHub, Twitter)"
- "Build user profile page with avatar upload"
- "Implement basic search with filters"
- "Add dark mode toggle to application"
---
## Smart Context Discovery
Quick Spec Flow automatically discovers and uses:
### 1. Existing Documentation
- Product briefs (if they exist)
- Research documents
- `document-project` output (brownfield codebase map)
### 2. Project Stack
- **Node.js:** package.json → frameworks, dependencies, scripts, test framework
- **Python:** requirements.txt, pyproject.toml → packages, tools
- **Ruby:** Gemfile → gems and versions
- **Java:** pom.xml, build.gradle → Maven/Gradle dependencies
- **Go:** go.mod → modules
- **Rust:** Cargo.toml → crates
- **PHP:** composer.json → packages
### 3. Brownfield Code Patterns
- Directory structure and organization
- Existing code patterns (class-based, functional, MVC)
- Naming conventions (camelCase, snake_case, PascalCase)
- Test frameworks and patterns
- Code style (semicolons, quotes, indentation)
- Linter/formatter configs
- Error handling patterns
- Logging conventions
- Documentation style
### 4. Convention Confirmation
**IMPORTANT:** Quick Spec Flow detects your conventions and **asks for confirmation**:
```
I've detected these conventions in your codebase:
Code Style:
- ESLint with Airbnb config
- Prettier with single quotes, 2-space indent
- No semicolons
Test Patterns:
- Jest test framework
- .test.js file naming
- expect() assertion style
Should I follow these existing conventions? (yes/no)
```
**You decide:** Conform to existing patterns or establish new standards!
---
## Modern Best Practices via WebSearch
Quick Spec Flow stays current by using WebSearch when appropriate:
### For Greenfield Projects
- Searches for latest framework versions
- Recommends official starter templates
- Suggests modern best practices
### For Outdated Dependencies
- Detects if your dependencies are >2 years old
- Searches for migration guides
- Notes upgrade complexity
### Starter Template Recommendations
For greenfield projects, Quick Spec Flow recommends:
**React:**
- Vite (modern, fast)
- Next.js (full-stack)
**Python:**
- cookiecutter templates
- FastAPI starter
**Node.js:**
- NestJS CLI
- express-generator
**Benefits:**
- ✅ Modern best practices baked in
- ✅ Proper project structure
- ✅ Build tooling configured
- ✅ Testing framework set up
- ✅ Faster time to first feature
---
## UX/UI Considerations
For user-facing changes, Quick Spec Flow captures:
- UI components affected (create vs modify)
- UX flow changes (current vs new)
- Responsive design needs (mobile, tablet, desktop)
- Accessibility requirements:
- Keyboard navigation
- Screen reader compatibility
- ARIA labels
- Color contrast standards
- User feedback patterns:
- Loading states
- Error messages
- Success confirmations
- Progress indicators
---
## Auto-Validation and Quality Assurance
Quick Spec Flow **automatically validates** everything:
### Tech-Spec Validation (Always Runs)
Checks:
- ✅ Context gathering completeness
- ✅ Definitiveness (no "use X or Y" statements)
- ✅ Brownfield integration quality
- ✅ Stack alignment
- ✅ Implementation readiness
Generates scores:
```
✅ Validation Passed!
- Context Gathering: Comprehensive
- Definitiveness: All definitive
- Brownfield Integration: Excellent
- Stack Alignment: Perfect
- Implementation Readiness: ✅ Ready
```
### Story Validation (Multi-Story Features)
Checks:
- ✅ Story sequence (no forward dependencies!)
- ✅ Acceptance criteria quality (specific, testable)
- ✅ Completeness (all tech spec tasks covered)
- ✅ Clear dependency documentation
**Auto-fixes issues if found!**
---
## Complete User Journey
### Scenario 1: Bug Fix (Single Change)
**Goal:** Fix login validation bug
**Steps:**
1. **Start:** Load PM agent, say "I want to fix the login validation bug"
2. **PM runs tech-spec workflow:**
- Asks: "What problem are you solving?"
- You explain the validation issue
- Detects your Node.js stack (Express 4.18.2, Jest for testing)
- Analyzes existing UserService code patterns
- Asks: "Should I follow your existing conventions?" → You say yes
- Generates tech-spec.md with specific file paths and patterns
- Creates story-login-fix.md
3. **Implement:** Load DEV agent, run `dev-story`
- DEV reads tech-spec (has all context!)
- Implements fix following existing patterns
- Runs tests (following existing Jest patterns)
- Done!
**Total time:** 15-30 minutes (mostly implementation)
---
### Scenario 2: Small Feature (Multi-Story)
**Goal:** Add OAuth social login (Google, GitHub)
**Steps:**
1. **Start:** Load PM agent, say "I want to add OAuth social login"
2. **PM runs tech-spec workflow:**
- Asks about the feature scope
- You specify: Google and GitHub OAuth
- Detects your stack (Next.js 13.4, NextAuth.js already installed!)
- Analyzes existing auth patterns
- Confirms conventions with you
- Generates:
- tech-spec.md (comprehensive implementation guide)
- epics.md (OAuth Integration epic)
- story-oauth-1.md (Backend OAuth setup)
- story-oauth-2.md (Frontend login buttons)
3. **Optional Sprint Planning:** Load SM agent, run `sprint-planning`
4. **Implement Story 1:**
- Load DEV agent, run `dev-story` for story 1
- DEV implements backend OAuth
5. **Implement Story 2:**
- DEV agent, run `dev-story` for story 2
- DEV implements frontend
- Done!
**Total time:** 1-3 hours (mostly implementation)
---
## Integration with Phase 4 Workflows
Quick Spec Flow works seamlessly with all Phase 4 implementation workflows:
### story-context (SM Agent)
- ✅ Recognizes tech-spec.md as authoritative source
- ✅ Extracts context from tech-spec (replaces PRD)
- ✅ Generates XML context for complex scenarios
### create-story (SM Agent)
- ✅ Can work with tech-spec.md instead of PRD
- ✅ Uses epics.md from tech-spec workflow
- ✅ Creates additional stories if needed
### sprint-planning (SM Agent)
- ✅ Works with epics.md from tech-spec
- ✅ Organizes multi-story features for coordinated implementation
- ✅ Tracks progress through sprint-status.yaml
### dev-story (DEV Agent)
- ✅ Reads stories generated by tech-spec
- ✅ Uses tech-spec.md as comprehensive context
- ✅ Implements following detected conventions
---
## Comparison: Quick Spec vs Full BMM
| Aspect | Quick Flow Track | BMad Method/Enterprise Tracks |
| --------------------- | ---------------------------- | ---------------------------------- |
| **Setup** | None (standalone) | workflow-init recommended |
| **Planning Docs** | tech-spec.md only | Product Brief → PRD → Architecture |
| **Time to Code** | Minutes | Hours to days |
| **Best For** | Bug fixes, small features | New products, major features |
| **Context Discovery** | Automatic | Manual + guided |
| **Story Context** | Optional (tech-spec is rich) | Required (generated from PRD) |
| **Validation** | Auto-validates everything | Manual validation steps |
| **Brownfield** | Auto-analyzes and conforms | Manual documentation required |
| **Conventions** | Auto-detects and confirms | Document in PRD/Architecture |
---
## When to Graduate from Quick Flow to BMad Method
Start with Quick Flow, but switch to BMad Method when:
- ❌ Project grows beyond initial scope
- ❌ Multiple teams need coordination
- ❌ Stakeholders need formal documentation
- ❌ Product vision is unclear
- ❌ Architectural decisions need deep analysis
- ❌ Compliance/regulatory requirements exist
💡 **Tip:** You can always run `workflow-init` later to transition from Quick Flow to BMad Method!
---
## Quick Spec Flow - Key Benefits
### 🚀 **Speed**
- No Product Brief
- No PRD
- No Architecture doc
- Straight to implementation
### 🧠 **Intelligence**
- Auto-detects stack
- Auto-analyzes brownfield
- Auto-validates quality
- WebSearch for current info
### 📐 **Respect for Existing Code**
- Detects conventions
- Asks for confirmation
- Follows patterns
- Adapts vs. changes
### ✅ **Quality**
- Auto-validation
- Definitive decisions (no "or" statements)
- Comprehensive context
- Clear acceptance criteria
### 🎯 **Focus**
- Single atomic changes
- Coherent small features
- No scope creep
- Fast iteration
---
## Getting Started
### Prerequisites
- BMad Method installed (`npx bmad-method install`)
- Project directory with code (or empty for greenfield)
### Quick Start Commands
```bash
# For a quick bug fix or small change:
# 1. Load PM agent
# 2. Say: "I want to [describe your change]"
# 3. PM will ask if you want to run tech-spec
# 4. Answer questions about your change
# 5. Get tech-spec + story
# 6. Load DEV agent and implement!
# For a small feature with multiple stories:
# Same as above, but get epic + 2-3 stories
# Optionally use SM sprint-planning to organize
```
### No workflow-init Required!
Quick Spec Flow is **fully standalone**:
- Detects if it's a single change or multi-story feature
- Asks for greenfield vs brownfield
- Works without status file tracking
- Perfect for rapid prototyping
---
## FAQ
### Q: Can I use Quick Spec Flow on an existing project?
**A:** Yes! It's perfect for brownfield projects. It will analyze your existing code, detect patterns, and ask if you want to follow them.
### Q: What if I don't have a package.json or requirements.txt?
**A:** Quick Spec Flow will work in greenfield mode, recommend starter templates, and use WebSearch for modern best practices.
### Q: Do I need to run workflow-init first?
**A:** No! Quick Spec Flow is standalone. But if you want guidance on which flow to use, workflow-init can help.
### Q: Can I use this for frontend changes?
**A:** Absolutely! Quick Spec Flow captures UX/UI considerations, component changes, and accessibility requirements.
### Q: What if my Quick Flow project grows?
**A:** No problem! You can always transition to BMad Method by running workflow-init and create-prd. Your tech-spec becomes input for the PRD.
### Q: Do I need story-context for every story?
**A:** Usually no! Tech-spec is comprehensive enough for most Quick Flow projects. Only use story-context for complex edge cases.
### Q: Can I skip validation?
**A:** No, validation always runs automatically. But it's fast and catches issues early!
### Q: Will it work with my team's code style?
**A:** Yes! It detects your conventions and asks for confirmation. You control whether to follow existing patterns or establish new ones.
---
## Tips and Best Practices
### 1. **Be Specific in Discovery**
When describing your change, provide specifics:
- ✅ "Fix email validation in UserService to allow plus-addressing"
- ❌ "Fix validation bug"
### 2. **Trust the Convention Detection**
If it detects your patterns correctly, say yes! It's faster than establishing new conventions.
### 3. **Use WebSearch Recommendations for Greenfield**
Starter templates save hours of setup time. Let Quick Spec Flow find the best ones.
### 4. **Review the Auto-Validation**
When validation runs, read the scores. They tell you if your spec is production-ready.
### 5. **Story Context is Optional**
For single changes, try going directly to dev-story first. Only add story-context if you hit complexity.
### 6. **Keep Single Changes Truly Atomic**
If your "single change" needs 3+ files, it might be a multi-story feature. Let the workflow guide you.
### 7. **Validate Story Sequence for Multi-Story Features**
When you get multiple stories, check the dependency validation output. Proper sequence matters!
---
## Real-World Examples
### Example 1: Adding Logging (Single Change)
**Input:** "Add structured logging to payment processing"
**Tech-Spec Output:**
- Detected: winston 3.8.2 already in package.json
- Analyzed: Existing services use winston with JSON format
- Confirmed: Follow existing logging patterns
- Generated: Specific file paths, log levels, format example
- Story: Ready to implement in 1-2 hours
**Result:** Consistent logging added, following team patterns, no research needed.
---
### Example 2: Search Feature (Multi-Story)
**Input:** "Add search to product catalog with filters"
**Tech-Spec Output:**
- Detected: React 18.2.0, MUI component library, Express backend
- Analyzed: Existing ProductList component patterns
- Confirmed: Follow existing API and component structure
- Generated:
- Epic: Product Search Functionality
- Story 1: Backend search API with filters
- Story 2: Frontend search UI component
- Auto-validated: Story 1 → Story 2 sequence correct
**Result:** Search feature implemented in 4-6 hours with proper architecture.
---
## Summary
Quick Spec Flow is your **fast path from idea to implementation** for:
- 🐛 Bug fixes
- ✨ Small features
- 🚀 Rapid prototyping
- 🔧 Quick enhancements
**Key Features:**
- Auto-detects your stack
- Auto-analyzes brownfield code
- Auto-validates quality
- Respects existing conventions
- Uses WebSearch for modern practices
- Generates comprehensive tech-specs
- Creates implementation-ready stories
**Time to code:** Minutes, not hours.
**Ready to try it?** Load the PM agent and say what you want to build! 🚀
---
## Next Steps
- **Try it now:** Load PM agent and describe a small change
- **Learn more:** See the [BMM Workflow Guides](./README.md#-workflow-guides) for comprehensive workflow documentation
- **Need help deciding?** Run `workflow-init` to get a recommendation
- **Have questions?** Join us on Discord: <https://discord.gg/gk8jAdXWmj>
---
_Quick Spec Flow - Because not every change needs a Product Brief._

View File

@ -0,0 +1,680 @@
# BMM Troubleshooting Guide
Common issues and solutions for the BMad Method Module.
---
## Quick Diagnosis
**Use this flowchart to find your issue:**
```mermaid
flowchart TD
START{What's the problem?}
START -->|Can't get started| SETUP[Setup & Installation Issues]
START -->|Wrong level detected| LEVEL[Level Detection Problems]
START -->|Workflow not working| WORKFLOW[Workflow Issues]
START -->|Agent lacks context| CONTEXT[Context & Documentation Issues]
START -->|Implementation problems| IMPL[Implementation Issues]
START -->|Files/paths wrong| FILES[File & Path Issues]
style START fill:#ffb,stroke:#333,stroke-width:2px
style SETUP fill:#bfb,stroke:#333,stroke-width:2px
style LEVEL fill:#bbf,stroke:#333,stroke-width:2px
style WORKFLOW fill:#fbf,stroke:#333,stroke-width:2px
style CONTEXT fill:#f9f,stroke:#333,stroke-width:2px
```
---
## Table of Contents
- [Setup and Installation Issues](#setup-and-installation-issues)
- [Level Detection Problems](#level-detection-problems)
- [Workflow Issues](#workflow-issues)
- [Context and Documentation Issues](#context-and-documentation-issues)
- [Implementation Issues](#implementation-issues)
- [File and Path Issues](#file-and-path-issues)
- [Agent Behavior Issues](#agent-behavior-issues)
- [Integration Issues (Brownfield)](#integration-issues-brownfield)
---
## Setup and Installation Issues
### Problem: BMM not found after installation
**Symptoms:**
- `bmad` command not recognized
- Agent files not accessible
- Workflows don't load
**Solution:**
```bash
# Check if BMM is installed
ls bmad/
# If not present, run installer
npx bmad-method@alpha install
# For fresh install
npx bmad-method@alpha install --skip-version-prompt
```
### Problem: Agents don't have menu
**Symptoms:**
- Load agent file but no menu appears
- Agent doesn't respond to commands
**Solution:**
1. Ensure you're loading the correct agent file path: `bmad/bmm/agents/[agent-name].md`
2. Wait a few seconds for agent to initialize
3. Try asking "show menu" or "help"
4. Check IDE supports Markdown rendering with context
5. For Claude Code: Ensure agent file is open in chat context
### Problem: Workflows not found
**Symptoms:**
- Agent says workflow doesn't exist
- Menu shows workflow but won't run
**Solution:**
1. Check workflow exists: `ls bmad/bmm/workflows/`
2. Verify agent has access to workflow (check agent's workflow list)
3. Try using menu number instead of workflow name
4. Restart chat with agent in fresh session
---
## Level Detection Problems
### Problem: workflow-init suggests wrong level
**Symptoms:**
- Detects Level 3 but you only need Level 1
- Suggests Level 1 but project is actually Level 2
- Can't figure out appropriate level
**Solution:**
1. **Override the suggestion** - workflow-init always asks for confirmation, just say "no" and choose correct level
2. **Be specific in description** - Use level keywords when describing:
- "fix bug" → Level 0
- "add small feature" → Level 1
- "build dashboard" → Level 2
3. **Manual override** - You can always switch levels later if needed
**Example:**
```
workflow-init: "Level 3 project?"
You: "No, this is just adding OAuth login - Level 1"
workflow-init: "Got it, creating Level 1 workflow"
```
### Problem: Project level unclear
**Symptoms:**
- Between Level 1 and Level 2
- Not sure if architecture needed
- Story count uncertain
**Solution:**
**When in doubt, start smaller:**
- Choose Level 1 instead of Level 2
- You can always run `create-prd` later if needed
- Level 1 is faster, less overhead
- Easy to upgrade, hard to downgrade
**Decision criteria:**
- Single epic with related stories? → Level 1
- Multiple independent epics? → Level 2
- Need product-level planning? → Level 2
- Just need technical plan? → Level 1
### Problem: Old planning docs influencing level detection
**Symptoms:**
- Old Level 3 PRD in folder
- Working on new Level 0 bug fix
- workflow-init suggests Level 3
**Solution:**
workflow-init asks: "Is this work in progress or previous effort?"
- Answer: "Previous effort"
- Then describe your NEW work clearly
- System will detect level based on NEW work, not old artifacts
---
## Workflow Issues
### Problem: Workflow fails or hangs
**Symptoms:**
- Workflow starts but doesn't complete
- Agent stops responding mid-workflow
- Progress stalls
**Solution:**
1. **Check context limits** - Start fresh chat for complex workflows
2. **Verify prerequisites**:
- Phase 2 needs Phase 1 complete (if used)
- Phase 3 needs Phase 2 complete
- Phase 4 needs Phase 3 complete (if Level 3-4)
3. **Restart workflow** - Load agent in new chat and restart
4. **Check status file** - Verify `bmm-workflow-status.md` or `sprint-status.yaml` is present and valid
### Problem: Agent says "workflow not found"
**Symptoms:**
- Request workflow by name
- Agent doesn't recognize it
- Menu doesn't show workflow
**Solution:**
1. Check spelling/format - Use exact workflow name or menu shortcut (`*prd` not `*PRD`)
2. Verify agent has workflow:
- PM agent: prd, tech-spec
- Architect agent: create-architecture, validate-architecture
- SM agent: sprint-planning, create-story, story-context
3. Try menu number instead of name
4. Check you're using correct agent for workflow
### Problem: Sprint-planning workflow fails
**Symptoms:**
- Can't create sprint-status.yaml
- Epics not extracted from files
- Status file empty or incorrect
**Solution:**
1. **Verify epic files exist**:
- Level 1: tech-spec with epic
- Level 2-4: epics.md or sharded epic files
2. **Check file format**:
- Epic files should be valid Markdown
- Epic headers should be clear (## Epic Name)
3. **Run in Phase 4 only** - Ensure Phase 2/3 complete first
4. **Check file paths** - Epic files should be in correct output folder
### Problem: story-context generates empty or wrong context
**Symptoms:**
- Context file created but has no useful content
- Context doesn't reference existing code
- Missing technical guidance
**Solution:**
1. **Run epic-tech-context first** - story-context builds on epic context
2. **Check story file exists** - Verify story was created by create-story
3. **For brownfield**:
- Ensure document-project was run
- Verify docs/index.md exists with codebase context
4. **Try regenerating** - Sometimes needs fresh attempt with more specific story details
---
## Context and Documentation Issues
### Problem: AI agents lack codebase understanding (Brownfield)
**Symptoms:**
- Suggestions don't align with existing patterns
- Ignores available components
- Proposes approaches that conflict with architecture
- Doesn't reference existing code
**Solution:**
1. **Run document-project** - Critical for brownfield projects
```
Load Analyst agent → run document-project
Choose scan level: Deep (recommended for PRD prep)
```
2. **Verify docs/index.md exists** - This is master entry point for AI agents
3. **Check documentation completeness**:
- Review generated docs/index.md
- Ensure key systems are documented
4. **Run deep-dive on specific areas** if needed
### Problem: Have documentation but agents can't find it
**Symptoms:**
- README.md, ARCHITECTURE.md exist
- AI agents still ask questions answered in docs
- No docs/index.md file
**Solution:**
**Option 1: Quick fix (2-5min)**
Run `index-docs` task:
- Located at `bmad/core/tasks/index-docs.xml`
- Scans existing docs and generates index.md
- Lightweight, just creates navigation
**Option 2: Comprehensive (10-30min)**
Run document-project workflow:
- Discovers existing docs in Step 2
- Generates NEW AI-friendly documentation from codebase
- Creates index.md linking to BOTH existing and new docs
**Why this matters:** AI agents need structured entry point (index.md) to navigate docs efficiently.
### Problem: document-project takes too long
**Symptoms:**
- Exhaustive scan running for hours
- Impatient to start planning
**Solution:**
**Choose appropriate scan level:**
- **Quick (2-5min)** - Pattern analysis, no source reading - Good for initial overview
- **Deep (10-30min)** - Reads critical paths - **Recommended for most brownfield projects**
- **Exhaustive (30-120min)** - Reads all files - Only for migration planning or complete understanding
For most brownfield projects, **Deep scan is sufficient**.
---
## Implementation Issues
### Problem: Existing tests breaking (Brownfield)
**Symptoms:**
- Regression test failures
- Previously working functionality broken
- Integration tests failing
**Solution:**
1. **Review changes against existing patterns**:
- Check if new code follows existing conventions
- Verify API contracts unchanged (unless intentionally versioned)
2. **Run test-review workflow** (TEA agent):
- Analyzes test coverage
- Identifies regression risks
- Suggests fixes
3. **Add regression testing to DoD**:
- All existing tests must pass
- Add integration tests for new code
4. **Consider feature flags** for gradual rollout
### Problem: Story takes much longer than estimated
**Symptoms:**
- Story estimated 4 hours, took 12 hours
- Acceptance criteria harder than expected
- Hidden complexity discovered
**Solution:**
**This is normal!** Estimates are estimates. To handle:
1. **Continue until DoD met** - Don't compromise quality
2. **Document learnings in retrospective**:
- What caused the overrun?
- What should we watch for next time?
3. **Consider splitting story** if it's truly two stories
4. **Adjust future estimates** based on this data
**Don't stress about estimate accuracy** - use them for learning, not judgment.
### Problem: Integration points unclear
**Symptoms:**
- Not sure how to connect new code to existing
- Unsure which files to modify
- Multiple possible integration approaches
**Solution:**
1. **For brownfield**:
- Ensure document-project captured existing architecture
- Review architecture docs before implementing
2. **Check story-context** - Should document integration points
3. **In tech-spec/architecture** - Explicitly document:
- Which existing modules to modify
- What APIs/services to integrate with
- Data flow between new and existing code
4. **Run integration-planning workflow** (Level 3-4):
- Architect agent creates integration strategy
### Problem: Inconsistent patterns being introduced
**Symptoms:**
- New code style doesn't match existing
- Different architectural approach
- Not following team conventions
**Solution:**
1. **Check convention detection** (Quick Spec Flow):
- Should detect existing patterns
- Asks for confirmation before proceeding
2. **Review documentation** - Ensure document-project captured patterns
3. **Use story-context** - Injects pattern guidance per story
4. **Add to code-review checklist**:
- Pattern adherence
- Convention consistency
- Style matching
5. **Run retrospective** to identify pattern deviations early
---
## File and Path Issues
### Problem: Output files in wrong location
**Symptoms:**
- PRD created in wrong folder
- Story files not where expected
- Documentation scattered
**Solution:**
Check `bmad/bmm/config.yaml` for configured paths:
```yaml
output_folder: '{project-root}/docs'
dev_story_location: '{project-root}/docs/stories'
```
Default locations:
- Planning docs (PRD, epics, architecture): `{output_folder}/`
- Stories: `{dev_story_location}/`
- Status files: `{output_folder}/bmm-workflow-status.md`, `{output_folder}/sprint-status.yaml`
To change locations, edit config.yaml then re-run workflows.
### Problem: Can't find status file
**Symptoms:**
- workflow-status says no status file
- Can't track progress
- Lost place in workflow
**Solution:**
1. **Check default location**: `docs/bmm-workflow-status.md`
2. **If missing, reinitialize**:
```
Load Analyst agent → run workflow-init
```
3. **For Phase 4**: Look for `sprint-status.yaml` in same folder as PRD
4. **Search for it**:
```bash
find . -name "bmm-workflow-status.md"
find . -name "sprint-status.yaml"
```
### Problem: Sprint-status.yaml not updating
**Symptoms:**
- Workflows complete but status unchanged
- Stories stuck in old status
- Epic status not progressing
**Solution:**
1. **Manual update required** - Most status changes are manual:
```yaml
stories:
- id: epic-1-story-1
status: done # Change this manually
```
2. **Some workflows auto-update**:
- sprint-planning creates file
- epic-tech-context changes epic to "contexted"
- create-story changes story to "drafted"
- story-context changes to "ready-for-dev"
- dev-story may auto-update (check workflow)
3. **Re-run sprint-planning** to resync if needed
---
## Agent Behavior Issues
### Problem: Agent provides vague or generic responses
**Symptoms:**
- "Use appropriate framework"
- "Follow best practices"
- Generic advice without specifics
**Solution:**
1. **Provide more context** - Be specific in your description:
- "Add OAuth using passport.js to Express server"
- Not: "Add authentication"
2. **For brownfield**:
- Ensure document-project was run
- Agent needs codebase context for specific advice
3. **Reference existing docs**:
- "Based on the existing auth system in UserService..."
4. **Start fresh chat** - Context overload can cause generic responses
### Problem: Agent hallucinating or making up information
**Symptoms:**
- References files that don't exist
- Suggests APIs that aren't in your stack
- Creates imaginary requirements
**Solution:**
1. **Use fresh chat** - Context overflow main cause of hallucinations
2. **Provide concrete constraints**:
- "We use Express 4.18.2, not Next.js"
- "Our database is PostgreSQL, not MongoDB"
3. **For brownfield**:
- Document-project provides factual grounding
- Agent sees actual code, not assumptions
4. **Correct immediately**:
- "No, we don't have UserService, we have AuthenticationModule"
### Problem: Agent won't follow instructions
**Symptoms:**
- Ignores specific requests
- Does something different than asked
- Doesn't respect constraints
**Solution:**
1. **Be more explicit** - Agents respond to clear, specific instructions:
- "Use EXACTLY these three steps..."
- "Do NOT include database migrations in this story"
2. **Check agent capabilities** - Agent might not have access to requested workflow
3. **Try different phrasing** - Rephrase request to be more direct
4. **Use menu system** - Numbers are clearer than text commands
---
## Integration Issues (Brownfield)
### Problem: New code conflicts with existing architecture
**Symptoms:**
- Integration approach doesn't fit existing structure
- Would require major refactoring
- Conflicts with established patterns
**Solution:**
1. **Check if document-project was run** - Agents need architecture context
2. **Review existing architecture docs**:
- Read docs/architecture.md (from document-project)
- Understand current system design
3. **For Level 3-4**:
- Run validate-architecture workflow before planning
- Use integration-planning workflow
4. **Explicitly document integration strategy** in architecture:
- How new components fit existing structure
- What modifications needed to existing code
- Migration path if changing patterns
### Problem: Breaking changes to existing APIs
**Symptoms:**
- Changing API breaks consumers
- Downstream services affected
- Need backward compatibility
**Solution:**
1. **Identify all API consumers** (document-project should show this)
2. **Plan versioning strategy**:
- API v1 (existing) + v2 (new)
- Deprecation timeline
3. **Use feature flags** for gradual rollout
4. **Document migration guide** for API consumers
5. **Add to testing strategy**:
- Existing consumers still work (v1)
- New functionality works (v2)
### Problem: Data migration required
**Symptoms:**
- Schema changes needed
- Existing data needs transformation
- Risk of data loss
**Solution:**
1. **Create explicit migration strategy** in architecture:
- Forward migration (old → new schema)
- Rollback plan (new → old schema)
- Data validation approach
2. **Test migrations thoroughly**:
- On copy of production data
- Measure performance impact
3. **Plan rollout**:
- Staging environment first
- Gradual production rollout
- Monitoring for issues
4. **Document in tech-spec/architecture**:
- Migration scripts
- Rollback procedures
- Expected downtime
---
## Still Stuck?
### Getting More Help
If your issue isn't covered here:
1. **Check other documentation**:
- [FAQ](./faq.md) - Common questions
- [Glossary](./glossary.md) - Terminology
- [Quick Start](./quick-start.md) - Basic usage
- [Brownfield Guide](./brownfield-guide.md) - Existing codebases
- [Scale Adaptive System](./scale-adaptive-system.md) - Understanding levels
2. **Community support**:
- [Discord](https://discord.gg/gk8jAdXWmj) - #general-dev, #bugs-issues
- Active community, fast responses
- Share your specific situation
3. **Report bugs**:
- [GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)
- Include version, steps to reproduce, expected vs actual behavior
4. **Video tutorials**:
- [YouTube Channel](https://www.youtube.com/@BMadCode)
- Visual walkthroughs of common workflows
---
## Common Error Messages
### "No workflow status file found"
**Cause:** Haven't run workflow-init yet
**Fix:** Load Analyst agent → run workflow-init
### "Epic file not found"
**Cause:** PRD/epics not created, or wrong path
**Fix:** Verify PRD/epics exist in output folder, check config.yaml paths
### "Story not in sprint-status.yaml"
**Cause:** Sprint-planning not run, or story file not created
**Fix:** Run sprint-planning workflow, verify story files exist
### "Documentation insufficient for brownfield"
**Cause:** No docs/index.md or document-project not run
**Fix:** Run document-project workflow with Deep scan
### "Level detection failed"
**Cause:** Ambiguous project description
**Fix:** Be more specific, use level keywords (fix, feature, platform, etc.)
### "Context generation failed"
**Cause:** Missing prerequisites (epic context, story file, or docs)
**Fix:** Verify epic-tech-context run, story file exists, docs present
---
## Prevention Tips
**Avoid common issues before they happen:**
1. ✅ **Always run document-project for brownfield** - Saves hours of context issues later
2. ✅ **Use fresh chats for complex workflows** - Prevents hallucinations and context overflow
3. ✅ **Verify files exist before running workflows** - Check PRD, epics, stories are present
4. ✅ **Read agent menu before requesting workflows** - Confirm agent has the workflow
5. ✅ **Start with smaller level if unsure** - Easy to upgrade (Level 1 → 2), hard to downgrade
6. ✅ **Keep status files updated** - Manual updates when needed, don't let them drift
7. ✅ **Run retrospectives after epics** - Catch issues early, improve next epic
8. ✅ **Follow phase sequence** - Don't skip required phases (Phase 2 before 3, 3 before 4)
---
**Issue not listed?** Please [report it](https://github.com/bmad-code-org/BMAD-METHOD/issues) so we can add it to this guide!

View File

@ -133,6 +133,7 @@ The `sprint-status.yaml` file is the single source of truth for all implementati
### (BMad Method / Enterprise)
```
<<<<<<< Updated upstream
PRD (PM) → Architecture (Architect)
→ create-epics-and-stories (PM) ← V6: After architecture!
→ implementation-readiness (Architect)
@ -141,6 +142,144 @@ PRD (PM) → Architecture (Architect)
→ story loop (SM/DEV)
→ retrospective (SM)
→ [Next Epic]
=======
Current Phase: 4 (Implementation)
Current Epic: Epic 1 (Authentication)
Current Sprint: Sprint 1
Next Story: Story 1.3 (Email Verification)
Status: TODO
Dependencies: Story 1.2 (DONE) ✅
**Recommendation:** Run `create-story` to generate Story 1.3
After create-story:
1. Run story-context
2. Run dev-story
3. Run code-review
4. Run story-done
```
See: [workflow-status instructions](../workflows/workflow-status/instructions.md)
---
### document-project
**Purpose:** Analyze and document brownfield projects by scanning codebase, architecture, and patterns.
**Agent:** Analyst
**Duration:** 1-3 hours
**When to Use:** Brownfield projects without documentation
**How It Works:**
1. Scans codebase structure
2. Identifies architecture patterns
3. Documents technology stack
4. Creates reference documentation
5. Generates PRD-like document from existing code
**Output:** `project-documentation-{date}.md`
**When to Run:**
- Before starting work on legacy project
- When inheriting undocumented codebase
- Creating onboarding documentation
See: [document-project reference](./workflow-document-project-reference.md)
---
## Story Lifecycle Visualization
```
┌─────────────────────────────────────────────────────────────┐
│ PHASE 4: IMPLEMENTATION (Iterative Story Lifecycle) │
└─────────────────────────────────────────────────────────────┘
┌─────────────────┐
│ Sprint Planning │ → Creates sprint-status.yaml
└────────┬────────┘ Defines story queue
├──────────────────────────────────────────┐
│ │
▼ │
┌─────────────────────┐ │
│ Epic Tech Context │ → Optional per epic │
│ (Once per epic) │ Provides technical │
└─────────────────────┘ guidance │
│ │
▼ │
┌─────────────────────────────────────────────────┤
│ FOR EACH STORY IN QUEUE: │
├─────────────────────────────────────────────────┤
│ │
▼ │
┌─────────────────┐ │
│ Create Story │ → Generates story file │
│ (TODO → IN PROGRESS) │
└────────┬────────┘ │
│ │
▼ │
┌─────────────────┐ │
│ Story Context │ → Assembles focused context │
└────────┬────────┘ │
│ │
▼ │
┌─────────────────┐ │
│ Dev Story │ → Implements + tests │
│ (IN PROGRESS) │ │
└────────┬────────┘ │
│ │
▼ │
┌─────────────────┐ │
│ Code Review │ → Senior dev review │
│ (IN PROGRESS → │ │
│ READY FOR REVIEW) │
└────────┬────────┘ │
│ │
┌────┴────┐ │
│ Result? │ │
└────┬────┘ │
│ │
┌────┼────────────────────┐ │
│ │ │ │
▼ ▼ ▼ │
APPROVED APPROVED REQUEST │
WITH COMMENTS CHANGES │
│ │ │ │
└─────────┴───────────────────┘ │
│ │
▼ │
┌─────────────────┐ │
│ Story Done │ → READY FOR REVIEW → DONE│
└────────┬────────┘ │
│ │
├─────────────────────────────────────┘
│ More stories?
┌────────────────┐
│ Epic Complete? │
└────────┬───────┘
┌────┼────┐
│ │
Yes No
│ └──> Continue to next story
┌─────────────────┐
│ Retrospective │ → Review epic, lessons learned
└─────────────────┘
All epics done?
Yes → PROJECT COMPLETE
>>>>>>> Stashed changes
```
---

View File

@ -0,0 +1,85 @@
<task id="bmad/bmm/tasks/daily-standup.xml" name="Daily Standup">
<llm critical="true">
<i>MANDATORY: Execute ALL steps in the flow section IN EXACT ORDER</i>
<i>DO NOT skip steps or change the sequence</i>
<i>HALT immediately when halt-conditions are met</i>
<i>Each action tag within a step tag is a REQUIRED action to complete that step</i>
<i>Sections outside flow (validation, output, critical-context) provide essential context - review and apply throughout execution</i>
</llm>
<flow>
<step n="1" title="Project Context Discovery">
<action>Check for stories folder at {project-root}{output_folder}/stories/</action>
<action>Find current story by identifying highest numbered story file</action>
<action>Read story status (In Progress, Ready for Review, etc.)</action>
<action>Extract agent notes from Dev Agent Record, TEA Results, PO Notes sections</action>
<action>Check for next story references from epics</action>
<action>Identify blockers from story sections</action>
</step>
<step n="2" title="Initialize Standup with Context">
<output>
🏃 DAILY STANDUP - Story-{{number}}: {{title}}
Current Sprint Status:
- Active Story: story-{{number}} ({{status}} - {{percentage}}% complete)
- Next in Queue: story-{{next-number}}: {{next-title}}
- Blockers: {{blockers-from-story}}
Team assembled based on story participants:
{{ List Agents from {project-root}/bmad/_cfg/agent-manifest.csv }}
</output>
</step>
<step n="3" title="Structured Standup Discussion">
<action>Each agent provides three items referencing real story data</action>
<action>What I see: Their perspective on current work, citing story sections (1-2 sentences)</action>
<action>What concerns me: Issues from their domain or story blockers (1-2 sentences)</action>
<action>What I suggest: Actionable recommendations for progress (1-2 sentences)</action>
</step>
<step n="4" title="Create Standup Summary">
<output>
📋 STANDUP SUMMARY:
Key Items from Story File:
- {{completion-percentage}}% complete ({{tasks-complete}}/{{total-tasks}} tasks)
- Blocker: {{main-blocker}}
- Next: {{next-story-reference}}
Action Items:
- {{agent}}: {{action-item}}
- {{agent}}: {{action-item}}
- {{agent}}: {{action-item}}
Need extended discussion? Use *party-mode for detailed breakout.
</output>
</step>
</flow>
<agent-selection>
<context type="prd-review">
<i>Primary: Sarah (PO), Mary (Analyst), Winston (Architect)</i>
<i>Secondary: Murat (TEA), James (Dev)</i>
</context>
<context type="story-planning">
<i>Primary: Sarah (PO), Bob (SM), James (Dev)</i>
<i>Secondary: Murat (TEA)</i>
</context>
<context type="validate-architecture">
<i>Primary: Winston (Architect), James (Dev), Murat (TEA)</i>
<i>Secondary: Sarah (PO)</i>
</context>
<context type="implementation">
<i>Primary: James (Dev), Murat (TEA), Winston (Architect)</i>
<i>Secondary: Sarah (PO)</i>
</context>
</agent-selection>
<llm critical="true">
<i>This task extends party-mode with agile-specific structure</i>
<i>Time-box responses (standup = brief)</i>
<i>Focus on actionable items from real story data when available</i>
<i>End with clear next steps</i>
<i>No deep dives (suggest breakout if needed)</i>
<i>If no stories folder detected, run general standup format</i>
</llm>
</task>

View File

@ -2,6 +2,8 @@ const chalk = require('chalk');
const path = require('node:path');
const fs = require('node:fs');
const readline = require('node:readline');
const yaml = require('js-yaml');
const inquirer = require('inquirer');
const {
findBmadConfig,
resolvePath,
@ -18,6 +20,122 @@ const {
updateManifestYaml,
} = require('../lib/agent/installer');
/**
* Initialize BMAD core infrastructure in a directory
* @param {string} projectDir - Project directory where .bmad should be created
* @param {string} bmadFolderName - Name of the BMAD folder (default: .bmad)
* @returns {Promise<Object>} BMAD project info
*/
async function initializeBmadCore(projectDir, bmadFolderName = '.bmad') {
const bmadDir = path.join(projectDir, bmadFolderName);
const cfgDir = path.join(bmadDir, '_cfg');
console.log(chalk.cyan('\n🏗 Initializing BMAD Core Infrastructure\n'));
// Use the ConfigCollector to ask proper core configuration questions
const { ConfigCollector } = require('../installers/lib/core/config-collector');
const configCollector = new ConfigCollector();
// Collect core configuration answers
await configCollector.loadExistingConfig(projectDir);
await configCollector.collectModuleConfig('core', projectDir, true, true);
// Extract core answers from allAnswers (they are prefixed with 'core_')
const coreAnswers = {};
if (configCollector.allAnswers) {
for (const [key, value] of Object.entries(configCollector.allAnswers)) {
if (key.startsWith('core_')) {
const configKey = key.slice(5); // Remove 'core_' prefix
coreAnswers[configKey] = value;
}
}
}
// Ask for IDE selection
console.log(chalk.cyan('\n💻 IDE Configuration\n'));
console.log(chalk.dim('Select IDEs to integrate with the installed agents:'));
const { UI } = require('../lib/ui');
const ui = new UI();
const ideConfig = await ui.promptToolSelection(projectDir, ['core']);
const selectedIdes = ideConfig.ides || [];
// Create directory structure
console.log(chalk.dim('\nCreating directory structure...'));
await fs.promises.mkdir(bmadDir, { recursive: true });
await fs.promises.mkdir(cfgDir, { recursive: true });
await fs.promises.mkdir(path.join(bmadDir, 'core'), { recursive: true });
await fs.promises.mkdir(path.join(bmadDir, 'custom', 'agents'), { recursive: true });
await fs.promises.mkdir(path.join(cfgDir, 'agents'), { recursive: true });
await fs.promises.mkdir(path.join(cfgDir, 'custom', 'agents'), { recursive: true });
// Create core config.yaml file
const coreConfigFile = {
'# CORE Module Configuration': 'Generated by BMAD Agent Installer',
Version: require(path.join(__dirname, '../../../package.json')).version,
Date: new Date().toISOString(),
bmad_folder: bmadFolderName,
...coreAnswers,
};
const coreConfigPath = path.join(bmadDir, 'core', 'config.yaml');
await fs.promises.writeFile(coreConfigPath, yaml.dump(coreConfigFile), 'utf8');
// Create manifest.yaml with complete structure
const manifest = {
version: require(path.join(__dirname, '../../../package.json')).version,
date: new Date().toISOString(),
user_name: coreAnswers.user_name,
communication_language: coreAnswers.communication_language,
document_output_language: coreAnswers.document_output_language,
output_folder: coreAnswers.output_folder,
install_user_docs: coreAnswers.install_user_docs,
bmad_folder: bmadFolderName,
modules: ['core'],
ides: selectedIdes,
custom_agents: [],
};
const manifestPath = path.join(cfgDir, 'manifest.yaml');
await fs.promises.writeFile(manifestPath, yaml.dump(manifest), 'utf8');
// Create empty manifests
const agentManifestPath = path.join(cfgDir, 'agent-manifest.csv');
await fs.promises.writeFile(agentManifestPath, 'type,subtype,name,path,display_name,description,author,version,tags\n', 'utf8');
// Setup IDE configurations
if (selectedIdes.length > 0) {
console.log(chalk.dim('\nSetting up IDE configurations...'));
const { IdeManager } = require('../installers/lib/ide/manager');
const ideManager = new IdeManager();
for (const ide of selectedIdes) {
await ideManager.setup(ide, projectDir, bmadDir, {
selectedModules: ['core'],
skipModuleInstall: false,
verbose: false,
preCollectedConfig: coreAnswers,
});
}
}
console.log(chalk.green('\n✓ BMAD core infrastructure initialized'));
console.log(chalk.dim(` BMAD folder: ${bmadDir}`));
console.log(chalk.dim(` Core config: ${coreConfigPath}`));
console.log(chalk.dim(` Manifest: ${manifestPath}`));
if (selectedIdes.length > 0) {
console.log(chalk.dim(` IDEs configured: ${selectedIdes.join(', ')}`));
}
return {
projectRoot: projectDir,
bmadFolder: bmadDir,
cfgFolder: cfgDir,
manifestFile: agentManifestPath,
ides: selectedIdes,
};
}
module.exports = {
command: 'agent-install',
description: 'Install and compile BMAD agents with personalization',
@ -127,12 +245,20 @@ module.exports = {
// Load agent configuration
const agentConfig = loadAgentConfig(selectedAgent.yamlFile);
// Check if agent has sidecar
if (agentConfig.metadata.hasSidecar) {
selectedAgent.hasSidecar = true;
}
if (agentConfig.metadata.name) {
console.log(chalk.dim(`Agent Name: ${agentConfig.metadata.name}`));
}
if (agentConfig.metadata.title) {
console.log(chalk.dim(`Title: ${agentConfig.metadata.title}`));
}
if (agentConfig.metadata.hasSidecar) {
console.log(chalk.dim(`Sidecar: Yes`));
}
// Get the agent type (source name)
const agentType = selectedAgent.name; // e.g., "commit-poet"
@ -196,12 +322,55 @@ module.exports = {
// If no target specified, prompt for it
if (targetDir) {
// If target provided via --destination, check if it's a project root and adjust
// Check if target has BMAD infrastructure
const otherProject = detectBmadProject(targetDir);
if (otherProject && !targetDir.includes('agents')) {
// User specified project root, redirect to custom agents folder
targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents');
console.log(chalk.dim(` Auto-selecting custom agents folder: ${targetDir}`));
if (!otherProject) {
// No BMAD infrastructure found - offer to initialize
console.log(chalk.yellow(`\n⚠️ No BMAD infrastructure found in: ${targetDir}`));
const initResponse = await inquirer.prompt([
{
type: 'confirm',
name: 'initialize',
message: 'Initialize BMAD core infrastructure here? (Choose No for direct installation)',
default: true,
},
]);
if (initResponse.initialize) {
// Initialize BMAD core
targetDir = path.resolve(targetDir);
await initializeBmadCore(targetDir, '.bmad');
// Set targetDir to the custom agents folder
targetDir = path.join(targetDir, '.bmad', 'custom', 'agents');
console.log(chalk.dim(` Agent will be installed to: ${targetDir}`));
} else {
// User declined - keep original targetDir
console.log(chalk.yellow(` Installing agent directly to: ${targetDir}`));
}
} else if (otherProject && !targetDir.includes('agents')) {
console.log(chalk.yellow(`\n⚠️ Path is inside BMAD project: ${otherProject.projectRoot}`));
const projectChoice = await inquirer.prompt([
{
type: 'list',
name: 'choice',
message: 'Choose installation method:',
choices: [
{ name: `Install to BMAD's custom agents folder (${otherProject.bmadFolder}/custom/agents)`, value: 'bmad' },
{ name: `Install directly to specified path (${targetDir})`, value: 'direct' },
],
default: 'bmad',
},
]);
if (projectChoice.choice === 'bmad') {
targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents');
console.log(chalk.dim(` Installing to BMAD custom agents folder: ${targetDir}`));
} else {
console.log(chalk.yellow(` Installing directly to: ${targetDir}`));
}
}
} else {
const rl = readline.createInterface({
@ -214,38 +383,72 @@ module.exports = {
// Option 1: Current project's custom agents folder
const currentCustom = path.join(config.bmadFolder, 'custom', 'agents');
console.log(` 1. Current project: ${chalk.dim(currentCustom)}`);
// Option 2: Specify another project path
console.log(` 2. Another project (enter path)`);
console.log(` 2. Enter path directly (e.g., /Users/brianmadison/dev/test)`);
const choice = await new Promise((resolve) => {
rl.question('\n Select option (1 or path): ', resolve);
rl.question('\n Select option (1 or 2): ', resolve);
});
if (choice.trim() === '1' || choice.trim() === '') {
targetDir = currentCustom;
} else if (choice.trim() === '2') {
const projectPath = await new Promise((resolve) => {
rl.question(' Project path: ', resolve);
const userPath = await new Promise((resolve) => {
rl.question(' Enter path: ', resolve);
});
// Detect if it's a BMAD project and use its custom folder
const otherProject = detectBmadProject(path.resolve(projectPath));
const otherProject = detectBmadProject(path.resolve(userPath));
if (otherProject) {
targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents');
console.log(chalk.dim(` Found BMAD project, using: ${targetDir}`));
console.log(chalk.yellow(`\n⚠️ Path is inside BMAD project: ${otherProject.projectRoot}`));
const projectChoice = await inquirer.prompt([
{
type: 'list',
name: 'choice',
message: 'Choose installation method:',
choices: [
{ name: `Install to BMAD's custom agents folder (${otherProject.bmadFolder}/custom/agents)`, value: 'bmad' },
{ name: `Install directly to specified path (${userPath})`, value: 'direct' },
],
default: 'bmad',
},
]);
if (projectChoice.choice === 'bmad') {
targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents');
console.log(chalk.dim(` Installing to BMAD custom agents folder: ${targetDir}`));
} else {
targetDir = path.resolve(userPath);
console.log(chalk.yellow(` Installing directly to: ${targetDir}`));
}
} else {
targetDir = path.resolve(projectPath);
// No BMAD found - offer to initialize
console.log(chalk.yellow(`\n⚠️ No BMAD infrastructure found in: ${userPath}`));
const initResponse = await inquirer.prompt([
{
type: 'confirm',
name: 'initialize',
message: 'Initialize BMAD core infrastructure here? (Choose No for direct installation)',
default: true,
},
]);
if (initResponse.initialize) {
await initializeBmadCore(path.resolve(userPath), '.bmad');
targetDir = path.join(path.resolve(userPath), '.bmad', 'custom', 'agents');
console.log(chalk.dim(` Agent will be installed to: ${targetDir}`));
} else {
// User declined - create the directory and install directly
targetDir = path.resolve(userPath);
console.log(chalk.yellow(` Installing agent directly to: ${targetDir}`));
}
}
} else {
// User entered a path directly
const otherProject = detectBmadProject(path.resolve(choice));
if (otherProject) {
targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents');
console.log(chalk.dim(` Found BMAD project, using: ${targetDir}`));
} else {
targetDir = path.resolve(choice);
}
console.log(chalk.red(' Invalid selection. Please choose 1 or 2.'));
rl.close();
process.exit(1);
}
rl.close();
@ -313,12 +516,22 @@ module.exports = {
const compiledPath = path.join(agentTargetDir, compiledFileName);
const relativePath = path.relative(projectRoot, compiledPath);
// Read core config to get agent_sidecar_folder
const coreConfigPath = path.join(config.bmadFolder, 'bmb', 'config.yaml');
let coreConfig = {};
if (fs.existsSync(coreConfigPath)) {
const yamlLib = require('yaml');
const content = fs.readFileSync(coreConfigPath, 'utf8');
coreConfig = yamlLib.parse(content);
}
// Compile with proper name and path
const { xml, metadata, processedYaml } = compileAgent(
fs.readFileSync(selectedAgent.yamlFile, 'utf8'),
answers,
finalAgentName,
relativePath,
{ config: coreConfig },
);
// Write compiled XML (.md) with custom name
@ -332,12 +545,31 @@ module.exports = {
sidecarCopied: false,
};
// Copy sidecar files for expert agents
if (selectedAgent.hasSidecar && selectedAgent.type === 'expert') {
const { copySidecarFiles } = require('../lib/agent/installer');
const sidecarFiles = copySidecarFiles(selectedAgent.path, agentTargetDir, selectedAgent.yamlFile);
// Handle sidecar files for agents with hasSidecar flag
if (selectedAgent.hasSidecar === true && selectedAgent.type === 'expert') {
const { copyAgentSidecarFiles } = require('../lib/agent/installer');
// Get agent sidecar folder from config or use default
const agentSidecarFolder = coreConfig?.agent_sidecar_folder || '{project-root}/.myagent-data';
// Resolve path variables
const resolvedSidecarFolder = agentSidecarFolder
.replaceAll('{project-root}', projectRoot)
.replaceAll('{bmad_folder}', config.bmadFolder);
// Create sidecar directory for this agent
const agentSidecarDir = path.join(resolvedSidecarFolder, finalAgentName);
if (!fs.existsSync(agentSidecarDir)) {
fs.mkdirSync(agentSidecarDir, { recursive: true });
}
// Find and copy sidecar folder
const sidecarFiles = copyAgentSidecarFiles(selectedAgent.path, agentSidecarDir, selectedAgent.yamlFile);
result.sidecarCopied = true;
result.sidecarFiles = sidecarFiles;
result.sidecarDir = agentSidecarDir;
console.log(chalk.dim(` Sidecar copied to: ${agentSidecarDir}`));
}
console.log(chalk.green('\n✨ Agent installed successfully!'));

View File

@ -1,141 +0,0 @@
const chalk = require('chalk');
const nodePath = require('node:path');
const { Installer } = require('../installers/lib/core/installer');
module.exports = {
command: 'cleanup',
description: 'Clean up obsolete files from BMAD installation',
options: [
['-d, --dry-run', 'Show what would be deleted without actually deleting'],
['-a, --auto-delete', 'Automatically delete non-retained files without prompts'],
['-l, --list-retained', 'List currently retained files'],
['-c, --clear-retained', 'Clear retained files list'],
],
action: async (options) => {
try {
// Create installer and let it find the BMAD directory
const installer = new Installer();
const bmadDir = await installer.findBmadDir(process.cwd());
if (!bmadDir) {
console.error(chalk.red('❌ BMAD installation not found'));
process.exit(1);
}
const retentionPath = nodePath.join(bmadDir, '_cfg', 'user-retained-files.yaml');
// Handle list-retained option
if (options.listRetained) {
const fs = require('fs-extra');
const yaml = require('js-yaml');
if (await fs.pathExists(retentionPath)) {
const retentionContent = await fs.readFile(retentionPath, 'utf8');
const retentionData = yaml.load(retentionContent) || { retainedFiles: [] };
if (retentionData.retainedFiles.length > 0) {
console.log(chalk.cyan('\n📋 Retained Files:\n'));
for (const file of retentionData.retainedFiles) {
console.log(chalk.dim(` - ${file}`));
}
console.log();
} else {
console.log(chalk.yellow('\n✨ No retained files found\n'));
}
} else {
console.log(chalk.yellow('\n✨ No retained files found\n'));
}
return;
}
// Handle clear-retained option
if (options.clearRetained) {
const fs = require('fs-extra');
if (await fs.pathExists(retentionPath)) {
await fs.remove(retentionPath);
console.log(chalk.green('\n✅ Cleared retained files list\n'));
} else {
console.log(chalk.yellow('\n✨ No retained files list to clear\n'));
}
return;
}
// Handle cleanup operations
if (options.dryRun) {
console.log(chalk.cyan('\n🔍 Legacy File Scan (Dry Run)\n'));
const legacyFiles = await installer.scanForLegacyFiles(bmadDir);
const allLegacyFiles = [
...legacyFiles.backup,
...legacyFiles.documentation,
...legacyFiles.deprecated_task,
...legacyFiles.unknown,
];
if (allLegacyFiles.length === 0) {
console.log(chalk.green('✨ No legacy files found\n'));
return;
}
// Group files by category
const categories = [];
if (legacyFiles.backup.length > 0) {
categories.push({ name: 'Backup Files (.bak)', files: legacyFiles.backup });
}
if (legacyFiles.documentation.length > 0) {
categories.push({ name: 'Documentation', files: legacyFiles.documentation });
}
if (legacyFiles.deprecated_task.length > 0) {
categories.push({ name: 'Deprecated Task Files', files: legacyFiles.deprecated_task });
}
if (legacyFiles.unknown.length > 0) {
categories.push({ name: 'Unknown Files', files: legacyFiles.unknown });
}
for (const category of categories) {
console.log(chalk.yellow(`${category.name}:`));
for (const file of category.files) {
const size = (file.size / 1024).toFixed(1);
const date = file.mtime.toLocaleDateString();
let line = ` - ${file.relativePath} (${size}KB, ${date})`;
if (file.suggestedAlternative) {
line += chalk.dim(`${file.suggestedAlternative}`);
}
console.log(chalk.dim(line));
}
console.log();
}
console.log(chalk.cyan(`Found ${allLegacyFiles.length} legacy file(s) that could be cleaned up.\n`));
console.log(chalk.dim('Run "bmad cleanup" to actually delete these files.\n'));
return;
}
// Perform actual cleanup
console.log(chalk.cyan('\n🧹 Cleaning up legacy files...\n'));
const result = await installer.performCleanup(bmadDir, options.autoDelete);
if (result.message) {
console.log(chalk.dim(result.message));
} else {
if (result.deleted > 0) {
console.log(chalk.green(`✅ Deleted ${result.deleted} legacy file(s)`));
}
if (result.retained > 0) {
console.log(chalk.yellow(`⏭️ Retained ${result.retained} file(s)`));
console.log(chalk.dim('Run "bmad cleanup --list-retained" to see retained files\n'));
}
}
console.log();
} catch (error) {
console.error(chalk.red(`❌ Error: ${error.message}`));
process.exit(1);
}
},
};

View File

@ -9,7 +9,7 @@ const ui = new UI();
module.exports = {
command: 'install',
description: 'Install BMAD Core agents and tools',
options: [['--skip-cleanup', 'Skip automatic cleanup of legacy files']],
options: [],
action: async (options) => {
try {
const config = await ui.promptInstall();
@ -44,11 +44,6 @@ module.exports = {
config._requestedReinstall = true;
}
// Add skip cleanup flag if option provided
if (options && options.skipCleanup) {
config.skipCleanup = true;
}
// Regular install/update flow
const result = await installer.install(config);

View File

@ -182,14 +182,24 @@ class ConfigCollector {
}
// Load module's install config schema
const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml');
// First, try the standard src/modules location
let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
// If not found in src/modules, we need to find it by searching the project
if (!(await fs.pathExists(installerConfigPath))) {
// Use the module manager to find the module source
const { ModuleManager } = require('../modules/manager');
const moduleManager = new ModuleManager();
const moduleSourcePath = await moduleManager.findModuleSource(moduleName);
if (moduleSourcePath) {
installerConfigPath = path.join(moduleSourcePath, '_module-installer', 'install-config.yaml');
}
}
let configPath = null;
if (await fs.pathExists(installerConfigPath)) {
configPath = installerConfigPath;
} else if (await fs.pathExists(legacyConfigPath)) {
configPath = legacyConfigPath;
} else {
// No config schema for this module - use existing values
if (this.existingConfig && this.existingConfig[moduleName]) {
@ -396,15 +406,25 @@ class ConfigCollector {
if (!this.allAnswers) {
this.allAnswers = {};
}
// Load module's config.yaml (check new location first, then fallback)
const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml');
// Load module's config
// First, try the standard src/modules location
let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
// If not found in src/modules, we need to find it by searching the project
if (!(await fs.pathExists(installerConfigPath))) {
// Use the module manager to find the module source
const { ModuleManager } = require('../modules/manager');
const moduleManager = new ModuleManager();
const moduleSourcePath = await moduleManager.findModuleSource(moduleName);
if (moduleSourcePath) {
installerConfigPath = path.join(moduleSourcePath, '_module-installer', 'install-config.yaml');
}
}
let configPath = null;
if (await fs.pathExists(installerConfigPath)) {
configPath = installerConfigPath;
} else if (await fs.pathExists(legacyConfigPath)) {
configPath = legacyConfigPath;
} else {
// No config for this module
return;

View File

@ -37,6 +37,7 @@ const { AgentPartyGenerator } = require('../../../lib/agent-party-generator');
const { CLIUtils } = require('../../../lib/cli-utils');
const { ManifestGenerator } = require('./manifest-generator');
const { IdeConfigManager } = require('./ide-config-manager');
const { replaceAgentSidecarFolders } = require('./post-install-sidecar-replacement');
class Installer {
constructor() {
@ -446,6 +447,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
// Set bmad folder name on module manager and IDE manager for placeholder replacement
this.moduleManager.setBmadFolderName(bmadFolderName);
this.moduleManager.setCoreConfig(moduleConfigs.core || {});
this.ideManager.setBmadFolderName(bmadFolderName);
// Tool selection will be collected after we determine if it's a reinstall/update/new install
@ -1024,6 +1026,20 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
}
}
// Replace {agent_sidecar_folder} placeholders in all agent files
console.log(chalk.dim('\n Configuring agent sidecar folders...'));
const sidecarResults = await replaceAgentSidecarFolders(bmadDir);
if (sidecarResults.filesReplaced > 0) {
console.log(
chalk.green(
` ✓ Updated ${sidecarResults.filesReplaced} agent file(s) with ${sidecarResults.totalReplacements} sidecar reference(s)`,
),
);
} else {
console.log(chalk.dim(' No agent sidecar references found'));
}
// Display completion message
const { UI } = require('../../../lib/ui');
const ui = new UI();
@ -1036,23 +1052,6 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
agentVibesEnabled: this.enableAgentVibes || false,
});
// Offer cleanup for legacy files (only for updates, not fresh installs, and only if not skipped)
if (!config.skipCleanup && config._isUpdate) {
try {
const cleanupResult = await this.performCleanup(bmadDir, false);
if (cleanupResult.deleted > 0) {
console.log(chalk.green(`\n✓ Cleaned up ${cleanupResult.deleted} legacy file${cleanupResult.deleted > 1 ? 's' : ''}`));
}
if (cleanupResult.retained > 0) {
console.log(chalk.dim(`Run 'bmad cleanup' anytime to manage retained files`));
}
} catch (cleanupError) {
// Don't fail the installation for cleanup errors
console.log(chalk.yellow(`\n⚠️ Cleanup warning: ${cleanupError.message}`));
console.log(chalk.dim('Run "bmad cleanup" to manually clean up legacy files'));
}
}
return {
success: true,
path: bmadDir,
@ -1546,18 +1545,76 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
// DO NOT replace {project-root} - LLMs understand this placeholder at runtime
// const processedContent = xmlContent.replaceAll('{project-root}', projectDir);
// Replace {agent_sidecar_folder} if configured
const coreConfig = this.configCollector.collectedConfig.core || {};
if (coreConfig.agent_sidecar_folder && xmlContent.includes('{agent_sidecar_folder}')) {
xmlContent = xmlContent.replaceAll('{agent_sidecar_folder}', coreConfig.agent_sidecar_folder);
}
// Process TTS injection points (pass targetPath for tracking)
xmlContent = this.processTTSInjectionPoints(xmlContent, mdPath);
// Check if agent has sidecar and copy it
let agentYamlContent = null;
let hasSidecar = false;
try {
agentYamlContent = await fs.readFile(yamlPath, 'utf8');
const yamlLib = require('yaml');
const agentYaml = yamlLib.parse(agentYamlContent);
hasSidecar = agentYaml?.agent?.metadata?.hasSidecar === true;
} catch {
// Continue without sidecar processing
}
// Write the built .md file to bmad/{module}/agents/ with POSIX-compliant final newline
const content = xmlContent.endsWith('\n') ? xmlContent : xmlContent + '\n';
await fs.writeFile(mdPath, content, 'utf8');
this.installedFiles.push(mdPath);
// Copy sidecar files if agent has hasSidecar flag
if (hasSidecar) {
const { copyAgentSidecarFiles } = require('../../../lib/agent/installer');
// Get agent sidecar folder from core config
const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml');
let agentSidecarFolder;
if (await fs.pathExists(coreConfigPath)) {
const yamlLib = require('yaml');
const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8');
const coreConfig = yamlLib.parse(coreConfigContent);
agentSidecarFolder = coreConfig.agent_sidecar_folder || agentSidecarFolder;
}
// Resolve path variables
const resolvedSidecarFolder = agentSidecarFolder
.replaceAll('{project-root}', projectDir)
.replaceAll('{bmad_folder}', this.bmadFolderName || 'bmad');
// Create sidecar directory for this agent
const agentSidecarDir = path.join(resolvedSidecarFolder, agentName);
await fs.ensureDir(agentSidecarDir);
// Find and copy sidecar folder from source module
const sourceModulePath = getSourcePath(`modules/${moduleName}`);
const sourceAgentPath = path.join(sourceModulePath, 'agents');
// Copy sidecar files (preserve existing, add new)
const sidecarResult = copyAgentSidecarFiles(sourceAgentPath, agentSidecarDir, yamlPath);
if (sidecarResult.copied.length > 0) {
console.log(chalk.dim(` Copied ${sidecarResult.copied.length} new sidecar file(s) to: ${agentSidecarDir}`));
}
if (sidecarResult.preserved.length > 0) {
console.log(chalk.dim(` Preserved ${sidecarResult.preserved.length} existing sidecar file(s)`));
}
}
// Remove the source YAML file - we can regenerate from installer source if needed
await fs.remove(yamlPath);
console.log(chalk.dim(` Built agent: ${agentName}.md`));
console.log(chalk.dim(` Built agent: ${agentName}.md${hasSidecar ? ' (with sidecar)' : ''}`));
}
// Handle legacy .md agents - inject activation if needed
else if (agentFile.endsWith('.md')) {
@ -1748,6 +1805,21 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
// DO NOT replace {project-root} - LLMs understand this placeholder at runtime
// const processedContent = xmlContent.replaceAll('{project-root}', projectDir);
// Replace {agent_sidecar_folder} if configured
const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml');
let agentSidecarFolder = null;
if (await fs.pathExists(coreConfigPath)) {
const yamlLib = require('yaml');
const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8');
const coreConfig = yamlLib.parse(coreConfigContent);
agentSidecarFolder = coreConfig.agent_sidecar_folder;
}
if (agentSidecarFolder && xmlContent.includes('{agent_sidecar_folder}')) {
xmlContent = xmlContent.replaceAll('{agent_sidecar_folder}', agentSidecarFolder);
}
// Process TTS injection points (pass targetPath for tracking)
xmlContent = this.processTTSInjectionPoints(xmlContent, targetMdPath);
@ -2532,8 +2604,10 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
agentType = parts.slice(-2).join('-'); // Take last 2 parts as type
}
// Create target directory
const agentTargetDir = path.join(customAgentsDir, finalAgentName);
// Create target directory - use relative path if agent is in a subdirectory
const agentTargetDir = agent.relativePath
? path.join(customAgentsDir, agent.relativePath)
: path.join(customAgentsDir, finalAgentName);
await fs.ensureDir(agentTargetDir);
// Calculate paths
@ -2547,6 +2621,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
agentConfig.defaults || {},
finalAgentName,
relativePath,
{ config: config.coreConfig },
);
// Write compiled agent
@ -2562,10 +2637,26 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
await fs.copy(agent.yamlFile, backupYamlPath);
}
// Copy sidecar files if expert agent
if (agent.hasSidecar && agent.type === 'expert') {
const { copySidecarFiles } = require('../../../lib/agent/installer');
copySidecarFiles(agent.path, agentTargetDir, agent.yamlFile);
// Copy sidecar files for agents with hasSidecar flag
if (agentConfig.hasSidecar === true && agent.type === 'expert') {
const { copyAgentSidecarFiles } = require('../../../lib/agent/installer');
// Get agent sidecar folder from config or use default
const agentSidecarFolder = config.coreConfig?.agent_sidecar_folder;
// Resolve path variables
const resolvedSidecarFolder = agentSidecarFolder.replaceAll('{project-root}', projectDir).replaceAll('{bmad_folder}', bmadDir);
// Create sidecar directory for this agent
const agentSidecarDir = path.join(resolvedSidecarFolder, finalAgentName);
await fs.ensureDir(agentSidecarDir);
// Copy sidecar files (preserve existing, add new)
const sidecarResult = copyAgentSidecarFiles(agent.path, agentSidecarDir, agent.yamlFile);
if (sidecarResult.copied.length > 0 || sidecarResult.preserved.length > 0) {
console.log(chalk.dim(` Sidecar: ${sidecarResult.copied.length} new, ${sidecarResult.preserved.length} preserved`));
}
}
// Update manifest CSV
@ -2623,362 +2714,6 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
}
}
}
/**
* Scan for legacy/obsolete files in BMAD installation
* @param {string} bmadDir - BMAD installation directory
* @returns {Object} Categorized files for cleanup
*/
async scanForLegacyFiles(bmadDir) {
const legacyFiles = {
backup: [],
documentation: [],
deprecated_task: [],
unknown: [],
};
try {
// Load files manifest to understand what should exist
const manifestPath = path.join(bmadDir, 'files-manifest.csv');
const manifestFiles = new Set();
if (await fs.pathExists(manifestPath)) {
const manifestContent = await fs.readFile(manifestPath, 'utf8');
const lines = manifestContent.split('\n').slice(1); // Skip header
for (const line of lines) {
if (line.trim()) {
const relativePath = line.split(',')[0];
if (relativePath) {
manifestFiles.add(relativePath);
}
}
}
}
// Scan all files recursively
const allFiles = await this.getAllFiles(bmadDir);
for (const filePath of allFiles) {
const relativePath = path.relative(bmadDir, filePath);
// Skip expected files
if (this.isExpectedFile(relativePath, manifestFiles)) {
continue;
}
// Categorize legacy files
if (relativePath.endsWith('.bak')) {
legacyFiles.backup.push({
path: filePath,
relativePath: relativePath,
size: (await fs.stat(filePath)).size,
mtime: (await fs.stat(filePath)).mtime,
});
} else if (this.isDocumentationFile(relativePath)) {
legacyFiles.documentation.push({
path: filePath,
relativePath: relativePath,
size: (await fs.stat(filePath)).size,
mtime: (await fs.stat(filePath)).mtime,
});
} else if (this.isDeprecatedTaskFile(relativePath)) {
const suggestedAlternative = this.suggestAlternative(relativePath);
legacyFiles.deprecated_task.push({
path: filePath,
relativePath: relativePath,
size: (await fs.stat(filePath)).size,
mtime: (await fs.stat(filePath)).mtime,
suggestedAlternative,
});
} else {
legacyFiles.unknown.push({
path: filePath,
relativePath: relativePath,
size: (await fs.stat(filePath)).size,
mtime: (await fs.stat(filePath)).mtime,
});
}
}
} catch (error) {
console.warn(`Warning: Could not scan for legacy files: ${error.message}`);
}
return legacyFiles;
}
/**
* Get all files in directory recursively
* @param {string} dir - Directory to scan
* @returns {Array} Array of file paths
*/
async getAllFiles(dir) {
const files = [];
async function scan(currentDir) {
const entries = await fs.readdir(currentDir);
for (const entry of entries) {
const fullPath = path.join(currentDir, entry);
const stat = await fs.stat(fullPath);
if (stat.isDirectory()) {
// Skip certain directories
if (!['node_modules', '.git', 'dist', 'build'].includes(entry)) {
await scan(fullPath);
}
} else {
files.push(fullPath);
}
}
}
await scan(dir);
return files;
}
/**
* Check if file is expected in installation
* @param {string} relativePath - Relative path from BMAD dir
* @param {Set} manifestFiles - Files from manifest
* @returns {boolean} True if expected file
*/
isExpectedFile(relativePath, manifestFiles) {
// Core files in manifest
if (manifestFiles.has(relativePath)) {
return true;
}
// Configuration files
if (relativePath.startsWith('_cfg/') || relativePath === 'config.yaml') {
return true;
}
// Custom files
if (relativePath.startsWith('custom/') || relativePath === 'manifest.yaml') {
return true;
}
// Generated files
if (relativePath === 'manifest.csv' || relativePath === 'files-manifest.csv') {
return true;
}
// IDE-specific files
const ides = ['vscode', 'cursor', 'windsurf', 'claude-code', 'github-copilot', 'zsh', 'bash', 'fish'];
if (ides.some((ide) => relativePath.includes(ide))) {
return true;
}
// BMAD MODULE STRUCTURES - recognize valid module content
const modulePrefixes = ['bmb/', 'bmm/', 'cis/', 'core/', 'bmgd/'];
const validExtensions = ['.yaml', '.yml', '.json', '.csv', '.md', '.xml', '.svg', '.png', '.jpg', '.gif', '.excalidraw', '.js'];
// Check if this file is in a recognized module directory
for (const modulePrefix of modulePrefixes) {
if (relativePath.startsWith(modulePrefix)) {
// Check if it has a valid extension
const hasValidExtension = validExtensions.some((ext) => relativePath.endsWith(ext));
if (hasValidExtension) {
return true;
}
}
}
// Special case for core module resources
if (relativePath.startsWith('core/resources/')) {
return true;
}
// Special case for docs directory
if (relativePath.startsWith('docs/')) {
return true;
}
return false;
}
/**
* Check if file is documentation
* @param {string} relativePath - Relative path
* @returns {boolean} True if documentation
*/
isDocumentationFile(relativePath) {
const docExtensions = ['.md', '.txt', '.pdf'];
const docPatterns = ['docs/', 'README', 'CHANGELOG', 'LICENSE'];
return docExtensions.some((ext) => relativePath.endsWith(ext)) || docPatterns.some((pattern) => relativePath.includes(pattern));
}
/**
* Check if file is deprecated task file
* @param {string} relativePath - Relative path
* @returns {boolean} True if deprecated
*/
isDeprecatedTaskFile(relativePath) {
// Known deprecated files
const deprecatedFiles = ['adv-elicit-methods.csv', 'game-resources.json', 'ux-workflow.json'];
return deprecatedFiles.some((dep) => relativePath.includes(dep));
}
/**
* Suggest alternative for deprecated file
* @param {string} relativePath - Deprecated file path
* @returns {string} Suggested alternative
*/
suggestAlternative(relativePath) {
const alternatives = {
'adv-elicit-methods.csv': 'Use the new structured workflows in src/modules/',
'game-resources.json': 'Resources are now integrated into modules',
'ux-workflow.json': 'UX workflows are now in src/modules/bmm/workflows/',
};
for (const [deprecated, alternative] of Object.entries(alternatives)) {
if (relativePath.includes(deprecated)) {
return alternative;
}
}
return 'Check src/modules/ for new alternatives';
}
/**
* Perform interactive cleanup of legacy files
* @param {string} bmadDir - BMAD installation directory
* @param {boolean} skipInteractive - Skip interactive prompts
* @returns {Object} Cleanup results
*/
async performCleanup(bmadDir, skipInteractive = false) {
const inquirer = require('inquirer');
const yaml = require('js-yaml');
// Load user retention preferences
const retentionPath = path.join(bmadDir, '_cfg', 'user-retained-files.yaml');
let retentionData = { retainedFiles: [], history: [] };
if (await fs.pathExists(retentionPath)) {
const retentionContent = await fs.readFile(retentionPath, 'utf8');
retentionData = yaml.load(retentionContent) || retentionData;
}
// Scan for legacy files
const legacyFiles = await this.scanForLegacyFiles(bmadDir);
const allLegacyFiles = [...legacyFiles.backup, ...legacyFiles.documentation, ...legacyFiles.deprecated_task, ...legacyFiles.unknown];
if (allLegacyFiles.length === 0) {
return { deleted: 0, retained: 0, message: 'No legacy files found' };
}
let deletedCount = 0;
let retainedCount = 0;
const filesToDelete = [];
if (skipInteractive) {
// Auto-delete all non-retained files
for (const file of allLegacyFiles) {
if (!retentionData.retainedFiles.includes(file.relativePath)) {
filesToDelete.push(file);
}
}
} else {
// Interactive cleanup
console.log(chalk.cyan('\n🧹 Legacy File Cleanup\n'));
console.log(chalk.dim('The following obsolete files were found:\n'));
// Group files by category
const categories = [];
if (legacyFiles.backup.length > 0) {
categories.push({ name: 'Backup Files (.bak)', files: legacyFiles.backup });
}
if (legacyFiles.documentation.length > 0) {
categories.push({ name: 'Documentation', files: legacyFiles.documentation });
}
if (legacyFiles.deprecated_task.length > 0) {
categories.push({ name: 'Deprecated Task Files', files: legacyFiles.deprecated_task });
}
if (legacyFiles.unknown.length > 0) {
categories.push({ name: 'Unknown Files', files: legacyFiles.unknown });
}
for (const category of categories) {
console.log(chalk.yellow(`${category.name}:`));
for (const file of category.files) {
const size = (file.size / 1024).toFixed(1);
const date = file.mtime.toLocaleDateString();
let line = ` - ${file.relativePath} (${size}KB, ${date})`;
if (file.suggestedAlternative) {
line += chalk.dim(`${file.suggestedAlternative}`);
}
console.log(chalk.dim(line));
}
console.log();
}
const prompt = await inquirer.prompt([
{
type: 'confirm',
name: 'proceed',
message: 'Would you like to review these files for cleanup?',
default: true,
},
]);
if (!prompt.proceed) {
return { deleted: 0, retained: allLegacyFiles.length, message: 'Cleanup cancelled by user' };
}
// Show selection interface
const selectionPrompt = await inquirer.prompt([
{
type: 'checkbox',
name: 'filesToDelete',
message: 'Select files to delete (use SPACEBAR to select, ENTER to continue):',
choices: allLegacyFiles.map((file) => {
const isRetained = retentionData.retainedFiles.includes(file.relativePath);
const description = `${file.relativePath} (${(file.size / 1024).toFixed(1)}KB)`;
return {
name: description,
value: file,
checked: !isRetained && !file.relativePath.includes('.bak'),
};
}),
pageSize: Math.min(allLegacyFiles.length, 15),
},
]);
filesToDelete.push(...selectionPrompt.filesToDelete);
}
// Delete selected files
for (const file of filesToDelete) {
try {
await fs.remove(file.path);
deletedCount++;
} catch (error) {
console.warn(`Warning: Could not delete ${file.relativePath}: ${error.message}`);
}
}
// Count retained files
retainedCount = allLegacyFiles.length - deletedCount;
// Update retention data
const newlyRetained = allLegacyFiles.filter((f) => !filesToDelete.includes(f)).map((f) => f.relativePath);
retentionData.retainedFiles = [...new Set([...retentionData.retainedFiles, ...newlyRetained])];
retentionData.history.push({
date: new Date().toISOString(),
deleted: deletedCount,
retained: retainedCount,
files: filesToDelete.map((f) => f.relativePath),
});
// Save retention data
await fs.ensureDir(path.dirname(retentionPath));
await fs.writeFile(retentionPath, yaml.dump(retentionData), 'utf8');
return { deleted: deletedCount, retained: retainedCount };
}
}
module.exports = { Installer };

View File

@ -34,9 +34,13 @@ class ManifestGenerator {
// Store modules list (all modules including preserved ones)
const preservedModules = options.preservedModules || [];
// Scan the bmad directory to find all actually installed modules
const installedModules = await this.scanInstalledModules(bmadDir);
// Deduplicate modules list to prevent duplicates
this.modules = [...new Set(['core', ...selectedModules, ...preservedModules])];
this.updatedModules = [...new Set(['core', ...selectedModules])]; // Only these get rescanned
this.modules = [...new Set(['core', ...selectedModules, ...preservedModules, ...installedModules])];
this.updatedModules = [...new Set(['core', ...selectedModules, ...installedModules])]; // All installed modules get rescanned
this.preservedModules = preservedModules; // These stay as-is in CSVs
this.bmadDir = bmadDir;
this.bmadFolderName = path.basename(bmadDir); // Get the actual folder name (e.g., '.bmad' or 'bmad')
@ -216,18 +220,23 @@ class ManifestGenerator {
}
/**
* Get agents from a directory
* Get agents from a directory recursively
* Only includes compiled .md files (not .agent.yaml source files)
*/
async getAgentsFromDir(dirPath, moduleName) {
async getAgentsFromDir(dirPath, moduleName, relativePath = '') {
const agents = [];
const files = await fs.readdir(dirPath);
const entries = await fs.readdir(dirPath, { withFileTypes: true });
for (const file of files) {
// Only include .md files, skip .agent.yaml source files and README.md
if (file.endsWith('.md') && !file.endsWith('.agent.yaml') && file.toLowerCase() !== 'readme.md') {
const filePath = path.join(dirPath, file);
const content = await fs.readFile(filePath, 'utf8');
for (const entry of entries) {
const fullPath = path.join(dirPath, entry.name);
if (entry.isDirectory()) {
// Recurse into subdirectories
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
const subDirAgents = await this.getAgentsFromDir(fullPath, moduleName, newRelativePath);
agents.push(...subDirAgents);
} else if (entry.name.endsWith('.md') && !entry.name.endsWith('.agent.yaml') && entry.name.toLowerCase() !== 'readme.md') {
const content = await fs.readFile(fullPath, 'utf8');
// Skip files that don't contain <agent> tag (e.g., README files)
if (!content.includes('<agent')) {
@ -251,10 +260,13 @@ class ManifestGenerator {
const principlesMatch = content.match(/<principles>([\s\S]*?)<\/principles>/);
// Build relative path for installation
const fileRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
const installPath =
moduleName === 'core' ? `${this.bmadFolderName}/core/agents/${file}` : `${this.bmadFolderName}/${moduleName}/agents/${file}`;
moduleName === 'core'
? `${this.bmadFolderName}/core/agents/${fileRelativePath}`
: `${this.bmadFolderName}/${moduleName}/agents/${fileRelativePath}`;
const agentName = file.replace('.md', '');
const agentName = entry.name.replace('.md', '');
// Helper function to clean and escape CSV content
const cleanForCSV = (text) => {
@ -700,6 +712,42 @@ class ManifestGenerator {
await fs.writeFile(csvPath, csv);
return csvPath;
}
/**
* Scan the bmad directory to find all installed modules
* @param {string} bmadDir - Path to bmad directory
* @returns {Array} List of module names
*/
async scanInstalledModules(bmadDir) {
const modules = [];
try {
const entries = await fs.readdir(bmadDir, { withFileTypes: true });
for (const entry of entries) {
// Skip if not a directory or is a special directory
if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === '_cfg') {
continue;
}
// Check if this looks like a module (has agents, workflows, or tasks directory)
const modulePath = path.join(bmadDir, entry.name);
const hasAgents = await fs.pathExists(path.join(modulePath, 'agents'));
const hasWorkflows = await fs.pathExists(path.join(modulePath, 'workflows'));
const hasTasks = await fs.pathExists(path.join(modulePath, 'tasks'));
const hasTools = await fs.pathExists(path.join(modulePath, 'tools'));
// If it has any of these directories, it's likely a module
if (hasAgents || hasWorkflows || hasTasks || hasTools) {
modules.push(entry.name);
}
}
} catch (error) {
console.warn(`Warning: Could not scan for installed modules: ${error.message}`);
}
return modules;
}
}
module.exports = { ManifestGenerator };

View File

@ -0,0 +1,79 @@
/**
* Post-installation sidecar folder replacement utility
* Replaces {agent_sidecar_folder} placeholders in all installed agents
*/
const fs = require('fs-extra');
const path = require('node:path');
const yaml = require('yaml');
const glob = require('glob');
const chalk = require('chalk');
/**
* Replace {agent_sidecar_folder} placeholders in all agent files
* @param {string} bmadDir - Path to .bmad directory
* @returns {Object} Statistics about replacements made
*/
async function replaceAgentSidecarFolders(bmadDir) {
const results = {
filesScanned: 0,
filesReplaced: 0,
totalReplacements: 0,
errors: [],
};
try {
// Load core config to get agent_sidecar_folder value
const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml');
if (!(await fs.pathExists(coreConfigPath))) {
throw new Error(`Core config not found at ${coreConfigPath}`);
}
const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8');
const coreConfig = yaml.parse(coreConfigContent);
const agentSidecarFolder = coreConfig.agent_sidecar_folder;
// Use the literal value from config, don't resolve the placeholders
console.log(chalk.dim(`\n Replacing {agent_sidecar_folder} with: ${agentSidecarFolder}`));
// Find all agent .md files
const agentPattern = path.join(bmadDir, '**/*.md');
const agentFiles = glob.sync(agentPattern);
for (const agentFile of agentFiles) {
results.filesScanned++;
try {
let content = await fs.readFile(agentFile, 'utf8');
// Check if file contains {agent_sidecar_folder}
if (content.includes('{agent_sidecar_folder}')) {
// Replace all occurrences
const originalContent = content;
content = content.replaceAll('{agent_sidecar_folder}', agentSidecarFolder);
// Only write if content changed
if (content !== originalContent) {
await fs.writeFile(agentFile, content, 'utf8');
const replacementCount = (originalContent.match(/{agent_sidecar_folder}/g) || []).length;
results.filesReplaced++;
results.totalReplacements += replacementCount;
console.log(chalk.dim(` ✓ Replaced ${replacementCount} occurrence(s) in ${path.relative(bmadDir, agentFile)}`));
}
}
} catch (error) {
results.errors.push(`Error processing ${agentFile}: ${error.message}`);
}
}
return results;
} catch (error) {
results.errors.push(`Fatal error: ${error.message}`);
return results;
}
}
module.exports = { replaceAgentSidecarFolders };

View File

@ -15,7 +15,7 @@ const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generat
*/
class RovoDevSetup extends BaseIdeSetup {
constructor() {
super('rovo-dev', 'Atlassian Rovo Dev', true); // preferred IDE
super('rovo-dev', 'Atlassian Rovo Dev', false);
this.configDir = '.rovodev';
this.subagentsDir = 'subagents';
this.workflowsDir = 'workflows';

View File

@ -28,11 +28,13 @@ class AgentCommandGenerator {
for (const agent of agents) {
const launcherContent = await this.generateLauncherContent(agent);
// Use relativePath if available (for nested agents), otherwise just name with .md
const agentPathInModule = agent.relativePath || `${agent.name}.md`;
artifacts.push({
type: 'agent-launcher',
module: agent.module,
name: agent.name,
relativePath: path.join(agent.module, 'agents', `${agent.name}.md`),
relativePath: path.join(agent.module, 'agents', agentPathInModule),
content: launcherContent,
sourcePath: agent.path,
});
@ -56,9 +58,12 @@ class AgentCommandGenerator {
const template = await fs.readFile(this.templatePath, 'utf8');
// Replace template variables
// Use relativePath if available (for nested agents), otherwise just name with .md
const agentPathInModule = agent.relativePath || `${agent.name}.md`;
return template
.replaceAll('{{name}}', agent.name)
.replaceAll('{{module}}', agent.module)
.replaceAll('{{path}}', agentPathInModule)
.replaceAll('{{description}}', agent.description || `${agent.name} agent`)
.replaceAll('{bmad_folder}', this.bmadFolderName)
.replaceAll('{*bmad_folder*}', '{bmad_folder}');

View File

@ -76,46 +76,51 @@ async function getTasksFromBmad(bmadDir, selectedModules = []) {
return tasks;
}
async function getAgentsFromDir(dirPath, moduleName) {
async function getAgentsFromDir(dirPath, moduleName, relativePath = '') {
const agents = [];
if (!(await fs.pathExists(dirPath))) {
return agents;
}
const files = await fs.readdir(dirPath);
const entries = await fs.readdir(dirPath, { withFileTypes: true });
for (const file of files) {
if (!file.endsWith('.md')) {
continue;
for (const entry of entries) {
const fullPath = path.join(dirPath, entry.name);
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
if (entry.isDirectory()) {
// Recurse into subdirectories
const subDirAgents = await getAgentsFromDir(fullPath, moduleName, newRelativePath);
agents.push(...subDirAgents);
} else if (entry.name.endsWith('.md')) {
// Skip README files and other non-agent files
if (entry.name.toLowerCase() === 'readme.md' || entry.name.toLowerCase().startsWith('readme-')) {
continue;
}
if (entry.name.includes('.customize.')) {
continue;
}
const content = await fs.readFile(fullPath, 'utf8');
if (content.includes('localskip="true"')) {
continue;
}
// Only include files that have agent-specific content (compiled agents have <agent> tag)
if (!content.includes('<agent')) {
continue;
}
agents.push({
path: fullPath,
name: entry.name.replace('.md', ''),
module: moduleName,
relativePath: newRelativePath, // Keep the .md extension for the full path
});
}
// Skip README files and other non-agent files
if (file.toLowerCase() === 'readme.md' || file.toLowerCase().startsWith('readme-')) {
continue;
}
if (file.includes('.customize.')) {
continue;
}
const filePath = path.join(dirPath, file);
const content = await fs.readFile(filePath, 'utf8');
if (content.includes('localskip="true"')) {
continue;
}
// Only include files that have agent-specific content (compiled agents have <agent> tag)
if (!content.includes('<agent')) {
continue;
}
agents.push({
path: filePath,
name: file.replace('.md', ''),
module: moduleName,
});
}
return agents;

View File

@ -6,7 +6,7 @@ description: '{{description}}'
You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.
<agent-activation CRITICAL="TRUE">
1. LOAD the FULL agent file from @{bmad_folder}/{{module}}/agents/{{name}}.md
1. LOAD the FULL agent file from @{bmad_folder}/{{module}}/agents/{{path}}
2. READ its entire contents - this contains the complete agent persona, menu, and instructions
3. Execute ALL activation steps exactly as written in the agent file
4. Follow the agent's persona and menu system precisely

View File

@ -37,6 +37,14 @@ class ModuleManager {
this.bmadFolderName = bmadFolderName;
}
/**
* Set the core configuration for access during module installation
* @param {Object} coreConfig - Core configuration object
*/
setCoreConfig(coreConfig) {
this.coreConfig = coreConfig;
}
/**
* Copy a file and replace {bmad_folder} placeholder with actual folder name
* @param {string} sourcePath - Source file path
@ -98,57 +106,110 @@ class ModuleManager {
}
/**
* List all available modules
* Find all modules in the project by searching for install-config.yaml files
* @returns {Array} List of module paths
*/
async findModulesInProject() {
const projectRoot = getProjectRoot();
const modulePaths = new Set();
// Helper function to recursively scan directories
async function scanDirectory(dir, excludePaths = []) {
try {
const entries = await fs.readdir(dir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
// Skip hidden directories and node_modules
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist' || entry.name === 'build') {
continue;
}
// Skip excluded paths
if (excludePaths.some((exclude) => fullPath.startsWith(exclude))) {
continue;
}
if (entry.isDirectory()) {
// Skip core module - it's always installed first and not selectable
if (entry.name === 'core') {
continue;
}
// Check if this directory contains a module (only install-config.yaml is valid now)
const installerConfigPath = path.join(fullPath, '_module-installer', 'install-config.yaml');
if (await fs.pathExists(installerConfigPath)) {
modulePaths.add(fullPath);
// Don't scan inside modules - they might have their own nested structures
continue;
}
// Recursively scan subdirectories
await scanDirectory(fullPath, excludePaths);
}
}
} catch {
// Ignore errors (e.g., permission denied)
}
}
// Scan the entire project, but exclude src/modules since we handle it separately
await scanDirectory(projectRoot, [this.modulesSourcePath]);
return [...modulePaths];
}
/**
* List all available modules (excluding core which is always installed)
* @returns {Array} List of available modules with metadata
*/
async listAvailable() {
const modules = [];
if (!(await fs.pathExists(this.modulesSourcePath))) {
console.warn(chalk.yellow('Warning: src/modules directory not found'));
return modules;
}
// First, scan src/modules (the standard location)
if (await fs.pathExists(this.modulesSourcePath)) {
const entries = await fs.readdir(this.modulesSourcePath, { withFileTypes: true });
const entries = await fs.readdir(this.modulesSourcePath, { withFileTypes: true });
for (const entry of entries) {
if (entry.isDirectory()) {
const modulePath = path.join(this.modulesSourcePath, entry.name);
// Check for module structure (only install-config.yaml is valid now)
const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml');
for (const entry of entries) {
if (entry.isDirectory()) {
const modulePath = path.join(this.modulesSourcePath, entry.name);
// Check for new structure first
const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml');
// Fallback to old structure
const configPath = path.join(modulePath, 'config.yaml');
// Skip if this doesn't look like a module
if (!(await fs.pathExists(installerConfigPath))) {
continue;
}
const moduleInfo = {
id: entry.name,
path: modulePath,
name: entry.name.toUpperCase(),
description: 'BMAD Module',
version: '5.0.0',
};
// Skip core module - it's always installed first and not selectable
if (entry.name === 'core') {
continue;
}
// Try to read module config for metadata (prefer new location)
const configToRead = (await fs.pathExists(installerConfigPath)) ? installerConfigPath : configPath;
if (await fs.pathExists(configToRead)) {
try {
const configContent = await fs.readFile(configToRead, 'utf8');
const config = yaml.load(configContent);
// Use the code property as the id if available
if (config.code) {
moduleInfo.id = config.code;
}
moduleInfo.name = config.name || moduleInfo.name;
moduleInfo.description = config.description || moduleInfo.description;
moduleInfo.version = config.version || moduleInfo.version;
moduleInfo.dependencies = config.dependencies || [];
moduleInfo.defaultSelected = config.default_selected === undefined ? false : config.default_selected;
} catch (error) {
console.warn(`Failed to read config for ${entry.name}:`, error.message);
const moduleInfo = await this.getModuleInfo(modulePath, entry.name, 'src/modules');
if (moduleInfo) {
modules.push(moduleInfo);
}
}
}
}
// Then, find all other modules in the project
const otherModulePaths = await this.findModulesInProject();
for (const modulePath of otherModulePaths) {
const moduleName = path.basename(modulePath);
const relativePath = path.relative(getProjectRoot(), modulePath);
// Skip core module - it's always installed first and not selectable
if (moduleName === 'core') {
continue;
}
const moduleInfo = await this.getModuleInfo(modulePath, moduleName, relativePath);
if (moduleInfo && !modules.some((m) => m.id === moduleInfo.id)) {
// Avoid duplicates - skip if we already have this module ID
modules.push(moduleInfo);
}
}
@ -156,6 +217,104 @@ class ModuleManager {
return modules;
}
/**
* Get module information from a module path
* @param {string} modulePath - Path to the module directory
* @param {string} defaultName - Default name for the module
* @param {string} sourceDescription - Description of where the module was found
* @returns {Object|null} Module info or null if not a valid module
*/
async getModuleInfo(modulePath, defaultName, sourceDescription) {
// Check for module structure (only install-config.yaml is valid now)
const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml');
// Skip if this doesn't look like a module
if (!(await fs.pathExists(installerConfigPath))) {
return null;
}
const moduleInfo = {
id: defaultName,
path: modulePath,
name: defaultName
.split('-')
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(' '),
description: 'BMAD Module',
version: '5.0.0',
source: sourceDescription,
};
// Read module config for metadata
try {
const configContent = await fs.readFile(installerConfigPath, 'utf8');
const config = yaml.load(configContent);
// Use the code property as the id if available
if (config.code) {
moduleInfo.id = config.code;
}
moduleInfo.name = config.name || moduleInfo.name;
moduleInfo.description = config.description || moduleInfo.description;
moduleInfo.version = config.version || moduleInfo.version;
moduleInfo.dependencies = config.dependencies || [];
moduleInfo.defaultSelected = config.default_selected === undefined ? false : config.default_selected;
} catch (error) {
console.warn(`Failed to read config for ${defaultName}:`, error.message);
}
return moduleInfo;
}
/**
* Find the source path for a module by searching all possible locations
* @param {string} moduleName - Name of the module to find
* @returns {string|null} Path to the module source or null if not found
*/
async findModuleSource(moduleName) {
const projectRoot = getProjectRoot();
// First, check src/modules
const srcModulePath = path.join(this.modulesSourcePath, moduleName);
if (await fs.pathExists(srcModulePath)) {
// Check if this looks like a module (has install-config.yaml)
const installerConfigPath = path.join(srcModulePath, '_module-installer', 'install-config.yaml');
if (await fs.pathExists(installerConfigPath)) {
return srcModulePath;
}
}
// If not found in src/modules, search the entire project
const allModulePaths = await this.findModulesInProject();
for (const modulePath of allModulePaths) {
if (path.basename(modulePath) === moduleName) {
return modulePath;
}
}
// Also check by module ID (not just folder name)
// Need to read configs to match by ID
for (const modulePath of allModulePaths) {
const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml');
if (await fs.pathExists(installerConfigPath)) {
try {
const configContent = await fs.readFile(installerConfigPath, 'utf8');
const config = yaml.load(configContent);
if (config.code === moduleName) {
return modulePath;
}
} catch {
// Skip if can't read config
}
}
}
return null;
}
/**
* Install a module
* @param {string} moduleName - Name of the module to install
@ -167,12 +326,12 @@ class ModuleManager {
* @param {Object} options.logger - Logger instance for output
*/
async install(moduleName, bmadDir, fileTrackingCallback = null, options = {}) {
const sourcePath = path.join(this.modulesSourcePath, moduleName);
const sourcePath = await this.findModuleSource(moduleName);
const targetPath = path.join(bmadDir, moduleName);
// Check if source module exists
if (!(await fs.pathExists(sourcePath))) {
throw new Error(`Module '${moduleName}' not found in ${this.modulesSourcePath}`);
if (!sourcePath) {
throw new Error(`Module '${moduleName}' not found in any source location`);
}
// Check if already installed
@ -188,6 +347,9 @@ class ModuleManager {
// Copy module files with filtering
await this.copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback, options.moduleConfig);
// Compile any .agent.yaml files to .md format
await this.compileModuleAgents(sourcePath, targetPath, moduleName, bmadDir);
// Process agent files to inject activation block
await this.processAgentFiles(targetPath, moduleName);
@ -210,12 +372,12 @@ class ModuleManager {
* @param {boolean} force - Force update (overwrite modifications)
*/
async update(moduleName, bmadDir, force = false) {
const sourcePath = path.join(this.modulesSourcePath, moduleName);
const sourcePath = await this.findModuleSource(moduleName);
const targetPath = path.join(bmadDir, moduleName);
// Check if source module exists
if (!(await fs.pathExists(sourcePath))) {
throw new Error(`Module '${moduleName}' not found in source`);
if (!sourcePath) {
throw new Error(`Module '${moduleName}' not found in any source location`);
}
// Check if module is installed
@ -330,6 +492,16 @@ class ModuleManager {
continue;
}
// Skip sidecar directories - they are handled separately during agent compilation
if (
path
.dirname(file)
.split('/')
.some((dir) => dir.toLowerCase().includes('sidecar'))
) {
continue;
}
// Skip _module-installer directory - it's only needed at install time
if (file.startsWith('_module-installer/')) {
continue;
@ -340,6 +512,11 @@ class ModuleManager {
continue;
}
// Skip .agent.yaml files - they will be compiled separately
if (file.endsWith('.agent.yaml')) {
continue;
}
// Skip user documentation if install_user_docs is false
if (moduleConfig.install_user_docs === false && (file.startsWith('docs/') || file.startsWith('docs\\'))) {
console.log(chalk.dim(` Skipping user documentation: ${file}`));
@ -482,6 +659,152 @@ class ModuleManager {
}
}
/**
* Compile .agent.yaml files to .md format in modules
* @param {string} sourcePath - Source module path
* @param {string} targetPath - Target module path
* @param {string} moduleName - Module name
* @param {string} bmadDir - BMAD installation directory
*/
async compileModuleAgents(sourcePath, targetPath, moduleName, bmadDir) {
const sourceAgentsPath = path.join(sourcePath, 'agents');
const targetAgentsPath = path.join(targetPath, 'agents');
const cfgAgentsDir = path.join(bmadDir, '_cfg', 'agents');
// Check if agents directory exists in source
if (!(await fs.pathExists(sourceAgentsPath))) {
return; // No agents to compile
}
// Get all agent YAML files recursively
const agentFiles = await this.findAgentFiles(sourceAgentsPath);
for (const agentFile of agentFiles) {
if (!agentFile.endsWith('.agent.yaml')) continue;
const relativePath = path.relative(sourceAgentsPath, agentFile);
const targetDir = path.join(targetAgentsPath, path.dirname(relativePath));
await fs.ensureDir(targetDir);
const agentName = path.basename(agentFile, '.agent.yaml');
const sourceYamlPath = agentFile;
const targetMdPath = path.join(targetDir, `${agentName}.md`);
const customizePath = path.join(cfgAgentsDir, `${moduleName}-${agentName}.customize.yaml`);
// Read and compile the YAML
try {
const yamlContent = await fs.readFile(sourceYamlPath, 'utf8');
const { compileAgent } = require('../../../lib/agent/compiler');
// Create customize template if it doesn't exist
if (!(await fs.pathExists(customizePath))) {
const { getSourcePath } = require('../../../lib/project-root');
const genericTemplatePath = getSourcePath('utility', 'templates', 'agent.customize.template.yaml');
if (await fs.pathExists(genericTemplatePath)) {
await this.copyFileWithPlaceholderReplacement(genericTemplatePath, customizePath);
console.log(chalk.dim(` Created customize: ${moduleName}-${agentName}.customize.yaml`));
}
}
// Check for customizations
let customizedFields = [];
if (await fs.pathExists(customizePath)) {
const customizeContent = await fs.readFile(customizePath, 'utf8');
const customizeData = yaml.load(customizeContent);
customizedFields = customizeData.customized_fields || [];
}
// Load core config to get agent_sidecar_folder
const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml');
let coreConfig = {};
if (await fs.pathExists(coreConfigPath)) {
const yamlLib = require('yaml');
const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8');
coreConfig = yamlLib.parse(coreConfigContent);
}
// Check if agent has sidecar
let hasSidecar = false;
try {
const yamlLib = require('yaml');
const agentYaml = yamlLib.parse(yamlContent);
hasSidecar = agentYaml?.agent?.metadata?.hasSidecar === true;
} catch {
// Continue without sidecar processing
}
// Compile with customizations if any
const { xml } = compileAgent(yamlContent, {}, agentName, relativePath, { config: this.coreConfig });
// Write the compiled MD file
await fs.writeFile(targetMdPath, xml, 'utf8');
// Copy sidecar files if agent has hasSidecar flag
if (hasSidecar) {
const { copyAgentSidecarFiles } = require('../../../lib/agent/installer');
// Get agent sidecar folder from core config (should always be set)
const agentSidecarFolder = this.coreConfig?.agent_sidecar_folder;
// Resolve path variables
const projectDir = path.dirname(bmadDir);
const resolvedSidecarFolder = agentSidecarFolder
.replaceAll('{project-root}', projectDir)
.replaceAll('{bmad_folder}', path.basename(bmadDir));
// Create sidecar directory for this agent
const agentSidecarDir = path.join(resolvedSidecarFolder, agentName);
await fs.ensureDir(agentSidecarDir);
// Copy sidecar files (preserve existing, add new)
const sidecarResult = copyAgentSidecarFiles(path.dirname(sourceYamlPath), agentSidecarDir, sourceYamlPath);
const totalFiles = sidecarResult.copied.length + sidecarResult.preserved.length;
if (sidecarResult.copied.length > 0) {
console.log(chalk.dim(` Copied ${sidecarResult.copied.length} new sidecar file(s) to: ${agentSidecarDir}`));
}
if (sidecarResult.preserved.length > 0) {
console.log(chalk.dim(` Preserved ${sidecarResult.preserved.length} existing sidecar file(s)`));
}
}
console.log(
chalk.dim(` Compiled agent: ${agentName} -> ${path.relative(targetPath, targetMdPath)}${hasSidecar ? ' (with sidecar)' : ''}`),
);
} catch (error) {
console.warn(chalk.yellow(` Failed to compile agent ${agentName}:`, error.message));
}
}
}
/**
* Find all .agent.yaml files recursively in a directory
* @param {string} dir - Directory to search
* @returns {Array} List of .agent.yaml file paths
*/
async findAgentFiles(dir) {
const agentFiles = [];
async function searchDirectory(searchDir) {
const entries = await fs.readdir(searchDir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(searchDir, entry.name);
if (entry.isFile() && entry.name.endsWith('.agent.yaml')) {
agentFiles.push(fullPath);
} else if (entry.isDirectory()) {
await searchDirectory(fullPath);
}
}
}
await searchDirectory(dir);
return agentFiles;
}
/**
* Process agent files to inject activation block
* @param {string} modulePath - Path to installed module
@ -495,24 +818,49 @@ class ModuleManager {
return; // No agents to process
}
// Get all agent files
const agentFiles = await fs.readdir(agentsPath);
// Get all agent MD files recursively
const agentFiles = await this.findAgentMdFiles(agentsPath);
for (const agentFile of agentFiles) {
if (!agentFile.endsWith('.md')) continue;
const agentPath = path.join(agentsPath, agentFile);
let content = await fs.readFile(agentPath, 'utf8');
let content = await fs.readFile(agentFile, 'utf8');
// Check if content has agent XML and no activation block
if (content.includes('<agent') && !content.includes('<activation')) {
// Inject the activation block using XML handler
content = this.xmlHandler.injectActivationSimple(content);
await fs.writeFile(agentPath, content, 'utf8');
await fs.writeFile(agentFile, content, 'utf8');
}
}
}
/**
* Find all .md agent files recursively in a directory
* @param {string} dir - Directory to search
* @returns {Array} List of .md agent file paths
*/
async findAgentMdFiles(dir) {
const agentFiles = [];
async function searchDirectory(searchDir) {
const entries = await fs.readdir(searchDir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(searchDir, entry.name);
if (entry.isFile() && entry.name.endsWith('.md')) {
agentFiles.push(fullPath);
} else if (entry.isDirectory()) {
await searchDirectory(fullPath);
}
}
}
await searchDirectory(dir);
return agentFiles;
}
/**
* Vendor cross-module workflows referenced in agent files
* Scans SOURCE agent.yaml files for workflow-install and copies workflows to destination
@ -654,7 +1002,11 @@ class ModuleManager {
if (moduleName === 'core') {
sourcePath = getSourcePath('core');
} else {
sourcePath = path.join(this.modulesSourcePath, moduleName);
sourcePath = await this.findModuleSource(moduleName);
if (!sourcePath) {
// No source found, skip module installer
return;
}
}
const installerPath = path.join(sourcePath, '_module-installer', 'installer.js');

View File

@ -438,9 +438,10 @@ function compileToXml(agentYaml, agentName = '', targetPath = '') {
* @param {Object} answers - Answers from install_config questions (or defaults)
* @param {string} agentName - Optional final agent name (user's custom persona name)
* @param {string} targetPath - Optional target path for agent ID
* @param {Object} options - Additional options including config
* @returns {Object} { xml: string, metadata: Object }
*/
function compileAgent(yamlContent, answers = {}, agentName = '', targetPath = '') {
function compileAgent(yamlContent, answers = {}, agentName = '', targetPath = '', options = {}) {
// Parse YAML
const agentYaml = yaml.parse(yamlContent);
@ -466,14 +467,22 @@ function compileAgent(yamlContent, answers = {}, agentName = '', targetPath = ''
finalAnswers = { ...defaults, ...answers };
}
// Add agent_sidecar_folder to answers if provided in config
if (options.config && options.config.agent_sidecar_folder) {
finalAnswers.agent_sidecar_folder = options.config.agent_sidecar_folder;
}
// Process templates with answers
const processedYaml = processAgentYaml(agentYaml, finalAnswers);
// Strip install_config from output
const cleanYaml = stripInstallConfig(processedYaml);
// Compile to XML
const xml = compileToXml(cleanYaml, agentName, targetPath);
// Replace {agent_sidecar_folder} in XML content
let xml = compileToXml(cleanYaml, agentName, targetPath);
if (finalAnswers.agent_sidecar_folder) {
xml = xml.replaceAll('{agent_sidecar_folder}', finalAnswers.agent_sidecar_folder);
}
return {
xml,

View File

@ -46,7 +46,7 @@ function resolvePath(pathStr, context) {
}
/**
* Discover available agents in the custom agent location
* Discover available agents in the custom agent location recursively
* @param {string} searchPath - Path to search for agents
* @returns {Array} List of agent info objects
*/
@ -56,35 +56,58 @@ function discoverAgents(searchPath) {
}
const agents = [];
const entries = fs.readdirSync(searchPath, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(searchPath, entry.name);
// Helper function to recursively search
function searchDirectory(dir, relativePath = '') {
const entries = fs.readdirSync(dir, { withFileTypes: true });
if (entry.isFile() && entry.name.endsWith('.agent.yaml')) {
// Simple agent (single file)
agents.push({
type: 'simple',
name: entry.name.replace('.agent.yaml', ''),
path: fullPath,
yamlFile: fullPath,
});
} else if (entry.isDirectory()) {
// Check for agent with sidecar (folder containing .agent.yaml)
const yamlFiles = fs.readdirSync(fullPath).filter((f) => f.endsWith('.agent.yaml'));
if (yamlFiles.length === 1) {
const agentYamlPath = path.join(fullPath, yamlFiles[0]);
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
const agentRelativePath = relativePath ? path.join(relativePath, entry.name) : entry.name;
if (entry.isFile() && entry.name.endsWith('.agent.yaml')) {
// Simple agent (single file)
// The agent name is based on the filename
const agentName = entry.name.replace('.agent.yaml', '');
agents.push({
type: 'expert',
name: entry.name,
type: 'simple',
name: agentName,
path: fullPath,
yamlFile: agentYamlPath,
hasSidecar: true,
yamlFile: fullPath,
relativePath: agentRelativePath.replace('.agent.yaml', ''),
});
} else if (entry.isDirectory()) {
// Check if this directory contains an .agent.yaml file
try {
const dirContents = fs.readdirSync(fullPath);
const yamlFiles = dirContents.filter((f) => f.endsWith('.agent.yaml'));
if (yamlFiles.length > 0) {
// Found .agent.yaml files in this directory
for (const yamlFile of yamlFiles) {
const agentYamlPath = path.join(fullPath, yamlFile);
const agentName = path.basename(yamlFile, '.agent.yaml');
agents.push({
type: 'expert',
name: agentName,
path: fullPath,
yamlFile: agentYamlPath,
relativePath: agentRelativePath,
});
}
} else {
// No .agent.yaml in this directory, recurse deeper
searchDirectory(fullPath, agentRelativePath);
}
} catch {
// Skip directories we can't read
}
}
}
}
searchDirectory(searchPath);
return agents;
}
@ -103,12 +126,15 @@ function loadAgentConfig(yamlPath) {
// These take precedence over defaults
const savedAnswers = agentYaml?.saved_answers || {};
const metadata = agentYaml?.agent?.metadata || {};
return {
yamlContent: content,
agentYaml,
installConfig,
defaults: { ...defaults, ...savedAnswers }, // saved_answers override defaults
metadata: agentYaml?.agent?.metadata || {},
metadata,
hasSidecar: metadata.hasSidecar === true,
};
}
@ -208,9 +234,10 @@ async function promptInstallQuestions(installConfig, defaults, presetAnswers = {
* @param {Object} agentInfo - Agent discovery info
* @param {Object} answers - User answers for install_config
* @param {string} targetPath - Target installation directory
* @param {Object} options - Additional options including config
* @returns {Object} Installation result
*/
function installAgent(agentInfo, answers, targetPath) {
function installAgent(agentInfo, answers, targetPath, options = {}) {
// Compile the agent
const { xml, metadata, processedYaml } = compileAgent(fs.readFileSync(agentInfo.yamlFile, 'utf8'), answers);
@ -237,11 +264,27 @@ function installAgent(agentInfo, answers, targetPath) {
sidecarCopied: false,
};
// Copy sidecar files for expert agents
if (agentInfo.hasSidecar && agentInfo.type === 'expert') {
const sidecarFiles = copySidecarFiles(agentInfo.path, agentTargetDir, agentInfo.yamlFile);
// Handle sidecar files for agents with hasSidecar flag
if (agentInfo.hasSidecar === true && agentInfo.type === 'expert') {
// Get agent sidecar folder from config or use default
const agentSidecarFolder = options.config?.agent_sidecar_folder || '{project-root}/.myagent-data';
// Resolve path variables
const resolvedSidecarFolder = agentSidecarFolder
.replaceAll('{project-root}', options.projectRoot || process.cwd())
.replaceAll('{bmad_folder}', options.bmadFolder || '.bmad');
// Create sidecar directory for this agent
const agentSidecarDir = path.join(resolvedSidecarFolder, agentFolderName);
if (!fs.existsSync(agentSidecarDir)) {
fs.mkdirSync(agentSidecarDir, { recursive: true });
}
// Find and copy sidecar folder
const sidecarFiles = copyAgentSidecarFiles(agentInfo.path, agentSidecarDir, agentInfo.yamlFile);
result.sidecarCopied = true;
result.sidecarFiles = sidecarFiles;
result.sidecarDir = agentSidecarDir;
}
return result;
@ -285,6 +328,62 @@ function copySidecarFiles(sourceDir, targetDir, excludeYaml) {
return copied;
}
/**
* Find and copy agent sidecar folders
* @param {string} sourceDir - Source agent directory
* @param {string} targetSidecarDir - Target sidecar directory for the agent
* @param {string} excludeYaml - The .agent.yaml file to exclude
* @returns {Array} List of copied files
*/
function copyAgentSidecarFiles(sourceDir, targetSidecarDir, excludeYaml) {
const copied = [];
const preserved = [];
// Find folders with "sidecar" in the name
const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
for (const entry of entries) {
if (entry.isDirectory() && entry.name.toLowerCase().includes('sidecar')) {
const sidecarSourcePath = path.join(sourceDir, entry.name);
// Recursively sync the sidecar folder contents (preserve existing, add new)
function syncSidecarDir(src, dest) {
if (!fs.existsSync(dest)) {
fs.mkdirSync(dest, { recursive: true });
}
// Get all files in source
const sourceEntries = fs.readdirSync(src, { withFileTypes: true });
for (const sourceEntry of sourceEntries) {
const srcPath = path.join(src, sourceEntry.name);
const destPath = path.join(dest, sourceEntry.name);
if (sourceEntry.isDirectory()) {
// Recursively sync subdirectories
syncSidecarDir(srcPath, destPath);
} else {
// Check if file already exists in destination
if (fs.existsSync(destPath)) {
// File exists - preserve it
preserved.push(destPath);
} else {
// File doesn't exist - copy it
fs.copyFileSync(srcPath, destPath);
copied.push(destPath);
}
}
}
}
syncSidecarDir(sidecarSourcePath, targetSidecarDir);
}
}
// Return info about what was preserved and what was copied
return { copied, preserved };
}
/**
* Update agent metadata ID to reflect installed location
* @param {string} compiledContent - Compiled XML content
@ -721,6 +820,7 @@ module.exports = {
promptInstallQuestions,
installAgent,
copySidecarFiles,
copyAgentSidecarFiles,
updateAgentId,
detectBmadProject,
addToManifest,

View File

@ -116,8 +116,18 @@ class UI {
const { installedModuleIds } = await this.getExistingInstallation(confirmedDirectory);
const coreConfig = await this.collectCoreConfig(confirmedDirectory);
const moduleChoices = await this.getModuleChoices(installedModuleIds);
const selectedModules = await this.selectModules(moduleChoices);
// Skip module selection during update/reinstall - keep existing modules
let selectedModules;
if (actionType === 'update' || actionType === 'reinstall') {
// Keep all existing installed modules during update/reinstall
selectedModules = [...installedModuleIds];
console.log(chalk.cyan('\n📦 Keeping existing modules: ') + selectedModules.join(', '));
} else {
// Only show module selection for new installs
const moduleChoices = await this.getModuleChoices(installedModuleIds);
selectedModules = await this.selectModules(moduleChoices);
}
// Prompt for AgentVibes TTS integration
const agentVibesConfig = await this.promptAgentVibes(confirmedDirectory);

View File

@ -75,27 +75,41 @@ function agentSchema(options = {}) {
}
// Handle multi format with triggers array (new format)
else if (item.triggers && Array.isArray(item.triggers)) {
for (const triggerGroup of item.triggers) {
for (const triggerKey of Object.keys(triggerGroup)) {
if (!TRIGGER_PATTERN.test(triggerKey)) {
for (const [triggerIndex, triggerItem] of item.triggers.entries()) {
let triggerName = null;
// Extract trigger name from all three formats
if (triggerItem.trigger) {
// Format 1: Simple flat format with trigger field
triggerName = triggerItem.trigger;
} else {
// Format 2a or 2b: Object-key format
const keys = Object.keys(triggerItem);
if (keys.length === 1 && keys[0] !== 'trigger') {
triggerName = keys[0];
}
}
if (triggerName) {
if (!TRIGGER_PATTERN.test(triggerName)) {
ctx.addIssue({
code: 'custom',
path: ['agent', 'menu', index, 'triggers'],
message: `agent.menu[].triggers key must be kebab-case (lowercase words separated by hyphen) - got "${triggerKey}"`,
path: ['agent', 'menu', index, 'triggers', triggerIndex],
message: `agent.menu[].triggers[] must be kebab-case (lowercase words separated by hyphen) - got "${triggerName}"`,
});
return;
}
if (seenTriggers.has(triggerKey)) {
if (seenTriggers.has(triggerName)) {
ctx.addIssue({
code: 'custom',
path: ['agent', 'menu', index, 'triggers'],
message: `agent.menu[].triggers key duplicates "${triggerKey}" within the same agent`,
path: ['agent', 'menu', index, 'triggers', triggerIndex],
message: `agent.menu[].triggers[] duplicates "${triggerName}" within the same agent`,
});
return;
}
seenTriggers.add(triggerKey);
seenTriggers.add(triggerName);
}
}
}
@ -250,102 +264,148 @@ function buildMenuItemSchema() {
.object({
multi: createNonEmptyString('agent.menu[].multi'),
triggers: z
.array(z.object({}).passthrough())
.refine(
(triggers) => {
// Each item in triggers array should be an object with exactly one key
for (const trigger of triggers) {
const keys = Object.keys(trigger);
if (keys.length !== 1) {
return false;
}
.array(
z.union([
// Format 1: Simple flat format (has trigger field)
z
.object({
trigger: z.string(),
input: createNonEmptyString('agent.menu[].triggers[].input'),
route: createNonEmptyString('agent.menu[].triggers[].route').optional(),
action: createNonEmptyString('agent.menu[].triggers[].action').optional(),
data: z.string().optional(),
type: z.enum(['exec', 'action', 'workflow']).optional(),
})
.strict()
.refine((data) => data.trigger, { message: 'Must have trigger field' })
.superRefine((value, ctx) => {
// Must have either route or action (or both)
if (!value.route && !value.action) {
ctx.addIssue({
code: 'custom',
message: 'agent.menu[].triggers[] must have either route or action (or both)',
});
}
}),
// Format 2a: Object with array format (like bmad-builder.agent.yaml)
z
.object({})
.passthrough()
.refine(
(value) => {
const keys = Object.keys(value);
if (keys.length !== 1) return false;
const triggerItems = value[keys[0]];
return Array.isArray(triggerItems);
},
{ message: 'Must be object with single key pointing to array' },
)
.superRefine((value, ctx) => {
const triggerName = Object.keys(value)[0];
const triggerItems = value[triggerName];
const execArray = trigger[keys[0]];
if (!Array.isArray(execArray)) {
return false;
}
if (!Array.isArray(triggerItems)) {
ctx.addIssue({
code: 'custom',
message: `Trigger "${triggerName}" must be an array of items`,
});
return;
}
// Check required fields
const hasInput = execArray.some((item) => 'input' in item);
const hasRouteOrAction = execArray.some((item) => 'route' in item || 'action' in item);
// Check required fields in the array
const hasInput = triggerItems.some((item) => 'input' in item);
const hasRouteOrAction = triggerItems.some((item) => 'route' in item || 'action' in item);
if (!hasInput) {
return false;
}
if (!hasInput) {
ctx.addIssue({
code: 'custom',
message: `Trigger "${triggerName}" must have an input field`,
});
}
// If not TODO, must have route or action
const isTodo = execArray.some((item) => item.route === 'TODO' || item.action === 'TODO');
if (!isTodo && !hasRouteOrAction) {
return false;
}
}
return true;
},
{
message: 'agent.menu[].triggers must be an array of trigger objects with input and either route/action or TODO',
},
if (!hasRouteOrAction) {
ctx.addIssue({
code: 'custom',
message: `Trigger "${triggerName}" must have a route or action field`,
});
}
}),
// Format 2b: Object with direct fields (like analyst.agent.yaml)
z
.object({})
.passthrough()
.refine(
(value) => {
const keys = Object.keys(value);
if (keys.length !== 1) return false;
const triggerFields = value[keys[0]];
return !Array.isArray(triggerFields) && typeof triggerFields === 'object';
},
{ message: 'Must be object with single key pointing to object' },
)
.superRefine((value, ctx) => {
const triggerName = Object.keys(value)[0];
const triggerFields = value[triggerName];
// Check required fields
if (!triggerFields.input || typeof triggerFields.input !== 'string') {
ctx.addIssue({
code: 'custom',
message: `Trigger "${triggerName}" must have an input field`,
});
}
if (!triggerFields.route && !triggerFields.action) {
ctx.addIssue({
code: 'custom',
message: `Trigger "${triggerName}" must have a route or action field`,
});
}
}),
]),
)
.transform((triggers) => {
// Validate and clean up the triggers
for (const trigger of triggers) {
const keys = Object.keys(trigger);
if (keys.length !== 1) {
throw new Error('Each trigger object must have exactly one key');
}
const execArray = trigger[keys[0]];
if (!Array.isArray(execArray)) {
throw new TypeError(`Trigger "${keys[0]}" must be an array`);
}
// Validate each item in the exec array
for (const item of execArray) {
if ('input' in item && typeof item.input !== 'string') {
throw new Error('Input must be a string');
}
if ('route' in item && typeof item.route !== 'string' && item.route !== 'TODO') {
throw new Error('Route must be a string or TODO');
}
if ('type' in item && !['exec', 'action', 'workflow', 'TODO'].includes(item.type)) {
throw new Error('Type must be one of: exec, action, workflow, TODO');
}
}
}
return triggers;
}),
.min(1, { message: 'agent.menu[].triggers must have at least one trigger' }),
discussion: z.boolean().optional(),
})
.strict()
.superRefine((value, ctx) => {
// Extract all trigger keys for validation
const triggerKeys = [];
for (const triggerGroup of value.triggers) {
for (const key of Object.keys(triggerGroup)) {
triggerKeys.push(key);
// Check for duplicate trigger names
const seenTriggers = new Set();
for (const [index, triggerItem] of value.triggers.entries()) {
let triggerName = null;
// Validate trigger key format
if (!TRIGGER_PATTERN.test(key)) {
// Extract trigger name from either format
if (triggerItem.trigger) {
// Format 1
triggerName = triggerItem.trigger;
} else {
// Format 2
const keys = Object.keys(triggerItem);
if (keys.length === 1) {
triggerName = keys[0];
}
}
if (triggerName) {
if (seenTriggers.has(triggerName)) {
ctx.addIssue({
code: 'custom',
path: ['agent', 'menu', 'triggers'],
message: `Trigger key "${key}" must be kebab-case (lowercase words separated by hyphen)`,
path: ['agent', 'menu', 'triggers', index],
message: `Trigger name "${triggerName}" is duplicated`,
});
}
seenTriggers.add(triggerName);
// Validate trigger name format
if (!TRIGGER_PATTERN.test(triggerName)) {
ctx.addIssue({
code: 'custom',
path: ['agent', 'menu', 'triggers', index],
message: `Trigger name "${triggerName}" must be kebab-case (lowercase words separated by hyphen)`,
});
}
}
}
// Check for duplicates
const seenTriggers = new Set();
for (const triggerKey of triggerKeys) {
if (seenTriggers.has(triggerKey)) {
ctx.addIssue({
code: 'custom',
path: ['agent', 'menu', 'triggers'],
message: `Trigger key "${triggerKey}" is duplicated`,
});
}
seenTriggers.add(triggerKey);
}
});
return z.union([legacyMenuItemSchema, multiMenuItemSchema]);