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.
- package/.agentvibes/bmad-voice-map.json +104 -0
- package/.agentvibes/config.json +13 -12
- package/.agentvibes/copilot-sessions.log +4 -0
- package/.claude/audio/tracks/README.md +51 -52
- package/.claude/config/audio-effects-bmad.cfg +50 -0
- package/.claude/config/audio-effects.cfg +4 -4
- package/.claude/config/background-music-enabled.txt +1 -0
- package/.claude/config/personality.txt +1 -0
- package/.claude/hooks/play-tts-piper.sh +3 -1
- package/.claude/hooks/play-tts.sh +373 -301
- package/.claude/hooks/session-start-tts.sh +81 -81
- package/.claude/hooks-windows/audio-processor.ps1 +181 -0
- package/.claude/hooks-windows/play-tts-piper.ps1 +259 -245
- package/.claude/hooks-windows/play-tts.ps1 +101 -9
- package/.claude/hooks-windows/session-start-tts.ps1 +114 -114
- package/README.md +107 -7
- package/RELEASE_NOTES.md +54 -0
- package/bin/bmad-speak.js +16 -8
- package/mcp-server/server.py +15 -8
- package/package.json +1 -1
- package/src/console/app.js +899 -897
- package/src/console/footer-config.js +50 -50
- package/src/console/navigation.js +65 -65
- package/src/console/tabs/agents-tab.js +1896 -1886
- package/src/console/tabs/music-tab.js +1046 -1039
- package/src/console/tabs/placeholder-tab.js +81 -80
- package/src/console/tabs/settings-tab.js +939 -3988
- package/src/console/tabs/setup-tab.js +1811 -0
- package/src/console/tabs/voices-tab.js +1720 -1713
- package/src/installer.js +6147 -6092
- package/src/services/llm-provider-service.js +407 -0
- package/src/services/navigation-service.js +123 -123
- package/src/services/tts-engine-service.js +69 -0
- package/.claude/audio/tracks/dreamy_house_loop.mp3 +0 -0
- 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
|
|
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
|
-
$
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
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
|
[](https://www.npmjs.com/package/agentvibes)
|
|
10
10
|
[](https://github.com/paulpreibisch/AgentVibes/actions/workflows/test.yml)
|
|
11
11
|
[](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
|
|
12
12
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
13
13
|
|
|
14
|
-
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**:
|
|
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
|
-
| **
|
|
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
|
|
40
|
+
**AgentVibes adds lively voice narration to your AI coding sessions!**
|
|
39
41
|
|
|
40
|
-
Whether you're
|
|
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
|
-
##
|
|
46
|
+
## 🚀 NEW IN v5.0.0 — Multi-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
|
-
## 🧭
|
|
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 =
|
|
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
|
-
|
|
42
|
-
'
|
|
43
|
-
['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', script,
|
|
44
|
-
|
|
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 =
|
|
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
|
-
|
|
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);
|