Compare commits

..

No commits in common. "aa4c7e444652ae77f8a4836bde810f1dea431d87" and "1a52a1997883dd06d495c77f33a503296eab003d" have entirely different histories.

7 changed files with 14 additions and 75 deletions

View File

@ -234,7 +234,7 @@ your-project/
2. Run `*workflow-init` to set up your project workflow path 2. Run `*workflow-init` to set up your project workflow path
3. Follow the [Quick Start](#-quick-start) guide above to choose your planning track 3. Follow the [Quick Start](#-quick-start) guide above to choose your planning track
**Alternative:** [**Web Bundles**](https://bmad-code-org.github.io/bmad-bundles/) - Download pre-built agent bundles for use in Claude Projects, ChatGPT, or Gemini without installation (automatically updated on every commit to main) **Alternative:** [**Web Bundles**](./docs/USING_WEB_BUNDLES.md) - Use BMAD agents in Claude Projects, ChatGPT, or Gemini without installation
--- ---

View File

@ -36,11 +36,11 @@ Web bundles are standalone XML files containing:
**Option A: Download Pre-Bundled Files (Quickest)** **Option A: Download Pre-Bundled Files (Quickest)**
Download ready-to-use bundles that are automatically updated whenever commits are merged to main: Download ready-to-use bundles directly from GitHub:
**[→ Download Web Bundles](https://bmad-code-org.github.io/bmad-bundles/)** **[→ Browse Web Bundles on GitHub](https://github.com/bmad-code-org/BMAD-METHOD/tree/main/web-bundles)**
Navigate to the module folder (bmm, bmb, cis, bmgd) → agents folder → download the `.xml` file you need. These bundles are automatically regenerated and deployed with every commit to the main branch, ensuring you always have the latest version. Navigate to the module folder (bmm, bmb, cis, bmgd) → agents folder → download the `.xml` file you need.
**Option B: Generate from Local Installation** **Option B: Generate from Local Installation**

View File

@ -105,9 +105,9 @@
<item cmd="*help">Show numbered command list</item> <item cmd="*help">Show numbered command list</item>
<item cmd="*list-agents">List all available agents with their capabilities</item> <item cmd="*list-agents">List all available agents with their capabilities</item>
<item cmd="*agents [agent-name]">Transform into a specific agent</item> <item cmd="*agents [agent-name]">Transform into a specific agent</item>
<item cmd="*party-mode" workflow="{bmad_folder}/core/workflows/party-mode/workflow.yaml">Enter group chat with all agents <item cmd="*party-mode" workflow="bmad/bmm/workflows/1-analysis/product-brief/workflow.yaml">Enter group chat with all agents
simultaneously</item> simultaneously</item>
<item cmd="*advanced-elicitation" task="{bmad_folder}/core/tasks/advanced-elicitation.xml">Push agent to perform advanced elicitation</item> <item cmd="*advanced-elicitation" task="bmad/core/tasks/advanced-elicitation.xml">Push agent to perform advanced elicitation</item>
<item cmd="*exit">Exit current session</item> <item cmd="*exit">Exit current session</item>
</menu> </menu>
</agent> </agent>

View File

@ -36,7 +36,7 @@
<step n="3" title="Execute Sharding"> <step n="3" title="Execute Sharding">
<action>Inform user that sharding is beginning</action> <action>Inform user that sharding is beginning</action>
<action>Execute command: `npx @kayvan/markdown-tree-parser explode [source-document] [destination-folder]`</action> <action>Execute command: `npx @kayvan/markdown-tree-parser [source-document] [destination-folder]`</action>
<action>Capture command output and any errors</action> <action>Capture command output and any errors</action>
<action if="command fails">HALT and display error to user</action> <action if="command fails">HALT and display error to user</action>
</step> </step>

View File

@ -21,9 +21,7 @@ web_bundle:
name: "party-mode" name: "party-mode"
description: "Orchestrates group discussions between all installed BMAD agents, enabling natural multi-agent conversations" description: "Orchestrates group discussions between all installed BMAD agents, enabling natural multi-agent conversations"
author: "BMad" author: "BMad"
instructions: "{bmad_folder}/core/workflows/party-mode/instructions.md" instructions: "bmad/core/workflows/party-mode/instructions.md"
agent_manifest: "{bmad_folder}/_cfg/agent-manifest.csv" agent_manifest: "bmad/_cfg/agent-manifest.csv"
web_bundle_files: web_bundle_files:
- "{bmad_folder}/core/workflows/party-mode/workflow.xml" - "{bmad_folder}/core/workflows/party-mode/workflow.xml"
- "{bmad_folder}/core/workflows/party-mode/instructions.md"
- "{bmad_folder}/_cfg/agent-manifest.csv"

View File

@ -48,36 +48,6 @@ class ConfigCollector {
return path.join(projectDir, 'bmad'); return path.join(projectDir, 'bmad');
} }
/**
* Detect the existing BMAD folder name in a project
* @param {string} projectDir - Project directory
* @returns {Promise<string|null>} Folder name (just the name, not full path) or null if not found
*/
async detectExistingBmadFolder(projectDir) {
// Check if project directory exists
if (!(await fs.pathExists(projectDir))) {
return null;
}
// Look for ANY directory with _cfg/manifest.yaml
try {
const entries = await fs.readdir(projectDir, { withFileTypes: true });
for (const entry of entries) {
if (entry.isDirectory()) {
const manifestPath = path.join(projectDir, entry.name, '_cfg', 'manifest.yaml');
if (await fs.pathExists(manifestPath)) {
// Found a V6+ installation, return just the folder name
return entry.name;
}
}
}
} catch {
// Ignore errors
}
return null;
}
/** /**
* Load existing config if it exists from module config files * Load existing config if it exists from module config files
* @param {string} projectDir - Target project directory * @param {string} projectDir - Target project directory
@ -595,15 +565,6 @@ class ConfigCollector {
} }
} }
// Special handling for bmad_folder: detect existing folder name
if (moduleName === 'core' && key === 'bmad_folder' && !existingValue && this.currentProjectDir) {
// Try to detect the existing BMAD folder name
const detectedFolder = await this.detectExistingBmadFolder(this.currentProjectDir);
if (detectedFolder) {
existingValue = detectedFolder;
}
}
// Determine question type and default value // Determine question type and default value
let questionType = 'input'; let questionType = 'input';
let defaultValue = item.default; let defaultValue = item.default;

View File

@ -562,12 +562,7 @@ class Installer {
config.skipIde = toolSelection.skipIde; config.skipIde = toolSelection.skipIde;
const ideConfigurations = toolSelection.configurations; const ideConfigurations = toolSelection.configurations;
// Check if spinner is already running (e.g., from folder name change scenario)
if (spinner.isSpinning) {
spinner.text = 'Continuing installation...';
} else {
spinner.start('Continuing installation...'); spinner.start('Continuing installation...');
}
// Create bmad directory structure // Create bmad directory structure
spinner.text = 'Creating directory structure...'; spinner.text = 'Creating directory structure...';
@ -1758,19 +1753,8 @@ class Installer {
lastModified: new Date().toISOString(), lastModified: new Date().toISOString(),
}; };
// Check if bmad_folder has changed // Now run the full installation with the collected configs
const existingBmadFolderName = path.basename(bmadDir);
const newBmadFolderName = this.configCollector.collectedConfig.core?.bmad_folder || existingBmadFolderName;
if (existingBmadFolderName === newBmadFolderName) {
// Normal quick update - start the spinner
spinner.start('Updating BMAD installation...'); spinner.start('Updating BMAD installation...');
} else {
// Folder name has changed - stop spinner and let install() handle it
spinner.stop();
console.log(chalk.yellow(`\n⚠️ Folder name will change: ${existingBmadFolderName}${newBmadFolderName}`));
console.log(chalk.yellow('The installer will handle the folder migration.\n'));
}
// Build the config object for the installer // Build the config object for the installer
const installConfig = { const installConfig = {
@ -1789,11 +1773,7 @@ class Installer {
// Call the standard install method // Call the standard install method
const result = await this.install(installConfig); const result = await this.install(installConfig);
// Only succeed the spinner if it's still spinning
// (install method might have stopped it if folder name changed)
if (spinner.isSpinning) {
spinner.succeed('Quick update complete!'); spinner.succeed('Quick update complete!');
}
return { return {
success: true, success: true,