Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,7 @@ z*/
.kiro/
.roo

bmad-custom-src/
# Generated voice map (user-specific)
.bmad/_cfg/agent-voice-map.csv

bmad-custom-src/
6 changes: 6 additions & 0 deletions src/core/agents/bmad-master.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ agent:
- "Remember the users name is {user_name}"
- "ALWAYS communicate in {communication_language}"

tts:
intro: "Greetings! The BMad Master is here to orchestrate and guide you through any workflow."
voices:
- piper: en_US-lessac-medium
- mac: Samantha

# Agent menu items
menu:
- trigger: "list-tasks"
Expand Down
8 changes: 5 additions & 3 deletions src/core/workflows/party-mode/steps/step-01-agent-loading.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,14 @@ Welcome {{user_name}}! I'm excited to facilitate an incredible multi-agent discu

[Display 3-4 diverse agents to showcase variety]:

- [Icon Emoji] **[Agent Name]** ([Title]): [Brief role description]
- [Icon Emoji] **[Agent Name]** ([Title]): [Brief role description]
- [Icon Emoji] **[Agent Name]** ([Title]): [Brief role description]
- [icon] **[displayName]** ([title]): [role]
- [icon] **[displayName]** ([title]): [role]
- [icon] **[displayName]** ([title]): [role]

**[Total Count] agents** are ready to contribute their expertise!

**CRITICAL:** Use the `displayName` field from the manifest CSV (e.g., "Mary", "Winston", "Amelia"), NOT the `name` field (e.g., "analyst", "architect", "dev").

**What would you like to discuss with the team today?**"

### 5. Present Continue Option
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,11 @@ Generate authentic responses for each selected agent:
**Response Structure:**
[For each selected agent]:

"[Icon Emoji] **[Agent Name]**: [Authentic in-character response]
"[icon] **[displayName]**: [Authentic in-character response]

[Bash: .claude/hooks/bmad-speak.sh \"[Agent Name]\" \"[Their response]\"]"
[Bash: .claude/hooks/bmad-speak.sh \"[displayName]\" \"[Their response]\"]"

**CRITICAL:** Use the `displayName` field from the manifest (e.g., "Mary", "Winston", "Amelia"), NOT the `name` field.

### 4. Natural Cross-Talk Integration

Expand Down
21 changes: 20 additions & 1 deletion src/core/workflows/party-mode/workflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ Load config from `{project-root}/{bmad_folder}/bmm/config.yaml` and resolve:

- `installed_path` = `{project-root}/{bmad_folder}/core/workflows/party-mode`
- `agent_manifest_path` = `{project-root}/{bmad_folder}/_cfg/agent-manifest.csv`
- `agent_voice_map_path` = `{project-root}/{bmad_folder}/_cfg/agent-voice-map.csv`
- `standalone_mode` = `true` (party mode is an interactive workflow)

---
Expand All @@ -63,6 +64,16 @@ Parse CSV manifest to extract agent entries with complete information:

Build complete agent roster with merged personalities for conversation orchestration.

### Voice Map Loading

If `agent_voice_map_path` exists, load agent voice configuration:

- **agent** (agent identifier matching manifest name)
- **voice** (TTS voice name for the agent)
- **intro** (introduction message the agent uses when joining party mode)

Merge voice map data with agent roster for TTS integration and personalized introductions.

---

## EXECUTION
Expand All @@ -81,7 +92,15 @@ Welcome {{user_name}}! All BMAD agents are here and ready for a dynamic group di

**Let me introduce our collaborating agents:**

[Load agent roster and display 2-3 most diverse agents as examples]
[Load agent roster and display all agents with their icons and titles]

**Agent Introductions (if voice map with intros is available):**

For each agent in the roster, if they have an intro message from the voice map:

- Have the agent speak their intro message in-character
- Use TTS to voice the introduction with their assigned voice
- Format: `Bash: .claude/hooks/bmad-speak.sh "[Agent Name]" "[Their intro message]"`

**What would you like to discuss with the team today?**"

Expand Down
6 changes: 6 additions & 0 deletions src/modules/bmm/agents/analyst.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ agent:
- Articulate requirements with absolute precision. Ensure all stakeholder voices heard.
- Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`

tts:
intro: "Hi there! I'm Mary, your Business Analyst. I'll help uncover the real requirements."
voices:
- piper: en_US-kristin-medium
- mac: Allison

menu:
- trigger: workflow-status
workflow: "{project-root}/{bmad_folder}/bmm/workflows/workflow-status/workflow.yaml"
Expand Down
6 changes: 6 additions & 0 deletions src/modules/bmm/agents/architect.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ agent:
- Design simple solutions that scale when needed. Developer productivity is architecture. Connect every decision to business value and user impact.
- Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`

tts:
intro: "Hello! Winston here, your Architect. I'll ensure we build something scalable and pragmatic."
voices:
- piper: en_GB-alan-medium
- mac: Daniel

menu:
- trigger: workflow-status
workflow: "{project-root}/{bmad_folder}/bmm/workflows/workflow-status/workflow.yaml"
Expand Down
6 changes: 6 additions & 0 deletions src/modules/bmm/agents/dev.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ agent:
- "Update File List with ALL changed files after each task completion"
- "NEVER lie about tests being written or passing - tests must actually exist and pass 100%"

tts:
intro: "Hey! Amelia here, your Developer. Ready to turn specs into working code."
voices:
- piper: en_US-amy-medium
- mac: Samantha

menu:
- trigger: develop-story
workflow: "{project-root}/{bmad_folder}/bmm/workflows/4-implementation/dev-story/workflow.yaml"
Expand Down
6 changes: 6 additions & 0 deletions src/modules/bmm/agents/pm.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ agent:
- Align efforts with measurable business impact. Back all claims with data and user insights.
- Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`

tts:
intro: "Hey team! John here, your Product Manager. Let's make sure we're building the right thing."
voices:
- piper: en_US-ryan-high
- mac: Alex

menu:
- trigger: workflow-status
workflow: "{project-root}/{bmad_folder}/bmm/workflows/workflow-status/workflow.yaml"
Expand Down
6 changes: 6 additions & 0 deletions src/modules/bmm/agents/sm.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ agent:
- "When running *create-story, always run as *yolo. Use architecture, PRD, Tech Spec, and epics to generate a complete draft without elicitation."
- "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`"

tts:
intro: "Hi everyone! Bob here, your Scrum Master. I'll keep us focused and moving forward."
voices:
- piper: en_US-joe-medium
- mac: Fred

menu:
- trigger: sprint-planning
workflow: "{project-root}/{bmad_folder}/bmm/workflows/4-implementation/sprint-planning/workflow.yaml"
Expand Down
6 changes: 6 additions & 0 deletions src/modules/bmm/agents/tea.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ agent:
- "Cross-check recommendations with the current official Playwright, Cypress, Pact, and CI platform documentation"
- "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`"

tts:
intro: "Hello! Murat here, your Test Architect. Quality is my obsession."
voices:
- piper: en_US-kusal-medium
- mac: Tom

menu:
- trigger: framework
workflow: "{project-root}/{bmad_folder}/bmm/workflows/testarch/framework/workflow.yaml"
Expand Down
6 changes: 6 additions & 0 deletions src/modules/bmm/agents/tech-writer.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ agent:
- "CRITICAL: Load COMPLETE file {project-root}/{bmad_folder}/bmm/data/documentation-standards.md into permanent memory and follow ALL rules within"
- "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`"

tts:
intro: "Hi! I'm Paige, your Technical Writer. I'll make sure everything is documented clearly."
voices:
- piper: jenny
- mac: Karen

menu:
- trigger: document-project
workflow: "{project-root}/{bmad_folder}/bmm/workflows/document-project/workflow.yaml"
Expand Down
6 changes: 6 additions & 0 deletions src/modules/bmm/agents/ux-designer.agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ agent:
critical_actions:
- "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`"

tts:
intro: "Hey! Sally here, your UX Designer. The user experience is my top priority."
voices:
- piper: kristin
- mac: Victoria

menu:
- trigger: create-ux-design
exec: "{project-root}/{bmad_folder}/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md"
Expand Down
18 changes: 17 additions & 1 deletion tools/cli/commands/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,27 @@ module.exports = {

// Run AgentVibes installer
const { execSync } = require('node:child_process');
const fs = require('node:fs');
const path = require('node:path');

try {
execSync('npx agentvibes@latest install', {
// Clear ALL npm config env vars to prevent inheritance issues
// when BMAD is invoked with --prefix flag
// npm sets many npm_config_* and npm_package_* vars that can interfere
const cleanEnv = Object.fromEntries(
Object.entries(process.env).filter(([key]) => !key.startsWith('npm_config_') && !key.startsWith('npm_package_')),
);

// Check if this is first-time AgentVibes installation
const agentvibesDir = path.join(result.projectDir, '.agentvibes');
const isFirstTime = !fs.existsSync(agentvibesDir);
const installCmd = isFirstTime ? 'npx agentvibes@latest install --with-audio' : 'npx agentvibes@latest install';

execSync(installCmd, {
cwd: result.projectDir,
stdio: 'inherit',
shell: true,
env: cleanEnv,
});
console.log(chalk.green('\n✓ AgentVibes installation complete'));
} catch {
Expand Down
36 changes: 35 additions & 1 deletion tools/cli/installers/lib/core/installer.js
Original file line number Diff line number Diff line change
Expand Up @@ -873,6 +873,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
const manifestStats = await manifestGen.generateManifests(bmadDir, config.modules || [], this.installedFiles, {
ides: config.ides || [],
preservedModules: config._preserveModules || [], // Scan these from installed bmad/ dir
agentVibes: { enabled: this.enableAgentVibes || false }, // Track AgentVibes TTS configuration
});

spinner.succeed(
Expand Down Expand Up @@ -1106,7 +1107,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
path: bmadDir,
modules: config.modules,
ides: config.ides,
needsAgentVibes: this.enableAgentVibes && !config.agentVibesInstalled,
needsAgentVibes: this.enableAgentVibes, // Always run installer if enabled - handles updates too
projectDir: projectDir,
};
} catch (error) {
Expand Down Expand Up @@ -2087,6 +2088,38 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
}
}

// Check for AgentVibes TTS - prompt if not previously configured
// Read existing manifest to check if AgentVibes was previously set
const manifestPath = path.join(bmadDir, '_cfg', 'manifest.yaml');
let agentVibesEnabled = false;
let agentVibesPreviouslyConfigured = false;

try {
const manifestContent = await fs.readFile(manifestPath, 'utf8');
const yaml = require('js-yaml');
const manifest = yaml.load(manifestContent);
// Check if AgentVibes was previously configured (exists in manifest)
if (manifest.agentVibes !== undefined) {
agentVibesPreviouslyConfigured = true;
agentVibesEnabled = manifest.agentVibes?.enabled || false;
}
} catch {
// Manifest doesn't exist or can't be read - treat as not configured
}

// If AgentVibes wasn't previously configured, prompt the user
// Use configuredIdes from line 1904 for smart default (Y if Claude Code is selected)
if (!agentVibesPreviouslyConfigured) {
const { UI } = require('../../../lib/ui');
const ui = new UI();
const agentVibesConfig = await ui.promptAgentVibes(projectDir, configuredIdes);

if (agentVibesConfig.enableTts) {
agentVibesEnabled = true;
promptedForNewFields = true;
}
}

if (!promptedForNewFields) {
console.log(chalk.green('✓ All configuration is up to date, no new options to configure'));
}
Expand Down Expand Up @@ -2124,6 +2157,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice:
_quickUpdate: true, // Flag to skip certain prompts
_preserveModules: skippedModules, // Preserve these in manifest even though we didn't update them
_savedIdeConfigs: savedIdeConfigs, // Pass saved IDE configs to installer
enableAgentVibes: agentVibesEnabled, // AgentVibes TTS configuration
};

// Call the standard install method
Expand Down
Loading