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,241 +1,241 @@
1
- #
2
- # File: .claude/hooks-windows/learn-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
- )
15
-
16
- $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
17
- $ClaudeDir = Split-Path -Parent $ScriptDir
18
-
19
- # Determine project directory
20
- if (Test-Path (Join-Path $PWD ".claude")) {
21
- $ProjectDir = $PWD.Path
22
- } else {
23
- $ProjectDir = Split-Path -Parent $ClaudeDir
24
- }
25
-
26
- $ProjectClaude = Join-Path $ProjectDir ".claude"
27
- $GlobalClaude = Join-Path $env:USERPROFILE ".claude"
28
-
29
- # Config files (project-local first)
30
- $MainLangFile = Join-Path $ProjectClaude "tts-main-language.txt"
31
- $TargetLangFile = Join-Path $ProjectClaude "tts-target-language.txt"
32
- $TargetVoiceFile = Join-Path $ProjectClaude "tts-target-voice.txt"
33
- $LearnModeFile = Join-Path $ProjectClaude "tts-learn-mode.txt"
34
-
35
- # Global fallbacks
36
- $GlobalMainLangFile = Join-Path $GlobalClaude "tts-main-language.txt"
37
- $GlobalTargetLangFile = Join-Path $GlobalClaude "tts-target-language.txt"
38
- $GlobalTargetVoiceFile = Join-Path $GlobalClaude "tts-target-voice.txt"
39
- $GlobalLearnModeFile = Join-Path $GlobalClaude "tts-learn-mode.txt"
40
-
41
- function Get-MainLanguage {
42
- if (Test-Path $MainLangFile) { return (Get-Content $MainLangFile -Raw).Trim() }
43
- if (Test-Path $GlobalMainLangFile) { return (Get-Content $GlobalMainLangFile -Raw).Trim() }
44
- return "english"
45
- }
46
-
47
- function Get-TargetLanguage {
48
- if (Test-Path $TargetLangFile) { return (Get-Content $TargetLangFile -Raw).Trim() }
49
- if (Test-Path $GlobalTargetLangFile) { return (Get-Content $GlobalTargetLangFile -Raw).Trim() }
50
- return ""
51
- }
52
-
53
- function Get-TargetVoice {
54
- if (Test-Path $TargetVoiceFile) { return (Get-Content $TargetVoiceFile -Raw).Trim() }
55
- if (Test-Path $GlobalTargetVoiceFile) { return (Get-Content $GlobalTargetVoiceFile -Raw).Trim() }
56
- return ""
57
- }
58
-
59
- function Test-LearnModeEnabled {
60
- if (Test-Path $LearnModeFile) { return (Get-Content $LearnModeFile -Raw).Trim() -eq "ON" }
61
- if (Test-Path $GlobalLearnModeFile) { return (Get-Content $GlobalLearnModeFile -Raw).Trim() -eq "ON" }
62
- return $false
63
- }
64
-
65
- function Get-GreetingForLanguage {
66
- param([string]$Language)
67
- switch ($Language.ToLower()) {
68
- "spanish" { return "Hola! Soy tu profesor de espanol. Vamos a aprender juntos!" }
69
- "french" { return "Bonjour! Je suis votre professeur de francais. Apprenons ensemble!" }
70
- "german" { return "Hallo! Ich bin dein Deutschlehrer. Lass uns zusammen lernen!" }
71
- "italian" { return "Ciao! Sono il tuo insegnante di italiano. Impariamo insieme!" }
72
- "portuguese" { return "Ola! Sou seu professor de portugues. Vamos aprender juntos!" }
73
- "chinese" { return "Hello! I am your Chinese language teacher. Let us learn together!" }
74
- "japanese" { return "Hello! I am your Japanese language teacher. Let us learn together!" }
75
- "korean" { return "Hello! I am your Korean language teacher. Let us learn together!" }
76
- "russian" { return "Hello! I am your Russian language teacher. Let us learn together!" }
77
- "dutch" { return "Hallo! Ik ben je Nederlandse leraar. Laten we samen leren!" }
78
- "polish" { return "Czesc! Jestem twoim nauczycielem polskiego. Uczmy sie razem!" }
79
- "turkish" { return "Merhaba! Ben Turkce ogretmeninizim. Birlikte ogrenelim!" }
80
- "swedish" { return "Hej! Jag ar din svenskalarare. Lat oss lara tillsammans!" }
81
- default { return "Hello! I am your language teacher. Let us learn together!" }
82
- }
83
- }
84
-
85
- function Get-RecommendedVoice {
86
- param([string]$Language)
87
- # Try language-manager
88
- $langManager = Join-Path $ScriptDir "language-manager.ps1"
89
- if (Test-Path $langManager) {
90
- $voice = & powershell -NoProfile -ExecutionPolicy Bypass -File $langManager voice-for-language $Language 2>$null
91
- if ($voice) { return $voice.Trim() }
92
- }
93
- return ""
94
- }
95
-
96
- function Show-Status {
97
- $mainLang = Get-MainLanguage
98
- $targetLang = Get-TargetLanguage
99
- $targetVoice = Get-TargetVoice
100
- $learnMode = if (Test-LearnModeEnabled) { "ON" } else { "OFF" }
101
-
102
- Write-Output "-----------------------------------------------"
103
- Write-Output " Language Learning Mode Status"
104
- Write-Output "-----------------------------------------------"
105
- Write-Output ""
106
- Write-Output " Learning Mode: $learnMode"
107
- Write-Output " Main Language: $mainLang"
108
- Write-Output " Target Language: $(if ($targetLang) { $targetLang } else { '(not set)' })"
109
- Write-Output " Target Voice: $(if ($targetVoice) { $targetVoice } else { '(not set)' })"
110
- Write-Output ""
111
-
112
- if ($learnMode -eq "ON") {
113
- if (-not $targetLang) {
114
- Write-Output " Please set a target language: /agent-vibes:target <language>"
115
- }
116
- if (-not $targetVoice) {
117
- Write-Output " Please set a target voice: /agent-vibes:target-voice <voice>"
118
- }
119
- if ($targetLang -and $targetVoice) {
120
- Write-Output " All set! TTS will speak in both languages."
121
- Write-Output ""
122
- Write-Output " How it works:"
123
- Write-Output " 1. First: Speak in $mainLang (your current voice)"
124
- Write-Output " 2. Then: Speak in $targetLang ($targetVoice voice)"
125
- }
126
- } else {
127
- Write-Output " Enable learning mode with: /agent-vibes:learn"
128
- }
129
-
130
- Write-Output ""
131
- Write-Output "-----------------------------------------------"
132
- }
133
-
134
- # Ensure project .claude exists
135
- if (-not (Test-Path $ProjectClaude)) { New-Item -ItemType Directory -Path $ProjectClaude -Force | Out-Null }
136
-
137
- switch ($Command) {
138
- "enable" {
139
- Set-Content -Path $LearnModeFile -Value "ON" -NoNewline
140
- Write-Output "Language learning mode: ENABLED"
141
- Write-Output ""
142
-
143
- # Auto-set target voice if target language exists but voice doesn't
144
- $targetLang = Get-TargetLanguage
145
- $targetVoice = Get-TargetVoice
146
-
147
- if ($targetLang -and -not $targetVoice) {
148
- Write-Output "Auto-configuring voice for $targetLang..."
149
- $recommended = Get-RecommendedVoice $targetLang
150
- if ($recommended) {
151
- Set-Content -Path $TargetVoiceFile -Value $recommended -NoNewline
152
- $targetVoice = $recommended
153
- Write-Output "Target voice automatically set to: $recommended"
154
- Write-Output ""
155
- }
156
- }
157
-
158
- Show-Status
159
-
160
- # Greet in target language
161
- if ($targetLang -and $targetVoice) {
162
- $greeting = Get-GreetingForLanguage $targetLang
163
- Write-Output ""
164
- Write-Output "Your language teacher says: $greeting"
165
- }
166
- }
167
-
168
- "disable" {
169
- Set-Content -Path $LearnModeFile -Value "OFF" -NoNewline
170
- Write-Output "Language learning mode: DISABLED"
171
- }
172
-
173
- "status" {
174
- Show-Status
175
- }
176
-
177
- "is-enabled" {
178
- if (Test-LearnModeEnabled) {
179
- Write-Output "ON"
180
- exit 0
181
- } else {
182
- Write-Output "OFF"
183
- exit 1
184
- }
185
- }
186
-
187
- "get-main-language" {
188
- Write-Output (Get-MainLanguage)
189
- }
190
-
191
- "set-main-language" {
192
- if (-not $Arg1) {
193
- Write-Output "Usage: learn-manager.ps1 set-main-language <language>"
194
- exit 1
195
- }
196
- Set-Content -Path $MainLangFile -Value $Arg1 -NoNewline
197
- Write-Output "Main language set to: $Arg1"
198
- }
199
-
200
- "get-target-language" {
201
- Write-Output (Get-TargetLanguage)
202
- }
203
-
204
- "set-target-language" {
205
- if (-not $Arg1) {
206
- Write-Output "Usage: learn-manager.ps1 set-target-language <language>"
207
- exit 1
208
- }
209
- Set-Content -Path $TargetLangFile -Value $Arg1 -NoNewline
210
- Write-Output "Target language set to: $Arg1"
211
-
212
- # Auto-set recommended voice
213
- $recommended = Get-RecommendedVoice $Arg1
214
- if ($recommended) {
215
- Set-Content -Path $TargetVoiceFile -Value $recommended -NoNewline
216
- Write-Output "Target voice automatically set to: $recommended"
217
-
218
- $greeting = Get-GreetingForLanguage $Arg1
219
- Write-Output ""
220
- Write-Output "Your language teacher says: $greeting"
221
- }
222
- }
223
-
224
- "get-target-voice" {
225
- Write-Output (Get-TargetVoice)
226
- }
227
-
228
- "set-target-voice" {
229
- if (-not $Arg1) {
230
- Write-Output "Usage: learn-manager.ps1 set-target-voice <voice>"
231
- exit 1
232
- }
233
- Set-Content -Path $TargetVoiceFile -Value $Arg1 -NoNewline
234
- Write-Output "Target voice set to: $Arg1"
235
- }
236
-
237
- default {
238
- Write-Output "Usage: learn-manager.ps1 {enable|disable|status|is-enabled|get-main-language|set-main-language|get-target-language|set-target-language|get-target-voice|set-target-voice}"
239
- exit 1
240
- }
241
- }
1
+ #
2
+ # File: .claude/hooks-windows/learn-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
+ )
15
+
16
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
17
+ $ClaudeDir = Split-Path -Parent $ScriptDir
18
+
19
+ # Determine project directory
20
+ if (Test-Path (Join-Path $PWD ".claude")) {
21
+ $ProjectDir = $PWD.Path
22
+ } else {
23
+ $ProjectDir = Split-Path -Parent $ClaudeDir
24
+ }
25
+
26
+ $ProjectClaude = Join-Path $ProjectDir ".claude"
27
+ $GlobalClaude = Join-Path $env:USERPROFILE ".claude"
28
+
29
+ # Config files (project-local first)
30
+ $MainLangFile = Join-Path $ProjectClaude "tts-main-language.txt"
31
+ $TargetLangFile = Join-Path $ProjectClaude "tts-target-language.txt"
32
+ $TargetVoiceFile = Join-Path $ProjectClaude "tts-target-voice.txt"
33
+ $LearnModeFile = Join-Path $ProjectClaude "tts-learn-mode.txt"
34
+
35
+ # Global fallbacks
36
+ $GlobalMainLangFile = Join-Path $GlobalClaude "tts-main-language.txt"
37
+ $GlobalTargetLangFile = Join-Path $GlobalClaude "tts-target-language.txt"
38
+ $GlobalTargetVoiceFile = Join-Path $GlobalClaude "tts-target-voice.txt"
39
+ $GlobalLearnModeFile = Join-Path $GlobalClaude "tts-learn-mode.txt"
40
+
41
+ function Get-MainLanguage {
42
+ if (Test-Path $MainLangFile) { return (Get-Content $MainLangFile -Raw).Trim() }
43
+ if (Test-Path $GlobalMainLangFile) { return (Get-Content $GlobalMainLangFile -Raw).Trim() }
44
+ return "english"
45
+ }
46
+
47
+ function Get-TargetLanguage {
48
+ if (Test-Path $TargetLangFile) { return (Get-Content $TargetLangFile -Raw).Trim() }
49
+ if (Test-Path $GlobalTargetLangFile) { return (Get-Content $GlobalTargetLangFile -Raw).Trim() }
50
+ return ""
51
+ }
52
+
53
+ function Get-TargetVoice {
54
+ if (Test-Path $TargetVoiceFile) { return (Get-Content $TargetVoiceFile -Raw).Trim() }
55
+ if (Test-Path $GlobalTargetVoiceFile) { return (Get-Content $GlobalTargetVoiceFile -Raw).Trim() }
56
+ return ""
57
+ }
58
+
59
+ function Test-LearnModeEnabled {
60
+ if (Test-Path $LearnModeFile) { return (Get-Content $LearnModeFile -Raw).Trim() -eq "ON" }
61
+ if (Test-Path $GlobalLearnModeFile) { return (Get-Content $GlobalLearnModeFile -Raw).Trim() -eq "ON" }
62
+ return $false
63
+ }
64
+
65
+ function Get-GreetingForLanguage {
66
+ param([string]$Language)
67
+ switch ($Language.ToLower()) {
68
+ "spanish" { return "Hola! Soy tu profesor de espanol. Vamos a aprender juntos!" }
69
+ "french" { return "Bonjour! Je suis votre professeur de francais. Apprenons ensemble!" }
70
+ "german" { return "Hallo! Ich bin dein Deutschlehrer. Lass uns zusammen lernen!" }
71
+ "italian" { return "Ciao! Sono il tuo insegnante di italiano. Impariamo insieme!" }
72
+ "portuguese" { return "Ola! Sou seu professor de portugues. Vamos aprender juntos!" }
73
+ "chinese" { return "Hello! I am your Chinese language teacher. Let us learn together!" }
74
+ "japanese" { return "Hello! I am your Japanese language teacher. Let us learn together!" }
75
+ "korean" { return "Hello! I am your Korean language teacher. Let us learn together!" }
76
+ "russian" { return "Hello! I am your Russian language teacher. Let us learn together!" }
77
+ "dutch" { return "Hallo! Ik ben je Nederlandse leraar. Laten we samen leren!" }
78
+ "polish" { return "Czesc! Jestem twoim nauczycielem polskiego. Uczmy sie razem!" }
79
+ "turkish" { return "Merhaba! Ben Turkce ogretmeninizim. Birlikte ogrenelim!" }
80
+ "swedish" { return "Hej! Jag ar din svenskalarare. Lat oss lara tillsammans!" }
81
+ default { return "Hello! I am your language teacher. Let us learn together!" }
82
+ }
83
+ }
84
+
85
+ function Get-RecommendedVoice {
86
+ param([string]$Language)
87
+ # Try language-manager
88
+ $langManager = Join-Path $ScriptDir "language-manager.ps1"
89
+ if (Test-Path $langManager) {
90
+ $voice = & powershell -NoProfile -ExecutionPolicy Bypass -File $langManager voice-for-language $Language 2>$null
91
+ if ($voice) { return $voice.Trim() }
92
+ }
93
+ return ""
94
+ }
95
+
96
+ function Show-Status {
97
+ $mainLang = Get-MainLanguage
98
+ $targetLang = Get-TargetLanguage
99
+ $targetVoice = Get-TargetVoice
100
+ $learnMode = if (Test-LearnModeEnabled) { "ON" } else { "OFF" }
101
+
102
+ Write-Output "-----------------------------------------------"
103
+ Write-Output " Language Learning Mode Status"
104
+ Write-Output "-----------------------------------------------"
105
+ Write-Output ""
106
+ Write-Output " Learning Mode: $learnMode"
107
+ Write-Output " Main Language: $mainLang"
108
+ Write-Output " Target Language: $(if ($targetLang) { $targetLang } else { '(not set)' })"
109
+ Write-Output " Target Voice: $(if ($targetVoice) { $targetVoice } else { '(not set)' })"
110
+ Write-Output ""
111
+
112
+ if ($learnMode -eq "ON") {
113
+ if (-not $targetLang) {
114
+ Write-Output " Please set a target language: /agent-vibes:target <language>"
115
+ }
116
+ if (-not $targetVoice) {
117
+ Write-Output " Please set a target voice: /agent-vibes:target-voice <voice>"
118
+ }
119
+ if ($targetLang -and $targetVoice) {
120
+ Write-Output " All set! TTS will speak in both languages."
121
+ Write-Output ""
122
+ Write-Output " How it works:"
123
+ Write-Output " 1. First: Speak in $mainLang (your current voice)"
124
+ Write-Output " 2. Then: Speak in $targetLang ($targetVoice voice)"
125
+ }
126
+ } else {
127
+ Write-Output " Enable learning mode with: /agent-vibes:learn"
128
+ }
129
+
130
+ Write-Output ""
131
+ Write-Output "-----------------------------------------------"
132
+ }
133
+
134
+ # Ensure project .claude exists
135
+ if (-not (Test-Path $ProjectClaude)) { New-Item -ItemType Directory -Path $ProjectClaude -Force | Out-Null }
136
+
137
+ switch ($Command) {
138
+ "enable" {
139
+ Set-Content -Path $LearnModeFile -Value "ON" -NoNewline
140
+ Write-Output "Language learning mode: ENABLED"
141
+ Write-Output ""
142
+
143
+ # Auto-set target voice if target language exists but voice doesn't
144
+ $targetLang = Get-TargetLanguage
145
+ $targetVoice = Get-TargetVoice
146
+
147
+ if ($targetLang -and -not $targetVoice) {
148
+ Write-Output "Auto-configuring voice for $targetLang..."
149
+ $recommended = Get-RecommendedVoice $targetLang
150
+ if ($recommended) {
151
+ Set-Content -Path $TargetVoiceFile -Value $recommended -NoNewline
152
+ $targetVoice = $recommended
153
+ Write-Output "Target voice automatically set to: $recommended"
154
+ Write-Output ""
155
+ }
156
+ }
157
+
158
+ Show-Status
159
+
160
+ # Greet in target language
161
+ if ($targetLang -and $targetVoice) {
162
+ $greeting = Get-GreetingForLanguage $targetLang
163
+ Write-Output ""
164
+ Write-Output "Your language teacher says: $greeting"
165
+ }
166
+ }
167
+
168
+ "disable" {
169
+ Set-Content -Path $LearnModeFile -Value "OFF" -NoNewline
170
+ Write-Output "Language learning mode: DISABLED"
171
+ }
172
+
173
+ "status" {
174
+ Show-Status
175
+ }
176
+
177
+ "is-enabled" {
178
+ if (Test-LearnModeEnabled) {
179
+ Write-Output "ON"
180
+ exit 0
181
+ } else {
182
+ Write-Output "OFF"
183
+ exit 1
184
+ }
185
+ }
186
+
187
+ "get-main-language" {
188
+ Write-Output (Get-MainLanguage)
189
+ }
190
+
191
+ "set-main-language" {
192
+ if (-not $Arg1) {
193
+ Write-Output "Usage: learn-manager.ps1 set-main-language <language>"
194
+ exit 1
195
+ }
196
+ Set-Content -Path $MainLangFile -Value $Arg1 -NoNewline
197
+ Write-Output "Main language set to: $Arg1"
198
+ }
199
+
200
+ "get-target-language" {
201
+ Write-Output (Get-TargetLanguage)
202
+ }
203
+
204
+ "set-target-language" {
205
+ if (-not $Arg1) {
206
+ Write-Output "Usage: learn-manager.ps1 set-target-language <language>"
207
+ exit 1
208
+ }
209
+ Set-Content -Path $TargetLangFile -Value $Arg1 -NoNewline
210
+ Write-Output "Target language set to: $Arg1"
211
+
212
+ # Auto-set recommended voice
213
+ $recommended = Get-RecommendedVoice $Arg1
214
+ if ($recommended) {
215
+ Set-Content -Path $TargetVoiceFile -Value $recommended -NoNewline
216
+ Write-Output "Target voice automatically set to: $recommended"
217
+
218
+ $greeting = Get-GreetingForLanguage $Arg1
219
+ Write-Output ""
220
+ Write-Output "Your language teacher says: $greeting"
221
+ }
222
+ }
223
+
224
+ "get-target-voice" {
225
+ Write-Output (Get-TargetVoice)
226
+ }
227
+
228
+ "set-target-voice" {
229
+ if (-not $Arg1) {
230
+ Write-Output "Usage: learn-manager.ps1 set-target-voice <voice>"
231
+ exit 1
232
+ }
233
+ Set-Content -Path $TargetVoiceFile -Value $Arg1 -NoNewline
234
+ Write-Output "Target voice set to: $Arg1"
235
+ }
236
+
237
+ default {
238
+ Write-Output "Usage: learn-manager.ps1 {enable|disable|status|is-enabled|get-main-language|set-main-language|get-target-language|set-target-language|get-target-voice|set-target-voice}"
239
+ exit 1
240
+ }
241
+ }