feat: v6.0.0-alpha.0 - the future is now
This commit is contained in:
1
src/modules/bmm/_module-installer/assets/bmm-kb.md
Normal file
1
src/modules/bmm/_module-installer/assets/bmm-kb.md
Normal file
@@ -0,0 +1 @@
|
||||
# BMad Method Master Knowledge Base Index
|
||||
@@ -0,0 +1,30 @@
|
||||
# Technical Decisions Log
|
||||
|
||||
_Auto-updated during discovery and planning sessions - you can also add information here yourself_
|
||||
|
||||
## Purpose
|
||||
|
||||
This document captures technical decisions, preferences, and constraints discovered during project discussions. It serves as input for architecture.md and solution design documents.
|
||||
|
||||
## Confirmed Decisions
|
||||
|
||||
<!-- Technical choices explicitly confirmed by the team/user -->
|
||||
|
||||
## Preferences
|
||||
|
||||
<!-- Non-binding preferences mentioned during discussions -->
|
||||
|
||||
## Constraints
|
||||
|
||||
<!-- Hard requirements from infrastructure, compliance, or integration needs -->
|
||||
|
||||
## To Investigate
|
||||
|
||||
<!-- Technical questions that need research or architect input -->
|
||||
|
||||
## Notes
|
||||
|
||||
- This file is automatically updated when technical information is mentioned
|
||||
- Decisions here are inputs, not final architecture
|
||||
- Final technical decisions belong in architecture.md
|
||||
- Implementation details belong in solutions/\*.md and story context or dev notes.
|
||||
49
src/modules/bmm/_module-installer/install-menu-config.yaml
Normal file
49
src/modules/bmm/_module-installer/install-menu-config.yaml
Normal file
@@ -0,0 +1,49 @@
|
||||
# BMAD™ Method Core Configuration
|
||||
|
||||
code: bmm
|
||||
name: "BMM: BMad Method Agile-AI Driven-Development"
|
||||
default_selected: true # This module will be selected by default for new installations
|
||||
|
||||
prompt:
|
||||
- "Thank you for choosing the BMAD™ Method, your gateway to dreaming, planning"
|
||||
- "and building with real world proven techniques."
|
||||
- "All paths are relative to project root, with no leading slash."
|
||||
|
||||
# Variables from Core Config inserted:
|
||||
## user_name
|
||||
## communication_language
|
||||
## output_folder
|
||||
|
||||
project_name:
|
||||
prompt: "What is the title of your project you will be working on?"
|
||||
default: "My Project"
|
||||
result: "{value}"
|
||||
|
||||
tech_docs:
|
||||
prompt: "Where is Technical Documentation located within the project?"
|
||||
default: "docs"
|
||||
result: "{project-root}/{value}"
|
||||
|
||||
dev_story_location:
|
||||
prompt: "Where should development stories be stored?"
|
||||
default: "docs/stories"
|
||||
result: "{project-root}/{value}"
|
||||
|
||||
kb_location:
|
||||
prompt: "Where should bmad knowledge base articles be stored?"
|
||||
default: "~/bmad/bmm/kb.md"
|
||||
result: "{value}"
|
||||
|
||||
desired_mcp_tools:
|
||||
prompt:
|
||||
- "Which MCP Tools will you be using? (Select all that apply)"
|
||||
- "Note: You will need to install these separately. Bindings will come post ALPHA along with other choices."
|
||||
result: "{value}"
|
||||
multi-select:
|
||||
- "Chrome Official MCP"
|
||||
- "Playwright"
|
||||
- "Context 7"
|
||||
- "Tavily"
|
||||
- "Perplexity"
|
||||
- "Jira"
|
||||
- "Trello"
|
||||
131
src/modules/bmm/_module-installer/installer.js
Normal file
131
src/modules/bmm/_module-installer/installer.js
Normal file
@@ -0,0 +1,131 @@
|
||||
const fs = require('fs-extra');
|
||||
const path = require('node:path');
|
||||
const chalk = require('chalk');
|
||||
const platformCodes = require(path.join(__dirname, '../../../../tools/cli/lib/platform-codes'));
|
||||
|
||||
/**
|
||||
* BMM Module Installer
|
||||
* Standard module installer function that executes after IDE installations
|
||||
*
|
||||
* @param {Object} options - Installation options
|
||||
* @param {string} options.projectRoot - The root directory of the target project
|
||||
* @param {Object} options.config - Module configuration from install-menu-config.yaml
|
||||
* @param {Array<string>} options.installedIDEs - Array of IDE codes that were installed
|
||||
* @param {Object} options.logger - Logger instance for output
|
||||
* @returns {Promise<boolean>} - Success status
|
||||
*/
|
||||
async function install(options) {
|
||||
const { projectRoot, config, installedIDEs, logger } = options;
|
||||
|
||||
try {
|
||||
logger.log(chalk.blue('🚀 Installing BMM Module...'));
|
||||
|
||||
// Check and create tech_docs directory if configured
|
||||
if (config['tech_docs']) {
|
||||
// Strip {project-root}/ prefix if present
|
||||
const techDocsConfig = config['tech_docs'].replace('{project-root}/', '');
|
||||
const techDocsPath = path.join(projectRoot, techDocsConfig);
|
||||
|
||||
if (await fs.pathExists(techDocsPath)) {
|
||||
// Check if template exists, add if missing
|
||||
const templateDest = path.join(techDocsPath, 'technical-decisions-template.md');
|
||||
if (!(await fs.pathExists(templateDest))) {
|
||||
const templateSource = path.join(__dirname, 'assets', 'technical-decisions-template.md');
|
||||
if (await fs.pathExists(templateSource)) {
|
||||
await fs.copy(templateSource, templateDest);
|
||||
logger.log(chalk.green('✓ Added technical decisions template to existing directory'));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
logger.log(chalk.yellow(`Creating technical documentation directory: ${techDocsConfig}`));
|
||||
await fs.ensureDir(techDocsPath);
|
||||
|
||||
// Copy technical decisions template
|
||||
const templateSource = path.join(__dirname, 'assets', 'technical-decisions-template.md');
|
||||
const templateDest = path.join(techDocsPath, 'technical-decisions-template.md');
|
||||
|
||||
if (await fs.pathExists(templateSource)) {
|
||||
await fs.copy(templateSource, templateDest, { overwrite: false });
|
||||
logger.log(chalk.green('✓ Added technical decisions template'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create output directory if configured
|
||||
if (config['output_folder']) {
|
||||
// Strip {project-root}/ prefix if present
|
||||
const outputConfig = config['output_folder'].replace('{project-root}/', '');
|
||||
const outputPath = path.join(projectRoot, outputConfig);
|
||||
if (!(await fs.pathExists(outputPath))) {
|
||||
logger.log(chalk.yellow(`Creating output directory: ${outputConfig}`));
|
||||
await fs.ensureDir(outputPath);
|
||||
}
|
||||
}
|
||||
|
||||
// Create dev story location if configured
|
||||
if (config['dev_story_location']) {
|
||||
// Strip {project-root}/ prefix if present
|
||||
const storyConfig = config['dev_story_location'].replace('{project-root}/', '');
|
||||
const storyPath = path.join(projectRoot, storyConfig);
|
||||
if (!(await fs.pathExists(storyPath))) {
|
||||
logger.log(chalk.yellow(`Creating story directory: ${storyConfig}`));
|
||||
await fs.ensureDir(storyPath);
|
||||
}
|
||||
}
|
||||
|
||||
// Handle IDE-specific configurations if needed
|
||||
if (installedIDEs && installedIDEs.length > 0) {
|
||||
logger.log(chalk.cyan(`Configuring BMM for IDEs: ${installedIDEs.join(', ')}`));
|
||||
|
||||
// Add any IDE-specific BMM configurations here
|
||||
for (const ide of installedIDEs) {
|
||||
await configureForIDE(ide, projectRoot, config, logger);
|
||||
}
|
||||
}
|
||||
|
||||
logger.log(chalk.green('✓ BMM Module installation complete'));
|
||||
return true;
|
||||
} catch (error) {
|
||||
logger.error(chalk.red(`Error installing BMM module: ${error.message}`));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure BMM module for specific platform/IDE
|
||||
* @private
|
||||
*/
|
||||
async function configureForIDE(ide, projectRoot, config, logger) {
|
||||
// Validate platform code
|
||||
if (!platformCodes.isValidPlatform(ide)) {
|
||||
logger.warn(chalk.yellow(` Warning: Unknown platform code '${ide}'. Skipping BMM configuration.`));
|
||||
return;
|
||||
}
|
||||
|
||||
const platformName = platformCodes.getDisplayName(ide);
|
||||
|
||||
// Try to load platform-specific handler
|
||||
const platformSpecificPath = path.join(__dirname, 'platform-specifics', `${ide}.js`);
|
||||
|
||||
try {
|
||||
if (await fs.pathExists(platformSpecificPath)) {
|
||||
const platformHandler = require(platformSpecificPath);
|
||||
|
||||
if (typeof platformHandler.install === 'function') {
|
||||
await platformHandler.install({
|
||||
projectRoot,
|
||||
config,
|
||||
logger,
|
||||
platformInfo: platformCodes.getPlatform(ide), // Pass platform metadata
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// No platform-specific handler for this IDE
|
||||
logger.log(chalk.dim(` No BMM-specific configuration for ${platformName}`));
|
||||
}
|
||||
} catch (error) {
|
||||
logger.warn(chalk.yellow(` Warning: Could not load BMM platform-specific handler for ${platformName}: ${error.message}`));
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { install };
|
||||
@@ -0,0 +1,35 @@
|
||||
const chalk = require('chalk');
|
||||
|
||||
/**
|
||||
* BMM Platform-specific installer for Claude Code
|
||||
*
|
||||
* @param {Object} options - Installation options
|
||||
* @param {string} options.projectRoot - The root directory of the target project
|
||||
* @param {Object} options.config - Module configuration from install-menu-config.yaml
|
||||
* @param {Object} options.logger - Logger instance for output
|
||||
* @param {Object} options.platformInfo - Platform metadata from global config
|
||||
* @returns {Promise<boolean>} - Success status
|
||||
*/
|
||||
async function install(options) {
|
||||
const { logger, platformInfo } = options;
|
||||
// projectRoot and config available for future use
|
||||
|
||||
try {
|
||||
const platformName = platformInfo ? platformInfo.name : 'Claude Code';
|
||||
logger.log(chalk.cyan(` BMM-${platformName} Specifics installed`));
|
||||
|
||||
// Add Claude Code specific BMM configurations here
|
||||
// For example:
|
||||
// - Custom command configurations
|
||||
// - Agent party configurations
|
||||
// - Workflow integrations
|
||||
// - Template mappings
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
logger.error(chalk.red(`Error installing BMM Claude Code specifics: ${error.message}`));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { install };
|
||||
@@ -0,0 +1,32 @@
|
||||
const chalk = require('chalk');
|
||||
|
||||
/**
|
||||
* BMM Platform-specific installer for Windsurf
|
||||
*
|
||||
* @param {Object} options - Installation options
|
||||
* @param {string} options.projectRoot - The root directory of the target project
|
||||
* @param {Object} options.config - Module configuration from install-menu-config.yaml
|
||||
* @param {Object} options.logger - Logger instance for output
|
||||
* @returns {Promise<boolean>} - Success status
|
||||
*/
|
||||
async function install(options) {
|
||||
const { logger } = options;
|
||||
// projectRoot and config available for future use
|
||||
|
||||
try {
|
||||
logger.log(chalk.cyan(' BMM-Windsurf Specifics installed'));
|
||||
|
||||
// Add Windsurf specific BMM configurations here
|
||||
// For example:
|
||||
// - Custom cascades
|
||||
// - Workflow adaptations
|
||||
// - Template configurations
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
logger.error(chalk.red(`Error installing BMM Windsurf specifics: ${error.message}`));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { install };
|
||||
Reference in New Issue
Block a user