feat: AgentVibes TTS integration — install prompt + core skill#2181
feat: AgentVibes TTS integration — install prompt + core skill#2181paulpreibisch wants to merge 3 commits intobmad-code-org:mainfrom
Conversation
Adds a new core skill that guides users through installing AgentVibes TTS so BMAD party mode agents speak with unique voices. - New skill: src/core-skills/bmad-install-agentvibes/SKILL.md Documents npx agentvibes install, post-install voice config via /agent-vibes:bmad, and troubleshooting steps - module-help.csv: registers skill with menu code AV under Core module AgentVibes is cross-platform (Windows/Mac/Linux/WSL) and integrates with bmad-party-mode so each agent speaks with their own distinct voice. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- renderInstallSummary now shows AgentVibes mention in Next Steps - After summary, prompts user: install AgentVibes now? (default: no) If yes, runs `npx agentvibes install` inline - Non-fatal: cancelled prompt or install failure doesn't break bmad install Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace yes/no confirm with: install now / skip / tell me more. 'Tell me more' shows description + GitHub link inline without leaving the installer flow. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
🤖 Augment PR SummarySummary: Adds an optional AgentVibes TTS integration surfaced at the end of the BMAD install flow to help users voice-enable their agents (especially party mode). Changes:
🤖 Was this summary useful? React with 👍 or 👎 |
| await prompts.note(lines.join('\n'), 'BMAD is ready to use!'); | ||
|
|
||
| // Optional AgentVibes install prompt | ||
| if (!this._silentConfig) { |
There was a problem hiding this comment.
this._silentConfig doesn’t appear to be initialized anywhere in Installer, so this condition will always pass and the AgentVibes prompt will still show in non-interactive/--yes flows. That can unexpectedly block headless installs waiting for user input.
Severity: medium
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.
| if (agentVibesChoice === 'install') { | ||
| const { execSync } = require('node:child_process'); | ||
| await prompts.log.step('Running npx agentvibes install...'); | ||
| execSync('npx agentvibes install', { stdio: 'inherit' }); |
There was a problem hiding this comment.
execSync('npx agentvibes install', ...) runs in the current process working directory, not necessarily the configured install --directory target. If the user runs bmad install --directory ... from elsewhere, AgentVibes may install/configure hooks in the wrong project context.
Severity: medium
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.
| ' Install: npx agentvibes install' | ||
| ); | ||
| } | ||
| } catch { |
There was a problem hiding this comment.
The empty catch {} makes an opted-in AgentVibes install failure silent, which can leave the user thinking TTS was installed successfully when it wasn’t. Consider at least emitting a warning/info message on failure while keeping the install non-fatal.
Severity: medium
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.
| ## Verify Installation | ||
|
|
||
| ```bash | ||
| agentvibes whoami |
There was a problem hiding this comment.
This skill mixes npx agentvibes ... with bare agentvibes ... commands; if the user followed the npx agentvibes install path (no global install), agentvibes may not be on PATH, so the verify/troubleshooting commands could fail. It may help to keep the invocation consistent (or explicitly require global install for the non-npx commands).
Severity: low
Other Locations
src/core-skills/bmad-install-agentvibes/SKILL.md:58src/core-skills/bmad-install-agentvibes/SKILL.md:60src/core-skills/bmad-install-agentvibes/SKILL.md:65
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.
📝 WalkthroughWalkthroughThis PR adds AgentVibes TTS integration to BMAD by introducing skill documentation for the installation process and modifying the installer to prompt users about AgentVibes installation following successful BMAD setup, with options to install, skip, or view details. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
tools/installer/core/installer.js (1)
1-1:⚠️ Potential issue | 🟡 MinorFix Prettier formatting issues.
The pipeline reports code style issues. Run
prettier --write tools/installer/core/installer.jsto resolve.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tools/installer/core/installer.js` at line 1, Prettier flagged formatting in the require line; run the formatter and commit the change: run `prettier --write` on the file containing the `const path = require('node:path');` line (or apply your editor's Prettier fix), ensure the `const path = require('node:path');` statement matches the project's Prettier style, then stage and commit the formatted file.
🧹 Nitpick comments (3)
tools/installer/core/installer.js (3)
1159-1163: Consider adding a timeout to theexecSynccall.If
npx agentvibes installhangs (network issues, user prompt inside AgentVibes, etc.), the BMAD installer will block indefinitely. Consider adding a reasonable timeout.⏱️ Proposed fix to add timeout
if (agentVibesChoice === 'install') { const { execSync } = require('node:child_process'); await prompts.log.step('Running npx agentvibes install...'); - execSync('npx agentvibes install', { stdio: 'inherit' }); + execSync('npx agentvibes install', { stdio: 'inherit', timeout: 300000 }); // 5 min timeout🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tools/installer/core/installer.js` around lines 1159 - 1163, The execSync call running 'npx agentvibes install' can hang; update the block handling agentVibesChoice (the branch that checks agentVibesChoice === 'install') to pass a timeout option to execSync (e.g., { stdio: 'inherit', timeout: 5*60*1000 }) and wrap the execSync invocation in a try/catch to handle timeout errors and log a helpful message (or abort gracefully) so the installer won't block indefinitely.
1172-1174: Silent catch may hide useful diagnostic information.The catch block intentionally swallows errors to keep the flow non-fatal, which aligns with PR objectives. However, logging at debug/verbose level could help diagnose AgentVibes installation failures without breaking the flow.
🔍 Proposed enhancement for debugging
} catch { - // Prompt cancelled or AgentVibes install failed — non-fatal + // Prompt cancelled or AgentVibes install failed — non-fatal + // Consider: if (process.env.BMAD_VERBOSE_INSTALL) await prompts.log.warn('AgentVibes prompt skipped or install failed'); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tools/installer/core/installer.js` around lines 1172 - 1174, The empty catch swallowing AgentVibes install errors should be changed to capture the exception and log it at debug/verbose level without altering the non-fatal behavior: change the catch to catch (err) and call the project's debug logger (e.g., logger.debug or processLogger.debug) with a clear message like "AgentVibes install cancelled/failed" plus the err object; ensure the flow still returns/continues as before so behavior remains non-fatal.
1163-1171: "Tell me more" doesn't offer a follow-up action.After displaying the info, the flow exits without re-prompting. Users who selected "Tell me more" must manually run
npx agentvibes installafterwards. Consider looping back to the prompt or explicitly noting this in the output.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@tools/installer/core/installer.js` around lines 1163 - 1171, The "Tell me more" branch (when agentVibesChoice === 'info') currently only calls prompts.log.info and then exits, so users are left without a follow-up action; update this branch so after prompts.log.info(...) you either loop back to the agentVibes selection prompt (re-evaluating agentVibesChoice) or present a clear next-step prompt offering to run the installer (e.g., ask "Run npx agentvibes install now?") and act on the response; modify the code around agentVibesChoice and the prompts.log.info call to implement the re-prompt or the explicit follow-up install prompt.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/core-skills/bmad-install-agentvibes/SKILL.md`:
- Around line 64-65: Replace the bare URL on the "GitHub:
https://github.com/paulpreibisch/AgentVibes" line with a Markdown link to
satisfy MD034; e.g., change that line in SKILL.md to "GitHub:
[paulpreibisch/AgentVibes](https://github.com/paulpreibisch/AgentVibes)" (leave
the "Docs: `agentvibes --help`" line unchanged).
In `@tools/installer/core/installer.js`:
- Around line 1135-1175: The Installer class uses this._silentConfig in
renderInstallSummary but _silentConfig is never initialized on Installer (only
set on OfficialModules), so the AgentVibes prompt always shows; fix by adding a
boolean silentConfig property to Installer (initialize it in the Installer
constructor from the installer config or context passed into
renderInstallSummary) and use that property instead of an undefined field, or
update renderInstallSummary signature to accept a context/use OfficialModules
flag (e.g., pass a silent flag into renderInstallSummary and check that instead
of this._silentConfig); update references to this._silentConfig in
renderInstallSummary to the newly initialized property or the passed-in
parameter so the prompt is suppressed in silent/non-interactive runs.
---
Outside diff comments:
In `@tools/installer/core/installer.js`:
- Line 1: Prettier flagged formatting in the require line; run the formatter and
commit the change: run `prettier --write` on the file containing the `const path
= require('node:path');` line (or apply your editor's Prettier fix), ensure the
`const path = require('node:path');` statement matches the project's Prettier
style, then stage and commit the formatted file.
---
Nitpick comments:
In `@tools/installer/core/installer.js`:
- Around line 1159-1163: The execSync call running 'npx agentvibes install' can
hang; update the block handling agentVibesChoice (the branch that checks
agentVibesChoice === 'install') to pass a timeout option to execSync (e.g., {
stdio: 'inherit', timeout: 5*60*1000 }) and wrap the execSync invocation in a
try/catch to handle timeout errors and log a helpful message (or abort
gracefully) so the installer won't block indefinitely.
- Around line 1172-1174: The empty catch swallowing AgentVibes install errors
should be changed to capture the exception and log it at debug/verbose level
without altering the non-fatal behavior: change the catch to catch (err) and
call the project's debug logger (e.g., logger.debug or processLogger.debug) with
a clear message like "AgentVibes install cancelled/failed" plus the err object;
ensure the flow still returns/continues as before so behavior remains non-fatal.
- Around line 1163-1171: The "Tell me more" branch (when agentVibesChoice ===
'info') currently only calls prompts.log.info and then exits, so users are left
without a follow-up action; update this branch so after prompts.log.info(...)
you either loop back to the agentVibes selection prompt (re-evaluating
agentVibesChoice) or present a clear next-step prompt offering to run the
installer (e.g., ask "Run npx agentvibes install now?") and act on the response;
modify the code around agentVibesChoice and the prompts.log.info call to
implement the re-prompt or the explicit follow-up install prompt.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 9d7de8ce-b481-410a-b2c2-cbd2f9b278c0
⛔ Files ignored due to path filters (1)
src/core-skills/module-help.csvis excluded by!**/*.csv
📒 Files selected for processing (2)
src/core-skills/bmad-install-agentvibes/SKILL.mdtools/installer/core/installer.js
| - GitHub: https://github.com/paulpreibisch/AgentVibes | ||
| - Docs: `agentvibes --help` |
There was a problem hiding this comment.
Fix bare URL to resolve linting failure.
The pipeline fails with MD034 (no-bare-urls). Convert the bare URL to a proper Markdown link.
🔧 Proposed fix
-- GitHub: https://github.com/paulpreibisch/AgentVibes
+- GitHub: <https://github.com/paulpreibisch/AgentVibes>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - GitHub: https://github.com/paulpreibisch/AgentVibes | |
| - Docs: `agentvibes --help` | |
| - GitHub: <https://github.com/paulpreibisch/AgentVibes> | |
| - Docs: `agentvibes --help` |
🧰 Tools
🪛 GitHub Actions: Quality & Validation
[error] 64-64: markdownlint-cli2 reported MD034/no-bare-urls: Bare URL used [Context: "https://github.com/paulpreibis..."]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/core-skills/bmad-install-agentvibes/SKILL.md` around lines 64 - 65,
Replace the bare URL on the "GitHub:
https://github.com/paulpreibisch/AgentVibes" line with a Markdown link to
satisfy MD034; e.g., change that line in SKILL.md to "GitHub:
[paulpreibisch/AgentVibes](https://github.com/paulpreibisch/AgentVibes)" (leave
the "Docs: `agentvibes --help`" line unchanged).
| if (!this._silentConfig) { | ||
| try { | ||
| const agentVibesChoice = await prompts.select({ | ||
| message: '🎙 Give your BMAD agents a voice? (AgentVibes TTS)', | ||
| choices: [ | ||
| { | ||
| name: 'Yes — install AgentVibes now', | ||
| value: 'install', | ||
| hint: 'runs npx agentvibes install', | ||
| }, | ||
| { | ||
| name: 'No — I\'ll do it later', | ||
| value: 'skip', | ||
| hint: 'npx agentvibes install', | ||
| }, | ||
| { | ||
| name: 'Tell me more', | ||
| value: 'info', | ||
| hint: 'github.com/paulpreibisch/AgentVibes', | ||
| }, | ||
| ], | ||
| default: 'skip', | ||
| }); | ||
|
|
||
| if (agentVibesChoice === 'install') { | ||
| const { execSync } = require('node:child_process'); | ||
| await prompts.log.step('Running npx agentvibes install...'); | ||
| execSync('npx agentvibes install', { stdio: 'inherit' }); | ||
| } else if (agentVibesChoice === 'info') { | ||
| await prompts.log.info( | ||
| 'AgentVibes gives each BMAD agent a unique TTS voice, personality, and audio effects.\n' + | ||
| ' Works on Windows (SAPI + Piper), macOS, Linux, and WSL.\n' + | ||
| ' Party mode agents speak with their own voice — no more silent roundtables.\n\n' + | ||
| ' GitHub: https://github.com/paulpreibisch/AgentVibes\n' + | ||
| ' Install: npx agentvibes install' | ||
| ); | ||
| } | ||
| } catch { | ||
| // Prompt cancelled or AgentVibes install failed — non-fatal | ||
| } | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check if _silentConfig is ever set on Installer instances
rg -n '_silentConfig' tools/installer/Repository: bmad-code-org/BMAD-METHOD
Length of output: 626
🏁 Script executed:
#!/bin/bash
# Check the Installer class definition and constructor
head -100 tools/installer/core/installer.js | cat -n
# Look for class definition and constructor
rg -n 'class Installer|constructor\s*\(' tools/installer/core/installer.js | head -20Repository: bmad-code-org/BMAD-METHOD
Length of output: 5054
🏁 Script executed:
#!/bin/bash
# Check if Installer extends OfficialModules or has any relationship
rg -n 'extends|OfficialModules' tools/installer/core/installer.js | head -20Repository: bmad-code-org/BMAD-METHOD
Length of output: 728
🏁 Script executed:
#!/bin/bash
# Check where renderInstallSummary is called from
rg -n 'renderInstallSummary' tools/installer/Repository: bmad-code-org/BMAD-METHOD
Length of output: 247
🏁 Script executed:
#!/bin/bash
# Check if _silentConfig is initialized anywhere in Installer constructor
sed -n '1,150p' tools/installer/core/installer.js | rg -n 'this\._'Repository: bmad-code-org/BMAD-METHOD
Length of output: 724
🏁 Script executed:
#!/bin/bash
# Check renderInstallSummary method signature
sed -n '1060,1080p' tools/installer/core/installer.js | cat -nRepository: bmad-code-org/BMAD-METHOD
Length of output: 888
🏁 Script executed:
#!/bin/bash
# Check if context parameter contains _silentConfig or if it should
sed -n '1060,1085p' tools/installer/core/installer.jsRepository: bmad-code-org/BMAD-METHOD
Length of output: 835
_silentConfig is never initialized on Installer — AgentVibes prompt will always display.
The guard !this._silentConfig checks a property that does not exist on the Installer class. Since _silentConfig is only set in OfficialModules (a separate, independent instance) and never initialized in Installer's constructor, this._silentConfig will always be undefined, making the condition always true. The AgentVibes prompt will display in all installation scenarios, even if silent/non-interactive operation is expected.
Wire up _silentConfig to the installer's configuration state (or pass it via the context parameter to renderInstallSummary), or clarify if the prompt is intentionally always-on.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@tools/installer/core/installer.js` around lines 1135 - 1175, The Installer
class uses this._silentConfig in renderInstallSummary but _silentConfig is never
initialized on Installer (only set on OfficialModules), so the AgentVibes prompt
always shows; fix by adding a boolean silentConfig property to Installer
(initialize it in the Installer constructor from the installer config or context
passed into renderInstallSummary) and use that property instead of an undefined
field, or update renderInstallSummary signature to accept a context/use
OfficialModules flag (e.g., pass a silent flag into renderInstallSummary and
check that instead of this._silentConfig); update references to
this._silentConfig in renderInstallSummary to the newly initialized property or
the passed-in parameter so the prompt is suppressed in silent/non-interactive
runs.
Summary
Adds optional AgentVibes TTS integration to the BMAD install flow, giving users an easy path to voice-enable their agents (especially party mode).
Changes
src/core-skills/bmad-install-agentvibes/(new skill)npx agentvibes installpost-BMAD-setupmodule-help.csvwith menu codeAVtools/installer/core/installer.jsnpx agentvibes installinlineWhy
Party mode agents are currently silent unless users independently discover and install AgentVibes. This surfaces the integration at exactly the right moment — right after BMAD is set up.
Testing
```bash
npm link # from BMAD-METHOD root
mkdir ~/test-project && cd ~/test-project
bmad install
AgentVibes prompt appears after install summary
```
🤖 Generated with Claude Code