agentvibes 5.2.0 → 5.2.1
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/hooks/audio-cache-utils.sh +246 -246
- package/.claude/hooks/background-music-manager.sh +404 -404
- package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
- package/.claude/hooks/bmad-speak.sh +290 -290
- package/.claude/hooks/bmad-tts-injector.sh +568 -568
- package/.claude/hooks/bmad-voice-manager.sh +928 -928
- package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
- package/.claude/hooks/clawdbot-receiver.sh +107 -107
- package/.claude/hooks/clean-audio-cache.sh +22 -22
- package/.claude/hooks/cleanup-cache.sh +106 -106
- package/.claude/hooks/configure-rdp-mode.sh +137 -137
- package/.claude/hooks/download-extra-voices.sh +244 -244
- package/.claude/hooks/effects-manager.sh +268 -268
- package/.claude/hooks/github-star-reminder.sh +154 -154
- package/.claude/hooks/language-manager.sh +362 -362
- package/.claude/hooks/learn-manager.sh +492 -492
- package/.claude/hooks/macos-voice-manager.sh +205 -205
- package/.claude/hooks/migrate-background-music.sh +125 -125
- package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
- package/.claude/hooks/optimize-background-music.sh +87 -87
- package/.claude/hooks/path-resolver.sh +60 -60
- package/.claude/hooks/personality-manager.sh +448 -448
- package/.claude/hooks/piper-installer.sh +292 -292
- package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
- package/.claude/hooks/play-tts-enhanced.sh +105 -105
- package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
- package/.claude/hooks/play-tts.sh +14 -5
- package/.claude/hooks/prepare-release.sh +54 -54
- package/.claude/hooks/provider-commands.sh +617 -617
- package/.claude/hooks/provider-manager.sh +399 -399
- package/.claude/hooks/replay-target-audio.sh +95 -95
- package/.claude/hooks/sentiment-manager.sh +201 -201
- package/.claude/hooks/speed-manager.sh +291 -291
- package/.claude/hooks/stop-tts.sh +84 -84
- package/.claude/hooks/termux-installer.sh +261 -261
- package/.claude/hooks/translate-manager.sh +341 -341
- package/.claude/hooks/tts-queue-worker.sh +145 -145
- package/.claude/hooks/tts-queue.sh +165 -165
- package/.claude/hooks/voice-manager.sh +552 -548
- package/.claude/hooks-windows/play-tts.ps1 +2 -2
- package/README.md +11 -2
- package/RELEASE_NOTES.md +38 -0
- package/bin/mcp-server.sh +206 -206
- package/mcp-server/server.py +35 -6
- package/package.json +1 -1
- package/src/console/tabs/setup-tab.js +59 -23
- package/src/installer.js +79 -213
- package/src/services/llm-provider-service.js +126 -75
|
@@ -1,165 +1,165 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/bmad-speak-enhanced.sh
|
|
4
|
-
#
|
|
5
|
-
# AgentVibes BMAD Voice Integration with Audio Effects
|
|
6
|
-
# Enhanced version with background music and voice effects per agent
|
|
7
|
-
#
|
|
8
|
-
# Usage: bmad-speak-enhanced.sh "Agent Name" "dialogue text"
|
|
9
|
-
#
|
|
10
|
-
# Features:
|
|
11
|
-
# - All features of bmad-speak.sh
|
|
12
|
-
# - Per-agent sox voice effects
|
|
13
|
-
# - Per-agent background music mixing
|
|
14
|
-
# - Configurable via audio-effects.cfg
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
set -euo pipefail
|
|
18
|
-
|
|
19
|
-
# Get script directory and project root
|
|
20
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
21
|
-
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
22
|
-
|
|
23
|
-
# Arguments
|
|
24
|
-
AGENT_NAME_OR_ID="${1:-}"
|
|
25
|
-
DIALOGUE="${2:-}"
|
|
26
|
-
|
|
27
|
-
if [[ -z "$AGENT_NAME_OR_ID" ]] || [[ -z "$DIALOGUE" ]]; then
|
|
28
|
-
echo "Usage: $0 \"Agent Name\" \"dialogue text\"" >&2
|
|
29
|
-
exit 1
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
# Remove backslash escaping that Claude might add for special chars like ! and $
|
|
33
|
-
DIALOGUE="${DIALOGUE//\\!/!}"
|
|
34
|
-
DIALOGUE="${DIALOGUE//\\\$/\$}"
|
|
35
|
-
|
|
36
|
-
# Check if party mode is enabled
|
|
37
|
-
if [[ -f "$PROJECT_ROOT/.agentvibes/bmad/bmad-party-mode-disabled.flag" ]]; then
|
|
38
|
-
exit 0
|
|
39
|
-
fi
|
|
40
|
-
|
|
41
|
-
# Check if BMAD is installed
|
|
42
|
-
if [[ ! -f "$PROJECT_ROOT/_bmad/_config/agent-manifest.csv" ]]; then
|
|
43
|
-
exit 0
|
|
44
|
-
fi
|
|
45
|
-
|
|
46
|
-
# Map display name to agent ID
|
|
47
|
-
map_to_agent_id() {
|
|
48
|
-
local name_or_id="$1"
|
|
49
|
-
|
|
50
|
-
# If it looks like a file path, extract the agent ID
|
|
51
|
-
if [[ "$name_or_id" =~ _?\.?bmad/.*/agents/([^/]+)\.md$ ]]; then
|
|
52
|
-
echo "${BASH_REMATCH[1]}"
|
|
53
|
-
return
|
|
54
|
-
fi
|
|
55
|
-
|
|
56
|
-
# Check if it's already an agent ID
|
|
57
|
-
local direct_match=$(grep -i "^\"*${name_or_id}\"*," "$PROJECT_ROOT/_bmad/_config/agent-manifest.csv" | head -1)
|
|
58
|
-
if [[ -n "$direct_match" ]]; then
|
|
59
|
-
echo "$name_or_id"
|
|
60
|
-
return
|
|
61
|
-
fi
|
|
62
|
-
|
|
63
|
-
# Map display name to agent ID
|
|
64
|
-
local agent_id=$(awk -F',' -v name="$name_or_id" '
|
|
65
|
-
BEGIN { IGNORECASE=1 }
|
|
66
|
-
NR > 1 {
|
|
67
|
-
display = $2
|
|
68
|
-
gsub(/^"|"$/, "", display)
|
|
69
|
-
if (tolower(display) ~ "^" tolower(name) "($| |\\()") {
|
|
70
|
-
agent = $1
|
|
71
|
-
gsub(/^"|"$/, "", agent)
|
|
72
|
-
print agent
|
|
73
|
-
exit
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
' "$PROJECT_ROOT/_bmad/_config/agent-manifest.csv")
|
|
77
|
-
|
|
78
|
-
echo "$agent_id"
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
# Get display name from manifest for audio processor
|
|
82
|
-
get_display_name() {
|
|
83
|
-
local agent_id="$1"
|
|
84
|
-
|
|
85
|
-
local display_name=$(awk -F',' -v id="$agent_id" '
|
|
86
|
-
BEGIN { IGNORECASE=1 }
|
|
87
|
-
NR > 1 {
|
|
88
|
-
aid = $1
|
|
89
|
-
gsub(/^"|"$/, "", aid)
|
|
90
|
-
if (tolower(aid) == tolower(id)) {
|
|
91
|
-
display = $2
|
|
92
|
-
gsub(/^"|"$/, "", display)
|
|
93
|
-
print display
|
|
94
|
-
exit
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
' "$PROJECT_ROOT/_bmad/_config/agent-manifest.csv")
|
|
98
|
-
|
|
99
|
-
echo "$display_name"
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
# Get agent ID
|
|
103
|
-
AGENT_ID=$(map_to_agent_id "$AGENT_NAME_OR_ID")
|
|
104
|
-
DISPLAY_NAME=$(get_display_name "$AGENT_ID")
|
|
105
|
-
|
|
106
|
-
# Use display name for config lookup, fallback to original input
|
|
107
|
-
AGENT_FOR_EFFECTS="${DISPLAY_NAME:-$AGENT_NAME_OR_ID}"
|
|
108
|
-
|
|
109
|
-
# Get agent's voice and intro text
|
|
110
|
-
AGENT_VOICE=""
|
|
111
|
-
AGENT_INTRO=""
|
|
112
|
-
if [[ -n "$AGENT_ID" ]] && [[ -f "$SCRIPT_DIR/bmad-voice-manager.sh" ]]; then
|
|
113
|
-
AGENT_VOICE=$(cd "$PROJECT_ROOT" && "$SCRIPT_DIR/bmad-voice-manager.sh" get-voice "$AGENT_ID" 2>/dev/null || echo "")
|
|
114
|
-
AGENT_INTRO=$(cd "$PROJECT_ROOT" && "$SCRIPT_DIR/bmad-voice-manager.sh" get-intro "$AGENT_ID" 2>/dev/null || echo "")
|
|
115
|
-
fi
|
|
116
|
-
|
|
117
|
-
# Prepend intro text if configured
|
|
118
|
-
FULL_TEXT="$DIALOGUE"
|
|
119
|
-
if [[ -n "$AGENT_INTRO" ]]; then
|
|
120
|
-
FULL_TEXT="${AGENT_INTRO}. ${DIALOGUE}"
|
|
121
|
-
fi
|
|
122
|
-
|
|
123
|
-
# Export agent name for audio processor to pick up
|
|
124
|
-
export AGENTVIBES_CURRENT_AGENT="$AGENT_FOR_EFFECTS"
|
|
125
|
-
|
|
126
|
-
# Use enhanced pipeline: TTS -> Effects -> Play
|
|
127
|
-
# This directly generates and processes audio instead of using queue
|
|
128
|
-
|
|
129
|
-
# Generate TTS audio file directly
|
|
130
|
-
AUDIO_DIR="$PROJECT_ROOT/.claude/audio"
|
|
131
|
-
mkdir -p "$AUDIO_DIR"
|
|
132
|
-
TEMP_FILE="$AUDIO_DIR/tts-enhanced-$(date +%s)-$$.wav"
|
|
133
|
-
|
|
134
|
-
# Determine voice and generate audio
|
|
135
|
-
if [[ -n "$AGENT_VOICE" ]]; then
|
|
136
|
-
echo "🎤 Agent: $AGENT_FOR_EFFECTS | Voice: $AGENT_VOICE"
|
|
137
|
-
# Call piper directly to generate audio without playback
|
|
138
|
-
"$SCRIPT_DIR/play-tts-piper.sh" "$FULL_TEXT" "$AGENT_VOICE" > /dev/null 2>&1 &
|
|
139
|
-
PIPER_PID=$!
|
|
140
|
-
|
|
141
|
-
# Wait for piper to generate (it outputs the file path)
|
|
142
|
-
wait $PIPER_PID 2>/dev/null || true
|
|
143
|
-
|
|
144
|
-
# Find the most recent TTS file
|
|
145
|
-
GENERATED_FILE=$(ls -t "$AUDIO_DIR"/tts-padded-*.wav 2>/dev/null | head -1)
|
|
146
|
-
|
|
147
|
-
if [[ -n "$GENERATED_FILE" ]] && [[ -f "$GENERATED_FILE" ]]; then
|
|
148
|
-
# Apply audio effects and background mixing
|
|
149
|
-
if [[ -f "$SCRIPT_DIR/audio-processor.sh" ]]; then
|
|
150
|
-
PROCESSED_FILE="$AUDIO_DIR/tts-enhanced-processed-$(date +%s)-$$.wav"
|
|
151
|
-
"$SCRIPT_DIR/audio-processor.sh" "$GENERATED_FILE" "$AGENT_FOR_EFFECTS" "$PROCESSED_FILE" 2>/dev/null || {
|
|
152
|
-
# Fallback to original if processing fails
|
|
153
|
-
PROCESSED_FILE="$GENERATED_FILE"
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
# Play the processed file
|
|
157
|
-
if [[ -f "$PROCESSED_FILE" ]]; then
|
|
158
|
-
(mpv "$PROCESSED_FILE" || aplay "$PROCESSED_FILE" || paplay "$PROCESSED_FILE") >/dev/null 2>&1 &
|
|
159
|
-
fi
|
|
160
|
-
fi
|
|
161
|
-
fi
|
|
162
|
-
else
|
|
163
|
-
# Fallback to standard TTS queue
|
|
164
|
-
bash "$SCRIPT_DIR/tts-queue.sh" add "$FULL_TEXT" &
|
|
165
|
-
fi
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# File: .claude/hooks/bmad-speak-enhanced.sh
|
|
4
|
+
#
|
|
5
|
+
# AgentVibes BMAD Voice Integration with Audio Effects
|
|
6
|
+
# Enhanced version with background music and voice effects per agent
|
|
7
|
+
#
|
|
8
|
+
# Usage: bmad-speak-enhanced.sh "Agent Name" "dialogue text"
|
|
9
|
+
#
|
|
10
|
+
# Features:
|
|
11
|
+
# - All features of bmad-speak.sh
|
|
12
|
+
# - Per-agent sox voice effects
|
|
13
|
+
# - Per-agent background music mixing
|
|
14
|
+
# - Configurable via audio-effects.cfg
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
# Get script directory and project root
|
|
20
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
21
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
22
|
+
|
|
23
|
+
# Arguments
|
|
24
|
+
AGENT_NAME_OR_ID="${1:-}"
|
|
25
|
+
DIALOGUE="${2:-}"
|
|
26
|
+
|
|
27
|
+
if [[ -z "$AGENT_NAME_OR_ID" ]] || [[ -z "$DIALOGUE" ]]; then
|
|
28
|
+
echo "Usage: $0 \"Agent Name\" \"dialogue text\"" >&2
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Remove backslash escaping that Claude might add for special chars like ! and $
|
|
33
|
+
DIALOGUE="${DIALOGUE//\\!/!}"
|
|
34
|
+
DIALOGUE="${DIALOGUE//\\\$/\$}"
|
|
35
|
+
|
|
36
|
+
# Check if party mode is enabled
|
|
37
|
+
if [[ -f "$PROJECT_ROOT/.agentvibes/bmad/bmad-party-mode-disabled.flag" ]]; then
|
|
38
|
+
exit 0
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# Check if BMAD is installed
|
|
42
|
+
if [[ ! -f "$PROJECT_ROOT/_bmad/_config/agent-manifest.csv" ]]; then
|
|
43
|
+
exit 0
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
# Map display name to agent ID
|
|
47
|
+
map_to_agent_id() {
|
|
48
|
+
local name_or_id="$1"
|
|
49
|
+
|
|
50
|
+
# If it looks like a file path, extract the agent ID
|
|
51
|
+
if [[ "$name_or_id" =~ _?\.?bmad/.*/agents/([^/]+)\.md$ ]]; then
|
|
52
|
+
echo "${BASH_REMATCH[1]}"
|
|
53
|
+
return
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
# Check if it's already an agent ID
|
|
57
|
+
local direct_match=$(grep -i "^\"*${name_or_id}\"*," "$PROJECT_ROOT/_bmad/_config/agent-manifest.csv" | head -1)
|
|
58
|
+
if [[ -n "$direct_match" ]]; then
|
|
59
|
+
echo "$name_or_id"
|
|
60
|
+
return
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# Map display name to agent ID
|
|
64
|
+
local agent_id=$(awk -F',' -v name="$name_or_id" '
|
|
65
|
+
BEGIN { IGNORECASE=1 }
|
|
66
|
+
NR > 1 {
|
|
67
|
+
display = $2
|
|
68
|
+
gsub(/^"|"$/, "", display)
|
|
69
|
+
if (tolower(display) ~ "^" tolower(name) "($| |\\()") {
|
|
70
|
+
agent = $1
|
|
71
|
+
gsub(/^"|"$/, "", agent)
|
|
72
|
+
print agent
|
|
73
|
+
exit
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
' "$PROJECT_ROOT/_bmad/_config/agent-manifest.csv")
|
|
77
|
+
|
|
78
|
+
echo "$agent_id"
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# Get display name from manifest for audio processor
|
|
82
|
+
get_display_name() {
|
|
83
|
+
local agent_id="$1"
|
|
84
|
+
|
|
85
|
+
local display_name=$(awk -F',' -v id="$agent_id" '
|
|
86
|
+
BEGIN { IGNORECASE=1 }
|
|
87
|
+
NR > 1 {
|
|
88
|
+
aid = $1
|
|
89
|
+
gsub(/^"|"$/, "", aid)
|
|
90
|
+
if (tolower(aid) == tolower(id)) {
|
|
91
|
+
display = $2
|
|
92
|
+
gsub(/^"|"$/, "", display)
|
|
93
|
+
print display
|
|
94
|
+
exit
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
' "$PROJECT_ROOT/_bmad/_config/agent-manifest.csv")
|
|
98
|
+
|
|
99
|
+
echo "$display_name"
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# Get agent ID
|
|
103
|
+
AGENT_ID=$(map_to_agent_id "$AGENT_NAME_OR_ID")
|
|
104
|
+
DISPLAY_NAME=$(get_display_name "$AGENT_ID")
|
|
105
|
+
|
|
106
|
+
# Use display name for config lookup, fallback to original input
|
|
107
|
+
AGENT_FOR_EFFECTS="${DISPLAY_NAME:-$AGENT_NAME_OR_ID}"
|
|
108
|
+
|
|
109
|
+
# Get agent's voice and intro text
|
|
110
|
+
AGENT_VOICE=""
|
|
111
|
+
AGENT_INTRO=""
|
|
112
|
+
if [[ -n "$AGENT_ID" ]] && [[ -f "$SCRIPT_DIR/bmad-voice-manager.sh" ]]; then
|
|
113
|
+
AGENT_VOICE=$(cd "$PROJECT_ROOT" && "$SCRIPT_DIR/bmad-voice-manager.sh" get-voice "$AGENT_ID" 2>/dev/null || echo "")
|
|
114
|
+
AGENT_INTRO=$(cd "$PROJECT_ROOT" && "$SCRIPT_DIR/bmad-voice-manager.sh" get-intro "$AGENT_ID" 2>/dev/null || echo "")
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# Prepend intro text if configured
|
|
118
|
+
FULL_TEXT="$DIALOGUE"
|
|
119
|
+
if [[ -n "$AGENT_INTRO" ]]; then
|
|
120
|
+
FULL_TEXT="${AGENT_INTRO}. ${DIALOGUE}"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Export agent name for audio processor to pick up
|
|
124
|
+
export AGENTVIBES_CURRENT_AGENT="$AGENT_FOR_EFFECTS"
|
|
125
|
+
|
|
126
|
+
# Use enhanced pipeline: TTS -> Effects -> Play
|
|
127
|
+
# This directly generates and processes audio instead of using queue
|
|
128
|
+
|
|
129
|
+
# Generate TTS audio file directly
|
|
130
|
+
AUDIO_DIR="$PROJECT_ROOT/.claude/audio"
|
|
131
|
+
mkdir -p "$AUDIO_DIR"
|
|
132
|
+
TEMP_FILE="$AUDIO_DIR/tts-enhanced-$(date +%s)-$$.wav"
|
|
133
|
+
|
|
134
|
+
# Determine voice and generate audio
|
|
135
|
+
if [[ -n "$AGENT_VOICE" ]]; then
|
|
136
|
+
echo "🎤 Agent: $AGENT_FOR_EFFECTS | Voice: $AGENT_VOICE"
|
|
137
|
+
# Call piper directly to generate audio without playback
|
|
138
|
+
"$SCRIPT_DIR/play-tts-piper.sh" "$FULL_TEXT" "$AGENT_VOICE" > /dev/null 2>&1 &
|
|
139
|
+
PIPER_PID=$!
|
|
140
|
+
|
|
141
|
+
# Wait for piper to generate (it outputs the file path)
|
|
142
|
+
wait $PIPER_PID 2>/dev/null || true
|
|
143
|
+
|
|
144
|
+
# Find the most recent TTS file
|
|
145
|
+
GENERATED_FILE=$(ls -t "$AUDIO_DIR"/tts-padded-*.wav 2>/dev/null | head -1)
|
|
146
|
+
|
|
147
|
+
if [[ -n "$GENERATED_FILE" ]] && [[ -f "$GENERATED_FILE" ]]; then
|
|
148
|
+
# Apply audio effects and background mixing
|
|
149
|
+
if [[ -f "$SCRIPT_DIR/audio-processor.sh" ]]; then
|
|
150
|
+
PROCESSED_FILE="$AUDIO_DIR/tts-enhanced-processed-$(date +%s)-$$.wav"
|
|
151
|
+
"$SCRIPT_DIR/audio-processor.sh" "$GENERATED_FILE" "$AGENT_FOR_EFFECTS" "$PROCESSED_FILE" 2>/dev/null || {
|
|
152
|
+
# Fallback to original if processing fails
|
|
153
|
+
PROCESSED_FILE="$GENERATED_FILE"
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
# Play the processed file
|
|
157
|
+
if [[ -f "$PROCESSED_FILE" ]]; then
|
|
158
|
+
(mpv "$PROCESSED_FILE" || aplay "$PROCESSED_FILE" || paplay "$PROCESSED_FILE") >/dev/null 2>&1 &
|
|
159
|
+
fi
|
|
160
|
+
fi
|
|
161
|
+
fi
|
|
162
|
+
else
|
|
163
|
+
# Fallback to standard TTS queue
|
|
164
|
+
bash "$SCRIPT_DIR/tts-queue.sh" add "$FULL_TEXT" &
|
|
165
|
+
fi
|