agentvibes 2.14.9 → 2.14.10

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.
@@ -41,6 +41,12 @@ fi
41
41
 
42
42
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
43
43
 
44
+ # Bash 3.2 compatible lowercase function (macOS ships with bash 3.2)
45
+ # ${var,,} syntax requires bash 4.0+
46
+ _to_lower() {
47
+ echo "$1" | tr '[:upper:]' '[:lower:]'
48
+ }
49
+
44
50
  # Use PWD for project dir when called from project context, fall back to script-relative
45
51
  if [[ -d "$PWD/.claude" ]]; then
46
52
  PROJECT_DIR="$PWD"
@@ -104,7 +110,7 @@ get_target_language() {
104
110
  get_greeting_for_language() {
105
111
  local language="$1"
106
112
 
107
- case "${language,,}" in
113
+ case "$(_to_lower "$language")" in
108
114
  spanish|español)
109
115
  echo "¡Hola! Soy tu profesor de español. ¡Vamos a aprender juntos!"
110
116
  ;;
@@ -233,7 +239,7 @@ get_recommended_voice_for_language() {
233
239
 
234
240
  # Fallback to hardcoded suggestions if function failed
235
241
  if [[ -z "$recommended_voice" ]]; then
236
- case "${language,,}" in
242
+ case "$(_to_lower "$language")" in
237
243
  spanish|español)
238
244
  recommended_voice=$([ "$provider" = "piper" ] && echo "es_ES-davefx-medium" || echo "Antoni")
239
245
  ;;
@@ -40,6 +40,12 @@
40
40
  # @related voice-manager.sh, play-tts-piper.sh, 16Speakers.onnx.json (speaker_id_map)
41
41
  #
42
42
 
43
+ # Bash 3.2 compatible lowercase function (macOS ships with bash 3.2)
44
+ # ${var,,} syntax requires bash 4.0+
45
+ _to_lower() {
46
+ echo "$1" | tr '[:upper:]' '[:lower:]'
47
+ }
48
+
43
49
  # Registry of multi-speaker models and their speaker names
44
50
  # Format: "SpeakerName:model_file:speaker_id:description"
45
51
  #
@@ -88,7 +94,7 @@ get_multispeaker_info() {
88
94
  rest="${rest#*:}"
89
95
  speaker_id="${rest%%:*}"
90
96
 
91
- if [[ "${name,,}" == "${speaker_name,,}" ]]; then
97
+ if [[ "$(_to_lower "$name")" == "$(_to_lower "$speaker_name")" ]]; then
92
98
  echo "$model:$speaker_id"
93
99
  return 0
94
100
  fi
@@ -156,7 +162,7 @@ get_multispeaker_description() {
156
162
  rest="${rest#*:}"
157
163
  description="${rest}"
158
164
 
159
- if [[ "${name,,}" == "${speaker_name,,}" ]]; then
165
+ if [[ "$(_to_lower "$name")" == "$(_to_lower "$speaker_name")" ]]; then
160
166
  echo "$description"
161
167
  return 0
162
168
  fi
@@ -38,6 +38,12 @@
38
38
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
39
39
  source "$SCRIPT_DIR/voices-config.sh"
40
40
 
41
+ # Bash 3.2 compatible lowercase function (macOS ships with bash 3.2)
42
+ # ${var,,} syntax requires bash 4.0+
43
+ to_lower() {
44
+ echo "$1" | tr '[:upper:]' '[:lower:]'
45
+ }
46
+
41
47
  # Determine target .claude directory based on context
42
48
  # Priority:
43
49
  # 1. CLAUDE_PROJECT_DIR env var (set by MCP for project-specific settings)
@@ -319,7 +325,7 @@ case "$1" in
319
325
  for onnx_file in "$VOICE_DIR"/*.onnx; do
320
326
  if [[ -f "$onnx_file" ]]; then
321
327
  voice=$(basename "$onnx_file" .onnx)
322
- if [[ "${voice,,}" == "${VOICE_NAME,,}" ]]; then
328
+ if [[ "$(to_lower "$voice")" == "$(to_lower "$VOICE_NAME")" ]]; then
323
329
  FOUND="$voice"
324
330
  break
325
331
  fi
@@ -425,7 +431,7 @@ case "$1" in
425
431
  # Check if voice exists (case-insensitive)
426
432
  FOUND=""
427
433
  for voice in "${!VOICES[@]}"; do
428
- if [[ "${voice,,}" == "${VOICE_NAME,,}" ]]; then
434
+ if [[ "$(to_lower "$voice")" == "$(to_lower "$VOICE_NAME")" ]]; then
429
435
  FOUND="$voice"
430
436
  break
431
437
  fi
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.14.4
14
+ **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.14.10
15
15
 
16
16
  ---
17
17
 
@@ -94,14 +94,15 @@ Whether you're coding in Claude Code, chatting in Claude Desktop, or using Warp
94
94
 
95
95
  ## 📰 Latest Release
96
96
 
97
- **[v2.14.4 - Fully Automated Install](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.14.4)** 🎉
97
+ **[v2.14.10 - macOS Bash 3.2 Compatibility Fix](https://github.com/paulpreibisch/AgentVibes/releases/tag/v2.14.10)** 🎉
98
98
 
99
- AgentVibes v2.14.4 fixes the `--yes` flag to skip ALL interactive prompts during installation. Previously, even with `--yes`, the installer would pause at three "Continue?" prompts. Now `npx agentvibes install --yes` runs fully unattended, perfect for CI/CD pipelines and automated deployments.
99
+ AgentVibes v2.14.10 fixes critical bash compatibility issues affecting all macOS users. Voice switching now works on Macs with the default bash 3.2. The installer also detects existing Piper voice models and skips the download prompt on reinstalls.
100
100
 
101
101
  **Key Highlights:**
102
- - **Fully Automated Install** - `--yes` flag now skips ALL interactive prompts
103
- - 🤖 **CI/CD Ready** - Perfect for automated deployments and scripted installs
104
- - **No Breaking Changes** - Interactive mode unchanged when `--yes` is not used
102
+ - 🍎 **macOS Compatibility** - Fixed bash 3.2 compatibility for all voice scripts
103
+ - 🔧 **No More "bad substitution"** - Replaced `${var,,}` with POSIX-compatible `tr` commands
104
+ - **Smarter Reinstalls** - Installer detects existing Piper voices and skips download prompt
105
+ - ✅ **All 132 Tests Pass** - Full test suite validated
105
106
 
106
107
  💡 **Tip:** If `npx agentvibes` shows an older version or missing commands, clear your npm cache: `npm cache clean --force && npx agentvibes@latest --help`
107
108
 
package/RELEASE_NOTES.md CHANGED
@@ -1,373 +1,110 @@
1
- # Release v2.14.4 - Fully Automated Install with --yes Flag
2
-
3
- **Release Date:** 2025-11-30
4
- **Type:** Patch Release (Enhancement)
5
-
6
- ## AI Summary
7
-
8
- AgentVibes v2.14.4 fixes the `--yes` flag behavior during installation. Previously, even with `--yes`, the installer would pause at three intermediate "Continue?" prompts, blocking automated/CI installations. Now `npx agentvibes install --yes` runs fully unattended from start to finish.
9
-
10
- **Key Highlights:**
11
- - ⚡ **Fully Automated Install** - `--yes` flag now skips ALL interactive prompts
12
- - 🤖 **CI/CD Ready** - Perfect for automated deployments and scripted installs
13
- - ✅ **No Breaking Changes** - Interactive mode unchanged when `--yes` is not used
14
-
15
- ---
16
-
17
- ## Enhancement
18
-
19
- ### Fully Automated Install with --yes Flag
20
- **File:** `src/installer.js`
21
-
22
- Three intermediate prompts are now skipped when `--yes` is provided:
23
-
24
- | Prompt | Purpose |
25
- |--------|---------|
26
- | "📋 Review the installation summary above. Continue?" | After file installation summary |
27
- | "Continue?" | After setup instructions display |
28
- | "🎙️ Review MCP Server setup info above. Continue?" | After MCP server info |
29
-
30
- **Before:** `npx agentvibes install --yes` would still pause 3 times
31
- **After:** `npx agentvibes install --yes` runs completely unattended
32
-
33
- ```bash
34
- # Now works for fully automated installations:
35
- npx agentvibes install --yes
36
-
37
- # Perfect for CI/CD pipelines:
38
- npx agentvibes@latest install -y
39
- ```
40
-
41
- ---
42
-
43
- ## Files Modified
44
-
45
- | File | Changes |
46
- |------|---------|
47
- | `src/installer.js` | Wrapped 3 prompts with `if (!options.yes)` check (+12 lines) |
48
-
49
- ---
50
-
51
- ## Changes Summary
52
-
53
- **Commits:** 1
54
- - `feat: Skip intermediate prompts with --yes flag for automated installs`
55
-
56
- **Files Changed:** 1
57
- **Lines Added:** 12
58
- **Lines Removed:** 6
59
-
60
- ---
61
-
62
- ## Migration Notes
63
-
64
- **No migration required** - This is a patch release with improved automation.
65
-
66
- **Who benefits:**
67
- - CI/CD pipelines installing AgentVibes
68
- - Scripted/automated deployments
69
- - Anyone running `npx agentvibes install --yes`
70
-
71
- ---
72
-
73
- ## Testing
74
-
75
- ```bash
76
- # Verify fully automated install works:
77
- npx agentvibes install --yes
78
-
79
- # Should complete without any prompts
80
- ```
81
-
82
- ---
83
-
84
- # Release v2.14.3 - macOS Provider Routing Fix
1
+ # Release v2.14.10 - macOS Bash 3.2 Compatibility Fix
85
2
 
86
3
  **Release Date:** 2025-11-30
87
4
  **Type:** Patch Release (Bug Fix)
88
5
 
89
6
  ## AI Summary
90
7
 
91
- AgentVibes v2.14.3 fixes a critical bug where the macOS TTS provider would not speak when selected. The TTS router (`play-tts.sh`) was missing the case handler for the macOS provider, causing it to fail silently. This release adds the missing routing and includes comprehensive test coverage to prevent regression.
8
+ AgentVibes v2.14.10 fixes critical bash compatibility issues affecting all macOS users. The voice-manager.sh and related scripts were using `${var,,}` lowercase syntax which only works in bash 4.0+, but macOS ships with bash 3.2 by default. This caused "bad substitution" errors when switching voices. Additionally, the installer now detects existing Piper voice models and skips the download prompt on reinstalls.
92
9
 
93
10
  **Key Highlights:**
94
- - 🐛 **Fixed macOS Provider Routing** - macOS `say` provider now works when selected (Issue #52)
95
- - **New Provider Tests** - 4 new tests ensure macOS provider is properly detected and routed
96
- - 🔧 **Fixed Translator Tests** - Fixed 3 pre-existing failing tests related to PWD and locale warnings
97
- - 🎯 **133 Tests Passing** - Full test suite now passes with comprehensive macOS coverage
11
+ - 🍎 **macOS Compatibility** - Fixed bash 3.2 compatibility for all voice scripts
12
+ - 🔧 **No More "bad substitution"** - Replaced `${var,,}` with POSIX-compatible `tr` commands
13
+ - **Smarter Reinstalls** - Installer detects existing Piper voices and skips download prompt
14
+ - **All 132 Tests Pass** - Full test suite validated
98
15
 
99
16
  ---
100
17
 
101
18
  ## Bug Fixes
102
19
 
103
- ### macOS Provider Routing Fix (Issue #52)
104
- **File:** `.claude/hooks/play-tts.sh`
105
-
106
- The TTS router was missing case handlers for the `macos` provider in two locations:
107
- 1. The `speak_text()` function (used by translation/learning modes)
108
- 2. The main routing case statement
20
+ ### Bash 3.2 Compatibility (Issue #54)
21
+ **Files:** `voice-manager.sh`, `piper-multispeaker-registry.sh`, `learn-manager.sh`
109
22
 
110
- **Before:** Switching to macOS provider would silently fail - no TTS output
111
- **After:** macOS provider correctly routes to `play-tts-macos.sh`
23
+ macOS ships with bash 3.2 (from 2007) due to GPL licensing. The `${var,,}` lowercase conversion syntax requires bash 4.0+, causing errors like:
112
24
 
113
- ```bash
114
- # This now works correctly:
115
- /agent-vibes:provider switch macos
116
- # TTS output will now use macOS say command
117
25
  ```
118
-
119
- ---
120
-
121
- ## Test Improvements
122
-
123
- ### New macOS Provider Tests
124
- **Files:** `test/unit/provider-manager.bats`, `test/unit/play-tts.bats`
125
-
126
- Added 4 new tests to ensure macOS provider is properly supported:
127
-
128
- | Test | Description |
129
- |------|-------------|
130
- | `provider-manager list shows available providers` | Verifies `macos` appears in provider list |
131
- | `provider-manager switch to macos` | Tests switching to macOS provider |
132
- | `provider-manager validate macos provider exists` | Validates macOS provider script exists |
133
- | `play-tts routes to macos provider when configured` | Tests actual TTS routing to macOS |
134
- | `play-tts speak_text function routes to macos` | Verifies internal routing function |
135
-
136
- ### Fixed Translator Tests
137
- **File:** `test/unit/translator.bats`
138
-
139
- Fixed 3 pre-existing failing tests:
140
- - Tests now properly `cd` to project directory before running commands
141
- - Fixed locale warning filtering using `env LC_ALL=C bash -c`
142
-
143
- ---
144
-
145
- ## Files Modified
146
-
147
- | File | Changes |
148
- |------|---------|
149
- | `.claude/hooks/play-tts.sh` | Added macOS case handlers (+6 lines) |
150
- | `test/unit/provider-manager.bats` | Added macOS provider tests (+24 lines) |
151
- | `test/unit/play-tts.bats` | Added macOS routing tests (+45 lines) |
152
- | `test/unit/translator.bats` | Fixed PWD and locale issues (+13 lines) |
153
-
154
- ---
155
-
156
- ## Changes Summary
157
-
158
- **Commits:** 2
159
- - `fix: Add macOS provider routing to play-tts.sh`
160
- - `test: Add macOS provider tests and fix translator tests`
161
-
162
- **Files Changed:** 4
163
- **Lines Added:** 88
164
- **Lines Removed:** 11
165
-
166
- ---
167
-
168
- ## Migration Notes
169
-
170
- **No migration required** - This is a bug fix release.
171
-
172
- **Who is affected:** Mac users who updated to v2.14.1/v2.14.2 and tried to use the macOS provider.
173
-
174
- **Fix verification:**
175
- ```bash
176
- # Update AgentVibes
177
- npx agentvibes update
178
-
179
- # Switch to macOS provider - should now speak
180
- /agent-vibes:provider switch macos
26
+ /Volumes/.../voices-config.sh: line 428: ${voice,,}: bad substitution
181
27
  ```
182
28
 
183
- ---
184
-
185
- ## Testing
186
-
187
- All 133 tests pass:
29
+ **Fix:** Added `to_lower()` helper function using POSIX-compatible `tr`:
188
30
 
189
31
  ```bash
190
- npm test
191
-
192
- # Key tests:
193
- # ok 21 play-tts routes to macos provider when configured
194
- # ok 22 play-tts speak_text function routes to macos
195
- # ok 29 provider-manager switch to macos
196
- # ok 30 provider-manager validate macos provider exists
32
+ # Before (bash 4+ only):
33
+ if [[ "${voice,,}" == "${VOICE_NAME,,}" ]]; then
34
+
35
+ # After (bash 3.2 compatible):
36
+ to_lower() {
37
+ echo "$1" | tr '[:upper:]' '[:lower:]'
38
+ }
39
+ if [[ "$(to_lower "$voice")" == "$(to_lower "$VOICE_NAME")" ]]; then
197
40
  ```
198
41
 
199
- ---
200
-
201
- # Release v2.14.2 - Native macOS TTS Provider
202
-
203
- **Release Date:** 2025-11-29
204
- **Type:** Patch Release (New Provider)
205
-
206
- > Note: v2.14.2 is identical to v2.14.1 - version bump for CI badge fix only.
207
-
208
- ## AI Summary
209
-
210
- AgentVibes v2.14.1 introduces native macOS TTS support via the built-in `say` command. Mac users can now use AgentVibes with **zero setup required** - no API keys, no downloads, no configuration. Simply switch to the macOS provider and start talking! The new provider automatically detects 100+ built-in Apple voices across 40+ languages, with Siri-quality enhanced voices available on macOS Mojave (10.14) and later.
211
-
212
- **Key Highlights:**
213
- - 🍎 **macOS Say Provider** - Native TTS using macOS `say` command (zero dependencies!)
214
- - 🎤 **100+ Built-in Voices** - Access all Apple voices including enhanced Siri voices
215
- - 🌍 **40+ Languages** - Full language support from Apple's voice library
216
- - 🔄 **Three-Way Provider Switching** - Seamless migration between ElevenLabs, Piper, and macOS
217
- - 🎉 **Smarter BMAD Detection** - Improved installer message when BMAD-METHOD™ is detected
218
- - ✅ **Test Coverage Updated** - All provider tests account for new macOS option
219
-
220
- ---
221
-
222
- ## New Features
223
-
224
- ### macOS Say TTS Provider
225
- **Files:** `.claude/hooks/play-tts-macos.sh`, `.claude/hooks/macos-voice-manager.sh`
226
-
227
- Mac users can now use AgentVibes with zero setup using the native `say` command:
228
-
229
- ```bash
230
- # Switch to macOS provider (Mac only)
231
- /agent-vibes:provider switch macos
232
-
233
- # List available voices
234
- /agent-vibes:list
42
+ ### Installer Detects Existing Piper Voices (Issue #53)
43
+ **File:** `src/installer.js`
235
44
 
236
- # Preview voices
237
- /agent-vibes:preview
45
+ The installer now checks if Piper voice models already exist before prompting for download location:
238
46
 
239
- # Switch voices
240
- /agent-vibes:switch Samantha
47
+ **Before (every reinstall):**
241
48
  ```
242
-
243
- **Why macOS Provider?**
244
- - ✅ Zero setup - works out of the box on any Mac
245
- - ✅ No API keys required
246
- - ✅ No downloads or installations
247
- - ✅ Works offline
248
- - ✅ 100+ voices included
249
- - ✅ Siri-quality enhanced voices on macOS 10.14+
250
-
251
- **Recommended Voices:**
252
- - `Samantha` - American English female (enhanced)
253
- - `Alex` - American English male (enhanced)
254
- - `Daniel` - British English male (enhanced)
255
- - `Karen` - Australian English female (enhanced)
256
- - `Moira` - Irish English female (enhanced)
257
-
258
- ### Voice Management for macOS
259
- **File:** `.claude/hooks/macos-voice-manager.sh`
260
-
261
- Full voice management capabilities for macOS:
262
-
263
- ```bash
264
- # List all voices
265
- /agent-vibes:list
266
-
267
- # Filter by language (English voices)
268
- # Voices include: Alex, Samantha, Victoria, Daniel, Karen, etc.
269
-
270
- # Get voice info
271
- /agent-vibes:whoami
49
+ Where should Piper voice models be downloaded? (~/.claude/piper-voices)
272
50
  ```
273
51
 
274
- ### Three-Way Provider Switching
275
- **Files:** `.claude/hooks/provider-manager.sh`, `.claude/hooks/provider-commands.sh`
276
-
277
- Provider switching now supports three-way voice migration:
278
-
279
- ```bash
280
- # Show available providers (macOS shows as recommended on Mac)
281
- /agent-vibes:provider list
282
-
283
- # Switch to macOS provider with voice migration
284
- /agent-vibes:provider switch macos
285
-
286
- # Switch back to Piper
287
- /agent-vibes:provider switch piper
52
+ **After (when voices exist):**
53
+ ```
54
+ ✓ Piper voices already installed at /Users/user/.claude/piper-voices
55
+ Found 6 voice model(s):
56
+ • en_US-lessac-medium
57
+ • en_US-amy-medium
58
+ en_US-joe-medium
59
+ ...
60
+
61
+ Skipping download - using existing voices
288
62
  ```
289
-
290
- **Provider Detection:**
291
- - On macOS: Shows "macos" as recommended provider
292
- - On Linux/WSL: Shows "piper" as recommended
293
- - ElevenLabs available on all platforms (requires API key)
294
63
 
295
64
  ---
296
65
 
297
- ## Files Added
298
-
299
- | File | Description |
300
- |------|-------------|
301
- | `.claude/hooks/play-tts-macos.sh` | macOS TTS provider implementation (270 lines) |
302
- | `.claude/hooks/macos-voice-manager.sh` | macOS voice discovery and management (205 lines) |
303
- | `.github/workflows/test-macos-tts.yml` | Cost-optimized macOS CI workflow (210 lines) |
304
- | `scripts/fix-wsl-audio.sh` | WSL audio troubleshooting utility (106 lines) |
305
-
306
66
  ## Files Modified
307
67
 
308
68
  | File | Changes |
309
69
  |------|---------|
310
- | `.claude/hooks/provider-manager.sh` | Added macOS provider detection, three-way migration (+83 lines) |
311
- | `.claude/hooks/provider-commands.sh` | macOS provider support in commands (+135 lines) |
312
- | `.claude/hooks/voice-manager.sh` | Provider-aware voice routing for macOS (+62 lines) |
313
- | `.claude/commands/agent-vibes/agent-vibes.md` | macOS provider documentation (+42 lines) |
314
- | `.claude/commands/agent-vibes/provider.md` | Updated provider docs (+28 lines) |
315
- | `README.md` | macOS provider documentation (+19 lines) |
316
- | `src/installer.js` | Improved BMAD detection message with party-mode recommendation |
317
- | `test/unit/provider-manager.bats` | Updated tests for macOS provider (+4 lines) |
70
+ | `.claude/hooks/voice-manager.sh` | Added `to_lower()` function, replaced 2 `${,,}` usages |
71
+ | `.claude/hooks/piper-multispeaker-registry.sh` | Added `_to_lower()` function, replaced 2 `${,,}` usages |
72
+ | `.claude/hooks/learn-manager.sh` | Added `_to_lower()` function, replaced 2 `${,,}` usages |
73
+ | `src/installer.js` | Added `checkExistingPiperVoices()` function (+42 lines) |
318
74
 
319
75
  ---
320
76
 
321
- ## Changes Summary
322
-
323
- **Commits:** 2
324
- - feat: Add macOS Say TTS provider for native Mac support
325
- - fix: Update provider-manager test to account for macOS provider
77
+ ## Testing
326
78
 
327
- **Files Changed:** 12
328
- **Lines Added:** 1,104
329
- **Lines Removed:** 61
79
+ - All 132 unit tests pass
80
+ - Verified bash 3.2 syntax compatibility
81
+ - Tested voice switching on macOS
330
82
 
331
83
  ---
332
84
 
333
- ## Platform Support Matrix
85
+ ## Related Issues
334
86
 
335
- | Platform | ElevenLabs | Piper | macOS Say |
336
- |----------|------------|-------|-----------|
337
- | macOS | ✅ | ✅ | ✅ (recommended) |
338
- | Linux | ✅ | ✅ (recommended) | ❌ |
339
- | WSL | ✅ | ✅ (recommended) | ❌ |
340
- | Windows | ✅ | ✅ | ❌ |
87
+ - [Issue #53](https://github.com/paulpreibisch/AgentVibes/issues/53) - Installer should detect existing Piper voice models
88
+ - [Issue #54](https://github.com/paulpreibisch/AgentVibes/issues/54) - Bash 3.2 compatibility fix
341
89
 
342
90
  ---
343
91
 
344
- ## Migration Notes
92
+ ## 📝 Recent Commits
345
93
 
346
- **No migration required** - This is a patch release with a new provider option.
94
+ ```
95
+ (to be filled after commit)
96
+ ```
347
97
 
348
- **New Dependencies:** None! The macOS provider uses only built-in macOS commands.
98
+ ---
349
99
 
350
- **Compatibility:** 100% backward compatible with v2.14.0
100
+ ## Upgrade
351
101
 
352
- **Recommended Action for Mac Users:**
353
102
  ```bash
354
- # Try the new macOS provider
355
- /agent-vibes:provider switch macos
356
-
357
- # If you prefer cloud quality, switch back anytime
358
- /agent-vibes:provider switch elevenlabs
103
+ npx agentvibes@latest update
359
104
  ```
360
105
 
361
- ---
362
-
363
- ## Testing
364
-
365
- All tests pass including the new macOS-aware test updates:
106
+ Or for fresh install:
366
107
 
367
108
  ```bash
368
- # Run tests
369
- npm test
370
-
371
- # macOS-specific tests run on macOS CI only
372
- # See: .github/workflows/test-macos-tts.yml
109
+ npx agentvibes@latest install
373
110
  ```
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.14.9",
4
+ "version": "2.14.10",
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": [
@@ -0,0 +1,27 @@
1
+ #!/bin/bash
2
+ # macOS SSH Audio Greeting - Add to ~/.bashrc or ~/.bash_profile on your Mac
3
+ # This plays a greeting when you SSH in, confirming audio tunnel is working
4
+
5
+ # Always set PulseAudio environment for SSH sessions
6
+ if [[ -n "$SSH_CONNECTION" ]]; then
7
+ export PULSE_SERVER=tcp:localhost:14714
8
+ export PULSE_COOKIE_FILE=~/.config/pulse/cookie_wsl
9
+ fi
10
+
11
+ # Only play greeting for interactive sessions (has PS1 set)
12
+ if [[ -n "$SSH_CONNECTION" && -n "$PS1" ]]; then
13
+ # Run audio test in background so login isn't delayed
14
+ (
15
+ TEMP_AUDIO="/tmp/ssh_greeting_$$.aiff"
16
+ # Check if PulseAudio connection works
17
+ if /opt/homebrew/bin/pactl info > /dev/null 2>&1; then
18
+ say -o "$TEMP_AUDIO" "Audio tunnel connected." 2>/dev/null
19
+ if [[ -f "$TEMP_AUDIO" ]]; then
20
+ /opt/homebrew/bin/paplay "$TEMP_AUDIO" 2>/dev/null
21
+ rm -f "$TEMP_AUDIO"
22
+ fi
23
+ else
24
+ echo "[AgentVibes] Warning: PulseAudio tunnel not connected on port 14714" >&2
25
+ fi
26
+ ) &
27
+ fi
@@ -0,0 +1,46 @@
1
+ #!/bin/bash
2
+ echo "=========================================="
3
+ echo "Mac → Windows PulseAudio Tunnel Test"
4
+ echo "=========================================="
5
+ echo ""
6
+
7
+ export PULSE_SERVER=tcp:localhost:14714
8
+ export PULSE_COOKIE_FILE=~/.config/pulse/cookie_wsl
9
+
10
+ echo "[1/2] Testing connection to Windows PulseAudio..."
11
+ if /opt/homebrew/bin/pactl info > /dev/null 2>&1; then
12
+ echo "✓ Connected to Windows PulseAudio!"
13
+ /opt/homebrew/bin/pactl info | grep -E "Server Name|Default Sink"
14
+ else
15
+ echo "✗ Cannot connect to Windows PulseAudio"
16
+ exit 1
17
+ fi
18
+
19
+ echo ""
20
+ echo "[2/2] Playing audio through Windows speakers..."
21
+ TEMP_AUDIO="/tmp/windows_audio_test.aiff"
22
+
23
+ say -o "$TEMP_AUDIO" "Success! You are hearing this from the Mac, but it is playing on your Windows speakers through the PulseAudio tunnel."
24
+
25
+ if [ ! -f "$TEMP_AUDIO" ]; then
26
+ echo "✗ Failed to generate audio"
27
+ exit 1
28
+ fi
29
+
30
+ echo " Generated audio file"
31
+ echo " Sending to Windows speakers..."
32
+ /opt/homebrew/bin/paplay "$TEMP_AUDIO"
33
+ RESULT=$?
34
+
35
+ rm -f "$TEMP_AUDIO"
36
+
37
+ if [ $RESULT -eq 0 ]; then
38
+ echo ""
39
+ echo "✓ Audio sent successfully!"
40
+ echo ""
41
+ echo "🎵 Did you hear the audio on your WINDOWS speakers?"
42
+ else
43
+ echo "✗ Failed to play audio (error $RESULT)"
44
+ fi
45
+
46
+ exit $RESULT
@@ -0,0 +1 @@
1
+ ssh -o LogLevel=QUIET macos 'bash -l -c "export PULSE_SERVER=tcp:localhost:14714 && export PULSE_COOKIE_FILE=~/.config/pulse/cookie_wsl && say -o /tmp/test.aiff \"Testing Windows speakers from Mac\" && /opt/homebrew/bin/paplay /tmp/test.aiff && rm /tmp/test.aiff"'
package/src/installer.js CHANGED
@@ -128,17 +128,17 @@ function showReleaseInfo() {
128
128
  console.log(
129
129
  boxen(
130
130
  chalk.white.bold('═══════════════════════════════════════════════════════════════\n') +
131
- chalk.cyan.bold(' 📦 AgentVibes v2.14.7 - macOS Say Provider Support\n') +
131
+ chalk.cyan.bold(' 📦 AgentVibes v2.14.10 - macOS Bash 3.2 Compatibility Fix\n') +
132
132
  chalk.white.bold('═══════════════════════════════════════════════════════════════\n\n') +
133
133
  chalk.green.bold('🎙️ WHAT\'S NEW:\n\n') +
134
- chalk.cyan('AgentVibes v2.14.7 adds macOS Say to the provider selection.\n') +
135
- chalk.cyan('Mac users now see all 3 TTS options during install:\n') +
136
- chalk.cyan('Piper (free), macOS Say (built-in), and ElevenLabs (premium).\n\n') +
134
+ chalk.cyan('AgentVibes v2.14.10 fixes critical bash compatibility issues\n') +
135
+ chalk.cyan('affecting all macOS users. Voice switching now works on Macs\n') +
136
+ chalk.cyan('with the default bash 3.2. Installer also detects existing voices.\n\n') +
137
137
  chalk.green.bold('✨ KEY HIGHLIGHTS:\n\n') +
138
- chalk.gray(' 🍎 macOS Say Provider - Zero setup, built-in system voices\n') +
139
- chalk.gray(' 🔧 BMAD Fix - core/agents now get TTS injection\n') +
140
- chalk.gray(' ⚡ Fully Automated Install - --yes for CI/CD pipelines\n') +
141
- chalk.gray(' 🎯 All Tests Passing - Full test suite coverage\n\n') +
138
+ chalk.gray(' 🍎 macOS Compatibility - Fixed bash 3.2 for all voice scripts\n') +
139
+ chalk.gray(' 🔧 No More "bad substitution" - POSIX-compatible commands\n') +
140
+ chalk.gray(' ⚡ Smarter Reinstalls - Detects existing Piper voices\n') +
141
+ chalk.gray(' All 132 Tests Pass - Full test suite validated\n\n') +
142
142
  chalk.white.bold('═══════════════════════════════════════════════════════════════\n\n') +
143
143
  chalk.gray('📖 Full Release Notes: RELEASE_NOTES.md\n') +
144
144
  chalk.gray('🌐 Website: https://agentvibes.org\n') +
@@ -350,14 +350,56 @@ async function promptProviderSelection(options) {
350
350
  return provider;
351
351
  }
352
352
 
353
+ /**
354
+ * Check if Piper voices are already installed at a given path
355
+ * @param {string} voicesPath - Path to check for voice models
356
+ * @returns {Promise<{installed: boolean, voices: string[]}>} Whether voices are installed and list of voice names
357
+ */
358
+ async function checkExistingPiperVoices(voicesPath) {
359
+ try {
360
+ const files = await fs.readdir(voicesPath);
361
+ const voiceFiles = files.filter(f => f.endsWith('.onnx'));
362
+
363
+ if (voiceFiles.length > 0) {
364
+ const voiceNames = voiceFiles.map(f => f.replace('.onnx', ''));
365
+ return { installed: true, voices: voiceNames };
366
+ }
367
+ } catch {
368
+ // Directory doesn't exist or can't be read
369
+ }
370
+
371
+ return { installed: false, voices: [] };
372
+ }
373
+
353
374
  /**
354
375
  * Handle Piper TTS configuration (voice storage location)
376
+ * Detects existing voice installations and skips download prompt if voices already exist
355
377
  * @returns {Promise<string>} Path where Piper voices will be stored
356
378
  */
357
379
  async function handlePiperConfiguration() {
358
380
  const homeDir = process.env.HOME || process.env.USERPROFILE;
359
381
  const defaultPiperPath = path.join(homeDir, '.claude', 'piper-voices');
360
382
 
383
+ // Check if voices are already installed at the default location
384
+ const existingVoices = await checkExistingPiperVoices(defaultPiperPath);
385
+
386
+ if (existingVoices.installed) {
387
+ console.log(chalk.green(`\n✓ Piper voices already installed at ${defaultPiperPath}`));
388
+ console.log(chalk.gray(` Found ${existingVoices.voices.length} voice model(s):`));
389
+
390
+ // Show first 5 voices, then indicate more if applicable
391
+ const displayVoices = existingVoices.voices.slice(0, 5);
392
+ displayVoices.forEach(voice => {
393
+ console.log(chalk.gray(` • ${voice}`));
394
+ });
395
+ if (existingVoices.voices.length > 5) {
396
+ console.log(chalk.gray(` ... and ${existingVoices.voices.length - 5} more`));
397
+ }
398
+
399
+ console.log(chalk.green('\n✓ Skipping download - using existing voices\n'));
400
+ return defaultPiperPath;
401
+ }
402
+
361
403
  console.log(chalk.cyan('\n📁 Piper Voice Storage Location:\n'));
362
404
  console.log(chalk.gray(' Piper voice models are ~25MB each. They can be stored globally'));
363
405
  console.log(chalk.gray(' to be shared across all your projects, or locally per project.\n'));