agentvibes 5.3.0 → 5.5.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 (222) 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 +16 -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-party-speak.sh +0 -0
  88. package/.claude/hooks/bmad-speak-enhanced.sh +0 -0
  89. package/.claude/hooks/bmad-speak.sh +12 -15
  90. package/.claude/hooks/bmad-tts-injector.sh +0 -0
  91. package/.claude/hooks/bmad-voice-manager.sh +0 -0
  92. package/.claude/hooks/clawdbot-receiver-SECURE.sh +25 -23
  93. package/.claude/hooks/clawdbot-receiver.sh +4 -28
  94. package/.claude/hooks/clean-audio-cache.sh +0 -0
  95. package/.claude/hooks/cleanup-cache.sh +0 -0
  96. package/.claude/hooks/configure-rdp-mode.sh +0 -0
  97. package/.claude/hooks/download-extra-voices.sh +0 -0
  98. package/.claude/hooks/effects-manager.sh +0 -0
  99. package/.claude/hooks/github-star-reminder.sh +0 -0
  100. package/.claude/hooks/language-manager.sh +0 -0
  101. package/.claude/hooks/learn-manager.sh +0 -0
  102. package/.claude/hooks/macos-voice-manager.sh +0 -0
  103. package/.claude/hooks/migrate-background-music.sh +0 -0
  104. package/.claude/hooks/migrate-to-agentvibes.sh +0 -0
  105. package/.claude/hooks/optimize-background-music.sh +0 -0
  106. package/.claude/hooks/personality-manager.sh +0 -0
  107. package/.claude/hooks/piper-download-voices.sh +0 -0
  108. package/.claude/hooks/piper-installer.sh +1 -1
  109. package/.claude/hooks/piper-multispeaker-registry.sh +0 -0
  110. package/.claude/hooks/piper-voice-manager.sh +0 -0
  111. package/.claude/hooks/play-tts-enhanced.sh +0 -0
  112. package/.claude/hooks/play-tts-macos.sh +6 -12
  113. package/.claude/hooks/play-tts-piper.sh +52 -81
  114. package/.claude/hooks/play-tts-soprano.sh +9 -43
  115. package/.claude/hooks/play-tts-ssh-remote.sh +43 -215
  116. package/.claude/hooks/play-tts-termux-ssh.sh +0 -0
  117. package/.claude/hooks/play-tts.sh +41 -20
  118. package/.claude/hooks/post-response.sh +41 -0
  119. package/.claude/hooks/prepare-release.sh +0 -0
  120. package/.claude/hooks/provider-commands.sh +0 -0
  121. package/.claude/hooks/provider-manager.sh +0 -0
  122. package/.claude/hooks/replay-target-audio.sh +0 -0
  123. package/.claude/hooks/requirements.txt +6 -6
  124. package/.claude/hooks/sentiment-manager.sh +0 -0
  125. package/.claude/hooks/session-start-tts.sh +56 -39
  126. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  127. package/.claude/hooks/speed-manager.sh +0 -0
  128. package/.claude/hooks/stop.sh +63 -0
  129. package/.claude/hooks/termux-installer.sh +0 -0
  130. package/.claude/hooks/translate-manager.sh +0 -0
  131. package/.claude/hooks/translator.py +237 -237
  132. package/.claude/hooks/tts-queue-worker.sh +0 -0
  133. package/.claude/hooks/tts-queue.sh +0 -0
  134. package/.claude/hooks/verbosity-manager.sh +0 -0
  135. package/.claude/hooks/voice-manager.sh +26 -4
  136. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  137. package/.claude/hooks-windows/bmad-party-speak.ps1 +278 -278
  138. package/.claude/hooks-windows/bmad-speak.ps1 +264 -264
  139. package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -53
  140. package/.claude/hooks-windows/effects-manager.ps1 +294 -294
  141. package/.claude/hooks-windows/language-manager.ps1 +193 -193
  142. package/.claude/hooks-windows/learn-manager.ps1 +241 -241
  143. package/.claude/hooks-windows/personality-manager.ps1 +266 -266
  144. package/.claude/hooks-windows/play-tts-soprano.ps1 +5 -5
  145. package/.claude/hooks-windows/play-tts-termux-ssh.ps1 +138 -138
  146. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +178 -0
  147. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -0
  148. package/.claude/hooks-windows/play-tts.ps1 +265 -507
  149. package/.claude/hooks-windows/provider-manager.ps1 +158 -192
  150. package/.claude/hooks-windows/session-start-tts.ps1 +55 -46
  151. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  152. package/.claude/hooks-windows/speed-manager.ps1 +166 -166
  153. package/.claude/hooks-windows/voice-manager-windows.ps1 +176 -260
  154. package/.claude/output-styles/agent-vibes.md +202 -202
  155. package/.claude/personalities/angry.md +14 -14
  156. package/.claude/personalities/annoying.md +14 -14
  157. package/.claude/personalities/crass.md +14 -14
  158. package/.claude/personalities/dramatic.md +14 -14
  159. package/.claude/personalities/dry-humor.md +50 -50
  160. package/.claude/personalities/flirty.md +20 -20
  161. package/.claude/personalities/funny.md +14 -14
  162. package/.claude/personalities/grandpa.md +32 -32
  163. package/.claude/personalities/millennial.md +14 -14
  164. package/.claude/personalities/moody.md +14 -14
  165. package/.claude/personalities/normal.md +16 -16
  166. package/.claude/personalities/pirate.md +14 -14
  167. package/.claude/personalities/poetic.md +14 -14
  168. package/.claude/personalities/professional.md +14 -14
  169. package/.claude/personalities/rapper.md +55 -55
  170. package/.claude/personalities/robot.md +14 -14
  171. package/.claude/personalities/sarcastic.md +38 -38
  172. package/.claude/personalities/sassy.md +14 -14
  173. package/.claude/personalities/surfer-dude.md +14 -14
  174. package/.claude/personalities/zen.md +14 -14
  175. package/.claude/piper-voices-dir.txt +1 -0
  176. package/.claude/settings.json +25 -15
  177. package/.claude/verbosity.txt +1 -1
  178. package/.clawdbot/README.md +105 -105
  179. package/.clawdbot/skill/SKILL.md +149 -145
  180. package/.mcp.json +30 -11
  181. package/CLAUDE.md +170 -215
  182. package/README.md +207 -521
  183. package/RELEASE_NOTES.md +1172 -1976
  184. package/WINDOWS-SETUP.md +208 -208
  185. package/bin/agent-vibes +0 -0
  186. package/bin/agentvibes-voice-browser.js +64 -1289
  187. package/bin/agentvibes.js +28 -0
  188. package/bin/ensure-soprano-running.sh +43 -0
  189. package/bin/mcp-server.js +121 -121
  190. package/bin/mcp-server.sh +0 -0
  191. package/bin/test-bmad-pr +78 -78
  192. package/mcp-server/QUICK_START.md +203 -203
  193. package/mcp-server/README.md +345 -345
  194. package/mcp-server/WINDOWS_SETUP.md +260 -260
  195. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  196. package/mcp-server/examples/claude_desktop_config.json +11 -11
  197. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  198. package/mcp-server/examples/custom_instructions.md +169 -169
  199. package/mcp-server/install-deps.js +130 -130
  200. package/mcp-server/pyproject.toml +52 -52
  201. package/mcp-server/requirements.txt +2 -2
  202. package/mcp-server/server.py +1467 -1578
  203. package/mcp-server/test_server.py +395 -395
  204. package/package.json +1 -3
  205. package/setup-windows.ps1 +815 -815
  206. package/src/console/tabs/music-tab.js +5 -2
  207. package/src/console/tabs/voices-tab.js +71 -37
  208. package/src/installer.js +52 -5
  209. package/src/services/llm-provider-service.js +1 -1
  210. package/templates/agentvibes-receiver.sh +158 -483
  211. package/templates/audio/welcome-music.mp3 +0 -0
  212. package/.agentvibes/bmad-voice-map.json +0 -104
  213. package/.agentvibes/copilot-sessions.log +0 -4
  214. package/.claude/config/audio-effects-bmad.cfg +0 -50
  215. package/.claude/config/intro-text.txt +0 -1
  216. package/.claude/config/personality.txt +0 -1
  217. package/.claude/config/piper-speech-rate.txt +0 -4
  218. package/.claude/config/piper-target-speech-rate.txt +0 -1
  219. package/.claude/config/reverb-level.txt +0 -1
  220. package/.claude/config/tts-target-speech-rate.txt +0 -1
  221. package/voice-assignments.json +0 -8245
  222. /package/{.claude → .agentvibes}/config/agentvibes.json +0 -0
@@ -1,193 +1,193 @@
1
- #
2
- # File: .claude/hooks-windows/language-manager.ps1
3
- #
4
- # AgentVibes - Finally, your AI Agents can Talk Back!
5
- # Website: https://agentvibes.org
6
- # Copyright (c) 2025 Paul Preibisch
7
- # Licensed under the Apache License, Version 2.0
8
-
9
- param(
10
- [Parameter(Position=0)]
11
- [string]$Command = "help",
12
- [Parameter(Position=1)]
13
- [string]$Arg1 = "",
14
- [Parameter(Position=2)]
15
- [string]$Arg2 = ""
16
- )
17
-
18
- $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
19
- $ClaudeDir = Split-Path -Parent $ScriptDir
20
-
21
- # Determine config directory
22
- if ($env:CLAUDE_PROJECT_DIR -and (Test-Path "$env:CLAUDE_PROJECT_DIR\.claude")) {
23
- $ConfigClaudeDir = Join-Path $env:CLAUDE_PROJECT_DIR ".claude"
24
- } else {
25
- $ConfigClaudeDir = $ClaudeDir
26
- }
27
-
28
- $LanguageFile = Join-Path $ConfigClaudeDir "tts-language.txt"
29
- if (-not (Test-Path $ConfigClaudeDir)) { New-Item -ItemType Directory -Path $ConfigClaudeDir -Force | Out-Null }
30
-
31
- # Language to Piper voice mapping
32
- $PiperVoices = @{
33
- "spanish" = "es_ES-davefx-medium"
34
- "french" = "fr_FR-siwis-medium"
35
- "german" = "de_DE-thorsten-medium"
36
- "italian" = "it_IT-riccardo-x_low"
37
- "portuguese" = "pt_BR-faber-medium"
38
- "chinese" = "zh_CN-huayan-medium"
39
- "japanese" = "ja_JP-hikari-medium"
40
- "korean" = "ko_KR-eunyoung-medium"
41
- "russian" = "ru_RU-dmitri-medium"
42
- "polish" = "pl_PL-darkman-medium"
43
- "dutch" = "nl_NL-rdh-medium"
44
- "turkish" = "tr_TR-dfki-medium"
45
- "arabic" = "ar_JO-kareem-medium"
46
- "hindi" = "hi_IN-amitabh-medium"
47
- "swedish" = "sv_SE-nst-medium"
48
- "danish" = "da_DK-talesyntese-medium"
49
- "norwegian" = "no_NO-talesyntese-medium"
50
- "finnish" = "fi_FI-harri-medium"
51
- "czech" = "cs_CZ-jirka-medium"
52
- "romanian" = "ro_RO-mihai-medium"
53
- "ukrainian" = "uk_UA-lada-x_low"
54
- "greek" = "el_GR-rapunzelina-low"
55
- "bulgarian" = "bg_BG-valentin-medium"
56
- "croatian" = "hr_HR-gorana-medium"
57
- "slovak" = "sk_SK-lili-medium"
58
- }
59
-
60
- $SupportedLanguages = ($PiperVoices.Keys | Sort-Object) -join ", "
61
-
62
- function Get-PiperVoiceForLanguage {
63
- param([string]$Lang)
64
- $lang = $Lang.ToLower()
65
- if ($PiperVoices.ContainsKey($lang)) { return $PiperVoices[$lang] }
66
- return ""
67
- }
68
-
69
- function Get-ActiveProvider {
70
- $provFile = Join-Path $ConfigClaudeDir "tts-provider.txt"
71
- if (-not (Test-Path $provFile)) {
72
- $provFile = Join-Path $env:USERPROFILE ".claude\tts-provider.txt"
73
- }
74
- if (Test-Path $provFile) { return (Get-Content $provFile -Raw).Trim() }
75
- return "piper"
76
- }
77
-
78
- switch ($Command) {
79
- "set" {
80
- if (-not $Arg1) {
81
- Write-Output "Usage: language-manager.ps1 set <language>"
82
- exit 1
83
- }
84
-
85
- $lang = $Arg1.ToLower()
86
-
87
- # Handle reset/english
88
- if ($lang -in @("reset", "english", "en")) {
89
- if (Test-Path $LanguageFile) {
90
- Remove-Item $LanguageFile -Force
91
- Write-Output "Language reset to English (default)"
92
- } else {
93
- Write-Output "Already using English (default)"
94
- }
95
- exit 0
96
- }
97
-
98
- # Validate language
99
- if (-not $PiperVoices.ContainsKey($lang)) {
100
- Write-Output "Language '$lang' not supported"
101
- Write-Output ""
102
- Write-Output "Supported languages:"
103
- Write-Output $SupportedLanguages
104
- exit 1
105
- }
106
-
107
- # Save language
108
- Set-Content -Path $LanguageFile -Value $lang -NoNewline
109
-
110
- $provider = Get-ActiveProvider
111
- $recommendedVoice = Get-PiperVoiceForLanguage $lang
112
-
113
- Write-Output "Language set to: $lang"
114
- Write-Output "Recommended voice for $provider TTS: $recommendedVoice"
115
- Write-Output ""
116
- Write-Output "TTS will now speak in $lang."
117
- Write-Output "Switch voice with: /agent-vibes:switch `"$recommendedVoice`""
118
- }
119
-
120
- "get" {
121
- if (Test-Path $LanguageFile) {
122
- $lang = (Get-Content $LanguageFile -Raw).Trim()
123
- $provider = Get-ActiveProvider
124
- $recommendedVoice = Get-PiperVoiceForLanguage $lang
125
-
126
- Write-Output "Current language: $lang"
127
- if ($recommendedVoice) {
128
- Write-Output "Recommended voice ($provider): $recommendedVoice"
129
- }
130
- } else {
131
- Write-Output "Current language: english (default)"
132
- Write-Output "No multilingual voice required"
133
- }
134
- }
135
-
136
- "code" {
137
- if (Test-Path $LanguageFile) {
138
- Write-Output (Get-Content $LanguageFile -Raw).Trim()
139
- } else {
140
- Write-Output "english"
141
- }
142
- }
143
-
144
- "check-voice" {
145
- if (-not $Arg1) {
146
- Write-Output "Usage: language-manager.ps1 check-voice <voice-name>"
147
- exit 1
148
- }
149
- $multilingual = @("Antoni", "Rachel", "Domi", "Bella", "Charlotte", "Matilda")
150
- if ($Arg1 -in $multilingual) { Write-Output "yes" } else { Write-Output "no" }
151
- }
152
-
153
- "best-voice" {
154
- $lang = "english"
155
- if (Test-Path $LanguageFile) { $lang = (Get-Content $LanguageFile -Raw).Trim() }
156
- if ($lang -eq "english") {
157
- Write-Output ""
158
- } else {
159
- Write-Output (Get-PiperVoiceForLanguage $lang)
160
- }
161
- }
162
-
163
- "voice-for-language" {
164
- if (-not $Arg1) {
165
- Write-Output "Usage: language-manager.ps1 voice-for-language <language> [provider]"
166
- exit 1
167
- }
168
- Write-Output (Get-PiperVoiceForLanguage $Arg1.ToLower())
169
- }
170
-
171
- "list" {
172
- Write-Output "Supported languages and recommended voices:"
173
- Write-Output ""
174
- foreach ($lang in ($PiperVoices.Keys | Sort-Object)) {
175
- $voice = $PiperVoices[$lang]
176
- Write-Output ("{0,-15} -> {1}" -f $lang, $voice)
177
- }
178
- }
179
-
180
- default {
181
- Write-Output "AgentVibes Language Manager"
182
- Write-Output ""
183
- Write-Output "Usage:"
184
- Write-Output " language-manager.ps1 set <language> Set language"
185
- Write-Output " language-manager.ps1 get Get current language"
186
- Write-Output " language-manager.ps1 code Get language code only"
187
- Write-Output " language-manager.ps1 check-voice <name> Check if voice is multilingual"
188
- Write-Output " language-manager.ps1 best-voice Get best voice for current language"
189
- Write-Output " language-manager.ps1 voice-for-language <lang> Get voice for language"
190
- Write-Output " language-manager.ps1 list List all supported languages"
191
- exit 1
192
- }
193
- }
1
+ #
2
+ # File: .claude/hooks-windows/language-manager.ps1
3
+ #
4
+ # AgentVibes - Finally, your AI Agents can Talk Back!
5
+ # Website: https://agentvibes.org
6
+ # Copyright (c) 2025 Paul Preibisch
7
+ # Licensed under the Apache License, Version 2.0
8
+
9
+ param(
10
+ [Parameter(Position=0)]
11
+ [string]$Command = "help",
12
+ [Parameter(Position=1)]
13
+ [string]$Arg1 = "",
14
+ [Parameter(Position=2)]
15
+ [string]$Arg2 = ""
16
+ )
17
+
18
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
19
+ $ClaudeDir = Split-Path -Parent $ScriptDir
20
+
21
+ # Determine config directory
22
+ if ($env:CLAUDE_PROJECT_DIR -and (Test-Path "$env:CLAUDE_PROJECT_DIR\.claude")) {
23
+ $ConfigClaudeDir = Join-Path $env:CLAUDE_PROJECT_DIR ".claude"
24
+ } else {
25
+ $ConfigClaudeDir = $ClaudeDir
26
+ }
27
+
28
+ $LanguageFile = Join-Path $ConfigClaudeDir "tts-language.txt"
29
+ if (-not (Test-Path $ConfigClaudeDir)) { New-Item -ItemType Directory -Path $ConfigClaudeDir -Force | Out-Null }
30
+
31
+ # Language to Piper voice mapping
32
+ $PiperVoices = @{
33
+ "spanish" = "es_ES-davefx-medium"
34
+ "french" = "fr_FR-siwis-medium"
35
+ "german" = "de_DE-thorsten-medium"
36
+ "italian" = "it_IT-riccardo-x_low"
37
+ "portuguese" = "pt_BR-faber-medium"
38
+ "chinese" = "zh_CN-huayan-medium"
39
+ "japanese" = "ja_JP-hikari-medium"
40
+ "korean" = "ko_KR-eunyoung-medium"
41
+ "russian" = "ru_RU-dmitri-medium"
42
+ "polish" = "pl_PL-darkman-medium"
43
+ "dutch" = "nl_NL-rdh-medium"
44
+ "turkish" = "tr_TR-dfki-medium"
45
+ "arabic" = "ar_JO-kareem-medium"
46
+ "hindi" = "hi_IN-amitabh-medium"
47
+ "swedish" = "sv_SE-nst-medium"
48
+ "danish" = "da_DK-talesyntese-medium"
49
+ "norwegian" = "no_NO-talesyntese-medium"
50
+ "finnish" = "fi_FI-harri-medium"
51
+ "czech" = "cs_CZ-jirka-medium"
52
+ "romanian" = "ro_RO-mihai-medium"
53
+ "ukrainian" = "uk_UA-lada-x_low"
54
+ "greek" = "el_GR-rapunzelina-low"
55
+ "bulgarian" = "bg_BG-valentin-medium"
56
+ "croatian" = "hr_HR-gorana-medium"
57
+ "slovak" = "sk_SK-lili-medium"
58
+ }
59
+
60
+ $SupportedLanguages = ($PiperVoices.Keys | Sort-Object) -join ", "
61
+
62
+ function Get-PiperVoiceForLanguage {
63
+ param([string]$Lang)
64
+ $lang = $Lang.ToLower()
65
+ if ($PiperVoices.ContainsKey($lang)) { return $PiperVoices[$lang] }
66
+ return ""
67
+ }
68
+
69
+ function Get-ActiveProvider {
70
+ $provFile = Join-Path $ConfigClaudeDir "tts-provider.txt"
71
+ if (-not (Test-Path $provFile)) {
72
+ $provFile = Join-Path $env:USERPROFILE ".claude\tts-provider.txt"
73
+ }
74
+ if (Test-Path $provFile) { return (Get-Content $provFile -Raw).Trim() }
75
+ return "piper"
76
+ }
77
+
78
+ switch ($Command) {
79
+ "set" {
80
+ if (-not $Arg1) {
81
+ Write-Output "Usage: language-manager.ps1 set <language>"
82
+ exit 1
83
+ }
84
+
85
+ $lang = $Arg1.ToLower()
86
+
87
+ # Handle reset/english
88
+ if ($lang -in @("reset", "english", "en")) {
89
+ if (Test-Path $LanguageFile) {
90
+ Remove-Item $LanguageFile -Force
91
+ Write-Output "Language reset to English (default)"
92
+ } else {
93
+ Write-Output "Already using English (default)"
94
+ }
95
+ exit 0
96
+ }
97
+
98
+ # Validate language
99
+ if (-not $PiperVoices.ContainsKey($lang)) {
100
+ Write-Output "Language '$lang' not supported"
101
+ Write-Output ""
102
+ Write-Output "Supported languages:"
103
+ Write-Output $SupportedLanguages
104
+ exit 1
105
+ }
106
+
107
+ # Save language
108
+ Set-Content -Path $LanguageFile -Value $lang -NoNewline
109
+
110
+ $provider = Get-ActiveProvider
111
+ $recommendedVoice = Get-PiperVoiceForLanguage $lang
112
+
113
+ Write-Output "Language set to: $lang"
114
+ Write-Output "Recommended voice for $provider TTS: $recommendedVoice"
115
+ Write-Output ""
116
+ Write-Output "TTS will now speak in $lang."
117
+ Write-Output "Switch voice with: /agent-vibes:switch `"$recommendedVoice`""
118
+ }
119
+
120
+ "get" {
121
+ if (Test-Path $LanguageFile) {
122
+ $lang = (Get-Content $LanguageFile -Raw).Trim()
123
+ $provider = Get-ActiveProvider
124
+ $recommendedVoice = Get-PiperVoiceForLanguage $lang
125
+
126
+ Write-Output "Current language: $lang"
127
+ if ($recommendedVoice) {
128
+ Write-Output "Recommended voice ($provider): $recommendedVoice"
129
+ }
130
+ } else {
131
+ Write-Output "Current language: english (default)"
132
+ Write-Output "No multilingual voice required"
133
+ }
134
+ }
135
+
136
+ "code" {
137
+ if (Test-Path $LanguageFile) {
138
+ Write-Output (Get-Content $LanguageFile -Raw).Trim()
139
+ } else {
140
+ Write-Output "english"
141
+ }
142
+ }
143
+
144
+ "check-voice" {
145
+ if (-not $Arg1) {
146
+ Write-Output "Usage: language-manager.ps1 check-voice <voice-name>"
147
+ exit 1
148
+ }
149
+ $multilingual = @("Antoni", "Rachel", "Domi", "Bella", "Charlotte", "Matilda")
150
+ if ($Arg1 -in $multilingual) { Write-Output "yes" } else { Write-Output "no" }
151
+ }
152
+
153
+ "best-voice" {
154
+ $lang = "english"
155
+ if (Test-Path $LanguageFile) { $lang = (Get-Content $LanguageFile -Raw).Trim() }
156
+ if ($lang -eq "english") {
157
+ Write-Output ""
158
+ } else {
159
+ Write-Output (Get-PiperVoiceForLanguage $lang)
160
+ }
161
+ }
162
+
163
+ "voice-for-language" {
164
+ if (-not $Arg1) {
165
+ Write-Output "Usage: language-manager.ps1 voice-for-language <language> [provider]"
166
+ exit 1
167
+ }
168
+ Write-Output (Get-PiperVoiceForLanguage $Arg1.ToLower())
169
+ }
170
+
171
+ "list" {
172
+ Write-Output "Supported languages and recommended voices:"
173
+ Write-Output ""
174
+ foreach ($lang in ($PiperVoices.Keys | Sort-Object)) {
175
+ $voice = $PiperVoices[$lang]
176
+ Write-Output ("{0,-15} -> {1}" -f $lang, $voice)
177
+ }
178
+ }
179
+
180
+ default {
181
+ Write-Output "AgentVibes Language Manager"
182
+ Write-Output ""
183
+ Write-Output "Usage:"
184
+ Write-Output " language-manager.ps1 set <language> Set language"
185
+ Write-Output " language-manager.ps1 get Get current language"
186
+ Write-Output " language-manager.ps1 code Get language code only"
187
+ Write-Output " language-manager.ps1 check-voice <name> Check if voice is multilingual"
188
+ Write-Output " language-manager.ps1 best-voice Get best voice for current language"
189
+ Write-Output " language-manager.ps1 voice-for-language <lang> Get voice for language"
190
+ Write-Output " language-manager.ps1 list List all supported languages"
191
+ exit 1
192
+ }
193
+ }