agentvibes 2.0.7 → 2.0.9
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/README.md +2 -2
- package/RELEASE_NOTES.md +98 -0
- package/package.json +1 -1
- package/src/installer.js +57 -31
|
@@ -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/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
|
|
12
12
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
13
13
|
|
|
14
|
-
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.0.
|
|
14
|
+
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.0.9
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
## 📰 Latest Release
|
|
47
47
|
|
|
48
|
-
**[v2.0.0 - The Multi-Provider Revolution](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.0.
|
|
48
|
+
**[v2.0.0 - The Multi-Provider Revolution](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.0.9)** 🎉
|
|
49
49
|
|
|
50
50
|
The biggest update ever! **Multi-provider TTS support** (ElevenLabs + Piper TTS), **30+ languages**, expanded voice library (27+ voices), advanced sentiment system, enhanced BMAD integration, and comprehensive multilingual support. Choose between premium ElevenLabs voices or free offline Piper TTS!
|
|
51
51
|
|
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,5 +1,103 @@
|
|
|
1
1
|
# 🎤 AgentVibes Release Notes
|
|
2
2
|
|
|
3
|
+
## 📦 v2.0.9 - Installer Release Notes Fix (2025-01-07)
|
|
4
|
+
|
|
5
|
+
### 🤖 AI Summary
|
|
6
|
+
|
|
7
|
+
This patch release fixes a critical bug where the installer and updater commands were showing outdated v1.1.x commit messages instead of the current v2.0.8+ release notes. The commands now correctly read from RELEASE_NOTES.md which is included in the npm package.
|
|
8
|
+
|
|
9
|
+
### 🐛 Bug Fixes
|
|
10
|
+
|
|
11
|
+
#### Installer Release Notes Display
|
|
12
|
+
- **Fixed install command** - Now reads from RELEASE_NOTES.md instead of git log
|
|
13
|
+
- **Fixed update command** - Now shows actual v2.0.x release notes instead of v1.1.x commits
|
|
14
|
+
- **npm package compatibility** - Works correctly when installed via `npx agentvibes` (not a git repo)
|
|
15
|
+
- **Consistent display** - Both install and update show the same latest release information
|
|
16
|
+
|
|
17
|
+
### 🎯 User Impact
|
|
18
|
+
|
|
19
|
+
**Before:** Running `npx agentvibes update` showed confusing old commit messages from v1.1.2 era.
|
|
20
|
+
|
|
21
|
+
**After:** Both `install` and `update` commands show the correct latest release notes from v2.0.9, including the provider-aware personalities feature and all recent improvements.
|
|
22
|
+
|
|
23
|
+
### 📊 Files Changed
|
|
24
|
+
- Modified: src/installer.js (57 insertions, 31 deletions)
|
|
25
|
+
|
|
26
|
+
## 📦 v2.0.8 - Provider-Aware Personalities (2025-01-07)
|
|
27
|
+
|
|
28
|
+
### 🤖 AI Summary
|
|
29
|
+
|
|
30
|
+
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.
|
|
31
|
+
|
|
32
|
+
### ✨ New Features
|
|
33
|
+
|
|
34
|
+
#### Provider-Aware Personality Voice Switching
|
|
35
|
+
- **Dual voice mappings** - All 19 personality files now include both `elevenlabs_voice` and `piper_voice` fields
|
|
36
|
+
- **Automatic voice selection** - Personality manager detects active TTS provider and switches to appropriate voice automatically
|
|
37
|
+
- **Piper voice mappings**:
|
|
38
|
+
- Female personalities (sarcastic, flirty, sassy, dramatic) → `en_US-amy-medium`
|
|
39
|
+
- Male casual (funny, pirate, surfer-dude, crass) → `en_US-joe-medium`
|
|
40
|
+
- Professional (professional, normal, dry-humor, poetic, zen) → `en_US-lessac-medium`
|
|
41
|
+
- Energetic (angry, annoying, robot) → `en_US-ryan-high`
|
|
42
|
+
- Character voices (grandpa, moody) → `en_US-libritts-high`
|
|
43
|
+
|
|
44
|
+
#### Output Style Detection Helper
|
|
45
|
+
- **New check-output-style.sh** - Helper script for future output style detection features
|
|
46
|
+
- **User-friendly tips** - Voice and personality commands now show helpful tip about enabling agent-vibes output style
|
|
47
|
+
- **Better UX** - Users are guided to `/output-style agent-vibes` when needed
|
|
48
|
+
|
|
49
|
+
### 🐛 Bug Fixes
|
|
50
|
+
|
|
51
|
+
#### Whoami Command Provider Detection
|
|
52
|
+
- **Fixed provider display** - `/agent-vibes:whoami` now correctly shows active provider (Piper TTS or ElevenLabs)
|
|
53
|
+
- **Updated command description** - Metadata now mentions both providers instead of hardcoding "ElevenLabs"
|
|
54
|
+
- **Accurate information** - Users see "Provider: Piper TTS (Free, Offline)" when using Piper
|
|
55
|
+
|
|
56
|
+
#### Voice Manager Provider Support
|
|
57
|
+
- **Piper model name recognition** - Voice manager now accepts Piper voice model names (e.g., `en_US-amy-medium`)
|
|
58
|
+
- **Provider-aware validation** - Skips ElevenLabs voice validation when using Piper with Piper model names
|
|
59
|
+
- **Smart voice ID display** - Only shows ElevenLabs voice ID when actually using ElevenLabs
|
|
60
|
+
|
|
61
|
+
#### Piper TTS Voice File Reading
|
|
62
|
+
- **Fixed voice file lookup** - `play-tts-piper.sh` now correctly reads voice from `.claude/tts-voice.txt`
|
|
63
|
+
- **Project-local support** - Checks project-local `.claude/tts-voice.txt` first, then global `~/.claude/tts-voice.txt`
|
|
64
|
+
- **Piper model detection** - Validates voice names contain underscore and dash pattern for Piper models
|
|
65
|
+
|
|
66
|
+
### 🔧 Technical Changes
|
|
67
|
+
|
|
68
|
+
#### Personality Manager Improvements
|
|
69
|
+
- **Provider detection** - Reads `tts-provider.txt` to determine active provider
|
|
70
|
+
- **Conditional voice selection** - Uses `piper_voice` field when Piper is active, `elevenlabs_voice` for ElevenLabs
|
|
71
|
+
- **Fallback voice** - Defaults to `en_US-lessac-medium` if no Piper voice specified
|
|
72
|
+
- **New field support** - Added `piper_voice` field extraction to `get_personality_data` function
|
|
73
|
+
|
|
74
|
+
#### Voice Manager Refactoring
|
|
75
|
+
- **Provider-aware switch logic** - Detects Piper model names and bypasses ElevenLabs validation
|
|
76
|
+
- **Pattern matching** - Uses `*"_"*"-"*` pattern to identify Piper voice model names
|
|
77
|
+
- **Cleaner output** - Removed voice ID display for Piper voices since they don't use IDs
|
|
78
|
+
|
|
79
|
+
#### Personality File Structure
|
|
80
|
+
- **Clearer naming** - Renamed `voice:` to `elevenlabs_voice:` in all personality frontmatter
|
|
81
|
+
- **Dual provider support** - Every personality now has both ElevenLabs and Piper voice assignments
|
|
82
|
+
- **Consistency** - Standardized field naming across all 19 personality files
|
|
83
|
+
|
|
84
|
+
### 🎯 User Impact
|
|
85
|
+
|
|
86
|
+
**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.
|
|
87
|
+
|
|
88
|
+
**After:** Personality switching seamlessly works with both providers:
|
|
89
|
+
- Using Piper? Gets `en_US-amy-medium` for sarcastic personality
|
|
90
|
+
- Using ElevenLabs? Gets "Jessica Anne Bogart" voice
|
|
91
|
+
- Always hear proper TTS acknowledgments and completions!
|
|
92
|
+
|
|
93
|
+
### 📊 Files Changed
|
|
94
|
+
- Modified: 3 hook scripts (personality-manager.sh, voice-manager.sh, play-tts-piper.sh)
|
|
95
|
+
- Modified: 19 personality files (all now have dual voice mappings)
|
|
96
|
+
- Modified: 1 command file (whoami.md)
|
|
97
|
+
- Added: 1 new helper script (check-output-style.sh)
|
|
98
|
+
|
|
99
|
+
**Total Changes:** 247 insertions, 69 deletions across 25 files
|
|
100
|
+
|
|
3
101
|
## 📦 v2.0.7 - Bug Fixes & UX Improvements (2025-01-07)
|
|
4
102
|
|
|
5
103
|
### 🤖 AI Summary
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "agentvibes",
|
|
4
|
-
"version": "2.0.
|
|
4
|
+
"version": "2.0.9",
|
|
5
5
|
"description": "Bring your Claude Code sessions to life with voice! Professional TTS narration with multi-provider support.",
|
|
6
6
|
"homepage": "https://agentvibes.org",
|
|
7
7
|
"keywords": [
|
package/src/installer.js
CHANGED
|
@@ -73,25 +73,38 @@ async function install(options = {}) {
|
|
|
73
73
|
console.log(chalk.gray(` Install location: ${currentDir}/.claude/`));
|
|
74
74
|
console.log(chalk.gray(` Package version: ${VERSION}`));
|
|
75
75
|
|
|
76
|
-
// Show latest release notes from
|
|
76
|
+
// Show latest release notes from RELEASE_NOTES.md
|
|
77
77
|
try {
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
78
|
+
const releaseNotesPath = path.join(__dirname, '..', 'RELEASE_NOTES.md');
|
|
79
|
+
const releaseNotes = await fs.readFile(releaseNotesPath, 'utf8');
|
|
80
|
+
const lines = releaseNotes.split('\n');
|
|
81
|
+
|
|
82
|
+
// Extract the first release section (v2.0.x format)
|
|
83
|
+
console.log(chalk.cyan('\n📰 Latest Release Notes:'));
|
|
84
|
+
|
|
85
|
+
let foundFirstRelease = false;
|
|
86
|
+
let lineCount = 0;
|
|
87
|
+
const maxLines = 8; // Show first 8 lines of latest release
|
|
88
|
+
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
if (line.startsWith('## 📦 v')) {
|
|
91
|
+
if (foundFirstRelease) break; // Stop at second release
|
|
92
|
+
foundFirstRelease = true;
|
|
93
|
+
console.log(chalk.white(line.replace('## 📦 ', '')));
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (foundFirstRelease && line.trim()) {
|
|
97
|
+
if (line.startsWith('###')) {
|
|
98
|
+
console.log(chalk.gray(line));
|
|
99
|
+
} else if (line.startsWith('- ')) {
|
|
100
|
+
console.log(chalk.gray(' ' + line));
|
|
101
|
+
}
|
|
102
|
+
lineCount++;
|
|
103
|
+
if (lineCount >= maxLines) break;
|
|
104
|
+
}
|
|
92
105
|
}
|
|
93
106
|
} catch (error) {
|
|
94
|
-
//
|
|
107
|
+
// RELEASE_NOTES.md not available - skip release notes
|
|
95
108
|
}
|
|
96
109
|
|
|
97
110
|
// Provider selection prompt
|
|
@@ -730,25 +743,38 @@ program
|
|
|
730
743
|
console.log(chalk.gray(` Update location: ${targetDir}/.claude/`));
|
|
731
744
|
console.log(chalk.gray(` Package version: ${version}`));
|
|
732
745
|
|
|
733
|
-
// Show latest release notes from
|
|
746
|
+
// Show latest release notes from RELEASE_NOTES.md
|
|
734
747
|
try {
|
|
735
|
-
const
|
|
736
|
-
const
|
|
737
|
-
|
|
738
|
-
{ cwd: path.join(__dirname, '..'), encoding: 'utf8' }
|
|
739
|
-
).trim();
|
|
748
|
+
const releaseNotesPath = path.join(__dirname, '..', 'RELEASE_NOTES.md');
|
|
749
|
+
const releaseNotes = await fs.readFile(releaseNotesPath, 'utf8');
|
|
750
|
+
const lines = releaseNotes.split('\n');
|
|
740
751
|
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
752
|
+
// Extract the first release section (v2.0.x format)
|
|
753
|
+
console.log(chalk.cyan('\n📰 Latest Release Notes:'));
|
|
754
|
+
|
|
755
|
+
let foundFirstRelease = false;
|
|
756
|
+
let lineCount = 0;
|
|
757
|
+
const maxLines = 8; // Show first 8 lines of latest release
|
|
758
|
+
|
|
759
|
+
for (const line of lines) {
|
|
760
|
+
if (line.startsWith('## 📦 v')) {
|
|
761
|
+
if (foundFirstRelease) break; // Stop at second release
|
|
762
|
+
foundFirstRelease = true;
|
|
763
|
+
console.log(chalk.white(line.replace('## 📦 ', '')));
|
|
764
|
+
continue;
|
|
765
|
+
}
|
|
766
|
+
if (foundFirstRelease && line.trim()) {
|
|
767
|
+
if (line.startsWith('###')) {
|
|
768
|
+
console.log(chalk.gray(line));
|
|
769
|
+
} else if (line.startsWith('- ')) {
|
|
770
|
+
console.log(chalk.gray(' ' + line));
|
|
771
|
+
}
|
|
772
|
+
lineCount++;
|
|
773
|
+
if (lineCount >= maxLines) break;
|
|
774
|
+
}
|
|
749
775
|
}
|
|
750
776
|
} catch (error) {
|
|
751
|
-
//
|
|
777
|
+
// RELEASE_NOTES.md not available - skip release notes
|
|
752
778
|
}
|
|
753
779
|
|
|
754
780
|
// Check if already installed
|