agentvibes 5.3.0 → 5.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/LITE-MODE.md +236 -0
  2. package/.agentvibes/README.md +136 -0
  3. package/.agentvibes/backup/session-start-tts.sh.20251210_212814 +141 -0
  4. package/.agentvibes/backups/agents/analyst_20260204_144958.md +78 -0
  5. package/.agentvibes/backups/agents/architect_20260204_144958.md +72 -0
  6. package/.agentvibes/backups/agents/dev_20260204_144958.md +74 -0
  7. package/.agentvibes/backups/agents/pm_20260204_144958.md +72 -0
  8. package/.agentvibes/backups/agents/quick-flow-solo-dev_20260204_144958.md +64 -0
  9. package/.agentvibes/backups/agents/sm_20260204_144958.md +87 -0
  10. package/.agentvibes/backups/agents/tea_20260204_144958.md +79 -0
  11. package/.agentvibes/backups/agents/tech-writer_20260204_144958.md +82 -0
  12. package/.agentvibes/backups/agents/ux-designer_20260204_144958.md +80 -0
  13. package/.agentvibes/bmad/bmad-voices.md +69 -69
  14. package/.agentvibes/config/README-personality-defaults.md +162 -0
  15. package/.agentvibes/config/mode.txt +1 -0
  16. package/.agentvibes/config/personality-voice-defaults.default.json +21 -0
  17. package/.agentvibes/config/save-audio.txt +1 -0
  18. package/.agentvibes/config/voice-metadata.json +160 -0
  19. package/.agentvibes/config.json +24 -15
  20. package/.agentvibes/hooks/help.sh +191 -0
  21. package/.agentvibes/hooks/post-tool-use-lite.sh +111 -0
  22. package/.agentvibes/hooks/save-audio-manager.sh +162 -0
  23. package/.agentvibes/hooks/session-start-full-optimized.sh +102 -0
  24. package/.agentvibes/hooks/session-start-full.sh +142 -0
  25. package/.agentvibes/hooks/session-start-lite-v2.sh +34 -0
  26. package/.agentvibes/hooks/session-start-lite.sh +29 -0
  27. package/.agentvibes/hooks/stop-lite.sh +115 -0
  28. package/.agentvibes/hooks/switch-mode.sh +215 -0
  29. package/.agentvibes/output-styles/audio-summary.md +30 -0
  30. package/.claude/activation-instructions +54 -54
  31. package/.claude/audio/voice-samples/piper/alan.wav +0 -0
  32. package/.claude/audio/voice-samples/piper/amy.wav +0 -0
  33. package/.claude/audio/voice-samples/piper/charlotte.wav +0 -0
  34. package/.claude/audio/voice-samples/piper/joe.wav +0 -0
  35. package/.claude/audio/voice-samples/piper/john.wav +0 -0
  36. package/.claude/audio/voice-samples/piper/katherine.wav +0 -0
  37. package/.claude/audio/voice-samples/piper/kristin.wav +0 -0
  38. package/.claude/audio/voice-samples/piper/linda.wav +0 -0
  39. package/.claude/audio/voice-samples/piper/marcus.wav +0 -0
  40. package/.claude/audio/voice-samples/piper/ryan.wav +0 -0
  41. package/.claude/commands/agent-vibes/add.md +21 -21
  42. package/.claude/commands/agent-vibes/agent-vibes.md +101 -101
  43. package/.claude/commands/agent-vibes/agent.md +79 -79
  44. package/.claude/commands/agent-vibes/background-music.md +111 -111
  45. package/.claude/commands/agent-vibes/bmad.md +198 -198
  46. package/.claude/commands/agent-vibes/clean.md +18 -18
  47. package/.claude/commands/agent-vibes/cleanup.md +18 -18
  48. package/.claude/commands/agent-vibes/commands.json +145 -145
  49. package/.claude/commands/agent-vibes/effects.md +97 -97
  50. package/.claude/commands/agent-vibes/get.md +9 -9
  51. package/.claude/commands/agent-vibes/hide.md +91 -91
  52. package/.claude/commands/agent-vibes/language.md +23 -23
  53. package/.claude/commands/agent-vibes/learn.md +67 -67
  54. package/.claude/commands/agent-vibes/list.md +13 -13
  55. package/.claude/commands/agent-vibes/mute.md +37 -37
  56. package/.claude/commands/agent-vibes/preview.md +17 -17
  57. package/.claude/commands/agent-vibes/provider.md +68 -68
  58. package/.claude/commands/agent-vibes/replay-target.md +14 -14
  59. package/.claude/commands/agent-vibes/sample.md +12 -12
  60. package/.claude/commands/agent-vibes/set-favorite-voice.md +84 -84
  61. package/.claude/commands/agent-vibes/set-pretext.md +65 -65
  62. package/.claude/commands/agent-vibes/set-speed.md +41 -41
  63. package/.claude/commands/agent-vibes/show.md +84 -84
  64. package/.claude/commands/agent-vibes/switch.md +87 -87
  65. package/.claude/commands/agent-vibes/target-voice.md +26 -26
  66. package/.claude/commands/agent-vibes/target.md +30 -30
  67. package/.claude/commands/agent-vibes/translate.md +68 -68
  68. package/.claude/commands/agent-vibes/unmute.md +45 -45
  69. package/.claude/commands/agent-vibes/whoami.md +7 -7
  70. package/.claude/commands/agent-vibes-bmad-voices.md +117 -117
  71. package/.claude/commands/agent-vibes-rdp.md +24 -24
  72. package/.claude/config/audio-effects.cfg +4 -11
  73. package/.claude/config/audio-effects.cfg.sample +52 -52
  74. package/.claude/config/background-music-position.txt +27 -0
  75. package/.claude/config/background-music-volume.txt +1 -1
  76. package/.claude/config/background-music.cfg +1 -0
  77. package/.claude/config/background-music.txt +1 -0
  78. package/.claude/config/tts-speech-rate.txt +1 -4
  79. package/.claude/config/tts-verbosity.txt +1 -0
  80. package/.claude/docs/TERMUX_SETUP.md +408 -408
  81. package/.claude/github-star-reminder.txt +1 -1
  82. package/.claude/hooks/README-TTS-QUEUE.md +135 -135
  83. package/.claude/hooks/audio-cache-utils.sh +0 -0
  84. package/.claude/hooks/audio-processor.sh +60 -14
  85. package/.claude/hooks/background-music-manager.sh +0 -0
  86. package/.claude/hooks/bmad-party-manager.sh +225 -0
  87. package/.claude/hooks/bmad-speak-enhanced.sh +0 -0
  88. package/.claude/hooks/bmad-speak.sh +6 -13
  89. package/.claude/hooks/bmad-tts-injector.sh +0 -0
  90. package/.claude/hooks/bmad-voice-manager.sh +0 -0
  91. package/.claude/hooks/clawdbot-receiver-SECURE.sh +25 -23
  92. package/.claude/hooks/clawdbot-receiver.sh +4 -28
  93. package/.claude/hooks/clean-audio-cache.sh +0 -0
  94. package/.claude/hooks/cleanup-cache.sh +0 -0
  95. package/.claude/hooks/configure-rdp-mode.sh +0 -0
  96. package/.claude/hooks/download-extra-voices.sh +0 -0
  97. package/.claude/hooks/effects-manager.sh +0 -0
  98. package/.claude/hooks/github-star-reminder.sh +0 -0
  99. package/.claude/hooks/language-manager.sh +0 -0
  100. package/.claude/hooks/learn-manager.sh +0 -0
  101. package/.claude/hooks/macos-voice-manager.sh +0 -0
  102. package/.claude/hooks/migrate-background-music.sh +0 -0
  103. package/.claude/hooks/migrate-to-agentvibes.sh +0 -0
  104. package/.claude/hooks/optimize-background-music.sh +0 -0
  105. package/.claude/hooks/personality-manager.sh +0 -0
  106. package/.claude/hooks/piper-download-voices.sh +0 -0
  107. package/.claude/hooks/piper-installer.sh +1 -1
  108. package/.claude/hooks/piper-multispeaker-registry.sh +0 -0
  109. package/.claude/hooks/piper-voice-manager.sh +0 -0
  110. package/.claude/hooks/play-tts-enhanced.sh +0 -0
  111. package/.claude/hooks/play-tts-macos.sh +6 -12
  112. package/.claude/hooks/play-tts-piper.sh +50 -79
  113. package/.claude/hooks/play-tts-soprano.sh +9 -43
  114. package/.claude/hooks/play-tts-ssh-remote.sh +43 -215
  115. package/.claude/hooks/play-tts-termux-ssh.sh +0 -0
  116. package/.claude/hooks/play-tts.sh +31 -31
  117. package/.claude/hooks/post-response.sh +41 -0
  118. package/.claude/hooks/prepare-release.sh +0 -0
  119. package/.claude/hooks/provider-commands.sh +0 -0
  120. package/.claude/hooks/provider-manager.sh +0 -0
  121. package/.claude/hooks/replay-target-audio.sh +0 -0
  122. package/.claude/hooks/requirements.txt +6 -6
  123. package/.claude/hooks/sentiment-manager.sh +0 -0
  124. package/.claude/hooks/session-start-tts.sh +56 -39
  125. package/.claude/hooks/soprano-gradio-synth.py +139 -139
  126. package/.claude/hooks/speed-manager.sh +0 -0
  127. package/.claude/hooks/stop.sh +63 -0
  128. package/.claude/hooks/termux-installer.sh +0 -0
  129. package/.claude/hooks/translate-manager.sh +0 -0
  130. package/.claude/hooks/translator.py +237 -237
  131. package/.claude/hooks/tts-queue-worker.sh +0 -0
  132. package/.claude/hooks/tts-queue.sh +0 -0
  133. package/.claude/hooks/verbosity-manager.sh +0 -0
  134. package/.claude/hooks/voice-manager.sh +26 -4
  135. package/.claude/hooks-windows/audio-cache-utils.ps1 +119 -119
  136. package/.claude/hooks-windows/bmad-party-speak.ps1 +278 -278
  137. package/.claude/hooks-windows/bmad-speak.ps1 +264 -264
  138. package/.claude/hooks-windows/clean-audio-cache.ps1 +53 -53
  139. package/.claude/hooks-windows/effects-manager.ps1 +294 -294
  140. package/.claude/hooks-windows/language-manager.ps1 +193 -193
  141. package/.claude/hooks-windows/learn-manager.ps1 +241 -241
  142. package/.claude/hooks-windows/personality-manager.ps1 +266 -266
  143. package/.claude/hooks-windows/play-tts-soprano.ps1 +5 -5
  144. package/.claude/hooks-windows/play-tts-termux-ssh.ps1 +138 -138
  145. package/.claude/hooks-windows/play-tts-windows-piper.ps1 +164 -0
  146. package/.claude/hooks-windows/play-tts-windows-sapi.ps1 +108 -0
  147. package/.claude/hooks-windows/play-tts.ps1 +104 -513
  148. package/.claude/hooks-windows/provider-manager.ps1 +158 -192
  149. package/.claude/hooks-windows/session-start-tts.ps1 +55 -46
  150. package/.claude/hooks-windows/soprano-gradio-synth.py +153 -153
  151. package/.claude/hooks-windows/speed-manager.ps1 +166 -166
  152. package/.claude/hooks-windows/voice-manager-windows.ps1 +176 -260
  153. package/.claude/output-styles/agent-vibes.md +202 -202
  154. package/.claude/personalities/angry.md +14 -14
  155. package/.claude/personalities/annoying.md +14 -14
  156. package/.claude/personalities/crass.md +14 -14
  157. package/.claude/personalities/dramatic.md +14 -14
  158. package/.claude/personalities/dry-humor.md +50 -50
  159. package/.claude/personalities/flirty.md +20 -20
  160. package/.claude/personalities/funny.md +14 -14
  161. package/.claude/personalities/grandpa.md +32 -32
  162. package/.claude/personalities/millennial.md +14 -14
  163. package/.claude/personalities/moody.md +14 -14
  164. package/.claude/personalities/normal.md +16 -16
  165. package/.claude/personalities/pirate.md +14 -14
  166. package/.claude/personalities/poetic.md +14 -14
  167. package/.claude/personalities/professional.md +14 -14
  168. package/.claude/personalities/rapper.md +55 -55
  169. package/.claude/personalities/robot.md +14 -14
  170. package/.claude/personalities/sarcastic.md +38 -38
  171. package/.claude/personalities/sassy.md +14 -14
  172. package/.claude/personalities/surfer-dude.md +14 -14
  173. package/.claude/personalities/zen.md +14 -14
  174. package/.claude/piper-voices-dir.txt +1 -0
  175. package/.claude/settings.json +25 -15
  176. package/.claude/verbosity.txt +1 -1
  177. package/.clawdbot/README.md +105 -105
  178. package/.clawdbot/skill/SKILL.md +149 -145
  179. package/.mcp.json +30 -11
  180. package/CLAUDE.md +170 -215
  181. package/README.md +206 -525
  182. package/RELEASE_NOTES.md +1132 -1976
  183. package/WINDOWS-SETUP.md +208 -208
  184. package/bin/agent-vibes +0 -0
  185. package/bin/agentvibes-voice-browser.js +64 -1289
  186. package/bin/agentvibes.js +0 -0
  187. package/bin/ensure-soprano-running.sh +43 -0
  188. package/bin/mcp-server.js +121 -121
  189. package/bin/mcp-server.sh +0 -0
  190. package/bin/test-bmad-pr +78 -78
  191. package/mcp-server/QUICK_START.md +203 -203
  192. package/mcp-server/README.md +345 -345
  193. package/mcp-server/WINDOWS_SETUP.md +260 -260
  194. package/mcp-server/docs/troubleshooting-audio.md +313 -313
  195. package/mcp-server/examples/claude_desktop_config.json +11 -11
  196. package/mcp-server/examples/claude_desktop_config_piper.json +9 -9
  197. package/mcp-server/examples/custom_instructions.md +169 -169
  198. package/mcp-server/install-deps.js +130 -130
  199. package/mcp-server/pyproject.toml +52 -52
  200. package/mcp-server/requirements.txt +2 -2
  201. package/mcp-server/server.py +1451 -1578
  202. package/mcp-server/test_server.py +395 -395
  203. package/package.json +1 -3
  204. package/setup-windows.ps1 +815 -815
  205. package/src/installer.js +42 -5
  206. package/templates/agentvibes-receiver.sh +158 -483
  207. package/templates/audio/welcome-music.mp3 +0 -0
  208. package/.agentvibes/bmad-voice-map.json +0 -104
  209. package/.agentvibes/copilot-sessions.log +0 -4
  210. package/.claude/config/audio-effects-bmad.cfg +0 -50
  211. package/.claude/config/background-music-enabled.txt +0 -1
  212. package/.claude/config/intro-text.txt +0 -1
  213. package/.claude/config/personality.txt +0 -1
  214. package/.claude/config/piper-speech-rate.txt +0 -4
  215. package/.claude/config/piper-target-speech-rate.txt +0 -1
  216. package/.claude/config/reverb-level.txt +0 -1
  217. package/.claude/config/tts-target-speech-rate.txt +0 -1
  218. package/voice-assignments.json +0 -8245
  219. /package/{.claude → .agentvibes}/config/agentvibes.json +0 -0
@@ -1,192 +1,158 @@
1
- #
2
- # File: .claude/hooks-windows/provider-manager.ps1
3
- #
4
- # AgentVibes - Windows TTS Provider Management
5
- #
6
-
7
- param(
8
- [Parameter(Position = 0)]
9
- [ValidateSet('get', 'set', 'list', 'switch')]
10
- [string]$Command = 'get',
11
-
12
- [Parameter(Position = 1)]
13
- [string]$Provider
14
- )
15
-
16
- # Use project-local .claude if available, like play-tts.ps1 does
17
- $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
18
- $ProjectClaudeDir = Split-Path -Parent $ScriptDir
19
- if (Test-Path (Join-Path $ProjectClaudeDir "config")) {
20
- $ClaudeDir = $ProjectClaudeDir
21
- } else {
22
- $ClaudeDir = "$env:USERPROFILE\.claude"
23
- }
24
- $ProviderFile = "$ClaudeDir\tts-provider.txt"
25
- $ValidProviders = @('piper', 'sapi', 'soprano', 'termux-ssh')
26
- # Backwards compat: normalize old names
27
- if ($Provider -eq 'windows-piper') { $Provider = 'piper' }
28
- if ($Provider -eq 'windows-sapi') { $Provider = 'sapi' }
29
-
30
- # Ensure claude directory exists
31
- if (-not (Test-Path $ClaudeDir)) {
32
- New-Item -ItemType Directory -Path $ClaudeDir -Force | Out-Null
33
- }
34
-
35
- function Get-ActiveProvider {
36
- if (Test-Path $ProviderFile) {
37
- $provider = Get-Content $ProviderFile -Raw
38
- return $provider.Trim()
39
- }
40
-
41
- # Default to SAPI (zero dependencies)
42
- return "sapi"
43
- }
44
-
45
- function Get-AvailableProviders {
46
- $available = @()
47
-
48
- # Always available
49
- $available += @{
50
- name = "sapi"
51
- description = "Windows SAPI (Built-in, No Installation)"
52
- installed = $true
53
- }
54
-
55
- # Check if Piper is installed (standard location or PATH)
56
- $piperExe = "$env:LOCALAPPDATA\Programs\Piper\piper.exe"
57
- $piperInstalled = Test-Path $piperExe
58
- if (-not $piperInstalled) {
59
- $found = Get-Command piper.exe -ErrorAction SilentlyContinue
60
- $piperInstalled = $null -ne $found
61
- }
62
-
63
- $available += @{
64
- name = "piper"
65
- description = "Windows Piper (High Quality, Requires Installation)"
66
- installed = $piperInstalled
67
- }
68
-
69
- # Check if Soprano is installed
70
- $sopranoInstalled = $false
71
- $sopranoPort = if ($env:SOPRANO_PORT) { $env:SOPRANO_PORT } else { "7860" }
72
- try {
73
- $null = Get-Command soprano -ErrorAction Stop
74
- $sopranoInstalled = $true
75
- } catch {
76
- # Also check if a Soprano server is running (try both API paths)
77
- try {
78
- $null = Invoke-WebRequest -Uri "http://127.0.0.1:${sopranoPort}/gradio_api/info" -TimeoutSec 1 -UseBasicParsing -ErrorAction Stop
79
- $sopranoInstalled = $true
80
- } catch {
81
- try {
82
- $null = Invoke-WebRequest -Uri "http://127.0.0.1:${sopranoPort}/info" -TimeoutSec 1 -UseBasicParsing -ErrorAction Stop
83
- $sopranoInstalled = $true
84
- } catch {}
85
- }
86
- }
87
-
88
- $available += @{
89
- name = "soprano"
90
- description = "Soprano TTS (Ultra-fast Neural, pip install soprano-tts)"
91
- installed = $sopranoInstalled
92
- }
93
-
94
- # Check if termux-ssh is configured (ssh.exe available + host configured)
95
- $termuxSshConfigured = $false
96
- $sshExe = Get-Command ssh.exe -ErrorAction SilentlyContinue
97
- if ($sshExe) {
98
- $hostFile = "$ClaudeDir\termux-ssh-host.txt"
99
- $globalHostFile = "$env:USERPROFILE\.claude\termux-ssh-host.txt"
100
- $termuxSshConfigured = (Test-Path $hostFile) -or (Test-Path $globalHostFile) -or ($env:TERMUX_SSH_HOST -ne "")
101
- }
102
-
103
- $available += @{
104
- name = "termux-ssh"
105
- description = "Android Termux SSH TTS (plays on Android via termux-tts-speak)"
106
- installed = $termuxSshConfigured
107
- }
108
-
109
- return $available
110
- }
111
-
112
- function Set-ActiveProvider {
113
- param([string]$NewProvider)
114
-
115
- if ($NewProvider -notin $ValidProviders) {
116
- Write-Host "[ERROR] Invalid provider: $NewProvider" -ForegroundColor Red
117
- Write-Host "Available providers:" -ForegroundColor Yellow
118
- Get-AvailableProviders | ForEach-Object {
119
- $status = if ($_.installed) { "[OK]" } else { "[INSTALL]" }
120
- Write-Host " $status $($_.name) - $($_.description)"
121
- }
122
- return $false
123
- }
124
-
125
- # Normalize legacy names
126
- if ($NewProvider -eq "windows-piper") { $NewProvider = "piper" }
127
- if ($NewProvider -eq "windows-sapi") { $NewProvider = "sapi" }
128
-
129
- # If trying to set piper, check if installed (standard location or PATH)
130
- if ($NewProvider -eq "piper") {
131
- $piperExe = "$env:LOCALAPPDATA\Programs\Piper\piper.exe"
132
- $piperFound = (Test-Path $piperExe) -or ($null -ne (Get-Command piper.exe -ErrorAction SilentlyContinue))
133
- if (-not $piperFound) {
134
- Write-Host "[WARNING] Piper not installed. Not found at: $piperExe or in PATH" -ForegroundColor Yellow
135
- Write-Host "Run: .\setup-windows.ps1 to install Piper" -ForegroundColor Yellow
136
- return $false
137
- }
138
- }
139
-
140
- Set-Content -Path $ProviderFile -Value $NewProvider
141
- Write-Host "[OK] Provider set to: $NewProvider" -ForegroundColor Green
142
- return $true
143
- }
144
-
145
- function List-Providers {
146
- Write-Host ""
147
- Write-Host "Available TTS Providers:" -ForegroundColor Cyan
148
- Write-Host ""
149
-
150
- Get-AvailableProviders | ForEach-Object {
151
- $status = if ($_.installed) { "[READY]" } else { "[INSTALL]" }
152
- Write-Host "$status $($_.name)" -ForegroundColor $(if ($_.installed) { "Green" } else { "Yellow" })
153
- Write-Host " $($_.description)" -ForegroundColor Gray
154
- Write-Host ""
155
- }
156
-
157
- $active = Get-ActiveProvider
158
- Write-Host "Currently Active: $active" -ForegroundColor Cyan
159
- Write-Host ""
160
- }
161
-
162
- # Main command routing
163
- switch ($Command) {
164
- 'get' {
165
- $active = Get-ActiveProvider
166
- Write-Host "[ACTIVE] TTS Provider: $active"
167
- }
168
-
169
- 'set' {
170
- if (-not $Provider) {
171
- Write-Host "[ERROR] Provider name required" -ForegroundColor Red
172
- Write-Host "Usage: provider-manager.ps1 set PROVIDER_NAME" -ForegroundColor Yellow
173
- List-Providers
174
- exit 1
175
- }
176
- Set-ActiveProvider $Provider | Out-Null
177
- }
178
-
179
- 'list' {
180
- List-Providers
181
- }
182
-
183
- 'switch' {
184
- if (-not $Provider) {
185
- Write-Host "[ERROR] Provider name required" -ForegroundColor Red
186
- Write-Host "Usage: provider-manager.ps1 switch PROVIDER_NAME" -ForegroundColor Yellow
187
- List-Providers
188
- exit 1
189
- }
190
- Set-ActiveProvider $Provider | Out-Null
191
- }
192
- }
1
+ #
2
+ # File: .claude/hooks-windows/provider-manager.ps1
3
+ #
4
+ # AgentVibes - Windows TTS Provider Management
5
+ #
6
+
7
+ param(
8
+ [Parameter(Position = 0)]
9
+ [ValidateSet('get', 'set', 'list', 'switch')]
10
+ [string]$Command = 'get',
11
+
12
+ [Parameter(Position = 1)]
13
+ [string]$Provider
14
+ )
15
+
16
+ $ClaudeDir = "$env:USERPROFILE\.claude"
17
+ $ProviderFile = "$ClaudeDir\tts-provider.txt"
18
+ $ValidProviders = @('windows-piper', 'windows-sapi', 'soprano')
19
+
20
+ # Ensure claude directory exists
21
+ if (-not (Test-Path $ClaudeDir)) {
22
+ New-Item -ItemType Directory -Path $ClaudeDir -Force | Out-Null
23
+ }
24
+
25
+ function Get-ActiveProvider {
26
+ if (Test-Path $ProviderFile) {
27
+ $provider = Get-Content $ProviderFile -Raw
28
+ return $provider.Trim()
29
+ }
30
+
31
+ # Default to SAPI (zero dependencies)
32
+ return "windows-sapi"
33
+ }
34
+
35
+ function Get-AvailableProviders {
36
+ $available = @()
37
+
38
+ # Always available
39
+ $available += @{
40
+ name = "windows-sapi"
41
+ description = "Windows SAPI (Built-in, No Installation)"
42
+ installed = $true
43
+ }
44
+
45
+ # Check if Piper is installed
46
+ $piperExe = "$env:LOCALAPPDATA\Programs\Piper\piper.exe"
47
+ $piperInstalled = Test-Path $piperExe
48
+
49
+ $available += @{
50
+ name = "windows-piper"
51
+ description = "Windows Piper (High Quality, Requires Installation)"
52
+ installed = $piperInstalled
53
+ }
54
+
55
+ # Check if Soprano is installed
56
+ $sopranoInstalled = $false
57
+ $sopranoPort = if ($env:SOPRANO_PORT) { $env:SOPRANO_PORT } else { "7860" }
58
+ try {
59
+ $null = Get-Command soprano -ErrorAction Stop
60
+ $sopranoInstalled = $true
61
+ } catch {
62
+ # Also check if a Soprano server is running (try both API paths)
63
+ try {
64
+ $null = Invoke-WebRequest -Uri "http://127.0.0.1:${sopranoPort}/gradio_api/info" -TimeoutSec 1 -UseBasicParsing -ErrorAction Stop
65
+ $sopranoInstalled = $true
66
+ } catch {
67
+ try {
68
+ $null = Invoke-WebRequest -Uri "http://127.0.0.1:${sopranoPort}/info" -TimeoutSec 1 -UseBasicParsing -ErrorAction Stop
69
+ $sopranoInstalled = $true
70
+ } catch {}
71
+ }
72
+ }
73
+
74
+ $available += @{
75
+ name = "soprano"
76
+ description = "Soprano TTS (Ultra-fast Neural, pip install soprano-tts)"
77
+ installed = $sopranoInstalled
78
+ }
79
+
80
+ return $available
81
+ }
82
+
83
+ function Set-ActiveProvider {
84
+ param([string]$NewProvider)
85
+
86
+ if ($NewProvider -notin $ValidProviders) {
87
+ Write-Host "[ERROR] Invalid provider: $NewProvider" -ForegroundColor Red
88
+ Write-Host "Available providers:" -ForegroundColor Yellow
89
+ Get-AvailableProviders | ForEach-Object {
90
+ $status = if ($_.installed) { "[OK]" } else { "[INSTALL]" }
91
+ Write-Host " $status $($_.name) - $($_.description)"
92
+ }
93
+ return $false
94
+ }
95
+
96
+ # If trying to set piper, check if installed
97
+ if ($NewProvider -eq "windows-piper") {
98
+ $piperExe = "$env:LOCALAPPDATA\Programs\Piper\piper.exe"
99
+ if (-not (Test-Path $piperExe)) {
100
+ Write-Host "[WARNING] Piper not installed at: $piperExe" -ForegroundColor Yellow
101
+ Write-Host "Run: .\setup-windows.ps1 to install Piper" -ForegroundColor Yellow
102
+ return $false
103
+ }
104
+ }
105
+
106
+ Set-Content -Path $ProviderFile -Value $NewProvider
107
+ Write-Host "[OK] Provider set to: $NewProvider" -ForegroundColor Green
108
+ return $true
109
+ }
110
+
111
+ function List-Providers {
112
+ Write-Host ""
113
+ Write-Host "Available TTS Providers:" -ForegroundColor Cyan
114
+ Write-Host ""
115
+
116
+ Get-AvailableProviders | ForEach-Object {
117
+ $status = if ($_.installed) { "[READY]" } else { "[INSTALL]" }
118
+ Write-Host "$status $($_.name)" -ForegroundColor $(if ($_.installed) { "Green" } else { "Yellow" })
119
+ Write-Host " $($_.description)" -ForegroundColor Gray
120
+ Write-Host ""
121
+ }
122
+
123
+ $active = Get-ActiveProvider
124
+ Write-Host "Currently Active: $active" -ForegroundColor Cyan
125
+ Write-Host ""
126
+ }
127
+
128
+ # Main command routing
129
+ switch ($Command) {
130
+ 'get' {
131
+ $active = Get-ActiveProvider
132
+ Write-Host "[ACTIVE] TTS Provider: $active"
133
+ }
134
+
135
+ 'set' {
136
+ if (-not $Provider) {
137
+ Write-Host "[ERROR] Provider name required" -ForegroundColor Red
138
+ Write-Host "Usage: provider-manager.ps1 set PROVIDER_NAME" -ForegroundColor Yellow
139
+ List-Providers
140
+ exit 1
141
+ }
142
+ Set-ActiveProvider $Provider | Out-Null
143
+ }
144
+
145
+ 'list' {
146
+ List-Providers
147
+ }
148
+
149
+ 'switch' {
150
+ if (-not $Provider) {
151
+ Write-Host "[ERROR] Provider name required" -ForegroundColor Red
152
+ Write-Host "Usage: provider-manager.ps1 switch PROVIDER_NAME" -ForegroundColor Yellow
153
+ List-Providers
154
+ exit 1
155
+ }
156
+ Set-ActiveProvider $Provider | Out-Null
157
+ }
158
+ }
@@ -1,9 +1,10 @@
1
1
  #
2
2
  # File: .claude/hooks-windows/session-start-tts.ps1
3
3
  #
4
- # AgentVibes SessionStart Hook for Windows
5
- # Outputs JSON with hookSpecificOutput.additionalContext for reliable context injection.
6
- # Mirrors session-start-tts.sh — keep both in sync.
4
+ # AgentVibes SessionStart Hook for Windows - Optimized (Issue #80, Phase 1)
5
+ # Token target: ~250 (down from ~500)
6
+ #
7
+ # Prints TTS protocol instructions to stdout so Claude knows to use TTS.
7
8
  #
8
9
 
9
10
  $ErrorActionPreference = "Stop"
@@ -13,6 +14,7 @@ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
13
14
 
14
15
  # Check if AgentVibes is installed
15
16
  if (-not (Test-Path (Join-Path $ScriptDir "play-tts.ps1"))) {
17
+ # AgentVibes not installed, don't inject anything
16
18
  exit 0
17
19
  }
18
20
 
@@ -25,8 +27,8 @@ $Sentiment = ""
25
27
  $sentimentPaths = @("$ProjectClaudeDir\tts-sentiment.txt", "$env:USERPROFILE\.claude\tts-sentiment.txt")
26
28
  foreach ($p in $sentimentPaths) {
27
29
  if (Test-Path $p) {
28
- $val = (Get-Content $p -Raw -ErrorAction SilentlyContinue).Trim()
29
- if ($val) { $Sentiment = $val; break }
30
+ $Sentiment = (Get-Content $p -Raw -ErrorAction SilentlyContinue).Trim()
31
+ if ($Sentiment) { break }
30
32
  }
31
33
  }
32
34
 
@@ -39,9 +41,14 @@ foreach ($p in $personalityPaths) {
39
41
  }
40
42
  }
41
43
 
42
- $Style = if ($Sentiment) { $Sentiment } else { $Personality }
44
+ # Determine style
45
+ if ($Sentiment) {
46
+ $Style = $Sentiment
47
+ } else {
48
+ $Style = $Personality
49
+ }
43
50
 
44
- # Get verbosity level
51
+ # Get verbosity level (Issue #32)
45
52
  $Verbosity = "low"
46
53
  $verbosityPaths = @("$ProjectClaudeDir\tts-verbosity.txt", "$env:USERPROFILE\.claude\tts-verbosity.txt")
47
54
  foreach ($p in $verbosityPaths) {
@@ -51,33 +58,58 @@ foreach ($p in $verbosityPaths) {
51
58
  }
52
59
  }
53
60
 
54
- # Build verbosity section
55
- $VerbositySection = switch ($Verbosity) {
56
- "low" { "## Verbosity: LOW`n- Acknowledgment: Action only`n- Completion: Result + errors only`n- Skip: Reasoning, decisions" }
57
- "medium" { "## Verbosity: MEDIUM`n- Acknowledgment: Action + key approach`n- Completion: Result + important decisions`n- Include: Major choices only" }
58
- "high" { "## Verbosity: HIGH`n- Acknowledgment: Action + approach + why`n- Completion: Result + decisions + trade-offs`n- Include: Full reasoning, alternatives" }
59
- "caveman" { "## Verbosity: CAVEMAN`n- Respond terse. All technical substance stays. Only fluff dies.`n- Drop: articles (a/an/the), filler (just/really/basically), pleasantries, hedging`n- Abbreviate: DB/auth/config/req/res/fn/impl. Use arrows (X -> Y). Strip conjunctions.`n- Fragments OK. Short synonyms. Technical terms exact. Code unchanged.`n- Pattern: [thing] [action] [reason]. [next step].`n- TTS: Ultra-short. Max 60 chars." }
60
- default { "## Verbosity: LOW`n- Acknowledgment: Action only`n- Completion: Result + errors only" }
61
- }
61
+ # Output optimized TTS protocol
62
+ Write-Output @"
62
63
 
63
- # Build full context string
64
- $Context = @"
65
64
  # AgentVibes TTS Protocol
66
65
 
67
66
  **CRITICAL: You MUST execute TTS at TWO points for EVERY user interaction:**
68
67
 
69
- 1. **Acknowledgment** - Start of task: ``Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "[action]" -llm claude-code``
70
- 2. **Completion** - End of task: ``Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "[result + key details]" -llm claude-code``
68
+ 1. **Acknowledgment** - Start of task: ``Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "[action]"``
69
+ 2. **Completion** - End of task: ``Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "[result + key details]"``
71
70
 
72
71
  **Example:**
73
72
  ``````
74
- [Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "Checking git status" -llm claude-code]
73
+ [Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "Checking git status"]
75
74
  [work...]
76
- [Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "Repository is clean, no changes" -llm claude-code]
75
+ [Bash: powershell -NoProfile -ExecutionPolicy Bypass -File ".claude\hooks-windows\play-tts.ps1" "Repository is clean, no changes"]
77
76
  ``````
78
77
 
79
- $VerbositySection
78
+ "@
79
+
80
+ # Add verbosity-specific protocol (Issue #32)
81
+ switch ($Verbosity) {
82
+ "low" {
83
+ Write-Output @"
84
+ ## Verbosity: LOW
85
+ - Acknowledgment: Action only
86
+ - Completion: Result + errors only
87
+ - Skip: Reasoning, decisions
88
+
89
+ "@
90
+ }
91
+ "medium" {
92
+ Write-Output @"
93
+ ## Verbosity: MEDIUM
94
+ - Acknowledgment: Action + key approach
95
+ - Completion: Result + important decisions
96
+ - Include: Major choices only
97
+
98
+ "@
99
+ }
100
+ "high" {
101
+ Write-Output @"
102
+ ## Verbosity: HIGH
103
+ - Acknowledgment: Action + approach + why
104
+ - Completion: Result + decisions + trade-offs
105
+ - Include: Full reasoning, alternatives
106
+
107
+ "@
108
+ }
109
+ }
80
110
 
111
+ # Add style info and rules
112
+ Write-Output @"
81
113
  ## Style: $Style
82
114
 
83
115
  ## Rules
@@ -87,29 +119,6 @@ $VerbositySection
87
119
  4. Keep under 150 chars
88
120
  5. Always include errors
89
121
 
90
- Quick Ref: low=action+result | medium=+key decisions | high=+full reasoning | caveman=ultra-terse fragments
91
-
92
- ## BMAD Agent Voice Routing
93
- If ``.bmad-agent-context`` exists, check its content:
94
-
95
- **Single agent mode** (content is an agent ID like "analyst"):
96
- Use ``bmad-speak.ps1`` instead of ``play-tts.ps1``:
122
+ Quick Ref: low=action+result | medium=+key decisions | high=+full reasoning
97
123
 
98
-
99
- **Party mode** (content is "party-mode"):
100
- Each agent speaks via ``bmad-speak.ps1`` with their display name. The queue system ensures sequential playback — agents speak one at a time, not overlapping:
101
-
102
- IMPORTANT: In party mode, do NOT use ``play-tts.ps1``. Always use ``bmad-speak.ps1`` with the agent's display name. Do NOT call multiple bmad-speak.ps1 in parallel — call them sequentially so the queue processes them in order.
103
-
104
- If ``.bmad-agent-context`` does NOT exist, use ``play-tts.ps1`` as normal.
105
124
  "@
106
-
107
- # Build JSON via hashtable so ConvertTo-Json handles all escaping (Unicode, backslashes, quotes)
108
- $Output = @{
109
- hookSpecificOutput = @{
110
- hookEventName = "SessionStart"
111
- additionalContext = $Context
112
- }
113
- }
114
- [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
115
- Write-Output ($Output | ConvertTo-Json -Compress -Depth 5)