agentvibes 2.17.0 → 2.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/.claude/commands/release.md +7 -4
  2. package/.claude/config/audio-effects.cfg +1 -1
  3. package/.claude/config/audio-effects.cfg.sample +1 -1
  4. package/.claude/hooks/play-tts-piper.sh +11 -6
  5. package/.claude/hooks/voice-manager.sh +8 -5
  6. package/README.md +9 -9
  7. package/package.json +9 -2
  8. package/src/cli/list-voices.js +1 -1
  9. package/src/installer.js +13 -9
  10. package/src/utils/dependency-checker.js +1 -1
  11. package/mcp-server/bmad-bundles/team-all-original.txt +0 -12880
  12. package/mcp-server/bmad-bundles/team-no-ui-original.txt +0 -9007
  13. package/mcp-server/bmad-bundles/team-planning-original.txt +0 -10454
  14. package/mcp-server/voices/16Speakers.onnx +0 -0
  15. package/mcp-server/voices/16Speakers.onnx.json +0 -514
  16. package/mcp-server/voices/jenny.onnx +0 -0
  17. package/mcp-server/voices/jenny.onnx.json +0 -497
  18. package/mcp-server/voices/kristin.onnx +0 -0
  19. package/mcp-server/voices/kristin.onnx.json +0 -497
  20. package/mcp-server/voices/preview-16speakers.sh +0 -62
  21. package/mcp-server/voices/previews/speaker_0_Cori_Samuel.wav +0 -0
  22. package/mcp-server/voices/previews/speaker_10_Steve_C.wav +0 -0
  23. package/mcp-server/voices/previews/speaker_11_Owlivia.wav +0 -0
  24. package/mcp-server/voices/previews/speaker_12_Paul_Hampton.wav +0 -0
  25. package/mcp-server/voices/previews/speaker_13_Jennifer_Dorr.wav +0 -0
  26. package/mcp-server/voices/previews/speaker_14_Emily_Cripps.wav +0 -0
  27. package/mcp-server/voices/previews/speaker_15_Martin_Clifton.wav +0 -0
  28. package/mcp-server/voices/previews/speaker_1_Kara_Shallenberg.wav +0 -0
  29. package/mcp-server/voices/previews/speaker_2_Kristin_Hughes.wav +0 -0
  30. package/mcp-server/voices/previews/speaker_3_Maria_Kasper.wav +0 -0
  31. package/mcp-server/voices/previews/speaker_4_Mike_Pelton.wav +0 -0
  32. package/mcp-server/voices/previews/speaker_5_Mark_Nelson.wav +0 -0
  33. package/mcp-server/voices/previews/speaker_6_Michael_Scherer.wav +0 -0
  34. package/mcp-server/voices/previews/speaker_7_James_K_White.wav +0 -0
  35. package/mcp-server/voices/previews/speaker_8_Rose_Ibex.wav +0 -0
  36. package/mcp-server/voices/previews/speaker_9_progressingamerica.wav +0 -0
@@ -264,10 +264,13 @@ When executing this command, Claude MUST follow these steps in order:
264
264
  - Replace the "WHAT'S NEW" summary (2-4 sentences from RELEASE_NOTES.md AI Summary)
265
265
  - Replace all "KEY HIGHLIGHTS" bullets (extract from RELEASE_NOTES.md)
266
266
  - Keep the same format/structure, just update content
267
- 6. **Update README.md**:
268
- - Update version badge in header (line ~14)
269
- - Update "Latest Release" section (line ~95+) with new title and summary
270
- - Update key highlights list
267
+ 6. **Update README.md** ⚠️ **CRITICAL - Must complete BEFORE npm publish**:
268
+ - Update version badge in header (line ~14): `**Version**: v2.X.X`
269
+ - Update "Latest Release" section (line ~112+):
270
+ - Replace the title and URL: `**[vX.X.X - Release Title](github.com/...)**`
271
+ - Replace the AI summary paragraph (first paragraph after title)
272
+ - Replace all "Key Highlights" bullet points (extract from RELEASE_NOTES.md)
273
+ - This ensures GitHub README and npm package page show correct version
271
274
  7. **Human Review Checkpoint 2**: Show what will be updated, wait for approval
272
275
  8. **Bump package.json**: Use npm version (patch/minor/major)
273
276
  9. **Commit all changes**: Single commit with RELEASE_NOTES.md, installer.js, README.md, package.json
@@ -49,4 +49,4 @@ BMad Master|reverb 50 60 100 pitch -100|agentvibes_soft_flamenco_loop.mp3|0.30
49
49
  _party_mode|compand 0.3,1 6:-70,-60,-20|agent_vibes_dark_chill_step_loop.mp3|0.40
50
50
 
51
51
  # Default (no agent specified) - clean with subtle enhancement and chillwave background
52
- default|gain -8|agent_vibes_chillwave_v2_loop.mp3|0.30
52
+ default||agentvibes_soft_flamenco_loop.mp3|0.30
@@ -49,4 +49,4 @@ BMad Master|reverb 50 60 100 pitch -100|agentvibes_soft_flamenco_loop.mp3|0.30
49
49
  _party_mode|compand 0.3,1 6:-70,-60,-20|agent_vibes_dark_chill_step_loop.mp3|0.40
50
50
 
51
51
  # Default (no agent specified) - clean with subtle enhancement and chillwave background
52
- default|gain -8|agentvibes_soft_flamenco_loop.mp3|0.30
52
+ default||agentvibes_soft_flamenco_loop.mp3|0.30
@@ -140,8 +140,8 @@ fi
140
140
  # @why Provide seamless experience with automatic downloads
141
141
  # @param Uses global: $VOICE_MODEL
142
142
  # @sideeffects Downloads voice model files
143
- # @edgecases Prompts user for consent before downloading
144
- if ! verify_voice "$VOICE_MODEL"; then
143
+ # @edgecases Prompts user for consent before downloading, skipped in test mode
144
+ if [[ "${AGENTVIBES_TEST_MODE:-false}" != "true" ]] && ! verify_voice "$VOICE_MODEL"; then
145
145
  echo "📥 Voice model not found: $VOICE_MODEL"
146
146
  echo " File size: ~25MB"
147
147
  echo " Preview: https://huggingface.co/rhasspy/piper-voices"
@@ -162,10 +162,15 @@ if ! verify_voice "$VOICE_MODEL"; then
162
162
  fi
163
163
 
164
164
  # Get voice model path
165
- VOICE_PATH=$(get_voice_path "$VOICE_MODEL")
166
- if [[ $? -ne 0 ]]; then
167
- echo "❌ Voice model path not found: $VOICE_MODEL"
168
- exit 3
165
+ # In test mode, use a fake path since we have mock piper that doesn't need real files
166
+ if [[ "${AGENTVIBES_TEST_MODE:-false}" == "true" ]]; then
167
+ VOICE_PATH="/tmp/mock-voice-${VOICE_MODEL}.onnx"
168
+ else
169
+ VOICE_PATH=$(get_voice_path "$VOICE_MODEL")
170
+ if [[ $? -ne 0 ]]; then
171
+ echo "❌ Voice model path not found: $VOICE_MODEL"
172
+ exit 3
173
+ fi
169
174
  fi
170
175
 
171
176
  # @function determine_audio_directory
@@ -312,7 +312,8 @@ case "$1" in
312
312
  fi
313
313
  fi
314
314
 
315
- if [[ -z "$FOUND" ]]; then
315
+ # In test mode, allow switching to any voice name without file validation
316
+ if [[ -z "$FOUND" ]] && [[ "${AGENTVIBES_TEST_MODE:-false}" != "true" ]]; then
316
317
  echo "❌ Piper voice not found: $VOICE_NAME"
317
318
  echo ""
318
319
  echo "Available Piper voices:"
@@ -347,15 +348,17 @@ case "$1" in
347
348
  exit 1
348
349
  fi
349
350
 
350
- echo "$FOUND" > "$VOICE_FILE"
351
- echo "✅ Voice switched to: $FOUND"
351
+ # In test mode, use the requested voice name even if not found
352
+ VOICE_TO_SAVE="${FOUND:-$VOICE_NAME}"
353
+ echo "$VOICE_TO_SAVE" > "$VOICE_FILE"
354
+ echo "✅ Voice switched to: $VOICE_TO_SAVE"
352
355
 
353
356
  # Have the new voice introduce itself (unless silent mode)
354
- if [[ "$SILENT_MODE" != "true" ]]; then
357
+ if [[ "$SILENT_MODE" != "true" ]] && [[ "${AGENTVIBES_TEST_MODE:-false}" != "true" ]]; then
355
358
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
356
359
  PLAY_TTS="$SCRIPT_DIR/play-tts.sh"
357
360
  if [ -x "$PLAY_TTS" ]; then
358
- "$PLAY_TTS" "Hi, I'm $FOUND. I'll be your voice assistant moving forward." "$FOUND" > /dev/null 2>&1 &
361
+ "$PLAY_TTS" "Hi, I'm $VOICE_TO_SAVE. I'll be your voice assistant moving forward." "$VOICE_TO_SAVE" > /dev/null 2>&1 &
359
362
  fi
360
363
 
361
364
  echo ""
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![Publish](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml/badge.svg)](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
12
12
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
13
13
 
14
- **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.17.0
14
+ **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.17.2
15
15
 
16
16
  ---
17
17
 
@@ -111,17 +111,17 @@ All 50+ Piper voices AgentVibes provides are sourced from Hugging Face's open-so
111
111
 
112
112
  ## 📰 Latest Release
113
113
 
114
- **[v2.16.1 - Test Suite & Audio Quality](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.17.0)** 🎉
114
+ **[v2.17.0 - Installer UX Revolution](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.17.2)** 🎉
115
115
 
116
- AgentVibes v2.16.1 achieves 100% test pass rate (140/140 tests), fixes audio clipping issues, and completes ElevenLabs removal. Production-ready quality with comprehensive system requirements documentation.
116
+ AgentVibes v2.17.0 delivers a complete installer user experience transformation with intelligent system dependency checking, paginated configuration flow, and comprehensive inline help.
117
117
 
118
118
  **Key Highlights:**
119
- - **100% Test Pass Rate** - All 140 unit tests passing (12 critical fixes)
120
- - 🎚️ **Audio Quality Fix** - Eliminated clipping with -8 dB gain (removed compressor)
121
- - 🧹 **ElevenLabs Cleanup** - Complete removal from all tests, hooks, and MCP server
122
- - 📦 **Config Management** - Template pattern: .cfg.sample (tracked) + .cfg (gitignored)
123
- - 📖 **System Requirements** - Comprehensive docs for macOS, Linux, Windows WSL
124
- - 🔧 **Provider Updates** - MCP server now uses piper/macos validation only
119
+ - 🔧 **System Dependency Checker** - Validates Node, Python, bash, sox, ffmpeg, curl, etc.
120
+ - 📄 **Paginated Configuration** - Beautiful headers with Agent Vibes branding on every page
121
+ - 💡 **Inline Help & Commands** - TTS explanations and examples throughout installer
122
+ - 🎵 **New Music Track** - Salsa v2 background music now available
123
+ - 🎨 **Professional UI** - Consistent sunshine yellow styling and dynamic page numbering
124
+ - **Quality Assurance** - 140 tests passing, SonarCloud integration
125
125
 
126
126
  💡 **Tip:** If `npx agentvibes` shows an older version or missing commands, clear your npm cache: `npm cache clean --force && npx agentvibes@latest --help`
127
127
 
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": "2.17.0",
4
+ "version": "2.17.2",
5
5
  "description": "Now your AI Agents can finally talk back! Professional TTS voice for Claude Code and Claude Desktop (via MCP) with multi-provider support.",
6
6
  "homepage": "https://agentvibes.org",
7
7
  "keywords": [
@@ -34,7 +34,14 @@
34
34
  "files": [
35
35
  "bin/",
36
36
  "src/",
37
- "mcp-server/",
37
+ "mcp-server/*.py",
38
+ "mcp-server/*.js",
39
+ "mcp-server/*.md",
40
+ "mcp-server/*.txt",
41
+ "mcp-server/*.toml",
42
+ "mcp-server/*.json",
43
+ "mcp-server/docs/",
44
+ "mcp-server/examples/",
38
45
  ".claude/commands/",
39
46
  ".claude/hooks/",
40
47
  ".claude/personalities/",
@@ -46,7 +46,7 @@ function getMacOSVoices(currentVoice) {
46
46
  }
47
47
 
48
48
  try {
49
- const output = execFileSync('say', ['-v', '?'], { encoding: 'utf8' });
49
+ const output = execFileSync('say', ['-v', '?'], { encoding: 'utf8' }); // NOSONAR - Safe: checking macOS say voices from system PATH
50
50
  const lines = output.split('\n');
51
51
 
52
52
  for (const line of lines) {
package/src/installer.js CHANGED
@@ -721,15 +721,15 @@ async function playWelcomeDemo(targetDir, spinner, options = {}) {
721
721
  let audioPlayer = null;
722
722
 
723
723
  try {
724
- execSync('which paplay 2>/dev/null', { stdio: 'pipe' });
724
+ execSync('which paplay 2>/dev/null', { stdio: 'pipe' }); // NOSONAR - Safe: checking system PATH for audio player
725
725
  audioPlayer = 'paplay';
726
726
  } catch {
727
727
  try {
728
- execSync('which afplay 2>/dev/null', { stdio: 'pipe' });
728
+ execSync('which afplay 2>/dev/null', { stdio: 'pipe' }); // NOSONAR - Safe: checking system PATH for audio player
729
729
  audioPlayer = 'afplay';
730
730
  } catch {
731
731
  try {
732
- execSync('which mpv 2>/dev/null', { stdio: 'pipe' });
732
+ execSync('which mpv 2>/dev/null', { stdio: 'pipe' }); // NOSONAR - Safe: checking system PATH for audio player
733
733
  audioPlayer = 'mpv';
734
734
  } catch {}
735
735
  }
@@ -2893,12 +2893,16 @@ async function install(options = {}) {
2893
2893
  // Apply reverb setting if not "off" (using dynamic import for ES modules)
2894
2894
  if (selectedReverb && selectedReverb !== 'off') {
2895
2895
  const effectsManagerPath = path.join(targetDir, '.claude', 'hooks', 'effects-manager.sh');
2896
- try {
2897
- execSync(`bash "${effectsManagerPath}" set-reverb ${selectedReverb} default`, {
2898
- stdio: 'pipe',
2899
- });
2900
- } catch (error) {
2901
- // Silent fail - will be shown in success message if needed
2896
+ // Validate reverb value to prevent command injection
2897
+ const validReverb = ['light', 'medium', 'heavy', 'cathedral'];
2898
+ if (validReverb.includes(selectedReverb)) {
2899
+ try {
2900
+ execFileSync('bash', [effectsManagerPath, 'set-reverb', selectedReverb, 'default'], {
2901
+ stdio: 'pipe',
2902
+ });
2903
+ } catch (error) {
2904
+ // Silent fail - will be shown in success message if needed
2905
+ }
2902
2906
  }
2903
2907
  }
2904
2908
 
@@ -35,7 +35,7 @@ function commandExists(command) {
35
35
  */
36
36
  function checkBashVersion() {
37
37
  try {
38
- const version = execFileSync('bash', ['--version'], { encoding: 'utf8' });
38
+ const version = execFileSync('bash', ['--version'], { encoding: 'utf8' }); // NOSONAR - Safe: checking bash version from system PATH
39
39
  const match = version.match(/version (\d+)\.(\d+)/);
40
40
  if (match) {
41
41
  const major = parseInt(match[1]);