agentvibes 5.2.1 → 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 (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 +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 +42 -120
  115. package/.claude/hooks/play-tts-termux-ssh.sh +0 -0
  116. package/.claude/hooks/play-tts.sh +48 -37
  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 -274
  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 -481
  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 -515
  182. package/RELEASE_NOTES.md +1132 -1884
  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/console/tabs/setup-tab.js +9 -6
  206. package/src/console/tabs/voices-tab.js +9 -3
  207. package/src/installer.js +42 -5
  208. package/src/services/llm-provider-service.js +13 -0
  209. package/templates/agentvibes-receiver.sh +158 -483
  210. package/templates/audio/welcome-music.mp3 +0 -0
  211. package/.agentvibes/bmad-voice-map.json +0 -104
  212. package/.agentvibes/copilot-sessions.log +0 -4
  213. package/.claude/config/audio-effects-bmad.cfg +0 -50
  214. package/.claude/config/background-music-enabled.txt +0 -1
  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
+ }