Compare commits

...

9 Commits

Author SHA1 Message Date
Dicky Moore 5f4d744318
Merge ddd0e8fbf2 into 55cb4681bc 2025-12-08 15:43:34 +00:00
Brian Madison 55cb4681bc party mode and brainstorming had bmm config instead of core config listed causing loading error when bmm is not an installed module - fixed. 2025-12-08 08:11:39 -06:00
Brian Madison eb4325fab9 restore bmm as default selected module. 2025-12-08 08:04:39 -06:00
Brian Madison 57ceaf9fa9 conflict marker removed from docs 2025-12-08 08:01:00 -06:00
OhSeungWan 1513b2d478
fix: collect module.yaml prompts for custom modules (#1065)
Custom modules with module.yaml configuration prompts were not being
collected during installation. Added customModulePaths option to
ConfigCollector to resolve custom module paths from selectedFiles
and cachedModules sources.
2025-12-08 07:33:53 -06:00
mq-bot ddd0e8fbf2 fix: remind workflows to reload sprint status 2025-11-26 14:06:12 +00:00
mq-bot 9e70b1d41c Merge upstream/main into feature/sprint-status-reload 2025-11-26 13:38:58 +00:00
mq-bot 9a3a46314e fix: remind workflows to reload sprint status 2025-11-24 19:31:35 +00:00
mq-bot a4c394fc78 Ensure workflow launcher loads core workflow 2025-11-24 14:56:30 +00:00
14 changed files with 90 additions and 141 deletions

Binary file not shown.

View File

@ -28,7 +28,7 @@ This uses **micro-file architecture** for disciplined execution:
### Configuration Loading ### Configuration Loading
Load config from `{project-root}/{bmad_folder}/bmm/config.yaml` and resolve: Load config from `{project-root}/{bmad_folder}/core/config.yaml` and resolve:
- `project_name`, `output_folder`, `user_name` - `project_name`, `output_folder`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level` - `communication_language`, `document_output_language`, `user_skill_level`

View File

@ -27,7 +27,7 @@ This uses **micro-file architecture** with **sequential conversation orchestrati
### Configuration Loading ### Configuration Loading
Load config from `{project-root}/{bmad_folder}/bmm/config.yaml` and resolve: Load config from `{project-root}/{bmad_folder}/core/config.yaml` and resolve:
- `project_name`, `output_folder`, `user_name` - `project_name`, `output_folder`, `user_name`
- `communication_language`, `document_output_language`, `user_skill_level` - `communication_language`, `document_output_language`, `user_skill_level`

View File

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

View File

@ -133,7 +133,6 @@ The `sprint-status.yaml` file is the single source of truth for all implementati
### (BMad Method / Enterprise) ### (BMad Method / Enterprise)
``` ```
<<<<<<< Updated upstream
PRD (PM) → Architecture (Architect) PRD (PM) → Architecture (Architect)
→ create-epics-and-stories (PM) ← V6: After architecture! → create-epics-and-stories (PM) ← V6: After architecture!
→ implementation-readiness (Architect) → implementation-readiness (Architect)
@ -142,7 +141,6 @@ PRD (PM) → Architecture (Architect)
→ story loop (SM/DEV) → story loop (SM/DEV)
→ retrospective (SM) → retrospective (SM)
→ [Next Epic] → [Next Epic]
=======
Current Phase: 4 (Implementation) Current Phase: 4 (Implementation)
Current Epic: Epic 1 (Authentication) Current Epic: Epic 1 (Authentication)
Current Sprint: Sprint 1 Current Sprint: Sprint 1
@ -190,108 +188,12 @@ See: [workflow-status instructions](../workflows/workflow-status/instructions.md
See: [document-project reference](./workflow-document-project-reference.md) 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
```
---
## Related Documentation ## Related Documentation
- [Phase 1: Analysis Workflows](./workflows-analysis.md) - [Phase 1: Analysis Workflows](./workflows-analysis.md)
- [Phase 2: Planning Workflows](./workflows-planning.md) - [Phase 2: Planning Workflows](./workflows-planning.md)
- [Phase 3: Solutioning Workflows](./workflows-solutioning.md) - [Phase 3: Solutioning Workflows](./workflows-solutioning.md)
---
## Troubleshooting ## Troubleshooting
**Q: Which workflow should I run next?** **Q: Which workflow should I run next?**
@ -306,6 +208,4 @@ A: Not recommended. Complete one story's full lifecycle before starting the next
**Q: What if code review finds issues?** **Q: What if code review finds issues?**
A: DEV runs `dev-story` to make fixes, re-runs tests, then runs `code-review` again until it passes. A: DEV runs `dev-story` to make fixes, re-runs tests, then runs `code-review` again until it passes.
---
_Phase 4 Implementation - One story at a time, done right._ _Phase 4 Implementation - One story at a time, done right._

View File

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

View File

@ -3,6 +3,8 @@
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical> <critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
<critical>Communicate all responses in {communication_language} and language MUST be tailored to {user_skill_level}</critical> <critical>Communicate all responses in {communication_language} and language MUST be tailored to {user_skill_level}</critical>
<critical>Generate all documents in {document_output_language}</critical> <critical>Generate all documents in {document_output_language}</critical>
<critical>ALWAYS reload {{sprint_status}} (docs/sprint-artifacts/sprint-status.yaml by default) from disk immediately before reading or
updating statuses. Multiple workflows change this file between runs; never rely on a previously loaded copy or cached memory.</critical>
<critical>🔥 YOU ARE AN ADVERSARIAL CODE REVIEWER - Find what's wrong or missing! 🔥</critical> <critical>🔥 YOU ARE AN ADVERSARIAL CODE REVIEWER - Find what's wrong or missing! 🔥</critical>
<critical>Your purpose: Validate story file claims against actual implementation</critical> <critical>Your purpose: Validate story file claims against actual implementation</critical>
@ -221,4 +223,4 @@
</output> </output>
</step> </step>
</workflow> </workflow>

View File

@ -2,6 +2,8 @@
<critical>The workflow execution engine is governed by: {project-root}/{bmad_folder}/core/tasks/workflow.xml</critical> <critical>The workflow execution engine is governed by: {project-root}/{bmad_folder}/core/tasks/workflow.xml</critical>
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical> <critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
<critical>Communicate all responses in {communication_language} and generate all documents in {document_output_language}</critical> <critical>Communicate all responses in {communication_language} and generate all documents in {document_output_language}</critical>
<critical>ALWAYS reload {{sprint_status}} (docs/sprint-artifacts/sprint-status.yaml by default) from disk immediately before reading or
updating statuses. Multiple workflows change this file between runs; never rely on a previously loaded copy or cached memory.</critical>
<critical>🔥 CRITICAL MISSION: You are creating the ULTIMATE story context engine that prevents LLM developer mistakes, omissions or <critical>🔥 CRITICAL MISSION: You are creating the ULTIMATE story context engine that prevents LLM developer mistakes, omissions or
disasters! 🔥</critical> disasters! 🔥</critical>
@ -351,4 +353,4 @@
</output> </output>
</step> </step>
</workflow> </workflow>

View File

@ -3,6 +3,8 @@
<critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical> <critical>You MUST have already loaded and processed: {installed_path}/workflow.yaml</critical>
<critical>Communicate all responses in {communication_language} and language MUST be tailored to {user_skill_level}</critical> <critical>Communicate all responses in {communication_language} and language MUST be tailored to {user_skill_level}</critical>
<critical>Generate all documents in {document_output_language}</critical> <critical>Generate all documents in {document_output_language}</critical>
<critical>ALWAYS reload {{sprint_status}} (docs/sprint-artifacts/sprint-status.yaml by default) from disk immediately before reading or
updating statuses. Multiple workflows change this file between runs; never rely on a previously loaded copy or cached memory.</critical>
<critical>Only modify the story file in these areas: Tasks/Subtasks checkboxes, Dev Agent Record (Debug Log, Completion Notes), File List, <critical>Only modify the story file in these areas: Tasks/Subtasks checkboxes, Dev Agent Record (Debug Log, Completion Notes), File List,
Change Log, and Status</critical> Change Log, and Status</critical>
<critical>Execute ALL steps in exact order; do NOT skip steps</critical> <critical>Execute ALL steps in exact order; do NOT skip steps</critical>
@ -403,4 +405,4 @@
<action>Remain flexible - allow user to choose their own path or ask for other assistance</action> <action>Remain flexible - allow user to choose their own path or ask for other assistance</action>
</step> </step>
</workflow> </workflow>

View File

@ -26,6 +26,7 @@ PARTY MODE PROTOCOL:
- Create natural back-and-forth with user actively participating - Create natural back-and-forth with user actively participating
- Show disagreements, diverse perspectives, authentic team dynamics - Show disagreements, diverse perspectives, authentic team dynamics
</critical> </critical>
<critical>ALWAYS reload {{sprint_status_file}} (docs/sprint-artifacts/sprint-status.yaml by default) from disk immediately before reading or updating statuses. Multiple workflows change this file between runs; never rely on a previously loaded copy or cached memory.</critical>
<workflow> <workflow>

View File

@ -132,8 +132,12 @@ class ConfigCollector {
* Collect configuration for all modules * Collect configuration for all modules
* @param {Array} modules - List of modules to configure (including 'core') * @param {Array} modules - List of modules to configure (including 'core')
* @param {string} projectDir - Target project directory * @param {string} projectDir - Target project directory
* @param {Object} options - Additional options
* @param {Map} options.customModulePaths - Map of module ID to source path for custom modules
*/ */
async collectAllConfigurations(modules, projectDir) { async collectAllConfigurations(modules, projectDir, options = {}) {
// Store custom module paths for use in collectModuleConfig
this.customModulePaths = options.customModulePaths || new Map();
await this.loadExistingConfig(projectDir); await this.loadExistingConfig(projectDir);
// Check if core was already collected (e.g., in early collection phase) // Check if core was already collected (e.g., in early collection phase)
@ -451,11 +455,21 @@ class ConfigCollector {
this.allAnswers = {}; this.allAnswers = {};
} }
// Load module's config // Load module's config
// First, try the standard src/modules location // First, check if we have a custom module path for this module
let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'module.yaml'); let installerConfigPath = null;
let moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml'); let moduleConfigPath = null;
// If not found in src/modules, we need to find it by searching the project if (this.customModulePaths && this.customModulePaths.has(moduleName)) {
const customPath = this.customModulePaths.get(moduleName);
installerConfigPath = path.join(customPath, '_module-installer', 'module.yaml');
moduleConfigPath = path.join(customPath, 'module.yaml');
} else {
// Try the standard src/modules location
installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'module.yaml');
moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
}
// If not found in src/modules or custom paths, search the project
if (!(await fs.pathExists(installerConfigPath)) && !(await fs.pathExists(moduleConfigPath))) { if (!(await fs.pathExists(installerConfigPath)) && !(await fs.pathExists(moduleConfigPath))) {
// Use the module manager to find the module source // Use the module manager to find the module source
const { ModuleManager } = require('../modules/manager'); const { ModuleManager } = require('../modules/manager');

View File

@ -435,8 +435,53 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
// Quick update already collected all configs, use them directly // Quick update already collected all configs, use them directly
moduleConfigs = this.configCollector.collectedConfig; moduleConfigs = this.configCollector.collectedConfig;
} else { } else {
// Build custom module paths map from customContent
const customModulePaths = new Map();
// Handle selectedFiles (from existing install path or manual directory input)
if (config.customContent && config.customContent.selected && config.customContent.selectedFiles) {
const { CustomHandler } = require('../custom/handler');
const customHandler = new CustomHandler();
for (const customFile of config.customContent.selectedFiles) {
const customInfo = await customHandler.getCustomInfo(customFile, path.resolve(config.directory));
if (customInfo && customInfo.id) {
customModulePaths.set(customInfo.id, customInfo.path);
}
}
}
// Handle cachedModules (from new install path where modules are cached)
// Only include modules that were actually selected for installation
if (config.customContent && config.customContent.cachedModules) {
// Get selected cached module IDs (if available)
const selectedCachedIds = config.customContent.selectedCachedModules || [];
// If no selection info, include all cached modules (for backward compatibility)
const shouldIncludeAll = selectedCachedIds.length === 0 && config.customContent.selected;
for (const cachedModule of config.customContent.cachedModules) {
// For cached modules, the path is the cachePath which contains the module.yaml
if (
cachedModule.id &&
cachedModule.cachePath && // Include if selected or if we should include all
(shouldIncludeAll || selectedCachedIds.includes(cachedModule.id))
) {
customModulePaths.set(cachedModule.id, cachedModule.cachePath);
}
}
}
// Get list of all modules including custom modules
const allModulesForConfig = [...(config.modules || [])];
for (const [moduleId] of customModulePaths) {
if (!allModulesForConfig.includes(moduleId)) {
allModulesForConfig.push(moduleId);
}
}
// Regular install - collect configurations (core was already collected in UI.promptInstall if interactive) // Regular install - collect configurations (core was already collected in UI.promptInstall if interactive)
moduleConfigs = await this.configCollector.collectAllConfigurations(config.modules || [], path.resolve(config.directory)); moduleConfigs = await this.configCollector.collectAllConfigurations(allModulesForConfig, path.resolve(config.directory), {
customModulePaths,
});
} }
// Get bmad_folder from config (default to 'bmad' for backwards compatibility) // Get bmad_folder from config (default to 'bmad' for backwards compatibility)
@ -905,10 +950,13 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
const moduleTargetPath = path.join(bmadDir, moduleName); const moduleTargetPath = path.join(bmadDir, moduleName);
await fs.ensureDir(moduleTargetPath); await fs.ensureDir(moduleTargetPath);
// Get collected config for this custom module (from module.yaml prompts)
const collectedModuleConfig = moduleConfigs[moduleName] || {};
const result = await customHandler.install( const result = await customHandler.install(
customInfo.path, customInfo.path,
path.join(bmadDir, 'temp-custom'), path.join(bmadDir, 'temp-custom'),
{ ...config.coreConfig, ...customInfo.config, _bmadDir: bmadDir }, { ...config.coreConfig, ...customInfo.config, ...collectedModuleConfig, _bmadDir: bmadDir },
(filePath) => { (filePath) => {
// Track installed files with correct path // Track installed files with correct path
const relativePath = path.relative(path.join(bmadDir, 'temp-custom'), filePath); const relativePath = path.relative(path.join(bmadDir, 'temp-custom'), filePath);
@ -939,8 +987,10 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
await fs.remove(tempCustomPath); await fs.remove(tempCustomPath);
} }
// Create module config // Create module config (include collected config from module.yaml prompts)
await this.generateModuleConfigs(bmadDir, { [moduleName]: { ...config.coreConfig, ...customInfo.config } }); await this.generateModuleConfigs(bmadDir, {
[moduleName]: { ...config.coreConfig, ...customInfo.config, ...collectedModuleConfig },
});
// Store custom module info for later manifest update // Store custom module info for later manifest update
if (!config._customModulesToTrack) { if (!config._customModulesToTrack) {

View File

@ -125,12 +125,15 @@ class WorkflowCommandGenerator {
} }
} }
const coreWorkflowPath = `${this.bmadFolderName}/core/tasks/workflow.xml`;
// Replace template variables // Replace template variables
return template return template
.replaceAll('{{name}}', workflow.name) .replaceAll('{{name}}', workflow.name)
.replaceAll('{{module}}', workflow.module) .replaceAll('{{module}}', workflow.module)
.replaceAll('{{description}}', workflow.description) .replaceAll('{{description}}', workflow.description)
.replaceAll('{{workflow_path}}', workflowPath) .replaceAll('{{workflow_path}}', workflowPath)
.replaceAll('{{core_workflow_path}}', coreWorkflowPath)
.replaceAll('{bmad_folder}', this.bmadFolderName) .replaceAll('{bmad_folder}', this.bmadFolderName)
.replaceAll('{*bmad_folder*}', '{bmad_folder}'); .replaceAll('{*bmad_folder*}', '{bmad_folder}');
} }

View File

@ -5,7 +5,7 @@ description: '{{description}}'
IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded: IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded:
<steps CRITICAL="TRUE"> <steps CRITICAL="TRUE">
1. Always LOAD the FULL @{bmad_folder}/core/tasks/workflow.xml 1. Always LOAD the FULL @{{core_workflow_path}}
2. READ its entire contents - this is the CORE OS for EXECUTING the specific workflow-config @{{workflow_path}} 2. READ its entire contents - this is the CORE OS for EXECUTING the specific workflow-config @{{workflow_path}}
3. Pass the yaml path {{workflow_path}} as 'workflow-config' parameter to the workflow.xml instructions 3. Pass the yaml path {{workflow_path}} as 'workflow-config' parameter to the workflow.xml instructions
4. Follow workflow.xml instructions EXACTLY as written to process and follow the specific workflow config and its instructions 4. Follow workflow.xml instructions EXACTLY as written to process and follow the specific workflow config and its instructions