Compare commits
4 Commits
44d5cf5667
...
61a12f5c8e
| Author | SHA1 | Date |
|---|---|---|
|
|
61a12f5c8e | |
|
|
eb4325fab9 | |
|
|
57ceaf9fa9 | |
|
|
1513b2d478 |
Binary file not shown.
|
|
@ -139,9 +139,6 @@ 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
|
||||
|
|
@ -149,14 +146,6 @@ 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:
|
||||
|
|
@ -181,23 +170,9 @@ Quality assurance guidance:
|
|||
|
||||
<!-- Test Architect documentation to be added -->
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
|
||||
- Test design workflows
|
||||
- Quality gates
|
||||
- Risk assessment
|
||||
- # NFR validation
|
||||
=======
|
||||
> > > > > > > Stashed changes
|
||||
- Test design workflows
|
||||
- Quality gates
|
||||
- Risk assessment
|
||||
- NFR validation
|
||||
> > > > > > > Stashed changes
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Module Structure
|
||||
|
||||
|
|
|
|||
|
|
@ -133,7 +133,6 @@ 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)
|
||||
|
|
@ -142,7 +141,6 @@ 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
|
||||
|
|
@ -190,108 +188,12 @@ See: [workflow-status instructions](../workflows/workflow-status/instructions.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
|
||||
|
||||
- [Phase 1: Analysis Workflows](./workflows-analysis.md)
|
||||
- [Phase 2: Planning Workflows](./workflows-planning.md)
|
||||
- [Phase 3: Solutioning Workflows](./workflows-solutioning.md)
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**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?**
|
||||
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._
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
code: bmm
|
||||
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"
|
||||
subheader: "Agent and Workflow Configuration for this module"
|
||||
|
|
|
|||
|
|
@ -132,8 +132,12 @@ class ConfigCollector {
|
|||
* Collect configuration for all modules
|
||||
* @param {Array} modules - List of modules to configure (including 'core')
|
||||
* @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);
|
||||
|
||||
// Check if core was already collected (e.g., in early collection phase)
|
||||
|
|
@ -451,11 +455,21 @@ class ConfigCollector {
|
|||
this.allAnswers = {};
|
||||
}
|
||||
// Load module's config
|
||||
// First, try the standard src/modules location
|
||||
let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'module.yaml');
|
||||
let moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
|
||||
// First, check if we have a custom module path for this module
|
||||
let installerConfigPath = null;
|
||||
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))) {
|
||||
// Use the module manager to find the module source
|
||||
const { ModuleManager } = require('../modules/manager');
|
||||
|
|
|
|||
|
|
@ -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
|
||||
moduleConfigs = this.configCollector.collectedConfig;
|
||||
} 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)
|
||||
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)
|
||||
|
|
@ -905,10 +950,13 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
|
|||
const moduleTargetPath = path.join(bmadDir, moduleName);
|
||||
await fs.ensureDir(moduleTargetPath);
|
||||
|
||||
// Get collected config for this custom module (from module.yaml prompts)
|
||||
const collectedModuleConfig = moduleConfigs[moduleName] || {};
|
||||
|
||||
const result = await customHandler.install(
|
||||
customInfo.path,
|
||||
path.join(bmadDir, 'temp-custom'),
|
||||
{ ...config.coreConfig, ...customInfo.config, _bmadDir: bmadDir },
|
||||
{ ...config.coreConfig, ...customInfo.config, ...collectedModuleConfig, _bmadDir: bmadDir },
|
||||
(filePath) => {
|
||||
// Track installed files with correct path
|
||||
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);
|
||||
}
|
||||
|
||||
// Create module config
|
||||
await this.generateModuleConfigs(bmadDir, { [moduleName]: { ...config.coreConfig, ...customInfo.config } });
|
||||
// Create module config (include collected config from module.yaml prompts)
|
||||
await this.generateModuleConfigs(bmadDir, {
|
||||
[moduleName]: { ...config.coreConfig, ...customInfo.config, ...collectedModuleConfig },
|
||||
});
|
||||
|
||||
// Store custom module info for later manifest update
|
||||
if (!config._customModulesToTrack) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue