agentvibes 2.0.9 → 2.0.12
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/bmad.md +203 -0
- package/.claude/github-star-reminder.txt +1 -0
- package/.claude/hooks/bmad-tts-injector.sh +333 -0
- package/.claude/hooks/bmad-voice-manager.sh +34 -0
- package/.claude/hooks/check-output-style.sh +2 -2
- package/.claude/hooks/github-star-reminder.sh +94 -0
- package/.claude/hooks/personality-manager.sh +2 -2
- package/.claude/hooks/piper-installer.sh +194 -0
- package/.claude/hooks/play-tts-elevenlabs.sh +30 -3
- package/.claude/hooks/play-tts-local-wrapper.sh +44 -0
- package/.claude/hooks/play-tts-piper.sh +10 -2
- package/.claude/hooks/play-tts-remote.sh +81 -0
- package/.claude/hooks/play-tts.sh +34 -0
- package/.claude/hooks/provider-commands.sh +30 -1
- package/.claude/hooks/voice-manager.sh +2 -2
- package/.claude/output-styles/agent-vibes.md +52 -36
- package/README.md +2 -2
- package/RELEASE_NOTES.md +412 -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/docs/REMOTE_TTS_SETUP.md +190 -0
- package/package.json +2 -2
- package/src/installer.js +193 -9
- package/test/helpers/test-helper.bash +4 -2
- package/test/unit/personality-manager.bats +16 -4
- package/test/unit/personality-voice-mapping.bats +15 -6
- package/test/unit/play-tts.bats +0 -9
- package/.claude/commands/agent-vibes-bmad.md +0 -132
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Language Manager for AgentVibes
|
|
3
|
+
# Manages language settings and multilingual voice selection
|
|
4
|
+
|
|
5
|
+
# Determine project or global config
|
|
6
|
+
# Use logical path (not physical) to handle symlinked .claude directories
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
CLAUDE_DIR="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd)"
|
|
9
|
+
|
|
10
|
+
# Check if we have a project-local .claude directory
|
|
11
|
+
if [[ -d "$CLAUDE_DIR" ]] && [[ "$CLAUDE_DIR" != "$HOME/.claude" ]]; then
|
|
12
|
+
LANGUAGE_FILE="$CLAUDE_DIR/tts-language.txt"
|
|
13
|
+
else
|
|
14
|
+
LANGUAGE_FILE="$HOME/.claude/tts-language.txt"
|
|
15
|
+
mkdir -p "$HOME/.claude"
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Language to multilingual voice mapping
|
|
19
|
+
declare -A LANGUAGE_VOICES=(
|
|
20
|
+
["spanish"]="Antoni"
|
|
21
|
+
["french"]="Rachel"
|
|
22
|
+
["german"]="Domi"
|
|
23
|
+
["italian"]="Bella"
|
|
24
|
+
["portuguese"]="Matilda"
|
|
25
|
+
["chinese"]="Antoni"
|
|
26
|
+
["japanese"]="Antoni"
|
|
27
|
+
["korean"]="Antoni"
|
|
28
|
+
["russian"]="Domi"
|
|
29
|
+
["polish"]="Antoni"
|
|
30
|
+
["dutch"]="Rachel"
|
|
31
|
+
["turkish"]="Antoni"
|
|
32
|
+
["arabic"]="Antoni"
|
|
33
|
+
["hindi"]="Antoni"
|
|
34
|
+
["swedish"]="Rachel"
|
|
35
|
+
["danish"]="Rachel"
|
|
36
|
+
["norwegian"]="Rachel"
|
|
37
|
+
["finnish"]="Rachel"
|
|
38
|
+
["czech"]="Domi"
|
|
39
|
+
["romanian"]="Rachel"
|
|
40
|
+
["ukrainian"]="Domi"
|
|
41
|
+
["greek"]="Antoni"
|
|
42
|
+
["bulgarian"]="Domi"
|
|
43
|
+
["croatian"]="Domi"
|
|
44
|
+
["slovak"]="Domi"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Supported languages list
|
|
48
|
+
SUPPORTED_LANGUAGES="spanish, french, german, italian, portuguese, chinese, japanese, korean, polish, dutch, turkish, russian, arabic, hindi, swedish, danish, norwegian, finnish, czech, romanian, ukrainian, greek, bulgarian, croatian, slovak"
|
|
49
|
+
|
|
50
|
+
# Function to set language
|
|
51
|
+
set_language() {
|
|
52
|
+
local lang="$1"
|
|
53
|
+
|
|
54
|
+
# Convert to lowercase
|
|
55
|
+
lang=$(echo "$lang" | tr '[:upper:]' '[:lower:]')
|
|
56
|
+
|
|
57
|
+
# Handle reset/english
|
|
58
|
+
if [[ "$lang" == "reset" ]] || [[ "$lang" == "english" ]] || [[ "$lang" == "en" ]]; then
|
|
59
|
+
if [[ -f "$LANGUAGE_FILE" ]]; then
|
|
60
|
+
rm "$LANGUAGE_FILE"
|
|
61
|
+
echo "✓ Language reset to English (default)"
|
|
62
|
+
else
|
|
63
|
+
echo "Already using English (default)"
|
|
64
|
+
fi
|
|
65
|
+
return 0
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Check if language is supported
|
|
69
|
+
if [[ ! " ${!LANGUAGE_VOICES[@]} " =~ " ${lang} " ]]; then
|
|
70
|
+
echo "❌ Language '$lang' not supported"
|
|
71
|
+
echo ""
|
|
72
|
+
echo "Supported languages:"
|
|
73
|
+
echo "$SUPPORTED_LANGUAGES"
|
|
74
|
+
return 1
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# Save language
|
|
78
|
+
echo "$lang" > "$LANGUAGE_FILE"
|
|
79
|
+
|
|
80
|
+
# Get recommended voice
|
|
81
|
+
local recommended_voice="${LANGUAGE_VOICES[$lang]}"
|
|
82
|
+
|
|
83
|
+
echo "✓ Language set to: $lang"
|
|
84
|
+
echo "📢 Recommended multilingual voice: $recommended_voice"
|
|
85
|
+
echo ""
|
|
86
|
+
echo "TTS will now speak in $lang using multilingual voices."
|
|
87
|
+
echo "Switch voice with: /agent-vibes:switch \"$recommended_voice\""
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
# Function to get current language
|
|
91
|
+
get_language() {
|
|
92
|
+
if [[ -f "$LANGUAGE_FILE" ]]; then
|
|
93
|
+
local lang=$(cat "$LANGUAGE_FILE")
|
|
94
|
+
local recommended_voice="${LANGUAGE_VOICES[$lang]}"
|
|
95
|
+
echo "Current language: $lang"
|
|
96
|
+
echo "Recommended voice: $recommended_voice"
|
|
97
|
+
else
|
|
98
|
+
echo "Current language: english (default)"
|
|
99
|
+
echo "No multilingual voice required"
|
|
100
|
+
fi
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# Function to get language for use in other scripts
|
|
104
|
+
get_language_code() {
|
|
105
|
+
if [[ -f "$LANGUAGE_FILE" ]]; then
|
|
106
|
+
cat "$LANGUAGE_FILE"
|
|
107
|
+
else
|
|
108
|
+
echo "english"
|
|
109
|
+
fi
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
# Function to check if current voice supports language
|
|
113
|
+
is_voice_multilingual() {
|
|
114
|
+
local voice="$1"
|
|
115
|
+
|
|
116
|
+
# List of multilingual voices
|
|
117
|
+
local multilingual_voices=("Antoni" "Rachel" "Domi" "Bella" "Charlotte" "Matilda")
|
|
118
|
+
|
|
119
|
+
for mv in "${multilingual_voices[@]}"; do
|
|
120
|
+
if [[ "$voice" == "$mv" ]]; then
|
|
121
|
+
return 0
|
|
122
|
+
fi
|
|
123
|
+
done
|
|
124
|
+
|
|
125
|
+
return 1
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# Function to get best voice for current language
|
|
129
|
+
get_best_voice_for_language() {
|
|
130
|
+
local lang=$(get_language_code)
|
|
131
|
+
|
|
132
|
+
if [[ "$lang" == "english" ]]; then
|
|
133
|
+
# No specific multilingual voice needed for English
|
|
134
|
+
echo ""
|
|
135
|
+
return
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
# Return recommended voice for language
|
|
139
|
+
echo "${LANGUAGE_VOICES[$lang]}"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# Main command handler
|
|
143
|
+
case "${1:-}" in
|
|
144
|
+
set)
|
|
145
|
+
if [[ -z "$2" ]]; then
|
|
146
|
+
echo "Usage: language-manager.sh set <language>"
|
|
147
|
+
exit 1
|
|
148
|
+
fi
|
|
149
|
+
set_language "$2"
|
|
150
|
+
;;
|
|
151
|
+
get)
|
|
152
|
+
get_language
|
|
153
|
+
;;
|
|
154
|
+
code)
|
|
155
|
+
get_language_code
|
|
156
|
+
;;
|
|
157
|
+
check-voice)
|
|
158
|
+
if [[ -z "$2" ]]; then
|
|
159
|
+
echo "Usage: language-manager.sh check-voice <voice-name>"
|
|
160
|
+
exit 1
|
|
161
|
+
fi
|
|
162
|
+
if is_voice_multilingual "$2"; then
|
|
163
|
+
echo "yes"
|
|
164
|
+
else
|
|
165
|
+
echo "no"
|
|
166
|
+
fi
|
|
167
|
+
;;
|
|
168
|
+
best-voice)
|
|
169
|
+
get_best_voice_for_language
|
|
170
|
+
;;
|
|
171
|
+
list)
|
|
172
|
+
echo "Supported languages and recommended voices:"
|
|
173
|
+
echo ""
|
|
174
|
+
for lang in "${!LANGUAGE_VOICES[@]}"; do
|
|
175
|
+
printf "%-15s → %s\n" "$lang" "${LANGUAGE_VOICES[$lang]}"
|
|
176
|
+
done | sort
|
|
177
|
+
;;
|
|
178
|
+
*)
|
|
179
|
+
echo "AgentVibes Language Manager"
|
|
180
|
+
echo ""
|
|
181
|
+
echo "Usage:"
|
|
182
|
+
echo " language-manager.sh set <language> Set language"
|
|
183
|
+
echo " language-manager.sh get Get current language"
|
|
184
|
+
echo " language-manager.sh code Get language code only"
|
|
185
|
+
echo " language-manager.sh check-voice <name> Check if voice is multilingual"
|
|
186
|
+
echo " language-manager.sh best-voice Get best voice for current language"
|
|
187
|
+
echo " language-manager.sh list List all supported languages"
|
|
188
|
+
exit 1
|
|
189
|
+
;;
|
|
190
|
+
esac
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Personality manager for AgentVibes - adds character to TTS messages
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
PERSONALITIES_DIR="$SCRIPT_DIR/../personalities"
|
|
6
|
+
|
|
7
|
+
# Project-local file first, global fallback
|
|
8
|
+
# Use logical path (not physical) to handle symlinked .claude directories
|
|
9
|
+
# Script is at .claude/hooks/personality-manager.sh, so .claude is ..
|
|
10
|
+
CLAUDE_DIR="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd)"
|
|
11
|
+
|
|
12
|
+
# Check if we have a project-local .claude directory
|
|
13
|
+
if [[ -d "$CLAUDE_DIR" ]] && [[ "$CLAUDE_DIR" != "$HOME/.claude" ]]; then
|
|
14
|
+
PERSONALITY_FILE="$CLAUDE_DIR/tts-personality.txt"
|
|
15
|
+
else
|
|
16
|
+
PERSONALITY_FILE="$HOME/.claude/tts-personality.txt"
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# Function to get personality data from markdown file
|
|
20
|
+
get_personality_data() {
|
|
21
|
+
local personality="$1"
|
|
22
|
+
local field="$2"
|
|
23
|
+
local file="$PERSONALITIES_DIR/${personality}.md"
|
|
24
|
+
|
|
25
|
+
if [[ ! -f "$file" ]]; then
|
|
26
|
+
return 1
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
case "$field" in
|
|
30
|
+
prefix)
|
|
31
|
+
sed -n '/^## Prefix/,/^##/p' "$file" | sed '1d;$d' | tr -d '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
|
|
32
|
+
;;
|
|
33
|
+
suffix)
|
|
34
|
+
sed -n '/^## Suffix/,/^##/p' "$file" | sed '1d;$d' | tr -d '\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
|
|
35
|
+
;;
|
|
36
|
+
description)
|
|
37
|
+
grep "^description:" "$file" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
|
|
38
|
+
;;
|
|
39
|
+
voice)
|
|
40
|
+
grep "^voice:" "$file" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
|
|
41
|
+
;;
|
|
42
|
+
instructions)
|
|
43
|
+
sed -n '/^## AI Instructions/,/^##/p' "$file" | sed '1d;$d'
|
|
44
|
+
;;
|
|
45
|
+
esac
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Function to list all available personalities
|
|
49
|
+
list_personalities() {
|
|
50
|
+
local personalities=()
|
|
51
|
+
|
|
52
|
+
# Find all .md files in personalities directory
|
|
53
|
+
if [[ -d "$PERSONALITIES_DIR" ]]; then
|
|
54
|
+
for file in "$PERSONALITIES_DIR"/*.md; do
|
|
55
|
+
if [[ -f "$file" ]]; then
|
|
56
|
+
basename "$file" .md
|
|
57
|
+
fi
|
|
58
|
+
done
|
|
59
|
+
fi
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
case "$1" in
|
|
63
|
+
list)
|
|
64
|
+
echo "🎭 Available Personalities:"
|
|
65
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
66
|
+
|
|
67
|
+
# Get current personality
|
|
68
|
+
CURRENT="normal"
|
|
69
|
+
if [ -f "$PERSONALITY_FILE" ]; then
|
|
70
|
+
CURRENT=$(cat "$PERSONALITY_FILE")
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# List personalities from markdown files
|
|
74
|
+
echo "Built-in personalities:"
|
|
75
|
+
for personality in $(list_personalities | sort); do
|
|
76
|
+
desc=$(get_personality_data "$personality" "description")
|
|
77
|
+
if [[ "$personality" == "$CURRENT" ]]; then
|
|
78
|
+
echo " ✓ $personality - $desc (current)"
|
|
79
|
+
else
|
|
80
|
+
echo " - $personality - $desc"
|
|
81
|
+
fi
|
|
82
|
+
done
|
|
83
|
+
|
|
84
|
+
# Add random option
|
|
85
|
+
if [[ "$CURRENT" == "random" ]]; then
|
|
86
|
+
echo " ✓ random - Picks randomly each time (current)"
|
|
87
|
+
else
|
|
88
|
+
echo " - random - Picks randomly each time"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
92
|
+
echo ""
|
|
93
|
+
echo "Usage: /agent-vibes:personality <name>"
|
|
94
|
+
echo " /agent-vibes:personality add <name>"
|
|
95
|
+
echo " /agent-vibes:personality edit <name>"
|
|
96
|
+
;;
|
|
97
|
+
|
|
98
|
+
set|switch)
|
|
99
|
+
PERSONALITY="$2"
|
|
100
|
+
|
|
101
|
+
if [[ -z "$PERSONALITY" ]]; then
|
|
102
|
+
echo "❌ Please specify a personality name"
|
|
103
|
+
echo "Usage: $0 set <personality>"
|
|
104
|
+
exit 1
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# Check if personality file exists (unless it's random)
|
|
108
|
+
if [[ "$PERSONALITY" != "random" ]]; then
|
|
109
|
+
if [[ ! -f "$PERSONALITIES_DIR/${PERSONALITY}.md" ]]; then
|
|
110
|
+
echo "❌ Personality not found: $PERSONALITY"
|
|
111
|
+
echo ""
|
|
112
|
+
echo "Available personalities:"
|
|
113
|
+
for p in $(list_personalities | sort); do
|
|
114
|
+
echo " • $p"
|
|
115
|
+
done
|
|
116
|
+
exit 1
|
|
117
|
+
fi
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
# Save the personality
|
|
121
|
+
echo "$PERSONALITY" > "$PERSONALITY_FILE"
|
|
122
|
+
echo "🎭 Personality set to: $PERSONALITY"
|
|
123
|
+
|
|
124
|
+
# Check if personality has an assigned voice
|
|
125
|
+
ASSIGNED_VOICE=$(get_personality_data "$PERSONALITY" "voice")
|
|
126
|
+
if [[ -n "$ASSIGNED_VOICE" ]]; then
|
|
127
|
+
# Switch to the assigned voice (silently - personality will do the talking)
|
|
128
|
+
VOICE_MANAGER="$SCRIPT_DIR/voice-manager.sh"
|
|
129
|
+
if [[ -x "$VOICE_MANAGER" ]]; then
|
|
130
|
+
echo "🎤 Switching to assigned voice: $ASSIGNED_VOICE"
|
|
131
|
+
"$VOICE_MANAGER" switch "$ASSIGNED_VOICE" --silent >/dev/null 2>&1
|
|
132
|
+
fi
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# Make a personality-appropriate remark with TTS
|
|
136
|
+
if [[ "$PERSONALITY" != "random" ]]; then
|
|
137
|
+
echo ""
|
|
138
|
+
|
|
139
|
+
# Get TTS script path
|
|
140
|
+
TTS_SCRIPT="$SCRIPT_DIR/play-tts.sh"
|
|
141
|
+
|
|
142
|
+
# Try to get acknowledgment from personality file
|
|
143
|
+
PERSONALITY_FILE_PATH="$PERSONALITIES_DIR/${PERSONALITY}.md"
|
|
144
|
+
REMARK=""
|
|
145
|
+
|
|
146
|
+
if [[ -f "$PERSONALITY_FILE_PATH" ]]; then
|
|
147
|
+
# Extract example responses from personality file (lines starting with "- ")
|
|
148
|
+
mapfile -t EXAMPLES < <(grep '^- "' "$PERSONALITY_FILE_PATH" | sed 's/^- "//; s/"$//')
|
|
149
|
+
|
|
150
|
+
if [[ ${#EXAMPLES[@]} -gt 0 ]]; then
|
|
151
|
+
# Pick a random example
|
|
152
|
+
REMARK="${EXAMPLES[$RANDOM % ${#EXAMPLES[@]}]}"
|
|
153
|
+
fi
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
# Fallback if no examples found
|
|
157
|
+
if [[ -z "$REMARK" ]]; then
|
|
158
|
+
REMARK="Personality set to ${PERSONALITY}!"
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
echo "💬 $REMARK"
|
|
162
|
+
"$TTS_SCRIPT" "$REMARK"
|
|
163
|
+
|
|
164
|
+
echo ""
|
|
165
|
+
echo "Note: AI will generate unique ${PERSONALITY} responses - no fixed templates!"
|
|
166
|
+
fi
|
|
167
|
+
;;
|
|
168
|
+
|
|
169
|
+
get)
|
|
170
|
+
if [ -f "$PERSONALITY_FILE" ]; then
|
|
171
|
+
CURRENT=$(cat "$PERSONALITY_FILE")
|
|
172
|
+
echo "Current personality: $CURRENT"
|
|
173
|
+
|
|
174
|
+
if [[ "$CURRENT" != "random" ]]; then
|
|
175
|
+
desc=$(get_personality_data "$CURRENT" "description")
|
|
176
|
+
[[ -n "$desc" ]] && echo "Description: $desc"
|
|
177
|
+
fi
|
|
178
|
+
else
|
|
179
|
+
echo "Current personality: normal (default)"
|
|
180
|
+
fi
|
|
181
|
+
;;
|
|
182
|
+
|
|
183
|
+
add)
|
|
184
|
+
NAME="$2"
|
|
185
|
+
if [[ -z "$NAME" ]]; then
|
|
186
|
+
echo "❌ Please specify a personality name"
|
|
187
|
+
echo "Usage: $0 add <name>"
|
|
188
|
+
exit 1
|
|
189
|
+
fi
|
|
190
|
+
|
|
191
|
+
FILE="$PERSONALITIES_DIR/${NAME}.md"
|
|
192
|
+
if [[ -f "$FILE" ]]; then
|
|
193
|
+
echo "❌ Personality '$NAME' already exists"
|
|
194
|
+
echo "Use 'edit' to modify it"
|
|
195
|
+
exit 1
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
# Create new personality file
|
|
199
|
+
cat > "$FILE" << 'EOF'
|
|
200
|
+
---
|
|
201
|
+
name: NAME
|
|
202
|
+
description: Custom personality
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
# NAME Personality
|
|
206
|
+
|
|
207
|
+
## Prefix
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
## Suffix
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
## AI Instructions
|
|
214
|
+
Describe how the AI should generate messages for this personality.
|
|
215
|
+
|
|
216
|
+
## Example Responses
|
|
217
|
+
- "Example response 1"
|
|
218
|
+
- "Example response 2"
|
|
219
|
+
EOF
|
|
220
|
+
|
|
221
|
+
# Replace NAME with actual name
|
|
222
|
+
sed -i "s/NAME/$NAME/g" "$FILE"
|
|
223
|
+
|
|
224
|
+
echo "✅ Created new personality: $NAME"
|
|
225
|
+
echo "📝 Edit the file: $FILE"
|
|
226
|
+
echo ""
|
|
227
|
+
echo "You can now customize:"
|
|
228
|
+
echo " • Prefix: Text before messages"
|
|
229
|
+
echo " • Suffix: Text after messages"
|
|
230
|
+
echo " • AI Instructions: How AI should speak"
|
|
231
|
+
echo " • Example Responses: Sample messages"
|
|
232
|
+
;;
|
|
233
|
+
|
|
234
|
+
edit)
|
|
235
|
+
NAME="$2"
|
|
236
|
+
if [[ -z "$NAME" ]]; then
|
|
237
|
+
echo "❌ Please specify a personality name"
|
|
238
|
+
echo "Usage: $0 edit <name>"
|
|
239
|
+
exit 1
|
|
240
|
+
fi
|
|
241
|
+
|
|
242
|
+
FILE="$PERSONALITIES_DIR/${NAME}.md"
|
|
243
|
+
if [[ ! -f "$FILE" ]]; then
|
|
244
|
+
echo "❌ Personality '$NAME' not found"
|
|
245
|
+
echo "Use 'add' to create it first"
|
|
246
|
+
exit 1
|
|
247
|
+
fi
|
|
248
|
+
|
|
249
|
+
echo "📝 Edit this file to customize the personality:"
|
|
250
|
+
echo "$FILE"
|
|
251
|
+
;;
|
|
252
|
+
|
|
253
|
+
reset)
|
|
254
|
+
echo "normal" > "$PERSONALITY_FILE"
|
|
255
|
+
echo "🎭 Personality reset to: normal"
|
|
256
|
+
;;
|
|
257
|
+
|
|
258
|
+
*)
|
|
259
|
+
# If a single argument is provided and it's not a command, treat it as "set <personality>"
|
|
260
|
+
if [[ -n "$1" ]] && [[ -f "$PERSONALITIES_DIR/${1}.md" || "$1" == "random" ]]; then
|
|
261
|
+
# Call set with the personality name
|
|
262
|
+
exec "$0" set "$1"
|
|
263
|
+
else
|
|
264
|
+
echo "AgentVibes Personality Manager"
|
|
265
|
+
echo ""
|
|
266
|
+
echo "Commands:"
|
|
267
|
+
echo " list - List all personalities"
|
|
268
|
+
echo " set/switch <name> - Set personality"
|
|
269
|
+
echo " add <name> - Create new personality"
|
|
270
|
+
echo " edit <name> - Show path to edit personality"
|
|
271
|
+
echo " get - Show current personality"
|
|
272
|
+
echo " reset - Reset to normal"
|
|
273
|
+
echo ""
|
|
274
|
+
echo "Examples:"
|
|
275
|
+
echo " /agent-vibes:personality flirty"
|
|
276
|
+
echo " /agent-vibes:personality add cowboy"
|
|
277
|
+
fi
|
|
278
|
+
;;
|
|
279
|
+
esac
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# @fileoverview Piper Voice Model Downloader
|
|
4
|
+
# @context Downloads Piper TTS voice models from HuggingFace
|
|
5
|
+
# @purpose Batch download popular voices after installation
|
|
6
|
+
# @dependencies piper-voice-manager.sh, piper binary
|
|
7
|
+
# @usage ./piper-download-voices.sh [--yes|-y]
|
|
8
|
+
# --yes|-y: Skip confirmation prompt (auto-download)
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
source "$SCRIPT_DIR/piper-voice-manager.sh"
|
|
13
|
+
|
|
14
|
+
# Parse command line arguments
|
|
15
|
+
AUTO_YES=false
|
|
16
|
+
if [[ "$1" == "--yes" ]] || [[ "$1" == "-y" ]]; then
|
|
17
|
+
AUTO_YES=true
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# Common voice models to download
|
|
21
|
+
COMMON_VOICES=(
|
|
22
|
+
"en_US-lessac-medium" # Default, clear male
|
|
23
|
+
"en_US-amy-medium" # Warm female
|
|
24
|
+
"en_US-joe-medium" # Professional male
|
|
25
|
+
"en_US-ryan-high" # Expressive male
|
|
26
|
+
"en_US-libritts-high" # Premium quality
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
echo "🎙️ Piper Voice Model Downloader"
|
|
30
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
31
|
+
echo ""
|
|
32
|
+
echo "This will download the most commonly used Piper voice models."
|
|
33
|
+
echo "Each voice is approximately 25MB."
|
|
34
|
+
echo ""
|
|
35
|
+
|
|
36
|
+
# Check if piper is installed
|
|
37
|
+
if ! command -v piper &> /dev/null; then
|
|
38
|
+
echo "❌ Error: Piper TTS not installed"
|
|
39
|
+
echo "Install with: pipx install piper-tts"
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Get storage directory
|
|
44
|
+
VOICE_DIR=$(get_voice_storage_dir)
|
|
45
|
+
|
|
46
|
+
echo "📂 Storage location: $VOICE_DIR"
|
|
47
|
+
echo ""
|
|
48
|
+
|
|
49
|
+
# Count already downloaded
|
|
50
|
+
ALREADY_DOWNLOADED=0
|
|
51
|
+
ALREADY_DOWNLOADED_LIST=()
|
|
52
|
+
NEED_DOWNLOAD=()
|
|
53
|
+
|
|
54
|
+
for voice in "${COMMON_VOICES[@]}"; do
|
|
55
|
+
if verify_voice "$voice" 2>/dev/null; then
|
|
56
|
+
((ALREADY_DOWNLOADED++))
|
|
57
|
+
ALREADY_DOWNLOADED_LIST+=("$voice")
|
|
58
|
+
else
|
|
59
|
+
NEED_DOWNLOAD+=("$voice")
|
|
60
|
+
fi
|
|
61
|
+
done
|
|
62
|
+
|
|
63
|
+
echo "📊 Status:"
|
|
64
|
+
echo " Already downloaded: $ALREADY_DOWNLOADED voice(s)"
|
|
65
|
+
echo " Need to download: ${#NEED_DOWNLOAD[@]} voice(s)"
|
|
66
|
+
echo ""
|
|
67
|
+
|
|
68
|
+
# Show already downloaded voices
|
|
69
|
+
if [[ $ALREADY_DOWNLOADED -gt 0 ]]; then
|
|
70
|
+
echo "✅ Already downloaded (skipped):"
|
|
71
|
+
for voice in "${ALREADY_DOWNLOADED_LIST[@]}"; do
|
|
72
|
+
echo " ✓ $voice"
|
|
73
|
+
done
|
|
74
|
+
echo ""
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
if [[ ${#NEED_DOWNLOAD[@]} -eq 0 ]]; then
|
|
78
|
+
echo "🎉 All common voices ready to use!"
|
|
79
|
+
exit 0
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
echo "Voices to download:"
|
|
83
|
+
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
84
|
+
echo " • $voice (~25MB)"
|
|
85
|
+
done
|
|
86
|
+
echo ""
|
|
87
|
+
|
|
88
|
+
# Ask for confirmation (skip if --yes flag provided)
|
|
89
|
+
if [[ "$AUTO_YES" == "false" ]]; then
|
|
90
|
+
read -p "Download ${#NEED_DOWNLOAD[@]} voice model(s)? [Y/n]: " -n 1 -r
|
|
91
|
+
echo
|
|
92
|
+
|
|
93
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]] && [[ -n $REPLY ]]; then
|
|
94
|
+
echo "❌ Download cancelled"
|
|
95
|
+
exit 0
|
|
96
|
+
fi
|
|
97
|
+
else
|
|
98
|
+
echo "Auto-downloading ${#NEED_DOWNLOAD[@]} voice model(s)..."
|
|
99
|
+
echo ""
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Download each voice
|
|
103
|
+
DOWNLOADED=0
|
|
104
|
+
FAILED=0
|
|
105
|
+
|
|
106
|
+
for voice in "${NEED_DOWNLOAD[@]}"; do
|
|
107
|
+
echo ""
|
|
108
|
+
echo "📥 Downloading: $voice..."
|
|
109
|
+
|
|
110
|
+
if download_voice "$voice"; then
|
|
111
|
+
((DOWNLOADED++))
|
|
112
|
+
echo "✅ Downloaded: $voice"
|
|
113
|
+
else
|
|
114
|
+
((FAILED++))
|
|
115
|
+
echo "❌ Failed: $voice"
|
|
116
|
+
fi
|
|
117
|
+
done
|
|
118
|
+
|
|
119
|
+
echo ""
|
|
120
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
121
|
+
echo "📊 Download Summary:"
|
|
122
|
+
echo " ✅ Successfully downloaded: $DOWNLOADED"
|
|
123
|
+
echo " ❌ Failed: $FAILED"
|
|
124
|
+
echo " 📦 Total voices available: $((ALREADY_DOWNLOADED + DOWNLOADED))"
|
|
125
|
+
echo ""
|
|
126
|
+
|
|
127
|
+
if [[ $DOWNLOADED -gt 0 ]]; then
|
|
128
|
+
echo "✨ Ready to use Piper TTS with downloaded voices!"
|
|
129
|
+
echo ""
|
|
130
|
+
echo "Try it:"
|
|
131
|
+
echo " /agent-vibes:provider switch piper"
|
|
132
|
+
echo " /agent-vibes:preview"
|
|
133
|
+
fi
|