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.
@@ -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
- # Generate personality-appropriate remark based on personality type
132
- case "$PERSONALITY" in
133
- sarcastic)
134
- # Randomly pick from varied sarcastic remarks
135
- REMARKS=(
136
- "Wow, a personality change. This is the highlight of my day. Truly."
137
- "Fascinating. We're doing sarcasm now. How delightfully predictable."
138
- "Great, sarcastic mode. Because subtlety was clearly overrated."
139
- "Could this BE any more sarcastic? Well, yes. Yes it could."
140
- "Sarcasm enabled. Try to contain your excitement."
141
- "And now I'm sarcastic. What a thrilling plot twist."
142
- )
143
- REMARK="${REMARKS[$RANDOM % ${#REMARKS[@]}]}"
144
- echo "๐Ÿ’ฌ $REMARK"
145
- "$TTS_SCRIPT" "$REMARK"
146
- ;;
147
- flirty)
148
- REMARKS=(
149
- "Ooh, flirty mode activated. This should be fun, sweetheart~"
150
- "Well aren't you in for a treat, gorgeous~"
151
- "Mmm, I like where this is going, darling~"
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
- case "$SENTIMENT" in
94
- sarcastic)
95
- REMARKS=(
96
- "Oh great, sarcasm mode while keeping the same voice. Revolutionary."
97
- "Fascinating. Same voice, sarcastic attitude. This'll be fun."
98
- "Wow, adding sarcasm to my current voice. What a concept."
99
- )
100
- REMARK="${REMARKS[$RANDOM % ${#REMARKS[@]}]}"
101
- ;;
102
- flirty)
103
- REMARKS=(
104
- "Ooh, keeping my voice but adding some flirtation~ I like it, darling~"
105
- "Mmm, same voice with a flirty twist? You know how to keep things interesting~"
106
- "Well hello~ Flirty sentiment activated, gorgeous~"
107
- )
108
- REMARK="${REMARKS[$RANDOM % ${#REMARKS[@]}]}"
109
- ;;
110
- angry)
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 responses:
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"
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: normal
3
3
  description: Professional and clear communication
4
+ voice: Aria
4
5
  ---
5
6
 
6
7
  # Normal Personality
package/README.md CHANGED
@@ -15,11 +15,11 @@
15
15
 
16
16
  ## ๐Ÿ“ฐ Latest Release
17
17
 
18
- **[v1.0.11 - /release Command & README Integration](https://github.com/paulpreibisch/AgentVibes/releases/tag/v1.0.11)** ๐Ÿš€
18
+ **[v1.0.13 - Detailed Release Notes](https://github.com/paulpreibisch/AgentVibes/releases/tag/v1.0.13)** ๐Ÿ›
19
19
 
20
- Complete the AI-powered release workflow with a single `/release` command that automatically updates README, generates AI notes, and publishes to npm.
20
+ Critical bug fixes for update command and personality system, plus new dry humor personality and comprehensive voice mapping tests.
21
21
 
22
- [โ†’ View Full Release Notes](https://github.com/paulpreibisch/AgentVibes/releases/tag/v1.0.11) | [โ†’ All Releases](https://github.com/paulpreibisch/AgentVibes/releases)
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
- - ๐ŸŽญ **18 Built-in Personalities** - From sarcastic to flirty, pirate to professional
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.11",
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, '..', 'templates', 'output-styles');
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 responses:
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**
@@ -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