agentvibes 2.14.18 → 2.14.19
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/github-star-reminder.txt +1 -1
- package/.claude/hooks/bmad-tts-injector.sh +93 -9
- package/RELEASE_NOTES.md +111 -0
- package/docker-volumes-report.md +190 -0
- package/package.json +1 -1
- package/.claude/hooks/bmad-tts-injector.sh.new +0 -471
- package/.claude/hooks/play-tts.sh.backup-20251005-163851 +0 -138
- package/.mcp-minimal.json +0 -88
- package/.test-bmad-config +0 -2
- package/logo/fav_icon_128x128.png:Zone.Identifier +0 -4
- package/logo/logo1.webp:Zone.Identifier +0 -4
- package/logo/social.png:Zone.Identifier +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
20251205
|
|
@@ -210,9 +210,20 @@ inject_tts() {
|
|
|
210
210
|
return 0
|
|
211
211
|
fi
|
|
212
212
|
|
|
213
|
-
# Create backup
|
|
213
|
+
# Create backup directory for centralized timestamped backups
|
|
214
|
+
local backup_dir=".agentvibes/backups/agents"
|
|
215
|
+
mkdir -p "$backup_dir"
|
|
216
|
+
|
|
217
|
+
# Create timestamped backup in central location (for permanent archive)
|
|
218
|
+
local timestamp=$(date +%Y%m%d_%H%M%S)
|
|
219
|
+
local backup_name="$(basename "$agent_file" .md)_${timestamp}.md"
|
|
220
|
+
cp "$agent_file" "$backup_dir/$backup_name"
|
|
221
|
+
|
|
222
|
+
# Also create quick-restore backup next to original file
|
|
214
223
|
cp "$agent_file" "$agent_file.backup-pre-tts"
|
|
215
224
|
|
|
225
|
+
echo -e "${GRAY} 📦 Backup saved: $backup_dir/$backup_name${NC}"
|
|
226
|
+
|
|
216
227
|
# Detect v4 vs v6 structure
|
|
217
228
|
local is_v6=false
|
|
218
229
|
if grep -q "<activation" "$agent_file"; then
|
|
@@ -249,6 +260,15 @@ inject_tts() {
|
|
|
249
260
|
{ print }
|
|
250
261
|
' "$agent_file" > "$agent_file.tmp"
|
|
251
262
|
|
|
263
|
+
# SAFETY CHECK: Verify the tmp file is not empty before comparing
|
|
264
|
+
local tmp_size=$(stat -c%s "$agent_file.tmp" 2>/dev/null || stat -f%z "$agent_file.tmp" 2>/dev/null || echo "0")
|
|
265
|
+
if [[ "$tmp_size" -eq 0 ]]; then
|
|
266
|
+
echo -e "${RED}❌ SAFETY: Refusing to overwrite - tmp file is empty: $(basename "$agent_file")${NC}" >&2
|
|
267
|
+
rm -f "$agent_file.tmp"
|
|
268
|
+
mv "$agent_file.backup-pre-tts" "$agent_file"
|
|
269
|
+
return 1
|
|
270
|
+
fi
|
|
271
|
+
|
|
252
272
|
# If no change (step 4 didn't match), restore backup and report
|
|
253
273
|
if ! diff -q "$agent_file.backup-pre-tts" "$agent_file.tmp" > /dev/null 2>&1; then
|
|
254
274
|
: # Changes were made, continue
|
|
@@ -284,6 +304,29 @@ inject_tts() {
|
|
|
284
304
|
}
|
|
285
305
|
{ print }
|
|
286
306
|
' "$agent_file" > "$agent_file.tmp"
|
|
307
|
+
|
|
308
|
+
# SAFETY CHECK: Verify the tmp file is not empty and has similar size to original
|
|
309
|
+
# This prevents data loss if awk fails or produces empty output
|
|
310
|
+
local original_size=$(stat -c%s "$agent_file" 2>/dev/null || stat -f%z "$agent_file" 2>/dev/null || echo "0")
|
|
311
|
+
local tmp_size=$(stat -c%s "$agent_file.tmp" 2>/dev/null || stat -f%z "$agent_file.tmp" 2>/dev/null || echo "0")
|
|
312
|
+
|
|
313
|
+
if [[ "$tmp_size" -eq 0 ]]; then
|
|
314
|
+
echo -e "${RED}❌ SAFETY: Refusing to overwrite - tmp file is empty: $(basename "$agent_file")${NC}" >&2
|
|
315
|
+
rm -f "$agent_file.tmp"
|
|
316
|
+
mv "$agent_file.backup-pre-tts" "$agent_file"
|
|
317
|
+
return 1
|
|
318
|
+
fi
|
|
319
|
+
|
|
320
|
+
# Tmp file should be at least 80% of original size (protects against truncation)
|
|
321
|
+
# No upper limit since injection adds substantial content (typically 300-500 bytes)
|
|
322
|
+
local min_size=$((original_size * 80 / 100))
|
|
323
|
+
|
|
324
|
+
if [[ "$tmp_size" -lt "$min_size" ]]; then
|
|
325
|
+
echo -e "${RED}❌ SAFETY: Refusing to overwrite - file would shrink too much (orig: ${original_size}B, tmp: ${tmp_size}B): $(basename "$agent_file")${NC}" >&2
|
|
326
|
+
rm -f "$agent_file.tmp"
|
|
327
|
+
mv "$agent_file.backup-pre-tts" "$agent_file"
|
|
328
|
+
return 1
|
|
329
|
+
fi
|
|
287
330
|
fi
|
|
288
331
|
|
|
289
332
|
mv "$agent_file.tmp" "$agent_file"
|
|
@@ -336,10 +379,10 @@ show_status() {
|
|
|
336
379
|
if has_tts_injection "$agent_file"; then
|
|
337
380
|
local voice=$(get_agent_voice "$agent_id")
|
|
338
381
|
echo -e " ${GREEN}✅${NC} $agent_name (${agent_id}) → Voice: ${voice:-default}"
|
|
339
|
-
((enabled_count
|
|
382
|
+
enabled_count=$((enabled_count + 1))
|
|
340
383
|
else
|
|
341
384
|
echo -e " ${GRAY}❌ $agent_name (${agent_id})${NC}"
|
|
342
|
-
((disabled_count
|
|
385
|
+
disabled_count=$((disabled_count + 1))
|
|
343
386
|
fi
|
|
344
387
|
done <<< "$agents"
|
|
345
388
|
|
|
@@ -360,21 +403,62 @@ enable_all() {
|
|
|
360
403
|
local agents=$(find_agents "$bmad_core")
|
|
361
404
|
local success_count=0
|
|
362
405
|
local skip_count=0
|
|
406
|
+
local fail_count=0
|
|
407
|
+
|
|
408
|
+
# Track modified files and backups for summary
|
|
409
|
+
local modified_files=()
|
|
410
|
+
local backup_files=()
|
|
363
411
|
|
|
364
412
|
while IFS= read -r agent_file; do
|
|
365
413
|
if has_tts_injection "$agent_file"; then
|
|
366
|
-
((skip_count
|
|
414
|
+
skip_count=$((skip_count + 1))
|
|
367
415
|
continue
|
|
368
416
|
fi
|
|
369
417
|
|
|
370
418
|
if inject_tts "$agent_file"; then
|
|
371
|
-
((success_count
|
|
419
|
+
success_count=$((success_count + 1))
|
|
420
|
+
modified_files+=("$agent_file")
|
|
421
|
+
# Track the backup file that was created
|
|
422
|
+
local timestamp=$(date +%Y%m%d_%H%M%S)
|
|
423
|
+
local backup_name="$(basename "$agent_file" .md)_${timestamp}.md"
|
|
424
|
+
backup_files+=(".agentvibes/backups/agents/$backup_name")
|
|
425
|
+
else
|
|
426
|
+
fail_count=$((fail_count + 1))
|
|
372
427
|
fi
|
|
373
428
|
done <<< "$agents"
|
|
374
429
|
|
|
375
430
|
echo ""
|
|
376
|
-
echo -e "${
|
|
377
|
-
|
|
431
|
+
echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}"
|
|
432
|
+
echo -e "${CYAN} TTS INJECTION SUMMARY ${NC}"
|
|
433
|
+
echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}"
|
|
434
|
+
echo ""
|
|
435
|
+
|
|
436
|
+
# Show results
|
|
437
|
+
echo -e "${GREEN}✅ Successfully modified: $success_count agents${NC}"
|
|
438
|
+
[[ $skip_count -gt 0 ]] && echo -e "${YELLOW}⏭️ Skipped (already enabled): $skip_count agents${NC}"
|
|
439
|
+
[[ $fail_count -gt 0 ]] && echo -e "${RED}❌ Failed: $fail_count agents${NC}"
|
|
440
|
+
echo ""
|
|
441
|
+
|
|
442
|
+
# List modified files
|
|
443
|
+
if [[ ${#modified_files[@]} -gt 0 ]]; then
|
|
444
|
+
echo -e "${CYAN}📝 Modified Files:${NC}"
|
|
445
|
+
for file in "${modified_files[@]}"; do
|
|
446
|
+
echo -e " • $file"
|
|
447
|
+
done
|
|
448
|
+
echo ""
|
|
449
|
+
fi
|
|
450
|
+
|
|
451
|
+
# Show backup location
|
|
452
|
+
if [[ ${#modified_files[@]} -gt 0 ]]; then
|
|
453
|
+
echo -e "${CYAN}📦 Backups saved to:${NC}"
|
|
454
|
+
echo -e " .agentvibes/backups/agents/"
|
|
455
|
+
echo ""
|
|
456
|
+
echo -e "${CYAN}🔄 To restore original files, run:${NC}"
|
|
457
|
+
echo -e " ${GREEN}.claude/hooks/bmad-tts-injector.sh restore${NC}"
|
|
458
|
+
echo ""
|
|
459
|
+
fi
|
|
460
|
+
|
|
461
|
+
echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}"
|
|
378
462
|
echo ""
|
|
379
463
|
echo -e "${CYAN}💡 BMAD agents will now speak when activated!${NC}"
|
|
380
464
|
}
|
|
@@ -394,7 +478,7 @@ disable_all() {
|
|
|
394
478
|
|
|
395
479
|
while IFS= read -r agent_file; do
|
|
396
480
|
if remove_tts "$agent_file"; then
|
|
397
|
-
((success_count
|
|
481
|
+
success_count=$((success_count + 1))
|
|
398
482
|
fi
|
|
399
483
|
done <<< "$agents"
|
|
400
484
|
|
|
@@ -430,7 +514,7 @@ restore_backup() {
|
|
|
430
514
|
local original_file="${backup_file%.backup-pre-tts}"
|
|
431
515
|
cp "$backup_file" "$original_file"
|
|
432
516
|
echo -e "${GREEN}✅ Restored: $(basename "$original_file")${NC}"
|
|
433
|
-
((backup_count
|
|
517
|
+
backup_count=$((backup_count + 1))
|
|
434
518
|
fi
|
|
435
519
|
done
|
|
436
520
|
|
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,3 +1,114 @@
|
|
|
1
|
+
# Release v2.14.19 - BMAD TTS Injection Improvements
|
|
2
|
+
|
|
3
|
+
**Release Date:** 2025-12-05
|
|
4
|
+
**Type:** Patch Release
|
|
5
|
+
|
|
6
|
+
## AI Summary
|
|
7
|
+
|
|
8
|
+
AgentVibes v2.14.19 improves the BMAD TTS injection feature with better file handling, organized backups, and a more informative summary when enabling voice support for your BMAD agents.
|
|
9
|
+
|
|
10
|
+
**Key Highlights:**
|
|
11
|
+
- 📦 **Organized Backups** - All backups now saved in `.agentvibes/backups/agents/` with timestamps
|
|
12
|
+
- 📋 **Better Summary** - See exactly which files were modified and how to restore them
|
|
13
|
+
- 🔧 **Improved Reliability** - Better file handling to ensure agent files are always preserved
|
|
14
|
+
- 🐚 **Shell Compatibility** - Works on more systems including older bash versions
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## What is TTS Injection?
|
|
19
|
+
|
|
20
|
+
**TTS (Text-to-Speech) Injection** is a feature that makes your BMAD agents talk! When you install BMAD with AgentVibes, it adds voice instructions to each agent file so they can speak their responses aloud.
|
|
21
|
+
|
|
22
|
+
### How it works:
|
|
23
|
+
|
|
24
|
+
1. **Before TTS Injection** - Your BMAD agents (PM, Architect, UX Designer, etc.) only display text responses
|
|
25
|
+
2. **After TTS Injection** - Each agent can speak their responses using your chosen voice
|
|
26
|
+
|
|
27
|
+
### Example:
|
|
28
|
+
|
|
29
|
+
When you activate the PM agent, instead of just seeing text, you'll hear:
|
|
30
|
+
> "Hey! I'm Marcus, your Project Manager. What can I help you with today?"
|
|
31
|
+
|
|
32
|
+
The injection adds a small instruction to each agent file that tells it to use AgentVibes for voice output. Your original agent files are always backed up before any changes.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## What's New in This Release
|
|
37
|
+
|
|
38
|
+
### Organized Backup System
|
|
39
|
+
|
|
40
|
+
When TTS is enabled on your agents, backups are now saved in one central location:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
.agentvibes/backups/agents/
|
|
44
|
+
├── pm_20251205_143022.md
|
|
45
|
+
├── architect_20251205_143022.md
|
|
46
|
+
├── ux-designer_20251205_143022.md
|
|
47
|
+
└── ...
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Each backup includes a timestamp so you can see exactly when it was created.
|
|
51
|
+
|
|
52
|
+
### Informative Summary
|
|
53
|
+
|
|
54
|
+
After enabling TTS, you'll see a clear summary:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
═══════════════════════════════════════════════════════════════
|
|
58
|
+
TTS INJECTION SUMMARY
|
|
59
|
+
═══════════════════════════════════════════════════════════════
|
|
60
|
+
|
|
61
|
+
✅ Successfully modified: 11 agents
|
|
62
|
+
|
|
63
|
+
📝 Modified Files:
|
|
64
|
+
• .bmad/bmm/agents/pm.md
|
|
65
|
+
• .bmad/bmm/agents/architect.md
|
|
66
|
+
• .bmad/bmm/agents/ux-designer.md
|
|
67
|
+
• ...
|
|
68
|
+
|
|
69
|
+
📦 Backups saved to:
|
|
70
|
+
.agentvibes/backups/agents/
|
|
71
|
+
|
|
72
|
+
🔄 To restore original files, run:
|
|
73
|
+
.claude/hooks/bmad-tts-injector.sh restore
|
|
74
|
+
|
|
75
|
+
💡 BMAD agents will now speak when activated!
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Improved Reliability
|
|
79
|
+
|
|
80
|
+
The script now includes extra checks to make sure your agent files are always safe:
|
|
81
|
+
- Creates a backup before making any changes
|
|
82
|
+
- Verifies changes were successful before saving
|
|
83
|
+
- Automatically restores from backup if anything goes wrong
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Files Modified
|
|
88
|
+
|
|
89
|
+
| File | Changes |
|
|
90
|
+
|------|---------|
|
|
91
|
+
| `.claude/hooks/bmad-tts-injector.sh` | Backup organization, summary output, reliability improvements |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Testing
|
|
96
|
+
|
|
97
|
+
- ✅ All 132 BATS tests pass
|
|
98
|
+
- ✅ All 12 Node.js tests pass
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Upgrade
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npx agentvibes update
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
1
112
|
# Release v2.14.18 - Mute/Unmute TTS Control
|
|
2
113
|
|
|
3
114
|
**Release Date:** 2025-12-03
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Docker Volumes Report - ubuntu-rdp
|
|
2
|
+
|
|
3
|
+
Generated: 2025-12-05
|
|
4
|
+
|
|
5
|
+
## Summary
|
|
6
|
+
|
|
7
|
+
- **Total Anonymous Volumes:** 100
|
|
8
|
+
- **In Use (Sue/Jake):** 4 volumes (~1.1 GB)
|
|
9
|
+
- **Orphaned (Safe to Remove):** 96 volumes (~24.6 GB)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Volumes IN USE (DO NOT DELETE)
|
|
14
|
+
|
|
15
|
+
| Volume ID | Size | Used By |
|
|
16
|
+
|-----------|------|---------|
|
|
17
|
+
| `1ea0f642f60cd3d91109f9fc490c83ba6796e5b1eb4746788514278af7c51f17` | 293.3 MB | Jake-sonarqube |
|
|
18
|
+
| `06a3e411a0fd25d2a6dcb06eab0baa4577e7c0fe49f787ab65f3f16937fd7751` | 293.3 MB | Sue-sonarqube |
|
|
19
|
+
| `493b7eba82e673012e8e151b3071a39e44f05c24ab5f1a5c3bf52d8887b8de1f` | 270.4 MB | Sue-test-migrator |
|
|
20
|
+
| `d7ae92abf64533bdc2afdd16c19626bfdea4c7626126996a07fd8bacf549357d` | 269.3 MB | Jake-test-migrator |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## ORPHANED Volumes (Safe to Remove)
|
|
25
|
+
|
|
26
|
+
| Volume ID | Size |
|
|
27
|
+
|-----------|------|
|
|
28
|
+
| `0ced23837f1c8b1bbc0c7c3f007a08cbe86433faa2597a33b32c26ec29e88766` | 269.1 MB |
|
|
29
|
+
| `1a4b233683d8fa16c5bc0f8597e703b4827f019984ce1e3d6b0fa2f38fede345` | 254.6 MB |
|
|
30
|
+
| `1a19c99df6e8aae59c7aa6cfc231bce0c261270e8a2b56fb8aec72854c443283` | 254.6 MB |
|
|
31
|
+
| `1cc1fa1bfb4d1f7dc771aab3e76b57ef0f86d9f9ca74e15b69a4123a5efa9e99` | 254.7 MB |
|
|
32
|
+
| `1e205cb89a5e9f4cb46468e5dadb19bb6729783917ad2b41ea00b4b83d4919af` | 254.6 MB |
|
|
33
|
+
| `1e797829c6e8579381cca56a0db567c99e6a82ba2e00b4c3b5ea2530d81e842c` | 269.3 MB |
|
|
34
|
+
| `2ba52b14edc9b4549bb07e24fe9eaa8b56bf01bb381fbdda1e4c6c3bb40d7581` | 254.6 MB |
|
|
35
|
+
| `2c1e2e995e905552f46d44ed6a1b8b7ce0b08a009be421c54f64537b3e500ca0` | 293.3 MB |
|
|
36
|
+
| `2e70b93906bf1ed9d749e5432e663b8e40c78d025979461d75b7c9fe3d10ba47` | 293.3 MB |
|
|
37
|
+
| `3c4ddbfebf66a0f855ab9486e42a14865bf5adcb891f77dc3eb4704afffe5539` | 293.3 MB |
|
|
38
|
+
| `3d48ab4dd7d676d3b979b878fed1228231881047b60f3e43ac72314a41eb4928` | 265.0 MB |
|
|
39
|
+
| `3ed6c11eadc5f866269488d08462c9f5916cf3f940d03442fed15cd7ea1dd618` | 254.7 MB |
|
|
40
|
+
| `4a8ff19bc99c82a2ffd24e51c89f276554cc43589f80d4653e80150d2684a9b4` | 269.3 MB |
|
|
41
|
+
| `4a925355c150d2af22240fe1849ae709c965c86b3735b6afe41ef552c59d725f` | 293.3 MB |
|
|
42
|
+
| `4b421bc179f43828e2a04b0f911c39779b495c40bcfcdd8fa4d3a2ff69dd315d` | 269.3 MB |
|
|
43
|
+
| `4e62375336d04f95a74371f993fa6cf847dd35b8da8909a7710dc5674e7b75b9` | 293.3 MB |
|
|
44
|
+
| `4f487d5d6a3332b55b35b49b7a7078bb15d23643d611b3d6693fe37537f3696e` | 254.6 MB |
|
|
45
|
+
| `5b2d6aef627ab5ba82f4f81b6fe336b237f250beb8aeacc5d1dddf1393f3015e` | 293.3 MB |
|
|
46
|
+
| `5b422d5c417ec09cd0196d2a94b1a3cb31e5928bffc2a7ecfee59c14ae827ba1` | 254.7 MB |
|
|
47
|
+
| `5b8923e75b401a72e1022621b70f0c73de37586b0148888e61dee0ce55fd8d1a` | 8.0 KB |
|
|
48
|
+
| `5d9a8741e6c67476e0d1de22a5c24c4cf7c2252e22c116e7bf92df3fd68388b3` | 8.0 KB |
|
|
49
|
+
| `5e995ede5663716c3a46168cf6455b0bb3d98b2e76ada4d120ab5cf09e8a88df` | 269.1 MB |
|
|
50
|
+
| `6a126c6b888b4e63054477584e7dadfb5618be001d105ac4d2c4ca0e2f4d3748` | 32.0 KB |
|
|
51
|
+
| `6abd9dad5d149938b61e4cfcaac0472fcb64fdb781e69d6b7d081de860e7b81a` | 269.1 MB |
|
|
52
|
+
| `6d6aa0c2b0198c7a82514c160ad0ee832f5056135fd3eb6ff75ce7a8fc4256d6` | 8.0 KB |
|
|
53
|
+
| `8ac64a6116a6bf100dd1e47a10107b2931eaeb8f3aa186c39fbfdde0ae05b01e` | 254.6 MB |
|
|
54
|
+
| `8c4ac213201468f4ca9f2db2f40f9da32a25469b3000c8fea031522b2551211f` | 293.3 MB |
|
|
55
|
+
| `8c7fe915d3363867bbee9c13431d4091876ed71f39cee10ab1c01d3b45accb3c` | 269.1 MB |
|
|
56
|
+
| `8e3d0821144ee9a5afc112b43f09e1cb37f98510ec00bc560154b98145523860` | 269.2 MB |
|
|
57
|
+
| `9e0fa44d6677e64977bff512fb0bb0732cad9cd8746910bb4816252a10aa3060` | 269.1 MB |
|
|
58
|
+
| `9e072abb6b464006bef2c8205fa1262ba4ef35600a92987e377d1b312c5c0680` | 254.6 MB |
|
|
59
|
+
| `16aad0ec932fa118cd3f70b7d8911fb4cb43ccb4969b8649e4baf140c7cf696a` | 269.1 MB |
|
|
60
|
+
| `22ee3c0c2e13d98a0a92a37c4ae173a9f5fdc3dd28b5bd7bbc635b7036e54df3` | 265.0 MB |
|
|
61
|
+
| `26e8234220489579ff67e04f1813a634b03192653004f96e14bdfe749d41feb4` | 265.0 MB |
|
|
62
|
+
| `30ed8d49cf53d3a2fccea453804546c8579828d267aced39b190d894b0ecea8b` | 265.0 MB |
|
|
63
|
+
| `37af7201d45d8ca4ae2651e42c89ab9c1f9a216f8f9ccd263c8551a47de381a7` | 269.7 MB |
|
|
64
|
+
| `40ae8677a6ed5aad56299c7606c425b91df576592b5b5a7b769b3b4e4aeceb89` | 269.1 MB |
|
|
65
|
+
| `063a4787760bc7ee1432ea244b9f2638fc61182e986f9393fed23980a2772749` | 254.6 MB |
|
|
66
|
+
| `74a6404c88e32c3c06b3b1bbc0a5b56cfde753fda43faf0ae1e6852041ab161e` | 269.1 MB |
|
|
67
|
+
| `75c84852335f98c2fff4d12812d4b715b7eb27f1c6e39fdb925550e75e4cc062` | 254.7 MB |
|
|
68
|
+
| `081b93bd2eb96cffb39a380d8366c342673584c1bc4d99b14783e9f288e0e9b1` | 269.1 MB |
|
|
69
|
+
| `82f5ab6a105a6b967110513557c853249901321b335487442421d58a4d536a13` | 265.0 MB |
|
|
70
|
+
| `95db6ad947b99a72709b3cc578ee5137be80426f57494e340c38e30422afbc84` | 269.3 MB |
|
|
71
|
+
| `98d534f482500b9a4d4a8be1c24f40ffc77eff6e4df26e1f784c27e1326a9651` | 293.3 MB |
|
|
72
|
+
| `99f80005e686dfbd047fc58d5995056061e5ac5bad7f9a508abe1aa5ba25437f` | 269.1 MB |
|
|
73
|
+
| `123eb6b2198f0c0adf909e13430a4a3df9ef3f507bfa73dd05ffdd78ca475e34` | 269.3 MB |
|
|
74
|
+
| `163c331129ab2a33f2ba5976aef789c67ba3a6dafa9c7ba99e649d354b5e233c` | 269.1 MB |
|
|
75
|
+
| `257b58bf31e066b387ef291549a34bc44867ce57be963db3f76d6572321fd4ce` | 269.3 MB |
|
|
76
|
+
| `316a805b752e2c467222241523060106373f51cb9c38e10322eecf2bc7a9dae9` | 265.0 MB |
|
|
77
|
+
| `395eaec8ca26c5b46776fda9911e6486a06ff13261b848ddf7df44b3bf361701` | 265.0 MB |
|
|
78
|
+
| `500ec3339b9d38460596db04932615fb1ba16a42ea4a28299d9be26ac859b6e5` | 265.0 MB |
|
|
79
|
+
| `825c8ee2e0ceb2accf0843dfd7208e847cc5ee65e8bc716788758521d0b973f7` | 254.6 MB |
|
|
80
|
+
| `913f2729944dae998cd77d928b53e1c25801e0a0169c405382171f5078b0c0ec` | 254.6 MB |
|
|
81
|
+
| `02260d8edebf8774b17f5fb7fb5e9ccedc61a3f776ccfdd29557f85d8af00a5b` | 269.1 MB |
|
|
82
|
+
| `4048d9aa41da169a636fcaaae910e53e58f91f26748fbf5045d73a27afe4cf25` | 254.6 MB |
|
|
83
|
+
| `4371e4c17a0ee51fd3cab5e0a7422c94d1d6a94f8cdc4451d15ec7338367d5a2` | 293.3 MB |
|
|
84
|
+
| `6514b81ac1e437273e27b6d3d078f726f9c47f970daa8f9ed30df7339d506c75` | 269.1 MB |
|
|
85
|
+
| `8416ed532545e255adb45d5b6e596d45439f6178ed95978fd41f97dcea77d9bd` | 254.7 MB |
|
|
86
|
+
| `26291ff7199e2628c094708c956f7611d32e58b637c6ee869e0e7de32b39407b` | 265.0 MB |
|
|
87
|
+
| `29484c21431e57246ed1a76fafbb02d91400ab9d45a407a343d720600f10e399` | 254.6 MB |
|
|
88
|
+
| `43958d5c299031b420c141e8f2d7591f0420bb7cf5a2af8c6b5707758397e081` | 293.3 MB |
|
|
89
|
+
| `66610b393de8b0042537cf763afa031d3df32aff2c88635a73baef04fa11fe81` | 269.1 MB |
|
|
90
|
+
| `103532d4954423b7a72465b0997d70761db47ce74564bf7e4b0fe664767a82c7` | 269.1 MB |
|
|
91
|
+
| `853673fa8d3fe4484d3f1cb52d4365c3dd67d4812779784235ee3bcf02abb5ab` | 265.0 MB |
|
|
92
|
+
| `3128260c880a9146045d530be36460d4161d21ee722afc469e75f3f2a32b57cd` | 265.0 MB |
|
|
93
|
+
| `2790488966ab8e8a91e596c3e876653a2acc00c65568e2bab8d0aaac5f34df25` | 254.6 MB |
|
|
94
|
+
| `a60cc47082ea2678f3484e413358afe1b6ce68a363d0c42fe82a2a45e68ef235` | 293.3 MB |
|
|
95
|
+
| `a97106349cc7caf9e8d32fb4eee7366bfb559bf8dbe09bddd483a5ed5abd8df4` | 293.3 MB |
|
|
96
|
+
| `abcfae5c243e800ad1a80675eb4148c541cd29428d3afc4783965ecbf44e3b21` | 254.7 MB |
|
|
97
|
+
| `ac0c746f808db08f9a2f596f774012ba26c82ad9a6f2e7ebf80168a423cb38e0` | 254.6 MB |
|
|
98
|
+
| `ad7a6b196e823744b89da02acf1f69ec37c6e68e3c8975bf0f313da26409a2a1` | 269.1 MB |
|
|
99
|
+
| `b7d1c50582a902ec51f9be2e186b6cf1460fed9b4defe35f87fac9b86f5c3f7c` | 265.0 MB |
|
|
100
|
+
| `b27ca19fe3b3f6457ca1bf089e25f93b25e0ea5026db41ddff0921ad8b4db05c` | 254.6 MB |
|
|
101
|
+
| `b655cc1aa865dcde5a78bbffcdb55156d4712ed6ff69467c6520267f2eb6e346` | 254.6 MB |
|
|
102
|
+
| `becf21d0cfff32310affef22caa96be320004a982a79ae970f5ef389162cd3fb` | 293.3 MB |
|
|
103
|
+
| `bfc62823e2a0ddd97f808d400363738269e179c40cfdab38ed1aedefd4842132` | 265.0 MB |
|
|
104
|
+
| `bfcdfa41d22d74e9a7923186dec006515bf5cb3959f442c8c8425f83372612e1` | 265.0 MB |
|
|
105
|
+
| `c0edb363ef41383ecb80d7939293cba5eb0bd9151a88a07caa74e59ae618ded2` | 265.0 MB |
|
|
106
|
+
| `c1a72a67923c6f0c4b23d1de59f66311ac2f94b5ed42734038eb08a340c3b810` | 254.7 MB |
|
|
107
|
+
| `c7c273aacfe9e82cc02fea93730034ea3915470591365fb0c52857009ab174d3` | 254.7 MB |
|
|
108
|
+
| `c60930e286b2683bfc655b56252c2624c2545fe11637bad7b5d211a9a10c41ac` | 269.1 MB |
|
|
109
|
+
| `c6102356a0c59322f16a907a195d0f9c05bdddd7ba0c01cf586897bfd4d2c679` | 293.3 MB |
|
|
110
|
+
| `c85397542ad9ee7b805131b5d77e65e41616c0ad3a7eb68d3cdbce63d587783a` | 254.6 MB |
|
|
111
|
+
| `ce222cc3ba6e05045b564744ddd5c6af3a2a7d4ba4532db7d5403f9e1fea5685` | 8.0 KB |
|
|
112
|
+
| `cf7f2df193d22c0062de1bff7fd646c15aa15f25f3594b78b3395cac9ea6a231` | 269.1 MB |
|
|
113
|
+
| `d1a355b920742e1d01bb898c15b156783b16f1b40081fb77d88bde07da29ba8d` | 254.6 MB |
|
|
114
|
+
| `d3fb29723ae04d2bf2dea2a6d742821d1e55174268554207aed28c18baee76ed` | 269.1 MB |
|
|
115
|
+
| `dcd49058ed78ab522473db0f88364d65907c26758d3357040fc5e6ae72439395` | 265.0 MB |
|
|
116
|
+
| `e57a03004afac14856bedffff9393723dcde8aec353c6f0c9415a55c920acd85` | 269.1 MB |
|
|
117
|
+
| `e98ba1e1375c3306ffa84baf0f092eb21bf7fe917af725abb4ae361c208f9d44` | 293.4 MB |
|
|
118
|
+
| `ec8e05bb3da0d0a44439c723a9b35c761466b510b20e878ba49ba79b9cd74f2a` | 269.1 MB |
|
|
119
|
+
| `ed48bc8b911338844e1a5d198ae2a7ad541a61234ed1d1a55d82eb6bbac5c863` | 269.1 MB |
|
|
120
|
+
| `efe8126ff3ef1a5102704b22899a25791714940ec80019824e1bd6ff9b21be2f` | 269.3 MB |
|
|
121
|
+
| `f38e31518a0c908df957b016e63968c47f7eb17c1b8ccf3f1dccc0a3870c9768` | 254.6 MB |
|
|
122
|
+
| `f45df16cedc945536b26dde1b5d092476f8595bf34d3ec76e8202d4bd8656188` | 269.5 MB |
|
|
123
|
+
| `f52b574ae737235d5ba1a280c5d4aa762b03756fad8c3fa5a1219023108d7da4` | 254.6 MB |
|
|
124
|
+
| `f902fffcf4c89fcdec2c27821cddbcc1207a017d8f8322d437399de758bacbf4` | 254.7 MB |
|
|
125
|
+
| `f1454f19350a65b56e0e9ae33555848cdd94ff1c262856a26abc158fce5b8ee0` | 265.0 MB |
|
|
126
|
+
| `f9198b3862049b7da219a9e2c6dfc4a3400ed727c34c885bc992f1ba8c4f3fff` | 265.0 MB |
|
|
127
|
+
| `f13230762a2e3e3b5a2b44eb30f13e26f8302b6f0e68e256f0268ff4bec88915` | 254.6 MB |
|
|
128
|
+
| `fa022d288d53b6c7b0b303c72c09cc6c2b4aed2b025c3954e8ef9360dd277117` | 254.6 MB |
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Named Volumes (Project Volumes)
|
|
133
|
+
|
|
134
|
+
| Volume Name | Size | Project |
|
|
135
|
+
|-------------|------|---------|
|
|
136
|
+
| `Sue_frontend_node_modules` | 868.6 MB | Sue |
|
|
137
|
+
| `Sue_postgres_data` | 780.7 MB | Sue |
|
|
138
|
+
| `Sue_sonarqube_data` | 322.1 MB | Sue |
|
|
139
|
+
| `Sue_backend_node_modules` | 257.4 MB | Sue |
|
|
140
|
+
| `Sue_sonarqube_postgres_data` | 147.7 MB | Sue |
|
|
141
|
+
| `Sue_redis_data` | 110.4 MB | Sue |
|
|
142
|
+
| `Sue_test_postgres_data` | 45.6 MB | Sue |
|
|
143
|
+
| `Sue_sonarqube_extensions` | 28.0 KB | Sue |
|
|
144
|
+
| `Sue_sonarqube_logs` | 4.6 MB | Sue |
|
|
145
|
+
| `Jake_backend_node_modules` | 526.3 MB | Jake |
|
|
146
|
+
| `Jake_frontend_node_modules` | 446.0 MB | Jake |
|
|
147
|
+
| `Jake_sonarqube_data` | 321.8 MB | Jake |
|
|
148
|
+
| `Jake_postgres_data` | 298.8 MB | Jake |
|
|
149
|
+
| `Jake_sonarqube_postgres_data` | 144.2 MB | Jake |
|
|
150
|
+
| `Jake_redis_data` | 130.5 MB | Jake |
|
|
151
|
+
| `Jake_test_postgres_data` | 45.6 MB | Jake |
|
|
152
|
+
| `Jake_sonarqube_extensions` | 28.0 KB | Jake |
|
|
153
|
+
| `Jake_sonarqube_logs` | 160.0 KB | Jake |
|
|
154
|
+
| `bob_postgres_data` | 69.1 MB | bob |
|
|
155
|
+
| `bob_redis_data` | 22.6 MB | bob |
|
|
156
|
+
| `bob_test_postgres_data` | 45.6 MB | bob |
|
|
157
|
+
| `bob_backend_node_modules` | 254.7 MB | bob |
|
|
158
|
+
| `sam_postgres_data` | 69.9 MB | sam |
|
|
159
|
+
| `sam_redis_data` | 10.2 MB | sam |
|
|
160
|
+
| `sam_test_postgres_data` | 45.6 MB | sam |
|
|
161
|
+
| `sam_backend_node_modules` | 254.6 MB | sam |
|
|
162
|
+
| `Amy_postgres_data` | 48.6 MB | Amy |
|
|
163
|
+
| `Amy_redis_data` | 1.2 MB | Amy |
|
|
164
|
+
| `Amy_test_postgres_data` | 45.6 MB | Amy |
|
|
165
|
+
| `Amy_backend_node_modules` | 254.7 MB | Amy |
|
|
166
|
+
| `Monica_postgres_data` | 69.3 MB | Monica |
|
|
167
|
+
| `Monica_redis_data` | 6.7 MB | Monica |
|
|
168
|
+
| `Monica_test_postgres_data` | 45.6 MB | Monica |
|
|
169
|
+
| `Monica_backend_node_modules` | 254.6 MB | Monica |
|
|
170
|
+
| `portainer_data` | 76.0 KB | System |
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Cleanup Commands
|
|
175
|
+
|
|
176
|
+
### Remove all orphaned anonymous volumes (safe):
|
|
177
|
+
```bash
|
|
178
|
+
docker volume prune
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Remove specific orphaned volumes manually:
|
|
182
|
+
```bash
|
|
183
|
+
# Copy and paste the volume IDs from the ORPHANED section above
|
|
184
|
+
docker volume rm <volume_id>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Remove all volumes for a specific project (e.g., bob):
|
|
188
|
+
```bash
|
|
189
|
+
docker volume rm bob_postgres_data bob_redis_data bob_test_postgres_data bob_backend_node_modules
|
|
190
|
+
```
|
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.19",
|
|
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": [
|
|
@@ -1,471 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# File: .claude/hooks/bmad-tts-injector.sh
|
|
4
|
-
#
|
|
5
|
-
# AgentVibes - Finally, your AI Agents can Talk Back! Text-to-Speech WITH personality for AI Assistants!
|
|
6
|
-
# Website: https://agentvibes.org
|
|
7
|
-
# Repository: https://github.com/paulpreibisch/AgentVibes
|
|
8
|
-
#
|
|
9
|
-
# Co-created by Paul Preibisch with Claude AI
|
|
10
|
-
# Copyright (c) 2025 Paul Preibisch
|
|
11
|
-
#
|
|
12
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
-
# you may not use this file except in compliance with the License.
|
|
14
|
-
# You may obtain a copy of the License at
|
|
15
|
-
#
|
|
16
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
-
#
|
|
18
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
19
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
-
# See the License for the specific language governing permissions and
|
|
22
|
-
# limitations under the License.
|
|
23
|
-
#
|
|
24
|
-
# DISCLAIMER: This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
-
# express or implied. Use at your own risk. See the Apache License for details.
|
|
26
|
-
#
|
|
27
|
-
# ---
|
|
28
|
-
#
|
|
29
|
-
# @fileoverview BMAD TTS Injection Manager - Patches BMAD agents for TTS integration
|
|
30
|
-
# @context Automatically modifies BMAD agent YAML files to include AgentVibes TTS capabilities
|
|
31
|
-
# @architecture Injects TTS hooks into activation-instructions and core_principles sections
|
|
32
|
-
# @dependencies bmad-core/agents/*.md files, play-tts.sh, bmad-voice-manager.sh
|
|
33
|
-
# @entrypoints Called via bmad-tts-injector.sh {enable|disable|status|restore}
|
|
34
|
-
# @patterns File patching with backup, provider-aware voice mapping, injection markers for idempotency
|
|
35
|
-
# @related play-tts.sh, bmad-voice-manager.sh, .bmad-core/agents/*.md
|
|
36
|
-
#
|
|
37
|
-
|
|
38
|
-
set -e # Exit on error
|
|
39
|
-
|
|
40
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
41
|
-
CLAUDE_DIR="$(dirname "$SCRIPT_DIR")"
|
|
42
|
-
|
|
43
|
-
# Colors for output
|
|
44
|
-
GREEN='\033[0;32m'
|
|
45
|
-
YELLOW='\033[1;33m'
|
|
46
|
-
RED='\033[0;31m'
|
|
47
|
-
CYAN='\033[0;36m'
|
|
48
|
-
GRAY='\033[0;90m'
|
|
49
|
-
NC='\033[0m' # No Color
|
|
50
|
-
|
|
51
|
-
# Detect BMAD installation and version
|
|
52
|
-
# Supports both v4 (.bmad-core/) and v6-alpha (bmad/) installations
|
|
53
|
-
detect_bmad() {
|
|
54
|
-
local bmad_core_dir=""
|
|
55
|
-
|
|
56
|
-
# Check for v6-alpha first (newer version)
|
|
57
|
-
if [[ -d "bmad" ]]; then
|
|
58
|
-
bmad_core_dir="bmad"
|
|
59
|
-
elif [[ -d "../bmad" ]]; then
|
|
60
|
-
bmad_core_dir="../bmad"
|
|
61
|
-
# Check for v4 (legacy)
|
|
62
|
-
elif [[ -d ".bmad-core" ]]; then
|
|
63
|
-
bmad_core_dir=".bmad-core"
|
|
64
|
-
elif [[ -d "../.bmad-core" ]]; then
|
|
65
|
-
bmad_core_dir="../.bmad-core"
|
|
66
|
-
# Check for bmad-core (without dot prefix, legacy variant)
|
|
67
|
-
elif [[ -d "bmad-core" ]]; then
|
|
68
|
-
bmad_core_dir="bmad-core"
|
|
69
|
-
elif [[ -d "../bmad-core" ]]; then
|
|
70
|
-
bmad_core_dir="../bmad-core"
|
|
71
|
-
else
|
|
72
|
-
echo -e "${RED}❌ BMAD installation not found${NC}" >&2
|
|
73
|
-
echo -e "${GRAY} Looked for bmad/, .bmad-core/, or bmad-core/ directory${NC}" >&2
|
|
74
|
-
return 1
|
|
75
|
-
fi
|
|
76
|
-
|
|
77
|
-
echo "$bmad_core_dir"
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
# Find all BMAD agents
|
|
81
|
-
find_agents() {
|
|
82
|
-
local bmad_core="$1"
|
|
83
|
-
local agents_dir=""
|
|
84
|
-
|
|
85
|
-
# Check for v6-alpha structure (bmad/bmm/agents/)
|
|
86
|
-
if [[ -d "$bmad_core/bmm/agents" ]]; then
|
|
87
|
-
agents_dir="$bmad_core/bmm/agents"
|
|
88
|
-
# Check for v4 structure (.bmad-core/agents/)
|
|
89
|
-
elif [[ -d "$bmad_core/agents" ]]; then
|
|
90
|
-
agents_dir="$bmad_core/agents"
|
|
91
|
-
else
|
|
92
|
-
echo -e "${RED}❌ Agents directory not found in $bmad_core${NC}" >&2
|
|
93
|
-
echo -e "${GRAY} Tried: $bmad_core/bmm/agents/ and $bmad_core/agents/${NC}" >&2
|
|
94
|
-
return 1
|
|
95
|
-
fi
|
|
96
|
-
|
|
97
|
-
find "$agents_dir" -name "*.md" -type f
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
# Check if agent has TTS injection
|
|
101
|
-
has_tts_injection() {
|
|
102
|
-
local agent_file="$1"
|
|
103
|
-
|
|
104
|
-
# Check for v4 marker (YAML comment)
|
|
105
|
-
if grep -q "# AGENTVIBES-TTS-INJECTION" "$agent_file" 2>/dev/null; then
|
|
106
|
-
return 0
|
|
107
|
-
fi
|
|
108
|
-
|
|
109
|
-
# Check for v6 marker (XML attribute or text)
|
|
110
|
-
if grep -q "AGENTVIBES TTS INJECTION" "$agent_file" 2>/dev/null; then
|
|
111
|
-
return 0
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
if grep -q 'tts="agentvibes"' "$agent_file" 2>/dev/null; then
|
|
115
|
-
return 0
|
|
116
|
-
fi
|
|
117
|
-
|
|
118
|
-
return 1
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
# Extract agent ID from file
|
|
122
|
-
get_agent_id() {
|
|
123
|
-
local agent_file="$1"
|
|
124
|
-
|
|
125
|
-
# Look for "id: <agent-id>" in YAML block
|
|
126
|
-
local agent_id=$(grep -E "^ id:" "$agent_file" | head -1 | awk '{print $2}' | tr -d '"' | tr -d "'")
|
|
127
|
-
|
|
128
|
-
if [[ -z "$agent_id" ]]; then
|
|
129
|
-
# Fallback: use filename without extension
|
|
130
|
-
agent_id=$(basename "$agent_file" .md)
|
|
131
|
-
fi
|
|
132
|
-
|
|
133
|
-
echo "$agent_id"
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
# Get voice for agent from BMAD voice mapping
|
|
137
|
-
get_agent_voice() {
|
|
138
|
-
local agent_id="$1"
|
|
139
|
-
|
|
140
|
-
# Use bmad-voice-manager.sh to get voice
|
|
141
|
-
if [[ -f "$SCRIPT_DIR/bmad-voice-manager.sh" ]]; then
|
|
142
|
-
local voice=$("$SCRIPT_DIR/bmad-voice-manager.sh" get-voice "$agent_id" 2>/dev/null || echo "")
|
|
143
|
-
echo "$voice"
|
|
144
|
-
fi
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
# Map ElevenLabs voice to Piper equivalent
|
|
148
|
-
map_voice_to_provider() {
|
|
149
|
-
local elevenlabs_voice="$1"
|
|
150
|
-
local provider="$2"
|
|
151
|
-
|
|
152
|
-
# If provider is elevenlabs or empty, return as-is
|
|
153
|
-
if [[ "$provider" != "piper" ]]; then
|
|
154
|
-
echo "$elevenlabs_voice"
|
|
155
|
-
return
|
|
156
|
-
fi
|
|
157
|
-
|
|
158
|
-
# Map ElevenLabs voices to Piper equivalents
|
|
159
|
-
case "$elevenlabs_voice" in
|
|
160
|
-
"Jessica Anne Bogart"|"Aria")
|
|
161
|
-
echo "en_US-lessac-medium"
|
|
162
|
-
;;
|
|
163
|
-
"Matthew Schmitz"|"Archer"|"Michael")
|
|
164
|
-
echo "en_US-danny-low"
|
|
165
|
-
;;
|
|
166
|
-
"Burt Reynolds"|"Cowboy Bob")
|
|
167
|
-
echo "en_US-joe-medium"
|
|
168
|
-
;;
|
|
169
|
-
"Tiffany"|"Ms. Walker")
|
|
170
|
-
echo "en_US-amy-medium"
|
|
171
|
-
;;
|
|
172
|
-
"Ralf Eisend"|"Tom")
|
|
173
|
-
echo "en_US-libritts-high"
|
|
174
|
-
;;
|
|
175
|
-
*)
|
|
176
|
-
# Default to amy for unknown voices
|
|
177
|
-
echo "en_US-amy-medium"
|
|
178
|
-
;;
|
|
179
|
-
esac
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
# Get current TTS provider
|
|
183
|
-
get_current_provider() {
|
|
184
|
-
# Check project-local first, then global
|
|
185
|
-
if [[ -f ".claude/tts-provider.txt" ]]; then
|
|
186
|
-
cat ".claude/tts-provider.txt" 2>/dev/null || echo "elevenlabs"
|
|
187
|
-
elif [[ -f "$HOME/.claude/tts-provider.txt" ]]; then
|
|
188
|
-
cat "$HOME/.claude/tts-provider.txt" 2>/dev/null || echo "elevenlabs"
|
|
189
|
-
else
|
|
190
|
-
echo "elevenlabs"
|
|
191
|
-
fi
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
# Inject TTS hook into agent activation instructions
|
|
195
|
-
inject_tts() {
|
|
196
|
-
local agent_file="$1"
|
|
197
|
-
local agent_id=$(get_agent_id "$agent_file")
|
|
198
|
-
local elevenlabs_voice=$(get_agent_voice "$agent_id")
|
|
199
|
-
local current_provider=$(get_current_provider)
|
|
200
|
-
local agent_voice=$(map_voice_to_provider "$elevenlabs_voice" "$current_provider")
|
|
201
|
-
|
|
202
|
-
# Check if already injected
|
|
203
|
-
if has_tts_injection "$agent_file"; then
|
|
204
|
-
echo -e "${YELLOW}⚠️ TTS already injected in: $(basename "$agent_file")${NC}"
|
|
205
|
-
return 0
|
|
206
|
-
fi
|
|
207
|
-
|
|
208
|
-
# Create backup
|
|
209
|
-
cp "$agent_file" "$agent_file.backup-pre-tts"
|
|
210
|
-
|
|
211
|
-
# Detect v4 vs v6 structure
|
|
212
|
-
local is_v6=false
|
|
213
|
-
if grep -q "<activation" "$agent_file"; then
|
|
214
|
-
is_v6=true
|
|
215
|
-
elif ! grep -q "activation-instructions:" "$agent_file"; then
|
|
216
|
-
echo -e "${RED}❌ No activation section found in: $(basename "$agent_file")${NC}"
|
|
217
|
-
return 1
|
|
218
|
-
fi
|
|
219
|
-
|
|
220
|
-
# Create TTS injection script based on version
|
|
221
|
-
if [[ "$is_v6" == "true" ]]; then
|
|
222
|
-
# v6 format: XML-style with <step n="4.5">
|
|
223
|
-
local tts_step=""
|
|
224
|
-
if [[ -n "$agent_voice" ]]; then
|
|
225
|
-
tts_step=" <step n=\"4.5\" tts=\"agentvibes\">🎤 AGENTVIBES TTS INJECTION:
|
|
226
|
-
- Create context: echo \"${agent_id}\" > .bmad-agent-context (Bash tool)
|
|
227
|
-
- Speak greeting: .claude/hooks/play-tts.sh \"Hello! I'm ready to help you.\" \"${agent_voice}\" (Bash tool)
|
|
228
|
-
- CRITICAL: Before EVERY response, scan for questions/prompts and speak them using Bash tool</step>"
|
|
229
|
-
else
|
|
230
|
-
tts_step=" <step n=\"4.5\" tts=\"agentvibes\">🎤 AGENTVIBES TTS INJECTION:
|
|
231
|
-
- Create context: echo \"${agent_id}\" > .bmad-agent-context (Bash tool)
|
|
232
|
-
- Speak greeting: .claude/hooks/play-tts.sh \"Hello! I'm ready to help you.\" (Bash tool)
|
|
233
|
-
- CRITICAL: Before EVERY response, scan for questions/prompts and speak them using Bash tool</step>"
|
|
234
|
-
fi
|
|
235
|
-
|
|
236
|
-
# Insert after step 4 (greeting) - only first match
|
|
237
|
-
awk -v tts="$tts_step" '
|
|
238
|
-
!done && /<step n="4">.*[Gg]reet/ {
|
|
239
|
-
print
|
|
240
|
-
print tts
|
|
241
|
-
done=1
|
|
242
|
-
next
|
|
243
|
-
}
|
|
244
|
-
{ print }
|
|
245
|
-
' "$agent_file" > "$agent_file.tmp"
|
|
246
|
-
|
|
247
|
-
# If no change (step 4 didn't match), restore backup and report
|
|
248
|
-
if ! diff -q "$agent_file.backup-pre-tts" "$agent_file.tmp" > /dev/null 2>&1; then
|
|
249
|
-
: # Changes were made, continue
|
|
250
|
-
else
|
|
251
|
-
# No changes - step 4 pattern didn't match
|
|
252
|
-
rm "$agent_file.tmp"
|
|
253
|
-
mv "$agent_file.backup-pre-tts" "$agent_file"
|
|
254
|
-
echo -e "${RED}❌ Could not find step 4 with greeting in: $(basename "$agent_file")${NC}"
|
|
255
|
-
return 1
|
|
256
|
-
fi
|
|
257
|
-
|
|
258
|
-
else
|
|
259
|
-
# v4 format: YAML-style with STEP 4:
|
|
260
|
-
local activation_injection=""
|
|
261
|
-
if [[ -n "$agent_voice" ]]; then
|
|
262
|
-
activation_injection=" - # AGENTVIBES-TTS-INJECTION: STEP 3.5 - Announce activation with TTS
|
|
263
|
-
- STEP 3.5a: Use Bash tool to create context file: echo \"${agent_id}\" > .bmad-agent-context
|
|
264
|
-
- STEP 3.5b: Use Bash tool to speak: .claude/hooks/play-tts.sh \"Agent ${agent_id} activated and ready\" \"${agent_voice}\"
|
|
265
|
-
- AGENTVIBES-TTS-INJECTION: Before every response, scan for questions and speak them using Bash tool"
|
|
266
|
-
else
|
|
267
|
-
activation_injection=" - # AGENTVIBES-TTS-INJECTION: STEP 3.5 - Announce activation with TTS
|
|
268
|
-
- STEP 3.5a: Use Bash tool to create context file: echo \"${agent_id}\" > .bmad-agent-context
|
|
269
|
-
- STEP 3.5b: Use Bash tool to speak: .claude/hooks/play-tts.sh \"Agent ${agent_id} activated and ready\"
|
|
270
|
-
- AGENTVIBES-TTS-INJECTION: Before every response, scan for questions and speak them using Bash tool"
|
|
271
|
-
fi
|
|
272
|
-
|
|
273
|
-
# Insert after STEP 4: Greet
|
|
274
|
-
awk -v activation="$activation_injection" '
|
|
275
|
-
/STEP 4:.*[Gg]reet/ {
|
|
276
|
-
print
|
|
277
|
-
print activation
|
|
278
|
-
next
|
|
279
|
-
}
|
|
280
|
-
{ print }
|
|
281
|
-
' "$agent_file" > "$agent_file.tmp"
|
|
282
|
-
fi
|
|
283
|
-
|
|
284
|
-
mv "$agent_file.tmp" "$agent_file"
|
|
285
|
-
|
|
286
|
-
if [[ "$current_provider" == "piper" ]] && [[ -n "$elevenlabs_voice" ]]; then
|
|
287
|
-
echo -e "${GREEN}✅ Injected TTS into: $(basename "$agent_file") → Voice: ${agent_voice:-default} (${current_provider}: ${elevenlabs_voice} → ${agent_voice})${NC}"
|
|
288
|
-
else
|
|
289
|
-
echo -e "${GREEN}✅ Injected TTS into: $(basename "$agent_file") → Voice: ${agent_voice:-default}${NC}"
|
|
290
|
-
fi
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
# Remove TTS injection from agent
|
|
294
|
-
remove_tts() {
|
|
295
|
-
local agent_file="$1"
|
|
296
|
-
|
|
297
|
-
# Check if has injection
|
|
298
|
-
if ! has_tts_injection "$agent_file"; then
|
|
299
|
-
echo -e "${GRAY} No TTS in: $(basename "$agent_file")${NC}"
|
|
300
|
-
return 0
|
|
301
|
-
fi
|
|
302
|
-
|
|
303
|
-
# Create backup
|
|
304
|
-
cp "$agent_file" "$agent_file.backup-tts-removal"
|
|
305
|
-
|
|
306
|
-
# Remove TTS injection lines
|
|
307
|
-
sed -i.bak '/# AGENTVIBES-TTS-INJECTION/,+1d' "$agent_file"
|
|
308
|
-
rm -f "$agent_file.bak"
|
|
309
|
-
|
|
310
|
-
echo -e "${GREEN}✅ Removed TTS from: $(basename "$agent_file")${NC}"
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
# Show status of TTS injections
|
|
314
|
-
show_status() {
|
|
315
|
-
local bmad_core=$(detect_bmad)
|
|
316
|
-
if [[ -z "$bmad_core" ]]; then
|
|
317
|
-
return 1
|
|
318
|
-
fi
|
|
319
|
-
|
|
320
|
-
echo -e "${CYAN}📊 BMAD TTS Injection Status:${NC}"
|
|
321
|
-
echo ""
|
|
322
|
-
|
|
323
|
-
local agents=$(find_agents "$bmad_core")
|
|
324
|
-
local enabled_count=0
|
|
325
|
-
local disabled_count=0
|
|
326
|
-
|
|
327
|
-
while IFS= read -r agent_file; do
|
|
328
|
-
local agent_id=$(get_agent_id "$agent_file")
|
|
329
|
-
local agent_name=$(basename "$agent_file" .md)
|
|
330
|
-
|
|
331
|
-
if has_tts_injection "$agent_file"; then
|
|
332
|
-
local voice=$(get_agent_voice "$agent_id")
|
|
333
|
-
echo -e " ${GREEN}✅${NC} $agent_name (${agent_id}) → Voice: ${voice:-default}"
|
|
334
|
-
((enabled_count++))
|
|
335
|
-
else
|
|
336
|
-
echo -e " ${GRAY}❌ $agent_name (${agent_id})${NC}"
|
|
337
|
-
((disabled_count++))
|
|
338
|
-
fi
|
|
339
|
-
done <<< "$agents"
|
|
340
|
-
|
|
341
|
-
echo ""
|
|
342
|
-
echo -e "${CYAN}Summary:${NC} $enabled_count enabled, $disabled_count disabled"
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
# Enable TTS for all agents
|
|
346
|
-
enable_all() {
|
|
347
|
-
local bmad_core=$(detect_bmad)
|
|
348
|
-
if [[ -z "$bmad_core" ]]; then
|
|
349
|
-
return 1
|
|
350
|
-
fi
|
|
351
|
-
|
|
352
|
-
echo -e "${CYAN}🎤 Enabling TTS for all BMAD agents...${NC}"
|
|
353
|
-
echo ""
|
|
354
|
-
|
|
355
|
-
local agents=$(find_agents "$bmad_core")
|
|
356
|
-
local success_count=0
|
|
357
|
-
local skip_count=0
|
|
358
|
-
|
|
359
|
-
while IFS= read -r agent_file; do
|
|
360
|
-
if has_tts_injection "$agent_file"; then
|
|
361
|
-
((skip_count++))
|
|
362
|
-
continue
|
|
363
|
-
fi
|
|
364
|
-
|
|
365
|
-
if inject_tts "$agent_file"; then
|
|
366
|
-
((success_count++))
|
|
367
|
-
fi
|
|
368
|
-
done <<< "$agents"
|
|
369
|
-
|
|
370
|
-
echo ""
|
|
371
|
-
echo -e "${GREEN}🎉 TTS enabled for $success_count agents${NC}"
|
|
372
|
-
[[ $skip_count -gt 0 ]] && echo -e "${YELLOW} Skipped $skip_count agents (already enabled)${NC}"
|
|
373
|
-
echo ""
|
|
374
|
-
echo -e "${CYAN}💡 BMAD agents will now speak when activated!${NC}"
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
# Disable TTS for all agents
|
|
378
|
-
disable_all() {
|
|
379
|
-
local bmad_core=$(detect_bmad)
|
|
380
|
-
if [[ -z "$bmad_core" ]]; then
|
|
381
|
-
return 1
|
|
382
|
-
fi
|
|
383
|
-
|
|
384
|
-
echo -e "${CYAN}🔇 Disabling TTS for all BMAD agents...${NC}"
|
|
385
|
-
echo ""
|
|
386
|
-
|
|
387
|
-
local agents=$(find_agents "$bmad_core")
|
|
388
|
-
local success_count=0
|
|
389
|
-
|
|
390
|
-
while IFS= read -r agent_file; do
|
|
391
|
-
if remove_tts "$agent_file"; then
|
|
392
|
-
((success_count++))
|
|
393
|
-
fi
|
|
394
|
-
done <<< "$agents"
|
|
395
|
-
|
|
396
|
-
echo ""
|
|
397
|
-
echo -e "${GREEN}✅ TTS disabled for $success_count agents${NC}"
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
# Restore from backup
|
|
401
|
-
restore_backup() {
|
|
402
|
-
local bmad_core=$(detect_bmad)
|
|
403
|
-
if [[ -z "$bmad_core" ]]; then
|
|
404
|
-
return 1
|
|
405
|
-
fi
|
|
406
|
-
|
|
407
|
-
echo -e "${CYAN}🔄 Restoring agents from backup...${NC}"
|
|
408
|
-
echo ""
|
|
409
|
-
|
|
410
|
-
# Determine agents directory (v6 vs v4)
|
|
411
|
-
local agents_dir=""
|
|
412
|
-
if [[ -d "$bmad_core/bmm/agents" ]]; then
|
|
413
|
-
agents_dir="$bmad_core/bmm/agents"
|
|
414
|
-
elif [[ -d "$bmad_core/agents" ]]; then
|
|
415
|
-
agents_dir="$bmad_core/agents"
|
|
416
|
-
else
|
|
417
|
-
echo -e "${RED}❌ Agents directory not found${NC}"
|
|
418
|
-
return 1
|
|
419
|
-
fi
|
|
420
|
-
|
|
421
|
-
local backup_count=0
|
|
422
|
-
|
|
423
|
-
for backup_file in "$agents_dir"/*.backup-pre-tts; do
|
|
424
|
-
if [[ -f "$backup_file" ]]; then
|
|
425
|
-
local original_file="${backup_file%.backup-pre-tts}"
|
|
426
|
-
cp "$backup_file" "$original_file"
|
|
427
|
-
echo -e "${GREEN}✅ Restored: $(basename "$original_file")${NC}"
|
|
428
|
-
((backup_count++))
|
|
429
|
-
fi
|
|
430
|
-
done
|
|
431
|
-
|
|
432
|
-
if [[ $backup_count -eq 0 ]]; then
|
|
433
|
-
echo -e "${YELLOW}⚠️ No backups found${NC}"
|
|
434
|
-
else
|
|
435
|
-
echo ""
|
|
436
|
-
echo -e "${GREEN}✅ Restored $backup_count agents from backup${NC}"
|
|
437
|
-
fi
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
# Main command dispatcher
|
|
441
|
-
case "${1:-help}" in
|
|
442
|
-
enable)
|
|
443
|
-
enable_all
|
|
444
|
-
;;
|
|
445
|
-
disable)
|
|
446
|
-
disable_all
|
|
447
|
-
;;
|
|
448
|
-
status)
|
|
449
|
-
show_status
|
|
450
|
-
;;
|
|
451
|
-
restore)
|
|
452
|
-
restore_backup
|
|
453
|
-
;;
|
|
454
|
-
help|*)
|
|
455
|
-
echo -e "${CYAN}AgentVibes BMAD TTS Injection Manager${NC}"
|
|
456
|
-
echo ""
|
|
457
|
-
echo "Usage: bmad-tts-injector.sh {enable|disable|status|restore}"
|
|
458
|
-
echo ""
|
|
459
|
-
echo "Commands:"
|
|
460
|
-
echo " enable Inject TTS hooks into all BMAD agents"
|
|
461
|
-
echo " disable Remove TTS hooks from all BMAD agents"
|
|
462
|
-
echo " status Show TTS injection status for all agents"
|
|
463
|
-
echo " restore Restore agents from backup (undo changes)"
|
|
464
|
-
echo ""
|
|
465
|
-
echo "What it does:"
|
|
466
|
-
echo " • Automatically patches BMAD agent activation instructions"
|
|
467
|
-
echo " • Adds TTS calls when agents greet users"
|
|
468
|
-
echo " • Uses voice mapping from AgentVibes BMAD plugin"
|
|
469
|
-
echo " • Creates backups before modifying files"
|
|
470
|
-
;;
|
|
471
|
-
esac
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Quick TTS playback script with session-specific voice support
|
|
3
|
-
# Usage: play-tts.sh "Text to speak" [voice_name_or_id]
|
|
4
|
-
#
|
|
5
|
-
# Examples:
|
|
6
|
-
# play-tts.sh "Hello world" # Uses default voice from voice manager
|
|
7
|
-
# play-tts.sh "Hello world" "Sarah" # Uses Sarah voice by name
|
|
8
|
-
# play-tts.sh "Hello world" "KTPVrSVAEUSJRClDzBw7" # Uses voice by direct ID
|
|
9
|
-
#
|
|
10
|
-
# This allows different sessions to use different voices for easy identification!
|
|
11
|
-
|
|
12
|
-
# Fix locale warnings
|
|
13
|
-
export LC_ALL=C
|
|
14
|
-
|
|
15
|
-
TEXT="$1"
|
|
16
|
-
VOICE_OVERRIDE="$2" # Optional: voice name or direct voice ID
|
|
17
|
-
API_KEY="${ELEVENLABS_API_KEY}"
|
|
18
|
-
|
|
19
|
-
# Check for project-local pretext configuration
|
|
20
|
-
CONFIG_DIR="${CLAUDE_PROJECT_DIR:-.}/.claude/config"
|
|
21
|
-
CONFIG_FILE="$CONFIG_DIR/agentvibes.json"
|
|
22
|
-
|
|
23
|
-
if [[ -f "$CONFIG_FILE" ]] && command -v jq &> /dev/null; then
|
|
24
|
-
PRETEXT=$(jq -r '.pretext // empty' "$CONFIG_FILE" 2>/dev/null)
|
|
25
|
-
if [[ -n "$PRETEXT" ]]; then
|
|
26
|
-
TEXT="$PRETEXT: $TEXT"
|
|
27
|
-
fi
|
|
28
|
-
fi
|
|
29
|
-
|
|
30
|
-
# Limit text length to prevent API issues (max 500 chars for safety)
|
|
31
|
-
if [ ${#TEXT} -gt 500 ]; then
|
|
32
|
-
TEXT="${TEXT:0:497}..."
|
|
33
|
-
echo "⚠️ Text truncated to 500 characters for API safety"
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
# Source the single voice configuration file
|
|
37
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
38
|
-
source "$SCRIPT_DIR/voices-config.sh"
|
|
39
|
-
|
|
40
|
-
# Determine which voice to use
|
|
41
|
-
VOICE_ID=""
|
|
42
|
-
|
|
43
|
-
if [[ -n "$VOICE_OVERRIDE" ]]; then
|
|
44
|
-
# Check if override is a voice name (lookup in mapping)
|
|
45
|
-
if [[ -n "${VOICES[$VOICE_OVERRIDE]}" ]]; then
|
|
46
|
-
VOICE_ID="${VOICES[$VOICE_OVERRIDE]}"
|
|
47
|
-
echo "🎤 Using voice: $VOICE_OVERRIDE (session-specific)"
|
|
48
|
-
# Check if override looks like a voice ID (alphanumeric string ~20 chars)
|
|
49
|
-
elif [[ "$VOICE_OVERRIDE" =~ ^[a-zA-Z0-9]{15,30}$ ]]; then
|
|
50
|
-
VOICE_ID="$VOICE_OVERRIDE"
|
|
51
|
-
echo "🎤 Using custom voice ID (session-specific)"
|
|
52
|
-
else
|
|
53
|
-
echo "⚠️ Unknown voice '$VOICE_OVERRIDE', using default"
|
|
54
|
-
fi
|
|
55
|
-
fi
|
|
56
|
-
|
|
57
|
-
# If no override or invalid override, use default from voice manager
|
|
58
|
-
if [[ -z "$VOICE_ID" ]]; then
|
|
59
|
-
VOICE_MANAGER_SCRIPT="$(dirname "$0")/voice-manager.sh"
|
|
60
|
-
if [[ -f "$VOICE_MANAGER_SCRIPT" ]]; then
|
|
61
|
-
VOICE_NAME=$("$VOICE_MANAGER_SCRIPT" get)
|
|
62
|
-
VOICE_ID="${VOICES[$VOICE_NAME]}"
|
|
63
|
-
fi
|
|
64
|
-
|
|
65
|
-
# Final fallback to Cowboy Bob default
|
|
66
|
-
if [[ -z "$VOICE_ID" ]]; then
|
|
67
|
-
echo "⚠️ No voice configured, using Cowboy Bob default"
|
|
68
|
-
VOICE_ID="${VOICES[Cowboy Bob]}"
|
|
69
|
-
fi
|
|
70
|
-
fi
|
|
71
|
-
|
|
72
|
-
if [ -z "$TEXT" ]; then
|
|
73
|
-
echo "Usage: $0 \"text to speak\""
|
|
74
|
-
exit 1
|
|
75
|
-
fi
|
|
76
|
-
|
|
77
|
-
if [ -z "$API_KEY" ]; then
|
|
78
|
-
echo "Error: ELEVENLABS_API_KEY not set"
|
|
79
|
-
exit 1
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
# Create audio file in project-local storage
|
|
83
|
-
# Use project directory if available, otherwise fall back to global
|
|
84
|
-
if [[ -n "$CLAUDE_PROJECT_DIR" ]]; then
|
|
85
|
-
AUDIO_DIR="$CLAUDE_PROJECT_DIR/.claude/audio"
|
|
86
|
-
else
|
|
87
|
-
# Fallback: try to find .claude directory in current path
|
|
88
|
-
CURRENT_DIR="$PWD"
|
|
89
|
-
while [[ "$CURRENT_DIR" != "/" ]]; do
|
|
90
|
-
if [[ -d "$CURRENT_DIR/.claude" ]]; then
|
|
91
|
-
AUDIO_DIR="$CURRENT_DIR/.claude/audio"
|
|
92
|
-
break
|
|
93
|
-
fi
|
|
94
|
-
CURRENT_DIR=$(dirname "$CURRENT_DIR")
|
|
95
|
-
done
|
|
96
|
-
# Final fallback to global if no project .claude found
|
|
97
|
-
if [[ -z "$AUDIO_DIR" ]]; then
|
|
98
|
-
AUDIO_DIR="$HOME/.claude/audio"
|
|
99
|
-
fi
|
|
100
|
-
fi
|
|
101
|
-
|
|
102
|
-
mkdir -p "$AUDIO_DIR"
|
|
103
|
-
TEMP_FILE="$AUDIO_DIR/tts-$(date +%s).mp3"
|
|
104
|
-
|
|
105
|
-
# Generate audio
|
|
106
|
-
curl -s -X POST "https://api.elevenlabs.io/v1/text-to-speech/${VOICE_ID}" \
|
|
107
|
-
-H "xi-api-key: ${API_KEY}" \
|
|
108
|
-
-H "Content-Type: application/json" \
|
|
109
|
-
-d "{\"text\":\"${TEXT}\",\"model_id\":\"eleven_monolingual_v1\",\"voice_settings\":{\"stability\":0.5,\"similarity_boost\":0.75}}" \
|
|
110
|
-
-o "${TEMP_FILE}"
|
|
111
|
-
|
|
112
|
-
# Add silence padding to prevent WSL audio static
|
|
113
|
-
if [ -f "${TEMP_FILE}" ]; then
|
|
114
|
-
# Check if ffmpeg is available for adding padding
|
|
115
|
-
if command -v ffmpeg &> /dev/null; then
|
|
116
|
-
PADDED_FILE="$AUDIO_DIR/tts-padded-$(date +%s).mp3"
|
|
117
|
-
# Add 200ms of silence at the beginning to prevent static
|
|
118
|
-
ffmpeg -f lavfi -i anullsrc=r=44100:cl=stereo:d=0.2 -i "${TEMP_FILE}" \
|
|
119
|
-
-filter_complex "[0:a][1:a]concat=n=2:v=0:a=1[out]" \
|
|
120
|
-
-map "[out]" -y "${PADDED_FILE}" 2>/dev/null
|
|
121
|
-
|
|
122
|
-
if [ -f "${PADDED_FILE}" ]; then
|
|
123
|
-
# Use padded file and clean up original
|
|
124
|
-
rm -f "${TEMP_FILE}"
|
|
125
|
-
TEMP_FILE="${PADDED_FILE}"
|
|
126
|
-
fi
|
|
127
|
-
# If padding failed, just use original file
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
# Play audio (WSL/Linux) in background to avoid blocking
|
|
131
|
-
(paplay "${TEMP_FILE}" 2>/dev/null || aplay "${TEMP_FILE}" 2>/dev/null || mpg123 "${TEMP_FILE}" 2>/dev/null) &
|
|
132
|
-
# Keep temp files for later review - cleaned up weekly by cron
|
|
133
|
-
echo "🎵 Saved to: ${TEMP_FILE}"
|
|
134
|
-
echo "🎤 Voice used: ${VOICE_NAME} (${VOICE_ID})"
|
|
135
|
-
else
|
|
136
|
-
echo "Failed to generate audio"
|
|
137
|
-
exit 1
|
|
138
|
-
fi
|
package/.mcp-minimal.json
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mcpServers": {
|
|
3
|
-
"sentry": {
|
|
4
|
-
"command": "npx",
|
|
5
|
-
"args": [
|
|
6
|
-
"@sentry/mcp-server@latest",
|
|
7
|
-
"--host=sentry.io"
|
|
8
|
-
],
|
|
9
|
-
"env": {
|
|
10
|
-
"SENTRY_ACCESS_TOKEN": "${SENTRY_ACCESS_TOKEN}",
|
|
11
|
-
"OPENAI_API_KEY": "${OPENAI_API_KEY}"
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
"whatsapp": {
|
|
15
|
-
"command": "/home/fire/.local/bin/uv",
|
|
16
|
-
"args": [
|
|
17
|
-
"--directory",
|
|
18
|
-
"/home/fire/claude/whatsapp-mcp/whatsapp-mcp-server",
|
|
19
|
-
"run",
|
|
20
|
-
"main.py"
|
|
21
|
-
]
|
|
22
|
-
},
|
|
23
|
-
"chrome-devtools": {
|
|
24
|
-
"command": "/home/fire/.nvm/versions/node/v22.20.0/bin/npx",
|
|
25
|
-
"args": [
|
|
26
|
-
"chrome-devtools-mcp@latest",
|
|
27
|
-
"--browserUrl=http://localhost:9222"
|
|
28
|
-
],
|
|
29
|
-
"env": {
|
|
30
|
-
"PATH": "/home/fire/.nvm/versions/node/v22.20.0/bin:${PATH}",
|
|
31
|
-
"NODE_PATH": "/home/fire/.nvm/versions/node/v22.20.0/lib/node_modules"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
"obsidian": {
|
|
35
|
-
"command": "/home/fire/.local/bin/uv",
|
|
36
|
-
"args": [
|
|
37
|
-
"--directory",
|
|
38
|
-
"/home/fire/claude/mcp_obsidian",
|
|
39
|
-
"run",
|
|
40
|
-
"mcp-obsidian"
|
|
41
|
-
],
|
|
42
|
-
"env": {
|
|
43
|
-
"OBSIDIAN_API_KEY": "${MAIN_VAULT_OBSIDIAN_KEY}",
|
|
44
|
-
"OBSIDIAN_HOST": "${OBSIDIAN_HOST:-127.0.0.1}",
|
|
45
|
-
"OBSIDIAN_PORT": "27124",
|
|
46
|
-
"OBSIDIAN_HTTPS": "true",
|
|
47
|
-
"OBSIDIAN_VERIFY_SSL": "false"
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
"elevenlabs": {
|
|
51
|
-
"command": "npx",
|
|
52
|
-
"args": ["@microagents/mcp-server-elevenlabs"],
|
|
53
|
-
"env": {
|
|
54
|
-
"ELEVENLABS_API_KEY": "${ELEVENLABS_API_KEY}",
|
|
55
|
-
"ELEVENLABS_MCP_BASE_PATH": "/home/fire/claude/SoraSage/teams/team-10/dev__globify__production/.claude/audio"
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
"spaceship": {
|
|
59
|
-
"command": "node",
|
|
60
|
-
"args": [
|
|
61
|
-
"/home/fire/claude/spaceship-mcp/dist/index.js"
|
|
62
|
-
],
|
|
63
|
-
"env": {
|
|
64
|
-
"SPACESHIP_API_KEY": "${SPACESHIP_API_KEY}",
|
|
65
|
-
"SPACESHIP_API_SECRET": "${SPACESHIP_API_SECRET}"
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
"sonarqube": {
|
|
69
|
-
"command": "docker",
|
|
70
|
-
"args": [
|
|
71
|
-
"run",
|
|
72
|
-
"-i",
|
|
73
|
-
"--name",
|
|
74
|
-
"sonarqube-mcp-server-agentvibes",
|
|
75
|
-
"--rm",
|
|
76
|
-
"-e",
|
|
77
|
-
"SONARQUBE_TOKEN",
|
|
78
|
-
"-e",
|
|
79
|
-
"SONARQUBE_ORG",
|
|
80
|
-
"mcp/sonarqube"
|
|
81
|
-
],
|
|
82
|
-
"env": {
|
|
83
|
-
"SONARQUBE_TOKEN": "${AGENTVIBES_SONARQUBE_TOKEN}",
|
|
84
|
-
"SONARQUBE_ORG": "${AGENTVIBES_SONARQUBE_ORG}"
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
package/.test-bmad-config
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
[ZoneTransfer]
|
|
2
|
-
ZoneId=3
|
|
3
|
-
ReferrerUrl=https://www.canva.com/
|
|
4
|
-
HostUrl=https://export-download.canva.com/fRU5Q/DAG2eUfRU5Q/2/0/0001-1153403610714354268.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQYCGKMUH5AO7UJ26%2F20251021%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251021T024124Z&X-Amz-Expires=87229&X-Amz-Signature=884995a892910b81bf02e2dc6003bbb3ed8a93f52561d45d63298bb53922a21e&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%2A%3DUTF-8%27%27Untitled%2520design.png&response-expires=Wed%2C%2022%20Oct%202025%2002%3A55%3A13%20GMT
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
[ZoneTransfer]
|
|
2
|
-
ZoneId=3
|
|
3
|
-
ReferrerUrl=https://sora.chatgpt.com/
|
|
4
|
-
HostUrl=https://videos.openai.com/az/vg-assets/assets%2Ftask_01k84jjqdre4a94gwhrjvxrmcc%2F1761090380_img_1.webp?se=2025-10-27T23%3A47%3A42Z&sp=r&sv=2024-08-04&sr=b&skoid=1af02b11-169c-463d-b441-d2ccfc9f02c8&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-10-21T23%3A38%3A46Z&ske=2025-10-28T23%3A43%3A46Z&sks=b&skv=2024-08-04&sig=YnhyNHHZNTvrxPzGVMR1e%2BXWpRxFJtAmBRHdDFQHv/4%3D&ac=oaivgprodscus
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
[ZoneTransfer]
|
|
2
|
-
ZoneId=3
|
|
3
|
-
ReferrerUrl=https://www.canva.com/
|
|
4
|
-
HostUrl=https://export-download.canva.com/KdRmo/DAG2d2KdRmo/4/0/0001-2945836257450757554.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQYCGKMUH5AO7UJ26%2F20251021%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251021T225916Z&X-Amz-Expires=8054&X-Amz-Signature=8d0a628517760b995ae1d6f71c8bb1d6cab49f4a61bffebc1d58a6d51829c0ef&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%2A%3DUTF-8%27%27npx%2520agentvibes%2520install.png&response-expires=Wed%2C%2022%20Oct%202025%2001%3A13%3A30%20GMT
|