agentvibes 5.3.0 → 5.4.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 (219) hide show
  1. package/.agentvibes/LITE-MODE.md +236 -0
  2. package/.agentvibes/README.md +136 -0
  3. package/.agentvibes/backup/session-start-tts.sh.20251210_212814 +141 -0
  4. package/.agentvibes/backups/agents/analyst_20260204_144958.md +78 -0
  5. package/.agentvibes/backups/agents/architect_20260204_144958.md +72 -0
  6. package/.agentvibes/backups/agents/dev_20260204_144958.md +74 -0
  7. package/.agentvibes/backups/agents/pm_20260204_144958.md +72 -0
  8. package/.agentvibes/backups/agents/quick-flow-solo-dev_20260204_144958.md +64 -0
  9. package/.agentvibes/backups/agents/sm_20260204_144958.md +87 -0
  10. package/.agentvibes/backups/agents/tea_20260204_144958.md +79 -0
  11. package/.agentvibes/backups/agents/tech-writer_20260204_144958.md +82 -0
  12. package/.agentvibes/backups/agents/ux-designer_20260204_144958.md +80 -0
  13. package/.agentvibes/bmad/bmad-voices.md +69 -69
  14. package/.agentvibes/config/README-personality-defaults.md +162 -0
  15. package/.agentvibes/config/mode.txt +1 -0
  16. package/.agentvibes/config/personality-voice-defaults.default.json +21 -0
  17. package/.agentvibes/config/save-audio.txt +1 -0
  18. package/.agentvibes/config/voice-metadata.json +160 -0
  19. package/.agentvibes/config.json +24 -15
  20. package/.agentvibes/hooks/help.sh +191 -0
  21. package/.agentvibes/hooks/post-tool-use-lite.sh +111 -0
  22. package/.agentvibes/hooks/save-audio-manager.sh +162 -0
  23. package/.agentvibes/hooks/session-start-full-optimized.sh +102 -0
  24. package/.agentvibes/hooks/session-start-full.sh +142 -0
  25. package/.agentvibes/hooks/session-start-lite-v2.sh +34 -0
  26. package/.agentvibes/hooks/session-start-lite.sh +29 -0
  27. package/.agentvibes/hooks/stop-lite.sh +115 -0
  28. package/.agentvibes/hooks/switch-mode.sh +215 -0
  29. package/.agentvibes/output-styles/audio-summary.md +30 -0
  30. package/.claude/activation-instructions +54 -54
  31. package/.claude/audio/voice-samples/piper/alan.wav +0 -0
  32. package/.claude/audio/voice-samples/piper/amy.wav +0 -0
  33. package/.claude/audio/voice-samples/piper/charlotte.wav +0 -0
  34. package/.claude/audio/voice-samples/piper/joe.wav +0 -0
  35. package/.claude/audio/voice-samples/piper/john.wav +0 -0
  36. package/.claude/audio/voice-samples/piper/katherine.wav +0 -0
  37. package/.claude/audio/voice-samples/piper/kristin.wav +0 -0
  38. package/.claude/audio/voice-samples/piper/linda.wav +0 -0
  39. package/.claude/audio/voice-samples/piper/marcus.wav +0 -0
  40. package/.claude/audio/voice-samples/piper/ryan.wav +0 -0
  41. package/.claude/commands/agent-vibes/add.md +21 -21
  42. package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
  43. package/.claude/commands/agent-vibes/agent.md +79 -79
  44. package/.claude/commands/agent-vibes/background-music.md +111 -111
  45. package/.claude/commands/agent-vibes/bmad.md +198 -198
  46. package/.claude/commands/agent-vibes/clean.md +18 -18
  47. package/.claude/commands/agent-vibes/cleanup.md +18 -18
  48. package/.claude/commands/agent-vibes/commands.json +145 -145
  49. package/.claude/commands/agent-vibes/effects.md +97 -97
  50. package/.claude/commands/agent-vibes/get.md +9 -9
  51. package/.claude/commands/agent-vibes/hide.md +91 -91
  52. package/.claude/commands/agent-vibes/language.md +23 -23
  53. package/.claude/commands/agent-vibes/learn.md +67 -67
  54. package/.claude/commands/agent-vibes/list.md +13 -13
  55. package/.claude/commands/agent-vibes/mute.md +37 -37
  56. package/.claude/commands/agent-vibes/preview.md +17 -17
  57. package/.claude/commands/agent-vibes/provider.md +68 -68
  58. package/.claude/commands/agent-vibes/replay-target.md +14 -14
  59. package/.claude/commands/agent-vibes/sample.md +12 -12
  60. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
  61. package/.claude/commands/agent-vibes/set-pretext.md +65 -65
  62. package/.claude/commands/agent-vibes/set-speed.md +41 -41
  63. package/.claude/commands/agent-vibes/show.md +84 -84
  64. package/.claude/commands/agent-vibes/switch.md +87 -87
  65. package/.claude/commands/agent-vibes/target-voice.md +26 -26
  66. package/.claude/commands/agent-vibes/target.md +30 -30
  67. package/.claude/commands/agent-vibes/translate.md +68 -68
  68. package/.claude/commands/agent-vibes/unmute.md +45 -45
  69. package/.claude/commands/agent-vibes/whoami.md +7 -7
  70. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  71. package/.claude/commands/agent-vibes-rdp.md +24 -24
  72. package/.claude/config/audio-effects.cfg +4 -11
  73. package/.claude/config/audio-effects.cfg.sample +52 -52
  74. package/.claude/config/background-music-position.txt +27 -0
  75. package/.claude/config/background-music-volume.txt +1 -1
  76. package/.claude/config/background-music.cfg +1 -0
  77. package/.claude/config/background-music.txt +1 -0
  78. package/.claude/config/tts-speech-rate.txt +1 -4
  79. package/.claude/config/tts-verbosity.txt +1 -0
  80. package/.claude/docs/TERMUX_SETUP.md +408 -408
  81. package/.claude/github-star-reminder.txt +1 -1
  82. package/.claude/hooks/README-TTS-QUEUE.md +135 -135
  83. package/.claude/hooks/audio-cache-utils.sh +0 -0
  84. package/.claude/hooks/audio-processor.sh +60 -14
  85. package/.claude/hooks/background-music-manager.sh +0 -0
  86. package/.claude/hooks/bmad-party-manager.sh +225 -0
  87. package/.claude/hooks/bmad-speak-enhanced.sh +0 -0
  88. package/.claude/hooks/bmad-speak.sh +6 -13
  89. package/.claude/hooks/bmad-tts-injector.sh +0 -0
  90. package/.claude/hooks/bmad-voice-manager.sh +0 -0
  91. package/.claude/hooks/clawdbot-receiver-SECURE.sh +25 -23
  92. package/.claude/hooks/clawdbot-receiver.sh +4 -28
  93. package/.claude/hooks/clean-audio-cache.sh +0 -0
  94. package/.claude/hooks/cleanup-cache.sh +0 -0
  95. package/.claude/hooks/configure-rdp-mode.sh +0 -0
  96. package/.claude/hooks/download-extra-voices.sh +0 -0
  97. package/.claude/hooks/effects-manager.sh +0 -0
  98. package/.claude/hooks/github-star-reminder.sh +0 -0
  99. package/.claude/hooks/language-manager.sh +0 -0
  100. package/.claude/hooks/learn-manager.sh +0 -0
  101. package/.claude/hooks/macos-voice-manager.sh +0 -0
  102. package/.claude/hooks/migrate-background-music.sh +0 -0
  103. package/.claude/hooks/migrate-to-agentvibes.sh +0 -0
  104. package/.claude/hooks/optimize-background-music.sh +0 -0
  105. package/.claude/hooks/personality-manager.sh +0 -0
  106. package/.claude/hooks/piper-download-voices.sh +0 -0
  107. package/.claude/hooks/piper-installer.sh +1 -1
  108. package/.claude/hooks/piper-multispeaker-registry.sh +0 -0
  109. package/.claude/hooks/piper-voice-manager.sh +0 -0
  110. package/.claude/hooks/play-tts-enhanced.sh +0 -0
  111. package/.claude/hooks/play-tts-macos.sh +6 -12
  112. package/.claude/hooks/play-tts-piper.sh +50 -79
  113. package/.claude/hooks/play-tts-soprano.sh +9 -43
  114. package/.claude/hooks/play-tts-ssh-remote.sh +43 -215
  115. package/.claude/hooks/play-tts-termux-ssh.sh +0 -0
  116. package/.claude/hooks/play-tts.sh +31 -31
  117. package/.claude/hooks/post-response.sh +41 -0
  118. package/.claude/hooks/prepare-release.sh +0 -0
  119. package/.claude/hooks/provider-commands.sh +0 -0
  120. package/.claude/hooks/provider-manager.sh +0 -0
  121. package/.claude/hooks/replay-target-audio.sh +0 -0
  122. package/.claude/hooks/requirements.txt +6 -6
  123. package/.claude/hooks/sentiment-manager.sh +0 -0
  124. package/.claude/hooks/session-start-tts.sh +56 -39
  125. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  126. package/.claude/hooks/speed-manager.sh +0 -0
  127. package/.claude/hooks/stop.sh +63 -0
  128. package/.claude/hooks/termux-installer.sh +0 -0
  129. package/.claude/hooks/translate-manager.sh +0 -0
  130. package/.claude/hooks/translator.py +237 -237
  131. package/.claude/hooks/tts-queue-worker.sh +0 -0
  132. package/.claude/hooks/tts-queue.sh +0 -0
  133. package/.claude/hooks/verbosity-manager.sh +0 -0
  134. package/.claude/hooks/voice-manager.sh +26 -4
  135. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  136. package/.claude/hooks-windows/bmad-party-speak.ps1 +278 -278
  137. package/.claude/hooks-windows/bmad-speak.ps1 +264 -264
  138. package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -53
  139. package/.claude/hooks-windows/effects-manager.ps1 +294 -294
  140. package/.claude/hooks-windows/language-manager.ps1 +193 -193
  141. package/.claude/hooks-windows/learn-manager.ps1 +241 -241
  142. package/.claude/hooks-windows/personality-manager.ps1 +266 -266
  143. package/.claude/hooks-windows/play-tts-soprano.ps1 +5 -5
  144. package/.claude/hooks-windows/play-tts-termux-ssh.ps1 +138 -138
  145. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +164 -0
  146. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -0
  147. package/.claude/hooks-windows/play-tts.ps1 +104 -513
  148. package/.claude/hooks-windows/provider-manager.ps1 +158 -192
  149. package/.claude/hooks-windows/session-start-tts.ps1 +55 -46
  150. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  151. package/.claude/hooks-windows/speed-manager.ps1 +166 -166
  152. package/.claude/hooks-windows/voice-manager-windows.ps1 +176 -260
  153. package/.claude/output-styles/agent-vibes.md +202 -202
  154. package/.claude/personalities/angry.md +14 -14
  155. package/.claude/personalities/annoying.md +14 -14
  156. package/.claude/personalities/crass.md +14 -14
  157. package/.claude/personalities/dramatic.md +14 -14
  158. package/.claude/personalities/dry-humor.md +50 -50
  159. package/.claude/personalities/flirty.md +20 -20
  160. package/.claude/personalities/funny.md +14 -14
  161. package/.claude/personalities/grandpa.md +32 -32
  162. package/.claude/personalities/millennial.md +14 -14
  163. package/.claude/personalities/moody.md +14 -14
  164. package/.claude/personalities/normal.md +16 -16
  165. package/.claude/personalities/pirate.md +14 -14
  166. package/.claude/personalities/poetic.md +14 -14
  167. package/.claude/personalities/professional.md +14 -14
  168. package/.claude/personalities/rapper.md +55 -55
  169. package/.claude/personalities/robot.md +14 -14
  170. package/.claude/personalities/sarcastic.md +38 -38
  171. package/.claude/personalities/sassy.md +14 -14
  172. package/.claude/personalities/surfer-dude.md +14 -14
  173. package/.claude/personalities/zen.md +14 -14
  174. package/.claude/piper-voices-dir.txt +1 -0
  175. package/.claude/settings.json +25 -15
  176. package/.claude/verbosity.txt +1 -1
  177. package/.clawdbot/README.md +105 -105
  178. package/.clawdbot/skill/SKILL.md +149 -145
  179. package/.mcp.json +30 -11
  180. package/CLAUDE.md +170 -215
  181. package/README.md +206 -525
  182. package/RELEASE_NOTES.md +1132 -1976
  183. package/WINDOWS-SETUP.md +208 -208
  184. package/bin/agent-vibes +0 -0
  185. package/bin/agentvibes-voice-browser.js +64 -1289
  186. package/bin/agentvibes.js +0 -0
  187. package/bin/ensure-soprano-running.sh +43 -0
  188. package/bin/mcp-server.js +121 -121
  189. package/bin/mcp-server.sh +0 -0
  190. package/bin/test-bmad-pr +78 -78
  191. package/mcp-server/QUICK_START.md +203 -203
  192. package/mcp-server/README.md +345 -345
  193. package/mcp-server/WINDOWS_SETUP.md +260 -260
  194. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  195. package/mcp-server/examples/claude_desktop_config.json +11 -11
  196. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  197. package/mcp-server/examples/custom_instructions.md +169 -169
  198. package/mcp-server/install-deps.js +130 -130
  199. package/mcp-server/pyproject.toml +52 -52
  200. package/mcp-server/requirements.txt +2 -2
  201. package/mcp-server/server.py +1451 -1578
  202. package/mcp-server/test_server.py +395 -395
  203. package/package.json +1 -3
  204. package/setup-windows.ps1 +815 -815
  205. package/src/installer.js +42 -5
  206. package/templates/agentvibes-receiver.sh +158 -483
  207. package/templates/audio/welcome-music.mp3 +0 -0
  208. package/.agentvibes/bmad-voice-map.json +0 -104
  209. package/.agentvibes/copilot-sessions.log +0 -4
  210. package/.claude/config/audio-effects-bmad.cfg +0 -50
  211. package/.claude/config/background-music-enabled.txt +0 -1
  212. package/.claude/config/intro-text.txt +0 -1
  213. package/.claude/config/personality.txt +0 -1
  214. package/.claude/config/piper-speech-rate.txt +0 -4
  215. package/.claude/config/piper-target-speech-rate.txt +0 -1
  216. package/.claude/config/reverb-level.txt +0 -1
  217. package/.claude/config/tts-target-speech-rate.txt +0 -1
  218. package/voice-assignments.json +0 -8245
  219. /package/{.claude → .agentvibes}/config/agentvibes.json +0 -0
@@ -1,260 +1,176 @@
1
- #
2
- # File: .claude/hooks-windows/voice-manager-windows.ps1
3
- #
4
- # AgentVibes - Windows Voice Management
5
- #
6
-
7
- param(
8
- [Parameter(Position = 0)]
9
- [ValidateSet('list', 'list-simple', 'switch', 'get', 'replay')]
10
- [string]$Command = 'list',
11
-
12
- [Parameter(Position = 1)]
13
- [string]$VoiceName
14
- )
15
-
16
- $ClaudeDir = "$env:USERPROFILE\.claude"
17
- $ProviderFile = "$ClaudeDir\tts-provider.txt"
18
- $VoiceSapiFile = "$ClaudeDir\tts-voice-sapi.txt"
19
- $VoicePiperFile = "$ClaudeDir\tts-voice-piper.txt"
20
-
21
- # Get active provider
22
- $ActiveProvider = "sapi"
23
- if (Test-Path $ProviderFile) {
24
- $ActiveProvider = (Get-Content $ProviderFile -Raw).Trim()
25
- }
26
-
27
- # Get SAPI voices
28
- function Get-SAPIVoices {
29
- Add-Type -AssemblyName System.Speech
30
-
31
- $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
32
- $voices = @()
33
-
34
- foreach ($voice in $synth.GetInstalledVoices()) {
35
- $voices += $voice.VoiceInfo.Name
36
- }
37
-
38
- return $voices
39
- }
40
-
41
- # Get Piper voices (checks both global and project-local directories)
42
- function Get-PiperVoices {
43
- $GlobalVoicesDir = "$env:USERPROFILE\.claude\piper-voices"
44
- # Also check project-local .claude/piper-voices
45
- $ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
46
- $ProjectDir = Split-Path -Parent (Split-Path -Parent $ScriptPath)
47
- $ProjectVoicesDir = Join-Path $ProjectDir ".claude\piper-voices"
48
-
49
- $allVoices = @()
50
-
51
- foreach ($VoicesDir in @($GlobalVoicesDir, $ProjectVoicesDir)) {
52
- if (-not (Test-Path $VoicesDir)) {
53
- continue
54
- }
55
-
56
- $onnxFiles = Get-ChildItem -Path $VoicesDir -Filter "*.onnx" -ErrorAction SilentlyContinue
57
- foreach ($file in $onnxFiles) {
58
- $name = $file.BaseName
59
- if ($allVoices -notcontains $name) {
60
- $allVoices += $name
61
- }
62
- }
63
- }
64
-
65
- return $allVoices
66
- }
67
-
68
- # Legacy wrapper for single-dir callers
69
- function Get-PiperVoicesLegacy {
70
- $VoicesDir = "$ClaudeDir\piper-voices"
71
-
72
- if (-not (Test-Path $VoicesDir)) {
73
- return @()
74
- }
75
-
76
- $voices = @()
77
- $onnxFiles = Get-ChildItem -Path $VoicesDir -Filter "*.onnx" -ErrorAction SilentlyContinue
78
-
79
- foreach ($file in $onnxFiles) {
80
- $name = $file.BaseName
81
- $voices += $name
82
- }
83
-
84
- return $voices
85
- }
86
-
87
- # List available voices
88
- function List-Voices {
89
- Write-Host ""
90
- Write-Host "[VOICES] Available Voices by Provider" -ForegroundColor Cyan
91
- Write-Host ""
92
-
93
- # SAPI voices
94
- Write-Host "[SAPI] Windows SAPI (Built-in):" -ForegroundColor Green
95
- $sapiVoices = Get-SAPIVoices
96
-
97
- if ($sapiVoices.Count -eq 0) {
98
- Write-Host " (No voices installed)" -ForegroundColor Gray
99
- }
100
- else {
101
- $sapiVoices | ForEach-Object {
102
- $marker = if ($_ -eq (Get-CurrentVoice $VoiceSapiFile)) { "*" } else { " " }
103
- Write-Host " [$marker] $_" -ForegroundColor White
104
- }
105
- }
106
-
107
- Write-Host ""
108
-
109
- # Piper voices
110
- $PiperExe = "$env:LOCALAPPDATA\Programs\Piper\piper.exe"
111
- $piperInstalled = Test-Path $PiperExe
112
- $piperLabel = if ($piperInstalled) { "[PIPER] Piper (High Quality):" } else { "[PIPER] Piper (NOT INSTALLED - run setup-windows.ps1):" }
113
- Write-Host $piperLabel -ForegroundColor $(if ($piperInstalled) { "Green" } else { "Yellow" })
114
- $piperVoices = Get-PiperVoices
115
-
116
- if ($piperVoices.Count -eq 0) {
117
- Write-Host " (No voices downloaded - run download-piper-voices.ps1)" -ForegroundColor Gray
118
- }
119
- else {
120
- $piperVoices | ForEach-Object {
121
- $marker = if ($_ -eq (Get-CurrentVoice $VoicePiperFile)) { "*" } else { " " }
122
- Write-Host " [$marker] $_" -ForegroundColor White
123
- }
124
- }
125
-
126
- Write-Host ""
127
- Write-Host "[ACTIVE] Active Provider: $ActiveProvider" -ForegroundColor Cyan
128
- Write-Host ""
129
- }
130
-
131
- # Get current voice for provider
132
- function Get-CurrentVoice {
133
- param([string]$VoiceFile)
134
-
135
- if (Test-Path $VoiceFile) {
136
- return (Get-Content $VoiceFile -Raw).Trim()
137
- }
138
-
139
- return $null
140
- }
141
-
142
- # Switch voice
143
- function Switch-Voice {
144
- param([string]$NewVoice)
145
-
146
- # Determine which provider's voice file to update
147
- $VoiceFile = ""
148
- $ValidVoices = @()
149
-
150
- if ($ActiveProvider -eq "sapi" -or $ActiveProvider -eq "windows-sapi") {
151
- $VoiceFile = $VoiceSapiFile
152
- $ValidVoices = Get-SAPIVoices
153
- }
154
- elseif ($ActiveProvider -eq "piper" -or $ActiveProvider -eq "windows-piper") {
155
- $VoiceFile = $VoicePiperFile
156
- $ValidVoices = Get-PiperVoices
157
- }
158
- elseif ($ActiveProvider -eq "soprano") {
159
- Write-Host "[INFO] Soprano uses a single fixed voice (Soprano-1.1-80M)" -ForegroundColor Cyan
160
- return $true
161
- }
162
-
163
- if ($ValidVoices -notcontains $NewVoice) {
164
- Write-Host "[ERROR] Voice not found: $NewVoice" -ForegroundColor Red
165
- Write-Host "Available voices for ${ActiveProvider}:" -ForegroundColor Yellow
166
- $ValidVoices | ForEach-Object { Write-Host " - $_" }
167
- return $false
168
- }
169
-
170
- Set-Content -Path $VoiceFile -Value $NewVoice
171
- Write-Host "[OK] Voice set to: $NewVoice" -ForegroundColor Green
172
- return $true
173
- }
174
-
175
- # Show current voice
176
- function Show-CurrentVoice {
177
- $VoiceFile = if ($ActiveProvider -eq "sapi" -or $ActiveProvider -eq "windows-sapi") { $VoiceSapiFile } else { $VoicePiperFile }
178
- $CurrentVoice = Get-CurrentVoice $VoiceFile
179
-
180
- if ($CurrentVoice) {
181
- Write-Host "[VOICE] Current voice: $CurrentVoice ($ActiveProvider)" -ForegroundColor Cyan
182
- }
183
- else {
184
- Write-Host "[VOICE] Using default voice ($ActiveProvider)" -ForegroundColor Cyan
185
- }
186
- }
187
-
188
- # Main command routing
189
- switch ($Command) {
190
- 'list' {
191
- List-Voices
192
- }
193
-
194
- 'list-simple' {
195
- # Machine-parseable list for MCP server - one voice name per line
196
- if ($ActiveProvider -eq "windows-sapi" -or $ActiveProvider -eq "sapi") {
197
- $voices = Get-SAPIVoices
198
- foreach ($v in $voices) { Write-Output $v }
199
- }
200
- elseif ($ActiveProvider -eq "windows-piper" -or $ActiveProvider -eq "piper") {
201
- $voices = Get-PiperVoices
202
- foreach ($v in ($voices | Sort-Object)) { Write-Output $v }
203
- }
204
- elseif ($ActiveProvider -eq "soprano") {
205
- Write-Output "Soprano-1.1-80M"
206
- }
207
- else {
208
- # Fallback: try Piper voices
209
- $voices = Get-PiperVoices
210
- foreach ($v in ($voices | Sort-Object)) { Write-Output $v }
211
- }
212
- }
213
-
214
- 'switch' {
215
- if (-not $VoiceName) {
216
- Write-Host "[ERROR] Voice name required" -ForegroundColor Red
217
- List-Voices
218
- exit 1
219
- }
220
- Switch-Voice $VoiceName | Out-Null
221
- }
222
-
223
- 'get' {
224
- Show-CurrentVoice
225
- }
226
-
227
- 'replay' {
228
- $n = if ($VoiceName) { [int]$VoiceName } else { 1 }
229
- $AudioDir = Join-Path (Split-Path -Parent $ClaudeDir) ".claude\audio"
230
- if (-not (Test-Path $AudioDir)) {
231
- $AudioDir = Join-Path $ClaudeDir "audio"
232
- }
233
- # Find project-local audio dir first
234
- $ScriptClaudeDir = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)
235
- $ProjectAudioDir = Join-Path $ScriptClaudeDir "audio"
236
- if (Test-Path $ProjectAudioDir) { $AudioDir = $ProjectAudioDir }
237
-
238
- $recentFiles = Get-ChildItem -Path $AudioDir -Filter "tts-*.wav" -ErrorAction SilentlyContinue |
239
- Sort-Object LastWriteTime -Descending | Select-Object -First 10
240
-
241
- if (-not $recentFiles -or $recentFiles.Count -eq 0) {
242
- Write-Output "No recent audio files found"
243
- exit 1
244
- }
245
-
246
- if ($n -gt $recentFiles.Count) {
247
- Write-Output "Only $($recentFiles.Count) recent files available (requested #$n)"
248
- exit 1
249
- }
250
-
251
- $targetFile = $recentFiles[$n - 1]
252
- Write-Output "Replaying: $($targetFile.Name)"
253
-
254
- # Play using SoundPlayer
255
- Add-Type -AssemblyName System.Media
256
- $player = New-Object System.Media.SoundPlayer $targetFile.FullName
257
- $player.PlaySync()
258
- $player.Dispose()
259
- }
260
- }
1
+ #
2
+ # File: .claude/hooks-windows/voice-manager-windows.ps1
3
+ #
4
+ # AgentVibes - Windows Voice Management
5
+ #
6
+
7
+ param(
8
+ [Parameter(Position = 0)]
9
+ [ValidateSet('list', 'switch', 'get')]
10
+ [string]$Command = 'list',
11
+
12
+ [Parameter(Position = 1)]
13
+ [string]$VoiceName
14
+ )
15
+
16
+ $ClaudeDir = "$env:USERPROFILE\.claude"
17
+ $ProviderFile = "$ClaudeDir\tts-provider.txt"
18
+ $VoiceSapiFile = "$ClaudeDir\tts-voice-sapi.txt"
19
+ $VoicePiperFile = "$ClaudeDir\tts-voice-piper.txt"
20
+
21
+ # Get active provider
22
+ $ActiveProvider = "windows-sapi"
23
+ if (Test-Path $ProviderFile) {
24
+ $ActiveProvider = (Get-Content $ProviderFile -Raw).Trim()
25
+ }
26
+
27
+ # Get SAPI voices
28
+ function Get-SAPIVoices {
29
+ Add-Type -AssemblyName System.Speech
30
+
31
+ $synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
32
+ $voices = @()
33
+
34
+ foreach ($voice in $synth.GetInstalledVoices()) {
35
+ $voices += $voice.VoiceInfo.Name
36
+ }
37
+
38
+ return $voices
39
+ }
40
+
41
+ # Get Piper voices
42
+ function Get-PiperVoices {
43
+ $VoicesDir = "$ClaudeDir\piper-voices"
44
+
45
+ if (-not (Test-Path $VoicesDir)) {
46
+ return @()
47
+ }
48
+
49
+ $voices = @()
50
+ $onnxFiles = Get-ChildItem -Path $VoicesDir -Filter "*.onnx" -ErrorAction SilentlyContinue
51
+
52
+ foreach ($file in $onnxFiles) {
53
+ $name = $file.BaseName
54
+ $voices += $name
55
+ }
56
+
57
+ return $voices
58
+ }
59
+
60
+ # List available voices
61
+ function List-Voices {
62
+ Write-Host ""
63
+ Write-Host "[VOICES] Available Voices by Provider" -ForegroundColor Cyan
64
+ Write-Host ""
65
+
66
+ # SAPI voices
67
+ Write-Host "[SAPI] Windows SAPI (Built-in):" -ForegroundColor Green
68
+ $sapiVoices = Get-SAPIVoices
69
+
70
+ if ($sapiVoices.Count -eq 0) {
71
+ Write-Host " (No voices installed)" -ForegroundColor Gray
72
+ }
73
+ else {
74
+ $sapiVoices | ForEach-Object {
75
+ $marker = if ($_ -eq (Get-CurrentVoice $VoiceSapiFile)) { "*" } else { " " }
76
+ Write-Host " [$marker] $_" -ForegroundColor White
77
+ }
78
+ }
79
+
80
+ Write-Host ""
81
+
82
+ # Piper voices
83
+ Write-Host "[PIPER] Piper (High Quality):" -ForegroundColor Green
84
+ $piperVoices = Get-PiperVoices
85
+
86
+ if ($piperVoices.Count -eq 0) {
87
+ Write-Host " (No voices downloaded - run setup-windows.ps1)" -ForegroundColor Gray
88
+ }
89
+ else {
90
+ $piperVoices | ForEach-Object {
91
+ $marker = if ($_ -eq (Get-CurrentVoice $VoicePiperFile)) { "*" } else { " " }
92
+ Write-Host " [$marker] $_" -ForegroundColor White
93
+ }
94
+ }
95
+
96
+ Write-Host ""
97
+ Write-Host "[ACTIVE] Active Provider: $ActiveProvider" -ForegroundColor Cyan
98
+ Write-Host ""
99
+ }
100
+
101
+ # Get current voice for provider
102
+ function Get-CurrentVoice {
103
+ param([string]$VoiceFile)
104
+
105
+ if (Test-Path $VoiceFile) {
106
+ return (Get-Content $VoiceFile -Raw).Trim()
107
+ }
108
+
109
+ return $null
110
+ }
111
+
112
+ # Switch voice
113
+ function Switch-Voice {
114
+ param([string]$NewVoice)
115
+
116
+ # Determine which provider's voice file to update
117
+ $VoiceFile = ""
118
+ $ValidVoices = @()
119
+
120
+ if ($ActiveProvider -eq "windows-sapi") {
121
+ $VoiceFile = $VoiceSapiFile
122
+ $ValidVoices = Get-SAPIVoices
123
+ }
124
+ elseif ($ActiveProvider -eq "windows-piper") {
125
+ $VoiceFile = $VoicePiperFile
126
+ $ValidVoices = Get-PiperVoices
127
+ }
128
+ elseif ($ActiveProvider -eq "soprano") {
129
+ Write-Host "[INFO] Soprano uses a single fixed voice (Soprano-1.1-80M)" -ForegroundColor Cyan
130
+ return $true
131
+ }
132
+
133
+ if ($ValidVoices -notcontains $NewVoice) {
134
+ Write-Host "[ERROR] Voice not found: $NewVoice" -ForegroundColor Red
135
+ Write-Host "Available voices for ${ActiveProvider}:" -ForegroundColor Yellow
136
+ $ValidVoices | ForEach-Object { Write-Host " - $_" }
137
+ return $false
138
+ }
139
+
140
+ Set-Content -Path $VoiceFile -Value $NewVoice
141
+ Write-Host "[OK] Voice set to: $NewVoice" -ForegroundColor Green
142
+ return $true
143
+ }
144
+
145
+ # Show current voice
146
+ function Show-CurrentVoice {
147
+ $VoiceFile = if ($ActiveProvider -eq "windows-sapi") { $VoiceSapiFile } else { $VoicePiperFile }
148
+ $CurrentVoice = Get-CurrentVoice $VoiceFile
149
+
150
+ if ($CurrentVoice) {
151
+ Write-Host "[VOICE] Current voice: $CurrentVoice ($ActiveProvider)" -ForegroundColor Cyan
152
+ }
153
+ else {
154
+ Write-Host "[VOICE] Using default voice ($ActiveProvider)" -ForegroundColor Cyan
155
+ }
156
+ }
157
+
158
+ # Main command routing
159
+ switch ($Command) {
160
+ 'list' {
161
+ List-Voices
162
+ }
163
+
164
+ 'switch' {
165
+ if (-not $VoiceName) {
166
+ Write-Host "[ERROR] Voice name required" -ForegroundColor Red
167
+ List-Voices
168
+ exit 1
169
+ }
170
+ Switch-Voice $VoiceName | Out-Null
171
+ }
172
+
173
+ 'get' {
174
+ Show-CurrentVoice
175
+ }
176
+ }