agentvibes 2.0.20 → 2.0.22

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 (233) hide show
  1. package/.claude/agents/health-coach.md +154 -0
  2. package/.claude/agents/motivator.md +171 -0
  3. package/.claude/agents/negotiator.md +97 -0
  4. package/.claude/commands/agent-vibes/agent-health-coach.md +15 -0
  5. package/.claude/commands/agent-vibes/agent-motivator.md +15 -0
  6. package/.claude/commands/agent-vibes/agent-negotiator.md +15 -0
  7. package/.claude/commands/agent-vibes/agent.md +79 -0
  8. package/.claude/commands/agent-vibes/commands.json +4 -0
  9. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -0
  10. package/.claude/github-star-reminder.txt +1 -1
  11. package/.claude/hooks/download-extra-voices.sh +244 -0
  12. package/.claude/hooks/personality-manager.sh +81 -0
  13. package/.claude/hooks/piper-download-voices.sh +3 -93
  14. package/.claude/hooks/piper-multispeaker-registry.sh +165 -0
  15. package/.claude/hooks/play-tts-elevenlabs.sh +5 -3
  16. package/.claude/hooks/play-tts-piper.sh +27 -44
  17. package/.claude/hooks/provider-manager.sh +24 -5
  18. package/.claude/hooks/speed-manager.sh +10 -12
  19. package/.claude/hooks/voice-manager.sh +94 -56
  20. package/README.md +0 -3
  21. package/RELEASE_NOTES.md +40 -247
  22. package/docs/agents.md +485 -0
  23. package/docs/commands.md +1 -21
  24. package/docs/extra-voices-implementation-summary.md +235 -0
  25. package/docs/voice-registration-fix.md +254 -0
  26. package/fix-vscode-colors.sh +88 -0
  27. package/fixcolors +88 -0
  28. package/generate-all-agent-voices.sh +174 -0
  29. package/generate-missing-elevenlabs-complete.sh +236 -0
  30. package/generate-missing-elevenlabs.sh +110 -0
  31. package/generate-new-voices.sh +108 -0
  32. package/generate-piper-agent-intros.sh +85 -0
  33. package/generate-provider-and-agent-intros.sh +136 -0
  34. package/logo/fav_icon_128x128.png +0 -0
  35. package/logo/fav_icon_128x128.png:Zone.Identifier +4 -0
  36. package/logo/logo1.webp +0 -0
  37. package/logo/logo1.webp:Zone.Identifier +4 -0
  38. package/logo/social.png +0 -0
  39. package/logo/social.png:Zone.Identifier +4 -0
  40. package/mcp-server/agentvibes.db +0 -0
  41. package/mcp-server/server.py +47 -14
  42. package/package.json +3 -3
  43. package/regenerate-agent-voices.sh +79 -0
  44. package/test/unit/provider-manager.bats +8 -5
  45. package/test/unit/speed-manager.bats +4 -4
  46. package/agentvibes.org/.claude/audio/tts-padded-1760744118.mp3 +0 -0
  47. package/agentvibes.org/.claude/audio/tts-padded-1760748535.mp3 +0 -0
  48. package/agentvibes.org/.claude/audio/tts-padded-1760748676.mp3 +0 -0
  49. package/agentvibes.org/.claude/audio/tts-padded-1760750748.mp3 +0 -0
  50. package/agentvibes.org/.claude/audio/tts-padded-1760750947.mp3 +0 -0
  51. package/agentvibes.org/.claude/audio/tts-padded-1760752718.mp3 +0 -0
  52. package/agentvibes.org/.claude/audio/tts-padded-1760752907.mp3 +0 -0
  53. package/agentvibes.org/.claude/audio/tts-padded-1760753017.mp3 +0 -0
  54. package/agentvibes.org/.claude/audio/tts-padded-1760753045.mp3 +0 -0
  55. package/agentvibes.org/.claude/audio/tts-padded-1760753241.mp3 +0 -0
  56. package/agentvibes.org/.claude/audio/tts-padded-1760753315.mp3 +0 -0
  57. package/agentvibes.org/.claude/audio/tts-padded-1760753382.mp3 +0 -0
  58. package/agentvibes.org/.claude/audio/tts-padded-1760753408.mp3 +0 -0
  59. package/agentvibes.org/.claude/audio/tts-padded-1760753426.mp3 +0 -0
  60. package/agentvibes.org/.claude/audio/tts-padded-1760753446.mp3 +0 -0
  61. package/agentvibes.org/.claude/audio/tts-padded-1760753541.mp3 +0 -0
  62. package/agentvibes.org/.claude/audio/tts-padded-1760753553.mp3 +0 -0
  63. package/agentvibes.org/.claude/audio/tts-padded-1760753577.mp3 +0 -0
  64. package/agentvibes.org/.claude/commands/agent-vibes/add.md +0 -21
  65. package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +0 -68
  66. package/agentvibes.org/.claude/commands/agent-vibes/bmad.md +0 -196
  67. package/agentvibes.org/.claude/commands/agent-vibes/commands.json +0 -77
  68. package/agentvibes.org/.claude/commands/agent-vibes/get.md +0 -9
  69. package/agentvibes.org/.claude/commands/agent-vibes/language.md +0 -23
  70. package/agentvibes.org/.claude/commands/agent-vibes/learn.md +0 -67
  71. package/agentvibes.org/.claude/commands/agent-vibes/list.md +0 -13
  72. package/agentvibes.org/.claude/commands/agent-vibes/personality.md +0 -79
  73. package/agentvibes.org/.claude/commands/agent-vibes/preview.md +0 -17
  74. package/agentvibes.org/.claude/commands/agent-vibes/provider.md +0 -54
  75. package/agentvibes.org/.claude/commands/agent-vibes/replay-target.md +0 -14
  76. package/agentvibes.org/.claude/commands/agent-vibes/replay.md +0 -19
  77. package/agentvibes.org/.claude/commands/agent-vibes/sample.md +0 -12
  78. package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +0 -52
  79. package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +0 -47
  80. package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +0 -65
  81. package/agentvibes.org/.claude/commands/agent-vibes/set-speed.md +0 -41
  82. package/agentvibes.org/.claude/commands/agent-vibes/switch.md +0 -53
  83. package/agentvibes.org/.claude/commands/agent-vibes/target-voice.md +0 -26
  84. package/agentvibes.org/.claude/commands/agent-vibes/target.md +0 -30
  85. package/agentvibes.org/.claude/commands/agent-vibes/update.md +0 -20
  86. package/agentvibes.org/.claude/commands/agent-vibes/version.md +0 -10
  87. package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +0 -7
  88. package/agentvibes.org/.claude/hooks/bmad-tts-injector.sh +0 -386
  89. package/agentvibes.org/.claude/hooks/bmad-voice-manager.sh +0 -375
  90. package/agentvibes.org/.claude/hooks/check-output-style.sh +0 -60
  91. package/agentvibes.org/.claude/hooks/github-star-reminder.sh +0 -94
  92. package/agentvibes.org/.claude/hooks/language-manager.sh +0 -360
  93. package/agentvibes.org/.claude/hooks/learn-manager.sh +0 -443
  94. package/agentvibes.org/.claude/hooks/personality-manager.sh +0 -324
  95. package/agentvibes.org/.claude/hooks/piper-download-voices.sh +0 -133
  96. package/agentvibes.org/.claude/hooks/piper-installer.sh +0 -144
  97. package/agentvibes.org/.claude/hooks/piper-voice-manager.sh +0 -227
  98. package/agentvibes.org/.claude/hooks/play-tts-elevenlabs.sh +0 -376
  99. package/agentvibes.org/.claude/hooks/play-tts-piper.sh +0 -281
  100. package/agentvibes.org/.claude/hooks/play-tts.sh +0 -69
  101. package/agentvibes.org/.claude/hooks/provider-commands.sh +0 -505
  102. package/agentvibes.org/.claude/hooks/provider-manager.sh +0 -248
  103. package/agentvibes.org/.claude/hooks/replay-target-audio.sh +0 -64
  104. package/agentvibes.org/.claude/hooks/sentiment-manager.sh +0 -163
  105. package/agentvibes.org/.claude/hooks/speed-manager.sh +0 -259
  106. package/agentvibes.org/.claude/hooks/voice-manager.sh +0 -477
  107. package/agentvibes.org/.claude/hooks/voices-config.sh +0 -33
  108. package/agentvibes.org/.claude/journal/2025-10-07.html +0 -373
  109. package/agentvibes.org/.claude/journal/index.html +0 -91
  110. package/agentvibes.org/.claude/output-styles/agent-vibes.md +0 -203
  111. package/agentvibes.org/.claude/personalities/angry.md +0 -17
  112. package/agentvibes.org/.claude/personalities/annoying.md +0 -17
  113. package/agentvibes.org/.claude/personalities/crass.md +0 -17
  114. package/agentvibes.org/.claude/personalities/dramatic.md +0 -17
  115. package/agentvibes.org/.claude/personalities/dry-humor.md +0 -53
  116. package/agentvibes.org/.claude/personalities/flirty.md +0 -23
  117. package/agentvibes.org/.claude/personalities/funny.md +0 -17
  118. package/agentvibes.org/.claude/personalities/grandpa.md +0 -35
  119. package/agentvibes.org/.claude/personalities/millennial.md +0 -17
  120. package/agentvibes.org/.claude/personalities/moody.md +0 -17
  121. package/agentvibes.org/.claude/personalities/normal.md +0 -19
  122. package/agentvibes.org/.claude/personalities/pirate.md +0 -17
  123. package/agentvibes.org/.claude/personalities/poetic.md +0 -17
  124. package/agentvibes.org/.claude/personalities/professional.md +0 -17
  125. package/agentvibes.org/.claude/personalities/robot.md +0 -17
  126. package/agentvibes.org/.claude/personalities/sarcastic.md +0 -41
  127. package/agentvibes.org/.claude/personalities/sassy.md +0 -17
  128. package/agentvibes.org/.claude/personalities/surfer-dude.md +0 -17
  129. package/agentvibes.org/.claude/personalities/zen.md +0 -17
  130. package/agentvibes.org/.claude/piper-voices-dir.txt +0 -1
  131. package/agentvibes.org/.claude/plugins/bmad-voices.md +0 -42
  132. package/agentvibes.org/.claude/tts-provider.txt +0 -1
  133. package/agentvibes.org/.mcp-minimal.json +0 -60
  134. package/agentvibes.org/CHANGELOG.md +0 -56
  135. package/agentvibes.org/README.md +0 -93
  136. package/agentvibes.org/app/(auth)/layout.tsx +0 -15
  137. package/agentvibes.org/app/(auth)/reset-password/page.tsx +0 -45
  138. package/agentvibes.org/app/(auth)/signin/page.tsx +0 -82
  139. package/agentvibes.org/app/(auth)/signup/page.tsx +0 -104
  140. package/agentvibes.org/app/(default)/blog/[slug]/page.tsx +0 -128
  141. package/agentvibes.org/app/(default)/blog/page.tsx +0 -95
  142. package/agentvibes.org/app/(default)/layout.tsx +0 -31
  143. package/agentvibes.org/app/(default)/page.tsx +0 -20
  144. package/agentvibes.org/app/api/hello/route.ts +0 -3
  145. package/agentvibes.org/app/css/additional-styles/theme.css +0 -82
  146. package/agentvibes.org/app/css/additional-styles/utility-patterns.css +0 -55
  147. package/agentvibes.org/app/css/style.css +0 -100
  148. package/agentvibes.org/app/layout.tsx +0 -63
  149. package/agentvibes.org/components/code-block.tsx +0 -27
  150. package/agentvibes.org/components/cta.tsx +0 -58
  151. package/agentvibes.org/components/features.tsx +0 -256
  152. package/agentvibes.org/components/hero-home.tsx +0 -133
  153. package/agentvibes.org/components/mdx-components.tsx +0 -128
  154. package/agentvibes.org/components/modal-video.tsx +0 -137
  155. package/agentvibes.org/components/page-illustration.tsx +0 -55
  156. package/agentvibes.org/components/spotlight.tsx +0 -77
  157. package/agentvibes.org/components/testimonials.tsx +0 -282
  158. package/agentvibes.org/components/ui/footer.tsx +0 -82
  159. package/agentvibes.org/components/ui/header.tsx +0 -68
  160. package/agentvibes.org/components/ui/logo.tsx +0 -10
  161. package/agentvibes.org/components/workflows.tsx +0 -176
  162. package/agentvibes.org/content/blog/discovering-new-piper-voices.mdx +0 -253
  163. package/agentvibes.org/content/blog/getting-started-agentvibes.mdx +0 -228
  164. package/agentvibes.org/content/blog/introducing-agentvibes-v2.mdx +0 -250
  165. package/agentvibes.org/content/blog/language-learning-with-agentvibes.mdx +0 -142
  166. package/agentvibes.org/content/blog/voice-personalities-guide.mdx +0 -119
  167. package/agentvibes.org/lib/blog.ts +0 -73
  168. package/agentvibes.org/next.config.js +0 -6
  169. package/agentvibes.org/package-lock.json +0 -4285
  170. package/agentvibes.org/package.json +0 -40
  171. package/agentvibes.org/pnpm-lock.yaml +0 -1141
  172. package/agentvibes.org/postcss.config.js +0 -5
  173. package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
  174. package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
  175. package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
  176. package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
  177. package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
  178. package/agentvibes.org/public/audio/piper-voices/speaker_0_Cori_Samuel.wav +0 -0
  179. package/agentvibes.org/public/audio/piper-voices/speaker_10_Steve_C.wav +0 -0
  180. package/agentvibes.org/public/audio/piper-voices/speaker_11_Owlivia.wav +0 -0
  181. package/agentvibes.org/public/audio/piper-voices/speaker_12_Paul_Hampton.wav +0 -0
  182. package/agentvibes.org/public/audio/piper-voices/speaker_13_Jennifer_Dorr.wav +0 -0
  183. package/agentvibes.org/public/audio/piper-voices/speaker_14_Emily_Cripps.wav +0 -0
  184. package/agentvibes.org/public/audio/piper-voices/speaker_15_Martin_Clifton.wav +0 -0
  185. package/agentvibes.org/public/audio/piper-voices/speaker_1_Kara_Shallenberg.wav +0 -0
  186. package/agentvibes.org/public/audio/piper-voices/speaker_2_Kristin_Hughes.wav +0 -0
  187. package/agentvibes.org/public/audio/piper-voices/speaker_3_Maria_Kasper.wav +0 -0
  188. package/agentvibes.org/public/audio/piper-voices/speaker_4_Mike_Pelton.wav +0 -0
  189. package/agentvibes.org/public/audio/piper-voices/speaker_5_Mark_Nelson.wav +0 -0
  190. package/agentvibes.org/public/audio/piper-voices/speaker_6_Michael_Scherer.wav +0 -0
  191. package/agentvibes.org/public/audio/piper-voices/speaker_7_James_K_White.wav +0 -0
  192. package/agentvibes.org/public/audio/piper-voices/speaker_8_Rose_Ibex.wav +0 -0
  193. package/agentvibes.org/public/audio/piper-voices/speaker_9_progressingamerica.wav +0 -0
  194. package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
  195. package/agentvibes.org/public/favicon.ico +0 -0
  196. package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
  197. package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
  198. package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
  199. package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
  200. package/agentvibes.org/public/images/blurred-shape-gray.svg +0 -1
  201. package/agentvibes.org/public/images/blurred-shape.svg +0 -1
  202. package/agentvibes.org/public/images/client-logo-01.svg +0 -1
  203. package/agentvibes.org/public/images/client-logo-02.svg +0 -1
  204. package/agentvibes.org/public/images/client-logo-03.svg +0 -1
  205. package/agentvibes.org/public/images/client-logo-04.svg +0 -1
  206. package/agentvibes.org/public/images/client-logo-05.svg +0 -1
  207. package/agentvibes.org/public/images/client-logo-06.svg +0 -1
  208. package/agentvibes.org/public/images/client-logo-07.svg +0 -1
  209. package/agentvibes.org/public/images/client-logo-08.svg +0 -1
  210. package/agentvibes.org/public/images/client-logo-09.svg +0 -1
  211. package/agentvibes.org/public/images/features.png +0 -0
  212. package/agentvibes.org/public/images/footer-illustration.svg +0 -1
  213. package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
  214. package/agentvibes.org/public/images/logo.svg +0 -1
  215. package/agentvibes.org/public/images/page-illustration.svg +0 -1
  216. package/agentvibes.org/public/images/secondary-illustration.svg +0 -1
  217. package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
  218. package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
  219. package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
  220. package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
  221. package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
  222. package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
  223. package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
  224. package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
  225. package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
  226. package/agentvibes.org/public/images/workflow-01.png +0 -0
  227. package/agentvibes.org/public/images/workflow-02.png +0 -0
  228. package/agentvibes.org/public/images/workflow-03.png +0 -0
  229. package/agentvibes.org/public/videos/video.mp4 +0 -0
  230. package/agentvibes.org/tsconfig.json +0 -28
  231. package/agentvibes.org/utils/useMasonry.tsx +0 -67
  232. package/agentvibes.org/utils/useMousePosition.tsx +0 -27
  233. package/docs/bryce-beattie-voice-licensing.md +0 -131
@@ -1,477 +0,0 @@
1
- #!/bin/bash
2
- # Voice Manager - Handle voice switching and listing
3
- # Usage: voice-manager.sh [list|switch|get] [voice_name]
4
-
5
- # Get script directory (physical path for sourcing files)
6
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
7
- source "$SCRIPT_DIR/voices-config.sh"
8
-
9
- # Determine target .claude directory based on context
10
- # Priority:
11
- # 1. CLAUDE_PROJECT_DIR env var (set by MCP for project-specific settings)
12
- # 2. Script location (for direct slash command usage)
13
- # 3. Global ~/.claude (fallback)
14
-
15
- if [[ -n "$CLAUDE_PROJECT_DIR" ]] && [[ -d "$CLAUDE_PROJECT_DIR/.claude" ]]; then
16
- # MCP context: Use the project directory where MCP was invoked
17
- CLAUDE_DIR="$CLAUDE_PROJECT_DIR/.claude"
18
- else
19
- # Direct usage context: Use script location
20
- SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
21
- CLAUDE_DIR="$(dirname "$SCRIPT_PATH")"
22
-
23
- # If script is in global ~/.claude, use that
24
- if [[ "$CLAUDE_DIR" == "$HOME/.claude" ]]; then
25
- CLAUDE_DIR="$HOME/.claude"
26
- elif [[ ! -d "$CLAUDE_DIR" ]]; then
27
- # Fallback to global if directory doesn't exist
28
- CLAUDE_DIR="$HOME/.claude"
29
- fi
30
- fi
31
-
32
- VOICE_FILE="$CLAUDE_DIR/tts-voice.txt"
33
-
34
- case "$1" in
35
- list)
36
- # Get active provider
37
- PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
38
- if [[ ! -f "$PROVIDER_FILE" ]]; then
39
- PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
40
- fi
41
-
42
- ACTIVE_PROVIDER="elevenlabs" # default
43
- if [ -f "$PROVIDER_FILE" ]; then
44
- ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
45
- fi
46
-
47
- CURRENT_VOICE=$(cat "$VOICE_FILE" 2>/dev/null || echo "Cowboy Bob")
48
-
49
- if [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
50
- echo "🎤 Available Piper TTS Voices:"
51
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
52
-
53
- # List downloaded Piper voices
54
- if [[ -f "$SCRIPT_DIR/piper-voice-manager.sh" ]]; then
55
- source "$SCRIPT_DIR/piper-voice-manager.sh"
56
- VOICE_DIR=$(get_voice_storage_dir)
57
- VOICE_COUNT=0
58
- for onnx_file in "$VOICE_DIR"/*.onnx; do
59
- if [[ -f "$onnx_file" ]]; then
60
- voice=$(basename "$onnx_file" .onnx)
61
- if [ "$voice" = "$CURRENT_VOICE" ]; then
62
- echo " ▶ $voice (current)"
63
- else
64
- echo " $voice"
65
- fi
66
- ((VOICE_COUNT++))
67
- fi
68
- done | sort
69
-
70
- if [[ $VOICE_COUNT -eq 0 ]]; then
71
- echo " (No Piper voices downloaded yet)"
72
- echo ""
73
- echo "Download voices with: /agent-vibes:provider download <voice-name>"
74
- echo "Examples: en_US-lessac-medium, en_GB-alba-medium"
75
- fi
76
- fi
77
- else
78
- echo "🎤 Available ElevenLabs TTS Voices:"
79
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
80
- for voice in "${!VOICES[@]}"; do
81
- if [ "$voice" = "$CURRENT_VOICE" ]; then
82
- echo " ▶ $voice (current)"
83
- else
84
- echo " $voice"
85
- fi
86
- done | sort
87
- fi
88
-
89
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
90
- echo ""
91
- echo "Usage: voice-manager.sh switch <name>"
92
- echo " voice-manager.sh preview"
93
- ;;
94
-
95
- preview)
96
- # Get play-tts.sh path
97
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
98
- TTS_SCRIPT="$SCRIPT_DIR/play-tts.sh"
99
-
100
- # Check if a specific voice name was provided
101
- if [[ -n "$2" ]] && [[ "$2" != "first" ]] && [[ "$2" != "last" ]] && ! [[ "$2" =~ ^[0-9]+$ ]]; then
102
- # User specified a voice name
103
- VOICE_NAME="$2"
104
-
105
- # Check if voice exists
106
- if [[ -n "${VOICES[$VOICE_NAME]}" ]]; then
107
- echo "🎤 Previewing voice: ${VOICE_NAME}"
108
- echo ""
109
- "$TTS_SCRIPT" "Hello, this is ${VOICE_NAME}. How do you like my voice?" "${VOICE_NAME}"
110
- else
111
- echo "❌ Voice not found: ${VOICE_NAME}"
112
- echo ""
113
- echo "Available voices:"
114
- for voice in "${!VOICES[@]}"; do
115
- echo " • $voice"
116
- done | sort
117
- fi
118
- exit 0
119
- fi
120
-
121
- # Original preview logic for first/last/number
122
- echo "🎤 Voice Preview - Playing first 3 voices..."
123
- echo ""
124
-
125
- # Sort voices and preview first 3
126
- VOICE_ARRAY=()
127
- for voice in "${!VOICES[@]}"; do
128
- VOICE_ARRAY+=("$voice")
129
- done
130
-
131
- # Sort the array
132
- IFS=$'\n' SORTED_VOICES=($(sort <<<"${VOICE_ARRAY[*]}"))
133
- unset IFS
134
-
135
- # Play first 3 voices
136
- COUNT=0
137
- for voice in "${SORTED_VOICES[@]}"; do
138
- if [ $COUNT -eq 3 ]; then
139
- break
140
- fi
141
- echo "🔊 ${voice}..."
142
- "$TTS_SCRIPT" "Hi, I'm ${voice}" "${VOICES[$voice]}"
143
- sleep 0.5
144
- COUNT=$((COUNT + 1))
145
- done
146
-
147
- echo ""
148
- echo "Would you like to hear more? Reply 'yes' to continue."
149
- ;;
150
-
151
- switch)
152
- VOICE_NAME="$2"
153
- SILENT_MODE=false
154
-
155
- # Check for --silent flag
156
- if [[ "$2" == "--silent" ]] || [[ "$3" == "--silent" ]]; then
157
- SILENT_MODE=true
158
- # If --silent is first arg, voice name is in $3
159
- [[ "$2" == "--silent" ]] && VOICE_NAME="$3"
160
- fi
161
-
162
- if [[ -z "$VOICE_NAME" ]]; then
163
- # Show numbered list for selection
164
- echo "🎤 Select a voice by number:"
165
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
166
-
167
- # Get current voice
168
- CURRENT="Cowboy Bob"
169
- if [ -f "$VOICE_FILE" ]; then
170
- CURRENT=$(cat "$VOICE_FILE")
171
- fi
172
-
173
- # Create array of voice names
174
- VOICE_ARRAY=()
175
- for voice in "${!VOICES[@]}"; do
176
- VOICE_ARRAY+=("$voice")
177
- done
178
-
179
- # Sort the array
180
- IFS=$'\n' SORTED_VOICES=($(sort <<<"${VOICE_ARRAY[*]}"))
181
- unset IFS
182
-
183
- # Display numbered list in two columns for compactness
184
- HALF=$(( (${#SORTED_VOICES[@]} + 1) / 2 ))
185
-
186
- for i in $(seq 0 $((HALF - 1))); do
187
- NUM1=$((i + 1))
188
- VOICE1="${SORTED_VOICES[$i]}"
189
-
190
- # Format first column
191
- if [[ "$VOICE1" == "$CURRENT" ]]; then
192
- COL1=$(printf "%2d. %-20s ✓" "$NUM1" "$VOICE1")
193
- else
194
- COL1=$(printf "%2d. %-20s " "$NUM1" "$VOICE1")
195
- fi
196
-
197
- # Format second column if it exists
198
- NUM2=$((i + HALF + 1))
199
- if [[ $((i + HALF)) -lt ${#SORTED_VOICES[@]} ]]; then
200
- VOICE2="${SORTED_VOICES[$((i + HALF))]}"
201
- if [[ "$VOICE2" == "$CURRENT" ]]; then
202
- COL2=$(printf "%2d. %-20s ✓" "$NUM2" "$VOICE2")
203
- else
204
- COL2=$(printf "%2d. %-20s " "$NUM2" "$VOICE2")
205
- fi
206
- echo " $COL1 $COL2"
207
- else
208
- echo " $COL1"
209
- fi
210
- done
211
-
212
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
213
- echo ""
214
- echo "Enter number (1-${#SORTED_VOICES[@]}) or voice name:"
215
- echo "Usage: /agent-vibes:switch 5"
216
- echo " /agent-vibes:switch \"Northern Terry\""
217
- exit 0
218
- fi
219
-
220
- # Detect active TTS provider
221
- PROVIDER_FILE=""
222
- if [[ -f "$CLAUDE_DIR/tts-provider.txt" ]]; then
223
- PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
224
- elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
225
- PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
226
- fi
227
-
228
- ACTIVE_PROVIDER="elevenlabs" # default
229
- if [[ -n "$PROVIDER_FILE" ]]; then
230
- ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
231
- fi
232
-
233
- # If using Piper and voice name looks like a Piper model (contains underscore and dash)
234
- # then skip ElevenLabs voice validation
235
- if [[ "$ACTIVE_PROVIDER" == "piper" ]] && [[ "$VOICE_NAME" == *"_"*"-"* ]]; then
236
- # This is a Piper model name, use it directly
237
- FOUND="$VOICE_NAME"
238
- else
239
- # ElevenLabs voice lookup
240
- # Check if input is a number
241
- if [[ "$VOICE_NAME" =~ ^[0-9]+$ ]]; then
242
- # Get voice array
243
- VOICE_ARRAY=()
244
- for voice in "${!VOICES[@]}"; do
245
- VOICE_ARRAY+=("$voice")
246
- done
247
-
248
- # Sort the array
249
- IFS=$'\n' SORTED_VOICES=($(sort <<<"${VOICE_ARRAY[*]}"))
250
- unset IFS
251
-
252
- # Get voice by number (adjust for 0-based index)
253
- INDEX=$((VOICE_NAME - 1))
254
-
255
- if [[ $INDEX -ge 0 && $INDEX -lt ${#SORTED_VOICES[@]} ]]; then
256
- VOICE_NAME="${SORTED_VOICES[$INDEX]}"
257
- FOUND="${SORTED_VOICES[$INDEX]}"
258
- else
259
- echo "❌ Invalid number. Please choose between 1 and ${#SORTED_VOICES[@]}"
260
- exit 1
261
- fi
262
- else
263
- # Check if voice exists (case-insensitive)
264
- FOUND=""
265
- for voice in "${!VOICES[@]}"; do
266
- if [[ "${voice,,}" == "${VOICE_NAME,,}" ]]; then
267
- FOUND="$voice"
268
- break
269
- fi
270
- done
271
- fi
272
-
273
- if [[ -z "$FOUND" ]]; then
274
- echo "❌ Unknown voice: $VOICE_NAME"
275
- echo ""
276
- echo "Available voices:"
277
- for voice in "${!VOICES[@]}"; do
278
- echo " - $voice"
279
- done | sort
280
- exit 1
281
- fi
282
- fi
283
-
284
- echo "$FOUND" > "$VOICE_FILE"
285
- echo "✅ Voice switched to: $FOUND"
286
-
287
- # Show voice ID only for ElevenLabs voices
288
- if [[ "$ACTIVE_PROVIDER" != "piper" ]] && [[ -n "${VOICES[$FOUND]}" ]]; then
289
- echo "🎤 Voice ID: ${VOICES[$FOUND]}"
290
- fi
291
-
292
- # Have the new voice introduce itself (unless silent mode)
293
- if [[ "$SILENT_MODE" != "true" ]]; then
294
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
295
- PLAY_TTS="$SCRIPT_DIR/play-tts.sh"
296
- if [ -x "$PLAY_TTS" ]; then
297
- "$PLAY_TTS" "Hi, I'm $FOUND. I'll be your voice assistant moving forward." "$FOUND" > /dev/null 2>&1 &
298
- fi
299
-
300
- echo ""
301
- echo "💡 Tip: To hear automatic TTS narration, enable the Agent Vibes output style:"
302
- echo " /output-style Agent Vibes"
303
- fi
304
- ;;
305
-
306
- get)
307
- if [ -f "$VOICE_FILE" ]; then
308
- cat "$VOICE_FILE"
309
- else
310
- echo "Cowboy Bob"
311
- fi
312
- ;;
313
-
314
- whoami)
315
- echo "🎤 Current Voice Configuration"
316
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
317
-
318
- # Get active TTS provider
319
- PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
320
- if [[ ! -f "$PROVIDER_FILE" ]]; then
321
- PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
322
- fi
323
-
324
- if [ -f "$PROVIDER_FILE" ]; then
325
- ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
326
- if [[ "$ACTIVE_PROVIDER" == "elevenlabs" ]]; then
327
- echo "Provider: ElevenLabs (Premium AI)"
328
- elif [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
329
- echo "Provider: Piper TTS (Free, Offline)"
330
- else
331
- echo "Provider: $ACTIVE_PROVIDER"
332
- fi
333
- else
334
- # Default to ElevenLabs if no provider file
335
- echo "Provider: ElevenLabs (Premium AI)"
336
- fi
337
-
338
- # Get current voice
339
- if [ -f "$VOICE_FILE" ]; then
340
- CURRENT_VOICE=$(cat "$VOICE_FILE")
341
- else
342
- CURRENT_VOICE="Cowboy Bob"
343
- fi
344
- echo "Voice: $CURRENT_VOICE"
345
-
346
- # Get current sentiment (priority)
347
- if [ -f "$HOME/.claude/tts-sentiment.txt" ]; then
348
- SENTIMENT=$(cat "$HOME/.claude/tts-sentiment.txt")
349
- echo "Sentiment: $SENTIMENT (active)"
350
-
351
- # Also show personality if set
352
- if [ -f "$HOME/.claude/tts-personality.txt" ]; then
353
- PERSONALITY=$(cat "$HOME/.claude/tts-personality.txt")
354
- echo "Personality: $PERSONALITY (overridden by sentiment)"
355
- fi
356
- else
357
- # No sentiment, check personality
358
- if [ -f "$HOME/.claude/tts-personality.txt" ]; then
359
- PERSONALITY=$(cat "$HOME/.claude/tts-personality.txt")
360
- echo "Personality: $PERSONALITY (active)"
361
- else
362
- echo "Personality: normal"
363
- fi
364
- fi
365
-
366
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
367
- ;;
368
-
369
- list-simple)
370
- # Simple list for AI to parse and display
371
- # Get active provider
372
- PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
373
- if [[ ! -f "$PROVIDER_FILE" ]]; then
374
- PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
375
- fi
376
-
377
- ACTIVE_PROVIDER="elevenlabs" # default
378
- if [ -f "$PROVIDER_FILE" ]; then
379
- ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
380
- fi
381
-
382
- if [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
383
- # List downloaded Piper voices
384
- if [[ -f "$SCRIPT_DIR/piper-voice-manager.sh" ]]; then
385
- source "$SCRIPT_DIR/piper-voice-manager.sh"
386
- VOICE_DIR=$(get_voice_storage_dir)
387
- for onnx_file in "$VOICE_DIR"/*.onnx; do
388
- if [[ -f "$onnx_file" ]]; then
389
- basename "$onnx_file" .onnx
390
- fi
391
- done | sort
392
- fi
393
- else
394
- # List ElevenLabs voices
395
- for voice in "${!VOICES[@]}"; do
396
- echo "$voice"
397
- done | sort
398
- fi
399
- ;;
400
-
401
- replay)
402
- # Replay recent TTS audio from history
403
- # Use project-local directory with same logic as play-tts.sh
404
- if [[ -n "$CLAUDE_PROJECT_DIR" ]]; then
405
- AUDIO_DIR="$CLAUDE_PROJECT_DIR/.claude/audio"
406
- else
407
- # Fallback: try to find .claude directory in current path
408
- CURRENT_DIR="$PWD"
409
- while [[ "$CURRENT_DIR" != "/" ]]; do
410
- if [[ -d "$CURRENT_DIR/.claude" ]]; then
411
- AUDIO_DIR="$CURRENT_DIR/.claude/audio"
412
- break
413
- fi
414
- CURRENT_DIR=$(dirname "$CURRENT_DIR")
415
- done
416
- # Final fallback to global if no project .claude found
417
- if [[ -z "$AUDIO_DIR" ]]; then
418
- AUDIO_DIR="$HOME/.claude/audio"
419
- fi
420
- fi
421
-
422
- # Default to replay last audio (N=1)
423
- N="${2:-1}"
424
-
425
- # Validate N is a number
426
- if ! [[ "$N" =~ ^[0-9]+$ ]]; then
427
- echo "❌ Invalid argument. Please use a number (1-10)"
428
- echo "Usage: /agent-vibes:replay [N]"
429
- echo " N=1 - Last audio (default)"
430
- echo " N=2 - Second-to-last"
431
- echo " N=3 - Third-to-last"
432
- exit 1
433
- fi
434
-
435
- # Check bounds
436
- if [[ $N -lt 1 || $N -gt 10 ]]; then
437
- echo "❌ Number out of range. Please choose 1-10"
438
- exit 1
439
- fi
440
-
441
- # Get list of audio files sorted by time (newest first)
442
- if [[ ! -d "$AUDIO_DIR" ]]; then
443
- echo "❌ No audio history found"
444
- echo "Audio files are stored in: $AUDIO_DIR"
445
- exit 1
446
- fi
447
-
448
- # Get the Nth most recent file
449
- AUDIO_FILE=$(ls -t "$AUDIO_DIR"/tts-*.mp3 2>/dev/null | sed -n "${N}p")
450
-
451
- if [[ -z "$AUDIO_FILE" ]]; then
452
- TOTAL=$(ls -t "$AUDIO_DIR"/tts-*.mp3 2>/dev/null | wc -l)
453
- echo "❌ Audio #$N not found in history"
454
- echo "Total audio files available: $TOTAL"
455
- exit 1
456
- fi
457
-
458
- echo "🔊 Replaying audio #$N:"
459
- echo " File: $(basename "$AUDIO_FILE")"
460
- echo " Path: $AUDIO_FILE"
461
-
462
- # Play the audio file in background
463
- (paplay "$AUDIO_FILE" 2>/dev/null || aplay "$AUDIO_FILE" 2>/dev/null || mpg123 "$AUDIO_FILE" 2>/dev/null) &
464
- ;;
465
-
466
- *)
467
- echo "Usage: voice-manager.sh [list|switch|get|replay|whoami] [voice_name]"
468
- echo ""
469
- echo "Commands:"
470
- echo " list - List all available voices"
471
- echo " switch <voice_name> - Switch to a different voice"
472
- echo " get - Get current voice name"
473
- echo " replay [N] - Replay Nth most recent audio (default: 1)"
474
- echo " whoami - Show current voice and personality"
475
- exit 1
476
- ;;
477
- esac
@@ -1,33 +0,0 @@
1
- #!/bin/bash
2
- # Single source of truth for ElevenLabs voice IDs
3
- # This file is sourced by both voice-manager.sh and play-tts.sh
4
-
5
- declare -A VOICES=(
6
- ["Amy"]="bhJUNIXWQQ94l8eI2VUf"
7
- ["Antoni"]="ErXwobaYiN019PkySvjV"
8
- ["Archer"]="L0Dsvb3SLTyegXwtm47J"
9
- ["Aria"]="TC0Zp7WVFzhA8zpTlRqV"
10
- ["Bella"]="EXAVITQu4vr4xnSDxMaL"
11
- ["Burt Reynolds"]="4YYIPFl9wE5c4L2eu2Gb"
12
- ["Charlotte"]="XB0fDUnXU5powFXDhCwa"
13
- ["Cowboy Bob"]="KTPVrSVAEUSJRClDzBw7"
14
- ["Demon Monster"]="vfaqCOvlrKi4Zp7C2IAm"
15
- ["Domi"]="AZnzlk1XvdvUeBnXmlld"
16
- ["Dr. Von Fusion"]="yjJ45q8TVCrtMhEKurxY"
17
- ["Drill Sergeant"]="vfaqCOvlrKi4Zp7C2IAm"
18
- ["Grandpa Spuds Oxley"]="NOpBlnGInO9m6vDvFkFC"
19
- ["Grandpa Werthers"]="MKlLqCItoCkvdhrxgtLv"
20
- ["Jessica Anne Bogart"]="flHkNRp1BlvT73UL6gyz"
21
- ["Juniper"]="aMSt68OGf4xUZAnLpTU8"
22
- ["Lutz Laugh"]="9yzdeviXkFddZ4Oz8Mok"
23
- ["Matilda"]="XrExE9yKIg1WjnnlVkGX"
24
- ["Matthew Schmitz"]="0SpgpJ4D3MpHCiWdyTg3"
25
- ["Michael"]="U1Vk2oyatMdYs096Ety7"
26
- ["Ms. Walker"]="DLsHlh26Ugcm6ELvS0qi"
27
- ["Northern Terry"]="wo6udizrrtpIxWGp2qJk"
28
- ["Pirate Marshal"]="PPzYpIqttlTYA83688JI"
29
- ["Rachel"]="21m00Tcm4TlvDq8ikWAM"
30
- ["Ralf Eisend"]="A9evEp8yGjv4c3WsIKuY"
31
- ["Tiffany"]="6aDn1KB0hjpdcocrUkmq"
32
- ["Tom"]="DYkrAHD8iwork3YSUBbs"
33
- )