agentvibes 4.2.0 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/.agentvibes/bmad/bmad-voices.md +69 -69
  2. package/.agentvibes/config.json +12 -0
  3. package/.claude/activation-instructions +54 -54
  4. package/.claude/audio/tracks/README.md +52 -52
  5. package/.claude/commands/agent-vibes/add.md +21 -21
  6. package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
  7. package/.claude/commands/agent-vibes/agent.md +79 -79
  8. package/.claude/commands/agent-vibes/background-music.md +111 -111
  9. package/.claude/commands/agent-vibes/bmad.md +198 -198
  10. package/.claude/commands/agent-vibes/clean.md +18 -18
  11. package/.claude/commands/agent-vibes/cleanup.md +18 -18
  12. package/.claude/commands/agent-vibes/commands.json +145 -145
  13. package/.claude/commands/agent-vibes/effects.md +97 -97
  14. package/.claude/commands/agent-vibes/get.md +9 -9
  15. package/.claude/commands/agent-vibes/hide.md +91 -91
  16. package/.claude/commands/agent-vibes/language.md +23 -23
  17. package/.claude/commands/agent-vibes/learn.md +67 -67
  18. package/.claude/commands/agent-vibes/list.md +13 -13
  19. package/.claude/commands/agent-vibes/mute.md +37 -37
  20. package/.claude/commands/agent-vibes/preview.md +17 -17
  21. package/.claude/commands/agent-vibes/provider.md +68 -68
  22. package/.claude/commands/agent-vibes/replay-target.md +14 -14
  23. package/.claude/commands/agent-vibes/sample.md +12 -12
  24. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
  25. package/.claude/commands/agent-vibes/set-pretext.md +65 -65
  26. package/.claude/commands/agent-vibes/set-speed.md +41 -41
  27. package/.claude/commands/agent-vibes/show.md +84 -84
  28. package/.claude/commands/agent-vibes/switch.md +87 -87
  29. package/.claude/commands/agent-vibes/target-voice.md +26 -26
  30. package/.claude/commands/agent-vibes/target.md +30 -30
  31. package/.claude/commands/agent-vibes/translate.md +68 -68
  32. package/.claude/commands/agent-vibes/unmute.md +45 -45
  33. package/.claude/commands/agent-vibes/verbosity.md +89 -89
  34. package/.claude/commands/agent-vibes/whoami.md +7 -7
  35. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  36. package/.claude/commands/agent-vibes-rdp.md +24 -24
  37. package/.claude/config/agentvibes.json +1 -0
  38. package/.claude/config/audio-effects.cfg +2 -2
  39. package/.claude/config/audio-effects.cfg.sample +52 -52
  40. package/.claude/config/background-music-volume.txt +1 -0
  41. package/.claude/config/intro-text.txt +1 -0
  42. package/.claude/config/piper-speech-rate.txt +4 -0
  43. package/.claude/config/piper-target-speech-rate.txt +1 -0
  44. package/.claude/config/reverb-level.txt +1 -0
  45. package/.claude/config/tts-speech-rate.txt +4 -0
  46. package/.claude/config/tts-target-speech-rate.txt +1 -0
  47. package/.claude/docs/TERMUX_SETUP.md +408 -408
  48. package/.claude/github-star-reminder.txt +1 -1
  49. package/.claude/hooks/README-TTS-QUEUE.md +135 -135
  50. package/.claude/hooks/audio-cache-utils.sh +246 -246
  51. package/.claude/hooks/audio-processor.sh +433 -433
  52. package/.claude/hooks/background-music-manager.sh +404 -404
  53. package/.claude/hooks/bmad-speak-enhanced.sh +165 -165
  54. package/.claude/hooks/bmad-speak.sh +269 -269
  55. package/.claude/hooks/bmad-tts-injector.sh +568 -568
  56. package/.claude/hooks/bmad-voice-manager.sh +928 -928
  57. package/.claude/hooks/clawdbot-receiver-SECURE.sh +129 -129
  58. package/.claude/hooks/clawdbot-receiver.sh +107 -107
  59. package/.claude/hooks/clean-audio-cache.sh +22 -22
  60. package/.claude/hooks/cleanup-cache.sh +106 -106
  61. package/.claude/hooks/configure-rdp-mode.sh +137 -137
  62. package/.claude/hooks/download-extra-voices.sh +244 -244
  63. package/.claude/hooks/effects-manager.sh +268 -268
  64. package/.claude/hooks/github-star-reminder.sh +154 -154
  65. package/.claude/hooks/language-manager.sh +362 -362
  66. package/.claude/hooks/learn-manager.sh +492 -492
  67. package/.claude/hooks/macos-voice-manager.sh +205 -205
  68. package/.claude/hooks/migrate-background-music.sh +125 -125
  69. package/.claude/hooks/migrate-to-agentvibes.sh +161 -161
  70. package/.claude/hooks/optimize-background-music.sh +87 -87
  71. package/.claude/hooks/path-resolver.sh +60 -60
  72. package/.claude/hooks/personality-manager.sh +448 -448
  73. package/.claude/hooks/piper-download-voices.sh +225 -225
  74. package/.claude/hooks/piper-installer.sh +292 -292
  75. package/.claude/hooks/piper-multispeaker-registry.sh +171 -171
  76. package/.claude/hooks/piper-voice-manager.sh +24 -3
  77. package/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh +90 -90
  78. package/.claude/hooks/play-tts-enhanced.sh +105 -105
  79. package/.claude/hooks/play-tts-macos.sh +368 -368
  80. package/.claude/hooks/play-tts-piper.sh +679 -679
  81. package/.claude/hooks/play-tts-soprano.sh +356 -356
  82. package/.claude/hooks/play-tts-ssh-remote.sh +167 -167
  83. package/.claude/hooks/play-tts-termux-ssh.sh +169 -169
  84. package/.claude/hooks/play-tts.sh +301 -301
  85. package/.claude/hooks/prepare-release.sh +54 -54
  86. package/.claude/hooks/provider-commands.sh +617 -617
  87. package/.claude/hooks/provider-manager.sh +399 -399
  88. package/.claude/hooks/replay-target-audio.sh +95 -95
  89. package/.claude/hooks/requirements.txt +6 -6
  90. package/.claude/hooks/sentiment-manager.sh +201 -201
  91. package/.claude/hooks/session-start-tts.sh +81 -81
  92. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  93. package/.claude/hooks/speed-manager.sh +291 -291
  94. package/.claude/hooks/stop-tts.sh +84 -84
  95. package/.claude/hooks/termux-installer.sh +261 -261
  96. package/.claude/hooks/translate-manager.sh +341 -341
  97. package/.claude/hooks/translator.py +237 -237
  98. package/.claude/hooks/tts-queue-worker.sh +145 -145
  99. package/.claude/hooks/tts-queue.sh +165 -165
  100. package/.claude/hooks/verbosity-manager.sh +178 -178
  101. package/.claude/hooks/voice-manager.sh +548 -548
  102. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  103. package/.claude/hooks-windows/background-music-manager.ps1 +348 -0
  104. package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -0
  105. package/.claude/hooks-windows/download-extra-voices.ps1 +185 -0
  106. package/.claude/hooks-windows/effects-manager.ps1 +294 -0
  107. package/.claude/hooks-windows/language-manager.ps1 +193 -0
  108. package/.claude/hooks-windows/learn-manager.ps1 +241 -0
  109. package/.claude/hooks-windows/personality-manager.ps1 +266 -0
  110. package/.claude/hooks-windows/play-tts-piper.ps1 +209 -0
  111. package/.claude/hooks-windows/play-tts-sapi.ps1 +108 -0
  112. package/.claude/hooks-windows/play-tts-soprano.ps1 +159 -158
  113. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +50 -5
  114. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -108
  115. package/.claude/hooks-windows/play-tts.ps1 +344 -266
  116. package/.claude/hooks-windows/provider-manager.ps1 +29 -10
  117. package/.claude/hooks-windows/session-start-tts.ps1 +124 -124
  118. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  119. package/.claude/hooks-windows/speed-manager.ps1 +166 -0
  120. package/.claude/hooks-windows/verbosity-manager.ps1 +119 -0
  121. package/.claude/hooks-windows/voice-manager-windows.ps1 +92 -8
  122. package/.claude/output-styles/agent-vibes.md +202 -202
  123. package/.claude/personalities/angry.md +14 -14
  124. package/.claude/personalities/annoying.md +14 -14
  125. package/.claude/personalities/crass.md +14 -14
  126. package/.claude/personalities/dramatic.md +14 -14
  127. package/.claude/personalities/dry-humor.md +50 -50
  128. package/.claude/personalities/flirty.md +20 -20
  129. package/.claude/personalities/funny.md +14 -14
  130. package/.claude/personalities/grandpa.md +32 -32
  131. package/.claude/personalities/millennial.md +14 -14
  132. package/.claude/personalities/moody.md +14 -14
  133. package/.claude/personalities/normal.md +16 -16
  134. package/.claude/personalities/pirate.md +14 -14
  135. package/.claude/personalities/poetic.md +14 -14
  136. package/.claude/personalities/professional.md +14 -14
  137. package/.claude/personalities/rapper.md +55 -55
  138. package/.claude/personalities/robot.md +14 -14
  139. package/.claude/personalities/sarcastic.md +38 -38
  140. package/.claude/personalities/sassy.md +14 -14
  141. package/.claude/personalities/surfer-dude.md +14 -14
  142. package/.claude/personalities/zen.md +14 -14
  143. package/.claude/settings.json +15 -15
  144. package/.claude/verbosity.txt +1 -1
  145. package/.clawdbot/README.md +105 -105
  146. package/.clawdbot/skill/SKILL.md +241 -241
  147. package/.mcp.json +12 -0
  148. package/CLAUDE.md +170 -170
  149. package/README.md +2029 -2007
  150. package/RELEASE_NOTES.md +1310 -1203
  151. package/WINDOWS-SETUP.md +208 -208
  152. package/bin/agent-vibes +39 -39
  153. package/bin/agentvibes-voice-browser.js +1840 -1840
  154. package/bin/agentvibes.js +48 -2
  155. package/bin/mcp-server.js +121 -121
  156. package/bin/mcp-server.sh +206 -206
  157. package/bin/test-bmad-pr +78 -78
  158. package/mcp-server/QUICK_START.md +203 -203
  159. package/mcp-server/README.md +345 -345
  160. package/mcp-server/WINDOWS_SETUP.md +260 -260
  161. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  162. package/mcp-server/examples/claude_desktop_config.json +11 -11
  163. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  164. package/mcp-server/examples/custom_instructions.md +169 -169
  165. package/mcp-server/install-deps.js +130 -130
  166. package/mcp-server/pyproject.toml +52 -52
  167. package/mcp-server/requirements.txt +2 -2
  168. package/mcp-server/server.py +1465 -1453
  169. package/mcp-server/test_server.py +395 -395
  170. package/mcp-server/test_windows_script_parity.py +336 -0
  171. package/package.json +110 -110
  172. package/setup-windows.ps1 +815 -815
  173. package/src/bmad-detector.js +71 -71
  174. package/src/cli/list-personalities.js +110 -110
  175. package/src/cli/list-voices.js +114 -114
  176. package/src/commands/bmad-voices.js +394 -394
  177. package/src/commands/install-mcp.js +476 -476
  178. package/src/console/app.js +824 -824
  179. package/src/console/audio-env.js +20 -1
  180. package/src/console/brand-colors.js +13 -13
  181. package/src/console/constants/personalities.js +44 -44
  182. package/src/console/footer-config.js +50 -50
  183. package/src/console/modals/modal-overlay.js +247 -247
  184. package/src/console/navigation.js +62 -62
  185. package/src/console/tabs/agents-tab.js +1684 -1516
  186. package/src/console/tabs/help-tab.js +261 -261
  187. package/src/console/tabs/install-tab.js +1007 -991
  188. package/src/console/tabs/music-tab.js +22 -8
  189. package/src/console/tabs/placeholder-tab.js +53 -53
  190. package/src/console/tabs/readme-tab.js +267 -267
  191. package/src/console/tabs/receiver-tab.js +1472 -1212
  192. package/src/console/tabs/settings-tab.js +208 -84
  193. package/src/console/tabs/voices-tab.js +100 -21
  194. package/src/console/widgets/destroy-list.js +25 -25
  195. package/src/console/widgets/format-utils.js +89 -89
  196. package/src/console/widgets/notice.js +55 -55
  197. package/src/console/widgets/personality-picker.js +185 -185
  198. package/src/console/widgets/reverb-picker.js +94 -94
  199. package/src/console/widgets/track-picker.js +285 -285
  200. package/src/installer/music-file-input.js +304 -304
  201. package/src/installer.js +5895 -5829
  202. package/src/services/agent-voice-store.js +423 -423
  203. package/src/services/config-service.js +264 -264
  204. package/src/services/navigation-service.js +123 -123
  205. package/src/services/provider-service.js +143 -132
  206. package/src/services/verbosity-service.js +157 -157
  207. package/src/utils/audio-duration-validator.js +298 -298
  208. package/src/utils/audio-format-validator.js +277 -277
  209. package/src/utils/dependency-checker.js +469 -466
  210. package/src/utils/file-ownership-verifier.js +358 -358
  211. package/src/utils/list-formatter.js +194 -194
  212. package/src/utils/music-file-validator.js +285 -285
  213. package/src/utils/preview-list-prompt.js +136 -136
  214. package/src/utils/provider-validator.js +96 -12
  215. package/src/utils/secure-music-storage.js +412 -412
  216. package/templates/agentvibes-receiver.sh +482 -482
  217. package/templates/audio/welcome-music.mp3 +0 -0
  218. package/voice-assignments.json +8244 -8244
  219. package/.claude/config/background-music-position.txt +0 -1
@@ -1,119 +1,119 @@
1
- #
2
- # File: .claude/hooks-windows/audio-cache-utils.ps1
3
- #
4
- # AgentVibes Audio Cache Utilities for Windows
5
- #
6
-
7
- param(
8
- [Parameter(Position = 0)]
9
- [ValidateSet('cleanup', 'stats', 'clear')]
10
- [string]$Command
11
- )
12
-
13
- # Detect project-local audio dir (same logic as TTS scripts)
14
- $ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
15
- $ProjectClaudeDir = Join-Path (Split-Path -Parent (Split-Path -Parent $ScriptPath)) ".claude"
16
- if (Test-Path $ProjectClaudeDir) {
17
- $AudioDir = "$ProjectClaudeDir\audio"
18
- } else {
19
- $AudioDir = "$env:USERPROFILE\.claude\audio"
20
- }
21
-
22
- function Ensure-AudioDir {
23
- if (-not (Test-Path $AudioDir)) {
24
- New-Item -ItemType Directory -Path $AudioDir -Force | Out-Null
25
- }
26
- }
27
-
28
- function Get-AudioCacheSize {
29
- Ensure-AudioDir
30
-
31
- if (-not (Test-Path $AudioDir)) {
32
- return 0
33
- }
34
-
35
- $files = Get-ChildItem -Path $AudioDir -Filter "*.wav" -ErrorAction SilentlyContinue
36
- $totalSize = 0
37
-
38
- foreach ($file in $files) {
39
- $totalSize += $file.Length
40
- }
41
-
42
- return $totalSize
43
- }
44
-
45
- function Format-FileSize {
46
- param([long]$Size)
47
-
48
- if ($Size -lt 1KB) { return "$Size B" }
49
- if ($Size -lt 1MB) { return "{0:N2} KB" -f ($Size / 1KB) }
50
- if ($Size -lt 1GB) { return "{0:N2} MB" -f ($Size / 1MB) }
51
- return "{0:N2} GB" -f ($Size / 1GB)
52
- }
53
-
54
- function Get-CacheStats {
55
- Ensure-AudioDir
56
-
57
- $files = Get-ChildItem -Path $AudioDir -Filter "*.wav" -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum
58
-
59
- $count = if ($files.Count -eq $null) { 0 } else { $files.Count }
60
- $totalSize = if ($files.Sum -eq $null) { 0 } else { $files.Sum }
61
-
62
- return @{
63
- FileCount = $count
64
- TotalSize = $totalSize
65
- FormattedSize = Format-FileSize $totalSize
66
- }
67
- }
68
-
69
- function Clear-Cache {
70
- Ensure-AudioDir
71
-
72
- $files = Get-ChildItem -Path $AudioDir -Filter "*.wav" -ErrorAction SilentlyContinue
73
-
74
- if ($files.Count -eq 0) {
75
- Write-Host "[OK] Cache already empty" -ForegroundColor Green
76
- return
77
- }
78
-
79
- $stats = Get-CacheStats
80
- Write-Host "[CLEANUP] Clearing $($stats.FileCount) audio files ($($stats.FormattedSize))" -ForegroundColor Yellow
81
-
82
- foreach ($file in $files) {
83
- Remove-Item $file.FullName -Force -ErrorAction SilentlyContinue
84
- }
85
-
86
- Write-Host "[OK] Cache cleared" -ForegroundColor Green
87
- }
88
-
89
- function Show-CacheStats {
90
- Ensure-AudioDir
91
-
92
- $stats = Get-CacheStats
93
-
94
- Write-Host ""
95
- Write-Host "[STATS] Audio Cache Statistics" -ForegroundColor Cyan
96
- Write-Host " Location: $AudioDir"
97
- Write-Host " Files: $($stats.FileCount)"
98
- Write-Host " Total Size: $($stats.FormattedSize)"
99
- Write-Host ""
100
- }
101
-
102
- # Main command routing
103
- switch ($Command) {
104
- 'stats' {
105
- Show-CacheStats
106
- }
107
-
108
- 'cleanup' {
109
- Clear-Cache
110
- }
111
-
112
- 'clear' {
113
- Clear-Cache
114
- }
115
-
116
- default {
117
- Show-CacheStats
118
- }
119
- }
1
+ #
2
+ # File: .claude/hooks-windows/audio-cache-utils.ps1
3
+ #
4
+ # AgentVibes Audio Cache Utilities for Windows
5
+ #
6
+
7
+ param(
8
+ [Parameter(Position = 0)]
9
+ [ValidateSet('cleanup', 'stats', 'clear')]
10
+ [string]$Command
11
+ )
12
+
13
+ # Detect project-local audio dir (same logic as TTS scripts)
14
+ $ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
15
+ $ProjectClaudeDir = Join-Path (Split-Path -Parent (Split-Path -Parent $ScriptPath)) ".claude"
16
+ if (Test-Path $ProjectClaudeDir) {
17
+ $AudioDir = "$ProjectClaudeDir\audio"
18
+ } else {
19
+ $AudioDir = "$env:USERPROFILE\.claude\audio"
20
+ }
21
+
22
+ function Ensure-AudioDir {
23
+ if (-not (Test-Path $AudioDir)) {
24
+ New-Item -ItemType Directory -Path $AudioDir -Force | Out-Null
25
+ }
26
+ }
27
+
28
+ function Get-AudioCacheSize {
29
+ Ensure-AudioDir
30
+
31
+ if (-not (Test-Path $AudioDir)) {
32
+ return 0
33
+ }
34
+
35
+ $files = Get-ChildItem -Path $AudioDir -Filter "*.wav" -ErrorAction SilentlyContinue
36
+ $totalSize = 0
37
+
38
+ foreach ($file in $files) {
39
+ $totalSize += $file.Length
40
+ }
41
+
42
+ return $totalSize
43
+ }
44
+
45
+ function Format-FileSize {
46
+ param([long]$Size)
47
+
48
+ if ($Size -lt 1KB) { return "$Size B" }
49
+ if ($Size -lt 1MB) { return "{0:N2} KB" -f ($Size / 1KB) }
50
+ if ($Size -lt 1GB) { return "{0:N2} MB" -f ($Size / 1MB) }
51
+ return "{0:N2} GB" -f ($Size / 1GB)
52
+ }
53
+
54
+ function Get-CacheStats {
55
+ Ensure-AudioDir
56
+
57
+ $files = Get-ChildItem -Path $AudioDir -Filter "*.wav" -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum
58
+
59
+ $count = if ($files.Count -eq $null) { 0 } else { $files.Count }
60
+ $totalSize = if ($files.Sum -eq $null) { 0 } else { $files.Sum }
61
+
62
+ return @{
63
+ FileCount = $count
64
+ TotalSize = $totalSize
65
+ FormattedSize = Format-FileSize $totalSize
66
+ }
67
+ }
68
+
69
+ function Clear-Cache {
70
+ Ensure-AudioDir
71
+
72
+ $files = Get-ChildItem -Path $AudioDir -Filter "*.wav" -ErrorAction SilentlyContinue
73
+
74
+ if ($files.Count -eq 0) {
75
+ Write-Host "[OK] Cache already empty" -ForegroundColor Green
76
+ return
77
+ }
78
+
79
+ $stats = Get-CacheStats
80
+ Write-Host "[CLEANUP] Clearing $($stats.FileCount) audio files ($($stats.FormattedSize))" -ForegroundColor Yellow
81
+
82
+ foreach ($file in $files) {
83
+ Remove-Item $file.FullName -Force -ErrorAction SilentlyContinue
84
+ }
85
+
86
+ Write-Host "[OK] Cache cleared" -ForegroundColor Green
87
+ }
88
+
89
+ function Show-CacheStats {
90
+ Ensure-AudioDir
91
+
92
+ $stats = Get-CacheStats
93
+
94
+ Write-Host ""
95
+ Write-Host "[STATS] Audio Cache Statistics" -ForegroundColor Cyan
96
+ Write-Host " Location: $AudioDir"
97
+ Write-Host " Files: $($stats.FileCount)"
98
+ Write-Host " Total Size: $($stats.FormattedSize)"
99
+ Write-Host ""
100
+ }
101
+
102
+ # Main command routing
103
+ switch ($Command) {
104
+ 'stats' {
105
+ Show-CacheStats
106
+ }
107
+
108
+ 'cleanup' {
109
+ Clear-Cache
110
+ }
111
+
112
+ 'clear' {
113
+ Clear-Cache
114
+ }
115
+
116
+ default {
117
+ Show-CacheStats
118
+ }
119
+ }
@@ -0,0 +1,348 @@
1
+ #
2
+ # File: .claude/hooks-windows/background-music-manager.ps1
3
+ #
4
+ # AgentVibes - Background Music Manager (Windows)
5
+ # Manages background music settings for TTS
6
+ #
7
+
8
+ param(
9
+ [Parameter(Position = 0)]
10
+ [string]$Command = "status",
11
+
12
+ [Parameter(Position = 1)]
13
+ [string]$Arg1 = "",
14
+
15
+ [Parameter(Position = 2)]
16
+ [string]$Arg2 = ""
17
+ )
18
+
19
+ # Resolve paths relative to this script
20
+ $ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
21
+ $ClaudeDir = Split-Path -Parent $ScriptPath
22
+ $ConfigDir = Join-Path $ClaudeDir "config"
23
+ $TracksDir = Join-Path (Join-Path $ClaudeDir "audio") "tracks"
24
+ $EnabledFile = Join-Path $ConfigDir "background-music-enabled.txt"
25
+ $VolumeFile = Join-Path $ConfigDir "background-music-volume.txt"
26
+ $AudioEffectsCfg = Join-Path $ConfigDir "audio-effects.cfg"
27
+
28
+ $DefaultVolume = "0.34"
29
+
30
+ # Ensure config directory exists
31
+ if (-not (Test-Path $ConfigDir)) {
32
+ New-Item -ItemType Directory -Path $ConfigDir -Force | Out-Null
33
+ }
34
+
35
+ function Test-Enabled {
36
+ if (Test-Path $EnabledFile) {
37
+ $status = (Get-Content $EnabledFile -Raw).Trim()
38
+ return ($status -eq "true" -or $status -eq "on" -or $status -eq "1")
39
+ }
40
+ return $false
41
+ }
42
+
43
+ function Get-MusicVolume {
44
+ if (Test-Path $VolumeFile) {
45
+ return (Get-Content $VolumeFile -Raw).Trim()
46
+ }
47
+ return $DefaultVolume
48
+ }
49
+
50
+ function Set-Enabled {
51
+ param([string]$Value)
52
+ Set-Content -Path $EnabledFile -Value $Value -NoNewline
53
+ }
54
+
55
+ function Set-MusicVolume {
56
+ param([string]$Value)
57
+
58
+ if ($Value -notmatch '^\d*\.?\d+$') {
59
+ Write-Output "Error: Volume must be a number between 0.0 and 1.0"
60
+ exit 1
61
+ }
62
+
63
+ $num = [double]$Value
64
+ if ($num -lt 0 -or $num -gt 1) {
65
+ Write-Output "Error: Volume must be between 0.0 and 1.0"
66
+ exit 1
67
+ }
68
+
69
+ Set-Content -Path $VolumeFile -Value $Value -NoNewline
70
+ }
71
+
72
+ function Get-DefaultTrack {
73
+ if (-not (Test-Path $AudioEffectsCfg)) { return "" }
74
+
75
+ $lines = Get-Content $AudioEffectsCfg
76
+ foreach ($line in $lines) {
77
+ if ($line -match '^default\|') {
78
+ $parts = $line -split '\|'
79
+ if ($parts.Length -ge 3) { return $parts[2] }
80
+ }
81
+ }
82
+ return ""
83
+ }
84
+
85
+ function Show-TrackList {
86
+ if (-not (Test-Path $TracksDir)) {
87
+ Write-Output "No tracks folder found at $TracksDir"
88
+ return
89
+ }
90
+
91
+ Write-Output "Available Background Music Tracks"
92
+ Write-Output "===================================="
93
+ Write-Output ""
94
+
95
+ $files = Get-ChildItem -Path $TracksDir -File -Include "*.mp3", "*.wav", "*.ogg" -Recurse | Sort-Object Name
96
+ $count = 0
97
+
98
+ foreach ($file in $files) {
99
+ $count++
100
+ Write-Output ("{0,2}. {1}" -f $count, $file.Name)
101
+ }
102
+
103
+ if ($count -eq 0) {
104
+ Write-Output "No audio files found in tracks folder"
105
+ } else {
106
+ Write-Output ""
107
+ Write-Output "Total: $count track(s)"
108
+ }
109
+ }
110
+
111
+ function Set-DefaultTrack {
112
+ param([string]$Track)
113
+
114
+ if (-not $Track) {
115
+ Write-Output "Error: No track name provided"
116
+ Write-Output "Usage: background-music-manager.ps1 set-default TRACK_NAME"
117
+ exit 1
118
+ }
119
+
120
+ $trackPath = Join-Path $TracksDir $Track
121
+ if (-not (Test-Path $trackPath)) {
122
+ Write-Output "Error: Track '$Track' not found in tracks folder"
123
+ Write-Output "Run 'background-music-manager.ps1 list' to see available tracks"
124
+ exit 1
125
+ }
126
+
127
+ if (-not (Test-Path $AudioEffectsCfg)) {
128
+ Write-Output "Error: audio-effects.cfg not found at $AudioEffectsCfg"
129
+ exit 1
130
+ }
131
+
132
+ $lines = Get-Content $AudioEffectsCfg
133
+ $found = $false
134
+ $newLines = @()
135
+
136
+ foreach ($line in $lines) {
137
+ if ($line -match '^default\|') {
138
+ $parts = $line -split '\|'
139
+ if ($parts.Length -ge 4) {
140
+ $newLines += "$($parts[0])|$($parts[1])|$Track|$($parts[3])"
141
+ } else {
142
+ $newLines += "default||$Track|0.30"
143
+ }
144
+ $found = $true
145
+ } else {
146
+ $newLines += $line
147
+ }
148
+ }
149
+
150
+ if (-not $found) {
151
+ Write-Output "Error: No default entry found in audio-effects.cfg"
152
+ exit 1
153
+ }
154
+
155
+ Set-Content -Path $AudioEffectsCfg -Value ($newLines -join "`n")
156
+
157
+ if (-not (Test-Enabled)) {
158
+ Set-Enabled "true"
159
+ Write-Output "[OK] Default background music set to: $Track"
160
+ Write-Output "[OK] Background music enabled automatically"
161
+ } else {
162
+ Write-Output "[OK] Default background music set to: $Track"
163
+ }
164
+ }
165
+
166
+ function Set-AgentTrack {
167
+ param([string]$Agent, [string]$Track)
168
+
169
+ if (-not $Agent -or -not $Track) {
170
+ Write-Output "Error: Agent name and track required"
171
+ Write-Output "Usage: background-music-manager.ps1 set-agent AGENT_NAME TRACK_NAME"
172
+ exit 1
173
+ }
174
+
175
+ $trackPath = Join-Path $TracksDir $Track
176
+ if (-not (Test-Path $trackPath)) {
177
+ Write-Output "Error: Track not found: $Track"
178
+ Write-Output "Run 'background-music-manager.ps1 list' to see available tracks"
179
+ exit 1
180
+ }
181
+
182
+ if (-not (Test-Path $AudioEffectsCfg)) {
183
+ Write-Output "Error: audio-effects.cfg not found"
184
+ exit 1
185
+ }
186
+
187
+ $lines = Get-Content $AudioEffectsCfg
188
+ $found = $false
189
+ $newLines = @()
190
+
191
+ foreach ($line in $lines) {
192
+ if ($line -match "^${Agent}\|") {
193
+ $parts = $line -split '\|'
194
+ if ($parts.Length -ge 4) {
195
+ $newLines += "$($parts[0])|$($parts[1])|$Track|$($parts[3])"
196
+ } else {
197
+ $newLines += "${Agent}||${Track}|0.30"
198
+ }
199
+ $found = $true
200
+ } else {
201
+ $newLines += $line
202
+ }
203
+ }
204
+
205
+ if (-not $found) {
206
+ $newLines += "${Agent}||${Track}|0.30"
207
+ Write-Output "[OK] Added background music for ${Agent}: $Track"
208
+ } else {
209
+ Write-Output "[OK] Updated background music for ${Agent}: $Track"
210
+ }
211
+
212
+ Set-Content -Path $AudioEffectsCfg -Value ($newLines -join "`n")
213
+
214
+ if (-not (Test-Enabled)) {
215
+ Set-Enabled "true"
216
+ Write-Output "[OK] Background music enabled automatically"
217
+ }
218
+ }
219
+
220
+ function Set-AllAgentsTrack {
221
+ param([string]$Track)
222
+
223
+ if (-not $Track) {
224
+ Write-Output "Error: Track name required"
225
+ Write-Output "Usage: background-music-manager.ps1 set-all TRACK_NAME"
226
+ exit 1
227
+ }
228
+
229
+ $trackPath = Join-Path $TracksDir $Track
230
+ if (-not (Test-Path $trackPath)) {
231
+ Write-Output "Error: Track not found: $Track"
232
+ Write-Output "Run 'background-music-manager.ps1 list' to see available tracks"
233
+ exit 1
234
+ }
235
+
236
+ if (-not (Test-Path $AudioEffectsCfg)) {
237
+ Write-Output "Error: audio-effects.cfg not found"
238
+ exit 1
239
+ }
240
+
241
+ $lines = Get-Content $AudioEffectsCfg
242
+ $newLines = @()
243
+ $count = 0
244
+
245
+ foreach ($line in $lines) {
246
+ if ($line -match '^\s*#' -or $line -match '^\s*$') {
247
+ $newLines += $line
248
+ continue
249
+ }
250
+ if ($line -match '^_party_mode\|') {
251
+ $newLines += $line
252
+ continue
253
+ }
254
+ $parts = $line -split '\|'
255
+ if ($parts.Length -ge 4) {
256
+ $newLines += "$($parts[0])|$($parts[1])|$Track|$($parts[3])"
257
+ $count++
258
+ } else {
259
+ $newLines += $line
260
+ }
261
+ }
262
+
263
+ Set-Content -Path $AudioEffectsCfg -Value ($newLines -join "`n")
264
+ Write-Output "[OK] Updated background music for $count agents: $Track"
265
+
266
+ if (-not (Test-Enabled)) {
267
+ Set-Enabled "true"
268
+ Write-Output "[OK] Background music enabled automatically"
269
+ }
270
+ }
271
+
272
+ function Show-Status {
273
+ Write-Output "Background Music Status"
274
+ Write-Output "=========================="
275
+
276
+ if (Test-Enabled) {
277
+ Write-Output "Status: ENABLED"
278
+ } else {
279
+ Write-Output "Status: DISABLED"
280
+ }
281
+
282
+ $vol = Get-MusicVolume
283
+ $pct = [math]::Round([double]$vol * 100)
284
+ Write-Output ('Volume: {0} ({1}%)' -f $vol, $pct)
285
+
286
+ $defaultTrack = Get-DefaultTrack
287
+ if ($defaultTrack) {
288
+ Write-Output "Default Track: $defaultTrack"
289
+ } else {
290
+ Write-Output "Default Track: none"
291
+ }
292
+
293
+ if (Test-Path $TracksDir) {
294
+ $count = (Get-ChildItem -Path $TracksDir -File -Include "*.mp3", "*.wav", "*.ogg" -Recurse).Count
295
+ Write-Output "Tracks: $count audio file(s) in tracks folder"
296
+ } else {
297
+ Write-Output "Tracks: No tracks folder found"
298
+ }
299
+
300
+ Write-Output ""
301
+ Write-Output "Dependencies:"
302
+ if (Get-Command sox -ErrorAction SilentlyContinue) {
303
+ Write-Output " sox: installed"
304
+ } else {
305
+ Write-Output " sox: not installed (needed for effects)"
306
+ }
307
+ if (Get-Command ffmpeg -ErrorAction SilentlyContinue) {
308
+ Write-Output " ffmpeg: installed"
309
+ } else {
310
+ Write-Output " ffmpeg: not installed (needed for mixing)"
311
+ }
312
+ }
313
+
314
+ # Main command handler
315
+ if ($Command -in "status", "") {
316
+ Show-Status
317
+ } elseif ($Command -in "on", "enable", "true") {
318
+ Set-Enabled "true"
319
+ $vol = Get-MusicVolume
320
+ Write-Output "[OK] Background music ENABLED at $vol volume"
321
+ } elseif ($Command -in "off", "disable", "false") {
322
+ Set-Enabled "false"
323
+ Write-Output "[OK] Background music DISABLED"
324
+ } elseif ($Command -eq "volume") {
325
+ if (-not $Arg1) {
326
+ $vol = Get-MusicVolume
327
+ Write-Output "Current volume: $vol"
328
+ } else {
329
+ Set-MusicVolume $Arg1
330
+ Write-Output "[OK] Background music volume set to $Arg1"
331
+ }
332
+ } elseif ($Command -eq "list") {
333
+ Show-TrackList
334
+ } elseif ($Command -eq "set-default") {
335
+ Set-DefaultTrack $Arg1
336
+ } elseif ($Command -eq "set-agent") {
337
+ Set-AgentTrack $Arg1 $Arg2
338
+ } elseif ($Command -eq "set-all") {
339
+ Set-AllAgentsTrack $Arg1
340
+ } elseif ($Command -eq "get-enabled") {
341
+ if (Test-Enabled) { Write-Output "true" } else { Write-Output "false" }
342
+ } elseif ($Command -eq "get-volume") {
343
+ $vol = Get-MusicVolume
344
+ Write-Output $vol
345
+ } else {
346
+ Write-Output "Usage: background-music-manager.ps1 {status|on|off|volume [X]|list|set-default TRACK|set-agent AGENT TRACK|set-all TRACK|get-enabled|get-volume}"
347
+ exit 1
348
+ }
@@ -0,0 +1,53 @@
1
+ #
2
+ # File: .claude/hooks-windows/clean-audio-cache.ps1
3
+ #
4
+ # AgentVibes - Finally, your AI Agents can Talk Back!
5
+ # Website: https://agentvibes.org
6
+ # Copyright (c) 2025 Paul Preibisch
7
+ # Licensed under the Apache License, Version 2.0
8
+ #
9
+ # Non-Interactive TTS Audio Cache Cleanup
10
+ # Used by /agent-vibes:clean skill and MCP clean_audio_cache tool
11
+
12
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
13
+ $ClaudeDir = Split-Path -Parent $ScriptDir
14
+ $AudioDir = Join-Path $ClaudeDir "audio"
15
+
16
+ Write-Output "AgentVibes Cache Cleanup (Non-Interactive)"
17
+ Write-Output ""
18
+
19
+ if (-not (Test-Path $AudioDir)) {
20
+ Write-Output "Audio directory not found: $AudioDir"
21
+ Write-Output "Nothing to clean."
22
+ exit 0
23
+ }
24
+
25
+ # Count and measure TTS files (preserve tracks/ subdirectory)
26
+ $ttsFiles = Get-ChildItem -Path $AudioDir -File -Include "*.wav", "*.mp3", "*.aiff" -Recurse -ErrorAction SilentlyContinue |
27
+ Where-Object { $_.DirectoryName -notmatch '\\tracks$' -and $_.DirectoryName -notmatch '\\tracks\\' }
28
+
29
+ if (-not $ttsFiles -or $ttsFiles.Count -eq 0) {
30
+ Write-Output "No TTS cache files found."
31
+ Write-Output "Audio directory is clean."
32
+ exit 0
33
+ }
34
+
35
+ $fileCount = if ($ttsFiles -is [array]) { $ttsFiles.Count } else { 1 }
36
+ $totalSize = ($ttsFiles | Measure-Object -Property Length -Sum).Sum
37
+ $sizeMB = [math]::Round($totalSize / 1MB, 2)
38
+
39
+ # Delete files
40
+ $deleted = 0
41
+ foreach ($file in $ttsFiles) {
42
+ try {
43
+ Remove-Item $file.FullName -Force -ErrorAction Stop
44
+ $deleted++
45
+ } catch {
46
+ Write-Output "Warning: Could not delete $($file.Name): $_"
47
+ }
48
+ }
49
+
50
+ Write-Output "Cleaned $deleted TTS cache files"
51
+ Write-Output "Freed ${sizeMB} MB of disk space"
52
+ Write-Output ""
53
+ Write-Output "Background music tracks preserved."