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.
@@ -1 +1 @@
1
- 20251203
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 "${GREEN}🎉 TTS enabled for $success_count agents${NC}"
377
- [[ $skip_count -gt 0 ]] && echo -e "${YELLOW} Skipped $skip_count agents (already enabled)${NC}"
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.18",
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,2 +0,0 @@
1
- SAVED_MODE="1"
2
- SAVED_TEST_DIR="/home/fire/claude/tests/test48"
@@ -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