agentvibes 4.6.7 → 5.0.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.
Files changed (35) hide show
  1. package/.agentvibes/bmad-voice-map.json +104 -0
  2. package/.agentvibes/config.json +13 -12
  3. package/.agentvibes/copilot-sessions.log +4 -0
  4. package/.claude/audio/tracks/README.md +51 -52
  5. package/.claude/config/audio-effects-bmad.cfg +50 -0
  6. package/.claude/config/audio-effects.cfg +4 -4
  7. package/.claude/config/background-music-enabled.txt +1 -0
  8. package/.claude/config/personality.txt +1 -0
  9. package/.claude/hooks/play-tts-piper.sh +3 -1
  10. package/.claude/hooks/play-tts.sh +373 -301
  11. package/.claude/hooks/session-start-tts.sh +81 -81
  12. package/.claude/hooks-windows/audio-processor.ps1 +181 -0
  13. package/.claude/hooks-windows/play-tts-piper.ps1 +259 -245
  14. package/.claude/hooks-windows/play-tts.ps1 +101 -9
  15. package/.claude/hooks-windows/session-start-tts.ps1 +114 -114
  16. package/README.md +107 -7
  17. package/RELEASE_NOTES.md +54 -0
  18. package/bin/bmad-speak.js +16 -8
  19. package/mcp-server/server.py +15 -8
  20. package/package.json +1 -1
  21. package/src/console/app.js +899 -897
  22. package/src/console/footer-config.js +50 -50
  23. package/src/console/navigation.js +65 -65
  24. package/src/console/tabs/agents-tab.js +1896 -1886
  25. package/src/console/tabs/music-tab.js +1046 -1039
  26. package/src/console/tabs/placeholder-tab.js +81 -80
  27. package/src/console/tabs/settings-tab.js +939 -3988
  28. package/src/console/tabs/setup-tab.js +1811 -0
  29. package/src/console/tabs/voices-tab.js +1720 -1713
  30. package/src/installer.js +6147 -6092
  31. package/src/services/llm-provider-service.js +407 -0
  32. package/src/services/navigation-service.js +123 -123
  33. package/src/services/tts-engine-service.js +69 -0
  34. package/.claude/audio/tracks/dreamy_house_loop.mp3 +0 -0
  35. package/src/console/tabs/install-tab.js +0 -1081
@@ -10,21 +10,25 @@ param(
10
10
  [string]$Text,
11
11
 
12
12
  [Parameter(Mandatory = $false, Position = 1)]
13
- [string]$VoiceOverride
13
+ [string]$VoiceOverride,
14
+
15
+ [Parameter(Mandatory = $false)]
16
+ [string]$llm = ""
14
17
  )
15
18
 
16
19
  # Configuration paths
17
20
  # Priority: CLAUDE_PROJECT_DIR env var → script's parent project → user profile
21
+ # Local project settings ALWAYS override global (~/.claude)
18
22
  $ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
19
23
 
20
24
  if ($env:CLAUDE_PROJECT_DIR -and (Test-Path "$env:CLAUDE_PROJECT_DIR\.claude")) {
21
25
  $ClaudeDir = "$env:CLAUDE_PROJECT_DIR\.claude"
22
26
  } else {
23
27
  $PackageClaudeDir = Join-Path (Split-Path -Parent (Split-Path -Parent $ScriptPath)) ".claude"
24
- if (Test-Path "$env:USERPROFILE\.claude\tts-provider.txt") {
25
- $ClaudeDir = "$env:USERPROFILE\.claude"
26
- } elseif (Test-Path $PackageClaudeDir) {
28
+ if (Test-Path $PackageClaudeDir) {
27
29
  $ClaudeDir = $PackageClaudeDir
30
+ } elseif (Test-Path "$env:USERPROFILE\.claude\tts-provider.txt") {
31
+ $ClaudeDir = "$env:USERPROFILE\.claude"
28
32
  } else {
29
33
  $ClaudeDir = "$env:USERPROFILE\.claude"
30
34
  }
@@ -42,6 +46,78 @@ if (Test-Path $MuteFile) {
42
46
  }
43
47
  }
44
48
 
49
+ # Per-LLM config lookup: if --llm is passed, look up llm:<name> in audio-effects.cfg
50
+ # Format: llm:<name>|SOX_EFFECTS|BACKGROUND_FILE|BACKGROUND_VOLUME|VOICE|PRETEXT
51
+ $LlmVoice = ""
52
+ $LlmPretext = ""
53
+ $LlmReverb = ""
54
+ $ProjectRoot = Split-Path -Parent $ClaudeDir
55
+ $ConfigDir = "$ClaudeDir\config"
56
+
57
+ if ($llm) {
58
+ $llmKey = "llm:$llm"
59
+ # Check project-local audio-effects.cfg first, then global
60
+ $cfgPaths = @(
61
+ "$ConfigDir\audio-effects.cfg",
62
+ "$env:USERPROFILE\.claude\config\audio-effects.cfg"
63
+ )
64
+ foreach ($cfgPath in $cfgPaths) {
65
+ if (-not $LlmVoice -and -not $LlmPretext -and (Test-Path $cfgPath)) {
66
+ foreach ($line in (Get-Content $cfgPath)) {
67
+ if ($line -match "^$([regex]::Escape($llmKey))\|") {
68
+ $parts = $line -split '\|'
69
+ # parts: [0]=key [1]=reverb_preset [2]=bg_file [3]=bg_vol [4]=voice [5]=pretext
70
+ if ($parts.Length -ge 2 -and $parts[1].Trim()) {
71
+ $LlmReverb = $parts[1].Trim()
72
+ }
73
+ if ($parts.Length -ge 5 -and $parts[4].Trim()) {
74
+ $LlmVoice = $parts[4].Trim()
75
+ }
76
+ if ($parts.Length -ge 6 -and $parts[5].Trim()) {
77
+ $LlmPretext = $parts[5].Trim()
78
+ }
79
+ break
80
+ }
81
+ }
82
+ }
83
+ }
84
+ # Apply LLM voice override (only if no explicit VoiceOverride was passed)
85
+ if ($LlmVoice -and -not $VoiceOverride) {
86
+ $VoiceOverride = $LlmVoice
87
+ }
88
+ # Export LLM key for child scripts (process-local, not system-wide)
89
+ $env:AGENTVIBES_LLM_KEY = "llm:$llm"
90
+ }
91
+
92
+ # Prepend pretext if configured
93
+ # Priority: LLM-specific pretext → project .agentvibes/config.json → project .claude/config/tts-pretext.txt
94
+ # → global ~/.agentvibes/config.json → global ~/.claude/config/tts-pretext.txt
95
+ $Pretext = $LlmPretext
96
+ if (-not $Pretext) {
97
+ $PretextSources = @(
98
+ (Join-Path $ProjectRoot ".agentvibes\config.json"),
99
+ "$ClaudeDir\config\tts-pretext.txt",
100
+ "$env:USERPROFILE\.agentvibes\config.json",
101
+ "$env:USERPROFILE\.claude\config\tts-pretext.txt"
102
+ )
103
+ foreach ($src in $PretextSources) {
104
+ if (-not $Pretext -and (Test-Path $src)) {
105
+ if ($src -match '\.json$') {
106
+ try {
107
+ $avCfg = Get-Content $src -Raw | ConvertFrom-Json
108
+ if ($avCfg.pretext) { $Pretext = $avCfg.pretext.Trim() }
109
+ } catch { }
110
+ } else {
111
+ $val = (Get-Content $src -Raw).Trim()
112
+ if ($val) { $Pretext = $val }
113
+ }
114
+ }
115
+ }
116
+ }
117
+ if ($Pretext) {
118
+ $Text = "$Pretext, $Text"
119
+ }
120
+
45
121
  # Determine active provider
46
122
  $ActiveProvider = "sapi"
47
123
  if (Test-Path $ProviderFile) {
@@ -101,12 +177,17 @@ if (Test-Path $AgentVibesConfig) {
101
177
  }
102
178
 
103
179
  # Check if reverb is enabled (allowlist validation)
180
+ # LLM-specific reverb overrides global setting
104
181
  $ReverbLevel = "off"
105
- $ReverbFile = "$ConfigDir\reverb-level.txt"
106
- if (Test-Path $ReverbFile) {
107
- $reverbVal = (Get-Content $ReverbFile -Raw).Trim()
108
- if ($reverbVal -in @("off", "light", "medium", "heavy", "cathedral")) {
109
- $ReverbLevel = $reverbVal
182
+ if ($LlmReverb -and $LlmReverb -in @("off", "light", "medium", "heavy", "cathedral")) {
183
+ $ReverbLevel = $LlmReverb
184
+ } else {
185
+ $ReverbFile = "$ConfigDir\reverb-level.txt"
186
+ if (Test-Path $ReverbFile) {
187
+ $reverbVal = (Get-Content $ReverbFile -Raw).Trim()
188
+ if ($reverbVal -in @("off", "light", "medium", "heavy", "cathedral")) {
189
+ $ReverbLevel = $reverbVal
190
+ }
110
191
  }
111
192
  }
112
193
  $HasReverb = $ReverbLevel -ne "off"
@@ -241,6 +322,7 @@ if (($BgEnabled -or $HasReverb) -and $HasFfmpeg) {
241
322
  if (Test-Path $AudioEffectsCfg) {
242
323
  # Try agent-specific config first, then fall back to default
243
324
  # Format: AGENT_NAME|SOX_EFFECTS|BACKGROUND_FILE|BACKGROUND_VOLUME
325
+ # Lookup order: agent name → llm:<name> → default
244
326
  $agentName = $env:AGENTVIBES_AGENT_NAME
245
327
  $configLine = $null
246
328
 
@@ -253,6 +335,16 @@ if (($BgEnabled -or $HasReverb) -and $HasFfmpeg) {
253
335
  }
254
336
  }
255
337
  }
338
+ # Try LLM-specific config (--llm parameter)
339
+ if (-not $configLine -and $llm) {
340
+ $llmBgKey = "llm:$llm"
341
+ foreach ($line in $cfgLines) {
342
+ if ($line -match "^$([regex]::Escape($llmBgKey))\|") {
343
+ $configLine = $line
344
+ break
345
+ }
346
+ }
347
+ }
256
348
  # Fall back to default
257
349
  if (-not $configLine) {
258
350
  foreach ($line in $cfgLines) {
@@ -1,114 +1,114 @@
1
- #
2
- # File: .claude/hooks-windows/session-start-tts.ps1
3
- #
4
- # AgentVibes SessionStart Hook for Windows
5
- # Outputs JSON with hookSpecificOutput.additionalContext for reliable context injection.
6
- # Mirrors session-start-tts.sh — keep both in sync.
7
- #
8
-
9
- $ErrorActionPreference = "Stop"
10
-
11
- # Get script directory
12
- $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
13
-
14
- # Check if AgentVibes is installed
15
- if (-not (Test-Path (Join-Path $ScriptDir "play-tts.ps1"))) {
16
- exit 0
17
- }
18
-
19
- # Resolve project .claude dir from script location (avoids CWD-relative path issues)
20
- $ProjectClaudeDir = Split-Path -Parent (Split-Path -Parent $ScriptDir)
21
- $ProjectClaudeDir = Join-Path $ProjectClaudeDir ".claude"
22
-
23
- # Check for sentiment (priority) or personality (fallback)
24
- $Sentiment = ""
25
- $sentimentPaths = @("$ProjectClaudeDir\tts-sentiment.txt", "$env:USERPROFILE\.claude\tts-sentiment.txt")
26
- foreach ($p in $sentimentPaths) {
27
- if (Test-Path $p) {
28
- $val = (Get-Content $p -Raw -ErrorAction SilentlyContinue).Trim()
29
- if ($val) { $Sentiment = $val; break }
30
- }
31
- }
32
-
33
- $Personality = "normal"
34
- $personalityPaths = @("$ProjectClaudeDir\tts-personality.txt", "$env:USERPROFILE\.claude\tts-personality.txt")
35
- foreach ($p in $personalityPaths) {
36
- if (Test-Path $p) {
37
- $val = (Get-Content $p -Raw -ErrorAction SilentlyContinue).Trim()
38
- if ($val) { $Personality = $val; break }
39
- }
40
- }
41
-
42
- $Style = if ($Sentiment) { $Sentiment } else { $Personality }
43
-
44
- # Get verbosity level
45
- $Verbosity = "low"
46
- $verbosityPaths = @("$ProjectClaudeDir\tts-verbosity.txt", "$env:USERPROFILE\.claude\tts-verbosity.txt")
47
- foreach ($p in $verbosityPaths) {
48
- if (Test-Path $p) {
49
- $val = (Get-Content $p -Raw -ErrorAction SilentlyContinue).Trim()
50
- if ($val) { $Verbosity = $val; break }
51
- }
52
- }
53
-
54
- # Build verbosity section
55
- $VerbositySection = switch ($Verbosity) {
56
- "low" { "## Verbosity: LOW`n- Acknowledgment: Action only`n- Completion: Result + errors only`n- Skip: Reasoning, decisions" }
57
- "medium" { "## Verbosity: MEDIUM`n- Acknowledgment: Action + key approach`n- Completion: Result + important decisions`n- Include: Major choices only" }
58
- "high" { "## Verbosity: HIGH`n- Acknowledgment: Action + approach + why`n- Completion: Result + decisions + trade-offs`n- Include: Full reasoning, alternatives" }
59
- default { "## Verbosity: LOW`n- Acknowledgment: Action only`n- Completion: Result + errors only" }
60
- }
61
-
62
- # Build full context string
63
- $Context = @"
64
- # AgentVibes TTS Protocol
65
-
66
- **CRITICAL: You MUST execute TTS at TWO points for EVERY user interaction:**
67
-
68
- 1. **Acknowledgment** - Start of task: ``Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "[action]"``
69
- 2. **Completion** - End of task: ``Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "[result + key details]"``
70
-
71
- **Example:**
72
- ``````
73
- [Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "Checking git status"]
74
- [work...]
75
- [Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "Repository is clean, no changes"]
76
- ``````
77
-
78
- $VerbositySection
79
-
80
- ## Style: $Style
81
-
82
- ## Rules
83
- 1. Never skip acknowledgment TTS
84
- 2. Never skip completion TTS
85
- 3. Match verbosity level
86
- 4. Keep under 150 chars
87
- 5. Always include errors
88
-
89
- Quick Ref: low=action+result | medium=+key decisions | high=+full reasoning
90
-
91
- ## BMAD Agent Voice Routing
92
- If ``.bmad-agent-context`` exists, check its content:
93
-
94
- **Single agent mode** (content is an agent ID like "analyst"):
95
- Use ``bmad-speak.ps1`` instead of ``play-tts.ps1``:
96
-
97
-
98
- **Party mode** (content is "party-mode"):
99
- Each agent speaks via ``bmad-speak.ps1`` with their display name. The queue system ensures sequential playback — agents speak one at a time, not overlapping:
100
-
101
- IMPORTANT: In party mode, do NOT use ``play-tts.ps1``. Always use ``bmad-speak.ps1`` with the agent's display name. Do NOT call multiple bmad-speak.ps1 in parallel — call them sequentially so the queue processes them in order.
102
-
103
- If ``.bmad-agent-context`` does NOT exist, use ``play-tts.ps1`` as normal.
104
- "@
105
-
106
- # Build JSON via hashtable so ConvertTo-Json handles all escaping (Unicode, backslashes, quotes)
107
- $Output = @{
108
- hookSpecificOutput = @{
109
- hookEventName = "SessionStart"
110
- additionalContext = $Context
111
- }
112
- }
113
- [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
114
- Write-Output ($Output | ConvertTo-Json -Compress -Depth 5)
1
+ #
2
+ # File: .claude/hooks-windows/session-start-tts.ps1
3
+ #
4
+ # AgentVibes SessionStart Hook for Windows
5
+ # Outputs JSON with hookSpecificOutput.additionalContext for reliable context injection.
6
+ # Mirrors session-start-tts.sh — keep both in sync.
7
+ #
8
+
9
+ $ErrorActionPreference = "Stop"
10
+
11
+ # Get script directory
12
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
13
+
14
+ # Check if AgentVibes is installed
15
+ if (-not (Test-Path (Join-Path $ScriptDir "play-tts.ps1"))) {
16
+ exit 0
17
+ }
18
+
19
+ # Resolve project .claude dir from script location (avoids CWD-relative path issues)
20
+ $ProjectClaudeDir = Split-Path -Parent (Split-Path -Parent $ScriptDir)
21
+ $ProjectClaudeDir = Join-Path $ProjectClaudeDir ".claude"
22
+
23
+ # Check for sentiment (priority) or personality (fallback)
24
+ $Sentiment = ""
25
+ $sentimentPaths = @("$ProjectClaudeDir\tts-sentiment.txt", "$env:USERPROFILE\.claude\tts-sentiment.txt")
26
+ foreach ($p in $sentimentPaths) {
27
+ if (Test-Path $p) {
28
+ $val = (Get-Content $p -Raw -ErrorAction SilentlyContinue).Trim()
29
+ if ($val) { $Sentiment = $val; break }
30
+ }
31
+ }
32
+
33
+ $Personality = "normal"
34
+ $personalityPaths = @("$ProjectClaudeDir\tts-personality.txt", "$env:USERPROFILE\.claude\tts-personality.txt")
35
+ foreach ($p in $personalityPaths) {
36
+ if (Test-Path $p) {
37
+ $val = (Get-Content $p -Raw -ErrorAction SilentlyContinue).Trim()
38
+ if ($val) { $Personality = $val; break }
39
+ }
40
+ }
41
+
42
+ $Style = if ($Sentiment) { $Sentiment } else { $Personality }
43
+
44
+ # Get verbosity level
45
+ $Verbosity = "low"
46
+ $verbosityPaths = @("$ProjectClaudeDir\tts-verbosity.txt", "$env:USERPROFILE\.claude\tts-verbosity.txt")
47
+ foreach ($p in $verbosityPaths) {
48
+ if (Test-Path $p) {
49
+ $val = (Get-Content $p -Raw -ErrorAction SilentlyContinue).Trim()
50
+ if ($val) { $Verbosity = $val; break }
51
+ }
52
+ }
53
+
54
+ # Build verbosity section
55
+ $VerbositySection = switch ($Verbosity) {
56
+ "low" { "## Verbosity: LOW`n- Acknowledgment: Action only`n- Completion: Result + errors only`n- Skip: Reasoning, decisions" }
57
+ "medium" { "## Verbosity: MEDIUM`n- Acknowledgment: Action + key approach`n- Completion: Result + important decisions`n- Include: Major choices only" }
58
+ "high" { "## Verbosity: HIGH`n- Acknowledgment: Action + approach + why`n- Completion: Result + decisions + trade-offs`n- Include: Full reasoning, alternatives" }
59
+ default { "## Verbosity: LOW`n- Acknowledgment: Action only`n- Completion: Result + errors only" }
60
+ }
61
+
62
+ # Build full context string
63
+ $Context = @"
64
+ # AgentVibes TTS Protocol
65
+
66
+ **CRITICAL: You MUST execute TTS at TWO points for EVERY user interaction:**
67
+
68
+ 1. **Acknowledgment** - Start of task: ``Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "[action]" -llm claude-code``
69
+ 2. **Completion** - End of task: ``Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "[result + key details]" -llm claude-code``
70
+
71
+ **Example:**
72
+ ``````
73
+ [Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "Checking git status" -llm claude-code]
74
+ [work...]
75
+ [Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "Repository is clean, no changes" -llm claude-code]
76
+ ``````
77
+
78
+ $VerbositySection
79
+
80
+ ## Style: $Style
81
+
82
+ ## Rules
83
+ 1. Never skip acknowledgment TTS
84
+ 2. Never skip completion TTS
85
+ 3. Match verbosity level
86
+ 4. Keep under 150 chars
87
+ 5. Always include errors
88
+
89
+ Quick Ref: low=action+result | medium=+key decisions | high=+full reasoning
90
+
91
+ ## BMAD Agent Voice Routing
92
+ If ``.bmad-agent-context`` exists, check its content:
93
+
94
+ **Single agent mode** (content is an agent ID like "analyst"):
95
+ Use ``bmad-speak.ps1`` instead of ``play-tts.ps1``:
96
+
97
+
98
+ **Party mode** (content is "party-mode"):
99
+ Each agent speaks via ``bmad-speak.ps1`` with their display name. The queue system ensures sequential playback — agents speak one at a time, not overlapping:
100
+
101
+ IMPORTANT: In party mode, do NOT use ``play-tts.ps1``. Always use ``bmad-speak.ps1`` with the agent's display name. Do NOT call multiple bmad-speak.ps1 in parallel — call them sequentially so the queue processes them in order.
102
+
103
+ If ``.bmad-agent-context`` does NOT exist, use ``play-tts.ps1`` as normal.
104
+ "@
105
+
106
+ # Build JSON via hashtable so ConvertTo-Json handles all escaping (Unicode, backslashes, quotes)
107
+ $Output = @{
108
+ hookSpecificOutput = @{
109
+ hookEventName = "SessionStart"
110
+ additionalContext = $Context
111
+ }
112
+ }
113
+ [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
114
+ Write-Output ($Output | ConvertTo-Json -Compress -Depth 5)
package/README.md CHANGED
@@ -4,14 +4,14 @@
4
4
  >
5
5
  > 🌐 **[agentvibes.org](https://agentvibes.org)**
6
6
  >
7
- > Professional text-to-speech for **Claude Code**, **Claude Desktop**, and **OpenClaw** - **Soprano** (Neural), **Piper TTS** (Free!), **macOS Say** (Built-in!), or **Windows SAPI** (Zero Setup!)
7
+ > Professional text-to-speech for **Claude Code**, **GitHub Copilot**, **OpenAI Codex**, **Claude Desktop**, and **OpenClaw**. Using popular open-source TTS engines: **Soprano** (Neural), **Piper TTS** (Free!), **macOS Say** (Built-in!), or **Windows SAPI** (Zero Setup!)
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/agentvibes)](https://www.npmjs.com/package/agentvibes)
10
10
  [![Test Suite](https://github.com/paulpreibisch/AgentVibes/actions/workflows/test.yml/badge.svg)](https://github.com/paulpreibisch/AgentVibes/actions/workflows/test.yml)
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**: v4.6.7
14
+ **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.0.0
15
15
 
16
16
  ---
17
17
 
@@ -20,11 +20,13 @@
20
20
  | I want to... | Go here |
21
21
  |--------------|---------|
22
22
  | **Install AgentVibes** (just `npx`, no git!) | [Quick Start Guide](docs/quick-start.md) |
23
- | **Run Claude Code on Android** | [Android/Termux Setup](#-android--termux) |
23
+ | **Play agent audio using your phone as remote speakers** | [Android/Termux Setup](#-android--termux) |
24
24
  | **Secure OpenClaw on Remote Server** | [Security Hardening Guide](docs/security-hardening-guide.md) ⚠️ |
25
25
  | **Understand what I need** | [Prerequisites](#-prerequisites) |
26
26
  | **Set up on Windows (Native)** | [Windows Native Setup](WINDOWS-SETUP.md) |
27
27
  | **Set up on Windows (Claude Desktop/WSL)** | [Windows WSL Guide](mcp-server/WINDOWS_SETUP.md) |
28
+ | **Use with GitHub Copilot** | [Copilot Integration](#-github-copilot-integration) |
29
+ | **Use with OpenAI Codex** | [Codex Integration](#-openai-codex-integration) |
28
30
  | **Use with OpenClaw** | [OpenClaw Integration](#-openclaw-integration) |
29
31
  | **Use natural language** | [MCP Setup](docs/mcp-setup.md) |
30
32
  | **Switch voices** | [Voice Library](docs/voice-library.md) |
@@ -35,13 +37,31 @@
35
37
 
36
38
  ## ✨ What is AgentVibes?
37
39
 
38
- **AgentVibes adds lively voice narration to your Claude AI sessions!**
40
+ **AgentVibes adds lively voice narration to your AI coding sessions!**
39
41
 
40
- Whether you're coding in Claude Code, chatting in Claude Desktop, or running OpenClaw — AgentVibes brings AI to life with professional voices and personalities.
42
+ Whether you're using Claude Code, GitHub Copilot, OpenAI Codex, Claude Desktop, or OpenClaw — AgentVibes brings AI to life with professional voices and personalities.
41
43
 
42
44
  ---
43
45
 
44
- ## 🎙️ NEW IN v4.6.7Party Mode TTS Fixes
46
+ ## 🚀 NEW IN v5.0.0Multi-Provider Support: Claude Code + Copilot + Codex
47
+
48
+ - **GitHub Copilot + OpenAI Codex in VS Code** — AgentVibes now supports all three major AI coding assistants. Install and configure each from the TUI.
49
+ - **One Setup tab** — 4-step wizard (Language → Deps → TTS Engine → Providers) replaces old installer + LLM tabs. Returning users skip to Providers.
50
+ - **Per-provider audio config** — Each LLM gets its own Voice, TTS Engine, Reverb, Music, and Pretext via Configure modal.
51
+ - **Settings redesigned** — Clean flat list: Language, TTS Engine, Voice, Verbosity, Audio Destination, Config Storage, Re-run Wizard.
52
+ - **Voice picker upgraded** — 3-column display, Space bar preview, scroll stays in place.
53
+
54
+ ---
55
+
56
+ ## 🐛 v4.6.8 — Fresh Install Crash Fix
57
+
58
+ - **Settings tab crash fixed** — no longer crashes when navigating to Settings on a fresh install with no voice configured
59
+ - **macOS test fix** — replay path assertion handles `/var` → `/private/var` symlink
60
+ - **BMAD pretext parsing improved** — voices pretext extracted correctly from `bmad-voices.md`
61
+
62
+ ---
63
+
64
+ ## 🎙️ v4.6.7 — Party Mode TTS Fixes
45
65
 
46
66
  - **Agent pretexts now spoken in party mode** — "John, Product Manager here" was being silently dropped due to a pre-synthesis timing bug. Fixed.
47
67
  - **No more spoken asterisks** — markdown stripped before TTS in party mode
@@ -50,7 +70,7 @@ Whether you're coding in Claude Code, chatting in Claude Desktop, or running Ope
50
70
 
51
71
  ---
52
72
 
53
- ## 🧭 NEW IN v4.6.6 — Natural TUI Navigation
73
+ ## 🧭 v4.6.6 — Natural TUI Navigation
54
74
 
55
75
  The Settings TUI now flows the way you'd expect. Down moves top-to-bottom through header → sub-tabs → content → footer. Left/Right switches sub-tabs and moves between footer buttons. Up from content returns to the active sub-tab — not always Voice. The Language tab has a proper scrollable list. Readme falls back to the AgentVibes package README when no local one exists. Escape from the installer no longer gets stuck.
56
76
 
@@ -485,6 +505,7 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
485
505
  - [🎙️ AgentVibes Receiver - NEW!](#%EF%B8%8F-agentvibes-receiver-remote-audio-streaming-from-voiceless-servers) - Remote audio streaming from voiceless servers
486
506
 
487
507
  ### Integrations & Platforms
508
+ - [🤝 GitHub Copilot Integration](#-github-copilot-integration) - Use AgentVibes TTS with GitHub Copilot CLI
488
509
  - [🤖 OpenClaw Integration](#-openclaw-integration) - Use AgentVibes with OpenClaw messaging platform
489
510
  - [🎙️ AgentVibes Skill for OpenClaw](#-agentvibes-skill-for-openclaw---what-you-get) - 50+ voices, effects, personalities for OpenClaw
490
511
  - [📱 AgentVibes Receiver](#-agentvibes-receiver-local-phone-) - Remote audio on phones/local machines
@@ -1240,6 +1261,85 @@ This design means **any TTS provider** can integrate with BMAD by replacing thes
1240
1261
 
1241
1262
  ---
1242
1263
 
1264
+ ## 🤝 GitHub Copilot Integration
1265
+
1266
+ **Use AgentVibes with GitHub Copilot in VS Code — same voices, same personalities, same MCP tools!**
1267
+
1268
+ Copilot discovers AgentVibes through two mechanisms:
1269
+
1270
+ 1. **`.github/copilot-instructions.md`** — VS Code automatically reads this file and tells Copilot *how* to speak (acknowledge at start, summarize at end, match verbosity, stay under 150 chars)
1271
+ 2. **`.vscode/mcp.json`** — registers the AgentVibes MCP server so Copilot can call `text_to_speech`, `set_voice`, and other tools
1272
+
1273
+ ### Setup
1274
+
1275
+ **Step 1: Install AgentVibes** (if you haven't already)
1276
+
1277
+ ```bash
1278
+ npx agentvibes install
1279
+ ```
1280
+
1281
+ **Step 2: Configure VS Code MCP**
1282
+
1283
+ Open the AgentVibes console and go to the **LLM** tab (press `L`):
1284
+
1285
+ ```bash
1286
+ npx agentvibes
1287
+ ```
1288
+
1289
+ Select **GitHub Copilot** and press Enter to install. This creates `.vscode/mcp.json` with the AgentVibes MCP server config and copies `.github/copilot-instructions.md` with the TTS protocol.
1290
+
1291
+ You can also create `.vscode/mcp.json` manually in your project root:
1292
+
1293
+ ```json
1294
+ {
1295
+ "servers": {
1296
+ "agentvibes": {
1297
+ "type": "stdio",
1298
+ "command": "npx",
1299
+ "args": ["-y", "--package=agentvibes", "agentvibes-mcp-server"]
1300
+ }
1301
+ }
1302
+ }
1303
+ ```
1304
+
1305
+ VS Code starts the MCP server automatically when Copilot needs it — no manual server launch required.
1306
+
1307
+ **Step 3: Verify**
1308
+
1309
+ Open Copilot Chat in VS Code (Ctrl+Shift+I) and ask it to do something. You should hear an acknowledgment when Copilot starts working and a summary when it finishes.
1310
+
1311
+ ### What Copilot Can Do
1312
+
1313
+ Through the MCP tools, Copilot has the same voice capabilities as Claude Code:
1314
+
1315
+ | Tool | What it does |
1316
+ |------|-------------|
1317
+ | `text_to_speech` | Speak text aloud |
1318
+ | `set_voice` | Switch voices (e.g., "ryan", "katherine") |
1319
+ | `set_personality` | Change personality (sarcastic, pirate, zen) |
1320
+ | `set_speed` | Adjust speech rate |
1321
+ | `set_verbosity` | Control detail level (low/medium/high) |
1322
+ | `mute` / `unmute` | Toggle audio |
1323
+ | `get_config` | Read current settings |
1324
+
1325
+ ### BMAD Party Mode
1326
+
1327
+ Copilot respects BMAD party mode. If `.bmad-agent-context` contains `party-mode`, each BMAD agent speaks with its own voice — the same per-agent routing that works in Claude Code.
1328
+
1329
+ ### Differences from Claude Code
1330
+
1331
+ | Feature | Claude Code | Copilot in VS Code |
1332
+ |---------|------------|-------------|
1333
+ | TTS Protocol | Injected via session-start hook | Read from `.github/copilot-instructions.md` |
1334
+ | MCP config | `.mcp.json` (project root) | `.vscode/mcp.json` |
1335
+ | Server lifecycle | Managed by Claude Code | Managed by VS Code (auto-start) |
1336
+ | MCP tools | Same | Same |
1337
+ | BMAD party mode | Supported | Supported |
1338
+
1339
+ [↑ Back to top](#-table-of-contents)
1340
+
1341
+ ---
1342
+
1243
1343
  ## 🤖 OpenClaw Integration
1244
1344
 
1245
1345
  **Use AgentVibes TTS with OpenClaw - the revolutionary AI assistant you can access via any instant messenger!**
package/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,59 @@
1
1
  # AgentVibes Release Notes
2
2
 
3
+ ## 🚀 v5.0.0 — Multi-Provider Support: Claude Code + Copilot + Codex
4
+
5
+ **Release Date:** April 2026
6
+
7
+ ### New Features
8
+
9
+ - **GitHub Copilot Support in VS Code** — Install and configure AgentVibes for GitHub Copilot directly from the TUI. Creates `.vscode/mcp.json` and `.github/copilot-instructions.md`.
10
+
11
+ - **OpenAI Codex Support in VS Code** — Full Codex integration with `.codex/config.toml`, `AGENTS.md` TTS protocol, and init hooks.
12
+
13
+ - **Unified Setup Tab** — The old 5-screen Install wizard and separate LLM Providers tab are merged into a single Setup tab. First-run shows a 4-step wizard (Language → Dependencies → TTS Engine → Providers); returning users skip straight to the Providers screen.
14
+
15
+ - **Per-Provider Audio Config** — Each LLM provider (Claude Code, Copilot, Codex) gets its own TTS Engine, Voice, Reverb, Background Music, and Pretext via a Configure modal.
16
+
17
+ - **TTS Engine Selection Screen** — New wizard step shows OS-aware engine list (Piper, Soprano, Windows SAPI, macOS Say) with Install buttons for missing engines.
18
+
19
+ - **Settings Tab Redesigned** — Replaced the 5-sub-tab layout with a clean flat list: Interface Language, Default TTS Engine, Default Voice, Verbosity, Audio Destination, Config Storage, and Re-run Setup Wizard.
20
+
21
+ ### Improvements
22
+
23
+ - **Voice picker upgraded everywhere** — 3-column display (Name, Gender, Provider), Space bar preview with synthesis + playback, scroll position preserved during preview.
24
+
25
+ - **Hint text artifacts fixed** — Moving between rows in Agents and Music tabs no longer leaves ghost text on previous rows.
26
+
27
+ - **Codex voice routing corrected** — `AGENTS.md` now instructs Codex to use `play-tts` for normal speech and `bmad-speak` only during BMAD party mode.
28
+
29
+ ### User Impact
30
+
31
+ - AgentVibes now works with Claude Code, GitHub Copilot, AND OpenAI Codex
32
+ - Streamlined setup experience — one tab for all provider management
33
+ - Per-provider voice customization without editing config files
34
+ - Settings page is dramatically simpler and faster to navigate
35
+
36
+ ---
37
+
38
+ ## 🐛 v4.6.8 — Fresh Install Crash Fix
39
+
40
+ **Release Date:** April 2026
41
+
42
+ ### Bug Fixes
43
+
44
+ - **Settings tab no longer crashes on fresh install** — `parseMultiSpeaker()` called `.includes()` on a null voice ID when no voice was configured yet. Added a null guard that returns a safe default object. Reported by a user hitting this immediately after the install wizard completed.
45
+
46
+ - **macOS /var symlink in replay test** — Fixed test assertion that failed on macOS where `/var` is a symlink to `/private/var`, causing replay path comparisons to break.
47
+
48
+ - **BMAD voices pretext parsing** — `bmad-voices.md` pretext lines are now correctly parsed and markdown is stripped more thoroughly before TTS synthesis.
49
+
50
+ ### User Impact
51
+
52
+ - New users no longer crash when navigating to Settings after a fresh install
53
+ - Test suite passes reliably on macOS
54
+
55
+ ---
56
+
3
57
  ## 🎙️ v4.6.7 — Party Mode TTS Fixes
4
58
 
5
59
  **Release Date:** April 2026
package/bin/bmad-speak.js CHANGED
@@ -33,20 +33,28 @@ function resolveScript(relPath) {
33
33
  return null;
34
34
  }
35
35
 
36
+ function hasProjectBmadManifest() {
37
+ return fs.existsSync(path.join(process.cwd(), '_bmad', '_config', 'agent-manifest.csv'));
38
+ }
39
+
36
40
  let result;
37
41
 
38
42
  if (IS_WINDOWS) {
39
- const script = resolveScript('.claude/hooks-windows/bmad-speak.ps1');
43
+ const script = hasProjectBmadManifest()
44
+ ? resolveScript('.claude/hooks-windows/bmad-speak.ps1')
45
+ : resolveScript('.claude/hooks-windows/play-tts.ps1');
40
46
  if (!script) process.exit(0);
41
- result = spawnSync(
42
- 'powershell',
43
- ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', script, agentName, dialogue],
44
- { stdio: 'inherit' }
45
- );
47
+ const args = hasProjectBmadManifest()
48
+ ? ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', script, agentName, dialogue]
49
+ : ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', script, dialogue];
50
+ result = spawnSync('powershell', args, { stdio: 'inherit' });
46
51
  } else {
47
- const script = resolveScript('.claude/hooks/bmad-speak.sh');
52
+ const script = hasProjectBmadManifest()
53
+ ? resolveScript('.claude/hooks/bmad-speak.sh')
54
+ : resolveScript('.claude/hooks/play-tts.sh');
48
55
  if (!script) process.exit(0);
49
- result = spawnSync('bash', [script, agentName, dialogue], { stdio: 'inherit' });
56
+ const args = hasProjectBmadManifest() ? [script, agentName, dialogue] : [script, dialogue];
57
+ result = spawnSync('bash', args, { stdio: 'inherit' });
50
58
  }
51
59
 
52
60
  process.exit(result.status ?? 0);