agentvibes 4.2.0 → 4.4.1

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/bmad/bmad-voices.md +69 -69
  2. package/.agentvibes/config.json +12 -0
  3. package/.claude/activation-instructions +54 -54
  4. package/.claude/audio/tracks/README.md +52 -52
  5. package/.claude/commands/agent-vibes/add.md +21 -21
  6. package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
  7. package/.claude/commands/agent-vibes/agent.md +79 -79
  8. package/.claude/commands/agent-vibes/background-music.md +111 -111
  9. package/.claude/commands/agent-vibes/bmad.md +198 -198
  10. package/.claude/commands/agent-vibes/clean.md +18 -18
  11. package/.claude/commands/agent-vibes/cleanup.md +18 -18
  12. package/.claude/commands/agent-vibes/commands.json +145 -145
  13. package/.claude/commands/agent-vibes/effects.md +97 -97
  14. package/.claude/commands/agent-vibes/get.md +9 -9
  15. package/.claude/commands/agent-vibes/hide.md +91 -91
  16. package/.claude/commands/agent-vibes/language.md +23 -23
  17. package/.claude/commands/agent-vibes/learn.md +67 -67
  18. package/.claude/commands/agent-vibes/list.md +13 -13
  19. package/.claude/commands/agent-vibes/mute.md +37 -37
  20. package/.claude/commands/agent-vibes/preview.md +17 -17
  21. package/.claude/commands/agent-vibes/provider.md +68 -68
  22. package/.claude/commands/agent-vibes/replay-target.md +14 -14
  23. package/.claude/commands/agent-vibes/sample.md +12 -12
  24. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
  25. package/.claude/commands/agent-vibes/set-pretext.md +65 -65
  26. package/.claude/commands/agent-vibes/set-speed.md +41 -41
  27. package/.claude/commands/agent-vibes/show.md +84 -84
  28. package/.claude/commands/agent-vibes/switch.md +87 -87
  29. package/.claude/commands/agent-vibes/target-voice.md +26 -26
  30. package/.claude/commands/agent-vibes/target.md +30 -30
  31. package/.claude/commands/agent-vibes/translate.md +68 -68
  32. package/.claude/commands/agent-vibes/unmute.md +45 -45
  33. package/.claude/commands/agent-vibes/verbosity.md +89 -89
  34. package/.claude/commands/agent-vibes/whoami.md +7 -7
  35. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  36. package/.claude/commands/agent-vibes-rdp.md +24 -24
  37. package/.claude/config/agentvibes.json +1 -0
  38. package/.claude/config/audio-effects.cfg +2 -2
  39. package/.claude/config/audio-effects.cfg.sample +52 -52
  40. package/.claude/config/background-music-volume.txt +1 -0
  41. package/.claude/config/intro-text.txt +1 -0
  42. package/.claude/config/piper-speech-rate.txt +4 -0
  43. package/.claude/config/piper-target-speech-rate.txt +1 -0
  44. package/.claude/config/reverb-level.txt +1 -0
  45. package/.claude/config/tts-speech-rate.txt +4 -0
  46. package/.claude/config/tts-target-speech-rate.txt +1 -0
  47. package/.claude/docs/TERMUX_SETUP.md +408 -408
  48. package/.claude/github-star-reminder.txt +1 -1
  49. package/.claude/hooks/README-TTS-QUEUE.md +135 -135
  50. package/.claude/hooks/audio-cache-utils.sh +246 -246
  51. package/.claude/hooks/audio-processor.sh +433 -433
  52. package/.claude/hooks/background-music-manager.sh +404 -404
  53. package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
  54. package/.claude/hooks/bmad-speak.sh +269 -269
  55. package/.claude/hooks/bmad-tts-injector.sh +568 -568
  56. package/.claude/hooks/bmad-voice-manager.sh +928 -928
  57. package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
  58. package/.claude/hooks/clawdbot-receiver.sh +107 -107
  59. package/.claude/hooks/clean-audio-cache.sh +22 -22
  60. package/.claude/hooks/cleanup-cache.sh +106 -106
  61. package/.claude/hooks/configure-rdp-mode.sh +137 -137
  62. package/.claude/hooks/download-extra-voices.sh +244 -244
  63. package/.claude/hooks/effects-manager.sh +268 -268
  64. package/.claude/hooks/github-star-reminder.sh +154 -154
  65. package/.claude/hooks/language-manager.sh +362 -362
  66. package/.claude/hooks/learn-manager.sh +492 -492
  67. package/.claude/hooks/macos-voice-manager.sh +205 -205
  68. package/.claude/hooks/migrate-background-music.sh +125 -125
  69. package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
  70. package/.claude/hooks/optimize-background-music.sh +87 -87
  71. package/.claude/hooks/path-resolver.sh +60 -60
  72. package/.claude/hooks/personality-manager.sh +448 -448
  73. package/.claude/hooks/piper-download-voices.sh +225 -225
  74. package/.claude/hooks/piper-installer.sh +292 -292
  75. package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
  76. package/.claude/hooks/piper-voice-manager.sh +24 -3
  77. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +90 -90
  78. package/.claude/hooks/play-tts-enhanced.sh +105 -105
  79. package/.claude/hooks/play-tts-macos.sh +368 -368
  80. package/.claude/hooks/play-tts-piper.sh +679 -679
  81. package/.claude/hooks/play-tts-soprano.sh +356 -356
  82. package/.claude/hooks/play-tts-ssh-remote.sh +167 -167
  83. package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
  84. package/.claude/hooks/play-tts.sh +301 -301
  85. package/.claude/hooks/prepare-release.sh +54 -54
  86. package/.claude/hooks/provider-commands.sh +617 -617
  87. package/.claude/hooks/provider-manager.sh +399 -399
  88. package/.claude/hooks/replay-target-audio.sh +95 -95
  89. package/.claude/hooks/requirements.txt +6 -6
  90. package/.claude/hooks/sentiment-manager.sh +201 -201
  91. package/.claude/hooks/session-start-tts.sh +81 -81
  92. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  93. package/.claude/hooks/speed-manager.sh +291 -291
  94. package/.claude/hooks/stop-tts.sh +84 -84
  95. package/.claude/hooks/termux-installer.sh +261 -261
  96. package/.claude/hooks/translate-manager.sh +341 -341
  97. package/.claude/hooks/translator.py +237 -237
  98. package/.claude/hooks/tts-queue-worker.sh +145 -145
  99. package/.claude/hooks/tts-queue.sh +165 -165
  100. package/.claude/hooks/verbosity-manager.sh +178 -178
  101. package/.claude/hooks/voice-manager.sh +548 -548
  102. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  103. package/.claude/hooks-windows/background-music-manager.ps1 +348 -0
  104. package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -0
  105. package/.claude/hooks-windows/download-extra-voices.ps1 +185 -0
  106. package/.claude/hooks-windows/effects-manager.ps1 +294 -0
  107. package/.claude/hooks-windows/language-manager.ps1 +193 -0
  108. package/.claude/hooks-windows/learn-manager.ps1 +241 -0
  109. package/.claude/hooks-windows/personality-manager.ps1 +266 -0
  110. package/.claude/hooks-windows/play-tts-piper.ps1 +209 -0
  111. package/.claude/hooks-windows/play-tts-sapi.ps1 +108 -0
  112. package/.claude/hooks-windows/play-tts-soprano.ps1 +159 -158
  113. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +50 -5
  114. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -108
  115. package/.claude/hooks-windows/play-tts.ps1 +344 -266
  116. package/.claude/hooks-windows/provider-manager.ps1 +29 -10
  117. package/.claude/hooks-windows/session-start-tts.ps1 +124 -124
  118. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  119. package/.claude/hooks-windows/speed-manager.ps1 +166 -0
  120. package/.claude/hooks-windows/verbosity-manager.ps1 +119 -0
  121. package/.claude/hooks-windows/voice-manager-windows.ps1 +92 -8
  122. package/.claude/output-styles/agent-vibes.md +202 -202
  123. package/.claude/personalities/angry.md +14 -14
  124. package/.claude/personalities/annoying.md +14 -14
  125. package/.claude/personalities/crass.md +14 -14
  126. package/.claude/personalities/dramatic.md +14 -14
  127. package/.claude/personalities/dry-humor.md +50 -50
  128. package/.claude/personalities/flirty.md +20 -20
  129. package/.claude/personalities/funny.md +14 -14
  130. package/.claude/personalities/grandpa.md +32 -32
  131. package/.claude/personalities/millennial.md +14 -14
  132. package/.claude/personalities/moody.md +14 -14
  133. package/.claude/personalities/normal.md +16 -16
  134. package/.claude/personalities/pirate.md +14 -14
  135. package/.claude/personalities/poetic.md +14 -14
  136. package/.claude/personalities/professional.md +14 -14
  137. package/.claude/personalities/rapper.md +55 -55
  138. package/.claude/personalities/robot.md +14 -14
  139. package/.claude/personalities/sarcastic.md +38 -38
  140. package/.claude/personalities/sassy.md +14 -14
  141. package/.claude/personalities/surfer-dude.md +14 -14
  142. package/.claude/personalities/zen.md +14 -14
  143. package/.claude/settings.json +15 -15
  144. package/.claude/verbosity.txt +1 -1
  145. package/.clawdbot/README.md +105 -105
  146. package/.clawdbot/skill/SKILL.md +241 -241
  147. package/.mcp.json +12 -0
  148. package/CLAUDE.md +170 -170
  149. package/README.md +2029 -2007
  150. package/RELEASE_NOTES.md +1310 -1203
  151. package/WINDOWS-SETUP.md +208 -208
  152. package/bin/agent-vibes +39 -39
  153. package/bin/agentvibes-voice-browser.js +1840 -1840
  154. package/bin/agentvibes.js +48 -2
  155. package/bin/mcp-server.js +121 -121
  156. package/bin/mcp-server.sh +206 -206
  157. package/bin/test-bmad-pr +78 -78
  158. package/mcp-server/QUICK_START.md +203 -203
  159. package/mcp-server/README.md +345 -345
  160. package/mcp-server/WINDOWS_SETUP.md +260 -260
  161. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  162. package/mcp-server/examples/claude_desktop_config.json +11 -11
  163. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  164. package/mcp-server/examples/custom_instructions.md +169 -169
  165. package/mcp-server/install-deps.js +130 -130
  166. package/mcp-server/pyproject.toml +52 -52
  167. package/mcp-server/requirements.txt +2 -2
  168. package/mcp-server/server.py +1465 -1453
  169. package/mcp-server/test_server.py +395 -395
  170. package/mcp-server/test_windows_script_parity.py +336 -0
  171. package/package.json +110 -110
  172. package/setup-windows.ps1 +815 -815
  173. package/src/bmad-detector.js +71 -71
  174. package/src/cli/list-personalities.js +110 -110
  175. package/src/cli/list-voices.js +114 -114
  176. package/src/commands/bmad-voices.js +394 -394
  177. package/src/commands/install-mcp.js +476 -476
  178. package/src/console/app.js +824 -824
  179. package/src/console/audio-env.js +20 -1
  180. package/src/console/brand-colors.js +13 -13
  181. package/src/console/constants/personalities.js +44 -44
  182. package/src/console/footer-config.js +50 -50
  183. package/src/console/modals/modal-overlay.js +247 -247
  184. package/src/console/navigation.js +62 -62
  185. package/src/console/tabs/agents-tab.js +1684 -1516
  186. package/src/console/tabs/help-tab.js +261 -261
  187. package/src/console/tabs/install-tab.js +1007 -991
  188. package/src/console/tabs/music-tab.js +22 -8
  189. package/src/console/tabs/placeholder-tab.js +53 -53
  190. package/src/console/tabs/readme-tab.js +267 -267
  191. package/src/console/tabs/receiver-tab.js +1472 -1212
  192. package/src/console/tabs/settings-tab.js +208 -84
  193. package/src/console/tabs/voices-tab.js +100 -21
  194. package/src/console/widgets/destroy-list.js +25 -25
  195. package/src/console/widgets/format-utils.js +89 -89
  196. package/src/console/widgets/notice.js +55 -55
  197. package/src/console/widgets/personality-picker.js +185 -185
  198. package/src/console/widgets/reverb-picker.js +94 -94
  199. package/src/console/widgets/track-picker.js +285 -285
  200. package/src/installer/music-file-input.js +304 -304
  201. package/src/installer.js +5895 -5829
  202. package/src/services/agent-voice-store.js +423 -423
  203. package/src/services/config-service.js +264 -264
  204. package/src/services/navigation-service.js +123 -123
  205. package/src/services/provider-service.js +143 -132
  206. package/src/services/verbosity-service.js +157 -157
  207. package/src/utils/audio-duration-validator.js +298 -298
  208. package/src/utils/audio-format-validator.js +277 -277
  209. package/src/utils/dependency-checker.js +469 -466
  210. package/src/utils/file-ownership-verifier.js +358 -358
  211. package/src/utils/list-formatter.js +194 -194
  212. package/src/utils/music-file-validator.js +285 -285
  213. package/src/utils/preview-list-prompt.js +136 -136
  214. package/src/utils/provider-validator.js +96 -12
  215. package/src/utils/secure-music-storage.js +412 -412
  216. package/templates/agentvibes-receiver.sh +482 -482
  217. package/templates/audio/welcome-music.mp3 +0 -0
  218. package/voice-assignments.json +8244 -8244
  219. package/.claude/config/background-music-position.txt +0 -1
@@ -1,341 +1,341 @@
1
- #!/usr/bin/env bash
2
- #
3
- # File: .claude/hooks/translate-manager.sh
4
- #
5
- # AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
6
- # Website: https://agentvibes.org
7
- # Repository: https://github.com/paulpreibisch/AgentVibes
8
- #
9
- # Co-created by Paul Preibisch with Claude AI
10
- # Copyright (c) 2025 Paul Preibisch
11
- #
12
- # Licensed under the Apache License, Version 2.0 (the "License");
13
- # you may not use this file except in compliance with the License.
14
- # You may obtain a copy of the License at
15
- #
16
- # http://www.apache.org/licenses/LICENSE-2.0
17
- #
18
- # Unless required by applicable law or agreed to in writing, software
19
- # distributed under the License is distributed on an "AS IS" BASIS,
20
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
- # See the License for the specific language governing permissions and
22
- # limitations under the License.
23
- #
24
- # DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
25
- # express or implied. Use at your own risk. See the Apache License for details.
26
- #
27
- # ---
28
- #
29
- # @fileoverview Translation Manager - Auto-translate TTS to user's preferred language
30
- # @context Integrates with BMAD communication_language and provides manual override
31
- # @architecture Manages translation settings, detects BMAD config, translates text via translator.py
32
- # @dependencies translator.py, language-manager.sh, .bmad/core/config.yaml (optional)
33
- # @entrypoints Called by /agent-vibes:translate commands and play-tts.sh
34
- # @patterns Config cascade - manual override > BMAD config > default (no translation)
35
- # @related translator.py, play-tts.sh, language-manager.sh, learn-manager.sh
36
-
37
- # Only set strict mode when executed directly, not when sourced
38
- if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
39
- set -euo pipefail
40
- fi
41
-
42
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
43
-
44
- # Use PWD for project dir when called from project context, fall back to script-relative
45
- if [[ -d "$PWD/.claude" ]]; then
46
- PROJECT_DIR="$PWD"
47
- else
48
- PROJECT_DIR="$SCRIPT_DIR/../.."
49
- fi
50
-
51
- # Configuration files
52
- TRANSLATE_FILE="$PROJECT_DIR/.claude/tts-translate-to.txt"
53
- GLOBAL_TRANSLATE_FILE="$HOME/.claude/tts-translate-to.txt"
54
-
55
- # Colors
56
- GREEN='\033[0;32m'
57
- YELLOW='\033[1;33m'
58
- BLUE='\033[0;34m'
59
- RED='\033[0;31m'
60
- NC='\033[0m'
61
-
62
- # Supported languages (matching language-manager.sh)
63
- SUPPORTED_LANGUAGES="spanish french german italian portuguese chinese japanese korean russian polish dutch turkish arabic hindi swedish danish norwegian finnish czech romanian ukrainian greek bulgarian croatian slovak"
64
-
65
- # @function get_bmad_language
66
- # @intent Read communication_language from BMAD config
67
- # @why BMAD users can set their preferred language in .bmad/core/config.yaml
68
- # @returns Language name (lowercase) or empty if not set
69
- get_bmad_language() {
70
- local bmad_config=""
71
-
72
- # Search for BMAD config in project or parents
73
- local search_dir="$PWD"
74
- while [[ "$search_dir" != "/" ]]; do
75
- if [[ -f "$search_dir/.bmad/core/config.yaml" ]]; then
76
- bmad_config="$search_dir/.bmad/core/config.yaml"
77
- break
78
- fi
79
- search_dir=$(dirname "$search_dir")
80
- done
81
-
82
- if [[ -z "$bmad_config" ]] || [[ ! -f "$bmad_config" ]]; then
83
- echo ""
84
- return
85
- fi
86
-
87
- # Security: Verify file ownership (should be owned by current user)
88
- local owner
89
- owner=$(stat -c '%u' "$bmad_config" 2>/dev/null || stat -f '%u' "$bmad_config" 2>/dev/null || echo "")
90
- if [[ -n "$owner" ]] && [[ "$owner" != "$(id -u)" ]]; then
91
- echo "Warning: BMAD config not owned by current user, skipping" >&2
92
- echo ""
93
- return
94
- fi
95
-
96
- # Extract communication_language from YAML (simple grep approach)
97
- local lang
98
- lang=$(grep -E "^communication_language:" "$bmad_config" 2>/dev/null | head -1 | cut -d: -f2 | tr -d ' "'"'" | tr '[:upper:]' '[:lower:]')
99
-
100
- echo "$lang"
101
- }
102
-
103
- # @function get_translate_to
104
- # @intent Get the target language for translation
105
- # @why Implements priority: manual override > BMAD config > no translation
106
- # @returns Language name or empty if no translation
107
- get_translate_to() {
108
- # Priority 1: Manual override
109
- if [[ -f "$TRANSLATE_FILE" ]]; then
110
- local manual
111
- manual=$(cat "$TRANSLATE_FILE")
112
- if [[ "$manual" != "off" ]] && [[ "$manual" != "auto" ]]; then
113
- echo "$manual"
114
- return
115
- elif [[ "$manual" == "off" ]]; then
116
- echo ""
117
- return
118
- fi
119
- # If "auto", fall through to BMAD detection
120
- elif [[ -f "$GLOBAL_TRANSLATE_FILE" ]]; then
121
- local manual
122
- manual=$(cat "$GLOBAL_TRANSLATE_FILE")
123
- if [[ "$manual" != "off" ]] && [[ "$manual" != "auto" ]]; then
124
- echo "$manual"
125
- return
126
- elif [[ "$manual" == "off" ]]; then
127
- echo ""
128
- return
129
- fi
130
- fi
131
-
132
- # Priority 2: BMAD config
133
- local bmad_lang
134
- bmad_lang=$(get_bmad_language)
135
- if [[ -n "$bmad_lang" ]] && [[ "$bmad_lang" != "english" ]]; then
136
- echo "$bmad_lang"
137
- return
138
- fi
139
-
140
- # Default: No translation
141
- echo ""
142
- }
143
-
144
- # @function is_translation_enabled
145
- # @intent Check if translation should occur
146
- # @why Quick check for play-tts.sh to decide whether to translate
147
- # @returns 0 if enabled, 1 if disabled
148
- is_translation_enabled() {
149
- local translate_to
150
- translate_to=$(get_translate_to)
151
- [[ -n "$translate_to" ]] && [[ "$translate_to" != "english" ]]
152
- }
153
-
154
- # @function translate_text
155
- # @intent Translate text to target language using translator.py
156
- # @why Central translation function for all TTS
157
- # @param $1 text to translate
158
- # @param $2 target language (optional, auto-detected if not provided)
159
- # @returns Translated text (or original if translation fails/disabled)
160
- translate_text() {
161
- local text="$1"
162
- local target="${2:-}"
163
-
164
- if [[ -z "$target" ]]; then
165
- target=$(get_translate_to)
166
- fi
167
-
168
- # Skip if no translation target or target is English
169
- if [[ -z "$target" ]] || [[ "$target" == "english" ]]; then
170
- echo "$text"
171
- return
172
- fi
173
-
174
- # Call translator.py
175
- local translated
176
- translated=$(python3 "$SCRIPT_DIR/translator.py" "$text" "$target" 2>/dev/null) || translated="$text"
177
-
178
- echo "$translated"
179
- }
180
-
181
- # @function set_translate
182
- # @intent Set manual translation override
183
- # @why Allows users to override BMAD config or force specific language
184
- # @param $1 language name, "auto", or "off"
185
- set_translate() {
186
- local lang="$1"
187
-
188
- if [[ -z "$lang" ]]; then
189
- echo -e "${YELLOW}Usage: translate-manager.sh set <language|auto|off>${NC}"
190
- exit 1
191
- fi
192
-
193
- lang=$(echo "$lang" | tr '[:upper:]' '[:lower:]')
194
-
195
- mkdir -p "$PROJECT_DIR/.claude"
196
-
197
- if [[ "$lang" == "off" ]]; then
198
- echo "off" > "$TRANSLATE_FILE"
199
- echo -e "${GREEN}✓${NC} Translation: ${YELLOW}DISABLED${NC}"
200
- echo " TTS will speak in English only"
201
- return
202
- fi
203
-
204
- if [[ "$lang" == "auto" ]]; then
205
- echo "auto" > "$TRANSLATE_FILE"
206
- echo -e "${GREEN}✓${NC} Translation: ${BLUE}AUTO${NC}"
207
- echo " Will detect from BMAD config if available"
208
-
209
- local bmad_lang
210
- bmad_lang=$(get_bmad_language)
211
- if [[ -n "$bmad_lang" ]]; then
212
- echo -e " ${BLUE}ℹ${NC} BMAD config detected: $bmad_lang"
213
- else
214
- echo -e " ${YELLOW}⚠${NC} No BMAD config found, will speak English"
215
- fi
216
- return
217
- fi
218
-
219
- # Validate language
220
- local valid=false
221
- for supported in $SUPPORTED_LANGUAGES; do
222
- if [[ "$lang" == "$supported" ]]; then
223
- valid=true
224
- break
225
- fi
226
- done
227
-
228
- if [[ "$valid" != "true" ]]; then
229
- echo -e "${RED}❌${NC} Language '$lang' not supported"
230
- echo ""
231
- echo "Supported languages:"
232
- echo "$SUPPORTED_LANGUAGES" | tr ' ' '\n' | column
233
- exit 1
234
- fi
235
-
236
- echo "$lang" > "$TRANSLATE_FILE"
237
- echo -e "${GREEN}✓${NC} Translation set to: ${BLUE}$lang${NC}"
238
- echo " All TTS will be translated to $lang before speaking"
239
-
240
- # Show voice recommendation
241
- source "$SCRIPT_DIR/language-manager.sh" 2>/dev/null || true
242
- if command -v get_voice_for_language &>/dev/null; then
243
- local provider
244
- provider=$(get_active_provider 2>/dev/null || echo "piper")
245
- local voice
246
- voice=$(get_voice_for_language "$lang" "$provider" 2>/dev/null || echo "")
247
- if [[ -n "$voice" ]]; then
248
- echo -e " ${BLUE}💡${NC} Recommended voice: ${YELLOW}$voice${NC}"
249
- echo -e " Switch with: /agent-vibes:switch $voice"
250
- fi
251
- fi
252
- }
253
-
254
- # @function show_status
255
- # @intent Display current translation settings
256
- # @why Help users understand what's configured
257
- show_status() {
258
- echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
259
- echo -e "${BLUE} Translation Settings${NC}"
260
- echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
261
- echo ""
262
-
263
- # Check manual setting
264
- local manual_setting=""
265
- if [[ -f "$TRANSLATE_FILE" ]]; then
266
- manual_setting=$(cat "$TRANSLATE_FILE")
267
- elif [[ -f "$GLOBAL_TRANSLATE_FILE" ]]; then
268
- manual_setting=$(cat "$GLOBAL_TRANSLATE_FILE")
269
- fi
270
-
271
- # Check BMAD config
272
- local bmad_lang
273
- bmad_lang=$(get_bmad_language)
274
-
275
- # Get effective translation
276
- local effective
277
- effective=$(get_translate_to)
278
-
279
- echo -e " ${BLUE}Manual Setting:${NC} ${manual_setting:-"(not set)"}"
280
- echo -e " ${BLUE}BMAD Language:${NC} ${bmad_lang:-"(not detected)"}"
281
- echo -e " ${BLUE}Effective:${NC} $(if [[ -n "$effective" ]]; then echo -e "${GREEN}$effective${NC}"; else echo -e "${YELLOW}No translation${NC}"; fi)"
282
- echo ""
283
-
284
- if [[ -n "$effective" ]]; then
285
- echo -e " ${GREEN}✓${NC} TTS will be translated to ${BLUE}$effective${NC}"
286
- else
287
- echo -e " ${YELLOW}ℹ${NC} TTS will speak in English"
288
- fi
289
-
290
- echo ""
291
- echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
292
- echo ""
293
- echo -e " ${BLUE}Commands:${NC}"
294
- echo -e " /agent-vibes:translate set <lang> Set manual translation"
295
- echo -e " /agent-vibes:translate auto Use BMAD config"
296
- echo -e " /agent-vibes:translate off Disable translation"
297
- echo ""
298
- }
299
-
300
- # Main command handler - only run if script is executed directly, not sourced
301
- if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
302
- case "${1:-}" in
303
- get-bmad-language)
304
- get_bmad_language
305
- ;;
306
- get-translate-to)
307
- get_translate_to
308
- ;;
309
- is-enabled)
310
- if is_translation_enabled; then
311
- echo "ON"
312
- exit 0
313
- else
314
- echo "OFF"
315
- exit 1
316
- fi
317
- ;;
318
- translate)
319
- if [[ -z "${2:-}" ]]; then
320
- echo "Usage: translate-manager.sh translate <text> [target_lang]" >&2
321
- exit 1
322
- fi
323
- translate_text "$2" "${3:-}"
324
- ;;
325
- set)
326
- set_translate "${2:-}"
327
- ;;
328
- auto)
329
- set_translate "auto"
330
- ;;
331
- off)
332
- set_translate "off"
333
- ;;
334
- status)
335
- show_status
336
- ;;
337
- *)
338
- show_status
339
- ;;
340
- esac
341
- fi
1
+ #!/usr/bin/env bash
2
+ #
3
+ # File: .claude/hooks/translate-manager.sh
4
+ #
5
+ # AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
6
+ # Website: https://agentvibes.org
7
+ # Repository: https://github.com/paulpreibisch/AgentVibes
8
+ #
9
+ # Co-created by Paul Preibisch with Claude AI
10
+ # Copyright (c) 2025 Paul Preibisch
11
+ #
12
+ # Licensed under the Apache License, Version 2.0 (the "License");
13
+ # you may not use this file except in compliance with the License.
14
+ # You may obtain a copy of the License at
15
+ #
16
+ # http://www.apache.org/licenses/LICENSE-2.0
17
+ #
18
+ # Unless required by applicable law or agreed to in writing, software
19
+ # distributed under the License is distributed on an "AS IS" BASIS,
20
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
+ # See the License for the specific language governing permissions and
22
+ # limitations under the License.
23
+ #
24
+ # DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
25
+ # express or implied. Use at your own risk. See the Apache License for details.
26
+ #
27
+ # ---
28
+ #
29
+ # @fileoverview Translation Manager - Auto-translate TTS to user's preferred language
30
+ # @context Integrates with BMAD communication_language and provides manual override
31
+ # @architecture Manages translation settings, detects BMAD config, translates text via translator.py
32
+ # @dependencies translator.py, language-manager.sh, .bmad/core/config.yaml (optional)
33
+ # @entrypoints Called by /agent-vibes:translate commands and play-tts.sh
34
+ # @patterns Config cascade - manual override > BMAD config > default (no translation)
35
+ # @related translator.py, play-tts.sh, language-manager.sh, learn-manager.sh
36
+
37
+ # Only set strict mode when executed directly, not when sourced
38
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
39
+ set -euo pipefail
40
+ fi
41
+
42
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
43
+
44
+ # Use PWD for project dir when called from project context, fall back to script-relative
45
+ if [[ -d "$PWD/.claude" ]]; then
46
+ PROJECT_DIR="$PWD"
47
+ else
48
+ PROJECT_DIR="$SCRIPT_DIR/../.."
49
+ fi
50
+
51
+ # Configuration files
52
+ TRANSLATE_FILE="$PROJECT_DIR/.claude/tts-translate-to.txt"
53
+ GLOBAL_TRANSLATE_FILE="$HOME/.claude/tts-translate-to.txt"
54
+
55
+ # Colors
56
+ GREEN='\033[0;32m'
57
+ YELLOW='\033[1;33m'
58
+ BLUE='\033[0;34m'
59
+ RED='\033[0;31m'
60
+ NC='\033[0m'
61
+
62
+ # Supported languages (matching language-manager.sh)
63
+ SUPPORTED_LANGUAGES="spanish french german italian portuguese chinese japanese korean russian polish dutch turkish arabic hindi swedish danish norwegian finnish czech romanian ukrainian greek bulgarian croatian slovak"
64
+
65
+ # @function get_bmad_language
66
+ # @intent Read communication_language from BMAD config
67
+ # @why BMAD users can set their preferred language in .bmad/core/config.yaml
68
+ # @returns Language name (lowercase) or empty if not set
69
+ get_bmad_language() {
70
+ local bmad_config=""
71
+
72
+ # Search for BMAD config in project or parents
73
+ local search_dir="$PWD"
74
+ while [[ "$search_dir" != "/" ]]; do
75
+ if [[ -f "$search_dir/.bmad/core/config.yaml" ]]; then
76
+ bmad_config="$search_dir/.bmad/core/config.yaml"
77
+ break
78
+ fi
79
+ search_dir=$(dirname "$search_dir")
80
+ done
81
+
82
+ if [[ -z "$bmad_config" ]] || [[ ! -f "$bmad_config" ]]; then
83
+ echo ""
84
+ return
85
+ fi
86
+
87
+ # Security: Verify file ownership (should be owned by current user)
88
+ local owner
89
+ owner=$(stat -c '%u' "$bmad_config" 2>/dev/null || stat -f '%u' "$bmad_config" 2>/dev/null || echo "")
90
+ if [[ -n "$owner" ]] && [[ "$owner" != "$(id -u)" ]]; then
91
+ echo "Warning: BMAD config not owned by current user, skipping" >&2
92
+ echo ""
93
+ return
94
+ fi
95
+
96
+ # Extract communication_language from YAML (simple grep approach)
97
+ local lang
98
+ lang=$(grep -E "^communication_language:" "$bmad_config" 2>/dev/null | head -1 | cut -d: -f2 | tr -d ' "'"'" | tr '[:upper:]' '[:lower:]')
99
+
100
+ echo "$lang"
101
+ }
102
+
103
+ # @function get_translate_to
104
+ # @intent Get the target language for translation
105
+ # @why Implements priority: manual override > BMAD config > no translation
106
+ # @returns Language name or empty if no translation
107
+ get_translate_to() {
108
+ # Priority 1: Manual override
109
+ if [[ -f "$TRANSLATE_FILE" ]]; then
110
+ local manual
111
+ manual=$(cat "$TRANSLATE_FILE")
112
+ if [[ "$manual" != "off" ]] && [[ "$manual" != "auto" ]]; then
113
+ echo "$manual"
114
+ return
115
+ elif [[ "$manual" == "off" ]]; then
116
+ echo ""
117
+ return
118
+ fi
119
+ # If "auto", fall through to BMAD detection
120
+ elif [[ -f "$GLOBAL_TRANSLATE_FILE" ]]; then
121
+ local manual
122
+ manual=$(cat "$GLOBAL_TRANSLATE_FILE")
123
+ if [[ "$manual" != "off" ]] && [[ "$manual" != "auto" ]]; then
124
+ echo "$manual"
125
+ return
126
+ elif [[ "$manual" == "off" ]]; then
127
+ echo ""
128
+ return
129
+ fi
130
+ fi
131
+
132
+ # Priority 2: BMAD config
133
+ local bmad_lang
134
+ bmad_lang=$(get_bmad_language)
135
+ if [[ -n "$bmad_lang" ]] && [[ "$bmad_lang" != "english" ]]; then
136
+ echo "$bmad_lang"
137
+ return
138
+ fi
139
+
140
+ # Default: No translation
141
+ echo ""
142
+ }
143
+
144
+ # @function is_translation_enabled
145
+ # @intent Check if translation should occur
146
+ # @why Quick check for play-tts.sh to decide whether to translate
147
+ # @returns 0 if enabled, 1 if disabled
148
+ is_translation_enabled() {
149
+ local translate_to
150
+ translate_to=$(get_translate_to)
151
+ [[ -n "$translate_to" ]] && [[ "$translate_to" != "english" ]]
152
+ }
153
+
154
+ # @function translate_text
155
+ # @intent Translate text to target language using translator.py
156
+ # @why Central translation function for all TTS
157
+ # @param $1 text to translate
158
+ # @param $2 target language (optional, auto-detected if not provided)
159
+ # @returns Translated text (or original if translation fails/disabled)
160
+ translate_text() {
161
+ local text="$1"
162
+ local target="${2:-}"
163
+
164
+ if [[ -z "$target" ]]; then
165
+ target=$(get_translate_to)
166
+ fi
167
+
168
+ # Skip if no translation target or target is English
169
+ if [[ -z "$target" ]] || [[ "$target" == "english" ]]; then
170
+ echo "$text"
171
+ return
172
+ fi
173
+
174
+ # Call translator.py
175
+ local translated
176
+ translated=$(python3 "$SCRIPT_DIR/translator.py" "$text" "$target" 2>/dev/null) || translated="$text"
177
+
178
+ echo "$translated"
179
+ }
180
+
181
+ # @function set_translate
182
+ # @intent Set manual translation override
183
+ # @why Allows users to override BMAD config or force specific language
184
+ # @param $1 language name, "auto", or "off"
185
+ set_translate() {
186
+ local lang="$1"
187
+
188
+ if [[ -z "$lang" ]]; then
189
+ echo -e "${YELLOW}Usage: translate-manager.sh set <language|auto|off>${NC}"
190
+ exit 1
191
+ fi
192
+
193
+ lang=$(echo "$lang" | tr '[:upper:]' '[:lower:]')
194
+
195
+ mkdir -p "$PROJECT_DIR/.claude"
196
+
197
+ if [[ "$lang" == "off" ]]; then
198
+ echo "off" > "$TRANSLATE_FILE"
199
+ echo -e "${GREEN}✓${NC} Translation: ${YELLOW}DISABLED${NC}"
200
+ echo " TTS will speak in English only"
201
+ return
202
+ fi
203
+
204
+ if [[ "$lang" == "auto" ]]; then
205
+ echo "auto" > "$TRANSLATE_FILE"
206
+ echo -e "${GREEN}✓${NC} Translation: ${BLUE}AUTO${NC}"
207
+ echo " Will detect from BMAD config if available"
208
+
209
+ local bmad_lang
210
+ bmad_lang=$(get_bmad_language)
211
+ if [[ -n "$bmad_lang" ]]; then
212
+ echo -e " ${BLUE}ℹ${NC} BMAD config detected: $bmad_lang"
213
+ else
214
+ echo -e " ${YELLOW}⚠${NC} No BMAD config found, will speak English"
215
+ fi
216
+ return
217
+ fi
218
+
219
+ # Validate language
220
+ local valid=false
221
+ for supported in $SUPPORTED_LANGUAGES; do
222
+ if [[ "$lang" == "$supported" ]]; then
223
+ valid=true
224
+ break
225
+ fi
226
+ done
227
+
228
+ if [[ "$valid" != "true" ]]; then
229
+ echo -e "${RED}❌${NC} Language '$lang' not supported"
230
+ echo ""
231
+ echo "Supported languages:"
232
+ echo "$SUPPORTED_LANGUAGES" | tr ' ' '\n' | column
233
+ exit 1
234
+ fi
235
+
236
+ echo "$lang" > "$TRANSLATE_FILE"
237
+ echo -e "${GREEN}✓${NC} Translation set to: ${BLUE}$lang${NC}"
238
+ echo " All TTS will be translated to $lang before speaking"
239
+
240
+ # Show voice recommendation
241
+ source "$SCRIPT_DIR/language-manager.sh" 2>/dev/null || true
242
+ if command -v get_voice_for_language &>/dev/null; then
243
+ local provider
244
+ provider=$(get_active_provider 2>/dev/null || echo "piper")
245
+ local voice
246
+ voice=$(get_voice_for_language "$lang" "$provider" 2>/dev/null || echo "")
247
+ if [[ -n "$voice" ]]; then
248
+ echo -e " ${BLUE}💡${NC} Recommended voice: ${YELLOW}$voice${NC}"
249
+ echo -e " Switch with: /agent-vibes:switch $voice"
250
+ fi
251
+ fi
252
+ }
253
+
254
+ # @function show_status
255
+ # @intent Display current translation settings
256
+ # @why Help users understand what's configured
257
+ show_status() {
258
+ echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
259
+ echo -e "${BLUE} Translation Settings${NC}"
260
+ echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
261
+ echo ""
262
+
263
+ # Check manual setting
264
+ local manual_setting=""
265
+ if [[ -f "$TRANSLATE_FILE" ]]; then
266
+ manual_setting=$(cat "$TRANSLATE_FILE")
267
+ elif [[ -f "$GLOBAL_TRANSLATE_FILE" ]]; then
268
+ manual_setting=$(cat "$GLOBAL_TRANSLATE_FILE")
269
+ fi
270
+
271
+ # Check BMAD config
272
+ local bmad_lang
273
+ bmad_lang=$(get_bmad_language)
274
+
275
+ # Get effective translation
276
+ local effective
277
+ effective=$(get_translate_to)
278
+
279
+ echo -e " ${BLUE}Manual Setting:${NC} ${manual_setting:-"(not set)"}"
280
+ echo -e " ${BLUE}BMAD Language:${NC} ${bmad_lang:-"(not detected)"}"
281
+ echo -e " ${BLUE}Effective:${NC} $(if [[ -n "$effective" ]]; then echo -e "${GREEN}$effective${NC}"; else echo -e "${YELLOW}No translation${NC}"; fi)"
282
+ echo ""
283
+
284
+ if [[ -n "$effective" ]]; then
285
+ echo -e " ${GREEN}✓${NC} TTS will be translated to ${BLUE}$effective${NC}"
286
+ else
287
+ echo -e " ${YELLOW}ℹ${NC} TTS will speak in English"
288
+ fi
289
+
290
+ echo ""
291
+ echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
292
+ echo ""
293
+ echo -e " ${BLUE}Commands:${NC}"
294
+ echo -e " /agent-vibes:translate set <lang> Set manual translation"
295
+ echo -e " /agent-vibes:translate auto Use BMAD config"
296
+ echo -e " /agent-vibes:translate off Disable translation"
297
+ echo ""
298
+ }
299
+
300
+ # Main command handler - only run if script is executed directly, not sourced
301
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
302
+ case "${1:-}" in
303
+ get-bmad-language)
304
+ get_bmad_language
305
+ ;;
306
+ get-translate-to)
307
+ get_translate_to
308
+ ;;
309
+ is-enabled)
310
+ if is_translation_enabled; then
311
+ echo "ON"
312
+ exit 0
313
+ else
314
+ echo "OFF"
315
+ exit 1
316
+ fi
317
+ ;;
318
+ translate)
319
+ if [[ -z "${2:-}" ]]; then
320
+ echo "Usage: translate-manager.sh translate <text> [target_lang]" >&2
321
+ exit 1
322
+ fi
323
+ translate_text "$2" "${3:-}"
324
+ ;;
325
+ set)
326
+ set_translate "${2:-}"
327
+ ;;
328
+ auto)
329
+ set_translate "auto"
330
+ ;;
331
+ off)
332
+ set_translate "off"
333
+ ;;
334
+ status)
335
+ show_status
336
+ ;;
337
+ *)
338
+ show_status
339
+ ;;
340
+ esac
341
+ fi