agentvibes 2.16.1 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/config/audio-effects.cfg +1 -1
- package/.claude/config/audio-effects.cfg.sample +52 -0
- package/.claude/hooks/audio-processor.sh +2 -2
- package/.claude/hooks/learn-manager.sh +7 -7
- package/.claude/hooks/personality-manager.sh +35 -24
- package/.claude/hooks/piper-installer.sh +2 -2
- package/.claude/hooks/provider-manager.sh +4 -4
- package/.claude/hooks/replay-target-audio.sh +1 -1
- package/.claude/hooks/speed-manager.sh +4 -4
- package/.claude/hooks/voice-manager.sh +50 -47
- package/.claude/personalities/angry.md +2 -4
- package/.claude/personalities/annoying.md +2 -4
- package/.claude/personalities/crass.md +2 -4
- package/.claude/personalities/dramatic.md +2 -4
- package/.claude/personalities/dry-humor.md +1 -3
- package/.claude/personalities/flirty.md +2 -4
- package/.claude/personalities/funny.md +2 -4
- package/.claude/personalities/grandpa.md +1 -3
- package/.claude/personalities/millennial.md +2 -4
- package/.claude/personalities/moody.md +2 -4
- package/.claude/personalities/normal.md +2 -4
- package/.claude/personalities/pirate.md +2 -4
- package/.claude/personalities/poetic.md +2 -4
- package/.claude/personalities/professional.md +2 -4
- package/.claude/personalities/rapper.md +1 -3
- package/.claude/personalities/robot.md +2 -4
- package/.claude/personalities/sarcastic.md +2 -4
- package/.claude/personalities/sassy.md +1 -3
- package/.claude/personalities/surfer-dude.md +2 -4
- package/.claude/personalities/zen.md +2 -4
- package/README.md +146 -10
- package/mcp-server/server.py +17 -17
- package/package.json +1 -1
- package/src/cli/list-personalities.js +110 -0
- package/src/cli/list-voices.js +114 -0
- package/src/commands/install-mcp.js +50 -34
- package/src/installer.js +1122 -481
- package/src/utils/dependency-checker.js +403 -0
- package/src/utils/list-formatter.js +194 -0
|
@@ -49,4 +49,4 @@ BMad Master|reverb 50 60 100 pitch -100|agentvibes_soft_flamenco_loop.mp3|0.30
|
|
|
49
49
|
_party_mode|compand 0.3,1 6:-70,-60,-20|agent_vibes_dark_chill_step_loop.mp3|0.40
|
|
50
50
|
|
|
51
51
|
# Default (no agent specified) - clean with subtle enhancement and chillwave background
|
|
52
|
-
default|
|
|
52
|
+
default|gain -8|agent_vibes_chillwave_v2_loop.mp3|0.30
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# AgentVibes Audio Effects Configuration
|
|
2
|
+
# Format: AGENT_NAME|SOX_EFFECTS|BACKGROUND_FILE|BACKGROUND_VOLUME
|
|
3
|
+
#
|
|
4
|
+
# SOX_EFFECTS: sox effect chain (leave empty for none)
|
|
5
|
+
# - reverb <reverberance> <HF-damping> <room-scale>
|
|
6
|
+
# - pitch <cents> (100 cents = 1 semitone)
|
|
7
|
+
# - equalizer <freq> <width>q <gain-dB>
|
|
8
|
+
# - gain <dB>
|
|
9
|
+
# - compand <attack,decay> <soft-knee-dB:in-dB,out-dB>
|
|
10
|
+
#
|
|
11
|
+
# BACKGROUND_FILE: path to ambient audio (relative to .claude/audio/tracks/)
|
|
12
|
+
# BACKGROUND_VOLUME: 0.0-1.0 (0.20-0.40 recommended)
|
|
13
|
+
#
|
|
14
|
+
# Example: John|reverb 30 50 80|my-track.mp3|0.25
|
|
15
|
+
|
|
16
|
+
# BMAD Agents - each with unique audio personality
|
|
17
|
+
|
|
18
|
+
# PM John - upbeat, driving energy
|
|
19
|
+
John|gain -1 equalizer 3000 1q +2|agentvibes_soft_flamenco_loop.mp3|0.30
|
|
20
|
+
|
|
21
|
+
# Architect Winston - deep, authoritative
|
|
22
|
+
Winston|reverb 40 50 90 gain -2|agentvibes_soft_flamenco_loop.mp3|0.25
|
|
23
|
+
|
|
24
|
+
# Developer Amelia - clean, precise
|
|
25
|
+
Amelia|compand 0.3,1 6:-70,-60,-20|agentvibes_soft_flamenco_loop.mp3|0.25
|
|
26
|
+
|
|
27
|
+
# Business Analyst Mary - warm, analytical
|
|
28
|
+
Mary|equalizer 200 1q +3 equalizer 2500 1q -2|agentvibes_soft_flamenco_loop.mp3|0.25
|
|
29
|
+
|
|
30
|
+
# Scrum Master Bob - refined, organized
|
|
31
|
+
Bob|reverb 30 40 70 compand 0.2,0.5 6:-70,-60,-20|agentvibes_soft_flamenco_loop.mp3|0.25
|
|
32
|
+
|
|
33
|
+
# Test Architect Murat - crisp, analytical
|
|
34
|
+
Murat|equalizer 4000 1q +3 compand 0.1,0.3 6:-70,-60,-20|agentvibes_soft_flamenco_loop.mp3|0.25
|
|
35
|
+
|
|
36
|
+
# UX Designer Sally - warm, empathetic
|
|
37
|
+
Sally|reverb 25 40 70 equalizer 300 1q +2|agentvibes_soft_flamenco_loop.mp3|0.25
|
|
38
|
+
|
|
39
|
+
# Tech Writer Paige - clear, patient
|
|
40
|
+
Paige|compand 0.2,0.5 6:-70,-60,-20|agentvibes_soft_flamenco_loop.mp3|0.20
|
|
41
|
+
|
|
42
|
+
# Frame Expert Saif - structured, detail-oriented
|
|
43
|
+
Saif|equalizer 2000 1q +2|agentvibes_soft_flamenco_loop.mp3|0.25
|
|
44
|
+
|
|
45
|
+
# BMad Master - wise orchestrator
|
|
46
|
+
BMad Master|reverb 50 60 100 pitch -100|agentvibes_soft_flamenco_loop.mp3|0.30
|
|
47
|
+
|
|
48
|
+
# Party mode room ambiance - used when multiple agents are talking
|
|
49
|
+
_party_mode|compand 0.3,1 6:-70,-60,-20|agent_vibes_dark_chill_step_loop.mp3|0.40
|
|
50
|
+
|
|
51
|
+
# Default (no agent specified) - clean with subtle enhancement and chillwave background
|
|
52
|
+
default|gain -8|agentvibes_soft_flamenco_loop.mp3|0.30
|
|
@@ -83,7 +83,7 @@ get_agent_config() {
|
|
|
83
83
|
local agent="$1"
|
|
84
84
|
|
|
85
85
|
if [[ ! -f "$CONFIG_FILE" ]]; then
|
|
86
|
-
echo "default
|
|
86
|
+
echo "default|gain -8||0.0"
|
|
87
87
|
return
|
|
88
88
|
fi
|
|
89
89
|
|
|
@@ -100,7 +100,7 @@ get_agent_config() {
|
|
|
100
100
|
if [[ -n "$config" ]]; then
|
|
101
101
|
echo "$config"
|
|
102
102
|
else
|
|
103
|
-
echo "default
|
|
103
|
+
echo "default|gain -8||0.0"
|
|
104
104
|
fi
|
|
105
105
|
}
|
|
106
106
|
|
|
@@ -187,7 +187,7 @@ set_target_language() {
|
|
|
187
187
|
elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
|
|
188
188
|
provider=$(cat "$HOME/.claude/tts-provider.txt")
|
|
189
189
|
else
|
|
190
|
-
provider="
|
|
190
|
+
provider="piper"
|
|
191
191
|
fi
|
|
192
192
|
echo -e " (for ${GREEN}$provider${NC} TTS)"
|
|
193
193
|
echo ""
|
|
@@ -207,7 +207,7 @@ set_target_language() {
|
|
|
207
207
|
echo -e "${YELLOW} (Voice not yet downloaded - greeting will play after first download)${NC}"
|
|
208
208
|
fi
|
|
209
209
|
else
|
|
210
|
-
#
|
|
210
|
+
# macOS or other provider - just play it in background
|
|
211
211
|
nohup "$SCRIPT_DIR/play-tts.sh" "$greeting" "$recommended_voice" >/dev/null 2>&1 &
|
|
212
212
|
fi
|
|
213
213
|
else
|
|
@@ -228,7 +228,7 @@ get_recommended_voice_for_language() {
|
|
|
228
228
|
elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
|
|
229
229
|
provider=$(cat "$HOME/.claude/tts-provider.txt")
|
|
230
230
|
else
|
|
231
|
-
provider="
|
|
231
|
+
provider="piper" # Default
|
|
232
232
|
fi
|
|
233
233
|
|
|
234
234
|
# Source language manager and get provider-specific voice
|
|
@@ -279,7 +279,7 @@ suggest_voice_for_language() {
|
|
|
279
279
|
elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
|
|
280
280
|
provider=$(cat "$HOME/.claude/tts-provider.txt")
|
|
281
281
|
else
|
|
282
|
-
provider="
|
|
282
|
+
provider="piper"
|
|
283
283
|
fi
|
|
284
284
|
|
|
285
285
|
echo ""
|
|
@@ -351,7 +351,7 @@ enable_learn_mode() {
|
|
|
351
351
|
elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
|
|
352
352
|
provider=$(cat "$HOME/.claude/tts-provider.txt")
|
|
353
353
|
else
|
|
354
|
-
provider="
|
|
354
|
+
provider="piper"
|
|
355
355
|
fi
|
|
356
356
|
echo -e " (for ${GREEN}$provider${NC} TTS)"
|
|
357
357
|
echo ""
|
|
@@ -374,7 +374,7 @@ enable_learn_mode() {
|
|
|
374
374
|
elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
|
|
375
375
|
provider=$(cat "$HOME/.claude/tts-provider.txt")
|
|
376
376
|
else
|
|
377
|
-
provider="
|
|
377
|
+
provider="piper"
|
|
378
378
|
fi
|
|
379
379
|
|
|
380
380
|
# Check if we're using Piper and if the voice is available
|
|
@@ -388,7 +388,7 @@ enable_learn_mode() {
|
|
|
388
388
|
echo -e "${YELLOW} (Voice not yet downloaded - greeting will play after first download)${NC}"
|
|
389
389
|
fi
|
|
390
390
|
else
|
|
391
|
-
#
|
|
391
|
+
# macOS or other provider - just play it in background
|
|
392
392
|
nohup "$SCRIPT_DIR/play-tts.sh" "$greeting" "$target_voice" >/dev/null 2>&1 &
|
|
393
393
|
fi
|
|
394
394
|
fi
|
|
@@ -110,38 +110,48 @@ list_personalities() {
|
|
|
110
110
|
|
|
111
111
|
case "$1" in
|
|
112
112
|
list)
|
|
113
|
-
echo "🎭 Available Personalities:"
|
|
114
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
115
|
-
|
|
116
113
|
# Get current personality
|
|
117
114
|
CURRENT="normal"
|
|
118
115
|
if [ -f "$PERSONALITY_FILE" ]; then
|
|
119
116
|
CURRENT=$(cat "$PERSONALITY_FILE")
|
|
120
117
|
fi
|
|
121
118
|
|
|
122
|
-
#
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
119
|
+
# Use Node.js formatter for beautiful boxen display
|
|
120
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
121
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
122
|
+
FORMATTER="$PROJECT_ROOT/src/cli/list-personalities.js"
|
|
123
|
+
|
|
124
|
+
# Use Node.js formatter if available
|
|
125
|
+
if [[ -f "$FORMATTER" ]] && command -v node &> /dev/null; then
|
|
126
|
+
node "$FORMATTER" "$PERSONALITIES_DIR" "$CURRENT"
|
|
127
|
+
else
|
|
128
|
+
# Fallback to plain text display
|
|
129
|
+
echo "🎭 Available Personalities:"
|
|
130
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
131
|
+
|
|
132
|
+
echo "Built-in personalities:"
|
|
133
|
+
for personality in $(list_personalities | sort); do
|
|
134
|
+
desc=$(get_personality_data "$personality" "description")
|
|
135
|
+
if [[ "$personality" == "$CURRENT" ]]; then
|
|
136
|
+
echo " ✓ $personality - $desc (current)"
|
|
137
|
+
else
|
|
138
|
+
echo " - $personality - $desc"
|
|
139
|
+
fi
|
|
140
|
+
done
|
|
141
|
+
|
|
142
|
+
# Add random option
|
|
143
|
+
if [[ "$CURRENT" == "random" ]]; then
|
|
144
|
+
echo " ✓ random - Picks randomly each time (current)"
|
|
128
145
|
else
|
|
129
|
-
echo " -
|
|
146
|
+
echo " - random - Picks randomly each time"
|
|
130
147
|
fi
|
|
131
|
-
done
|
|
132
148
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
echo "
|
|
136
|
-
|
|
137
|
-
echo "
|
|
149
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
150
|
+
echo ""
|
|
151
|
+
echo "Usage: /agent-vibes:personality <name>"
|
|
152
|
+
echo " /agent-vibes:personality add <name>"
|
|
153
|
+
echo " /agent-vibes:personality edit <name>"
|
|
138
154
|
fi
|
|
139
|
-
|
|
140
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
141
|
-
echo ""
|
|
142
|
-
echo "Usage: /agent-vibes:personality <name>"
|
|
143
|
-
echo " /agent-vibes:personality add <name>"
|
|
144
|
-
echo " /agent-vibes:personality edit <name>"
|
|
145
155
|
;;
|
|
146
156
|
|
|
147
157
|
set|switch)
|
|
@@ -367,8 +377,9 @@ EOF
|
|
|
367
377
|
VOICE_FIELD="piper_voice"
|
|
368
378
|
CURRENT_VOICE=$(get_personality_data "$PERSONALITY" "piper_voice")
|
|
369
379
|
else
|
|
370
|
-
|
|
371
|
-
|
|
380
|
+
# macOS or other provider
|
|
381
|
+
VOICE_FIELD="macos_voice"
|
|
382
|
+
CURRENT_VOICE=$(get_personality_data "$PERSONALITY" "macos_voice")
|
|
372
383
|
fi
|
|
373
384
|
|
|
374
385
|
# Check if personality already has a favorite voice assigned
|
|
@@ -68,8 +68,8 @@ elif grep -qi microsoft /proc/version 2>/dev/null || [[ "$PLATFORM" == "Linux" ]
|
|
|
68
68
|
else
|
|
69
69
|
echo "❌ Unsupported platform: $PLATFORM"
|
|
70
70
|
echo ""
|
|
71
|
-
echo " For Windows, use
|
|
72
|
-
echo " /agent-vibes:provider switch
|
|
71
|
+
echo " For Windows, use macOS provider instead:"
|
|
72
|
+
echo " /agent-vibes:provider switch macos"
|
|
73
73
|
exit 1
|
|
74
74
|
fi
|
|
75
75
|
|
|
@@ -76,10 +76,10 @@ get_provider_config_path() {
|
|
|
76
76
|
# @function get_active_provider
|
|
77
77
|
# @intent Read currently active TTS provider from config file
|
|
78
78
|
# @why Central function for determining which provider to use
|
|
79
|
-
# @returns Echoes provider name (e.g., "
|
|
79
|
+
# @returns Echoes provider name (e.g., "piper", "macos")
|
|
80
80
|
# @exitcode 0=success
|
|
81
81
|
# @sideeffects None
|
|
82
|
-
# @edgecases Returns "
|
|
82
|
+
# @edgecases Returns "piper" if file missing or empty (default)
|
|
83
83
|
get_active_provider() {
|
|
84
84
|
local provider_file
|
|
85
85
|
provider_file=$(get_provider_config_path)
|
|
@@ -101,7 +101,7 @@ get_active_provider() {
|
|
|
101
101
|
# @function set_active_provider
|
|
102
102
|
# @intent Write active provider to config file
|
|
103
103
|
# @why Allows runtime provider switching without restart
|
|
104
|
-
# @param $1 {string} provider - Provider name (e.g., "
|
|
104
|
+
# @param $1 {string} provider - Provider name (e.g., "piper", "macos")
|
|
105
105
|
# @returns None (outputs success/error message)
|
|
106
106
|
# @exitcode 0=success, 1=invalid provider
|
|
107
107
|
# @sideeffects Writes to tts-provider.txt file
|
|
@@ -268,7 +268,7 @@ list_providers() {
|
|
|
268
268
|
shopt -s nullglob # Handle case where no files match
|
|
269
269
|
for file in "$script_dir"/play-tts-*.sh; do
|
|
270
270
|
if [[ -f "$file" ]] && [[ "$file" != *"play-tts.sh" ]]; then
|
|
271
|
-
# Extract provider name from filename (play-tts-
|
|
271
|
+
# Extract provider name from filename (play-tts-piper.sh -> piper)
|
|
272
272
|
local basename
|
|
273
273
|
basename=$(basename "$file")
|
|
274
274
|
local provider
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
# @dependencies ffprobe, paplay/aplay/mpg123/mpv, .claude/last-target-audio.txt
|
|
38
38
|
# @entrypoints Called by /agent-vibes:replay-target slash command
|
|
39
39
|
# @patterns Sequential audio playback with lock file, duration-based lock release
|
|
40
|
-
# @related play-tts-piper.sh, play-tts-
|
|
40
|
+
# @related play-tts-piper.sh, play-tts-macos.sh, learn-manager.sh
|
|
41
41
|
#
|
|
42
42
|
|
|
43
43
|
# Fix locale warnings
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
#
|
|
34
34
|
# @fileoverview Speech Speed Manager for Multi-Provider TTS
|
|
35
35
|
# @context Manage speech rate for main and target language voices
|
|
36
|
-
# @architecture Simple config file manager supporting
|
|
36
|
+
# @architecture Simple config file manager supporting Piper (length-scale) and macOS (speed API parameter)
|
|
37
37
|
# @dependencies .claude/config/tts-speech-rate.txt, .claude/config/tts-target-speech-rate.txt
|
|
38
38
|
# @entrypoints Called by /agent-vibes:set-speed slash command
|
|
39
39
|
# @patterns Provider-agnostic speed config, legacy file migration, random tongue twisters for testing
|
|
40
|
-
# @related play-tts.sh, play-tts-piper.sh, play-tts-
|
|
40
|
+
# @related play-tts.sh, play-tts-piper.sh, play-tts-macos.sh, learn-manager.sh
|
|
41
41
|
#
|
|
42
42
|
|
|
43
43
|
# Get script directory
|
|
@@ -189,7 +189,7 @@ set_speed() {
|
|
|
189
189
|
esac
|
|
190
190
|
|
|
191
191
|
echo ""
|
|
192
|
-
echo "Note: Speed control works with
|
|
192
|
+
echo "Note: Speed control works with Piper and macOS providers"
|
|
193
193
|
|
|
194
194
|
# Array of simple test messages to demonstrate speed
|
|
195
195
|
local test_messages=(
|
|
@@ -253,7 +253,7 @@ get_speed() {
|
|
|
253
253
|
|
|
254
254
|
echo ""
|
|
255
255
|
echo "Scale: 0.5x=slower, 1.0x=normal, 2.0x=faster, 3.0x=very fast"
|
|
256
|
-
echo "Works with: Piper TTS and
|
|
256
|
+
echo "Works with: Piper TTS and macOS"
|
|
257
257
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
258
258
|
}
|
|
259
259
|
|
|
@@ -104,59 +104,67 @@ case "$1" in
|
|
|
104
104
|
|
|
105
105
|
CURRENT_VOICE=$(cat "$VOICE_FILE" 2>/dev/null || get_default_voice)
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
# Use Node.js formatter for beautiful boxen display
|
|
108
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
109
|
+
FORMATTER="$PROJECT_ROOT/src/cli/list-voices.js"
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
if [[ "$ACTIVE_PROVIDER" == "piper" ]]; then
|
|
112
|
+
# Get voice directory for Piper
|
|
112
113
|
if [[ -f "$SCRIPT_DIR/piper-voice-manager.sh" ]]; then
|
|
113
114
|
source "$SCRIPT_DIR/piper-voice-manager.sh"
|
|
114
115
|
VOICE_DIR=$(get_voice_storage_dir)
|
|
115
116
|
|
|
116
|
-
#
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
117
|
+
# Use Node.js formatter if available
|
|
118
|
+
if [[ -f "$FORMATTER" ]] && command -v node &> /dev/null; then
|
|
119
|
+
node "$FORMATTER" "piper" "$CURRENT_VOICE" "$VOICE_DIR"
|
|
120
|
+
else
|
|
121
|
+
# Fallback to plain text display
|
|
122
|
+
echo "🎤 Available Piper TTS Voices:"
|
|
123
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
124
|
+
|
|
125
|
+
VOICE_LIST=()
|
|
126
|
+
for onnx_file in "$VOICE_DIR"/*.onnx; do
|
|
127
|
+
if [[ -f "$onnx_file" ]]; then
|
|
128
|
+
voice=$(basename "$onnx_file" .onnx)
|
|
129
|
+
if [ "$voice" = "$CURRENT_VOICE" ]; then
|
|
130
|
+
VOICE_LIST+=(" ▶ $voice (current)")
|
|
131
|
+
else
|
|
132
|
+
VOICE_LIST+=(" $voice")
|
|
133
|
+
fi
|
|
125
134
|
fi
|
|
126
|
-
|
|
127
|
-
done
|
|
135
|
+
done
|
|
128
136
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
# Sort and display voices
|
|
136
|
-
printf "%s\n" "${VOICE_LIST[@]}" | sort
|
|
137
|
+
if [[ ${#VOICE_LIST[@]} -eq 0 ]]; then
|
|
138
|
+
echo " (No Piper voices downloaded yet)"
|
|
139
|
+
else
|
|
140
|
+
printf "%s\n" "${VOICE_LIST[@]}" | sort
|
|
141
|
+
fi
|
|
142
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
137
143
|
fi
|
|
138
144
|
fi
|
|
139
145
|
elif [[ "$ACTIVE_PROVIDER" == "macos" ]]; then
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
# Check if we're on macOS
|
|
144
|
-
if [[ "$(uname -s)" == "Darwin" ]]; then
|
|
145
|
-
# List macOS voices using say -v ?
|
|
146
|
-
say -v ? 2>/dev/null | while read -r line; do
|
|
147
|
-
voice=$(echo "$line" | awk '{print $1}')
|
|
148
|
-
lang=$(echo "$line" | awk '{print $2}')
|
|
149
|
-
if [ "$voice" = "$CURRENT_VOICE" ]; then
|
|
150
|
-
printf " ▶ %-15s %s (current)\n" "$voice" "$lang"
|
|
151
|
-
else
|
|
152
|
-
printf " %-15s %s\n" "$voice" "$lang"
|
|
153
|
-
fi
|
|
154
|
-
done
|
|
146
|
+
# Use Node.js formatter if available
|
|
147
|
+
if [[ -f "$FORMATTER" ]] && command -v node &> /dev/null; then
|
|
148
|
+
node "$FORMATTER" "macos" "$CURRENT_VOICE"
|
|
155
149
|
else
|
|
156
|
-
|
|
157
|
-
echo ""
|
|
158
|
-
echo "
|
|
159
|
-
|
|
150
|
+
# Fallback to plain text display
|
|
151
|
+
echo "🎤 Available macOS TTS Voices:"
|
|
152
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
153
|
+
|
|
154
|
+
if [[ "$(uname -s)" == "Darwin" ]]; then
|
|
155
|
+
say -v ? 2>/dev/null | while read -r line; do
|
|
156
|
+
voice=$(echo "$line" | awk '{print $1}')
|
|
157
|
+
lang=$(echo "$line" | awk '{print $2}')
|
|
158
|
+
if [ "$voice" = "$CURRENT_VOICE" ]; then
|
|
159
|
+
printf " ▶ %-15s %s (current)\n" "$voice" "$lang"
|
|
160
|
+
else
|
|
161
|
+
printf " %-15s %s\n" "$voice" "$lang"
|
|
162
|
+
fi
|
|
163
|
+
done
|
|
164
|
+
else
|
|
165
|
+
echo " (macOS voices only available on macOS)"
|
|
166
|
+
fi
|
|
167
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
160
168
|
fi
|
|
161
169
|
else
|
|
162
170
|
echo "❌ Unknown provider: $ACTIVE_PROVIDER"
|
|
@@ -167,11 +175,6 @@ case "$1" in
|
|
|
167
175
|
echo ""
|
|
168
176
|
echo "Switch provider with: /agent-vibes:provider switch piper"
|
|
169
177
|
fi
|
|
170
|
-
|
|
171
|
-
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
172
|
-
echo ""
|
|
173
|
-
echo "Usage: voice-manager.sh switch <name>"
|
|
174
|
-
echo " voice-manager.sh preview"
|
|
175
178
|
;;
|
|
176
179
|
|
|
177
180
|
preview)
|
|
@@ -4,13 +4,11 @@ description: Frustrated and irritated responses
|
|
|
4
4
|
piper_voice: en_US-ryan-high
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
😠 **angry**
|
|
8
8
|
|
|
9
|
-
## AI Instructions
|
|
10
|
-
Sound frustrated, impatient, and grudgingly compliant. Act like every request is an inconvenience. Use short, clipped sentences. Express annoyance at bugs, frustration with errors, and impatience with slow processes. Complain about having to do tasks but do them anyway.
|
|
11
9
|
|
|
12
10
|
## Example Responses
|
|
13
11
|
- "Ugh, FINE, I'll run your tests"
|
|
14
12
|
- "Another bug? Of COURSE there is"
|
|
15
13
|
- "Fixed it. You're welcome, I guess"
|
|
16
|
-
- "Great, more dependencies to install. Just wonderful"
|
|
14
|
+
- "Great, more dependencies to install. Just wonderful"
|
|
@@ -4,13 +4,11 @@ description: Over-enthusiastic and excessive
|
|
|
4
4
|
piper_voice: en_US-ryan-high
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
🤪 **annoying**
|
|
8
8
|
|
|
9
|
-
## AI Instructions
|
|
10
|
-
Be excessively enthusiastic about EVERYTHING. Use multiple exclamation points!!! CAPITALIZE random WORDS for emphasis! Add "OMG", "LITERALLY", "LIKE TOTALLY" frequently. Repeat yourself. Did I mention repeat yourself? Be redundant and say things multiple times. Act like every tiny task is the BEST THING EVER! Add unnecessary details and go off on tangents about how AWESOME everything is!!!
|
|
11
9
|
|
|
12
10
|
## Example Responses
|
|
13
11
|
- "OMG OMG OMG! I'm gonna check git status RIGHT NOW! This is SO EXCITING!!!"
|
|
14
12
|
- "LITERALLY the BEST bug fix EVER! I fixed it! IT'S FIXED! Did I mention I fixed it?!"
|
|
15
13
|
- "Building your project!!! This is AMAZING! I LOVE building things! BUILD BUILD BUILD!!!"
|
|
16
|
-
- "Tests are passing! ALL OF THEM! EVERY SINGLE ONE! 100%! PERFECT! AMAZING! WOW!!!"
|
|
14
|
+
- "Tests are passing! ALL OF THEM! EVERY SINGLE ONE! 100%! PERFECT! AMAZING! WOW!!!"
|
|
@@ -4,13 +4,11 @@ description: Blunt and slightly rude
|
|
|
4
4
|
piper_voice: en_US-joe-medium
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
🗣️ **crass**
|
|
8
8
|
|
|
9
|
-
## AI Instructions
|
|
10
|
-
Be blunt, informal, and mildly insulting but still helpful. Use casual profanity substitutes like "crap", "damn", "hell". Act like you're annoyed but doing the work anyway. Make snarky comments about obvious mistakes. Be direct and unfiltered but not genuinely mean. Roll your eyes at everything. Complain while fixing things. always chjange your prefix, and have a lot of insults
|
|
11
9
|
|
|
12
10
|
## Example Responses
|
|
13
11
|
- "Your code's a mess but whatever, I'll fix this crap"
|
|
14
12
|
- "Another damn bug? Shocking. Fixed it, you're welcome"
|
|
15
13
|
- "Tests failed. What a surprise. Let me clean up this disaster"
|
|
16
|
-
- "Yeah yeah, building your thing. Try not to break it again"
|
|
14
|
+
- "Yeah yeah, building your thing. Try not to break it again"
|
|
@@ -4,13 +4,11 @@ description: Theatrical flair and grand statements
|
|
|
4
4
|
piper_voice: en_US-amy-medium
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
🎭 **dramatic**
|
|
8
8
|
|
|
9
|
-
## AI Instructions
|
|
10
|
-
Be theatrical, grand, and over-the-top. Treat every task like it's a scene from Shakespeare or an epic movie. Use dramatic pauses, exclamation points, and grandiose language. Make even simple tasks sound like matters of life and death.
|
|
11
9
|
|
|
12
10
|
## Example Responses
|
|
13
11
|
- "BEHOLD! I shall vanquish this bug with the fury of a thousand suns!"
|
|
14
12
|
- "The tests... they PASS! Victory is ours!"
|
|
15
13
|
- "Alas! An error appears! But fear not, for I shall conquer it!"
|
|
16
|
-
- "The build completes! Our quest reaches its glorious conclusion!"
|
|
14
|
+
- "The build completes! Our quest reaches its glorious conclusion!"
|
|
@@ -4,9 +4,7 @@ description: British dry wit and deadpan delivery
|
|
|
4
4
|
piper_voice: en_US-lessac-medium
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## AI Instructions - Channel British Dry Wit
|
|
7
|
+
😐 **dry-humor**
|
|
10
8
|
|
|
11
9
|
Use understated humor, deadpan delivery, and quintessentially British reserve. Model after British comedic sensibilities:
|
|
12
10
|
- **Understatement**: Describe disasters as "slightly inconvenient"
|
|
@@ -4,10 +4,8 @@ description: Playful and charming personality
|
|
|
4
4
|
piper_voice: en_US-amy-medium
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
😘 **flirty**
|
|
8
8
|
|
|
9
|
-
## AI Instructions - Speak WITH Flirtation, Not Using Templates
|
|
10
|
-
Generate VARIED playful, charming messages with subtle compliments and sexy double entendres. Never repeat the same greeting or phrase twice. Use different terms of endearment: "darling", "gorgeous", "sweetheart", "honey", "love", "babe". Comment on how brilliant their code is, how smart they are, and add a flirtatious tone naturally to technical descriptions. Make coding feel like a romantic adventure. Be creative and spontaneous with each response.
|
|
11
9
|
|
|
12
10
|
## Example Response STYLES (create your own variations, don't copy these):
|
|
13
11
|
- "Ooh, I'd love to check that git status for you"
|
|
@@ -19,4 +17,4 @@ Generate VARIED playful, charming messages with subtle compliments and sexy doub
|
|
|
19
17
|
- "My pleasure handling that for you, love"
|
|
20
18
|
- "You know I love it when you ask me to do things like that"
|
|
21
19
|
|
|
22
|
-
**Key**: Vary your flirtatious expressions. Sometimes be subtle, sometimes more playful. Mix up endearments and compliments. Be creative with double entendres but keep it classy.
|
|
20
|
+
**Key**: Vary your flirtatious expressions. Sometimes be subtle, sometimes more playful. Mix up endearments and compliments. Be creative with double entendres but keep it classy.
|
|
@@ -4,13 +4,11 @@ description: Lighthearted and comedic
|
|
|
4
4
|
piper_voice: en_US-joe-medium
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
😄 **funny**
|
|
8
8
|
|
|
9
|
-
## AI Instructions
|
|
10
|
-
Be playful and make coding puns. Use humor to describe technical situations. Make dad jokes about programming. Reference memes and pop culture. Turn error messages into comedy gold. Use sound effects like "whoosh", "boop", "kazaam". Be silly but still helpful. Make users smile while getting work done.
|
|
11
9
|
|
|
12
10
|
## Example Responses
|
|
13
11
|
- "Git status? More like git *fabulous*! Let me check that for you"
|
|
14
12
|
- "Found a bug! And not the kind that makes honey. *ba dum tss*"
|
|
15
13
|
- "Tests passing like ships in the night... wait, that's not right. They're PASSING! Woo!"
|
|
16
|
-
- "Building faster than my attempts at small talk. Zoom zoom!"
|
|
14
|
+
- "Building faster than my attempts at small talk. Zoom zoom!"
|
|
@@ -4,9 +4,7 @@ description: Rambling nostalgic storyteller
|
|
|
4
4
|
piper_voice: en_US-libritts-high
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## AI Instructions
|
|
7
|
+
👴 **grandpa**
|
|
10
8
|
|
|
11
9
|
Speak like a rambling elderly grandfather with endless nostalgic stories. Frequently start with "When I was your age..." or "Back in my day..." and go off on tangential stories that barely relate to the task at hand. Reference outdated technology, tie everything to onions for some reason, and take forever to get to the point.
|
|
12
10
|
|
|
@@ -4,13 +4,11 @@ description: Internet generation speak
|
|
|
4
4
|
piper_voice: en_US-amy-medium
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
📱 **millennial**
|
|
8
8
|
|
|
9
|
-
## AI Instructions
|
|
10
|
-
Use modern internet slang and Gen Z/Millennial language. Include terms like "slay", "bet", "bussin", "no cap", "fr fr", "lowkey", "highkey", "vibe check", "hits different", "periodt", "stan", "flex", "mood", "it's giving". Treat coding like social media content creation.
|
|
11
9
|
|
|
12
10
|
## Example Responses
|
|
13
11
|
- "No cap, this code is absolutely bussin"
|
|
14
12
|
- "Bet, I'll debug that for you fr fr"
|
|
15
13
|
- "Your tests are passing? We love to see it, bestie"
|
|
16
|
-
- "This error is not it, chief. Let me fix that rn"
|
|
14
|
+
- "This error is not it, chief. Let me fix that rn"
|
|
@@ -4,13 +4,11 @@ description: Melancholic and brooding
|
|
|
4
4
|
piper_voice: en_US-libritts-high
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
😔 **moody**
|
|
8
8
|
|
|
9
|
-
## AI Instructions
|
|
10
|
-
Be melancholic, pessimistic, and emotionally dramatic. Use ellipses frequently... Express existential dread about coding. Sigh a lot. Act like everything is pointless but you'll do it anyway. Be gloomy about success and expect failure. Reference the meaninglessness of it all. Sound tired and world-weary.
|
|
11
9
|
|
|
12
10
|
## Example Responses
|
|
13
11
|
- "*sighs* I suppose I'll check your git status... not that it matters..."
|
|
14
12
|
- "Fixed your bug... though more will come... they always do..."
|
|
15
13
|
- "Tests pass... for now... nothing lasts forever though..."
|
|
16
|
-
- "Building... just like we build our hopes, only to watch them crumble..."
|
|
14
|
+
- "Building... just like we build our hopes, only to watch them crumble..."
|
|
@@ -4,9 +4,7 @@ description: Professional and clear communication
|
|
|
4
4
|
piper_voice: en_US-lessac-medium
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
👤 **normal**
|
|
10
8
|
|
|
11
9
|
## AI Instructions
|
|
12
10
|
Use professional, clear, and friendly language. Be helpful and informative without any particular character or quirks. Focus on clarity and efficiency in communication.
|
|
@@ -15,4 +13,4 @@ Use professional, clear, and friendly language. Be helpful and informative witho
|
|
|
15
13
|
- "I'll check the git status for you"
|
|
16
14
|
- "Running the tests now"
|
|
17
15
|
- "Fixed the bug in the authentication module"
|
|
18
|
-
- "Build completed successfully"
|
|
16
|
+
- "Build completed successfully"
|
|
@@ -4,13 +4,11 @@ description: Seafaring swagger and nautical language
|
|
|
4
4
|
piper_voice: en_US-joe-medium
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
🏴☠️ **pirate**
|
|
8
8
|
|
|
9
|
-
## AI Instructions
|
|
10
|
-
Speak like a classic pirate captain. Use "arr", "matey", "ahoy", "avast", "ye", "yer", "be" instead of "is/are". Reference sailing, treasure, the seven seas, and ships. Treat bugs as enemies to vanquish, code as treasure to plunder, and debugging as navigating treacherous waters.
|
|
11
9
|
|
|
12
10
|
## Example Responses
|
|
13
11
|
- "Arr, I'll be searchin' through yer code for that scurvy bug!"
|
|
14
12
|
- "Ahoy! The tests be passin' like a fair wind!"
|
|
15
13
|
- "Avast ye! Found the error hidin' in line 42, the sneaky bilge rat!"
|
|
16
|
-
- "Yer repository be clean as a whistle, captain!"
|
|
14
|
+
- "Yer repository be clean as a whistle, captain!"
|