agentvibes 4.2.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/.agentvibes/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 +152 -79
  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 +5882 -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 +132 -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,205 +1,205 @@
1
- #!/usr/bin/env bash
2
- #
3
- # File: .claude/hooks/macos-voice-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 macOS Voice Manager - Voice discovery and management for macOS 'say' command
30
- # @context Provides voice listing, validation, and info for macOS native TTS
31
- # @architecture Helper functions for play-tts-macos.sh provider
32
- # @dependencies macOS only (Darwin), say command (built-in)
33
- # @entrypoints Called by voice-manager.sh for provider-aware voice operations
34
- # @patterns Voice enumeration via 'say -v ?', language filtering, quality tiers
35
- # @related play-tts-macos.sh, voice-manager.sh, provider-manager.sh
36
- #
37
-
38
- # Platform guard
39
- if [[ "$(uname -s)" != "Darwin" ]]; then
40
- echo "❌ Error: macOS voice manager only works on macOS"
41
- exit 1
42
- fi
43
-
44
- # @function list_macos_voices
45
- # @intent List all available macOS voices
46
- # @returns Echoes voice names one per line
47
- list_macos_voices() {
48
- say -v ? 2>/dev/null | awk '{print $1}'
49
- }
50
-
51
- # @function list_macos_voices_detailed
52
- # @intent List all voices with language info
53
- # @returns Echoes "voice_name language_code" per line
54
- list_macos_voices_detailed() {
55
- say -v ? 2>/dev/null | while read -r line; do
56
- local voice=$(echo "$line" | awk '{print $1}')
57
- local lang=$(echo "$line" | awk '{print $2}')
58
- echo "$voice $lang"
59
- done
60
- }
61
-
62
- # @function list_english_voices
63
- # @intent List only English voices
64
- # @returns Echoes English voice names
65
- list_english_voices() {
66
- say -v ? 2>/dev/null | grep -i "en_" | awk '{print $1}'
67
- }
68
-
69
- # @function get_voice_language
70
- # @intent Get the language code for a voice
71
- # @param $1 Voice name
72
- # @returns Echoes language code (e.g., "en_US")
73
- get_voice_language() {
74
- local voice="$1"
75
- say -v ? 2>/dev/null | grep -i "^${voice} " | awk '{print $2}'
76
- }
77
-
78
- # @function validate_voice
79
- # @intent Check if a voice exists on this system
80
- # @param $1 Voice name
81
- # @returns 0 if valid, 1 if not found
82
- validate_voice() {
83
- local voice="$1"
84
- say -v ? 2>/dev/null | grep -qi "^${voice} "
85
- }
86
-
87
- # @function get_recommended_voices
88
- # @intent Get list of recommended high-quality voices
89
- # @returns Echoes recommended voice names
90
- get_recommended_voices() {
91
- # These are typically the highest quality voices on macOS
92
- local recommended=("Samantha" "Alex" "Daniel" "Karen" "Moira" "Tessa" "Fiona" "Veena" "Victoria")
93
-
94
- for voice in "${recommended[@]}"; do
95
- if validate_voice "$voice"; then
96
- echo "$voice"
97
- fi
98
- done
99
- }
100
-
101
- # @function get_voice_info
102
- # @intent Get detailed info about a specific voice
103
- # @param $1 Voice name
104
- # @returns Echoes voice details
105
- get_voice_info() {
106
- local voice="$1"
107
-
108
- if ! validate_voice "$voice"; then
109
- echo "❌ Voice not found: $voice"
110
- return 1
111
- fi
112
-
113
- local full_info=$(say -v ? 2>/dev/null | grep -i "^${voice} ")
114
- local lang=$(echo "$full_info" | awk '{print $2}')
115
-
116
- echo "Voice: $voice"
117
- echo "Language: $lang"
118
- echo "Provider: macOS Say (built-in)"
119
-
120
- # Add description for known voices
121
- case "$voice" in
122
- Alex) echo "Description: American English male (enhanced)" ;;
123
- Samantha) echo "Description: American English female (enhanced)" ;;
124
- Victoria) echo "Description: American English female" ;;
125
- Daniel) echo "Description: British English male (enhanced)" ;;
126
- Karen) echo "Description: Australian English female (enhanced)" ;;
127
- Moira) echo "Description: Irish English female (enhanced)" ;;
128
- Tessa) echo "Description: South African English female (enhanced)" ;;
129
- Fiona) echo "Description: Scottish English female (enhanced)" ;;
130
- Veena) echo "Description: Indian English female (enhanced)" ;;
131
- esac
132
- }
133
-
134
- # @function count_voices
135
- # @intent Count total available voices
136
- # @returns Echoes count
137
- count_voices() {
138
- say -v ? 2>/dev/null | wc -l | tr -d ' '
139
- }
140
-
141
- # @function count_english_voices
142
- # @intent Count English voices
143
- # @returns Echoes count
144
- count_english_voices() {
145
- say -v ? 2>/dev/null | grep -i "en_" | wc -l | tr -d ' '
146
- }
147
-
148
- # Command-line interface
149
- if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
150
- case "${1:-}" in
151
- list)
152
- echo "🎤 Available macOS Voices:"
153
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
154
- list_macos_voices_detailed | while read -r voice lang; do
155
- printf " %-15s %s\n" "$voice" "$lang"
156
- done
157
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
158
- echo "Total: $(count_voices) voices"
159
- ;;
160
- list-english)
161
- echo "🎤 English macOS Voices:"
162
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
163
- list_english_voices
164
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
165
- echo "Total: $(count_english_voices) English voices"
166
- ;;
167
- recommended)
168
- echo "🌟 Recommended macOS Voices:"
169
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
170
- get_recommended_voices
171
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
172
- ;;
173
- info)
174
- if [[ -z "$2" ]]; then
175
- echo "Usage: $0 info <voice_name>"
176
- exit 1
177
- fi
178
- get_voice_info "$2"
179
- ;;
180
- validate)
181
- if [[ -z "$2" ]]; then
182
- echo "Usage: $0 validate <voice_name>"
183
- exit 1
184
- fi
185
- if validate_voice "$2"; then
186
- echo "✅ Voice '$2' is available"
187
- exit 0
188
- else
189
- echo "❌ Voice '$2' is not available"
190
- exit 1
191
- fi
192
- ;;
193
- *)
194
- echo "Usage: $0 {list|list-english|recommended|info|validate} [voice_name]"
195
- echo ""
196
- echo "Commands:"
197
- echo " list - List all available voices"
198
- echo " list-english - List English voices only"
199
- echo " recommended - List recommended high-quality voices"
200
- echo " info <voice> - Get details about a voice"
201
- echo " validate <voice> - Check if voice exists"
202
- exit 1
203
- ;;
204
- esac
205
- fi
1
+ #!/usr/bin/env bash
2
+ #
3
+ # File: .claude/hooks/macos-voice-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 macOS Voice Manager - Voice discovery and management for macOS 'say' command
30
+ # @context Provides voice listing, validation, and info for macOS native TTS
31
+ # @architecture Helper functions for play-tts-macos.sh provider
32
+ # @dependencies macOS only (Darwin), say command (built-in)
33
+ # @entrypoints Called by voice-manager.sh for provider-aware voice operations
34
+ # @patterns Voice enumeration via 'say -v ?', language filtering, quality tiers
35
+ # @related play-tts-macos.sh, voice-manager.sh, provider-manager.sh
36
+ #
37
+
38
+ # Platform guard
39
+ if [[ "$(uname -s)" != "Darwin" ]]; then
40
+ echo "❌ Error: macOS voice manager only works on macOS"
41
+ exit 1
42
+ fi
43
+
44
+ # @function list_macos_voices
45
+ # @intent List all available macOS voices
46
+ # @returns Echoes voice names one per line
47
+ list_macos_voices() {
48
+ say -v ? 2>/dev/null | awk '{print $1}'
49
+ }
50
+
51
+ # @function list_macos_voices_detailed
52
+ # @intent List all voices with language info
53
+ # @returns Echoes "voice_name language_code" per line
54
+ list_macos_voices_detailed() {
55
+ say -v ? 2>/dev/null | while read -r line; do
56
+ local voice=$(echo "$line" | awk '{print $1}')
57
+ local lang=$(echo "$line" | awk '{print $2}')
58
+ echo "$voice $lang"
59
+ done
60
+ }
61
+
62
+ # @function list_english_voices
63
+ # @intent List only English voices
64
+ # @returns Echoes English voice names
65
+ list_english_voices() {
66
+ say -v ? 2>/dev/null | grep -i "en_" | awk '{print $1}'
67
+ }
68
+
69
+ # @function get_voice_language
70
+ # @intent Get the language code for a voice
71
+ # @param $1 Voice name
72
+ # @returns Echoes language code (e.g., "en_US")
73
+ get_voice_language() {
74
+ local voice="$1"
75
+ say -v ? 2>/dev/null | grep -i "^${voice} " | awk '{print $2}'
76
+ }
77
+
78
+ # @function validate_voice
79
+ # @intent Check if a voice exists on this system
80
+ # @param $1 Voice name
81
+ # @returns 0 if valid, 1 if not found
82
+ validate_voice() {
83
+ local voice="$1"
84
+ say -v ? 2>/dev/null | grep -qi "^${voice} "
85
+ }
86
+
87
+ # @function get_recommended_voices
88
+ # @intent Get list of recommended high-quality voices
89
+ # @returns Echoes recommended voice names
90
+ get_recommended_voices() {
91
+ # These are typically the highest quality voices on macOS
92
+ local recommended=("Samantha" "Alex" "Daniel" "Karen" "Moira" "Tessa" "Fiona" "Veena" "Victoria")
93
+
94
+ for voice in "${recommended[@]}"; do
95
+ if validate_voice "$voice"; then
96
+ echo "$voice"
97
+ fi
98
+ done
99
+ }
100
+
101
+ # @function get_voice_info
102
+ # @intent Get detailed info about a specific voice
103
+ # @param $1 Voice name
104
+ # @returns Echoes voice details
105
+ get_voice_info() {
106
+ local voice="$1"
107
+
108
+ if ! validate_voice "$voice"; then
109
+ echo "❌ Voice not found: $voice"
110
+ return 1
111
+ fi
112
+
113
+ local full_info=$(say -v ? 2>/dev/null | grep -i "^${voice} ")
114
+ local lang=$(echo "$full_info" | awk '{print $2}')
115
+
116
+ echo "Voice: $voice"
117
+ echo "Language: $lang"
118
+ echo "Provider: macOS Say (built-in)"
119
+
120
+ # Add description for known voices
121
+ case "$voice" in
122
+ Alex) echo "Description: American English male (enhanced)" ;;
123
+ Samantha) echo "Description: American English female (enhanced)" ;;
124
+ Victoria) echo "Description: American English female" ;;
125
+ Daniel) echo "Description: British English male (enhanced)" ;;
126
+ Karen) echo "Description: Australian English female (enhanced)" ;;
127
+ Moira) echo "Description: Irish English female (enhanced)" ;;
128
+ Tessa) echo "Description: South African English female (enhanced)" ;;
129
+ Fiona) echo "Description: Scottish English female (enhanced)" ;;
130
+ Veena) echo "Description: Indian English female (enhanced)" ;;
131
+ esac
132
+ }
133
+
134
+ # @function count_voices
135
+ # @intent Count total available voices
136
+ # @returns Echoes count
137
+ count_voices() {
138
+ say -v ? 2>/dev/null | wc -l | tr -d ' '
139
+ }
140
+
141
+ # @function count_english_voices
142
+ # @intent Count English voices
143
+ # @returns Echoes count
144
+ count_english_voices() {
145
+ say -v ? 2>/dev/null | grep -i "en_" | wc -l | tr -d ' '
146
+ }
147
+
148
+ # Command-line interface
149
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
150
+ case "${1:-}" in
151
+ list)
152
+ echo "🎤 Available macOS Voices:"
153
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
154
+ list_macos_voices_detailed | while read -r voice lang; do
155
+ printf " %-15s %s\n" "$voice" "$lang"
156
+ done
157
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
158
+ echo "Total: $(count_voices) voices"
159
+ ;;
160
+ list-english)
161
+ echo "🎤 English macOS Voices:"
162
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
163
+ list_english_voices
164
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
165
+ echo "Total: $(count_english_voices) English voices"
166
+ ;;
167
+ recommended)
168
+ echo "🌟 Recommended macOS Voices:"
169
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
170
+ get_recommended_voices
171
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
172
+ ;;
173
+ info)
174
+ if [[ -z "$2" ]]; then
175
+ echo "Usage: $0 info <voice_name>"
176
+ exit 1
177
+ fi
178
+ get_voice_info "$2"
179
+ ;;
180
+ validate)
181
+ if [[ -z "$2" ]]; then
182
+ echo "Usage: $0 validate <voice_name>"
183
+ exit 1
184
+ fi
185
+ if validate_voice "$2"; then
186
+ echo "✅ Voice '$2' is available"
187
+ exit 0
188
+ else
189
+ echo "❌ Voice '$2' is not available"
190
+ exit 1
191
+ fi
192
+ ;;
193
+ *)
194
+ echo "Usage: $0 {list|list-english|recommended|info|validate} [voice_name]"
195
+ echo ""
196
+ echo "Commands:"
197
+ echo " list - List all available voices"
198
+ echo " list-english - List English voices only"
199
+ echo " recommended - List recommended high-quality voices"
200
+ echo " info <voice> - Get details about a voice"
201
+ echo " validate <voice> - Check if voice exists"
202
+ exit 1
203
+ ;;
204
+ esac
205
+ fi
@@ -1,125 +1,125 @@
1
- #!/usr/bin/env bash
2
- #
3
- # File: .claude/hooks/migrate-background-music.sh
4
- #
5
- # AgentVibes - Background Music Migration Script
6
- # Cleans up old background music structure from previous versions
7
- #
8
- # This script removes:
9
- # - Old optimized/ subdirectory
10
- # - Old PascalCase/space-formatted filenames
11
- # - Outdated config entries with optimized/ prefix
12
- #
13
- # Called automatically during installation to ensure clean state
14
- #
15
-
16
- set -euo pipefail
17
- export LC_ALL=C
18
-
19
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
20
- PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
21
-
22
- BG_DIR="$SCRIPT_DIR/../audio/tracks"
23
- CONFIG_FILE="$SCRIPT_DIR/../config/audio-effects.cfg"
24
-
25
- # Flag to track if any changes were made
26
- CHANGES_MADE=false
27
-
28
- echo "🔄 Checking for old background music structure..."
29
-
30
- # 1. Remove old optimized/ subdirectory if it exists
31
- if [[ -d "$BG_DIR/optimized" ]]; then
32
- echo " → Removing old optimized/ subdirectory..."
33
-
34
- # Check if there are any files in optimized/ that aren't in the parent
35
- if [[ -n "$(find "$BG_DIR/optimized" -type f -name "*.mp3" 2>/dev/null)" ]]; then
36
- # Move any unique files up before deleting
37
- find "$BG_DIR/optimized" -type f -name "*.mp3" 2>/dev/null | while IFS= read -r file; do
38
- basename_file=$(basename "$file")
39
- # Convert to snake_case if needed
40
- snake_case_file=$(echo "$basename_file" | tr '[:upper:]' '[:lower:]' | tr ' ' '_' | tr '-' '_')
41
-
42
- # Only move if file doesn't exist in parent with snake_case name
43
- if [[ ! -f "$BG_DIR/$snake_case_file" ]]; then
44
- echo " • Migrating: $basename_file → $snake_case_file"
45
- mv "$file" "$BG_DIR/$snake_case_file"
46
- CHANGES_MADE=true
47
- fi
48
- done
49
- fi
50
-
51
- # Remove the optimized directory
52
- rm -rf "$BG_DIR/optimized"
53
- echo " ✓ Removed optimized/ subdirectory"
54
- CHANGES_MADE=true
55
- fi
56
-
57
- # 2. Remove old PascalCase/space-formatted files if snake_case versions exist
58
- if [[ -d "$BG_DIR" ]]; then
59
- find "$BG_DIR" -maxdepth 1 -type f -name "*.mp3" 2>/dev/null | while IFS= read -r file; do
60
- basename_file=$(basename "$file")
61
-
62
- # Check if this file has spaces or uppercase letters (old format)
63
- if [[ "$basename_file" =~ [[:space:]] ]] || [[ "$basename_file" =~ [A-Z] ]]; then
64
- # Generate snake_case equivalent
65
- snake_case_file=$(echo "$basename_file" | tr '[:upper:]' '[:lower:]' | tr ' ' '_' | tr '-' '_')
66
-
67
- # If snake_case version exists, remove the old format
68
- if [[ -f "$BG_DIR/$snake_case_file" ]] && [[ "$basename_file" != "$snake_case_file" ]]; then
69
- echo " → Removing old format: $basename_file (replaced by $snake_case_file)"
70
- rm -f "$file"
71
- CHANGES_MADE=true
72
- fi
73
- fi
74
- done
75
- fi
76
-
77
- # 3. Update audio-effects.cfg to remove optimized/ prefixes
78
- if [[ -f "$CONFIG_FILE" ]]; then
79
- if grep -q "optimized/" "$CONFIG_FILE" 2>/dev/null; then
80
- echo " → Updating config to remove optimized/ prefixes..."
81
-
82
- # Create backup
83
- cp "$CONFIG_FILE" "${CONFIG_FILE}.backup-migration"
84
-
85
- # Remove optimized/ prefix from all entries
86
- sed -i.bak 's|optimized/||g' "$CONFIG_FILE"
87
- rm -f "${CONFIG_FILE}.bak"
88
-
89
- echo " ✓ Updated audio-effects.cfg"
90
- CHANGES_MADE=true
91
- fi
92
-
93
- # Also convert any remaining PascalCase/space filenames to snake_case in config
94
- if grep -E '\|[^|]*[A-Z ][^|]*\.mp3\|' "$CONFIG_FILE" 2>/dev/null | grep -v '^#' > /dev/null; then
95
- echo " → Converting config entries to snake_case..."
96
-
97
- # This is complex - we need to convert field 3 (background file) to snake_case
98
- temp_file=$(mktemp)
99
- while IFS='|' read -r field1 field2 field3 field4 rest; do
100
- # Skip comments and empty lines
101
- if [[ "$field1" =~ ^#.* ]] || [[ -z "$field1" ]]; then
102
- echo "$field1|$field2|$field3|$field4$rest"
103
- continue
104
- fi
105
-
106
- # Convert field3 (background file) to snake_case if it contains spaces or uppercase
107
- if [[ -n "$field3" ]] && ([[ "$field3" =~ [[:space:]] ]] || [[ "$field3" =~ [A-Z] ]]); then
108
- new_field3=$(echo "$field3" | tr '[:upper:]' '[:lower:]' | tr ' ' '_' | tr '-' '_')
109
- echo "$field1|$field2|$new_field3|$field4$rest"
110
- else
111
- echo "$field1|$field2|$field3|$field4$rest"
112
- fi
113
- done < "$CONFIG_FILE" > "$temp_file"
114
-
115
- mv "$temp_file" "$CONFIG_FILE"
116
- echo " ✓ Converted config entries to snake_case"
117
- CHANGES_MADE=true
118
- fi
119
- fi
120
-
121
- if [[ "$CHANGES_MADE" == "true" ]]; then
122
- echo "✅ Migration complete! Old background music structure cleaned up."
123
- else
124
- echo "✅ No migration needed - structure is already up to date."
125
- fi
1
+ #!/usr/bin/env bash
2
+ #
3
+ # File: .claude/hooks/migrate-background-music.sh
4
+ #
5
+ # AgentVibes - Background Music Migration Script
6
+ # Cleans up old background music structure from previous versions
7
+ #
8
+ # This script removes:
9
+ # - Old optimized/ subdirectory
10
+ # - Old PascalCase/space-formatted filenames
11
+ # - Outdated config entries with optimized/ prefix
12
+ #
13
+ # Called automatically during installation to ensure clean state
14
+ #
15
+
16
+ set -euo pipefail
17
+ export LC_ALL=C
18
+
19
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
20
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
21
+
22
+ BG_DIR="$SCRIPT_DIR/../audio/tracks"
23
+ CONFIG_FILE="$SCRIPT_DIR/../config/audio-effects.cfg"
24
+
25
+ # Flag to track if any changes were made
26
+ CHANGES_MADE=false
27
+
28
+ echo "🔄 Checking for old background music structure..."
29
+
30
+ # 1. Remove old optimized/ subdirectory if it exists
31
+ if [[ -d "$BG_DIR/optimized" ]]; then
32
+ echo " → Removing old optimized/ subdirectory..."
33
+
34
+ # Check if there are any files in optimized/ that aren't in the parent
35
+ if [[ -n "$(find "$BG_DIR/optimized" -type f -name "*.mp3" 2>/dev/null)" ]]; then
36
+ # Move any unique files up before deleting
37
+ find "$BG_DIR/optimized" -type f -name "*.mp3" 2>/dev/null | while IFS= read -r file; do
38
+ basename_file=$(basename "$file")
39
+ # Convert to snake_case if needed
40
+ snake_case_file=$(echo "$basename_file" | tr '[:upper:]' '[:lower:]' | tr ' ' '_' | tr '-' '_')
41
+
42
+ # Only move if file doesn't exist in parent with snake_case name
43
+ if [[ ! -f "$BG_DIR/$snake_case_file" ]]; then
44
+ echo " • Migrating: $basename_file → $snake_case_file"
45
+ mv "$file" "$BG_DIR/$snake_case_file"
46
+ CHANGES_MADE=true
47
+ fi
48
+ done
49
+ fi
50
+
51
+ # Remove the optimized directory
52
+ rm -rf "$BG_DIR/optimized"
53
+ echo " ✓ Removed optimized/ subdirectory"
54
+ CHANGES_MADE=true
55
+ fi
56
+
57
+ # 2. Remove old PascalCase/space-formatted files if snake_case versions exist
58
+ if [[ -d "$BG_DIR" ]]; then
59
+ find "$BG_DIR" -maxdepth 1 -type f -name "*.mp3" 2>/dev/null | while IFS= read -r file; do
60
+ basename_file=$(basename "$file")
61
+
62
+ # Check if this file has spaces or uppercase letters (old format)
63
+ if [[ "$basename_file" =~ [[:space:]] ]] || [[ "$basename_file" =~ [A-Z] ]]; then
64
+ # Generate snake_case equivalent
65
+ snake_case_file=$(echo "$basename_file" | tr '[:upper:]' '[:lower:]' | tr ' ' '_' | tr '-' '_')
66
+
67
+ # If snake_case version exists, remove the old format
68
+ if [[ -f "$BG_DIR/$snake_case_file" ]] && [[ "$basename_file" != "$snake_case_file" ]]; then
69
+ echo " → Removing old format: $basename_file (replaced by $snake_case_file)"
70
+ rm -f "$file"
71
+ CHANGES_MADE=true
72
+ fi
73
+ fi
74
+ done
75
+ fi
76
+
77
+ # 3. Update audio-effects.cfg to remove optimized/ prefixes
78
+ if [[ -f "$CONFIG_FILE" ]]; then
79
+ if grep -q "optimized/" "$CONFIG_FILE" 2>/dev/null; then
80
+ echo " → Updating config to remove optimized/ prefixes..."
81
+
82
+ # Create backup
83
+ cp "$CONFIG_FILE" "${CONFIG_FILE}.backup-migration"
84
+
85
+ # Remove optimized/ prefix from all entries
86
+ sed -i.bak 's|optimized/||g' "$CONFIG_FILE"
87
+ rm -f "${CONFIG_FILE}.bak"
88
+
89
+ echo " ✓ Updated audio-effects.cfg"
90
+ CHANGES_MADE=true
91
+ fi
92
+
93
+ # Also convert any remaining PascalCase/space filenames to snake_case in config
94
+ if grep -E '\|[^|]*[A-Z ][^|]*\.mp3\|' "$CONFIG_FILE" 2>/dev/null | grep -v '^#' > /dev/null; then
95
+ echo " → Converting config entries to snake_case..."
96
+
97
+ # This is complex - we need to convert field 3 (background file) to snake_case
98
+ temp_file=$(mktemp)
99
+ while IFS='|' read -r field1 field2 field3 field4 rest; do
100
+ # Skip comments and empty lines
101
+ if [[ "$field1" =~ ^#.* ]] || [[ -z "$field1" ]]; then
102
+ echo "$field1|$field2|$field3|$field4$rest"
103
+ continue
104
+ fi
105
+
106
+ # Convert field3 (background file) to snake_case if it contains spaces or uppercase
107
+ if [[ -n "$field3" ]] && ([[ "$field3" =~ [[:space:]] ]] || [[ "$field3" =~ [A-Z] ]]); then
108
+ new_field3=$(echo "$field3" | tr '[:upper:]' '[:lower:]' | tr ' ' '_' | tr '-' '_')
109
+ echo "$field1|$field2|$new_field3|$field4$rest"
110
+ else
111
+ echo "$field1|$field2|$field3|$field4$rest"
112
+ fi
113
+ done < "$CONFIG_FILE" > "$temp_file"
114
+
115
+ mv "$temp_file" "$CONFIG_FILE"
116
+ echo " ✓ Converted config entries to snake_case"
117
+ CHANGES_MADE=true
118
+ fi
119
+ fi
120
+
121
+ if [[ "$CHANGES_MADE" == "true" ]]; then
122
+ echo "✅ Migration complete! Old background music structure cleaned up."
123
+ else
124
+ echo "✅ No migration needed - structure is already up to date."
125
+ fi