agentvibes 4.2.0 → 4.4.0

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 +152 -79
  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 +5882 -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 +132 -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
@@ -0,0 +1,166 @@
1
+ #
2
+ # File: .claude/hooks-windows/speed-manager.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
+ param(
10
+ [Parameter(Position=0)]
11
+ [string]$Command = "help",
12
+ [Parameter(Position=1)]
13
+ [string]$Arg1 = ""
14
+ )
15
+
16
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
17
+ $ClaudeDir = Split-Path -Parent $ScriptDir
18
+
19
+ # Determine config directory
20
+ if ($env:CLAUDE_PROJECT_DIR -and (Test-Path "$env:CLAUDE_PROJECT_DIR\.claude")) {
21
+ $ConfigDir = Join-Path $env:CLAUDE_PROJECT_DIR ".claude" "config"
22
+ } else {
23
+ $ConfigDir = Join-Path $ClaudeDir "config"
24
+ }
25
+
26
+ if (-not (Test-Path $ConfigDir)) { New-Item -ItemType Directory -Path $ConfigDir -Force | Out-Null }
27
+
28
+ $MainSpeedFile = Join-Path $ConfigDir "tts-speech-rate.txt"
29
+ $TargetSpeedFile = Join-Path $ConfigDir "tts-target-speech-rate.txt"
30
+
31
+ # Legacy migration
32
+ $LegacyMain = Join-Path $ConfigDir "piper-speech-rate.txt"
33
+ $LegacyTarget = Join-Path $ConfigDir "piper-target-speech-rate.txt"
34
+ if ((Test-Path $LegacyMain) -and -not (Test-Path $MainSpeedFile)) {
35
+ Copy-Item $LegacyMain $MainSpeedFile
36
+ }
37
+ if ((Test-Path $LegacyTarget) -and -not (Test-Path $TargetSpeedFile)) {
38
+ Copy-Item $LegacyTarget $TargetSpeedFile
39
+ }
40
+
41
+ function Parse-SpeedValue {
42
+ param([string]$Input)
43
+
44
+ switch -Regex ($Input) {
45
+ '^(normal|1x|1\.0)$' { return "1.0" }
46
+ '^(slow|slower|0\.5x)$' { return "0.5" }
47
+ '^(fast|2x|2\.0)$' { return "2.0" }
48
+ '^(faster|3x|3\.0)$' { return "3.0" }
49
+ }
50
+
51
+ $val = $Input -replace '^[+-]', '' -replace 'x$', ''
52
+ if ($val -match '^\d+\.?\d*$') { return $val }
53
+ return "ERROR"
54
+ }
55
+
56
+ function Set-Speed {
57
+ param([bool]$IsTarget = $false, [string]$SpeedInput)
58
+
59
+ if (-not $SpeedInput) {
60
+ Write-Output "Error: Speed value required"
61
+ Write-Output "Usage: speed-manager.ps1 [target] <speed>"
62
+ exit 1
63
+ }
64
+
65
+ $speedValue = Parse-SpeedValue $SpeedInput
66
+ if ($speedValue -eq "ERROR") {
67
+ Write-Output "Invalid speed value: $SpeedInput"
68
+ Write-Output "Valid values: normal, 0.5x, 1x, 2x, 3x"
69
+ exit 1
70
+ }
71
+
72
+ if ($IsTarget) {
73
+ $configFile = $TargetSpeedFile
74
+ $voiceType = "target language"
75
+ } else {
76
+ $configFile = $MainSpeedFile
77
+ $voiceType = "main voice"
78
+ }
79
+
80
+ Set-Content -Path $configFile -Value $speedValue -NoNewline
81
+
82
+ Write-Output "Speech speed set for $voiceType"
83
+ Write-Output ""
84
+ Write-Output "Speed: ${speedValue}x"
85
+
86
+ switch ($speedValue) {
87
+ "0.5" { Write-Output "Effect: Half speed (slower)" }
88
+ "1.0" { Write-Output "Effect: Normal speed" }
89
+ "2.0" { Write-Output "Effect: Double speed (faster)" }
90
+ "3.0" { Write-Output "Effect: Triple speed (very fast)" }
91
+ default {
92
+ if ([double]$speedValue -gt 1.0) {
93
+ Write-Output "Effect: Faster speech"
94
+ } else {
95
+ Write-Output "Effect: Slower speech"
96
+ }
97
+ }
98
+ }
99
+ }
100
+
101
+ function Get-Speed {
102
+ Write-Output "---------------------------------------"
103
+ Write-Output " Current Speech Speed Settings"
104
+ Write-Output "---------------------------------------"
105
+ Write-Output ""
106
+
107
+ if (Test-Path $MainSpeedFile) {
108
+ $mainSpeed = (Get-Content $MainSpeedFile | Where-Object { $_ -notmatch '^\s*#' -and $_.Trim() -ne '' } | Select-Object -Last 1).Trim()
109
+ Write-Output "Main voice: ${mainSpeed}x"
110
+ } else {
111
+ Write-Output "Main voice: 1.0x (default, normal speed)"
112
+ }
113
+
114
+ if (Test-Path $TargetSpeedFile) {
115
+ $targetSpeed = (Get-Content $TargetSpeedFile | Where-Object { $_ -notmatch '^\s*#' -and $_.Trim() -ne '' } | Select-Object -Last 1).Trim()
116
+ Write-Output "Target language: ${targetSpeed}x"
117
+ } else {
118
+ Write-Output "Target language: 0.5x (default, slower for learning)"
119
+ }
120
+
121
+ Write-Output ""
122
+ Write-Output "Scale: 0.5x=slower, 1.0x=normal, 2.0x=faster, 3.0x=very fast"
123
+ Write-Output "---------------------------------------"
124
+ }
125
+
126
+ switch -Regex ($Command) {
127
+ "^target$" {
128
+ Set-Speed -IsTarget $true -SpeedInput $Arg1
129
+ }
130
+ "^(get|status)$" {
131
+ Get-Speed
132
+ }
133
+ "^(normal|fast|slow|slower)$" {
134
+ Set-Speed -SpeedInput $Command
135
+ }
136
+ "^.*x$" {
137
+ Set-Speed -SpeedInput $Command
138
+ }
139
+ "^\d+\.?\d*$" {
140
+ Set-Speed -SpeedInput $Command
141
+ }
142
+ "^[+-]" {
143
+ Set-Speed -SpeedInput $Command
144
+ }
145
+ "^help$" {
146
+ Write-Output "Speech Speed Manager"
147
+ Write-Output ""
148
+ Write-Output "Usage:"
149
+ Write-Output " speed-manager.ps1 <speed> Set main voice speed"
150
+ Write-Output " speed-manager.ps1 target <speed> Set target language speed"
151
+ Write-Output " speed-manager.ps1 get Show current speeds"
152
+ Write-Output ""
153
+ Write-Output "Speed values: 0.5x, 1x, 2x, 3x, normal, slow, fast, faster"
154
+ }
155
+ default {
156
+ # Try as speed value
157
+ $parsed = Parse-SpeedValue $Command
158
+ if ($parsed -ne "ERROR") {
159
+ Set-Speed -SpeedInput $Command
160
+ } else {
161
+ Write-Output "Unknown command: $Command"
162
+ Write-Output "Usage: speed-manager.ps1 {get|target|<speed>}"
163
+ exit 1
164
+ }
165
+ }
166
+ }
@@ -0,0 +1,119 @@
1
+ #
2
+ # File: .claude/hooks-windows/verbosity-manager.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
+ param(
10
+ [Parameter(Position=0)]
11
+ [string]$Command = "info",
12
+ [Parameter(Position=1)]
13
+ [string]$Arg1 = ""
14
+ )
15
+
16
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
17
+ $ClaudeDir = Split-Path -Parent $ScriptDir
18
+
19
+ # Respect CLAUDE_PROJECT_DIR when set by MCP
20
+ if ($env:CLAUDE_PROJECT_DIR) {
21
+ $ConfigClaudeDir = Join-Path $env:CLAUDE_PROJECT_DIR ".claude"
22
+ } else {
23
+ $ConfigClaudeDir = $ClaudeDir
24
+ }
25
+
26
+ $VerbosityFile = Join-Path $ConfigClaudeDir "tts-verbosity.txt"
27
+ $GlobalVerbosityFile = Join-Path $env:USERPROFILE ".claude\tts-verbosity.txt"
28
+
29
+ function Get-Verbosity {
30
+ if (Test-Path $VerbosityFile) {
31
+ return (Get-Content $VerbosityFile -Raw).Trim()
32
+ }
33
+ if (Test-Path $GlobalVerbosityFile) {
34
+ return (Get-Content $GlobalVerbosityFile -Raw).Trim()
35
+ }
36
+ return "high"
37
+ }
38
+
39
+ function Set-Verbosity {
40
+ param([string]$Level)
41
+
42
+ if ($Level -notmatch '^(low|medium|high)$') {
43
+ Write-Output "Invalid verbosity level: $Level"
44
+ Write-Output "Valid options: low, medium, high"
45
+ exit 1
46
+ }
47
+
48
+ if (Test-Path $ConfigClaudeDir) {
49
+ Set-Content -Path $VerbosityFile -Value $Level -NoNewline
50
+ Write-Output "Verbosity set to: $Level (project-local)"
51
+ } else {
52
+ $globalDir = Split-Path -Parent $GlobalVerbosityFile
53
+ if (-not (Test-Path $globalDir)) { New-Item -ItemType Directory -Path $globalDir -Force | Out-Null }
54
+ Set-Content -Path $GlobalVerbosityFile -Value $Level -NoNewline
55
+ Write-Output "Verbosity set to: $Level (global)"
56
+ }
57
+
58
+ Write-Output ""
59
+ Write-Output "Verbosity levels:"
60
+ Write-Output " LOW: Acknowledgments + Completions only"
61
+ Write-Output " MEDIUM: + Major decisions and findings"
62
+ Write-Output " HIGH: All reasoning (maximum transparency)"
63
+ Write-Output ""
64
+ Write-Output "Restart Claude Code for changes to take effect"
65
+ }
66
+
67
+ function Show-Info {
68
+ $currentLevel = Get-Verbosity
69
+
70
+ Write-Output "AgentVibes Verbosity Control"
71
+ Write-Output "------------------------------------"
72
+ Write-Output "Current level: $currentLevel"
73
+ Write-Output ""
74
+ Write-Output "Available levels:"
75
+ Write-Output ""
76
+ Write-Output "LOW (Minimal)"
77
+ Write-Output " Acknowledgments only"
78
+ Write-Output " Completions only"
79
+ Write-Output " No reasoning spoken"
80
+ Write-Output ""
81
+ Write-Output "MEDIUM (Balanced)"
82
+ Write-Output " Acknowledgments"
83
+ Write-Output " Major decisions"
84
+ Write-Output " Key findings"
85
+ Write-Output " Completions"
86
+ Write-Output ""
87
+ Write-Output "HIGH (Maximum Transparency)"
88
+ Write-Output " Acknowledgments"
89
+ Write-Output " All reasoning"
90
+ Write-Output " All decisions"
91
+ Write-Output " All findings"
92
+ Write-Output " Completions"
93
+ Write-Output ""
94
+ Write-Output "Usage:"
95
+ Write-Output " verbosity-manager.ps1 get Show current level"
96
+ Write-Output " verbosity-manager.ps1 set low|medium|high Change level"
97
+ }
98
+
99
+ switch ($Command) {
100
+ "get" {
101
+ Write-Output (Get-Verbosity)
102
+ }
103
+ "set" {
104
+ if (-not $Arg1) {
105
+ Write-Output "Error: Missing verbosity level"
106
+ Write-Output "Usage: verbosity-manager.ps1 set low|medium|high"
107
+ exit 1
108
+ }
109
+ Set-Verbosity $Arg1
110
+ }
111
+ { $_ -in "info", "" } {
112
+ Show-Info
113
+ }
114
+ default {
115
+ Write-Output "Unknown command: $Command"
116
+ Write-Output "Usage: verbosity-manager.ps1 {get|set|info} [level]"
117
+ exit 1
118
+ }
119
+ }
@@ -6,7 +6,7 @@
6
6
 
7
7
  param(
8
8
  [Parameter(Position = 0)]
9
- [ValidateSet('list', 'switch', 'get')]
9
+ [ValidateSet('list', 'list-simple', 'switch', 'get', 'replay')]
10
10
  [string]$Command = 'list',
11
11
 
12
12
  [Parameter(Position = 1)]
@@ -19,7 +19,7 @@ $VoiceSapiFile = "$ClaudeDir\tts-voice-sapi.txt"
19
19
  $VoicePiperFile = "$ClaudeDir\tts-voice-piper.txt"
20
20
 
21
21
  # Get active provider
22
- $ActiveProvider = "windows-sapi"
22
+ $ActiveProvider = "sapi"
23
23
  if (Test-Path $ProviderFile) {
24
24
  $ActiveProvider = (Get-Content $ProviderFile -Raw).Trim()
25
25
  }
@@ -38,8 +38,35 @@ function Get-SAPIVoices {
38
38
  return $voices
39
39
  }
40
40
 
41
- # Get Piper voices
41
+ # Get Piper voices (checks both global and project-local directories)
42
42
  function Get-PiperVoices {
43
+ $GlobalVoicesDir = "$env:USERPROFILE\.claude\piper-voices"
44
+ # Also check project-local .claude/piper-voices
45
+ $ScriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
46
+ $ProjectDir = Split-Path -Parent (Split-Path -Parent $ScriptPath)
47
+ $ProjectVoicesDir = Join-Path $ProjectDir ".claude\piper-voices"
48
+
49
+ $allVoices = @()
50
+
51
+ foreach ($VoicesDir in @($GlobalVoicesDir, $ProjectVoicesDir)) {
52
+ if (-not (Test-Path $VoicesDir)) {
53
+ continue
54
+ }
55
+
56
+ $onnxFiles = Get-ChildItem -Path $VoicesDir -Filter "*.onnx" -ErrorAction SilentlyContinue
57
+ foreach ($file in $onnxFiles) {
58
+ $name = $file.BaseName
59
+ if ($allVoices -notcontains $name) {
60
+ $allVoices += $name
61
+ }
62
+ }
63
+ }
64
+
65
+ return $allVoices
66
+ }
67
+
68
+ # Legacy wrapper for single-dir callers
69
+ function Get-PiperVoicesLegacy {
43
70
  $VoicesDir = "$ClaudeDir\piper-voices"
44
71
 
45
72
  if (-not (Test-Path $VoicesDir)) {
@@ -80,11 +107,14 @@ function List-Voices {
80
107
  Write-Host ""
81
108
 
82
109
  # Piper voices
83
- Write-Host "[PIPER] Piper (High Quality):" -ForegroundColor Green
110
+ $PiperExe = "$env:LOCALAPPDATA\Programs\Piper\piper.exe"
111
+ $piperInstalled = Test-Path $PiperExe
112
+ $piperLabel = if ($piperInstalled) { "[PIPER] Piper (High Quality):" } else { "[PIPER] Piper (NOT INSTALLED - run setup-windows.ps1):" }
113
+ Write-Host $piperLabel -ForegroundColor $(if ($piperInstalled) { "Green" } else { "Yellow" })
84
114
  $piperVoices = Get-PiperVoices
85
115
 
86
116
  if ($piperVoices.Count -eq 0) {
87
- Write-Host " (No voices downloaded - run setup-windows.ps1)" -ForegroundColor Gray
117
+ Write-Host " (No voices downloaded - run download-piper-voices.ps1)" -ForegroundColor Gray
88
118
  }
89
119
  else {
90
120
  $piperVoices | ForEach-Object {
@@ -117,11 +147,11 @@ function Switch-Voice {
117
147
  $VoiceFile = ""
118
148
  $ValidVoices = @()
119
149
 
120
- if ($ActiveProvider -eq "windows-sapi") {
150
+ if ($ActiveProvider -eq "sapi" -or $ActiveProvider -eq "windows-sapi") {
121
151
  $VoiceFile = $VoiceSapiFile
122
152
  $ValidVoices = Get-SAPIVoices
123
153
  }
124
- elseif ($ActiveProvider -eq "windows-piper") {
154
+ elseif ($ActiveProvider -eq "piper" -or $ActiveProvider -eq "windows-piper") {
125
155
  $VoiceFile = $VoicePiperFile
126
156
  $ValidVoices = Get-PiperVoices
127
157
  }
@@ -144,7 +174,7 @@ function Switch-Voice {
144
174
 
145
175
  # Show current voice
146
176
  function Show-CurrentVoice {
147
- $VoiceFile = if ($ActiveProvider -eq "windows-sapi") { $VoiceSapiFile } else { $VoicePiperFile }
177
+ $VoiceFile = if ($ActiveProvider -eq "sapi" -or $ActiveProvider -eq "windows-sapi") { $VoiceSapiFile } else { $VoicePiperFile }
148
178
  $CurrentVoice = Get-CurrentVoice $VoiceFile
149
179
 
150
180
  if ($CurrentVoice) {
@@ -161,6 +191,26 @@ switch ($Command) {
161
191
  List-Voices
162
192
  }
163
193
 
194
+ 'list-simple' {
195
+ # Machine-parseable list for MCP server - one voice name per line
196
+ if ($ActiveProvider -eq "windows-sapi" -or $ActiveProvider -eq "sapi") {
197
+ $voices = Get-SAPIVoices
198
+ foreach ($v in $voices) { Write-Output $v }
199
+ }
200
+ elseif ($ActiveProvider -eq "windows-piper" -or $ActiveProvider -eq "piper") {
201
+ $voices = Get-PiperVoices
202
+ foreach ($v in ($voices | Sort-Object)) { Write-Output $v }
203
+ }
204
+ elseif ($ActiveProvider -eq "soprano") {
205
+ Write-Output "Soprano-1.1-80M"
206
+ }
207
+ else {
208
+ # Fallback: try Piper voices
209
+ $voices = Get-PiperVoices
210
+ foreach ($v in ($voices | Sort-Object)) { Write-Output $v }
211
+ }
212
+ }
213
+
164
214
  'switch' {
165
215
  if (-not $VoiceName) {
166
216
  Write-Host "[ERROR] Voice name required" -ForegroundColor Red
@@ -173,4 +223,38 @@ switch ($Command) {
173
223
  'get' {
174
224
  Show-CurrentVoice
175
225
  }
226
+
227
+ 'replay' {
228
+ $n = if ($VoiceName) { [int]$VoiceName } else { 1 }
229
+ $AudioDir = Join-Path (Split-Path -Parent $ClaudeDir) ".claude\audio"
230
+ if (-not (Test-Path $AudioDir)) {
231
+ $AudioDir = Join-Path $ClaudeDir "audio"
232
+ }
233
+ # Find project-local audio dir first
234
+ $ScriptClaudeDir = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)
235
+ $ProjectAudioDir = Join-Path $ScriptClaudeDir "audio"
236
+ if (Test-Path $ProjectAudioDir) { $AudioDir = $ProjectAudioDir }
237
+
238
+ $recentFiles = Get-ChildItem -Path $AudioDir -Filter "tts-*.wav" -ErrorAction SilentlyContinue |
239
+ Sort-Object LastWriteTime -Descending | Select-Object -First 10
240
+
241
+ if (-not $recentFiles -or $recentFiles.Count -eq 0) {
242
+ Write-Output "No recent audio files found"
243
+ exit 1
244
+ }
245
+
246
+ if ($n -gt $recentFiles.Count) {
247
+ Write-Output "Only $($recentFiles.Count) recent files available (requested #$n)"
248
+ exit 1
249
+ }
250
+
251
+ $targetFile = $recentFiles[$n - 1]
252
+ Write-Output "Replaying: $($targetFile.Name)"
253
+
254
+ # Play using SoundPlayer
255
+ Add-Type -AssemblyName System.Media
256
+ $player = New-Object System.Media.SoundPlayer $targetFile.FullName
257
+ $player.PlaySync()
258
+ $player.Dispose()
259
+ }
176
260
  }