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.
Files changed (152) hide show
  1. package/.claude/commands/agent-vibes/bmad.md +203 -0
  2. package/.claude/github-star-reminder.txt +1 -0
  3. package/.claude/hooks/bmad-tts-injector.sh +333 -0
  4. package/.claude/hooks/bmad-voice-manager.sh +34 -0
  5. package/.claude/hooks/check-output-style.sh +2 -2
  6. package/.claude/hooks/github-star-reminder.sh +94 -0
  7. package/.claude/hooks/personality-manager.sh +2 -2
  8. package/.claude/hooks/piper-installer.sh +194 -0
  9. package/.claude/hooks/play-tts-elevenlabs.sh +30 -3
  10. package/.claude/hooks/play-tts-local-wrapper.sh +44 -0
  11. package/.claude/hooks/play-tts-piper.sh +10 -2
  12. package/.claude/hooks/play-tts-remote.sh +81 -0
  13. package/.claude/hooks/play-tts.sh +34 -0
  14. package/.claude/hooks/provider-commands.sh +30 -1
  15. package/.claude/hooks/voice-manager.sh +2 -2
  16. package/.claude/output-styles/agent-vibes.md +52 -36
  17. package/README.md +2 -2
  18. package/RELEASE_NOTES.md +412 -0
  19. package/agentvibes.org/.claude/commands/agent-vibes/add.md +21 -0
  20. package/agentvibes.org/.claude/commands/agent-vibes/agent-vibes.md +68 -0
  21. package/agentvibes.org/.claude/commands/agent-vibes/commands.json +53 -0
  22. package/agentvibes.org/.claude/commands/agent-vibes/get.md +9 -0
  23. package/agentvibes.org/.claude/commands/agent-vibes/list.md +13 -0
  24. package/agentvibes.org/.claude/commands/agent-vibes/personality.md +79 -0
  25. package/agentvibes.org/.claude/commands/agent-vibes/preview.md +16 -0
  26. package/agentvibes.org/.claude/commands/agent-vibes/provider.md +54 -0
  27. package/agentvibes.org/.claude/commands/agent-vibes/replay.md +19 -0
  28. package/agentvibes.org/.claude/commands/agent-vibes/sample.md +12 -0
  29. package/agentvibes.org/.claude/commands/agent-vibes/sentiment.md +52 -0
  30. package/agentvibes.org/.claude/commands/agent-vibes/set-language.md +47 -0
  31. package/agentvibes.org/.claude/commands/agent-vibes/set-pretext.md +65 -0
  32. package/agentvibes.org/.claude/commands/agent-vibes/switch.md +53 -0
  33. package/agentvibes.org/.claude/commands/agent-vibes/update.md +20 -0
  34. package/agentvibes.org/.claude/commands/agent-vibes/version.md +10 -0
  35. package/agentvibes.org/.claude/commands/agent-vibes/whoami.md +7 -0
  36. package/agentvibes.org/.claude/hooks/bmad-voice-manager.sh +278 -0
  37. package/agentvibes.org/.claude/hooks/language-manager.sh +190 -0
  38. package/agentvibes.org/.claude/hooks/personality-manager.sh +279 -0
  39. package/agentvibes.org/.claude/hooks/piper-download-voices.sh +133 -0
  40. package/agentvibes.org/.claude/hooks/piper-voice-manager.sh +227 -0
  41. package/agentvibes.org/.claude/hooks/play-tts-elevenlabs.sh +201 -0
  42. package/agentvibes.org/.claude/hooks/play-tts-piper.sh +175 -0
  43. package/agentvibes.org/.claude/hooks/play-tts.sh +138 -0
  44. package/agentvibes.org/.claude/hooks/provider-commands.sh +374 -0
  45. package/agentvibes.org/.claude/hooks/provider-manager.sh +196 -0
  46. package/agentvibes.org/.claude/hooks/sentiment-manager.sh +163 -0
  47. package/agentvibes.org/.claude/hooks/voice-manager.sh +349 -0
  48. package/agentvibes.org/.claude/hooks/voices-config.sh +33 -0
  49. package/agentvibes.org/.claude/journal/2025-10-07.html +373 -0
  50. package/agentvibes.org/.claude/journal/index.html +91 -0
  51. package/agentvibes.org/.claude/output-styles/agent-vibes.md +203 -0
  52. package/agentvibes.org/.claude/personalities/angry.md +16 -0
  53. package/agentvibes.org/.claude/personalities/annoying.md +16 -0
  54. package/agentvibes.org/.claude/personalities/crass.md +16 -0
  55. package/agentvibes.org/.claude/personalities/dramatic.md +16 -0
  56. package/agentvibes.org/.claude/personalities/dry-humor.md +52 -0
  57. package/agentvibes.org/.claude/personalities/flirty.md +22 -0
  58. package/agentvibes.org/.claude/personalities/funny.md +16 -0
  59. package/agentvibes.org/.claude/personalities/grandpa.md +34 -0
  60. package/agentvibes.org/.claude/personalities/millennial.md +16 -0
  61. package/agentvibes.org/.claude/personalities/moody.md +16 -0
  62. package/agentvibes.org/.claude/personalities/normal.md +18 -0
  63. package/agentvibes.org/.claude/personalities/pirate.md +16 -0
  64. package/agentvibes.org/.claude/personalities/poetic.md +16 -0
  65. package/agentvibes.org/.claude/personalities/professional.md +16 -0
  66. package/agentvibes.org/.claude/personalities/robot.md +16 -0
  67. package/agentvibes.org/.claude/personalities/sarcastic.md +40 -0
  68. package/agentvibes.org/.claude/personalities/sassy.md +16 -0
  69. package/agentvibes.org/.claude/personalities/surfer-dude.md +16 -0
  70. package/agentvibes.org/.claude/personalities/zen.md +16 -0
  71. package/agentvibes.org/.mcp-minimal.json +60 -0
  72. package/agentvibes.org/CHANGELOG.md +56 -0
  73. package/agentvibes.org/README.md +93 -0
  74. package/agentvibes.org/app/(auth)/layout.tsx +15 -0
  75. package/agentvibes.org/app/(auth)/reset-password/page.tsx +45 -0
  76. package/agentvibes.org/app/(auth)/signin/page.tsx +82 -0
  77. package/agentvibes.org/app/(auth)/signup/page.tsx +104 -0
  78. package/agentvibes.org/app/(default)/layout.tsx +31 -0
  79. package/agentvibes.org/app/(default)/page.tsx +20 -0
  80. package/agentvibes.org/app/api/hello/route.ts +3 -0
  81. package/agentvibes.org/app/css/additional-styles/theme.css +82 -0
  82. package/agentvibes.org/app/css/additional-styles/utility-patterns.css +55 -0
  83. package/agentvibes.org/app/css/style.css +100 -0
  84. package/agentvibes.org/app/layout.tsx +63 -0
  85. package/agentvibes.org/components/cta.tsx +58 -0
  86. package/agentvibes.org/components/features.tsx +256 -0
  87. package/agentvibes.org/components/hero-home.tsx +133 -0
  88. package/agentvibes.org/components/modal-video.tsx +137 -0
  89. package/agentvibes.org/components/page-illustration.tsx +55 -0
  90. package/agentvibes.org/components/spotlight.tsx +77 -0
  91. package/agentvibes.org/components/testimonials.tsx +282 -0
  92. package/agentvibes.org/components/ui/footer.tsx +82 -0
  93. package/agentvibes.org/components/ui/header.tsx +53 -0
  94. package/agentvibes.org/components/ui/logo.tsx +10 -0
  95. package/agentvibes.org/components/workflows.tsx +176 -0
  96. package/agentvibes.org/next.config.js +4 -0
  97. package/agentvibes.org/package-lock.json +1974 -0
  98. package/agentvibes.org/package.json +30 -0
  99. package/agentvibes.org/pnpm-lock.yaml +1141 -0
  100. package/agentvibes.org/postcss.config.js +5 -0
  101. package/agentvibes.org/public/audio/02-sarcastic.mp3 +0 -0
  102. package/agentvibes.org/public/audio/03-angry.mp3 +0 -0
  103. package/agentvibes.org/public/audio/04-grandpa.mp3 +0 -0
  104. package/agentvibes.org/public/audio/05-sarcastic-example2.mp3 +0 -0
  105. package/agentvibes.org/public/audio/french-rachel.mp3 +0 -0
  106. package/agentvibes.org/public/audio/spanish-antoni.mp3 +0 -0
  107. package/agentvibes.org/public/favicon.ico +0 -0
  108. package/agentvibes.org/public/fonts/nacelle-italic.woff2 +0 -0
  109. package/agentvibes.org/public/fonts/nacelle-regular.woff2 +0 -0
  110. package/agentvibes.org/public/fonts/nacelle-semibold.woff2 +0 -0
  111. package/agentvibes.org/public/fonts/nacelle-semibolditalic.woff2 +0 -0
  112. package/agentvibes.org/public/images/blurred-shape-gray.svg +1 -0
  113. package/agentvibes.org/public/images/blurred-shape.svg +1 -0
  114. package/agentvibes.org/public/images/client-logo-01.svg +1 -0
  115. package/agentvibes.org/public/images/client-logo-02.svg +1 -0
  116. package/agentvibes.org/public/images/client-logo-03.svg +1 -0
  117. package/agentvibes.org/public/images/client-logo-04.svg +1 -0
  118. package/agentvibes.org/public/images/client-logo-05.svg +1 -0
  119. package/agentvibes.org/public/images/client-logo-06.svg +1 -0
  120. package/agentvibes.org/public/images/client-logo-07.svg +1 -0
  121. package/agentvibes.org/public/images/client-logo-08.svg +1 -0
  122. package/agentvibes.org/public/images/client-logo-09.svg +1 -0
  123. package/agentvibes.org/public/images/features.png +0 -0
  124. package/agentvibes.org/public/images/footer-illustration.svg +1 -0
  125. package/agentvibes.org/public/images/hero-image-01.jpg +0 -0
  126. package/agentvibes.org/public/images/logo.svg +1 -0
  127. package/agentvibes.org/public/images/page-illustration.svg +1 -0
  128. package/agentvibes.org/public/images/secondary-illustration.svg +1 -0
  129. package/agentvibes.org/public/images/testimonial-01.jpg +0 -0
  130. package/agentvibes.org/public/images/testimonial-02.jpg +0 -0
  131. package/agentvibes.org/public/images/testimonial-03.jpg +0 -0
  132. package/agentvibes.org/public/images/testimonial-04.jpg +0 -0
  133. package/agentvibes.org/public/images/testimonial-05.jpg +0 -0
  134. package/agentvibes.org/public/images/testimonial-06.jpg +0 -0
  135. package/agentvibes.org/public/images/testimonial-07.jpg +0 -0
  136. package/agentvibes.org/public/images/testimonial-08.jpg +0 -0
  137. package/agentvibes.org/public/images/testimonial-09.jpg +0 -0
  138. package/agentvibes.org/public/images/workflow-01.png +0 -0
  139. package/agentvibes.org/public/images/workflow-02.png +0 -0
  140. package/agentvibes.org/public/images/workflow-03.png +0 -0
  141. package/agentvibes.org/public/videos/video.mp4 +0 -0
  142. package/agentvibes.org/tsconfig.json +28 -0
  143. package/agentvibes.org/utils/useMasonry.tsx +67 -0
  144. package/agentvibes.org/utils/useMousePosition.tsx +27 -0
  145. package/docs/REMOTE_TTS_SETUP.md +190 -0
  146. package/package.json +2 -2
  147. package/src/installer.js +193 -9
  148. package/test/helpers/test-helper.bash +4 -2
  149. package/test/unit/personality-manager.bats +16 -4
  150. package/test/unit/personality-voice-mapping.bats +15 -6
  151. package/test/unit/play-tts.bats +0 -9
  152. 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