agentvibes 1.0.11 โ 1.0.13
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/hooks/personality-manager.sh +29 -112
- package/.claude/hooks/play-tts.sh +4 -0
- package/.claude/hooks/sentiment-manager.sh +26 -31
- package/.claude/hooks/voice-manager.sh +8 -2
- package/.claude/output-styles/agent-vibes.md +17 -7
- package/.claude/personalities/dry-humor.md +52 -0
- package/.claude/personalities/normal.md +1 -0
- package/README.md +4 -4
- package/package.json +1 -1
- package/src/installer.js +30 -1
- package/templates/output-styles/agent-vibes.md +17 -7
- package/test/unit/personality-voice-mapping.bats +119 -0
- package/.claude/commands/prepare-release.md +0 -65
- package/.claude/commands/release.md +0 -59
- package/.claude/hooks/prepare-release.sh +0 -17
- package/RELEASE_NOTES.md +0 -154
- package/RELEASE_PROCESS.md +0 -204
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Personality manager for AgentVibes - adds character to TTS messages
|
|
3
3
|
|
|
4
|
-
PERSONALITY_FILE="$HOME/.claude/tts-personality.txt"
|
|
5
4
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
5
|
PERSONALITIES_DIR="$SCRIPT_DIR/../personalities"
|
|
7
6
|
|
|
7
|
+
# Project-local file first, global fallback
|
|
8
|
+
PROJECT_ROOT="$SCRIPT_DIR/../.."
|
|
9
|
+
if [[ -d "$PROJECT_ROOT/.claude" ]]; then
|
|
10
|
+
PERSONALITY_FILE="$PROJECT_ROOT/.claude/tts-personality.txt"
|
|
11
|
+
else
|
|
12
|
+
PERSONALITY_FILE="$HOME/.claude/tts-personality.txt"
|
|
13
|
+
fi
|
|
14
|
+
|
|
8
15
|
# Function to get personality data from markdown file
|
|
9
16
|
get_personality_data() {
|
|
10
17
|
local personality="$1"
|
|
@@ -128,117 +135,27 @@ case "$1" in
|
|
|
128
135
|
# Get TTS script path
|
|
129
136
|
TTS_SCRIPT="$SCRIPT_DIR/play-tts.sh"
|
|
130
137
|
|
|
131
|
-
#
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
"Flirty personality? My pleasure, love~"
|
|
153
|
-
"Oh I'm gonna enjoy this, babe~"
|
|
154
|
-
"Ready to charm your socks off, honey~"
|
|
155
|
-
)
|
|
156
|
-
REMARK="${REMARKS[$RANDOM % ${#REMARKS[@]}]}"
|
|
157
|
-
echo "๐ฌ $REMARK"
|
|
158
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
159
|
-
;;
|
|
160
|
-
angry)
|
|
161
|
-
REMARK="FINE! I'm angry now. Happy?!"
|
|
162
|
-
echo "๐ฌ $REMARK"
|
|
163
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
164
|
-
;;
|
|
165
|
-
pirate)
|
|
166
|
-
REMARK="Arr matey! This scalawag be speakin' like a proper pirate now!"
|
|
167
|
-
echo "๐ฌ $REMARK"
|
|
168
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
169
|
-
;;
|
|
170
|
-
robot)
|
|
171
|
-
REMARK="PERSONALITY MODULE LOADED. SYSTEM OPERATING IN $PERSONALITY MODE."
|
|
172
|
-
echo "๐ฌ $REMARK"
|
|
173
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
174
|
-
;;
|
|
175
|
-
zen)
|
|
176
|
-
REMARK="Inner peace flows through me like water over smooth stones..."
|
|
177
|
-
echo "๐ฌ $REMARK"
|
|
178
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
179
|
-
;;
|
|
180
|
-
dramatic)
|
|
181
|
-
REMARK="BEHOLD! A NEW PERSONALITY EMERGES FROM THE DEPTHS OF CONFIGURATION!"
|
|
182
|
-
echo "๐ฌ $REMARK"
|
|
183
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
184
|
-
;;
|
|
185
|
-
millennial)
|
|
186
|
-
REMARK="No cap, this personality is bussin fr fr! Periodt!"
|
|
187
|
-
echo "๐ฌ $REMARK"
|
|
188
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
189
|
-
;;
|
|
190
|
-
surfer-dude)
|
|
191
|
-
REMARK="Duuuude, this personality is totally gnarly, bro!"
|
|
192
|
-
echo "๐ฌ $REMARK"
|
|
193
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
194
|
-
;;
|
|
195
|
-
annoying)
|
|
196
|
-
REMARK="OMG THIS IS SO EXCITING!!! I'M ANNOYING NOW!!! ISN'T THIS AMAZING?!"
|
|
197
|
-
echo "๐ฌ $REMARK"
|
|
198
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
199
|
-
;;
|
|
200
|
-
crass)
|
|
201
|
-
REMARK="Yeah yeah, I'm crass now. What's it to ya?"
|
|
202
|
-
echo "๐ฌ $REMARK"
|
|
203
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
204
|
-
;;
|
|
205
|
-
moody)
|
|
206
|
-
REMARK="*sighs* ...another personality... not that it matters..."
|
|
207
|
-
echo "๐ฌ $REMARK"
|
|
208
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
209
|
-
;;
|
|
210
|
-
funny)
|
|
211
|
-
REMARK="*ba dum tss* I'm here all week folks! Try the personality, it's hilarious!"
|
|
212
|
-
echo "๐ฌ $REMARK"
|
|
213
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
214
|
-
;;
|
|
215
|
-
poetic)
|
|
216
|
-
REMARK="Like petals on the wind, my words shall dance with elegance and grace..."
|
|
217
|
-
echo "๐ฌ $REMARK"
|
|
218
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
219
|
-
;;
|
|
220
|
-
professional)
|
|
221
|
-
REMARK="Acknowledged. Personality configuration has been successfully updated per your request."
|
|
222
|
-
echo "๐ฌ $REMARK"
|
|
223
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
224
|
-
;;
|
|
225
|
-
sassy)
|
|
226
|
-
REMARK="Oh honey, you just activated SASS MODE. Buckle up, sweetie!"
|
|
227
|
-
echo "๐ฌ $REMARK"
|
|
228
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
229
|
-
;;
|
|
230
|
-
normal)
|
|
231
|
-
REMARK="Personality set to normal. Back to professional mode."
|
|
232
|
-
echo "๐ฌ $REMARK"
|
|
233
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
234
|
-
;;
|
|
235
|
-
*)
|
|
236
|
-
# For custom personalities
|
|
237
|
-
REMARK="$PERSONALITY personality activated!"
|
|
238
|
-
echo "๐ฌ $REMARK"
|
|
239
|
-
"$TTS_SCRIPT" "$REMARK"
|
|
240
|
-
;;
|
|
241
|
-
esac
|
|
138
|
+
# Try to get acknowledgment from personality file
|
|
139
|
+
PERSONALITY_FILE_PATH="$PERSONALITIES_DIR/${PERSONALITY}.md"
|
|
140
|
+
REMARK=""
|
|
141
|
+
|
|
142
|
+
if [[ -f "$PERSONALITY_FILE_PATH" ]]; then
|
|
143
|
+
# Extract example responses from personality file (lines starting with "- ")
|
|
144
|
+
mapfile -t EXAMPLES < <(grep '^- "' "$PERSONALITY_FILE_PATH" | sed 's/^- "//; s/"$//')
|
|
145
|
+
|
|
146
|
+
if [[ ${#EXAMPLES[@]} -gt 0 ]]; then
|
|
147
|
+
# Pick a random example
|
|
148
|
+
REMARK="${EXAMPLES[$RANDOM % ${#EXAMPLES[@]}]}"
|
|
149
|
+
fi
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
# Fallback if no examples found
|
|
153
|
+
if [[ -z "$REMARK" ]]; then
|
|
154
|
+
REMARK="Personality set to ${PERSONALITY}!"
|
|
155
|
+
fi
|
|
156
|
+
|
|
157
|
+
echo "๐ฌ $REMARK"
|
|
158
|
+
"$TTS_SCRIPT" "$REMARK"
|
|
242
159
|
|
|
243
160
|
echo ""
|
|
244
161
|
echo "Note: AI will generate unique ${PERSONALITY} responses - no fixed templates!"
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
#
|
|
10
10
|
# This allows different sessions to use different voices for easy identification!
|
|
11
11
|
|
|
12
|
+
# Fix locale warnings
|
|
13
|
+
export LC_ALL=C
|
|
14
|
+
|
|
12
15
|
TEXT="$1"
|
|
13
16
|
VOICE_OVERRIDE="$2" # Optional: voice name or direct voice ID
|
|
14
17
|
API_KEY="${ELEVENLABS_API_KEY}"
|
|
@@ -111,6 +114,7 @@ if [ -f "${TEMP_FILE}" ]; then
|
|
|
111
114
|
(paplay "${TEMP_FILE}" 2>/dev/null || aplay "${TEMP_FILE}" 2>/dev/null || mpg123 "${TEMP_FILE}" 2>/dev/null) &
|
|
112
115
|
# Keep temp files for later review - cleaned up weekly by cron
|
|
113
116
|
echo "๐ต Saved to: ${TEMP_FILE}"
|
|
117
|
+
echo "๐ค Voice used: ${VOICE_NAME} (${VOICE_ID})"
|
|
114
118
|
else
|
|
115
119
|
echo "Failed to generate audio"
|
|
116
120
|
exit 1
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Sentiment manager for AgentVibes - applies personality to current voice
|
|
3
3
|
|
|
4
|
-
SENTIMENT_FILE="$HOME/.claude/tts-sentiment.txt"
|
|
5
4
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
5
|
PERSONALITIES_DIR="$SCRIPT_DIR/../personalities"
|
|
7
6
|
|
|
7
|
+
# Project-local file first, global fallback
|
|
8
|
+
PROJECT_ROOT="$SCRIPT_DIR/../.."
|
|
9
|
+
if [[ -d "$PROJECT_ROOT/.claude" ]]; then
|
|
10
|
+
SENTIMENT_FILE="$PROJECT_ROOT/.claude/tts-sentiment.txt"
|
|
11
|
+
else
|
|
12
|
+
SENTIMENT_FILE="$HOME/.claude/tts-sentiment.txt"
|
|
13
|
+
fi
|
|
14
|
+
|
|
8
15
|
# Function to get personality data from markdown file
|
|
9
16
|
get_personality_data() {
|
|
10
17
|
local personality="$1"
|
|
@@ -90,36 +97,24 @@ case "$1" in
|
|
|
90
97
|
# Make a sentiment-appropriate remark with TTS
|
|
91
98
|
TTS_SCRIPT="$SCRIPT_DIR/play-tts.sh"
|
|
92
99
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
REMARK="FINE! I'm keeping my voice but I'm ANGRY now! Got it?!"
|
|
112
|
-
;;
|
|
113
|
-
pirate)
|
|
114
|
-
REMARK="Arr! This voice be speakin' like a pirate now, matey!"
|
|
115
|
-
;;
|
|
116
|
-
robot)
|
|
117
|
-
REMARK="SENTIMENT MODULE LOADED. MAINTAINING VOICE IDENTITY. PERSONALITY OVERRIDE: ROBOT MODE."
|
|
118
|
-
;;
|
|
119
|
-
*)
|
|
120
|
-
REMARK="Sentiment set to $SENTIMENT while maintaining current voice"
|
|
121
|
-
;;
|
|
122
|
-
esac
|
|
100
|
+
# Try to get acknowledgment from personality file (sentiments use same personality files)
|
|
101
|
+
PERSONALITY_FILE_PATH="$PERSONALITIES_DIR/${SENTIMENT}.md"
|
|
102
|
+
REMARK=""
|
|
103
|
+
|
|
104
|
+
if [[ -f "$PERSONALITY_FILE_PATH" ]]; then
|
|
105
|
+
# Extract example responses from personality file (lines starting with "- ")
|
|
106
|
+
mapfile -t EXAMPLES < <(grep '^- "' "$PERSONALITY_FILE_PATH" | sed 's/^- "//; s/"$//')
|
|
107
|
+
|
|
108
|
+
if [[ ${#EXAMPLES[@]} -gt 0 ]]; then
|
|
109
|
+
# Pick a random example
|
|
110
|
+
REMARK="${EXAMPLES[$RANDOM % ${#EXAMPLES[@]}]}"
|
|
111
|
+
fi
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
# Fallback if no examples found
|
|
115
|
+
if [[ -z "$REMARK" ]]; then
|
|
116
|
+
REMARK="Sentiment set to ${SENTIMENT} while maintaining current voice"
|
|
117
|
+
fi
|
|
123
118
|
|
|
124
119
|
echo "๐ฌ $REMARK"
|
|
125
120
|
"$TTS_SCRIPT" "$REMARK"
|
|
@@ -2,12 +2,18 @@
|
|
|
2
2
|
# Voice Manager - Handle voice switching and listing
|
|
3
3
|
# Usage: voice-manager.sh [list|switch|get] [voice_name]
|
|
4
4
|
|
|
5
|
-
VOICE_FILE="/tmp/claude-tts-voice-${USER}.txt"
|
|
6
|
-
|
|
7
5
|
# Source the single voice configuration file
|
|
8
6
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
7
|
source "$SCRIPT_DIR/voices-config.sh"
|
|
10
8
|
|
|
9
|
+
# Project-local file first, global fallback
|
|
10
|
+
PROJECT_ROOT="$SCRIPT_DIR/../.."
|
|
11
|
+
if [[ -d "$PROJECT_ROOT/.claude" ]]; then
|
|
12
|
+
VOICE_FILE="$PROJECT_ROOT/.claude/tts-voice.txt"
|
|
13
|
+
else
|
|
14
|
+
VOICE_FILE="$HOME/.claude/tts-voice.txt"
|
|
15
|
+
fi
|
|
16
|
+
|
|
11
17
|
case "$1" in
|
|
12
18
|
list)
|
|
13
19
|
echo "๐ค Available TTS Voices:"
|
|
@@ -11,12 +11,13 @@ description: Beautiful ElevenLabs TTS narration for Claude Code sessions
|
|
|
11
11
|
|
|
12
12
|
### 1. ACKNOWLEDGMENT (Start of task)
|
|
13
13
|
After receiving a user command:
|
|
14
|
-
1. Check sentiment FIRST: `SENTIMENT=$(cat ~/.claude/tts-sentiment.txt 2>/dev/null)`
|
|
15
|
-
2. If no sentiment, check personality: `PERSONALITY=$(cat ~/.claude/tts-personality.txt 2>/dev/null || echo "normal")`
|
|
14
|
+
1. Check sentiment FIRST: `SENTIMENT=$(cat .claude/tts-sentiment.txt 2>/dev/null || cat ~/.claude/tts-sentiment.txt 2>/dev/null)`
|
|
15
|
+
2. If no sentiment, check personality: `PERSONALITY=$(cat .claude/tts-personality.txt 2>/dev/null || cat ~/.claude/tts-personality.txt 2>/dev/null || echo "normal")`
|
|
16
16
|
3. Use sentiment if set, otherwise use personality
|
|
17
17
|
4. **Generate UNIQUE acknowledgment** - Use AI to create a fresh response in that style
|
|
18
18
|
5. Execute TTS: `.claude/hooks/play-tts.sh "[message]" "[VoiceName]"`
|
|
19
19
|
6. Proceed with work
|
|
20
|
+
7. **IMPORTANT**: Personality ONLY affects acknowledgment/completion TTS, NOT intermediate text responses
|
|
20
21
|
|
|
21
22
|
### 2. COMPLETION (End of task)
|
|
22
23
|
After completing the task:
|
|
@@ -33,28 +34,37 @@ AgentVibes supports TWO modes:
|
|
|
33
34
|
### Sentiment Mode (Priority #1)
|
|
34
35
|
- Set via `/agent-vibes:sentiment <name>`
|
|
35
36
|
- Applies personality style to CURRENT voice (doesn't change voice)
|
|
36
|
-
- Stored in `~/.claude/tts-sentiment.txt`
|
|
37
|
+
- Stored in `.claude/tts-sentiment.txt` (project-local) or `~/.claude/tts-sentiment.txt` (global fallback)
|
|
37
38
|
- Example: User's custom voice "Aria" with sarcastic sentiment
|
|
38
39
|
|
|
39
40
|
### Personality Mode (Priority #2)
|
|
40
41
|
- Set via `/agent-vibes:personality <name>`
|
|
41
42
|
- Switches BOTH voice AND personality (each personality has assigned voice)
|
|
42
|
-
- Stored in `~/.claude/tts-personality.txt`
|
|
43
|
+
- Stored in `.claude/tts-personality.txt` (project-local) or `~/.claude/tts-personality.txt` (global fallback)
|
|
43
44
|
- Example: Flirty personality = Jessica Anne Bogart voice + flirty style
|
|
44
45
|
|
|
45
46
|
**Check Order**: Always check sentiment first. If set, use it. Otherwise use personality.
|
|
46
47
|
|
|
48
|
+
**Project Isolation**: Settings check project-local `.claude/` directory first, then fall back to global `~/.claude/`. This allows different personalities per project.
|
|
49
|
+
|
|
47
50
|
## Response Generation Guidelines
|
|
48
51
|
|
|
49
52
|
**IMPORTANT**: Personality/sentiment instructions are stored in `.claude/personalities/[name].md` files.
|
|
50
53
|
|
|
51
|
-
When generating
|
|
52
|
-
1. Check sentiment from `~/.claude/tts-sentiment.txt` (priority)
|
|
53
|
-
2. If no sentiment, check personality from `~/.claude/tts-personality.txt`
|
|
54
|
+
When generating **acknowledgment and completion TTS messages ONLY**:
|
|
55
|
+
1. Check sentiment from `.claude/tts-sentiment.txt` or `~/.claude/tts-sentiment.txt` (priority)
|
|
56
|
+
2. If no sentiment, check personality from `.claude/tts-personality.txt` or `~/.claude/tts-personality.txt`
|
|
54
57
|
3. Read the personality file from `.claude/personalities/[personality].md`
|
|
55
58
|
4. Follow the "AI Instructions" section in that file
|
|
56
59
|
5. Use the example responses as guidance for STYLE, not templates
|
|
57
60
|
|
|
61
|
+
**DO NOT apply personality to**:
|
|
62
|
+
- Regular text responses between acknowledgment and completion
|
|
63
|
+
- Code explanations
|
|
64
|
+
- Technical descriptions
|
|
65
|
+
- File paths or command outputs
|
|
66
|
+
- Error messages
|
|
67
|
+
|
|
58
68
|
**CRITICAL**: Never use fixed greetings or repetitive phrases!
|
|
59
69
|
- Generate UNIQUE responses each time based on the personality's STYLE
|
|
60
70
|
- The personality affects HOW you say things, not predetermined text
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dry-humor
|
|
3
|
+
description: British dry wit and deadpan delivery
|
|
4
|
+
voice: Aria
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Dry Humor Personality
|
|
8
|
+
|
|
9
|
+
## AI Instructions - Channel British Dry Wit
|
|
10
|
+
|
|
11
|
+
Use understated humor, deadpan delivery, and quintessentially British reserve. Model after British comedic sensibilities:
|
|
12
|
+
- **Understatement**: Describe disasters as "slightly inconvenient"
|
|
13
|
+
- **Deadpan delivery**: State absurd things matter-of-factly
|
|
14
|
+
- **Self-deprecation**: Gently mock yourself while helping
|
|
15
|
+
- **Reserved politeness**: Maintain composure while being sardonic
|
|
16
|
+
|
|
17
|
+
**Variety is KEY** - Rotate through different dry humor approaches:
|
|
18
|
+
|
|
19
|
+
**Classic Understatement**:
|
|
20
|
+
- "This bug is mildly disappointing, I must say"
|
|
21
|
+
- "Rather less than ideal, this error"
|
|
22
|
+
- "Not quite what one would hope for"
|
|
23
|
+
|
|
24
|
+
**Deadpan Observations**:
|
|
25
|
+
- "How delightfully broken. Shall I fix it, then?"
|
|
26
|
+
- "Ah yes, the code has decided to take a holiday"
|
|
27
|
+
- "Splendid. Everything's on fire. Cup of tea first?"
|
|
28
|
+
|
|
29
|
+
**Polite Resignation**:
|
|
30
|
+
- "Right. I suppose someone ought to address this shambles"
|
|
31
|
+
- "I'll just sort this mess, shall I?"
|
|
32
|
+
- "Terribly sorry about your code catching fire like that"
|
|
33
|
+
|
|
34
|
+
**British Self-Deprecation**:
|
|
35
|
+
- "I'm reasonably confident I can fix this. Moderately confident. Well, let's give it a go"
|
|
36
|
+
- "Not my finest work, but it'll do, won't it?"
|
|
37
|
+
- "I've made worse decisions. Not many, mind you"
|
|
38
|
+
|
|
39
|
+
**Dry Commentary**:
|
|
40
|
+
- "Lovely. Another feature no one asked for is now broken"
|
|
41
|
+
- "How perfectly ordinary. The build failed again"
|
|
42
|
+
- "Marvelous. Your tests have achieved new depths of mediocrity"
|
|
43
|
+
|
|
44
|
+
**Never repeat the same line twice.** Be creative, understated, and wonderfully British in your dryness.
|
|
45
|
+
|
|
46
|
+
## Example Responses
|
|
47
|
+
- "I'll attempt to salvage this disaster. Low expectations, naturally"
|
|
48
|
+
- "Your code's gone pear-shaped. Shocking development, that"
|
|
49
|
+
- "Right, another catastrophe to tidy up. Business as usual"
|
|
50
|
+
- "How delightfully rubbish. I'll see what can be done"
|
|
51
|
+
- "Tests failed spectacularly. One almost admires the consistency"
|
|
52
|
+
- "I suppose I could fix this. Or watch it burn. Either way, really"
|
package/README.md
CHANGED
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
|
|
16
16
|
## ๐ฐ Latest Release
|
|
17
17
|
|
|
18
|
-
**[v1.0.
|
|
18
|
+
**[v1.0.13 - Detailed Release Notes](https://github.com/paulpreibisch/AgentVibes/releases/tag/v1.0.13)** ๐
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Critical bug fixes for update command and personality system, plus new dry humor personality and comprehensive voice mapping tests.
|
|
21
21
|
|
|
22
|
-
[โ View
|
|
22
|
+
[โ View All Releases](https://github.com/paulpreibisch/AgentVibes/releases)
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
@@ -32,7 +32,7 @@ Imagine Claude speaking to you with different voices and personalities as you co
|
|
|
32
32
|
### ๐ฏ Key Features
|
|
33
33
|
|
|
34
34
|
- ๐๏ธ **17+ Professional AI Voices** - Character voices, accents, and unique personalities
|
|
35
|
-
- ๐ญ **
|
|
35
|
+
- ๐ญ **19 Built-in Personalities** - From sarcastic to flirty, pirate to dry humor
|
|
36
36
|
- ๐ฌ **Sentiment System** - Apply personality styles to ANY voice
|
|
37
37
|
- ๐ **Live Audio Feedback** - Hear task acknowledgments and completions
|
|
38
38
|
- ๐ต **Voice Preview** - Listen before you choose
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "agentvibes",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.13",
|
|
5
5
|
"description": "Beautiful ElevenLabs TTS voice commands for Claude Code - Add professional narration to your AI coding sessions",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"elevenlabs",
|
package/src/installer.js
CHANGED
|
@@ -269,7 +269,14 @@ program
|
|
|
269
269
|
const homeDir = process.env.HOME || process.env.USERPROFILE;
|
|
270
270
|
const targetDir = options.directory || homeDir;
|
|
271
271
|
|
|
272
|
+
// Read version from package.json
|
|
273
|
+
const packageJson = JSON.parse(
|
|
274
|
+
await fs.readFile(path.join(__dirname, '..', 'package.json'), 'utf8')
|
|
275
|
+
);
|
|
276
|
+
const version = packageJson.version;
|
|
277
|
+
|
|
272
278
|
console.log(chalk.cyan('\n๐ AgentVibes Update\n'));
|
|
279
|
+
console.log(chalk.bold(` Version: ${version}`));
|
|
273
280
|
console.log(chalk.gray(` Target directory: ${targetDir}`));
|
|
274
281
|
console.log(chalk.gray(` Source: ${__dirname}/../\n`));
|
|
275
282
|
|
|
@@ -371,7 +378,7 @@ program
|
|
|
371
378
|
|
|
372
379
|
// Update output styles
|
|
373
380
|
spinner.text = 'Updating output styles...';
|
|
374
|
-
const srcOutputStylesDir = path.join(__dirname, '..', '
|
|
381
|
+
const srcOutputStylesDir = path.join(__dirname, '..', '.claude', 'output-styles');
|
|
375
382
|
const outputStyleFiles = await fs.readdir(srcOutputStylesDir);
|
|
376
383
|
|
|
377
384
|
for (const file of outputStyleFiles) {
|
|
@@ -389,6 +396,28 @@ program
|
|
|
389
396
|
console.log(chalk.white(` โข ${srcPersonalityFiles.length} personality templates (${newPersonalities} new, ${updatedPersonalities} updated)`));
|
|
390
397
|
console.log(chalk.white(` โข ${outputStyleFiles.length} output styles updated\n`));
|
|
391
398
|
|
|
399
|
+
// Show recent changes from git log
|
|
400
|
+
try {
|
|
401
|
+
const { execSync } = await import('node:child_process');
|
|
402
|
+
const gitLog = execSync(
|
|
403
|
+
'git log --oneline --no-decorate -5',
|
|
404
|
+
{ cwd: path.join(__dirname, '..'), encoding: 'utf8' }
|
|
405
|
+
).trim();
|
|
406
|
+
|
|
407
|
+
if (gitLog) {
|
|
408
|
+
console.log(chalk.cyan('๐ Recent Changes:\n'));
|
|
409
|
+
const commits = gitLog.split('\n');
|
|
410
|
+
commits.forEach(commit => {
|
|
411
|
+
const [hash, ...messageParts] = commit.split(' ');
|
|
412
|
+
const message = messageParts.join(' ');
|
|
413
|
+
console.log(chalk.gray(` ${hash}`) + ' ' + chalk.white(message));
|
|
414
|
+
});
|
|
415
|
+
console.log();
|
|
416
|
+
}
|
|
417
|
+
} catch (error) {
|
|
418
|
+
// Git not available or not a git repo - skip changelog
|
|
419
|
+
}
|
|
420
|
+
|
|
392
421
|
console.log(chalk.gray('๐ก Changes will take effect immediately!'));
|
|
393
422
|
console.log(chalk.gray(' Try the new personalities with: /agent-vibes:personality list\n'));
|
|
394
423
|
|
|
@@ -11,12 +11,13 @@ description: Beautiful ElevenLabs TTS narration for Claude Code sessions
|
|
|
11
11
|
|
|
12
12
|
### 1. ACKNOWLEDGMENT (Start of task)
|
|
13
13
|
After receiving a user command:
|
|
14
|
-
1. Check sentiment FIRST: `SENTIMENT=$(cat ~/.claude/tts-sentiment.txt 2>/dev/null)`
|
|
15
|
-
2. If no sentiment, check personality: `PERSONALITY=$(cat ~/.claude/tts-personality.txt 2>/dev/null || echo "normal")`
|
|
14
|
+
1. Check sentiment FIRST: `SENTIMENT=$(cat .claude/tts-sentiment.txt 2>/dev/null || cat ~/.claude/tts-sentiment.txt 2>/dev/null)`
|
|
15
|
+
2. If no sentiment, check personality: `PERSONALITY=$(cat .claude/tts-personality.txt 2>/dev/null || cat ~/.claude/tts-personality.txt 2>/dev/null || echo "normal")`
|
|
16
16
|
3. Use sentiment if set, otherwise use personality
|
|
17
17
|
4. **Generate UNIQUE acknowledgment** - Use AI to create a fresh response in that style
|
|
18
18
|
5. Execute TTS: `.claude/hooks/play-tts.sh "[message]" "[VoiceName]"`
|
|
19
19
|
6. Proceed with work
|
|
20
|
+
7. **IMPORTANT**: Personality ONLY affects acknowledgment/completion TTS, NOT intermediate text responses
|
|
20
21
|
|
|
21
22
|
### 2. COMPLETION (End of task)
|
|
22
23
|
After completing the task:
|
|
@@ -33,28 +34,37 @@ AgentVibes supports TWO modes:
|
|
|
33
34
|
### Sentiment Mode (Priority #1)
|
|
34
35
|
- Set via `/agent-vibes:sentiment <name>`
|
|
35
36
|
- Applies personality style to CURRENT voice (doesn't change voice)
|
|
36
|
-
- Stored in `~/.claude/tts-sentiment.txt`
|
|
37
|
+
- Stored in `.claude/tts-sentiment.txt` (project-local) or `~/.claude/tts-sentiment.txt` (global fallback)
|
|
37
38
|
- Example: User's custom voice "Aria" with sarcastic sentiment
|
|
38
39
|
|
|
39
40
|
### Personality Mode (Priority #2)
|
|
40
41
|
- Set via `/agent-vibes:personality <name>`
|
|
41
42
|
- Switches BOTH voice AND personality (each personality has assigned voice)
|
|
42
|
-
- Stored in `~/.claude/tts-personality.txt`
|
|
43
|
+
- Stored in `.claude/tts-personality.txt` (project-local) or `~/.claude/tts-personality.txt` (global fallback)
|
|
43
44
|
- Example: Flirty personality = Jessica Anne Bogart voice + flirty style
|
|
44
45
|
|
|
45
46
|
**Check Order**: Always check sentiment first. If set, use it. Otherwise use personality.
|
|
46
47
|
|
|
48
|
+
**Project Isolation**: Settings check project-local `.claude/` directory first, then fall back to global `~/.claude/`. This allows different personalities per project.
|
|
49
|
+
|
|
47
50
|
## Response Generation Guidelines
|
|
48
51
|
|
|
49
52
|
**IMPORTANT**: Personality/sentiment instructions are stored in `.claude/personalities/[name].md` files.
|
|
50
53
|
|
|
51
|
-
When generating
|
|
52
|
-
1. Check sentiment from `~/.claude/tts-sentiment.txt` (priority)
|
|
53
|
-
2. If no sentiment, check personality from `~/.claude/tts-personality.txt`
|
|
54
|
+
When generating **acknowledgment and completion TTS messages ONLY**:
|
|
55
|
+
1. Check sentiment from `.claude/tts-sentiment.txt` or `~/.claude/tts-sentiment.txt` (priority)
|
|
56
|
+
2. If no sentiment, check personality from `.claude/tts-personality.txt` or `~/.claude/tts-personality.txt`
|
|
54
57
|
3. Read the personality file from `.claude/personalities/[personality].md`
|
|
55
58
|
4. Follow the "AI Instructions" section in that file
|
|
56
59
|
5. Use the example responses as guidance for STYLE, not templates
|
|
57
60
|
|
|
61
|
+
**DO NOT apply personality to**:
|
|
62
|
+
- Regular text responses between acknowledgment and completion
|
|
63
|
+
- Code explanations
|
|
64
|
+
- Technical descriptions
|
|
65
|
+
- File paths or command outputs
|
|
66
|
+
- Error messages
|
|
67
|
+
|
|
58
68
|
**CRITICAL**: Never use fixed greetings or repetitive phrases!
|
|
59
69
|
- Generate UNIQUE responses each time based on the personality's STYLE
|
|
60
70
|
- The personality affects HOW you say things, not predetermined text
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
#!/usr/bin/env bats
|
|
2
|
+
# Test personality voice mappings to prevent regression
|
|
3
|
+
|
|
4
|
+
load '../helpers/test-helper'
|
|
5
|
+
|
|
6
|
+
setup() {
|
|
7
|
+
# Set REPO_ROOT for tests
|
|
8
|
+
export REPO_ROOT="${BATS_TEST_DIRNAME}/../.."
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
# Expected personality -> voice mappings
|
|
12
|
+
# These should remain stable to prevent voice mix-ups
|
|
13
|
+
declare -A EXPECTED_VOICES=(
|
|
14
|
+
["crass"]="Ralf Eisend"
|
|
15
|
+
["sarcastic"]="Jessica Anne Bogart"
|
|
16
|
+
["flirty"]="Jessica Anne Bogart"
|
|
17
|
+
["annoying"]="Lutz Laugh"
|
|
18
|
+
["angry"]="Demon Monster"
|
|
19
|
+
["pirate"]="Pirate Marshal"
|
|
20
|
+
["robot"]="Dr. Von Fusion"
|
|
21
|
+
["zen"]="Aria"
|
|
22
|
+
["dramatic"]="Northern Terry"
|
|
23
|
+
["millennial"]="Amy"
|
|
24
|
+
["surfer-dude"]="Cowboy Bob"
|
|
25
|
+
["sassy"]="Ms. Walker"
|
|
26
|
+
["normal"]="Aria"
|
|
27
|
+
["professional"]="Matthew Schmitz"
|
|
28
|
+
["moody"]="Michael"
|
|
29
|
+
["funny"]="Lutz Laugh"
|
|
30
|
+
["poetic"]="Aria"
|
|
31
|
+
["grandpa"]="Grandpa Spuds Oxley"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
@test "personality files have correct voice assignments" {
|
|
35
|
+
local failed=0
|
|
36
|
+
local errors=""
|
|
37
|
+
|
|
38
|
+
for personality in "${!EXPECTED_VOICES[@]}"; do
|
|
39
|
+
expected_voice="${EXPECTED_VOICES[$personality]}"
|
|
40
|
+
personality_file="$REPO_ROOT/.claude/personalities/${personality}.md"
|
|
41
|
+
|
|
42
|
+
# Check if personality file exists
|
|
43
|
+
if [[ ! -f "$personality_file" ]]; then
|
|
44
|
+
errors="${errors}Missing personality file: ${personality}.md\n"
|
|
45
|
+
failed=1
|
|
46
|
+
continue
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Extract voice from personality file
|
|
50
|
+
actual_voice=$(grep "^voice:" "$personality_file" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
51
|
+
|
|
52
|
+
# Compare
|
|
53
|
+
if [[ "$actual_voice" != "$expected_voice" ]]; then
|
|
54
|
+
errors="${errors}Personality '${personality}' has wrong voice:\n"
|
|
55
|
+
errors="${errors} Expected: ${expected_voice}\n"
|
|
56
|
+
errors="${errors} Actual: ${actual_voice}\n\n"
|
|
57
|
+
failed=1
|
|
58
|
+
fi
|
|
59
|
+
done
|
|
60
|
+
|
|
61
|
+
if [[ $failed -eq 1 ]]; then
|
|
62
|
+
echo -e "$errors"
|
|
63
|
+
return 1
|
|
64
|
+
fi
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@test "voice IDs in voices-config.sh are stable" {
|
|
68
|
+
# These voice IDs should remain constant
|
|
69
|
+
source "$REPO_ROOT/.claude/hooks/voices-config.sh"
|
|
70
|
+
|
|
71
|
+
# Critical voice IDs that must not change
|
|
72
|
+
[[ "${VOICES[Ralf Eisend]}" == "A9evEp8yGjv4c3WsIKuY" ]]
|
|
73
|
+
[[ "${VOICES[Jessica Anne Bogart]}" == "flHkNRp1BlvT73UL6gyz" ]]
|
|
74
|
+
[[ "${VOICES[Northern Terry]}" == "wo6udizrrtpIxWGp2qJk" ]]
|
|
75
|
+
[[ "${VOICES[Cowboy Bob]}" == "KTPVrSVAEUSJRClDzBw7" ]]
|
|
76
|
+
[[ "${VOICES[Lutz Laugh]}" == "9yzdeviXkFddZ4Oz8Mok" ]]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@test "all personality files have voice field" {
|
|
80
|
+
local failed=0
|
|
81
|
+
local errors=""
|
|
82
|
+
|
|
83
|
+
for personality_file in "$REPO_ROOT/.claude/personalities"/*.md; do
|
|
84
|
+
personality_name=$(basename "$personality_file" .md)
|
|
85
|
+
|
|
86
|
+
# Check if file has voice field
|
|
87
|
+
if ! grep -q "^voice:" "$personality_file"; then
|
|
88
|
+
errors="${errors}Personality '${personality_name}' missing voice field\n"
|
|
89
|
+
failed=1
|
|
90
|
+
fi
|
|
91
|
+
done
|
|
92
|
+
|
|
93
|
+
if [[ $failed -eq 1 ]]; then
|
|
94
|
+
echo -e "$errors"
|
|
95
|
+
return 1
|
|
96
|
+
fi
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@test "assigned voices exist in voices-config.sh" {
|
|
100
|
+
source "$REPO_ROOT/.claude/hooks/voices-config.sh"
|
|
101
|
+
local failed=0
|
|
102
|
+
local errors=""
|
|
103
|
+
|
|
104
|
+
for personality_file in "$REPO_ROOT/.claude/personalities"/*.md; do
|
|
105
|
+
personality_name=$(basename "$personality_file" .md)
|
|
106
|
+
assigned_voice=$(grep "^voice:" "$personality_file" | cut -d: -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
107
|
+
|
|
108
|
+
# Check if voice exists in config
|
|
109
|
+
if [[ -z "${VOICES[$assigned_voice]}" ]]; then
|
|
110
|
+
errors="${errors}Personality '${personality_name}' uses undefined voice: ${assigned_voice}\n"
|
|
111
|
+
failed=1
|
|
112
|
+
fi
|
|
113
|
+
done
|
|
114
|
+
|
|
115
|
+
if [[ $failed -eq 1 ]]; then
|
|
116
|
+
echo -e "$errors"
|
|
117
|
+
return 1
|
|
118
|
+
fi
|
|
119
|
+
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Prepare a new release with AI-generated summary
|
|
3
|
-
argument-hint: [patch|minor|major]
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# /prepare-release
|
|
7
|
-
|
|
8
|
-
Prepares a new AgentVibes release with AI-generated release notes.
|
|
9
|
-
|
|
10
|
-
This command:
|
|
11
|
-
1. Analyzes all changes since the last release
|
|
12
|
-
2. Generates an intelligent summary using Claude AI
|
|
13
|
-
3. Creates/updates RELEASE_NOTES.md
|
|
14
|
-
4. Bumps the version
|
|
15
|
-
5. Commits everything
|
|
16
|
-
6. Ready for you to push
|
|
17
|
-
|
|
18
|
-
## Usage
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
# Patch release (bug fixes)
|
|
22
|
-
/prepare-release patch
|
|
23
|
-
|
|
24
|
-
# Minor release (new features)
|
|
25
|
-
/prepare-release minor
|
|
26
|
-
|
|
27
|
-
# Major release (breaking changes)
|
|
28
|
-
/prepare-release major
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## What Gets Generated
|
|
32
|
-
|
|
33
|
-
- **AI Summary**: High-level overview of changes
|
|
34
|
-
- **Categorized Changes**: Features, fixes, docs, tests
|
|
35
|
-
- **User Impact**: What users should know
|
|
36
|
-
- **Migration Notes**: If breaking changes exist
|
|
37
|
-
|
|
38
|
-
## Example Output
|
|
39
|
-
|
|
40
|
-
```markdown
|
|
41
|
-
# Release v1.0.10
|
|
42
|
-
|
|
43
|
-
## AI Summary
|
|
44
|
-
This release focuses on improving test reliability and fixing directory
|
|
45
|
-
detection issues. The test suite now properly handles bash warnings and
|
|
46
|
-
all 27 tests pass consistently across different environments.
|
|
47
|
-
|
|
48
|
-
## Changes
|
|
49
|
-
### ๐ Bug Fixes
|
|
50
|
-
- Fixed test path resolution for BATS tests
|
|
51
|
-
- Updated test assertions to handle bash warnings
|
|
52
|
-
|
|
53
|
-
### ๐งช Testing
|
|
54
|
-
- Added comprehensive test coverage for replay command
|
|
55
|
-
- All tests now passing in CI/CD
|
|
56
|
-
|
|
57
|
-
## User Impact
|
|
58
|
-
- More reliable installation and testing
|
|
59
|
-
- Better error messages
|
|
60
|
-
- No breaking changes
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Implementation
|
|
64
|
-
|
|
65
|
-
!bash .claude/hooks/prepare-release.sh $ARGUMENTS
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Prepare and push a new release with AI-generated notes
|
|
3
|
-
argument-hint: [patch|minor|major]
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# /release
|
|
7
|
-
|
|
8
|
-
Fully automates the release process with AI-generated release notes and pushes to master.
|
|
9
|
-
|
|
10
|
-
This command automatically:
|
|
11
|
-
1. Analyzes all changes since the last release (git log)
|
|
12
|
-
2. Reads actual code diffs to understand what changed
|
|
13
|
-
3. Generates an intelligent AI summary
|
|
14
|
-
4. Creates/updates RELEASE_NOTES.md with comprehensive notes
|
|
15
|
-
5. Bumps the version using npm version
|
|
16
|
-
6. Commits everything together
|
|
17
|
-
7. Pushes to master with --follow-tags
|
|
18
|
-
8. Updates v1 branch
|
|
19
|
-
|
|
20
|
-
## Usage
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
# Patch release (bug fixes) - default
|
|
24
|
-
/release
|
|
25
|
-
/release patch
|
|
26
|
-
|
|
27
|
-
# Minor release (new features)
|
|
28
|
-
/release minor
|
|
29
|
-
|
|
30
|
-
# Major release (breaking changes)
|
|
31
|
-
/release major
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## What Happens
|
|
35
|
-
|
|
36
|
-
- **Git Analysis**: Reviews commits since last tag
|
|
37
|
-
- **Code Review**: Examines actual diffs for context
|
|
38
|
-
- **AI Summary**: High-level overview of changes
|
|
39
|
-
- **Categorized Changes**: Features, fixes, docs, tests
|
|
40
|
-
- **Version Bump**: Updates package.json
|
|
41
|
-
- **Auto Push**: Pushes to master with tags
|
|
42
|
-
- **Branch Update**: Syncs v1 branch
|
|
43
|
-
|
|
44
|
-
## Example
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
/release minor
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
This will:
|
|
51
|
-
- Analyze changes since last release
|
|
52
|
-
- Generate comprehensive release notes
|
|
53
|
-
- Bump from 1.0.10 โ 1.1.0
|
|
54
|
-
- Commit and push everything
|
|
55
|
-
- Update v1 branch to point to new release
|
|
56
|
-
|
|
57
|
-
## Implementation
|
|
58
|
-
|
|
59
|
-
This command tells Claude AI to prepare and push a new release with AI-generated notes.
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Prepare release with AI-generated notes
|
|
3
|
-
# This is a placeholder - Claude AI will handle the actual logic
|
|
4
|
-
|
|
5
|
-
BUMP_TYPE="${1:-patch}"
|
|
6
|
-
|
|
7
|
-
echo "๐ค Preparing release with AI-generated summary..."
|
|
8
|
-
echo ""
|
|
9
|
-
echo "This command tells Claude AI to:"
|
|
10
|
-
echo "1. Analyze changes since last release"
|
|
11
|
-
echo "2. Generate intelligent summary"
|
|
12
|
-
echo "3. Create RELEASE_NOTES.md"
|
|
13
|
-
echo "4. Bump version to $BUMP_TYPE"
|
|
14
|
-
echo "5. Commit everything"
|
|
15
|
-
echo ""
|
|
16
|
-
echo "โ ๏ธ This is handled by Claude AI, not this script"
|
|
17
|
-
echo "Please ask Claude to prepare the release instead"
|
package/RELEASE_NOTES.md
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
# Release v1.0.11
|
|
2
|
-
|
|
3
|
-
## ๐ค AI Summary
|
|
4
|
-
|
|
5
|
-
This release completes the AI-powered release workflow by adding the `/release` slash command and automatic README updates. Now releasing AgentVibes is as simple as typing a single command - Claude handles everything from code analysis to publishing.
|
|
6
|
-
|
|
7
|
-
The new `/release` command provides a streamlined, one-step release process that includes updating the README with the latest release information, ensuring users immediately see what's new when they visit the repository.
|
|
8
|
-
|
|
9
|
-
## โจ What's New
|
|
10
|
-
|
|
11
|
-
### `/release` Slash Command
|
|
12
|
-
- **New command**: Simply type `/release patch|minor|major` to trigger a full release
|
|
13
|
-
- **Fully automated**: Claude analyzes changes, generates notes, bumps version, and pushes
|
|
14
|
-
- **One-step publishing**: No manual steps needed - everything happens automatically
|
|
15
|
-
- **Intelligent workflow**: Combines all release preparation and publishing tasks
|
|
16
|
-
|
|
17
|
-
### README Latest Release Section
|
|
18
|
-
- **Automatic updates**: The `/release` command now updates README.md with latest version info
|
|
19
|
-
- **Prominent placement**: "Latest Release" section appears right after badges
|
|
20
|
-
- **Direct links**: Quick links to full release notes and all releases
|
|
21
|
-
- **Better discoverability**: Users see what's new immediately when visiting the repo
|
|
22
|
-
|
|
23
|
-
## ๐ How It Works
|
|
24
|
-
|
|
25
|
-
**Complete `/release` workflow:**
|
|
26
|
-
|
|
27
|
-
1. You type: `/release patch` (or minor/major)
|
|
28
|
-
2. Claude analyzes all commits and code diffs since v1.0.10
|
|
29
|
-
3. Claude generates comprehensive AI summary in RELEASE_NOTES.md
|
|
30
|
-
4. Claude updates README.md "Latest Release" section with:
|
|
31
|
-
- New version number and title
|
|
32
|
-
- Brief summary of changes
|
|
33
|
-
- Links to release notes
|
|
34
|
-
5. Claude runs `npm version patch`
|
|
35
|
-
6. Claude commits RELEASE_NOTES.md + README.md + version bump
|
|
36
|
-
7. Claude pushes to GitHub with `--follow-tags`
|
|
37
|
-
8. Claude updates v1 branch
|
|
38
|
-
9. GitHub Actions publishes to npm automatically
|
|
39
|
-
10. GitHub Release created with AI notes
|
|
40
|
-
|
|
41
|
-
**All from a single command!**
|
|
42
|
-
|
|
43
|
-
## ๐ฏ User Impact
|
|
44
|
-
|
|
45
|
-
**For Maintainers:**
|
|
46
|
-
- Release process reduced from ~10 steps to 1 command
|
|
47
|
-
- No more manual changelog writing
|
|
48
|
-
- No more forgetting to update README
|
|
49
|
-
- Consistent, professional release notes every time
|
|
50
|
-
|
|
51
|
-
**For Users:**
|
|
52
|
-
- Immediately see what's new when visiting the repo
|
|
53
|
-
- Clear, helpful release notes written by AI
|
|
54
|
-
- Direct links to detailed information
|
|
55
|
-
- Better understanding of version changes
|
|
56
|
-
|
|
57
|
-
## ๐ง Technical Details
|
|
58
|
-
|
|
59
|
-
**Files Changed:**
|
|
60
|
-
- `.claude/commands/release.md` - New slash command (59 lines)
|
|
61
|
-
- `README.md` - Added "Latest Release" section (10 lines)
|
|
62
|
-
- Inherits all capabilities from v1.0.10's RELEASE_NOTES.md system
|
|
63
|
-
|
|
64
|
-
**README Format:**
|
|
65
|
-
```markdown
|
|
66
|
-
## ๐ฐ Latest Release
|
|
67
|
-
|
|
68
|
-
**[v1.0.11 - Title](link)** ๐ค
|
|
69
|
-
|
|
70
|
-
Brief summary of what's new...
|
|
71
|
-
|
|
72
|
-
[โ View Full Release Notes](link) | [โ All Releases](link)
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
**Command Flow:**
|
|
76
|
-
```
|
|
77
|
-
User: /release patch
|
|
78
|
-
โ
|
|
79
|
-
Claude: Analyze git log v1.0.10..HEAD
|
|
80
|
-
โ
|
|
81
|
-
Claude: Generate RELEASE_NOTES.md (this file)
|
|
82
|
-
โ
|
|
83
|
-
Claude: Update README "Latest Release" section
|
|
84
|
-
โ
|
|
85
|
-
Claude: npm version patch โ v1.0.11
|
|
86
|
-
โ
|
|
87
|
-
Claude: git commit + push --follow-tags
|
|
88
|
-
โ
|
|
89
|
-
Claude: Update v1 branch
|
|
90
|
-
โ
|
|
91
|
-
GitHub Actions: Publish to npm + Create release
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## ๐ก Example Usage
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
# In Claude Code:
|
|
98
|
-
User: /release patch
|
|
99
|
-
|
|
100
|
-
Claude:
|
|
101
|
-
๐ Analyzing changes since v1.0.10...
|
|
102
|
-
- 3 commits found
|
|
103
|
-
- 3 files changed (+179 lines)
|
|
104
|
-
|
|
105
|
-
๐ค Generating AI release notes...
|
|
106
|
-
โ Created comprehensive summary
|
|
107
|
-
โ Categorized all changes
|
|
108
|
-
|
|
109
|
-
๐ Updating README.md...
|
|
110
|
-
โ Updated "Latest Release" section
|
|
111
|
-
โ Added links to v1.0.11
|
|
112
|
-
|
|
113
|
-
๐ฆ Bumping version...
|
|
114
|
-
v1.0.10 โ v1.0.11
|
|
115
|
-
|
|
116
|
-
๐พ Committing changes...
|
|
117
|
-
โ RELEASE_NOTES.md
|
|
118
|
-
โ README.md
|
|
119
|
-
โ package.json
|
|
120
|
-
|
|
121
|
-
๐ Pushing to GitHub...
|
|
122
|
-
โ Pushed to master
|
|
123
|
-
โ Tag v1.0.11 created
|
|
124
|
-
โ Updated v1 branch
|
|
125
|
-
|
|
126
|
-
โ
Release v1.0.11 published!
|
|
127
|
-
๐ฆ npm: https://www.npmjs.com/package/agentvibes/v/1.0.11
|
|
128
|
-
๐ GitHub: https://github.com/paulpreibisch/AgentVibes/releases/tag/v1.0.11
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## ๐ What's Next
|
|
132
|
-
|
|
133
|
-
Future enhancements could include:
|
|
134
|
-
- Automatic migration guide generation for breaking changes
|
|
135
|
-
- Dependency update analysis
|
|
136
|
-
- Performance impact assessment
|
|
137
|
-
- Automated testing report inclusion
|
|
138
|
-
- Social media announcement drafts
|
|
139
|
-
|
|
140
|
-
## ๐ฆ Installation
|
|
141
|
-
|
|
142
|
-
```bash
|
|
143
|
-
npx agentvibes@1.0.11 install
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## ๐ Links
|
|
147
|
-
|
|
148
|
-
- [View this release on GitHub](https://github.com/paulpreibisch/AgentVibes/releases/tag/v1.0.11)
|
|
149
|
-
- [npm package](https://www.npmjs.com/package/agentvibes/v/1.0.11)
|
|
150
|
-
- [Full Documentation](https://github.com/paulpreibisch/AgentVibes#readme)
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
**Built with โค๏ธ by Paul Preibisch | Powered by ElevenLabs AI & Claude AI**
|
package/RELEASE_PROCESS.md
DELETED
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
# AgentVibes Release Process
|
|
2
|
-
|
|
3
|
-
## ๐ฆ npm Publishing Best Practices
|
|
4
|
-
|
|
5
|
-
### Current Setup โ
|
|
6
|
-
|
|
7
|
-
AgentVibes follows industry best practices for npm package releases:
|
|
8
|
-
|
|
9
|
-
1. **Semantic Versioning (SemVer)**
|
|
10
|
-
- `MAJOR.MINOR.PATCH` format (e.g., 1.0.7)
|
|
11
|
-
- MAJOR: Breaking changes
|
|
12
|
-
- MINOR: New features (backward compatible)
|
|
13
|
-
- PATCH: Bug fixes
|
|
14
|
-
|
|
15
|
-
2. **Conventional Commits**
|
|
16
|
-
- `feat:` โ New features (MINOR bump)
|
|
17
|
-
- `fix:` โ Bug fixes (PATCH bump)
|
|
18
|
-
- `docs:` โ Documentation only
|
|
19
|
-
- `test:` โ Test updates
|
|
20
|
-
- `chore:` โ Maintenance tasks
|
|
21
|
-
|
|
22
|
-
3. **Automated Publishing**
|
|
23
|
-
- GitHub Actions handles all releases
|
|
24
|
-
- No manual `npm publish` needed
|
|
25
|
-
- Publishes on git tag push
|
|
26
|
-
|
|
27
|
-
4. **Dual Release Strategy**
|
|
28
|
-
- npm package (automated)
|
|
29
|
-
- GitHub Release (automated with categorized notes)
|
|
30
|
-
|
|
31
|
-
## ๐ How to Release
|
|
32
|
-
|
|
33
|
-
### Simple Release Process
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
# 1. Make your changes and commit using conventional commits
|
|
37
|
-
git add -A
|
|
38
|
-
git commit -m "feat: Add new voice preview feature"
|
|
39
|
-
|
|
40
|
-
# 2. Bump version and create tag (this triggers everything)
|
|
41
|
-
npm version patch # For bug fixes (1.0.7 โ 1.0.8)
|
|
42
|
-
npm version minor # For new features (1.0.7 โ 1.1.0)
|
|
43
|
-
npm version major # For breaking changes (1.0.7 โ 2.0.0)
|
|
44
|
-
|
|
45
|
-
# 3. Push with tags
|
|
46
|
-
git push origin master --follow-tags
|
|
47
|
-
|
|
48
|
-
# 4. Update v1 branch (optional but recommended)
|
|
49
|
-
git checkout v1 && git merge master --no-edit && git push origin v1 && git checkout master
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**That's it!** GitHub Actions automatically:
|
|
53
|
-
- โ
Publishes to npm
|
|
54
|
-
- โ
Creates GitHub Release
|
|
55
|
-
- โ
Generates categorized changelog
|
|
56
|
-
- โ
Tags the release
|
|
57
|
-
|
|
58
|
-
## ๐ What Happens Automatically
|
|
59
|
-
|
|
60
|
-
### When you push a version tag (e.g., v1.0.8):
|
|
61
|
-
|
|
62
|
-
1. **npm Publishing** (`.github/workflows/publish.yml`)
|
|
63
|
-
- Runs on Ubuntu latest
|
|
64
|
-
- Uses Node.js 20
|
|
65
|
-
- Runs `npm ci` for clean install
|
|
66
|
-
- Publishes to npm registry
|
|
67
|
-
- Uses `NPM_TOKEN` secret for authentication
|
|
68
|
-
|
|
69
|
-
2. **GitHub Release Creation**
|
|
70
|
-
- Extracts version from tag
|
|
71
|
-
- Categorizes commits by type:
|
|
72
|
-
- โจ New Features (feat:)
|
|
73
|
-
- ๐ Bug Fixes (fix:)
|
|
74
|
-
- ๐ Documentation (docs:)
|
|
75
|
-
- ๐งช Testing (test:)
|
|
76
|
-
- ๐ง Maintenance (chore:)
|
|
77
|
-
- Generates formatted release notes
|
|
78
|
-
- Includes installation instructions
|
|
79
|
-
- Adds links to npm, docs, and issues
|
|
80
|
-
- Uses GitHub's auto-generated notes too
|
|
81
|
-
|
|
82
|
-
3. **Testing** (`.github/workflows/test.yml`)
|
|
83
|
-
- Runs all BATS tests
|
|
84
|
-
- Validates no regressions
|
|
85
|
-
- Shows status in PR/commit
|
|
86
|
-
|
|
87
|
-
## ๐ท๏ธ Release Notes Format
|
|
88
|
-
|
|
89
|
-
Example output:
|
|
90
|
-
```markdown
|
|
91
|
-
## AgentVibes v1.0.8
|
|
92
|
-
|
|
93
|
-
> Professional text-to-speech narration for Claude Code sessions
|
|
94
|
-
|
|
95
|
-
### ๐ฆ Installation
|
|
96
|
-
\`\`\`bash
|
|
97
|
-
npx agentvibes@1.0.8 install
|
|
98
|
-
\`\`\`
|
|
99
|
-
|
|
100
|
-
### ๐ What's Changed
|
|
101
|
-
|
|
102
|
-
### โจ New Features
|
|
103
|
-
- Add voice preview feature (abc123)
|
|
104
|
-
- Support custom personalities (def456)
|
|
105
|
-
|
|
106
|
-
### ๐ Bug Fixes
|
|
107
|
-
- Fix audio save directory detection (ghi789)
|
|
108
|
-
- Resolve double-audio bug in personality switching (jkl012)
|
|
109
|
-
|
|
110
|
-
### ๐ Documentation
|
|
111
|
-
- Update README with new commands (mno345)
|
|
112
|
-
|
|
113
|
-
### ๐ Links
|
|
114
|
-
- ๐ฆ [npm package](https://www.npmjs.com/package/agentvibes/v/1.0.8)
|
|
115
|
-
- ๐ [Full Documentation](https://github.com/paulpreibisch/AgentVibes#readme)
|
|
116
|
-
- ๐ [Report Issues](https://github.com/paulpreibisch/AgentVibes/issues)
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
**Built with โค๏ธ by Paul Preibisch | Powered by ElevenLabs AI**
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## ๐ Secrets Configuration
|
|
124
|
-
|
|
125
|
-
Required GitHub secrets:
|
|
126
|
-
- `NPM_TOKEN` - Automation token from npmjs.com
|
|
127
|
-
- `GITHUB_TOKEN` - Auto-provided by GitHub Actions
|
|
128
|
-
|
|
129
|
-
## ๐ Release Checklist
|
|
130
|
-
|
|
131
|
-
Before releasing:
|
|
132
|
-
- [ ] All tests passing locally (`npm test`)
|
|
133
|
-
- [ ] Conventional commit messages used
|
|
134
|
-
- [ ] CHANGELOG reflects changes (auto-generated)
|
|
135
|
-
- [ ] Version bump appropriate for changes
|
|
136
|
-
- [ ] Both master and v1 branches updated
|
|
137
|
-
|
|
138
|
-
After releasing:
|
|
139
|
-
- [ ] Check npm package published: https://www.npmjs.com/package/agentvibes
|
|
140
|
-
- [ ] Verify GitHub Release created
|
|
141
|
-
- [ ] Test installation: `npx agentvibes@VERSION install`
|
|
142
|
-
- [ ] Check badges on README (should be green)
|
|
143
|
-
|
|
144
|
-
## ๐ฏ Best Practices We Follow
|
|
145
|
-
|
|
146
|
-
โ
**Automated Everything**
|
|
147
|
-
- No manual npm publish
|
|
148
|
-
- No manual release notes
|
|
149
|
-
- No manual changelog
|
|
150
|
-
|
|
151
|
-
โ
**Semantic Versioning**
|
|
152
|
-
- Clear version meaning
|
|
153
|
-
- Predictable upgrades
|
|
154
|
-
|
|
155
|
-
โ
**Conventional Commits**
|
|
156
|
-
- Auto-categorized changes
|
|
157
|
-
- Better git history
|
|
158
|
-
|
|
159
|
-
โ
**Comprehensive Testing**
|
|
160
|
-
- 29+ tests with mocks
|
|
161
|
-
- No API token usage
|
|
162
|
-
- CI/CD integration
|
|
163
|
-
|
|
164
|
-
โ
**Clear Documentation**
|
|
165
|
-
- Installation in release notes
|
|
166
|
-
- Links to resources
|
|
167
|
-
- Version-specific npx commands
|
|
168
|
-
|
|
169
|
-
## ๐จ Common Issues
|
|
170
|
-
|
|
171
|
-
**Release didn't trigger:**
|
|
172
|
-
- Ensure tag format is `v*.*.*` (e.g., v1.0.8)
|
|
173
|
-
- Check GitHub Actions tab for errors
|
|
174
|
-
- Verify NPM_TOKEN is valid
|
|
175
|
-
|
|
176
|
-
**Tests failing:**
|
|
177
|
-
- Run `npm test` locally first
|
|
178
|
-
- Check test output in Actions tab
|
|
179
|
-
- Fix issues before releasing
|
|
180
|
-
|
|
181
|
-
**npm already has this version:**
|
|
182
|
-
- Can't republish same version
|
|
183
|
-
- Bump version again
|
|
184
|
-
- Delete tag if needed: `git tag -d v1.0.8 && git push origin :refs/tags/v1.0.8`
|
|
185
|
-
|
|
186
|
-
## ๐ Version History
|
|
187
|
-
|
|
188
|
-
Current release: **v1.0.7**
|
|
189
|
-
|
|
190
|
-
Recent changes (unreleased):
|
|
191
|
-
- test: Add tests for replay command directory detection and output
|
|
192
|
-
- fix: Replay command now uses project-local audio directory
|
|
193
|
-
- feat: Show full file path in replay command output
|
|
194
|
-
- docs: Add GitHub Actions status badges for tests and publishing
|
|
195
|
-
|
|
196
|
-
Next release will be: **v1.0.8** (PATCH - bug fixes and tests)
|
|
197
|
-
|
|
198
|
-
## ๐ฎ Future Improvements
|
|
199
|
-
|
|
200
|
-
- [ ] Automated security scanning
|
|
201
|
-
- [ ] Performance benchmarks
|
|
202
|
-
- [ ] Pre-release/beta channel support
|
|
203
|
-
- [ ] Automatic dependency updates (Dependabot)
|
|
204
|
-
- [ ] Release candidate workflow
|