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.
- package/.claude/hooks/learn-manager.sh +8 -2
- package/.claude/hooks/piper-multispeaker-registry.sh +8 -2
- package/.claude/hooks/voice-manager.sh +8 -2
- package/README.md +7 -6
- package/RELEASE_NOTES.md +54 -317
- package/package.json +1 -1
- package/scripts/macos-ssh-audio-greeting.sh +27 -0
- package/scripts/test-macos-audio.sh +46 -0
- package/scripts/testmacos.sh +1 -0
- package/src/installer.js +50 -8
|
@@ -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 "$
|
|
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 "$
|
|
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 [[ "$
|
|
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 [[ "$
|
|
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 [[ "$
|
|
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 [[ "$
|
|
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
|
[](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
|
|
12
12
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
13
13
|
|
|
14
|
-
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v2.14.
|
|
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.
|
|
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.
|
|
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
|
-
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
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.
|
|
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.
|
|
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
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
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
|
-
###
|
|
104
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
#
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
237
|
-
/agent-vibes:preview
|
|
45
|
+
The installer now checks if Piper voice models already exist before prompting for download location:
|
|
238
46
|
|
|
239
|
-
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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/
|
|
311
|
-
| `.claude/hooks/
|
|
312
|
-
| `.claude/hooks/
|
|
313
|
-
|
|
|
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
|
-
##
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
-
##
|
|
85
|
+
## Related Issues
|
|
334
86
|
|
|
335
|
-
|
|
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
|
-
##
|
|
92
|
+
## 📝 Recent Commits
|
|
345
93
|
|
|
346
|
-
|
|
94
|
+
```
|
|
95
|
+
(to be filled after commit)
|
|
96
|
+
```
|
|
347
97
|
|
|
348
|
-
|
|
98
|
+
---
|
|
349
99
|
|
|
350
|
-
|
|
100
|
+
## Upgrade
|
|
351
101
|
|
|
352
|
-
**Recommended Action for Mac Users:**
|
|
353
102
|
```bash
|
|
354
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
135
|
-
chalk.cyan('
|
|
136
|
-
chalk.cyan('
|
|
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
|
|
139
|
-
chalk.gray(' 🔧
|
|
140
|
-
chalk.gray(' ⚡
|
|
141
|
-
chalk.gray('
|
|
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'));
|