agentvibes 5.4.0 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,13 @@ param(
10
10
  [string]$Text,
11
11
 
12
12
  [Parameter(Mandatory = $false, Position = 1)]
13
- [string]$VoiceOverride
13
+ [string]$VoiceOverride,
14
+
15
+ # LLM identity for per-LLM audio routing (e.g. "claude-code", "copilot", "codex").
16
+ # When provided, the router looks up an `llm:<name>` row in audio-effects.cfg
17
+ # to apply LLM-specific voice, pretext, reverb, and engine settings.
18
+ [Parameter(Mandatory = $false)]
19
+ [string]$llm = ""
14
20
  )
15
21
 
16
22
  # Configuration paths
@@ -97,6 +103,201 @@ if ($BgEnabled -or $HasReverb) {
97
103
  } catch {}
98
104
  }
99
105
 
106
+ # ===========================================================================
107
+ # Per-LLM Audio Routing
108
+ # ===========================================================================
109
+ # When mcp-server/server.py invokes play-tts.ps1 on Windows it passes the
110
+ # -llm flag with the active LLM identity (e.g. "claude-code", "copilot",
111
+ # "codex"). The router reads audio-effects.cfg and looks up the row whose
112
+ # key is `llm:<name>`, allowing each LLM to have its own voice, pretext,
113
+ # reverb, and engine without requiring global settings to be reconfigured.
114
+ #
115
+ # Expected audio-effects.cfg row format (pipe-delimited):
116
+ # llm:<name>|REVERB_PRESET|BACKGROUND_FILE|BACKGROUND_VOLUME|VOICE|PRETEXT|ENGINE
117
+ #
118
+ # Column descriptions:
119
+ # 1. Key - Must start with "llm:" followed by the LLM name
120
+ # 2. REVERB_PRESET - One of: off, light, medium, heavy, cathedral (or blank)
121
+ # 3. BACKGROUND_FILE - Filename relative to .claude/audio/tracks/ (or blank)
122
+ # 4. BACKGROUND_VOLUME - Float 0.0-1.0 (or blank for default 0.25)
123
+ # 5. VOICE - Provider voice name to use (or blank for global default)
124
+ # 6. PRETEXT - Text prepended to all TTS utterances (or blank)
125
+ # 7. ENGINE - Windows engine: windows-sapi, windows-piper, soprano (or blank)
126
+ #
127
+ # Example rows:
128
+ # llm:claude-code|off|||en_US-amy-medium|Agent Vibes Here|windows-piper
129
+ # llm:copilot|light|||en_US-ryan-low||windows-sapi
130
+ # llm:codex|off||||Code complete|windows-piper
131
+ # llm:default|off|||||
132
+ #
133
+ # The "default" key is always looked up when no explicit -llm flag is
134
+ # provided. Configure it via Setup → Default → Configure in the TUI to
135
+ # apply consistent audio settings across all LLM sessions.
136
+ #
137
+ # Security: The -llm value is validated against an allowlist regex so that
138
+ # injected values like "-rf" or path-traversal strings are rejected before
139
+ # they can appear in lookup keys, environment variables, or file paths.
140
+
141
+ # --- Validate -llm parameter format ------------------------------------------
142
+ if ($llm -and $llm -notmatch '^[a-zA-Z0-9][a-zA-Z0-9_-]*$') {
143
+ Write-Host "[WARNING] play-tts.ps1: Invalid -llm value '$llm' ignored" `
144
+ "(must match ^[a-zA-Z0-9][a-zA-Z0-9_-]*`$)" -ForegroundColor Yellow
145
+ $llm = ""
146
+ }
147
+
148
+ # --- Default fallback --------------------------------------------------------
149
+ # An empty $llm routes through the "default" pseudo-LLM. Users who configure
150
+ # an `llm:default` row in audio-effects.cfg get consistent audio settings for
151
+ # every LLM that doesn't pass its own -llm flag — a convenient global override
152
+ # that doesn't require per-LLM configuration.
153
+ if (-not $llm) {
154
+ $llm = "default"
155
+ }
156
+
157
+ # --- Export LLM key for child scripts ----------------------------------------
158
+ # Provider scripts (play-tts-windows-*.ps1) and any other downstream tooling
159
+ # can inspect AGENTVIBES_LLM_KEY to identify which LLM is currently speaking.
160
+ # This mirrors the `export AGENTVIBES_LLM_KEY="llm:${LLM_PROVIDER}"` line in
161
+ # the POSIX play-tts.sh so the cross-platform contract is symmetric.
162
+ $env:AGENTVIBES_LLM_KEY = "llm:$llm"
163
+
164
+ # --- Lookup per-LLM config in audio-effects.cfg ------------------------------
165
+ # Scan project config first, then user-profile config. Stop at first match.
166
+ # Variables are intentionally prefixed with _ to distinguish LLM-local state
167
+ # from the global session state set earlier in this script.
168
+ $_LlmVoice = ""
169
+ $_LlmPretext = ""
170
+ $_LlmReverb = ""
171
+ $_LlmEngine = ""
172
+ $_LlmBgFile = ""
173
+ $_LlmBgVol = ""
174
+ $_LlmKey = "llm:$llm"
175
+
176
+ $_AudioEffectsCfgPaths = @(
177
+ (Join-Path $ClaudeDir "config\audio-effects.cfg"),
178
+ (Join-Path $env:USERPROFILE ".claude\config\audio-effects.cfg")
179
+ )
180
+
181
+ :llmCfgSearch foreach ($_cfgFile in $_AudioEffectsCfgPaths) {
182
+ if ((-not $_LlmVoice) -and (-not $_LlmPretext) -and (Test-Path $_cfgFile)) {
183
+ $cfgContent = Get-Content $_cfgFile -ErrorAction SilentlyContinue
184
+ if ($null -ne $cfgContent) {
185
+ foreach ($_cfgLine in $cfgContent) {
186
+ # Skip blank lines and comment / separator lines
187
+ $stripped = $_cfgLine.Trim()
188
+ if ($stripped.Length -eq 0 -or $stripped.StartsWith('#')) { continue }
189
+
190
+ # Split on pipe; expect at least the key column
191
+ $_cols = $_cfgLine -split '\|'
192
+ if ($_cols.Count -ge 1 -and $_cols[0].Trim() -eq $_LlmKey) {
193
+ # Unpack columns defensively — missing columns stay empty
194
+ if ($_cols.Count -ge 2) { $_LlmReverb = $_cols[1].Trim() }
195
+ if ($_cols.Count -ge 3) { $_LlmBgFile = $_cols[2].Trim() }
196
+ if ($_cols.Count -ge 4) { $_LlmBgVol = $_cols[3].Trim() }
197
+ if ($_cols.Count -ge 5) { $_LlmVoice = $_cols[4].Trim() }
198
+ if ($_cols.Count -ge 6) { $_LlmPretext = $_cols[5].Trim() }
199
+ if ($_cols.Count -ge 7) { $_LlmEngine = $_cols[6].Trim() }
200
+ break llmCfgSearch
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+
207
+ # --- Voice priority order (highest wins) -------------------------------------
208
+ # 1. Explicit -VoiceOverride parameter (caller always wins)
209
+ # 2. LLM-specific voice from audio-effects.cfg llm:<key> row
210
+ # 3. BMAD agent voice from bmad-voice-map.json (resolved in provider scripts)
211
+ # 4. Global active voice from tts-provider.txt / active-voice.txt
212
+
213
+ # Apply LLM-specific voice only when no explicit -VoiceOverride was passed
214
+ if ($_LlmVoice -and -not $VoiceOverride) {
215
+ $VoiceOverride = $_LlmVoice
216
+ }
217
+
218
+ # --- Apply LLM-specific pretext ----------------------------------------------
219
+ # Prepend the configured pretext (e.g. "Agent Vibes Here") to the speech
220
+ # text. Guard against double-prefixing on re-entrant or looped calls by
221
+ # checking whether the text already starts with the pretext string.
222
+ if ($_LlmPretext -and -not $Text.StartsWith($_LlmPretext)) {
223
+ $Text = "$_LlmPretext, $Text"
224
+ }
225
+
226
+ # --- Reverb override from per-LLM config -------------------------------------
227
+ # If the llm:<key> row specifies a reverb preset, override the file-based
228
+ # $ReverbLevel that was set from reverb-level.txt earlier. The allowlist
229
+ # check is repeated here so a malformed config row can't inject arbitrary
230
+ # strings into the ffmpeg filter chain.
231
+ if ($_LlmReverb) {
232
+ $validReverbLevels = @("off", "light", "medium", "heavy", "cathedral")
233
+ if ($validReverbLevels -contains $_LlmReverb) {
234
+ $ReverbLevel = $_LlmReverb
235
+ $HasReverb = $ReverbLevel -ne "off"
236
+ # If the LLM config enables reverb and ffmpeg wasn't found yet, retry
237
+ if ($HasReverb -and -not $HasFfmpeg) {
238
+ try { $null = Get-Command ffmpeg -ErrorAction Stop; $HasFfmpeg = $true } catch {}
239
+ }
240
+ }
241
+ }
242
+
243
+ # --- Apply LLM-specific engine override --------------------------------------
244
+ # Allowed local Windows engines: windows-sapi, windows-piper, soprano.
245
+ # Transport providers (ssh-remote etc.) are not listed because they forward
246
+ # TTS to a remote host — overriding with a local engine would synthesize on
247
+ # the wrong machine.
248
+ if ($_LlmEngine) {
249
+ $allowedLocalEngines = @("windows-sapi", "windows-piper", "soprano")
250
+ if ($allowedLocalEngines -contains $_LlmEngine) {
251
+ switch ($_LlmEngine) {
252
+ "windows-sapi" { $ProviderScript = "$HooksDir\play-tts-windows-sapi.ps1" }
253
+ "windows-piper" { $ProviderScript = "$HooksDir\play-tts-windows-piper.ps1" }
254
+ "soprano" { $ProviderScript = "$HooksDir\play-tts-soprano.ps1" }
255
+ }
256
+ } else {
257
+ Write-Host "[INFO] play-tts.ps1: Unrecognised engine '$_LlmEngine' in audio-effects.cfg — keeping default provider" -ForegroundColor DarkGray
258
+ }
259
+ }
260
+
261
+ # --- BMAD Party Mode note ----------------------------------------------------
262
+ # When BMAD party mode is active, multiple agents speak in rapid succession.
263
+ # Each agent's voice is resolved from bmad-voice-map.json inside the provider
264
+ # scripts — that BMAD-level routing is independent of this per-LLM system.
265
+ # The -llm flag is still used to set AGENTVIBES_LLM_KEY and can supply a
266
+ # background music track and reverb preset that stays consistent throughout
267
+ # the entire party mode session regardless of which agent is speaking.
268
+
269
+ # --- Diagnostic output -------------------------------------------------------
270
+ # Set AGENTVIBES_VERBOSE=1 in the shell environment to print routing state.
271
+ if ($env:AGENTVIBES_VERBOSE -eq "1") {
272
+ Write-Host "[DEBUG] play-tts.ps1 LLM routing: llm=$llm | voice=$VoiceOverride | engine=$_LlmEngine | pretext=$_LlmPretext" -ForegroundColor DarkCyan
273
+ Write-Host "[DEBUG] play-tts.ps1 LLM routing: reverb=$ReverbLevel | HasFfmpeg=$HasFfmpeg | BgEnabled=$BgEnabled | script=$ProviderScript" -ForegroundColor DarkCyan
274
+ }
275
+
276
+ # ===========================================================================
277
+ # End of Per-LLM Audio Routing
278
+ # ===========================================================================
279
+
280
+ # Helper: play a WAV file preferring ffplay over SoundPlayer.
281
+ # SoundPlayer uses WinMM's low-quality resampler (22050 Hz → 48000 Hz is choppy);
282
+ # ffplay uses libswresample with sinc resampling — no artefacts.
283
+ function Invoke-AudioPlay {
284
+ param([string]$FilePath)
285
+ $fp = (Get-Command ffplay -ErrorAction SilentlyContinue)?.Source
286
+ if (-not $fp) {
287
+ # Watcher sessions may inherit a minimal PATH — refresh from registry
288
+ $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" +
289
+ [System.Environment]::GetEnvironmentVariable("Path","User")
290
+ $fp = (Get-Command ffplay -ErrorAction SilentlyContinue)?.Source
291
+ }
292
+ if ($fp) {
293
+ & $fp -autoexit -nodisp -loglevel quiet $FilePath 2>$null
294
+ } else {
295
+ $p = $null
296
+ try { $p = New-Object System.Media.SoundPlayer $FilePath; $p.PlaySync() }
297
+ finally { if ($p) { $p.Dispose() } }
298
+ }
299
+ }
300
+
100
301
  # If background music or reverb enabled and ffmpeg available, tell provider to skip playback
101
302
  if (($BgEnabled -or $HasReverb) -and $HasFfmpeg) {
102
303
  $env:AGENTVIBES_NO_PLAY = "1"
@@ -204,61 +405,27 @@ if (($BgEnabled -or $HasReverb) -and $HasFfmpeg) {
204
405
 
205
406
  if ($proc.ExitCode -eq 0 -and (Test-Path $MixedFile) -and (Get-Item $MixedFile).Length -gt 0) {
206
407
  # Play the mixed audio
207
- $player = $null
208
408
  try {
209
- $player = New-Object System.Media.SoundPlayer $MixedFile
210
- $player.PlaySync()
409
+ Invoke-AudioPlay $MixedFile
211
410
  } catch {
212
411
  Write-Host "[WARNING] Mixed playback failed, playing voice only" -ForegroundColor Yellow
213
- $player2 = $null
214
- try {
215
- $player2 = New-Object System.Media.SoundPlayer $voicePath
216
- $player2.PlaySync()
217
- } finally {
218
- if ($player2) { $player2.Dispose() }
219
- }
220
- } finally {
221
- if ($player) { $player.Dispose() }
412
+ Invoke-AudioPlay $voicePath
222
413
  }
223
414
  } else {
224
415
  # Mixing failed, play voice only
225
- $player = $null
226
- try {
227
- $player = New-Object System.Media.SoundPlayer $voicePath
228
- $player.PlaySync()
229
- } finally {
230
- if ($player) { $player.Dispose() }
231
- }
416
+ Invoke-AudioPlay $voicePath
232
417
  }
233
418
  } catch {
234
419
  # ffmpeg failed, play voice only
235
- $player = $null
236
- try {
237
- $player = New-Object System.Media.SoundPlayer $voicePath
238
- $player.PlaySync()
239
- } finally {
240
- if ($player) { $player.Dispose() }
241
- }
420
+ Invoke-AudioPlay $voicePath
242
421
  }
243
422
  } else {
244
423
  # No background track found, play voice only
245
- $player = $null
246
- try {
247
- $player = New-Object System.Media.SoundPlayer $voicePath
248
- $player.PlaySync()
249
- } finally {
250
- if ($player) { $player.Dispose() }
251
- }
424
+ Invoke-AudioPlay $voicePath
252
425
  }
253
426
  } else {
254
427
  # No background music, play the (possibly reverbed) voice
255
- $player = $null
256
- try {
257
- $player = New-Object System.Media.SoundPlayer $voicePath
258
- $player.PlaySync()
259
- } finally {
260
- if ($player) { $player.Dispose() }
261
- }
428
+ Invoke-AudioPlay $voicePath
262
429
  }
263
430
  }
264
431
  } else {
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![Publish](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml/badge.svg)](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
12
12
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
13
13
 
14
- **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.4.0
14
+ **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.6
15
15
 
16
16
  ---
17
17
 
@@ -40,38 +40,34 @@ Whether you're coding in Claude Code, chatting in Claude Desktop, using Warp Ter
40
40
 
41
41
  ---
42
42
 
43
- ## 🌟 NEW FEATURE HIGHLIGHTS
43
+ ## 🌟 NEW IN v5.5 — Per-LLM Audio Routing
44
44
 
45
- ### 🎤 Agent Vibes v1.0 Voice Browser
45
+ Give **each LLM its own voice, pretext, and music** — Claude Code, Copilot, and Codex can all sound different without touching global settings.
46
46
 
47
- ![Voice Browser Banner](docs/installation-screenshots/voice-browser-screenshot.png)
47
+ - Add `llm:<name>|...|voice|pretext|engine` rows to `audio-effects.cfg`
48
+ - MCP server auto-detects which LLM is calling and passes `--llm <key>`
49
+ - Configure via **Setup tab → Configure** in the TUI
48
50
 
49
- **🎤 Browse, Sample & Install 914 Voices in Real-Time**
51
+ Also fixed: Windows installer crash (`spinner.info is not a function`) on **reinstall** with an older global AgentVibes install.
50
52
 
51
- ```bash
52
- npx agentvibes-voice-browser
53
- ```
53
+ ---
54
54
 
55
- The new **AgentVibes Voice Browser** is an interactive console application that lets you:
55
+ ## v5.4 TUI Installer, Spinner Fix & Dependency Cleanup
56
56
 
57
- - 🎧 **Hear Before You Choose** - Real-time audio sampling with one keypress
58
- - ⭐ **Mark Your Favorites** - Build your personal voice collection
59
- - 🔍 **Smart Search** - Filter by name, personality, accent, or gender
60
- - 📦 **One-Click Install** - Press 'I' to instantly switch to any voice
61
- - 🎨 **Beautiful Interface** - Stunning terminal UI powered by blessed.js
57
+ ### 🎤 Voice Browser Browse, Sample & Install 914 Voices
58
+
59
+ **Built right into the TUI accessible via Setup Configure → Voice**
60
+
61
+ - 🎧 **Hear Before You Choose** - Press Space to preview any voice instantly
62
+ - ⭐ **Mark Your Favorites** - Thumbs up/down with `+` / `-`
63
+ - 🔍 **Alpha Jump** - Press any letter to jump to names starting with it
64
+ - 📦 **One-Click Select** - Press Enter to set as your voice
65
+ - 🎨 **Beautiful Interface** - Stunning terminal UI built into AgentVibes
62
66
 
63
67
  **914 Total Voices:**
64
68
  - 904 High-Quality Piper TTS Speakers (libritts-high model)
65
69
  - 10 Hand-Curated Personality Voices
66
70
 
67
- **Perfect for:**
68
- - Finding your ideal AI voice
69
- - Exploring voice characteristics
70
- - Quick voice switching
71
- - Building favorite collections
72
-
73
- Launch now: `npx agentvibes-voice-browser`
74
-
75
71
  ---
76
72
 
77
73
  ### 💬 Intro Text (Pretext) - Your Personal AI Branding
@@ -122,9 +118,11 @@ Configure now: `npx agentvibes config intro-text`
122
118
  **Upload your own background music with battle-tested security!**
123
119
 
124
120
  ```bash
125
- npx agentvibes config music
121
+ npx agentvibes # press M for Music tab
126
122
  ```
127
123
 
124
+ ![AgentVibes Music Tab](https://raw.githubusercontent.com/paulpreibisch/AgentVibes/master/docs/installation-screenshots/screenshot-music.png)
125
+
128
126
  Replace the default background tracks with your own audio files for complete sonic branding.
129
127
 
130
128
  **Supported Formats:**
@@ -242,10 +240,10 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
242
240
  - [📋 Prerequisites](#-prerequisites) - What you actually need (Node.js + optional tools)
243
241
  - [✨ What is AgentVibes?](#-what-is-agentvibes) - Overview & key features
244
242
  - [🌟 NEW FEATURE HIGHLIGHTS](#-new-feature-highlights) - **START HERE!**
245
- - [🎤 Voice Browser v1.0](#-agent-vibes-v10-voice-browser) - Browse & sample 914 voices
243
+ - [🎤 Voices Tab](#-voices-tab) - Browse & sample 914 voices in the TUI
246
244
  - [💬 Intro Text](#-intro-text-pretext---your-personal-ai-branding) - Custom TTS prefixes
247
245
  - [🎵 Custom Background Music](#-custom-background-music---complete-audio-control) - Upload your own tracks
248
- - [📰 Latest Release](#-latest-release) - v3.6.0 "Voice Explorer" with Voice Browser, Friendly Names, Custom Music
246
+ - [📰 Latest Release](#-latest-release) - v5.5.0 with Per-LLM Audio Routing, Windows Installer Resilience
249
247
  - [🪟 Windows Setup Guide for Claude Desktop](mcp-server/WINDOWS_SETUP.md) - Complete Windows installation with WSL & Python
250
248
 
251
249
  ### AgentVibes MCP (Natural Language Control)
@@ -255,7 +253,7 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
255
253
  - [For Claude Code](docs/mcp-setup.md#for-claude-code) - Project-specific setup
256
254
 
257
255
  ### Core Features
258
- - [🎤 AgentVibes Voice Browser](#-agentvibes-voice-browser) - **Browse and sample 914 voices interactively**
256
+ - [🎤 Voices Tab](#-voices-tab) - **Browse and sample 914 voices in the TUI**
259
257
  - [🎤 Commands Reference](#-commands-reference) - All available commands
260
258
  - [🎙️ Verbosity Control](#%EF%B8%8F-verbosity-control) - Control how much Claude speaks (low/medium/high)
261
259
  - [🎭 Personalities vs Sentiments](#-personalities-vs-sentiments) - Two systems explained
@@ -293,22 +291,17 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
293
291
 
294
292
  **[v3.6.0 - "Voice Explorer" Release](https://github.com/paulpreibisch/AgentVibes/releases/tag/v3.6.0)** 🎉
295
293
 
296
- ### 🎤 AgentVibes Voice Browser
297
-
298
- **Browse and sample 914 voices in real-time!**
294
+ ### 🎤 Voices Tab — Browse & Sample 914 Voices
299
295
 
300
- ![AgentVibes Voice Browser](docs/installation-screenshots/voice-browser-screenshot.png)
296
+ **Built into the TUI — launch with `npx agentvibes` then press V**
301
297
 
302
- ```bash
303
- npx agentvibes-voice-browser
304
- ```
298
+ ![AgentVibes Voices Tab](https://raw.githubusercontent.com/paulpreibisch/AgentVibes/master/docs/installation-screenshots/screenshot-voices.png)
305
299
 
306
- Interactive console browser with:
307
- - 🎧 Real-time voice sampling - hear before you choose
300
+ - 🎧 Real-time voice sampling - press Space to hear before you choose
308
301
  - ⭐ Favorite system - mark your top voices
309
302
  - 🔍 Search & filter - find voices by personality, accent, gender
310
- - 📦 One-click install - install directly from browser
311
- - 🎨 Beautiful UI - stunning console interface
303
+ - 📦 One-click select - press Enter to install directly
304
+ - 🎨 Beautiful UI - built into the AgentVibes TUI
312
305
 
313
306
  **914 Total Voices:**
314
307
  - 904 Piper speaker variations (libritts-high)
@@ -371,8 +364,8 @@ npx agentvibes config music
371
364
  # Install AgentVibes
372
365
  npx agentvibes install
373
366
 
374
- # Launch Voice Browser
375
- npx agentvibes-voice-browser
367
+ # Browse voices in the TUI
368
+ npx agentvibes # press V for Voices tab
376
369
  ```
377
370
 
378
371
  **🐞 Bug Fixes in v3.6.0:**
@@ -424,6 +417,12 @@ Just say "Switch to Aria voice" or "Speak in Spanish" instead of typing commands
424
417
  npx agentvibes install
425
418
  ```
426
419
 
420
+ ![AgentVibes Setup Tab — LLM Providers](https://raw.githubusercontent.com/paulpreibisch/AgentVibes/master/docs/installation-screenshots/screenshot-setup.png)
421
+
422
+ Click **Configure** on any LLM to set its voice, pretext, reverb, and music:
423
+
424
+ ![AgentVibes Configure Claude Code Audio](https://raw.githubusercontent.com/paulpreibisch/AgentVibes/master/docs/installation-screenshots/screenshot-configure.png)
425
+
427
426
  ### 2️⃣ Choose Provider (Auto-Detected)
428
427
  - **macOS**: Native `say` provider (100+ voices) ✨
429
428
  - **Linux/WSL**: Piper TTS (50+ free voices) 🎙️
@@ -449,42 +448,37 @@ macOS ships with bash 3.2 (from 2007). After this, everything works perfectly!
449
448
 
450
449
  ---
451
450
 
452
- ## 🎤 AgentVibes Voice Browser
453
-
454
- **The easiest way to find your perfect voice!**
451
+ ## 🎤 Voice Browser
455
452
 
456
- ![AgentVibes Voice Browser](docs/installation-screenshots/voice-browser-screenshot.png)
457
- *Browse, sample, and install from 914 voices with real-time audio preview*
458
-
459
- ### Launch the Browser
453
+ **914 voices — browse, preview, and select right inside the TUI.**
460
454
 
461
455
  ```bash
462
- npx agentvibes-voice-browser
456
+ npx agentvibes # Setup tab → Configure → Voice (or press V for global voice)
463
457
  ```
464
458
 
459
+ ![AgentVibes Voice Browser](https://raw.githubusercontent.com/paulpreibisch/AgentVibes/master/docs/installation-screenshots/screenshot-voice-browser.png)
460
+
465
461
  ### Features
466
462
 
467
463
  - **914 Voices** - Browse 904 Piper speakers + 10 curated voices
468
- - **Real-Time Sampling** - Press ENTER to hear any voice instantly
469
- - **Favorite System** - Mark favorites for quick access
470
- - **Smart Search** - Filter by name, personality, accent, or gender
471
- - **One-Click Install** - Press 'I' to install and switch to a voice
472
- - **Beautiful UI** - Stunning console interface with blessed.js
464
+ - **Real-Time Sampling** - Press Space to hear any voice instantly
465
+ - **Favorite System** - Thumbs up `+` / thumbs down `-` for quick filtering
466
+ - **Alpha Jump** - Press any letter key to jump to that part of the list
467
+ - **One-Click Select** - Press Enter to install and switch to a voice
468
+ - **Beautiful UI** - Stunning console interface built into AgentVibes
473
469
 
474
470
  ### Keyboard Shortcuts
475
471
 
476
472
  | Key | Action |
477
473
  |-----|--------|
478
- | **ENTER** | Play voice sample |
479
- | **I** | Install/Select voice for AgentVibes |
480
- | **F** | Toggle favorite |
481
- | **/** | Search voices |
482
- | **ESC** | Clear search / Back |
474
+ | **Space** | Preview voice sample |
475
+ | **Enter** | Select/Install voice |
476
+ | **+** | Thumbs up (favorite) |
477
+ | **-** | Thumbs down |
478
+ | **PgUp / PgDn** | Page through list |
483
479
  | **↑/↓** | Navigate list |
484
- | **G** | Jump to top |
485
- | **Shift+G** | Jump to bottom |
486
- | **H** | Show help |
487
- | **Q** | Quit |
480
+ | **a-z** | Jump to names starting with letter |
481
+ | **Esc** | Cancel / close |
488
482
 
489
483
  ### Voice Categories
490
484
 
@@ -500,13 +494,13 @@ npx agentvibes-voice-browser
500
494
 
501
495
  ### Finding Your Perfect Voice
502
496
 
503
- 1. **Launch browser:** `npx agentvibes-voice-browser`
504
- 2. **Search by trait:** Press `/` and type "friendly" or "professional"
505
- 3. **Sample voices:** Navigate with arrows, press ENTER to hear
506
- 4. **Mark favorites:** Press 'F' on voices you like
507
- 5. **Install:** Press 'I' to set as your AgentVibes voice
497
+ 1. **Open voice browser:** Setup tab → Configure → navigate to Voice → Enter
498
+ 2. **Jump alphabetically:** Press a letter key to jump to that name
499
+ 3. **Sample voices:** Navigate with arrows, press Space to hear
500
+ 4. **Mark favorites:** Press `+` on voices you like
501
+ 5. **Select:** Press Enter to set as your voice
508
502
 
509
- **Pro Tip:** Use the search to find voices matching your project's mood!
503
+ **Pro Tip:** Use PgUp/PgDn to page quickly through 900+ voices!
510
504
 
511
505
  [↑ Back to top](#-table-of-contents)
512
506
 
@@ -855,18 +849,13 @@ AgentVibes provides **50+ slash commands** and **natural language MCP equivalent
855
849
 
856
850
  **[→ View Complete Command Reference](docs/commands.md)** - All voice, system, personality, sentiment, language, and BMAD commands with MCP equivalents
857
851
 
858
- ### Voice Browser Commands
852
+ ### Voices Tab Commands
859
853
 
860
854
  ```bash
861
- # Launch voice browser
862
- npx agentvibes-voice-browser
863
-
864
- # Or use global command (if installed globally)
865
- agentvibes-voice-browser
855
+ # Launch the TUI and open Voices tab
856
+ npx agentvibes # then press V
866
857
  ```
867
858
 
868
- **MCP Equivalent:** Currently CLI-only (no MCP command)
869
-
870
859
  ### Intro Text Commands
871
860
 
872
861
  ```bash
@@ -1005,7 +994,7 @@ Every task acknowledgment plays **twice** - first in English, then in your targe
1005
994
 
1006
995
  ## 🗣️ Voice Library
1007
996
 
1008
- **NEW in v3.6.0:** Use the **[AgentVibes Voice Browser](#-agentvibes-voice-browser)** to browse, sample, and install from 914 voices! Launch with `npx agentvibes-voice-browser`.
997
+ **Browse voices in the TUI:** Run `npx agentvibes` and press **V** to open the **[Voices Tab](#-voices-tab)** browse, sample, and install from 914 voices without leaving your terminal.
1009
998
 
1010
999
  ### Friendly Voice Names
1011
1000
 
@@ -1047,13 +1036,11 @@ The BMAD plugin detects when you activate a BMAD agent (e.g., `/BMad:agents:pm`)
1047
1036
 
1048
1037
  **Version Support**: AgentVibes supports both BMAD v4 and v6-alpha installations. Version detection is automatic - just install BMAD and AgentVibes will detect and configure itself correctly!
1049
1038
 
1050
- ### 🎭 Party ModeScreenshots
1051
-
1052
- Open the **BMad** tab in the AgentVibes TUI (`npx agentvibes`) to configure which voice each agent uses:
1039
+ ### 🎭 BMad TabAssign a Voice to Every Agent
1053
1040
 
1054
- ![BMAD Party Mode Tab](docs/installation-screenshots/screenshot-bmad-party-mode.png)
1041
+ Open the **BMad** tab in the AgentVibes TUI (`npx agentvibes` → press **B**) to configure which voice, reverb, and pretext each BMAD agent uses:
1055
1042
 
1056
- > 📸 **Don't have a screenshot yet?** Run `npx agentvibes`, switch to the **BMad** tab, and take a screenshot — then save it as `docs/installation-screenshots/screenshot-bmad-party-mode.png`.
1043
+ ![AgentVibes BMad Tab](https://raw.githubusercontent.com/paulpreibisch/AgentVibes/master/docs/installation-screenshots/screenshot-bmad.png)
1057
1044
 
1058
1045
  ### 🔊 TTS Injection: How It Works
1059
1046
 
@@ -1877,10 +1864,10 @@ Both do the exact same thing - MCP is more convenient, slash commands are more t
1877
1864
  - **Optional**: sox (audio effects), ffmpeg (background music, padding)
1878
1865
  - All TTS generation works without optional dependencies - they just enhance the experience
1879
1866
 
1880
- ### Voice Browser & New Features
1867
+ ### Voices Tab & New Features
1881
1868
 
1882
- **Q: How do I use the Voice Browser?**
1883
- **A:** Simply run `npx agentvibes-voice-browser` and you'll see an interactive console with 914 voices. Use arrow keys to navigate, ENTER to sample voices, 'I' to install, 'F' to favorite, and '/' to search.
1869
+ **Q: How do I browse and select voices?**
1870
+ **A:** Run `npx agentvibes` and press **V** to open the Voices tab. Use arrow keys to navigate, Space to preview voices, Enter to select/install, F to favorite, and / to search.
1884
1871
 
1885
1872
  **Q: What are friendly voice names?**
1886
1873
  **A:** Instead of technical IDs like `en_US-ryan-high`, you can now use simple names like "Ryan" when switching voices. All 904+ voices have friendly names matched to their characteristics.
@@ -1898,7 +1885,7 @@ Both do the exact same thing - MCP is more convenient, slash commands are more t
1898
1885
  **A:** No! You can type "ryan", "Ryan", or "RYAN" - they all work. The voice resolution is case-insensitive.
1899
1886
 
1900
1887
  **Q: Can I favorite voices without installing them?**
1901
- **A:** Yes! In the Voice Browser, press 'F' to mark any voice as a favorite. Favorites are saved and you can filter to show only favorites later.
1888
+ **A:** Yes! In the Voices tab, press 'F' to mark any voice as a favorite. Favorites are saved and you can filter to show only favorites later.
1902
1889
 
1903
1890
  **Q: Does custom music work with all TTS providers?**
1904
1891
  **A:** Yes! Custom background music works with Piper TTS, Soprano, macOS Say, and Windows SAPI.
package/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,68 @@
1
1
  # AgentVibes Release Notes
2
2
 
3
+ ## 📸 v5.6.0 — TUI Screenshots & Documentation Cleanup
4
+
5
+ **Released:** 2026-04-28
6
+
7
+ ### 📸 TUI Screenshots Added
8
+
9
+ Added real screenshots of every major TUI tab to the README:
10
+
11
+ - **Setup tab** — LLM Providers screen (Claude Code, Copilot, Codex, Default)
12
+ - **Configure dialog** — Per-LLM audio config (voice, pretext, reverb, music)
13
+ - **Voice Browser** — Select Voice dialog with alpha-jump, thumbs up/down, 914 voices
14
+ - **Music tab** — Built-in tracks list with preview and toggle
15
+ - **BMad tab** — Agent voice assignment (voice, reverb, music, pretext per agent)
16
+
17
+ ### 🧹 Documentation Cleanup
18
+
19
+ - Removed all `npx agentvibes-voice-browser` references (tool retired, replaced by TUI)
20
+ - Renamed "Voice Browser" section to reflect TUI-native access via Setup → Configure → Voice
21
+ - All image paths now use absolute GitHub raw URLs (renders correctly on npmjs.com)
22
+ - Fixed BMad section placeholder screenshot replaced with real screenshot
23
+
24
+ ---
25
+
26
+ ## 🎵 v5.5.0 — Per-LLM Audio Routing & Windows Installer Resilience
27
+
28
+ **Released:** 2026-04-27
29
+
30
+ ### 🆕 Per-LLM Audio Routing
31
+ Each LLM (Claude Code, Copilot, Codex) can now have its own voice, pretext, reverb, and
32
+ background-music settings. The MCP server passes `--llm <key>` to both `play-tts.sh`
33
+ (Linux/macOS) and `play-tts.ps1` (Windows), and the scripts look up `llm:<key>` rows in
34
+ `audio-effects.cfg`. Default rows for `claude-code`, `copilot`, and `codex` ship out of the
35
+ box; configure them via **Setup → Default → Configure** in the TUI.
36
+
37
+ ### 🐛 Windows Installer Crash Fix
38
+ Fixed `spinner.info is not a function` error that crashed AgentVibes **reinstalls** on Windows
39
+ when users had an older global install. All 10 file-copy functions in the installer now wrap
40
+ their spinner with `createRobustSpinner()` so stale callers can never cause a crash regardless
41
+ of which methods they expose.
42
+
43
+ ### 🎶 Windows Background Music Parity
44
+ Windows TTS playback now prefers `ffplay` (sinc resampling, no artefacts) over the low-quality
45
+ WinMM `SoundPlayer` resampler. The new `Invoke-AudioPlay` helper handles the fallback
46
+ transparently — if `ffplay` is unavailable, `SoundPlayer` is used as before.
47
+
48
+ ### 🎉 Party Mode Cross-Platform Entry Point
49
+ BMAD party mode step files and the Copilot skill now consistently reference
50
+ `node bin/bmad-speak.js` — the single cross-platform entry point that delegates to
51
+ `bmad-speak.ps1` on Windows and `bmad-speak.sh` elsewhere.
52
+
53
+ ### 🔧 Other Fixes
54
+ - `play-tts.sh` now accepts a named `--llm <key>` flag in addition to the `LLM_PROVIDER` env var
55
+ - `mcp-server/server.py` routes `AGENTVIBES_LLM` → `CLAUDECODE=1` → `AGENTVIBES_MCP_FALLBACK`
56
+ priority chain and forwards the resolved key as `-llm`/`--llm` to TTS scripts
57
+ - Added `audio-effects.cfg` rows for `llm:claude-code`, `llm:copilot`, `llm:codex`
58
+ - Added `command-routing.test.js` and `ConfigService` unit tests
59
+ - npm pack content guard now catches untracked publishable files
60
+
61
+ ### 📊 Technical
62
+ - 231 tests passing (0 failures)
63
+
64
+ ---
65
+
3
66
  ## 🎛️ v5.4.0 — TUI Installer, Spinner Fix & Dependency Cleanup
4
67
 
5
68
  **Released:** 2026-04-22