agentvibes 5.13.1 → 5.14.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 (82) hide show
  1. package/.claude/audio/ui/CREDITS.txt +16 -16
  2. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  3. package/.claude/commands/agent-vibes-rdp.md +24 -24
  4. package/.claude/config/audio-effects.cfg.sample +52 -52
  5. package/.claude/docs/TERMUX_SETUP.md +408 -408
  6. package/.claude/github-star-reminder.txt +1 -1
  7. package/.claude/hooks/kokoro-server.py +219 -219
  8. package/.claude/hooks/kokoro-tts.py +141 -141
  9. package/.claude/hooks/party-stage-roster.py +328 -328
  10. package/.claude/hooks/play-tts-kokoro.sh +7 -2
  11. package/.claude/hooks/play-tts-ssh-remote.sh +38 -3
  12. package/.claude/hooks/requirements.txt +6 -6
  13. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  14. package/.claude/hooks/translator.py +237 -237
  15. package/.claude/hooks-windows/kokoro-server.py +219 -219
  16. package/.claude/hooks-windows/kokoro-tts.py +107 -107
  17. package/.claude/hooks-windows/play-tts.ps1 +17 -0
  18. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  19. package/.claude/verbosity.txt +1 -1
  20. package/.clawdbot/README.md +105 -105
  21. package/CLAUDE.md +84 -176
  22. package/README.md +27 -2
  23. package/RELEASE_NOTES.md +68 -0
  24. package/WINDOWS-SETUP.md +208 -208
  25. package/bin/agent-vibes +39 -39
  26. package/bin/mcp-server.js +121 -121
  27. package/bin/test-bmad-pr +78 -78
  28. package/mcp-server/QUICK_START.md +203 -203
  29. package/mcp-server/README.md +345 -345
  30. package/mcp-server/examples/claude_desktop_config.json +11 -11
  31. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  32. package/mcp-server/examples/custom_instructions.md +169 -169
  33. package/mcp-server/install-deps.js +12 -2
  34. package/mcp-server/server.py +2111 -2085
  35. package/mcp-server/test_mcp_correctness.py +504 -504
  36. package/mcp-server/test_windows_script_parity.py +339 -339
  37. package/package.json +6 -3
  38. package/setup-ssh-receiver.ps1 +259 -0
  39. package/setup-windows.ps1 +39 -29
  40. package/src/cli/list-personalities.js +110 -110
  41. package/src/commands/bmad-voices.js +394 -394
  42. package/src/console/brand-colors.js +13 -13
  43. package/src/console/constants/personalities.js +44 -44
  44. package/src/console/tabs/agents-tab.js +14 -4
  45. package/src/console/tabs/help-tab.js +314 -314
  46. package/src/console/tabs/readme-tab.js +272 -272
  47. package/src/console/tabs/settings-tab.js +31 -6
  48. package/src/console/tabs/setup-tab.js +154 -32
  49. package/src/console/tabs/voices-tab.js +48 -6
  50. package/src/console/widgets/destroy-list.js +25 -25
  51. package/src/console/widgets/notice.js +55 -55
  52. package/src/installer/language-screen.js +31 -31
  53. package/src/installer/music-file-input.js +304 -304
  54. package/src/installer.js +91 -35
  55. package/src/services/language-service.js +47 -47
  56. package/src/services/llm-provider-service.js +4 -1
  57. package/src/services/provider-voice-catalog.js +9 -5
  58. package/src/utils/audio-format-validator.js +277 -277
  59. package/src/utils/dependency-checker.js +469 -469
  60. package/src/utils/file-ownership-verifier.js +358 -358
  61. package/src/utils/music-file-validator.js +285 -285
  62. package/src/utils/preview-list-prompt.js +144 -144
  63. package/src/utils/secure-music-storage.js +412 -412
  64. package/templates/agentvibes-receiver.ps1 +311 -0
  65. package/templates/agentvibes-receiver.sh +297 -297
  66. package/voice-assignments.json +8244 -8244
  67. package/.agentvibes/config.json +0 -17
  68. package/.agentvibes/install-manifest.json +0 -362
  69. package/.claude/config/audio-effects.cfg +0 -7
  70. package/.claude/config/audio-effects.cfg.bak-kokoro +0 -7
  71. package/.claude/config/background-music-enabled.txt +0 -1
  72. package/.claude/config/background-music-position.txt +0 -27
  73. package/.claude/config/background-music-volume.txt +0 -1
  74. package/.claude/config/background-music.cfg +0 -1
  75. package/.claude/config/background-music.txt +0 -1
  76. package/.claude/config/language.txt +0 -1
  77. package/.claude/config/personality.txt +0 -1
  78. package/.claude/config/reverb-level.txt +0 -1
  79. package/.claude/config/tts-speech-rate.txt +0 -1
  80. package/.claude/config/tts-verbosity.txt +0 -1
  81. package/.claude/hooks-windows/audio-cache-utils.ps1.user.bak +0 -119
  82. package/.claude/hooks-windows/soprano-gradio-synth.py.user.bak +0 -153
@@ -1,237 +1,237 @@
1
- #!/usr/bin/env python3
2
- #
3
- # File: .claude/hooks/translator.py
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 Text translator for multi-language TTS and learning mode
30
- # @context Provides automatic translation using Google Translate via deep-translator library
31
- # @architecture Standalone CLI module callable from bash scripts, with library mode for Python imports
32
- # @dependencies deep-translator, langdetect (pip install deep-translator langdetect)
33
- # @entrypoints CLI: python3 translator.py <text> <target_lang>, Library: from translator import translate
34
- # @patterns Command pattern - supports translate, detect, and batch operations
35
- # @related play-tts.sh, language-manager.sh
36
- #
37
-
38
- """
39
- Text translation utilities for AgentVibes multi-language TTS.
40
-
41
- Provides automatic translation of TTS text to the user's preferred language,
42
- supporting both BMAD communication_language settings and learning mode.
43
-
44
- Usage:
45
- CLI: python3 translator.py <text> <target_language>
46
- Library: from translator import translate, detect_language
47
- """
48
-
49
- import sys
50
- import os
51
- from typing import Optional, Tuple
52
-
53
- # Language name to ISO code mapping
54
- LANG_CODES = {
55
- 'spanish': 'es', 'español': 'es', 'es': 'es',
56
- 'french': 'fr', 'français': 'fr', 'fr': 'fr',
57
- 'german': 'de', 'deutsch': 'de', 'de': 'de',
58
- 'italian': 'it', 'italiano': 'it', 'it': 'it',
59
- 'portuguese': 'pt', 'português': 'pt', 'pt': 'pt',
60
- 'chinese': 'zh-CN', 'mandarin': 'zh-CN', 'zh': 'zh-CN', '中文': 'zh-CN',
61
- 'japanese': 'ja', '日本語': 'ja', 'ja': 'ja',
62
- 'korean': 'ko', '한국어': 'ko', 'ko': 'ko',
63
- 'russian': 'ru', 'русский': 'ru', 'ru': 'ru',
64
- 'polish': 'pl', 'polski': 'pl', 'pl': 'pl',
65
- 'dutch': 'nl', 'nederlands': 'nl', 'nl': 'nl',
66
- 'turkish': 'tr', 'türkçe': 'tr', 'tr': 'tr',
67
- 'arabic': 'ar', 'العربية': 'ar', 'ar': 'ar',
68
- 'hindi': 'hi', 'हिन्दी': 'hi', 'hi': 'hi',
69
- 'swedish': 'sv', 'svenska': 'sv', 'sv': 'sv',
70
- 'danish': 'da', 'dansk': 'da', 'da': 'da',
71
- 'norwegian': 'no', 'norsk': 'no', 'no': 'no',
72
- 'finnish': 'fi', 'suomi': 'fi', 'fi': 'fi',
73
- 'czech': 'cs', 'čeština': 'cs', 'cs': 'cs',
74
- 'romanian': 'ro', 'română': 'ro', 'ro': 'ro',
75
- 'ukrainian': 'uk', 'українська': 'uk', 'uk': 'uk',
76
- 'greek': 'el', 'ελληνικά': 'el', 'el': 'el',
77
- 'bulgarian': 'bg', 'български': 'bg', 'bg': 'bg',
78
- 'croatian': 'hr', 'hrvatski': 'hr', 'hr': 'hr',
79
- 'slovak': 'sk', 'slovenčina': 'sk', 'sk': 'sk',
80
- 'english': 'en', 'en': 'en',
81
- }
82
-
83
-
84
- def get_lang_code(language: str) -> str:
85
- """
86
- Convert language name to ISO code.
87
-
88
- Args:
89
- language: Language name or code (e.g., 'spanish', 'es', 'español')
90
-
91
- Returns:
92
- ISO language code (e.g., 'es')
93
- """
94
- lang_lower = language.lower().strip()
95
- return LANG_CODES.get(lang_lower, lang_lower)
96
-
97
-
98
- def detect_language(text: str) -> Optional[str]:
99
- """
100
- Detect the language of given text.
101
-
102
- Args:
103
- text: Text to analyze
104
-
105
- Returns:
106
- Language code (e.g., 'es', 'fr', 'en') or None if detection fails
107
- """
108
- if not text or len(text.strip()) < 3:
109
- return None
110
-
111
- try:
112
- from langdetect import detect, LangDetectException
113
- return detect(text)
114
- except ImportError:
115
- print("Warning: langdetect not installed. Run: pip install langdetect", file=sys.stderr)
116
- return None
117
- except Exception:
118
- return None
119
-
120
-
121
- def translate(text: str, target_lang: str, source_lang: str = 'en') -> Tuple[str, bool]:
122
- """
123
- Translate text to target language.
124
-
125
- Args:
126
- text: Text to translate
127
- target_lang: Target language (name or code)
128
- source_lang: Source language (default: 'en')
129
-
130
- Returns:
131
- Tuple of (translated_text, success)
132
- """
133
- if not text or not text.strip():
134
- return text, False
135
-
136
- # Convert language names to codes
137
- target_code = get_lang_code(target_lang)
138
- source_code = get_lang_code(source_lang)
139
-
140
- # Skip if source and target are the same
141
- if target_code == source_code:
142
- return text, False
143
-
144
- # Skip if target is English and source is also English
145
- if target_code == 'en' and source_code == 'en':
146
- return text, False
147
-
148
- try:
149
- from deep_translator import GoogleTranslator
150
-
151
- translator = GoogleTranslator(source=source_code, target=target_code)
152
- translated = translator.translate(text)
153
-
154
- if translated:
155
- return translated, True
156
- return text, False
157
-
158
- except ImportError:
159
- print("Error: deep-translator not installed. Run: pip install deep-translator", file=sys.stderr)
160
- return text, False
161
- except Exception as e:
162
- print(f"Translation error: {e}", file=sys.stderr)
163
- return text, False
164
-
165
-
166
- def translate_auto(text: str, target_lang: str) -> Tuple[str, bool, Optional[str]]:
167
- """
168
- Translate text to target language with auto-detection of source language.
169
-
170
- Args:
171
- text: Text to translate
172
- target_lang: Target language (name or code)
173
-
174
- Returns:
175
- Tuple of (translated_text, success, detected_source_lang)
176
- """
177
- if not text or not text.strip():
178
- return text, False, None
179
-
180
- # Detect source language
181
- detected = detect_language(text)
182
-
183
- # Convert target to code
184
- target_code = get_lang_code(target_lang)
185
-
186
- # Skip if detected language matches target
187
- if detected and detected == target_code:
188
- return text, False, detected
189
-
190
- # Translate
191
- translated, success = translate(text, target_lang, source_lang=detected or 'en')
192
- return translated, success, detected
193
-
194
-
195
- def main():
196
- """CLI entry point for translator."""
197
- if len(sys.argv) < 3:
198
- print("Usage: translator.py <text> <target_language> [source_language]", file=sys.stderr)
199
- print(" translator.py detect <text>", file=sys.stderr)
200
- print("", file=sys.stderr)
201
- print("Examples:", file=sys.stderr)
202
- print(" translator.py 'Hello world' spanish", file=sys.stderr)
203
- print(" translator.py 'Hello world' es en", file=sys.stderr)
204
- print(" translator.py detect 'Hola mundo'", file=sys.stderr)
205
- sys.exit(1)
206
-
207
- command = sys.argv[1]
208
-
209
- # Detection mode
210
- if command == 'detect':
211
- if len(sys.argv) < 3:
212
- print("Usage: translator.py detect <text>", file=sys.stderr)
213
- sys.exit(1)
214
- text = sys.argv[2]
215
- detected = detect_language(text)
216
- if detected:
217
- print(detected)
218
- else:
219
- print("unknown")
220
- sys.exit(0)
221
-
222
- # Translation mode
223
- text = sys.argv[1]
224
- target_lang = sys.argv[2]
225
- source_lang = sys.argv[3] if len(sys.argv) > 3 else 'en'
226
-
227
- translated, success = translate(text, target_lang, source_lang)
228
-
229
- # Output the result (for shell script consumption)
230
- print(translated)
231
-
232
- # Exit with appropriate code
233
- sys.exit(0 if success else 1)
234
-
235
-
236
- if __name__ == '__main__':
237
- main()
1
+ #!/usr/bin/env python3
2
+ #
3
+ # File: .claude/hooks/translator.py
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 Text translator for multi-language TTS and learning mode
30
+ # @context Provides automatic translation using Google Translate via deep-translator library
31
+ # @architecture Standalone CLI module callable from bash scripts, with library mode for Python imports
32
+ # @dependencies deep-translator, langdetect (pip install deep-translator langdetect)
33
+ # @entrypoints CLI: python3 translator.py <text> <target_lang>, Library: from translator import translate
34
+ # @patterns Command pattern - supports translate, detect, and batch operations
35
+ # @related play-tts.sh, language-manager.sh
36
+ #
37
+
38
+ """
39
+ Text translation utilities for AgentVibes multi-language TTS.
40
+
41
+ Provides automatic translation of TTS text to the user's preferred language,
42
+ supporting both BMAD communication_language settings and learning mode.
43
+
44
+ Usage:
45
+ CLI: python3 translator.py <text> <target_language>
46
+ Library: from translator import translate, detect_language
47
+ """
48
+
49
+ import sys
50
+ import os
51
+ from typing import Optional, Tuple
52
+
53
+ # Language name to ISO code mapping
54
+ LANG_CODES = {
55
+ 'spanish': 'es', 'español': 'es', 'es': 'es',
56
+ 'french': 'fr', 'français': 'fr', 'fr': 'fr',
57
+ 'german': 'de', 'deutsch': 'de', 'de': 'de',
58
+ 'italian': 'it', 'italiano': 'it', 'it': 'it',
59
+ 'portuguese': 'pt', 'português': 'pt', 'pt': 'pt',
60
+ 'chinese': 'zh-CN', 'mandarin': 'zh-CN', 'zh': 'zh-CN', '中文': 'zh-CN',
61
+ 'japanese': 'ja', '日本語': 'ja', 'ja': 'ja',
62
+ 'korean': 'ko', '한국어': 'ko', 'ko': 'ko',
63
+ 'russian': 'ru', 'русский': 'ru', 'ru': 'ru',
64
+ 'polish': 'pl', 'polski': 'pl', 'pl': 'pl',
65
+ 'dutch': 'nl', 'nederlands': 'nl', 'nl': 'nl',
66
+ 'turkish': 'tr', 'türkçe': 'tr', 'tr': 'tr',
67
+ 'arabic': 'ar', 'العربية': 'ar', 'ar': 'ar',
68
+ 'hindi': 'hi', 'हिन्दी': 'hi', 'hi': 'hi',
69
+ 'swedish': 'sv', 'svenska': 'sv', 'sv': 'sv',
70
+ 'danish': 'da', 'dansk': 'da', 'da': 'da',
71
+ 'norwegian': 'no', 'norsk': 'no', 'no': 'no',
72
+ 'finnish': 'fi', 'suomi': 'fi', 'fi': 'fi',
73
+ 'czech': 'cs', 'čeština': 'cs', 'cs': 'cs',
74
+ 'romanian': 'ro', 'română': 'ro', 'ro': 'ro',
75
+ 'ukrainian': 'uk', 'українська': 'uk', 'uk': 'uk',
76
+ 'greek': 'el', 'ελληνικά': 'el', 'el': 'el',
77
+ 'bulgarian': 'bg', 'български': 'bg', 'bg': 'bg',
78
+ 'croatian': 'hr', 'hrvatski': 'hr', 'hr': 'hr',
79
+ 'slovak': 'sk', 'slovenčina': 'sk', 'sk': 'sk',
80
+ 'english': 'en', 'en': 'en',
81
+ }
82
+
83
+
84
+ def get_lang_code(language: str) -> str:
85
+ """
86
+ Convert language name to ISO code.
87
+
88
+ Args:
89
+ language: Language name or code (e.g., 'spanish', 'es', 'español')
90
+
91
+ Returns:
92
+ ISO language code (e.g., 'es')
93
+ """
94
+ lang_lower = language.lower().strip()
95
+ return LANG_CODES.get(lang_lower, lang_lower)
96
+
97
+
98
+ def detect_language(text: str) -> Optional[str]:
99
+ """
100
+ Detect the language of given text.
101
+
102
+ Args:
103
+ text: Text to analyze
104
+
105
+ Returns:
106
+ Language code (e.g., 'es', 'fr', 'en') or None if detection fails
107
+ """
108
+ if not text or len(text.strip()) < 3:
109
+ return None
110
+
111
+ try:
112
+ from langdetect import detect, LangDetectException
113
+ return detect(text)
114
+ except ImportError:
115
+ print("Warning: langdetect not installed. Run: pip install langdetect", file=sys.stderr)
116
+ return None
117
+ except Exception:
118
+ return None
119
+
120
+
121
+ def translate(text: str, target_lang: str, source_lang: str = 'en') -> Tuple[str, bool]:
122
+ """
123
+ Translate text to target language.
124
+
125
+ Args:
126
+ text: Text to translate
127
+ target_lang: Target language (name or code)
128
+ source_lang: Source language (default: 'en')
129
+
130
+ Returns:
131
+ Tuple of (translated_text, success)
132
+ """
133
+ if not text or not text.strip():
134
+ return text, False
135
+
136
+ # Convert language names to codes
137
+ target_code = get_lang_code(target_lang)
138
+ source_code = get_lang_code(source_lang)
139
+
140
+ # Skip if source and target are the same
141
+ if target_code == source_code:
142
+ return text, False
143
+
144
+ # Skip if target is English and source is also English
145
+ if target_code == 'en' and source_code == 'en':
146
+ return text, False
147
+
148
+ try:
149
+ from deep_translator import GoogleTranslator
150
+
151
+ translator = GoogleTranslator(source=source_code, target=target_code)
152
+ translated = translator.translate(text)
153
+
154
+ if translated:
155
+ return translated, True
156
+ return text, False
157
+
158
+ except ImportError:
159
+ print("Error: deep-translator not installed. Run: pip install deep-translator", file=sys.stderr)
160
+ return text, False
161
+ except Exception as e:
162
+ print(f"Translation error: {e}", file=sys.stderr)
163
+ return text, False
164
+
165
+
166
+ def translate_auto(text: str, target_lang: str) -> Tuple[str, bool, Optional[str]]:
167
+ """
168
+ Translate text to target language with auto-detection of source language.
169
+
170
+ Args:
171
+ text: Text to translate
172
+ target_lang: Target language (name or code)
173
+
174
+ Returns:
175
+ Tuple of (translated_text, success, detected_source_lang)
176
+ """
177
+ if not text or not text.strip():
178
+ return text, False, None
179
+
180
+ # Detect source language
181
+ detected = detect_language(text)
182
+
183
+ # Convert target to code
184
+ target_code = get_lang_code(target_lang)
185
+
186
+ # Skip if detected language matches target
187
+ if detected and detected == target_code:
188
+ return text, False, detected
189
+
190
+ # Translate
191
+ translated, success = translate(text, target_lang, source_lang=detected or 'en')
192
+ return translated, success, detected
193
+
194
+
195
+ def main():
196
+ """CLI entry point for translator."""
197
+ if len(sys.argv) < 3:
198
+ print("Usage: translator.py <text> <target_language> [source_language]", file=sys.stderr)
199
+ print(" translator.py detect <text>", file=sys.stderr)
200
+ print("", file=sys.stderr)
201
+ print("Examples:", file=sys.stderr)
202
+ print(" translator.py 'Hello world' spanish", file=sys.stderr)
203
+ print(" translator.py 'Hello world' es en", file=sys.stderr)
204
+ print(" translator.py detect 'Hola mundo'", file=sys.stderr)
205
+ sys.exit(1)
206
+
207
+ command = sys.argv[1]
208
+
209
+ # Detection mode
210
+ if command == 'detect':
211
+ if len(sys.argv) < 3:
212
+ print("Usage: translator.py detect <text>", file=sys.stderr)
213
+ sys.exit(1)
214
+ text = sys.argv[2]
215
+ detected = detect_language(text)
216
+ if detected:
217
+ print(detected)
218
+ else:
219
+ print("unknown")
220
+ sys.exit(0)
221
+
222
+ # Translation mode
223
+ text = sys.argv[1]
224
+ target_lang = sys.argv[2]
225
+ source_lang = sys.argv[3] if len(sys.argv) > 3 else 'en'
226
+
227
+ translated, success = translate(text, target_lang, source_lang)
228
+
229
+ # Output the result (for shell script consumption)
230
+ print(translated)
231
+
232
+ # Exit with appropriate code
233
+ sys.exit(0 if success else 1)
234
+
235
+
236
+ if __name__ == '__main__':
237
+ main()