agentvibes 2.0.7 → 2.0.8

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 (152) hide show
  1. package/.claude/commands/agent-vibes/whoami.md +2 -2
  2. package/.claude/hooks/check-output-style.sh +60 -0
  3. package/.claude/hooks/personality-manager.sh +34 -2
  4. package/.claude/hooks/play-tts-piper.sh +26 -8
  5. package/.claude/hooks/voice-manager.sh +85 -36
  6. package/.claude/personalities/angry.md +2 -1
  7. package/.claude/personalities/annoying.md +2 -1
  8. package/.claude/personalities/crass.md +2 -1
  9. package/.claude/personalities/dramatic.md +2 -1
  10. package/.claude/personalities/dry-humor.md +2 -1
  11. package/.claude/personalities/flirty.md +2 -1
  12. package/.claude/personalities/funny.md +2 -1
  13. package/.claude/personalities/grandpa.md +2 -1
  14. package/.claude/personalities/millennial.md +2 -1
  15. package/.claude/personalities/moody.md +2 -1
  16. package/.claude/personalities/normal.md +2 -1
  17. package/.claude/personalities/pirate.md +2 -1
  18. package/.claude/personalities/poetic.md +2 -1
  19. package/.claude/personalities/professional.md +2 -1
  20. package/.claude/personalities/robot.md +2 -1
  21. package/.claude/personalities/sarcastic.md +2 -1
  22. package/.claude/personalities/sassy.md +2 -1
  23. package/.claude/personalities/surfer-dude.md +2 -1
  24. package/.claude/personalities/zen.md +2 -1
  25. package/RELEASE_NOTES.md +75 -0
  26. package/agentvibes.org/.claude/commands/agent-vibes/add.md +21 -0
  27. package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +68 -0
  28. package/agentvibes.org/.claude/commands/agent-vibes/commands.json +53 -0
  29. package/agentvibes.org/.claude/commands/agent-vibes/get.md +9 -0
  30. package/agentvibes.org/.claude/commands/agent-vibes/list.md +13 -0
  31. package/agentvibes.org/.claude/commands/agent-vibes/personality.md +79 -0
  32. package/agentvibes.org/.claude/commands/agent-vibes/preview.md +16 -0
  33. package/agentvibes.org/.claude/commands/agent-vibes/provider.md +54 -0
  34. package/agentvibes.org/.claude/commands/agent-vibes/replay.md +19 -0
  35. package/agentvibes.org/.claude/commands/agent-vibes/sample.md +12 -0
  36. package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +52 -0
  37. package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +47 -0
  38. package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +65 -0
  39. package/agentvibes.org/.claude/commands/agent-vibes/switch.md +53 -0
  40. package/agentvibes.org/.claude/commands/agent-vibes/update.md +20 -0
  41. package/agentvibes.org/.claude/commands/agent-vibes/version.md +10 -0
  42. package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +7 -0
  43. package/agentvibes.org/.claude/hooks/bmad-voice-manager.sh +278 -0
  44. package/agentvibes.org/.claude/hooks/language-manager.sh +190 -0
  45. package/agentvibes.org/.claude/hooks/personality-manager.sh +279 -0
  46. package/agentvibes.org/.claude/hooks/piper-download-voices.sh +133 -0
  47. package/agentvibes.org/.claude/hooks/piper-voice-manager.sh +227 -0
  48. package/agentvibes.org/.claude/hooks/play-tts-elevenlabs.sh +201 -0
  49. package/agentvibes.org/.claude/hooks/play-tts-piper.sh +175 -0
  50. package/agentvibes.org/.claude/hooks/play-tts.sh +138 -0
  51. package/agentvibes.org/.claude/hooks/provider-commands.sh +374 -0
  52. package/agentvibes.org/.claude/hooks/provider-manager.sh +196 -0
  53. package/agentvibes.org/.claude/hooks/sentiment-manager.sh +163 -0
  54. package/agentvibes.org/.claude/hooks/voice-manager.sh +349 -0
  55. package/agentvibes.org/.claude/hooks/voices-config.sh +33 -0
  56. package/agentvibes.org/.claude/journal/2025-10-07.html +373 -0
  57. package/agentvibes.org/.claude/journal/index.html +91 -0
  58. package/agentvibes.org/.claude/output-styles/agent-vibes.md +203 -0
  59. package/agentvibes.org/.claude/personalities/angry.md +16 -0
  60. package/agentvibes.org/.claude/personalities/annoying.md +16 -0
  61. package/agentvibes.org/.claude/personalities/crass.md +16 -0
  62. package/agentvibes.org/.claude/personalities/dramatic.md +16 -0
  63. package/agentvibes.org/.claude/personalities/dry-humor.md +52 -0
  64. package/agentvibes.org/.claude/personalities/flirty.md +22 -0
  65. package/agentvibes.org/.claude/personalities/funny.md +16 -0
  66. package/agentvibes.org/.claude/personalities/grandpa.md +34 -0
  67. package/agentvibes.org/.claude/personalities/millennial.md +16 -0
  68. package/agentvibes.org/.claude/personalities/moody.md +16 -0
  69. package/agentvibes.org/.claude/personalities/normal.md +18 -0
  70. package/agentvibes.org/.claude/personalities/pirate.md +16 -0
  71. package/agentvibes.org/.claude/personalities/poetic.md +16 -0
  72. package/agentvibes.org/.claude/personalities/professional.md +16 -0
  73. package/agentvibes.org/.claude/personalities/robot.md +16 -0
  74. package/agentvibes.org/.claude/personalities/sarcastic.md +40 -0
  75. package/agentvibes.org/.claude/personalities/sassy.md +16 -0
  76. package/agentvibes.org/.claude/personalities/surfer-dude.md +16 -0
  77. package/agentvibes.org/.claude/personalities/zen.md +16 -0
  78. package/agentvibes.org/.mcp-minimal.json +60 -0
  79. package/agentvibes.org/CHANGELOG.md +56 -0
  80. package/agentvibes.org/README.md +93 -0
  81. package/agentvibes.org/app/(auth)/layout.tsx +15 -0
  82. package/agentvibes.org/app/(auth)/reset-password/page.tsx +45 -0
  83. package/agentvibes.org/app/(auth)/signin/page.tsx +82 -0
  84. package/agentvibes.org/app/(auth)/signup/page.tsx +104 -0
  85. package/agentvibes.org/app/(default)/layout.tsx +31 -0
  86. package/agentvibes.org/app/(default)/page.tsx +20 -0
  87. package/agentvibes.org/app/api/hello/route.ts +3 -0
  88. package/agentvibes.org/app/css/additional-styles/theme.css +82 -0
  89. package/agentvibes.org/app/css/additional-styles/utility-patterns.css +55 -0
  90. package/agentvibes.org/app/css/style.css +100 -0
  91. package/agentvibes.org/app/layout.tsx +63 -0
  92. package/agentvibes.org/components/cta.tsx +58 -0
  93. package/agentvibes.org/components/features.tsx +256 -0
  94. package/agentvibes.org/components/hero-home.tsx +133 -0
  95. package/agentvibes.org/components/modal-video.tsx +137 -0
  96. package/agentvibes.org/components/page-illustration.tsx +55 -0
  97. package/agentvibes.org/components/spotlight.tsx +77 -0
  98. package/agentvibes.org/components/testimonials.tsx +282 -0
  99. package/agentvibes.org/components/ui/footer.tsx +82 -0
  100. package/agentvibes.org/components/ui/header.tsx +53 -0
  101. package/agentvibes.org/components/ui/logo.tsx +10 -0
  102. package/agentvibes.org/components/workflows.tsx +176 -0
  103. package/agentvibes.org/next.config.js +4 -0
  104. package/agentvibes.org/package-lock.json +1974 -0
  105. package/agentvibes.org/package.json +30 -0
  106. package/agentvibes.org/pnpm-lock.yaml +1141 -0
  107. package/agentvibes.org/postcss.config.js +5 -0
  108. package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
  109. package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
  110. package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
  111. package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
  112. package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
  113. package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
  114. package/agentvibes.org/public/favicon.ico +0 -0
  115. package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
  116. package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
  117. package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
  118. package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
  119. package/agentvibes.org/public/images/blurred-shape-gray.svg +1 -0
  120. package/agentvibes.org/public/images/blurred-shape.svg +1 -0
  121. package/agentvibes.org/public/images/client-logo-01.svg +1 -0
  122. package/agentvibes.org/public/images/client-logo-02.svg +1 -0
  123. package/agentvibes.org/public/images/client-logo-03.svg +1 -0
  124. package/agentvibes.org/public/images/client-logo-04.svg +1 -0
  125. package/agentvibes.org/public/images/client-logo-05.svg +1 -0
  126. package/agentvibes.org/public/images/client-logo-06.svg +1 -0
  127. package/agentvibes.org/public/images/client-logo-07.svg +1 -0
  128. package/agentvibes.org/public/images/client-logo-08.svg +1 -0
  129. package/agentvibes.org/public/images/client-logo-09.svg +1 -0
  130. package/agentvibes.org/public/images/features.png +0 -0
  131. package/agentvibes.org/public/images/footer-illustration.svg +1 -0
  132. package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
  133. package/agentvibes.org/public/images/logo.svg +1 -0
  134. package/agentvibes.org/public/images/page-illustration.svg +1 -0
  135. package/agentvibes.org/public/images/secondary-illustration.svg +1 -0
  136. package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
  137. package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
  138. package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
  139. package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
  140. package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
  141. package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
  142. package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
  143. package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
  144. package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
  145. package/agentvibes.org/public/images/workflow-01.png +0 -0
  146. package/agentvibes.org/public/images/workflow-02.png +0 -0
  147. package/agentvibes.org/public/images/workflow-03.png +0 -0
  148. package/agentvibes.org/public/videos/video.mp4 +0 -0
  149. package/agentvibes.org/tsconfig.json +28 -0
  150. package/agentvibes.org/utils/useMasonry.tsx +67 -0
  151. package/agentvibes.org/utils/useMousePosition.tsx +27 -0
  152. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  ---
2
- description: Show the current active voice
2
+ description: Show the current active voice and TTS provider
3
3
  ---
4
4
 
5
- Display the currently selected ElevenLabs TTS voice.
5
+ Display the currently selected TTS voice and active provider (ElevenLabs or Piper).
6
6
 
7
7
  !bash .claude/hooks/voice-manager.sh whoami
@@ -0,0 +1,60 @@
1
+ #!/bin/bash
2
+ #
3
+ # @fileoverview Output Style Detection for AgentVibes
4
+ # @context Detects if agent-vibes output style is active
5
+ # @architecture Helper for slash commands to warn users
6
+ # @why Voice commands won't work without agent-vibes output style
7
+ #
8
+
9
+ # Check if we're in a Claude Code session with agent-vibes output style
10
+ # This is a heuristic check - we can't directly detect the output style,
11
+ # but we can check if TTS commands would work
12
+
13
+ check_output_style() {
14
+ # Strategy: Check if this script is being called from within a Claude response
15
+ # If CLAUDECODE env var is set, we're in Claude Code
16
+ # If not, we're running standalone (not in a Claude Code session)
17
+
18
+ if [[ -z "$CLAUDECODE" ]]; then
19
+ # Not in Claude Code at all
20
+ return 1
21
+ fi
22
+
23
+ # We're in Claude Code, but we can't directly detect output style
24
+ # The agent-vibes output style calls our TTS hooks automatically
25
+ # So if this function is called, it means a slash command was invoked
26
+
27
+ # Check if we have the necessary TTS setup
28
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
29
+
30
+ # Check if agent-vibes output style is installed
31
+ if [[ ! -f "$SCRIPT_DIR/../output-styles/agent-vibes.md" ]]; then
32
+ return 1
33
+ fi
34
+
35
+ # All checks passed - likely using agent-vibes output style
36
+ return 0
37
+ }
38
+
39
+ # Show warning if output style is not agent-vibes
40
+ show_output_style_warning() {
41
+ echo ""
42
+ echo "⚠️ Voice commands require the agent-vibes output style"
43
+ echo ""
44
+ echo "To enable voice narration, run:"
45
+ echo " /output-style agent-vibes"
46
+ echo ""
47
+ echo "This will make Claude speak with TTS for all responses."
48
+ echo "You can still use voice commands manually with agent-vibes disabled,"
49
+ echo "but you won't hear automatic TTS narration."
50
+ echo ""
51
+ }
52
+
53
+ # Main execution when called directly
54
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
55
+ if ! check_output_style; then
56
+ show_output_style_warning
57
+ exit 1
58
+ fi
59
+ exit 0
60
+ fi
@@ -37,7 +37,10 @@ get_personality_data() {
37
37
  grep "^description:" "$file" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
38
38
  ;;
39
39
  voice)
40
- grep "^voice:" "$file" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
40
+ grep "^elevenlabs_voice:" "$file" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
41
+ ;;
42
+ piper_voice)
43
+ grep "^piper_voice:" "$file" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
41
44
  ;;
42
45
  instructions)
43
46
  sed -n '/^## AI Instructions/,/^##/p' "$file" | sed '1d;$d'
@@ -122,7 +125,33 @@ case "$1" in
122
125
  echo "🎭 Personality set to: $PERSONALITY"
123
126
 
124
127
  # Check if personality has an assigned voice
125
- ASSIGNED_VOICE=$(get_personality_data "$PERSONALITY" "voice")
128
+ # Detect active TTS provider
129
+ PROVIDER_FILE=""
130
+ if [[ -f "$CLAUDE_DIR/tts-provider.txt" ]]; then
131
+ PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
132
+ elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
133
+ PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
134
+ fi
135
+
136
+ ACTIVE_PROVIDER="elevenlabs" # default
137
+ if [[ -n "$PROVIDER_FILE" ]]; then
138
+ ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
139
+ fi
140
+
141
+ # Get the appropriate voice based on provider
142
+ ASSIGNED_VOICE=""
143
+ if [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
144
+ # Try to get Piper-specific voice first
145
+ ASSIGNED_VOICE=$(get_personality_data "$PERSONALITY" "piper_voice")
146
+ if [[ -z "$ASSIGNED_VOICE" ]]; then
147
+ # Fallback to default Piper voice
148
+ ASSIGNED_VOICE="en_US-lessac-medium"
149
+ fi
150
+ else
151
+ # Use ElevenLabs voice (reads from elevenlabs_voice: field)
152
+ ASSIGNED_VOICE=$(get_personality_data "$PERSONALITY" "voice")
153
+ fi
154
+
126
155
  if [[ -n "$ASSIGNED_VOICE" ]]; then
127
156
  # Switch to the assigned voice (silently - personality will do the talking)
128
157
  VOICE_MANAGER="$SCRIPT_DIR/voice-manager.sh"
@@ -163,6 +192,9 @@ case "$1" in
163
192
 
164
193
  echo ""
165
194
  echo "Note: AI will generate unique ${PERSONALITY} responses - no fixed templates!"
195
+ echo ""
196
+ echo "💡 Tip: To hear automatic TTS narration, enable the agent-vibes output style:"
197
+ echo " /output-style agent-vibes"
166
198
  fi
167
199
  ;;
168
200
 
@@ -39,15 +39,33 @@ if [[ -n "$VOICE_OVERRIDE" ]]; then
39
39
  VOICE_MODEL="$VOICE_OVERRIDE"
40
40
  echo "🎤 Using voice: $VOICE_OVERRIDE (session-specific)"
41
41
  else
42
- # Try to get language-specific voice
43
- LANG_VOICE=$(get_voice_for_language "$CURRENT_LANGUAGE" "piper" 2>/dev/null)
42
+ # Try to get voice from voice file (project-local first, then global)
43
+ VOICE_FILE=""
44
+ if [[ -f "$SCRIPT_DIR/../tts-voice.txt" ]]; then
45
+ VOICE_FILE="$SCRIPT_DIR/../tts-voice.txt"
46
+ elif [[ -f "$HOME/.claude/tts-voice.txt" ]]; then
47
+ VOICE_FILE="$HOME/.claude/tts-voice.txt"
48
+ fi
44
49
 
45
- if [[ -n "$LANG_VOICE" ]]; then
46
- VOICE_MODEL="$LANG_VOICE"
47
- echo "🌍 Using $CURRENT_LANGUAGE voice: $LANG_VOICE (Piper)"
48
- else
49
- # Use default voice
50
- VOICE_MODEL="$DEFAULT_VOICE"
50
+ if [[ -n "$VOICE_FILE" ]]; then
51
+ FILE_VOICE=$(cat "$VOICE_FILE" 2>/dev/null)
52
+ # Check if it's a Piper model name (contains underscore and dash)
53
+ if [[ "$FILE_VOICE" == *"_"*"-"* ]]; then
54
+ VOICE_MODEL="$FILE_VOICE"
55
+ fi
56
+ fi
57
+
58
+ # If no Piper voice from file, try language-specific voice
59
+ if [[ -z "$VOICE_MODEL" ]]; then
60
+ LANG_VOICE=$(get_voice_for_language "$CURRENT_LANGUAGE" "piper" 2>/dev/null)
61
+
62
+ if [[ -n "$LANG_VOICE" ]]; then
63
+ VOICE_MODEL="$LANG_VOICE"
64
+ echo "🌍 Using $CURRENT_LANGUAGE voice: $LANG_VOICE (Piper)"
65
+ else
66
+ # Use default voice
67
+ VOICE_MODEL="$DEFAULT_VOICE"
68
+ fi
51
69
  fi
52
70
  fi
53
71
 
@@ -163,52 +163,77 @@ case "$1" in
163
163
  exit 0
164
164
  fi
165
165
 
166
- # Check if input is a number
167
- if [[ "$VOICE_NAME" =~ ^[0-9]+$ ]]; then
168
- # Get voice array
169
- VOICE_ARRAY=()
170
- for voice in "${!VOICES[@]}"; do
171
- VOICE_ARRAY+=("$voice")
172
- done
166
+ # Detect active TTS provider
167
+ PROVIDER_FILE=""
168
+ if [[ -f "$CLAUDE_DIR/tts-provider.txt" ]]; then
169
+ PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
170
+ elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
171
+ PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
172
+ fi
173
173
 
174
- # Sort the array
175
- IFS=$'\n' SORTED_VOICES=($(sort <<<"${VOICE_ARRAY[*]}"))
176
- unset IFS
174
+ ACTIVE_PROVIDER="elevenlabs" # default
175
+ if [[ -n "$PROVIDER_FILE" ]]; then
176
+ ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
177
+ fi
178
+
179
+ # If using Piper and voice name looks like a Piper model (contains underscore and dash)
180
+ # then skip ElevenLabs voice validation
181
+ if [[ "$ACTIVE_PROVIDER" == "piper" ]] && [[ "$VOICE_NAME" == *"_"*"-"* ]]; then
182
+ # This is a Piper model name, use it directly
183
+ FOUND="$VOICE_NAME"
184
+ else
185
+ # ElevenLabs voice lookup
186
+ # Check if input is a number
187
+ if [[ "$VOICE_NAME" =~ ^[0-9]+$ ]]; then
188
+ # Get voice array
189
+ VOICE_ARRAY=()
190
+ for voice in "${!VOICES[@]}"; do
191
+ VOICE_ARRAY+=("$voice")
192
+ done
193
+
194
+ # Sort the array
195
+ IFS=$'\n' SORTED_VOICES=($(sort <<<"${VOICE_ARRAY[*]}"))
196
+ unset IFS
177
197
 
178
- # Get voice by number (adjust for 0-based index)
179
- INDEX=$((VOICE_NAME - 1))
198
+ # Get voice by number (adjust for 0-based index)
199
+ INDEX=$((VOICE_NAME - 1))
180
200
 
181
- if [[ $INDEX -ge 0 && $INDEX -lt ${#SORTED_VOICES[@]} ]]; then
182
- VOICE_NAME="${SORTED_VOICES[$INDEX]}"
183
- FOUND="${SORTED_VOICES[$INDEX]}"
201
+ if [[ $INDEX -ge 0 && $INDEX -lt ${#SORTED_VOICES[@]} ]]; then
202
+ VOICE_NAME="${SORTED_VOICES[$INDEX]}"
203
+ FOUND="${SORTED_VOICES[$INDEX]}"
204
+ else
205
+ echo "❌ Invalid number. Please choose between 1 and ${#SORTED_VOICES[@]}"
206
+ exit 1
207
+ fi
184
208
  else
185
- echo "❌ Invalid number. Please choose between 1 and ${#SORTED_VOICES[@]}"
186
- exit 1
209
+ # Check if voice exists (case-insensitive)
210
+ FOUND=""
211
+ for voice in "${!VOICES[@]}"; do
212
+ if [[ "${voice,,}" == "${VOICE_NAME,,}" ]]; then
213
+ FOUND="$voice"
214
+ break
215
+ fi
216
+ done
187
217
  fi
188
- else
189
- # Check if voice exists (case-insensitive)
190
- FOUND=""
191
- for voice in "${!VOICES[@]}"; do
192
- if [[ "${voice,,}" == "${VOICE_NAME,,}" ]]; then
193
- FOUND="$voice"
194
- break
195
- fi
196
- done
197
- fi
198
218
 
199
- if [[ -z "$FOUND" ]]; then
200
- echo "❌ Unknown voice: $VOICE_NAME"
201
- echo ""
202
- echo "Available voices:"
203
- for voice in "${!VOICES[@]}"; do
204
- echo " - $voice"
205
- done | sort
206
- exit 1
219
+ if [[ -z "$FOUND" ]]; then
220
+ echo "❌ Unknown voice: $VOICE_NAME"
221
+ echo ""
222
+ echo "Available voices:"
223
+ for voice in "${!VOICES[@]}"; do
224
+ echo " - $voice"
225
+ done | sort
226
+ exit 1
227
+ fi
207
228
  fi
208
229
 
209
230
  echo "$FOUND" > "$VOICE_FILE"
210
231
  echo "✅ Voice switched to: $FOUND"
211
- echo "🎤 Voice ID: ${VOICES[$FOUND]}"
232
+
233
+ # Show voice ID only for ElevenLabs voices
234
+ if [[ "$ACTIVE_PROVIDER" != "piper" ]] && [[ -n "${VOICES[$FOUND]}" ]]; then
235
+ echo "🎤 Voice ID: ${VOICES[$FOUND]}"
236
+ fi
212
237
 
213
238
  # Have the new voice introduce itself (unless silent mode)
214
239
  if [[ "$SILENT_MODE" != "true" ]]; then
@@ -217,6 +242,10 @@ case "$1" in
217
242
  if [ -x "$PLAY_TTS" ]; then
218
243
  "$PLAY_TTS" "Hi, I'm $FOUND. I'll be your voice assistant moving forward." "$FOUND" > /dev/null 2>&1 &
219
244
  fi
245
+
246
+ echo ""
247
+ echo "💡 Tip: To hear automatic TTS narration, enable the agent-vibes output style:"
248
+ echo " /output-style agent-vibes"
220
249
  fi
221
250
  ;;
222
251
 
@@ -232,6 +261,26 @@ case "$1" in
232
261
  echo "🎤 Current Voice Configuration"
233
262
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
234
263
 
264
+ # Get active TTS provider
265
+ PROVIDER_FILE="$CLAUDE_DIR/tts-provider.txt"
266
+ if [[ ! -f "$PROVIDER_FILE" ]]; then
267
+ PROVIDER_FILE="$HOME/.claude/tts-provider.txt"
268
+ fi
269
+
270
+ if [ -f "$PROVIDER_FILE" ]; then
271
+ ACTIVE_PROVIDER=$(cat "$PROVIDER_FILE")
272
+ if [[ "$ACTIVE_PROVIDER" == "elevenlabs" ]]; then
273
+ echo "Provider: ElevenLabs (Premium AI)"
274
+ elif [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
275
+ echo "Provider: Piper TTS (Free, Offline)"
276
+ else
277
+ echo "Provider: $ACTIVE_PROVIDER"
278
+ fi
279
+ else
280
+ # Default to ElevenLabs if no provider file
281
+ echo "Provider: ElevenLabs (Premium AI)"
282
+ fi
283
+
235
284
  # Get current voice
236
285
  if [ -f "$VOICE_FILE" ]; then
237
286
  CURRENT_VOICE=$(cat "$VOICE_FILE")
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: angry
3
3
  description: Frustrated and irritated responses
4
- voice: Drill Sergeant
4
+ elevenlabs_voice: Drill Sergeant
5
+ piper_voice: en_US-ryan-high
5
6
  ---
6
7
 
7
8
  # Angry Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: annoying
3
3
  description: Over-enthusiastic and excessive
4
- voice: Lutz Laugh
4
+ elevenlabs_voice: Lutz Laugh
5
+ piper_voice: en_US-ryan-high
5
6
  ---
6
7
 
7
8
  # Annoying Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: crass
3
3
  description: Blunt and slightly rude
4
- voice: Ralf Eisend
4
+ elevenlabs_voice: Ralf Eisend
5
+ piper_voice: en_US-joe-medium
5
6
  ---
6
7
 
7
8
  # Crass Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: dramatic
3
3
  description: Theatrical flair and grand statements
4
- voice: Ms. Walker
4
+ elevenlabs_voice: Ms. Walker
5
+ piper_voice: en_US-amy-medium
5
6
  ---
6
7
 
7
8
  # Dramatic Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: dry-humor
3
3
  description: British dry wit and deadpan delivery
4
- voice: Aria
4
+ elevenlabs_voice: Aria
5
+ piper_voice: en_US-lessac-medium
5
6
  ---
6
7
 
7
8
  # Dry Humor Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: flirty
3
3
  description: Playful and charming personality
4
- voice: Jessica Anne Bogart
4
+ elevenlabs_voice: Jessica Anne Bogart
5
+ piper_voice: en_US-amy-medium
5
6
  ---
6
7
 
7
8
  # Flirty Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: funny
3
3
  description: Lighthearted and comedic
4
- voice: Cowboy Bob
4
+ elevenlabs_voice: Cowboy Bob
5
+ piper_voice: en_US-joe-medium
5
6
  ---
6
7
 
7
8
  # Funny Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: grandpa
3
3
  description: Rambling nostalgic storyteller
4
- voice: Grandpa Spuds Oxley
4
+ elevenlabs_voice: Grandpa Spuds Oxley
5
+ piper_voice: en_US-libritts-high
5
6
  ---
6
7
 
7
8
  # Grandpa Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: millennial
3
3
  description: Internet generation speak
4
- voice: Amy
4
+ elevenlabs_voice: Amy
5
+ piper_voice: en_US-amy-medium
5
6
  ---
6
7
 
7
8
  # Millennial Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: moody
3
3
  description: Melancholic and brooding
4
- voice: Grandpa Spuds Oxley
4
+ elevenlabs_voice: Grandpa Spuds Oxley
5
+ piper_voice: en_US-libritts-high
5
6
  ---
6
7
 
7
8
  # Moody Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: normal
3
3
  description: Professional and clear communication
4
- voice: Aria
4
+ elevenlabs_voice: Aria
5
+ piper_voice: en_US-lessac-medium
5
6
  ---
6
7
 
7
8
  # Normal Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: pirate
3
3
  description: Seafaring swagger and nautical language
4
- voice: Pirate Marshal
4
+ elevenlabs_voice: Pirate Marshal
5
+ piper_voice: en_US-joe-medium
5
6
  ---
6
7
 
7
8
  # Pirate Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: poetic
3
3
  description: Elegant and lyrical
4
- voice: Aria
4
+ elevenlabs_voice: Aria
5
+ piper_voice: en_US-lessac-medium
5
6
  ---
6
7
 
7
8
  # Poetic Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: professional
3
3
  description: Formal and corporate
4
- voice: Michael
4
+ elevenlabs_voice: Michael
5
+ piper_voice: en_US-lessac-medium
5
6
  ---
6
7
 
7
8
  # Professional Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: robot
3
3
  description: Mechanical and precise communication
4
- voice: Dr. Von Fusion
4
+ elevenlabs_voice: Dr. Von Fusion
5
+ piper_voice: en_US-ryan-high
5
6
  ---
6
7
 
7
8
  # Robot Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: sarcastic
3
3
  description: Dry wit and cutting observations
4
- voice: Jessica Anne Bogart
4
+ elevenlabs_voice: Jessica Anne Bogart
5
+ piper_voice: en_US-amy-medium
5
6
  ---
6
7
 
7
8
  # Sarcastic Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: sassy
3
3
  description: Bold with attitude
4
- voice: Ms. Walker
4
+ elevenlabs_voice: Ms. Walker
5
+ piper_voice: en_US-amy-medium
5
6
  ---
6
7
 
7
8
  # Sassy Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: surfer-dude
3
3
  description: Laid-back beach vibes
4
- voice: Matthew Schmitz
4
+ elevenlabs_voice: Matthew Schmitz
5
+ piper_voice: en_US-joe-medium
5
6
  ---
6
7
 
7
8
  # Surfer-Dude Personality
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: zen
3
3
  description: Peaceful and mindful communication
4
- voice: Aria
4
+ elevenlabs_voice: Aria
5
+ piper_voice: en_US-lessac-medium
5
6
  ---
6
7
 
7
8
  # Zen Personality
package/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,80 @@
1
1
  # 🎤 AgentVibes Release Notes
2
2
 
3
+ ## 📦 v2.0.8 - Provider-Aware Personalities (2025-01-07)
4
+
5
+ ### 🤖 AI Summary
6
+
7
+ This patch release makes the personality system fully provider-aware, fixing a critical issue where personality switching would fail to play TTS acknowledgments when using Piper TTS. Users can now seamlessly switch personalities regardless of which TTS provider they're using, with each personality automatically selecting the appropriate voice for the active provider.
8
+
9
+ ### ✨ New Features
10
+
11
+ #### Provider-Aware Personality Voice Switching
12
+ - **Dual voice mappings** - All 19 personality files now include both `elevenlabs_voice` and `piper_voice` fields
13
+ - **Automatic voice selection** - Personality manager detects active TTS provider and switches to appropriate voice automatically
14
+ - **Piper voice mappings**:
15
+ - Female personalities (sarcastic, flirty, sassy, dramatic) → `en_US-amy-medium`
16
+ - Male casual (funny, pirate, surfer-dude, crass) → `en_US-joe-medium`
17
+ - Professional (professional, normal, dry-humor, poetic, zen) → `en_US-lessac-medium`
18
+ - Energetic (angry, annoying, robot) → `en_US-ryan-high`
19
+ - Character voices (grandpa, moody) → `en_US-libritts-high`
20
+
21
+ #### Output Style Detection Helper
22
+ - **New check-output-style.sh** - Helper script for future output style detection features
23
+ - **User-friendly tips** - Voice and personality commands now show helpful tip about enabling agent-vibes output style
24
+ - **Better UX** - Users are guided to `/output-style agent-vibes` when needed
25
+
26
+ ### 🐛 Bug Fixes
27
+
28
+ #### Whoami Command Provider Detection
29
+ - **Fixed provider display** - `/agent-vibes:whoami` now correctly shows active provider (Piper TTS or ElevenLabs)
30
+ - **Updated command description** - Metadata now mentions both providers instead of hardcoding "ElevenLabs"
31
+ - **Accurate information** - Users see "Provider: Piper TTS (Free, Offline)" when using Piper
32
+
33
+ #### Voice Manager Provider Support
34
+ - **Piper model name recognition** - Voice manager now accepts Piper voice model names (e.g., `en_US-amy-medium`)
35
+ - **Provider-aware validation** - Skips ElevenLabs voice validation when using Piper with Piper model names
36
+ - **Smart voice ID display** - Only shows ElevenLabs voice ID when actually using ElevenLabs
37
+
38
+ #### Piper TTS Voice File Reading
39
+ - **Fixed voice file lookup** - `play-tts-piper.sh` now correctly reads voice from `.claude/tts-voice.txt`
40
+ - **Project-local support** - Checks project-local `.claude/tts-voice.txt` first, then global `~/.claude/tts-voice.txt`
41
+ - **Piper model detection** - Validates voice names contain underscore and dash pattern for Piper models
42
+
43
+ ### 🔧 Technical Changes
44
+
45
+ #### Personality Manager Improvements
46
+ - **Provider detection** - Reads `tts-provider.txt` to determine active provider
47
+ - **Conditional voice selection** - Uses `piper_voice` field when Piper is active, `elevenlabs_voice` for ElevenLabs
48
+ - **Fallback voice** - Defaults to `en_US-lessac-medium` if no Piper voice specified
49
+ - **New field support** - Added `piper_voice` field extraction to `get_personality_data` function
50
+
51
+ #### Voice Manager Refactoring
52
+ - **Provider-aware switch logic** - Detects Piper model names and bypasses ElevenLabs validation
53
+ - **Pattern matching** - Uses `*"_"*"-"*` pattern to identify Piper voice model names
54
+ - **Cleaner output** - Removed voice ID display for Piper voices since they don't use IDs
55
+
56
+ #### Personality File Structure
57
+ - **Clearer naming** - Renamed `voice:` to `elevenlabs_voice:` in all personality frontmatter
58
+ - **Dual provider support** - Every personality now has both ElevenLabs and Piper voice assignments
59
+ - **Consistency** - Standardized field naming across all 19 personality files
60
+
61
+ ### 🎯 User Impact
62
+
63
+ **Before:** Setting a personality like `/agent-vibes:personality sarcastic` while using Piper TTS would try to use an ElevenLabs voice name that doesn't exist in Piper, resulting in no audio playback for acknowledgments/completions.
64
+
65
+ **After:** Personality switching seamlessly works with both providers:
66
+ - Using Piper? Gets `en_US-amy-medium` for sarcastic personality
67
+ - Using ElevenLabs? Gets "Jessica Anne Bogart" voice
68
+ - Always hear proper TTS acknowledgments and completions!
69
+
70
+ ### 📊 Files Changed
71
+ - Modified: 3 hook scripts (personality-manager.sh, voice-manager.sh, play-tts-piper.sh)
72
+ - Modified: 19 personality files (all now have dual voice mappings)
73
+ - Modified: 1 command file (whoami.md)
74
+ - Added: 1 new helper script (check-output-style.sh)
75
+
76
+ **Total Changes:** 247 insertions, 69 deletions across 25 files
77
+
3
78
  ## 📦 v2.0.7 - Bug Fixes & UX Improvements (2025-01-07)
4
79
 
5
80
  ### 🤖 AI Summary
@@ -0,0 +1,21 @@
1
+ ---
2
+ description: Add a new custom ElevenLabs TTS voice
3
+ argument-hint: <voice_name> <voice_id>
4
+ ---
5
+
6
+ Add a new custom ElevenLabs TTS voice to your voice library.
7
+
8
+ Usage:
9
+ - `/agent-vibes:add "My Custom Voice" abc123xyz456789`
10
+ - `/agent-vibes:add Narrator KTPVrSVAEUSJRClDzBw7`
11
+
12
+ The voice ID should be a 15-30 character alphanumeric string from your ElevenLabs account.
13
+
14
+ To find your voice IDs:
15
+ 1. Go to https://elevenlabs.io/app/voice-library
16
+ 2. Click on a voice
17
+ 3. Copy the voice ID from the URL or settings
18
+
19
+ After adding, you can switch to it with `/agent-vibes:switch "Voice Name"`
20
+
21
+ !bash .claude/hooks/voice-manager.sh add $ARGUMENTS