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.
- package/.claude/commands/agent-vibes/whoami.md +2 -2
- package/.claude/hooks/check-output-style.sh +60 -0
- package/.claude/hooks/personality-manager.sh +34 -2
- package/.claude/hooks/play-tts-piper.sh +26 -8
- package/.claude/hooks/voice-manager.sh +85 -36
- package/.claude/personalities/angry.md +2 -1
- package/.claude/personalities/annoying.md +2 -1
- package/.claude/personalities/crass.md +2 -1
- package/.claude/personalities/dramatic.md +2 -1
- package/.claude/personalities/dry-humor.md +2 -1
- package/.claude/personalities/flirty.md +2 -1
- package/.claude/personalities/funny.md +2 -1
- package/.claude/personalities/grandpa.md +2 -1
- package/.claude/personalities/millennial.md +2 -1
- package/.claude/personalities/moody.md +2 -1
- package/.claude/personalities/normal.md +2 -1
- package/.claude/personalities/pirate.md +2 -1
- package/.claude/personalities/poetic.md +2 -1
- package/.claude/personalities/professional.md +2 -1
- package/.claude/personalities/robot.md +2 -1
- package/.claude/personalities/sarcastic.md +2 -1
- package/.claude/personalities/sassy.md +2 -1
- package/.claude/personalities/surfer-dude.md +2 -1
- package/.claude/personalities/zen.md +2 -1
- package/RELEASE_NOTES.md +75 -0
- package/agentvibes.org/.claude/commands/agent-vibes/add.md +21 -0
- package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +68 -0
- package/agentvibes.org/.claude/commands/agent-vibes/commands.json +53 -0
- package/agentvibes.org/.claude/commands/agent-vibes/get.md +9 -0
- package/agentvibes.org/.claude/commands/agent-vibes/list.md +13 -0
- package/agentvibes.org/.claude/commands/agent-vibes/personality.md +79 -0
- package/agentvibes.org/.claude/commands/agent-vibes/preview.md +16 -0
- package/agentvibes.org/.claude/commands/agent-vibes/provider.md +54 -0
- package/agentvibes.org/.claude/commands/agent-vibes/replay.md +19 -0
- package/agentvibes.org/.claude/commands/agent-vibes/sample.md +12 -0
- package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +52 -0
- package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +47 -0
- package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +65 -0
- package/agentvibes.org/.claude/commands/agent-vibes/switch.md +53 -0
- package/agentvibes.org/.claude/commands/agent-vibes/update.md +20 -0
- package/agentvibes.org/.claude/commands/agent-vibes/version.md +10 -0
- package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +7 -0
- package/agentvibes.org/.claude/hooks/bmad-voice-manager.sh +278 -0
- package/agentvibes.org/.claude/hooks/language-manager.sh +190 -0
- package/agentvibes.org/.claude/hooks/personality-manager.sh +279 -0
- package/agentvibes.org/.claude/hooks/piper-download-voices.sh +133 -0
- package/agentvibes.org/.claude/hooks/piper-voice-manager.sh +227 -0
- package/agentvibes.org/.claude/hooks/play-tts-elevenlabs.sh +201 -0
- package/agentvibes.org/.claude/hooks/play-tts-piper.sh +175 -0
- package/agentvibes.org/.claude/hooks/play-tts.sh +138 -0
- package/agentvibes.org/.claude/hooks/provider-commands.sh +374 -0
- package/agentvibes.org/.claude/hooks/provider-manager.sh +196 -0
- package/agentvibes.org/.claude/hooks/sentiment-manager.sh +163 -0
- package/agentvibes.org/.claude/hooks/voice-manager.sh +349 -0
- package/agentvibes.org/.claude/hooks/voices-config.sh +33 -0
- package/agentvibes.org/.claude/journal/2025-10-07.html +373 -0
- package/agentvibes.org/.claude/journal/index.html +91 -0
- package/agentvibes.org/.claude/output-styles/agent-vibes.md +203 -0
- package/agentvibes.org/.claude/personalities/angry.md +16 -0
- package/agentvibes.org/.claude/personalities/annoying.md +16 -0
- package/agentvibes.org/.claude/personalities/crass.md +16 -0
- package/agentvibes.org/.claude/personalities/dramatic.md +16 -0
- package/agentvibes.org/.claude/personalities/dry-humor.md +52 -0
- package/agentvibes.org/.claude/personalities/flirty.md +22 -0
- package/agentvibes.org/.claude/personalities/funny.md +16 -0
- package/agentvibes.org/.claude/personalities/grandpa.md +34 -0
- package/agentvibes.org/.claude/personalities/millennial.md +16 -0
- package/agentvibes.org/.claude/personalities/moody.md +16 -0
- package/agentvibes.org/.claude/personalities/normal.md +18 -0
- package/agentvibes.org/.claude/personalities/pirate.md +16 -0
- package/agentvibes.org/.claude/personalities/poetic.md +16 -0
- package/agentvibes.org/.claude/personalities/professional.md +16 -0
- package/agentvibes.org/.claude/personalities/robot.md +16 -0
- package/agentvibes.org/.claude/personalities/sarcastic.md +40 -0
- package/agentvibes.org/.claude/personalities/sassy.md +16 -0
- package/agentvibes.org/.claude/personalities/surfer-dude.md +16 -0
- package/agentvibes.org/.claude/personalities/zen.md +16 -0
- package/agentvibes.org/.mcp-minimal.json +60 -0
- package/agentvibes.org/CHANGELOG.md +56 -0
- package/agentvibes.org/README.md +93 -0
- package/agentvibes.org/app/(auth)/layout.tsx +15 -0
- package/agentvibes.org/app/(auth)/reset-password/page.tsx +45 -0
- package/agentvibes.org/app/(auth)/signin/page.tsx +82 -0
- package/agentvibes.org/app/(auth)/signup/page.tsx +104 -0
- package/agentvibes.org/app/(default)/layout.tsx +31 -0
- package/agentvibes.org/app/(default)/page.tsx +20 -0
- package/agentvibes.org/app/api/hello/route.ts +3 -0
- package/agentvibes.org/app/css/additional-styles/theme.css +82 -0
- package/agentvibes.org/app/css/additional-styles/utility-patterns.css +55 -0
- package/agentvibes.org/app/css/style.css +100 -0
- package/agentvibes.org/app/layout.tsx +63 -0
- package/agentvibes.org/components/cta.tsx +58 -0
- package/agentvibes.org/components/features.tsx +256 -0
- package/agentvibes.org/components/hero-home.tsx +133 -0
- package/agentvibes.org/components/modal-video.tsx +137 -0
- package/agentvibes.org/components/page-illustration.tsx +55 -0
- package/agentvibes.org/components/spotlight.tsx +77 -0
- package/agentvibes.org/components/testimonials.tsx +282 -0
- package/agentvibes.org/components/ui/footer.tsx +82 -0
- package/agentvibes.org/components/ui/header.tsx +53 -0
- package/agentvibes.org/components/ui/logo.tsx +10 -0
- package/agentvibes.org/components/workflows.tsx +176 -0
- package/agentvibes.org/next.config.js +4 -0
- package/agentvibes.org/package-lock.json +1974 -0
- package/agentvibes.org/package.json +30 -0
- package/agentvibes.org/pnpm-lock.yaml +1141 -0
- package/agentvibes.org/postcss.config.js +5 -0
- package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
- package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
- package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
- package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
- package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
- package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
- package/agentvibes.org/public/favicon.ico +0 -0
- package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
- package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
- package/agentvibes.org/public/images/blurred-shape-gray.svg +1 -0
- package/agentvibes.org/public/images/blurred-shape.svg +1 -0
- package/agentvibes.org/public/images/client-logo-01.svg +1 -0
- package/agentvibes.org/public/images/client-logo-02.svg +1 -0
- package/agentvibes.org/public/images/client-logo-03.svg +1 -0
- package/agentvibes.org/public/images/client-logo-04.svg +1 -0
- package/agentvibes.org/public/images/client-logo-05.svg +1 -0
- package/agentvibes.org/public/images/client-logo-06.svg +1 -0
- package/agentvibes.org/public/images/client-logo-07.svg +1 -0
- package/agentvibes.org/public/images/client-logo-08.svg +1 -0
- package/agentvibes.org/public/images/client-logo-09.svg +1 -0
- package/agentvibes.org/public/images/features.png +0 -0
- package/agentvibes.org/public/images/footer-illustration.svg +1 -0
- package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
- package/agentvibes.org/public/images/logo.svg +1 -0
- package/agentvibes.org/public/images/page-illustration.svg +1 -0
- package/agentvibes.org/public/images/secondary-illustration.svg +1 -0
- package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
- package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
- package/agentvibes.org/public/images/workflow-01.png +0 -0
- package/agentvibes.org/public/images/workflow-02.png +0 -0
- package/agentvibes.org/public/images/workflow-03.png +0 -0
- package/agentvibes.org/public/videos/video.mp4 +0 -0
- package/agentvibes.org/tsconfig.json +28 -0
- package/agentvibes.org/utils/useMasonry.tsx +67 -0
- package/agentvibes.org/utils/useMousePosition.tsx +27 -0
- 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
|
|
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 "^
|
|
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
|
-
|
|
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
|
|
43
|
-
|
|
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 "$
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
#
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
179
|
-
|
|
198
|
+
# Get voice by number (adjust for 0-based index)
|
|
199
|
+
INDEX=$((VOICE_NAME - 1))
|
|
180
200
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
186
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
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")
|
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
|