agentvibes 5.7.3 → 5.7.5

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.
@@ -0,0 +1,438 @@
1
+ {
2
+ "version": 1,
3
+ "updatedAt": "2026-05-12T16:11:50.143Z",
4
+ "files": {
5
+ "/home/administrator/claude/AgentVibes/.claude/hooks/audio-cache-utils.sh": {
6
+ "hash": "12f3198bc340b01a4cb815f2af00865050294ca141e0df6feb5d31931ef684d6",
7
+ "installedAt": "2026-05-12T16:11:50.000Z"
8
+ },
9
+ "/home/administrator/claude/AgentVibes/.claude/hooks/audio-processor.sh": {
10
+ "hash": "82efc1e67f51a6906414ee04c0053f405869590743b80c04c3ef3f9e34d294be",
11
+ "installedAt": "2026-05-12T16:11:50.001Z"
12
+ },
13
+ "/home/administrator/claude/AgentVibes/.claude/hooks/background-music-manager.sh": {
14
+ "hash": "1be2e32d910c080117350b359699b9c20a7ab0a2ccb6e95c809f21a9d8299eeb",
15
+ "installedAt": "2026-05-12T16:11:50.002Z"
16
+ },
17
+ "/home/administrator/claude/AgentVibes/.claude/hooks/bmad-party-manager.sh": {
18
+ "hash": "a838575cdea65ee6e8ab0956e965380b32fc87a9af2df94ed8798ea17b75c3bb",
19
+ "installedAt": "2026-05-12T16:11:50.003Z"
20
+ },
21
+ "/home/administrator/claude/AgentVibes/.claude/hooks/bmad-party-speak.sh": {
22
+ "hash": "157165d726a98dc1e0feaba5df25993195f06d756cfe2adda00fd6bedc8dd6ae",
23
+ "installedAt": "2026-05-12T16:11:50.003Z"
24
+ },
25
+ "/home/administrator/claude/AgentVibes/.claude/hooks/bmad-speak-enhanced.sh": {
26
+ "hash": "1c80292b63469cf8a616af6a1dde7c0fef1ef5534ae801bc416485e43e25d49c",
27
+ "installedAt": "2026-05-12T16:11:50.004Z"
28
+ },
29
+ "/home/administrator/claude/AgentVibes/.claude/hooks/bmad-speak.sh": {
30
+ "hash": "f4387ff58987bda5a137dab46046608ad417923eba74f0bcae7c1137e5755854",
31
+ "installedAt": "2026-05-12T16:11:50.005Z"
32
+ },
33
+ "/home/administrator/claude/AgentVibes/.claude/hooks/bmad-tts-injector.sh": {
34
+ "hash": "cc61b39d8ba0a71e4eab4926e8895daf82997ec4ff43926952f2599175046c13",
35
+ "installedAt": "2026-05-12T16:11:50.006Z"
36
+ },
37
+ "/home/administrator/claude/AgentVibes/.claude/hooks/bmad-voice-manager.sh": {
38
+ "hash": "7ef0326706e438e2bfef763776f4863ee2924b2172df033f77159ab63b403926",
39
+ "installedAt": "2026-05-12T16:11:50.007Z"
40
+ },
41
+ "/home/administrator/claude/AgentVibes/.claude/hooks/clawdbot-receiver-SECURE.sh": {
42
+ "hash": "0aeb488dd6f345c3a6fecfceda1e68c1179312f1dad0e867bebf51c19bca5e29",
43
+ "installedAt": "2026-05-12T16:11:50.008Z"
44
+ },
45
+ "/home/administrator/claude/AgentVibes/.claude/hooks/clawdbot-receiver.sh": {
46
+ "hash": "c3678870ec11aaabc4e0677727de9524c557da7df1a99e6a1d84057c112698b7",
47
+ "installedAt": "2026-05-12T16:11:50.009Z"
48
+ },
49
+ "/home/administrator/claude/AgentVibes/.claude/hooks/clean-audio-cache.sh": {
50
+ "hash": "7bf5c92fe9df1cce94fbb28a393b0052a898f8ccee01fff17c405f68a2503313",
51
+ "installedAt": "2026-05-12T16:11:50.009Z"
52
+ },
53
+ "/home/administrator/claude/AgentVibes/.claude/hooks/cleanup-cache.sh": {
54
+ "hash": "f41fba9a48836f4fba60501b6dacfb05890221ecca04cc52a3897714a43ae45c",
55
+ "installedAt": "2026-05-12T16:11:50.010Z"
56
+ },
57
+ "/home/administrator/claude/AgentVibes/.claude/hooks/configure-rdp-mode.sh": {
58
+ "hash": "ffb82f1f8a792dcc9e66faba6f2afce826485e9e0c977625ab53577624dbf148",
59
+ "installedAt": "2026-05-12T16:11:50.010Z"
60
+ },
61
+ "/home/administrator/claude/AgentVibes/.claude/hooks/download-extra-voices.sh": {
62
+ "hash": "2fbae741205701f72d326a781ee92b38535d64913fa0b245991b5beaf0a57ac8",
63
+ "installedAt": "2026-05-12T16:11:50.011Z"
64
+ },
65
+ "/home/administrator/claude/AgentVibes/.claude/hooks/effects-manager.sh": {
66
+ "hash": "a56577ee56a316f87129e79046d750bb70cb89832e63f4b7efcbea408070faa1",
67
+ "installedAt": "2026-05-12T16:11:50.012Z"
68
+ },
69
+ "/home/administrator/claude/AgentVibes/.claude/hooks/github-star-reminder.sh": {
70
+ "hash": "a07911f1aa424f20f966049710ea2b8002a2d1ec423b3b40b67ec0942bc86701",
71
+ "installedAt": "2026-05-12T16:11:50.013Z"
72
+ },
73
+ "/home/administrator/claude/AgentVibes/.claude/hooks/language-manager.sh": {
74
+ "hash": "5756b4686ec2e20190bf85f4f74c54b708f04d21c755ad2378b88d5ee1aac444",
75
+ "installedAt": "2026-05-12T16:11:50.014Z"
76
+ },
77
+ "/home/administrator/claude/AgentVibes/.claude/hooks/learn-manager.sh": {
78
+ "hash": "57eeb4f82b5074b7830b391626196058b96b06414c0fca66025647b10e8d7d0c",
79
+ "installedAt": "2026-05-12T16:11:50.015Z"
80
+ },
81
+ "/home/administrator/claude/AgentVibes/.claude/hooks/macos-voice-manager.sh": {
82
+ "hash": "1f04f7ea7ba8e8c862dd9f59f9977d159ffcfcd41883f265baf80320545b1ad1",
83
+ "installedAt": "2026-05-12T16:11:50.015Z"
84
+ },
85
+ "/home/administrator/claude/AgentVibes/.claude/hooks/migrate-background-music.sh": {
86
+ "hash": "960505fb346365189f069ab185584d6d6f8b1024daeb881de51dc0969a072dd3",
87
+ "installedAt": "2026-05-12T16:11:50.016Z"
88
+ },
89
+ "/home/administrator/claude/AgentVibes/.claude/hooks/migrate-to-agentvibes.sh": {
90
+ "hash": "0317cd629430feb811f415527f8699ec5ada9be3675440a2489cb0c65138d557",
91
+ "installedAt": "2026-05-12T16:11:50.017Z"
92
+ },
93
+ "/home/administrator/claude/AgentVibes/.claude/hooks/optimize-background-music.sh": {
94
+ "hash": "685862003d4bbbedb1a94d2ed95217054578b51075bb5f926871c1f5a9ac8d50",
95
+ "installedAt": "2026-05-12T16:11:50.017Z"
96
+ },
97
+ "/home/administrator/claude/AgentVibes/.claude/hooks/path-resolver.sh": {
98
+ "hash": "11341ae59c4e9f584a21cad53a94349c3d68d6f4625d369cf63891088d68ba1f",
99
+ "installedAt": "2026-05-12T16:11:50.018Z"
100
+ },
101
+ "/home/administrator/claude/AgentVibes/.claude/hooks/personality-manager.sh": {
102
+ "hash": "f6616ab941a796f728fe37645b9e98fc643c6b5a9dddad9b0f8203132bc830a1",
103
+ "installedAt": "2026-05-12T16:11:50.019Z"
104
+ },
105
+ "/home/administrator/claude/AgentVibes/.claude/hooks/piper-download-voices.sh": {
106
+ "hash": "5d470b13340728295b99ec683e9247c7713f50367a0ba027cf466a583eba5dcf",
107
+ "installedAt": "2026-05-12T16:11:50.020Z"
108
+ },
109
+ "/home/administrator/claude/AgentVibes/.claude/hooks/piper-installer.sh": {
110
+ "hash": "af40bc622555304380248ebc2ba043d84a3f66cd6cbe3d7534da57f1962b99de",
111
+ "installedAt": "2026-05-12T16:11:50.021Z"
112
+ },
113
+ "/home/administrator/claude/AgentVibes/.claude/hooks/piper-multispeaker-registry.sh": {
114
+ "hash": "d1d55e15ca16ccc81af912463be9a27faf27242d34628e5e6d6e846bc565014a",
115
+ "installedAt": "2026-05-12T16:11:50.021Z"
116
+ },
117
+ "/home/administrator/claude/AgentVibes/.claude/hooks/piper-voice-manager.sh": {
118
+ "hash": "a09371add655c266f9f00887d1da99e51726850629e723d70b637ea8c50a9be5",
119
+ "installedAt": "2026-05-12T16:11:50.023Z"
120
+ },
121
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts-agentvibes-receiver-for-voiceless-connections.sh": {
122
+ "hash": "1e2cb701fb61e7aef50b54f5601eb5510d3d994f4d65c8fa375382cfc539c55f",
123
+ "installedAt": "2026-05-12T16:11:50.023Z"
124
+ },
125
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts-enhanced.sh": {
126
+ "hash": "2274151489750072d5e7d672168f8fcc21a9e2d4cfc2e092330a17862d52d722",
127
+ "installedAt": "2026-05-12T16:11:50.024Z"
128
+ },
129
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts-macos.sh": {
130
+ "hash": "9cbad50003f3db999d4eaa78075127c187afc40e98ab9c410d5c6c2dd7ef3b09",
131
+ "installedAt": "2026-05-12T16:11:50.025Z"
132
+ },
133
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts-piper.sh": {
134
+ "hash": "7fd72fe3a57b486aec530b8db4993cb9a8574aa43f58f7059a59f9b9f2c68fba",
135
+ "installedAt": "2026-05-12T16:11:50.026Z"
136
+ },
137
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts-soprano.sh": {
138
+ "hash": "0a49b6de253512abed4c5e0b6c21438ba646b21df905a5b2abd838882e5355e7",
139
+ "installedAt": "2026-05-12T16:11:50.027Z"
140
+ },
141
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts-ssh-remote.sh": {
142
+ "hash": "d135dd09fc3ec7eca7a45d3290bd2d67ac9b5302c5f35202b63bed85c46aa813",
143
+ "installedAt": "2026-05-12T16:11:50.027Z"
144
+ },
145
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts-termux-ssh.sh": {
146
+ "hash": "d2b2eb3aad871d71130de0b67a37c623bf72c5192e8cd1005286dcd9e511b43f",
147
+ "installedAt": "2026-05-12T16:11:50.028Z"
148
+ },
149
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts-windows-receiver.sh": {
150
+ "hash": "d83abb59223f01577b9e86d7dcf9a04a3f29a9ad7f58942b7fd17fae32222883",
151
+ "installedAt": "2026-05-12T16:11:50.029Z"
152
+ },
153
+ "/home/administrator/claude/AgentVibes/.claude/hooks/play-tts.sh": {
154
+ "hash": "734766bc861ee466119450891f797b885fa3de5690906cbcea1c98719df80042",
155
+ "installedAt": "2026-05-12T16:11:50.030Z"
156
+ },
157
+ "/home/administrator/claude/AgentVibes/.claude/hooks/provider-commands.sh": {
158
+ "hash": "ff99181ba6aca43925d7106403762a9dd65a35c9ba84e780561e96dc3b09afb7",
159
+ "installedAt": "2026-05-12T16:11:50.031Z"
160
+ },
161
+ "/home/administrator/claude/AgentVibes/.claude/hooks/provider-manager.sh": {
162
+ "hash": "62cadcc3e53d9963d559198e53c4c9f3b9386a2e073a3e48f70a9e23c6dedd1c",
163
+ "installedAt": "2026-05-12T16:11:50.032Z"
164
+ },
165
+ "/home/administrator/claude/AgentVibes/.claude/hooks/replay-target-audio.sh": {
166
+ "hash": "f0f8068c871a74494e77d4fc52e91a577e2481c57aa3e4db115109395d854802",
167
+ "installedAt": "2026-05-12T16:11:50.032Z"
168
+ },
169
+ "/home/administrator/claude/AgentVibes/.claude/hooks/sentiment-manager.sh": {
170
+ "hash": "a75e63b6de59a162a1088a73edf85af8ab1e952ce5eaa570d67c3f3680de3ccb",
171
+ "installedAt": "2026-05-12T16:11:50.033Z"
172
+ },
173
+ "/home/administrator/claude/AgentVibes/.claude/hooks/session-start-tts.sh": {
174
+ "hash": "d472a3df6d240ada38e7a8b95055c20f3235d8db145cd94ec698d7ad9c460f06",
175
+ "installedAt": "2026-05-12T16:11:50.034Z"
176
+ },
177
+ "/home/administrator/claude/AgentVibes/.claude/hooks/speed-manager.sh": {
178
+ "hash": "071c25019cc9fc00e3f08b3aa2ff8b648e21d9c761b0377e7fde006233d3e1c2",
179
+ "installedAt": "2026-05-12T16:11:50.035Z"
180
+ },
181
+ "/home/administrator/claude/AgentVibes/.claude/hooks/stop-tts.sh": {
182
+ "hash": "26b1d924956e6da864e8a5a3a1e7ce12424534bf8b8af7186c30adacfffb2344",
183
+ "installedAt": "2026-05-12T16:11:50.035Z"
184
+ },
185
+ "/home/administrator/claude/AgentVibes/.claude/hooks/stop.sh": {
186
+ "hash": "27cbb8e568deb2a49ca0b777711d2f70688d1512919261352b095f753122a725",
187
+ "installedAt": "2026-05-12T16:11:50.036Z"
188
+ },
189
+ "/home/administrator/claude/AgentVibes/.claude/hooks/termux-installer.sh": {
190
+ "hash": "d8c6875d5bb674c584d65864d16a6500267285c8f4e1cc74f4e626378acf3694",
191
+ "installedAt": "2026-05-12T16:11:50.037Z"
192
+ },
193
+ "/home/administrator/claude/AgentVibes/.claude/hooks/translate-manager.sh": {
194
+ "hash": "ca707162b225c0d8206ca64595f9a6f0a61fe6be243dde7232b0ab21942795ad",
195
+ "installedAt": "2026-05-12T16:11:50.037Z"
196
+ },
197
+ "/home/administrator/claude/AgentVibes/.claude/hooks/tts-queue-worker.sh": {
198
+ "hash": "90c88097a5e5705c09ee97c240f6e3da74847b1b80b4f27e2182237dead8b803",
199
+ "installedAt": "2026-05-12T16:11:50.038Z"
200
+ },
201
+ "/home/administrator/claude/AgentVibes/.claude/hooks/tts-queue.sh": {
202
+ "hash": "47c9f41716a8f386f61e2631b8203ac42df9e95c7a101cd4db9b1dd46ff5f6ea",
203
+ "installedAt": "2026-05-12T16:11:50.039Z"
204
+ },
205
+ "/home/administrator/claude/AgentVibes/.claude/hooks/verbosity-manager.sh": {
206
+ "hash": "86d1a5a76d847090cf3abd86fc33a8d4450194886eb0fe1236fe3467f44842f9",
207
+ "installedAt": "2026-05-12T16:11:50.039Z"
208
+ },
209
+ "/home/administrator/claude/AgentVibes/.claude/hooks/voice-manager.sh": {
210
+ "hash": "713dbf85cb3831c3baf0c58f3337fa5a8619161d460af8792bdec979ae43b72e",
211
+ "installedAt": "2026-05-12T16:11:50.041Z"
212
+ },
213
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/add.md": {
214
+ "hash": "bd3daaa8a3ef7dc1c705db8340b80ec34ad63af8063718b5056e251138d8d03a",
215
+ "installedAt": "2026-05-12T16:11:50.089Z"
216
+ },
217
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/agent-vibes.md": {
218
+ "hash": "38477538c4f015c0e2014ca2f1ee6f751a61541ac2bcdfa6a3ed212b567e9105",
219
+ "installedAt": "2026-05-12T16:11:50.089Z"
220
+ },
221
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/agent.md": {
222
+ "hash": "98e3cbd512678f9a622a93b8aae420abfe08829a4fd5ac27b238a2ff211ac23b",
223
+ "installedAt": "2026-05-12T16:11:50.090Z"
224
+ },
225
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/background-music.md": {
226
+ "hash": "21495a8fd1de53707a7f501a02eb79ef6933cf95e69a475bd1f92dbd8c645599",
227
+ "installedAt": "2026-05-12T16:11:50.091Z"
228
+ },
229
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/bmad.md": {
230
+ "hash": "42b56448eee2bceafc2788bb5f39de0b5f06d37d681f8b99073bd89695ad1704",
231
+ "installedAt": "2026-05-12T16:11:50.091Z"
232
+ },
233
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/clean.md": {
234
+ "hash": "e52b75db5d5a1e8982c3649ab87b511a958d7249708c9c3461ec86325e5d37f8",
235
+ "installedAt": "2026-05-12T16:11:50.092Z"
236
+ },
237
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/cleanup.md": {
238
+ "hash": "f341bacd736bdbd508f7368a8489a8eb30c0ad807cd7783bc972f8aad8fa0ca7",
239
+ "installedAt": "2026-05-12T16:11:50.092Z"
240
+ },
241
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/commands.json": {
242
+ "hash": "5bbb20ee98049f94c1fddc6088564f8f4ad12b7ac79a39089d14066cec1dd406",
243
+ "installedAt": "2026-05-12T16:11:50.093Z"
244
+ },
245
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/effects.md": {
246
+ "hash": "c7df70141beead591e2bcd1e6a68913ab58e15580d62a4bedd3fc336ac6646da",
247
+ "installedAt": "2026-05-12T16:11:50.094Z"
248
+ },
249
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/get.md": {
250
+ "hash": "197611671de8163d0e3b519d199eaceb8a57c3c3a1e08cc0e8d6f2feaa9caf67",
251
+ "installedAt": "2026-05-12T16:11:50.094Z"
252
+ },
253
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/hide.md": {
254
+ "hash": "80ac0970d257d8774f14ce7eb0e82f6bc281db35b81d6fa02e1f3489748f6baa",
255
+ "installedAt": "2026-05-12T16:11:50.095Z"
256
+ },
257
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/language.md": {
258
+ "hash": "94808a41f74907fc971a571379c76699da79f753ace461d7044547e29af8b796",
259
+ "installedAt": "2026-05-12T16:11:50.095Z"
260
+ },
261
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/learn.md": {
262
+ "hash": "f3ef20f6180ccd621bcbed03a437cb97dd12eb25fa650a0e3f298047f3f98112",
263
+ "installedAt": "2026-05-12T16:11:50.096Z"
264
+ },
265
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/list.md": {
266
+ "hash": "6fcbe3a38c16c823c2296595c7a0fc635ddbeb8539eacbcc5ea54cf3270b2377",
267
+ "installedAt": "2026-05-12T16:11:50.097Z"
268
+ },
269
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/mute.md": {
270
+ "hash": "7920d44b03dc402d6f42ec74921ec334bdce256a8be6bc540d91fe086f8b23fe",
271
+ "installedAt": "2026-05-12T16:11:50.097Z"
272
+ },
273
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/personality.md": {
274
+ "hash": "1722d7c69794ef817e94e3c706f21aaa5e3ec8ea8f2c66f6c570670dae81aa74",
275
+ "installedAt": "2026-05-12T16:11:50.098Z"
276
+ },
277
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/preview.md": {
278
+ "hash": "86ca6cbb47a45bdcc91d8e13fce08d49935364e07834296583e27f6cadc6d903",
279
+ "installedAt": "2026-05-12T16:11:50.098Z"
280
+ },
281
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/provider.md": {
282
+ "hash": "c4e6c9126a5ebbebeed6922f0cd644c8de3aa6400ad122e13b51fe4565a9459e",
283
+ "installedAt": "2026-05-12T16:11:50.099Z"
284
+ },
285
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/replay-target.md": {
286
+ "hash": "5f4f5da3bd968dd8d13df9988ade88eeaae9536bc503c33d847198b6a5b96c68",
287
+ "installedAt": "2026-05-12T16:11:50.100Z"
288
+ },
289
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/replay.md": {
290
+ "hash": "1b561f9ba3ce5ec07007e98fe76eb78e726f2b95615204d0dec6e07bbb6e21f4",
291
+ "installedAt": "2026-05-12T16:11:50.100Z"
292
+ },
293
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/sample.md": {
294
+ "hash": "48b6c99c007524bbfc1010c7bbebc676dcdfd48a74784d66cbabf1d6bc7db0c8",
295
+ "installedAt": "2026-05-12T16:11:50.101Z"
296
+ },
297
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/sentiment.md": {
298
+ "hash": "7c92333484b2c80a46f778a9e0860bb9f1086271a2e6eae41bd96482f214d593",
299
+ "installedAt": "2026-05-12T16:11:50.102Z"
300
+ },
301
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/set-favorite-voice.md": {
302
+ "hash": "9662a5c080c703a1a1e79195133a9ccbfbf074c2fe8c84297cd7a35b8be810af",
303
+ "installedAt": "2026-05-12T16:11:50.102Z"
304
+ },
305
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/set-language.md": {
306
+ "hash": "95354538191c97124721e6aa7d90915b4e2018050112c0937091b5107a5c8246",
307
+ "installedAt": "2026-05-12T16:11:50.103Z"
308
+ },
309
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/set-pretext.md": {
310
+ "hash": "31388d03a8145481b4f9fcd6bd6f2bb24124d039ae97ba8b51feaf1dfc845f10",
311
+ "installedAt": "2026-05-12T16:11:50.103Z"
312
+ },
313
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/set-speed.md": {
314
+ "hash": "9513f877200d0faf86f8c19fc26b2c2b87b856d9e86bd30154f18648d09c305c",
315
+ "installedAt": "2026-05-12T16:11:50.104Z"
316
+ },
317
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/show.md": {
318
+ "hash": "5dcc027996e3520555f23eaea5f5da42d7cd6ea45a009c26372e96a60847c61e",
319
+ "installedAt": "2026-05-12T16:11:50.105Z"
320
+ },
321
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/switch.md": {
322
+ "hash": "192038da652af01cd54a8ad0bc2dbcd48ac4059ac43c2a4df839e4909820403b",
323
+ "installedAt": "2026-05-12T16:11:50.105Z"
324
+ },
325
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/target-voice.md": {
326
+ "hash": "9c3ac8d1249ae8fc8014b21a9e785bcb4b69e9e65f3869c91b396b4d95e288fb",
327
+ "installedAt": "2026-05-12T16:11:50.106Z"
328
+ },
329
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/target.md": {
330
+ "hash": "634dfbc6ec274179d58fb0fe9e6281b07ee7c20cd9f9bf02e00c8e920e8b83c4",
331
+ "installedAt": "2026-05-12T16:11:50.107Z"
332
+ },
333
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/translate.md": {
334
+ "hash": "bbc8a9488ec71c03b9bcdc6db1da771331ddd6c97ad851b99a7985d874ff6884",
335
+ "installedAt": "2026-05-12T16:11:50.107Z"
336
+ },
337
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/unmute.md": {
338
+ "hash": "1f843039e69b03c077aac56138eeb1d2a7cb1129ce6893b361623ef9f755da05",
339
+ "installedAt": "2026-05-12T16:11:50.108Z"
340
+ },
341
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/update.md": {
342
+ "hash": "bc1022c7d70cbd6b9b0ad69806e8206cb70b446711db6147d7447d99639e2b6e",
343
+ "installedAt": "2026-05-12T16:11:50.109Z"
344
+ },
345
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/verbosity.md": {
346
+ "hash": "d56647186ce6540c8ae48fd2e8f5ede040743f09f6a2bc372ccc5de28946bd40",
347
+ "installedAt": "2026-05-12T16:11:50.109Z"
348
+ },
349
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/version.md": {
350
+ "hash": "bbc5ba5abaf44af6893e3232791268fd4d9f80d68bac0b95bfbec3cf44869e4f",
351
+ "installedAt": "2026-05-12T16:11:50.110Z"
352
+ },
353
+ "/home/administrator/claude/AgentVibes/.claude/commands/agent-vibes/whoami.md": {
354
+ "hash": "04909e3350e9ccb5886067edc19b37597f846a2bfb1502c1286e33fb6895ba23",
355
+ "installedAt": "2026-05-12T16:11:50.110Z"
356
+ },
357
+ "/home/administrator/claude/AgentVibes/.claude/personalities/angry.md": {
358
+ "hash": "fb1711508b4d42dbfc15f57175dcb0f2da4fac034b68659dacc0991a72afc795",
359
+ "installedAt": "2026-05-12T16:11:50.132Z"
360
+ },
361
+ "/home/administrator/claude/AgentVibes/.claude/personalities/annoying.md": {
362
+ "hash": "ced090e4e5696b8c06ee605a701a6f5c3e7d90ff9850915eca1e5b682eabcaf1",
363
+ "installedAt": "2026-05-12T16:11:50.133Z"
364
+ },
365
+ "/home/administrator/claude/AgentVibes/.claude/personalities/crass.md": {
366
+ "hash": "46a51249e60c41bdf2046903b83965f6265bf34445812ac425601fbfab8660bb",
367
+ "installedAt": "2026-05-12T16:11:50.134Z"
368
+ },
369
+ "/home/administrator/claude/AgentVibes/.claude/personalities/dramatic.md": {
370
+ "hash": "68864221d652dc95055a60f005400ea5e0c2b38c4c75f16d7299a1582d8fed6e",
371
+ "installedAt": "2026-05-12T16:11:50.134Z"
372
+ },
373
+ "/home/administrator/claude/AgentVibes/.claude/personalities/dry-humor.md": {
374
+ "hash": "ec1dbfbb525f1b7e641a911bbcba3649ef70880adaa01c0b281c4580bae63365",
375
+ "installedAt": "2026-05-12T16:11:50.135Z"
376
+ },
377
+ "/home/administrator/claude/AgentVibes/.claude/personalities/flirty.md": {
378
+ "hash": "328ea5a06bf9b9569825922924ae51f7f0b1b3985001ea273a8a9bacf2e02615",
379
+ "installedAt": "2026-05-12T16:11:50.135Z"
380
+ },
381
+ "/home/administrator/claude/AgentVibes/.claude/personalities/funny.md": {
382
+ "hash": "a68efc479819b11c6dfda43f3b290f51740cdfa938c4e3e3e96bd0d656f63fa3",
383
+ "installedAt": "2026-05-12T16:11:50.136Z"
384
+ },
385
+ "/home/administrator/claude/AgentVibes/.claude/personalities/grandpa.md": {
386
+ "hash": "3a2dff1e4d8b121cdcb6fe4c745a9fac5d254156a3658a309319056af9fce42c",
387
+ "installedAt": "2026-05-12T16:11:50.136Z"
388
+ },
389
+ "/home/administrator/claude/AgentVibes/.claude/personalities/millennial.md": {
390
+ "hash": "f69dfa3958153c82ed62fb940360c74beaa8d71ef13d41f32500e9f58fca346c",
391
+ "installedAt": "2026-05-12T16:11:50.137Z"
392
+ },
393
+ "/home/administrator/claude/AgentVibes/.claude/personalities/moody.md": {
394
+ "hash": "5d4e6278ef0d453d64ad4b940667ddad1d59aa9f327ae0a11227085e22690884",
395
+ "installedAt": "2026-05-12T16:11:50.137Z"
396
+ },
397
+ "/home/administrator/claude/AgentVibes/.claude/personalities/normal.md": {
398
+ "hash": "25a209d55a7e752c21cc10688349f1602e769b436639c28850db5c5fd431570f",
399
+ "installedAt": "2026-05-12T16:11:50.138Z"
400
+ },
401
+ "/home/administrator/claude/AgentVibes/.claude/personalities/pirate.md": {
402
+ "hash": "e529aa181574a341bb511dc87929116df112ce21b575726a3f0521406da07cf4",
403
+ "installedAt": "2026-05-12T16:11:50.138Z"
404
+ },
405
+ "/home/administrator/claude/AgentVibes/.claude/personalities/poetic.md": {
406
+ "hash": "57e2506800cdb647fc9f42a904d7da1e5e5b72cf0491fd2527907b64d943bc29",
407
+ "installedAt": "2026-05-12T16:11:50.139Z"
408
+ },
409
+ "/home/administrator/claude/AgentVibes/.claude/personalities/professional.md": {
410
+ "hash": "e89d6bb62eda126e8c5d9d0cc7bf4b9cced7a641b6ea626d0a3d8c93b3e18af3",
411
+ "installedAt": "2026-05-12T16:11:50.139Z"
412
+ },
413
+ "/home/administrator/claude/AgentVibes/.claude/personalities/rapper.md": {
414
+ "hash": "322f36183ddc583306b21a008de469dd116b76f042eeb3dc0dbd4cda42f94dfd",
415
+ "installedAt": "2026-05-12T16:11:50.140Z"
416
+ },
417
+ "/home/administrator/claude/AgentVibes/.claude/personalities/robot.md": {
418
+ "hash": "f4a05b06ebe7c86c4120f36ad077b1edcbdbe9e25662d7f58817faa656e7361b",
419
+ "installedAt": "2026-05-12T16:11:50.141Z"
420
+ },
421
+ "/home/administrator/claude/AgentVibes/.claude/personalities/sarcastic.md": {
422
+ "hash": "2ce5689b090ea58b8356ca703c0376713cf74a83ab86c19e599611fe82ad9b1a",
423
+ "installedAt": "2026-05-12T16:11:50.141Z"
424
+ },
425
+ "/home/administrator/claude/AgentVibes/.claude/personalities/sassy.md": {
426
+ "hash": "e069c093fdc1d7d6bd80c2db8600caea1d4a8a14d89e818101d4ef4514582b52",
427
+ "installedAt": "2026-05-12T16:11:50.142Z"
428
+ },
429
+ "/home/administrator/claude/AgentVibes/.claude/personalities/surfer-dude.md": {
430
+ "hash": "adc1270e42e661a33d1344be2477c92becdb1bb97da46a7eb30dcca5e36d6afc",
431
+ "installedAt": "2026-05-12T16:11:50.142Z"
432
+ },
433
+ "/home/administrator/claude/AgentVibes/.claude/personalities/zen.md": {
434
+ "hash": "cbf56fb5b16fa05024353646ad77615483e9ffe8ac550d1e3a66860e9370189a",
435
+ "installedAt": "2026-05-12T16:11:50.143Z"
436
+ }
437
+ }
438
+ }
@@ -1 +1 @@
1
- 20260511
1
+ 20260513
@@ -17,6 +17,7 @@ set -euo pipefail
17
17
  TEXT="${1:-}"
18
18
  VOICE="${2:-en_US-lessac-medium}"
19
19
  AGENT_NAME="${3:-default}"
20
+ AGENT_PROFILE_FILE="${4:-}"
20
21
 
21
22
  # LLM identity — forwarded to the remote so it can look up its own
22
23
  # audio-effects.cfg llm:<name> row for voice, reverb, music, pretext, engine.
@@ -210,6 +211,19 @@ done
210
211
  [[ -n "$LLM_BG_FILE" ]] && BG_FILE="$LLM_BG_FILE"
211
212
  [[ -n "$LLM_BG_VOLUME" ]] && BG_VOLUME="$LLM_BG_VOLUME"
212
213
 
214
+ # Per-agent profile (written by bmad-speak.sh) takes highest priority for music
215
+ if [[ -n "$AGENT_PROFILE_FILE" ]] && [[ -f "$AGENT_PROFILE_FILE" ]]; then
216
+ _prof_track=$(_AV_PROF="$AGENT_PROFILE_FILE" node -e "try{const p=JSON.parse(require('fs').readFileSync(process.env._AV_PROF,'utf8'));process.stdout.write(p.backgroundMusic?.track??'')}catch{process.stdout.write('')}" 2>/dev/null || true)
217
+ _prof_vol=$(_AV_PROF="$AGENT_PROFILE_FILE" node -e "try{const p=JSON.parse(require('fs').readFileSync(process.env._AV_PROF,'utf8'));process.stdout.write(String(p.backgroundMusic?.volume??''))}catch{process.stdout.write('')}" 2>/dev/null || true)
218
+ _prof_enabled=$(_AV_PROF="$AGENT_PROFILE_FILE" node -e "try{const p=JSON.parse(require('fs').readFileSync(process.env._AV_PROF,'utf8'));process.stdout.write(String(p.backgroundMusic?.enabled??''))}catch{process.stdout.write('')}" 2>/dev/null || true)
219
+ if [[ "$_prof_enabled" == "true" ]] && [[ -n "$_prof_track" ]]; then
220
+ BG_FILE="$_prof_track"
221
+ if [[ "$_prof_vol" =~ ^[0-9]+$ ]]; then
222
+ BG_VOLUME=$(awk "BEGIN{printf \"%.2f\", ${_prof_vol}/100}")
223
+ fi
224
+ fi
225
+ fi
226
+
213
227
  # Read pretext if configured
214
228
  PRETEXT=""
215
229
  PRETEXT_FILE="$PROJECT_ROOT/.agentvibes/config/pretext.txt"
@@ -367,7 +367,7 @@ speak_text() {
367
367
  bash "$SCRIPT_DIR/play-tts-termux-ssh.sh" "$text" "$voice"
368
368
  ;;
369
369
  ssh-remote)
370
- bash "$SCRIPT_DIR/play-tts-ssh-remote.sh" "$text" "$voice"
370
+ bash "$SCRIPT_DIR/play-tts-ssh-remote.sh" "$text" "$voice" "" "${profile_file:-}"
371
371
  ;;
372
372
  agentvibes-receiver)
373
373
  bash "$SCRIPT_DIR/play-tts-agentvibes-receiver-for-voiceless-connections.sh" "$text" "$voice"
@@ -497,7 +497,7 @@ case "$ACTIVE_PROVIDER" in
497
497
  exec bash "$SCRIPT_DIR/play-tts-termux-ssh.sh" "$TEXT" "$VOICE_OVERRIDE"
498
498
  ;;
499
499
  ssh-remote)
500
- exec bash "$SCRIPT_DIR/play-tts-ssh-remote.sh" "$TEXT" "$VOICE_OVERRIDE"
500
+ exec bash "$SCRIPT_DIR/play-tts-ssh-remote.sh" "$TEXT" "$VOICE_OVERRIDE" "" "${AGENT_PROFILE_FILE:-}"
501
501
  ;;
502
502
  agentvibes-receiver)
503
503
  exec bash "$SCRIPT_DIR/play-tts-agentvibes-receiver-for-voiceless-connections.sh" "$TEXT" "$VOICE_OVERRIDE"
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![Publish](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml/badge.svg)](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
12
12
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
13
13
 
14
- **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.7.3
14
+ **Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.7.5
15
15
 
16
16
  ---
17
17
 
@@ -40,7 +40,19 @@ Whether you're coding in Claude Code, chatting in Claude Desktop, using Warp Ter
40
40
 
41
41
  ---
42
42
 
43
- ## 🌟 NEW IN v5.7.0BMAD v6.6 Support + Windows Auto-Restart Watcher
43
+ ## 🌟 NEW IN v5.7.5TUI Button Contrast + BMAD Routing Fixes
44
+
45
+ **TUI buttons:** All focused/selected buttons now show white text on dark green — grey text on light-blue is gone across all terminals and all tabs.
46
+
47
+ **BMAD tab:** The ♪ voice preview indicator now appears correctly in the voice list, with a 2-second minimum display timer for SSH-remote fire-and-forget mode.
48
+
49
+ **Installer pretext:** Non-interactive installs now derive the pretext from the project folder name (e.g., `"MyProject here"`) instead of always defaulting to `"Claude Code here"`.
50
+
51
+ **BMAD music routing:** Per-agent background music and reverb overrides now correctly reach the SSH receiver.
52
+
53
+ **TERM fix:** The TUI no longer throws a `plab_norm` error when `TERM` is a `screen-*` or `tmux-*` variant.
54
+
55
+ ## v5.7.0 — BMAD v6.6 Support + Windows Auto-Restart Watcher
44
56
 
45
57
  **BMAD v6.6.0:** AgentVibes now detects the new `.claude/skills/*/agents/` agent structure, correctly handles globally-installed BMAD at `~/_bmad`, and gracefully skips v6.6+ plain-Markdown agents during TTS injection instead of erroring. The BMAD tab now shows detection correctly for global installs.
46
58
 
package/RELEASE_NOTES.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # AgentVibes Release Notes
2
2
 
3
+ ## 🖥️ v5.7.5 — TUI Button Contrast + BMAD Routing Fixes
4
+
5
+ **Released:** 2026-05-13
6
+
7
+ ### 🐛 TUI Button Focus: Grey Text Eliminated Across All Terminals
8
+
9
+ Focused and selected buttons in the TUI (voices, music, settings, setup tabs) displayed light grey text on light-blue backgrounds in many terminals. Root cause: `bold: true` combined with a dark foreground triggers terminal "bright mode," rendering the color as grey regardless of shade.
10
+
11
+ **Fix:** All button focus states now use **white text on dark green (`#2e7d32`) background** — the same high-contrast pattern already used by the Agents tab. Explicit `focus`/`blur` handlers were added to setup-tab modal buttons to prevent `attachBtnBlink` from interfering with blessed's passive `style.focus` color application.
12
+
13
+ ### 🐛 BMAD Tab Voice Picker ♪ Indicator Not Showing
14
+
15
+ The ♪ preview indicator in the BMAD tab voice list didn't appear during preview. The Agents tab was missing `_refreshVP()` calls that the Settings tab already had. A 2-second minimum display timer now keeps the indicator visible when SSH-remote exits immediately (fire-and-forget mode).
16
+
17
+ ### 🐛 Non-Interactive Install: Generic Pretext Instead of Project Name
18
+
19
+ Running `agentvibes install` non-interactively always set the pretext to `"Claude Code here"` regardless of project. The installer now derives a project-aware pretext from `path.basename(process.cwd())` with capitalization (e.g., `"MyProject here"`), with a safe fallback for Docker root paths.
20
+
21
+ ### 🐛 Global Pretext Overriding Per-Project Config
22
+
23
+ `seedAllLlmDefaultsSync` was seeding project-level LLM rows with the global pretext string, causing the global `"Claude Code here"` to override per-project `tts-pretext.txt` values. Project-level rows are now seeded with empty pretexts so the per-project file takes precedence.
24
+
25
+ ### 🐛 `screen`/`tmux` TERM Variant Caused `plab_norm` Capability Error
26
+
27
+ When `TERM` was set to a `screen-*` or `tmux-*` variant, blessed threw a `plab_norm` terminal capability error on startup. The app now overrides `TERM` to `xterm-256color` before creating the blessed screen when such a variant is detected.
28
+
29
+ ### 🐛 BMAD Per-Agent Music/Reverb Not Reaching SSH Receiver
30
+
31
+ `play-tts.sh` was not forwarding `AGENT_PROFILE_FILE` to the SSH remote transport, so per-agent background music and reverb overrides in the BMAD tab were silently ignored for remote audio. The profile file path is now passed as argument 4 to `play-tts-ssh-remote.sh`.
32
+
33
+ ### 🐛 Node 18 Compatibility: `import.meta.dirname` Replaced
34
+
35
+ A test file used `import.meta.dirname`, available only in Node 21+. Replaced with the `fileURLToPath(import.meta.url)` pattern so tests run correctly on Node 18 and 20.
36
+
37
+ ---
38
+
3
39
  ## 🎭 v5.7.0 — BMAD v6.6 Support + Windows Auto-Restart Watcher
4
40
 
5
41
  **Released:** 2026-05-11
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": "5.7.3",
4
+ "version": "5.7.5",
5
5
  "description": "Now your AI Agents can finally talk back! Professional TTS voice for Claude Code, Claude Desktop (via MCP), and Clawdbot with multi-provider support.",
6
6
  "homepage": "https://agentvibes.org",
7
7
  "keywords": [
@@ -138,7 +138,14 @@ export class AgentVibesConsole {
138
138
  return;
139
139
  }
140
140
 
141
+ // blessed's terminfo parser chokes on screen-256color's plab_norm capability.
142
+ // xterm-256color is functionally identical for our TUI and parses cleanly.
143
+ const _origTerm = process.env.TERM;
144
+ if (/^(screen|tmux)(-256color)?$/.test(process.env.TERM || '')) {
145
+ process.env.TERM = 'xterm-256color';
146
+ }
141
147
  this.screen = blessed.screen(this._screenOptions);
148
+ if (_origTerm !== undefined) process.env.TERM = _origTerm;
142
149
 
143
150
  // Reflow on terminal resize
144
151
  this.screen.on('resize', () => this.screen.render());
@@ -367,7 +367,7 @@ ${_tl('bmadDesc')}
367
367
  padding: { left: 1, right: 1 },
368
368
  style: {
369
369
  bg: COLORS.btnDefault,
370
- fg: 'white',
370
+ fg: 'bright-white',
371
371
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
372
372
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
373
373
  },
@@ -711,7 +711,7 @@ ${_tl('bmadDesc')}
711
711
  padding: { left: 1, right: 1 },
712
712
  style: {
713
713
  bg: COLORS.btnDefault,
714
- fg: 'white',
714
+ fg: 'bright-white',
715
715
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
716
716
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
717
717
  },
@@ -917,11 +917,13 @@ ${_tl('bmadDesc')}
917
917
  let _allVoices = [];
918
918
  let _previewProc = null;
919
919
  let _previewVoiceId = null;
920
+ let _previewMinTimer = null;
920
921
  let _vpClosed = false;
921
922
 
922
923
  const _spawnEnv = buildAudioEnv();
923
924
 
924
925
  function _killVP() {
926
+ if (_previewMinTimer) { clearTimeout(_previewMinTimer); _previewMinTimer = null; }
925
927
  if (_previewProc) {
926
928
  try {
927
929
  if (process.platform === 'win32') {
@@ -1028,8 +1030,9 @@ ${_tl('bmadDesc')}
1028
1030
  }
1029
1031
 
1030
1032
  function _previewVoice(voiceId) {
1031
- if (_previewVoiceId === voiceId) { _killVP(); vpPreviewLine.setContent(''); screen.render(); return; }
1033
+ if (_previewVoiceId === voiceId) { _killVP(); vpPreviewLine.setContent(''); _refreshVP(); return; }
1032
1034
  _killVP();
1035
+ if (_previewMinTimer) { clearTimeout(_previewMinTimer); _previewMinTimer = null; }
1033
1036
 
1034
1037
  const phrase = SAMPLE_PHRASES[Math.floor(Math.random() * SAMPLE_PHRASES.length)];
1035
1038
  const playTtsScript = path.join(_projectRoot, '.claude', 'hooks', 'play-tts.sh');
@@ -1042,24 +1045,32 @@ ${_tl('bmadDesc')}
1042
1045
  _previewProc = spawn('bash', args, {
1043
1046
  stdio: 'ignore',
1044
1047
  detached: true,
1045
- env: _spawnEnv,
1048
+ env: { ..._spawnEnv, CLAUDE_PROJECT_DIR: _projectRoot },
1046
1049
  cwd: _projectRoot,
1047
1050
  });
1048
1051
  _previewVoiceId = voiceId;
1049
1052
 
1050
1053
  if (!_vpClosed) {
1051
1054
  vpPreviewLine.setContent(`{bright-cyan-fg}♪ Playing: ${voiceId}...{/bright-cyan-fg}`);
1052
- screen.render();
1055
+ _refreshVP();
1053
1056
  }
1054
1057
 
1055
- _previewProc.on('exit', () => {
1058
+ const _clearAfterMinDisplay = () => {
1056
1059
  if (_previewVoiceId === voiceId) {
1057
1060
  _previewVoiceId = null;
1058
1061
  _previewProc = null;
1059
- if (!_vpClosed) { vpPreviewLine.setContent(''); screen.render(); }
1062
+ if (!_vpClosed) { vpPreviewLine.setContent(''); _refreshVP(); }
1060
1063
  }
1064
+ _previewMinTimer = null;
1065
+ };
1066
+
1067
+ // Keep indicator visible for at least 2s (ssh-remote exits immediately)
1068
+ _previewProc.on('exit', () => {
1069
+ _previewMinTimer = setTimeout(_clearAfterMinDisplay, 2000);
1070
+ });
1071
+ _previewProc.on('error', () => {
1072
+ _previewMinTimer = setTimeout(_clearAfterMinDisplay, 2000);
1061
1073
  });
1062
- _previewProc.on('error', () => { _previewProc = null; _previewVoiceId = null; });
1063
1074
  }
1064
1075
 
1065
1076
  vpList.key(['enter'], () => {
@@ -1128,8 +1139,6 @@ ${_tl('bmadDesc')}
1128
1139
  const inputBox = blessed.textbox({
1129
1140
  parent: editModal, top: 3, left: 2, right: 2, height: 3,
1130
1141
  border: { type: 'line' },
1131
- inputOnFocus: true,
1132
- value: draft.pretext,
1133
1142
  style: {
1134
1143
  fg: COLORS.valueFg, bg: '#0d1b35',
1135
1144
  border: { fg: COLORS.borderFg },
@@ -1138,22 +1147,78 @@ ${_tl('bmadDesc')}
1138
1147
  });
1139
1148
 
1140
1149
  let _editClosed = false;
1150
+ let _cursor = draft.pretext.length;
1151
+ inputBox.value = draft.pretext;
1152
+
1153
+ function _renderPretext() {
1154
+ const val = inputBox.value;
1155
+ const lpos = inputBox._getCoords();
1156
+ if (!lpos) { screen.render(); return; }
1157
+ const contentWidth = Math.max(1, (lpos.xl - lpos.xi) - inputBox.iwidth);
1158
+ const start = _cursor > contentWidth - 1 ? _cursor - contentWidth + 1 : 0;
1159
+ inputBox.setContent(val.slice(start));
1160
+ screen.render();
1161
+ screen.program.cup(lpos.yi + inputBox.itop, lpos.xi + inputBox.ileft + (_cursor - start));
1162
+ }
1163
+
1164
+ const _prevGrabKeys = screen.grabKeys;
1141
1165
  function _closeEdit(save) {
1142
1166
  if (_editClosed) return;
1143
1167
  _editClosed = true;
1168
+ inputBox.removeAllListeners('keypress');
1169
+ screen.grabKeys = _prevGrabKeys;
1170
+ screen.program.hideCursor();
1144
1171
  if (save) {
1145
- const raw = inputBox.getValue().trim();
1146
- // M7: enforce max pretext length
1147
- draft.pretext = (raw || draft.pretext).slice(0, MAX_PRETEXT_LENGTH);
1172
+ // M7: enforce max pretext length; allow clearing to empty string
1173
+ draft.pretext = inputBox.value.trim().slice(0, MAX_PRETEXT_LENGTH);
1148
1174
  }
1149
1175
  destroyList(editModal, screen, onDone);
1150
1176
  }
1151
1177
 
1152
- inputBox.key(['enter'], () => _closeEdit(true));
1153
- inputBox.key(['escape'], () => _closeEdit(false));
1178
+ // Guard: if editModal is destroyed externally (parent closed, signal, etc.)
1179
+ // without _closeEdit being called, restore grab state so TUI stays responsive.
1180
+ editModal.once('destroy', () => {
1181
+ if (!_editClosed) {
1182
+ _editClosed = true;
1183
+ inputBox.removeAllListeners('keypress');
1184
+ screen.grabKeys = _prevGrabKeys;
1185
+ screen.program.hideCursor();
1186
+ }
1187
+ });
1154
1188
 
1189
+ screen.grabKeys = true;
1155
1190
  inputBox.focus();
1156
- screen.render();
1191
+ screen.render(); // Layout pass so _getCoords() returns valid coords on first _renderPretext
1192
+ screen.program.showCursor();
1193
+ _renderPretext();
1194
+
1195
+ inputBox.on('keypress', function(ch, key) {
1196
+ if (_editClosed) return;
1197
+ const val = inputBox.value;
1198
+ if (key.name === 'enter') { _closeEdit(true); return; }
1199
+ if (key.name === 'escape') { _closeEdit(false); return; }
1200
+ if (key.name === 'home' || (key.ctrl && key.name === 'a')) {
1201
+ _cursor = 0;
1202
+ } else if (key.name === 'end' || (key.ctrl && key.name === 'e')) {
1203
+ _cursor = val.length;
1204
+ } else if (key.name === 'left') {
1205
+ if (_cursor > 0) _cursor--; else return;
1206
+ } else if (key.name === 'right') {
1207
+ if (_cursor < val.length) _cursor++; else return;
1208
+ } else if (key.name === 'backspace') {
1209
+ if (_cursor > 0) { inputBox.value = val.slice(0, _cursor - 1) + val.slice(_cursor); _cursor--; }
1210
+ else return;
1211
+ } else if (key.name === 'delete') {
1212
+ if (_cursor < val.length) { inputBox.value = val.slice(0, _cursor) + val.slice(_cursor + 1); }
1213
+ else return;
1214
+ } else if (ch && !key.ctrl && !key.meta && !/^[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]$/.test(ch)) {
1215
+ inputBox.value = val.slice(0, _cursor) + ch + val.slice(_cursor);
1216
+ _cursor++;
1217
+ } else {
1218
+ return;
1219
+ }
1220
+ _renderPretext();
1221
+ });
1157
1222
  }
1158
1223
 
1159
1224
  // -------------------------------------------------------------------------
@@ -409,7 +409,7 @@ export function createMusicTab(screen, services) {
409
409
  padding: { left: 1, right: 1 },
410
410
  style: {
411
411
  bg: COLORS.btnDefault,
412
- fg: 'white',
412
+ fg: 'bright-white',
413
413
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
414
414
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
415
415
  },
@@ -423,7 +423,7 @@ export function createMusicTab(screen, services) {
423
423
  });
424
424
  btn.on('blur', () => {
425
425
  btn.style.bg = COLORS.btnDefault;
426
- btn.style.fg = 'white';
426
+ btn.style.fg = 'bright-white';
427
427
  const raw = btn.content.replace(/[►◄]/g, '').trim();
428
428
  btn.setContent(raw);
429
429
  screen.render();
@@ -776,7 +776,7 @@ export function createMusicTab(screen, services) {
776
776
  padding: { left: 1, right: 1 },
777
777
  style: {
778
778
  bg,
779
- fg: 'white',
779
+ fg: 'bright-white',
780
780
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
781
781
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
782
782
  },
@@ -819,7 +819,7 @@ export function createMusicTab(screen, services) {
819
819
  padding: { left: 1, right: 1 },
820
820
  style: {
821
821
  bg: '#e65100',
822
- fg: 'white',
822
+ fg: 'bright-white',
823
823
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
824
824
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
825
825
  },
@@ -583,7 +583,7 @@ export function createSettingsTab(screen, services) {
583
583
  style: {
584
584
  fg: COLORS.labelFg, bg: COLORS.contentBg,
585
585
  border: { fg: 'blue' },
586
- selected: { bg: 'green', fg: 'white', bold: true },
586
+ selected: { bg: 'green', fg: 'black', bold: true },
587
587
  item: { fg: COLORS.labelFg },
588
588
  },
589
589
  });
@@ -78,7 +78,7 @@ const COLORS = {
78
78
  noticeFg: 'white',
79
79
  btnBg: 'blue',
80
80
  btnFg: 'white',
81
- btnFocusBg: 'cyan',
81
+ btnFocusBg: '#2e7d32',
82
82
  removeBg: 'red',
83
83
  removeFocusBg: 'magenta',
84
84
  cfgBg: 'green',
@@ -354,7 +354,7 @@ export function createSetupTab(screen, services) {
354
354
  content: ' Install ', tags: true, mouse: true, keys: true, hidden: true,
355
355
  style: {
356
356
  fg: COLORS.btnFg, bg: COLORS.btnBg,
357
- focus: { fg: 'black', bg: COLORS.btnFocusBg },
357
+ focus: { fg: 'white', bg: COLORS.btnFocusBg },
358
358
  },
359
359
  });
360
360
 
@@ -534,7 +534,7 @@ export function createSetupTab(screen, services) {
534
534
  style: {
535
535
  fg: COLORS.btnFg,
536
536
  bg: COLORS.btnBg,
537
- focus: { fg: 'black', bg: COLORS.btnFocusBg },
537
+ focus: { fg: 'white', bg: COLORS.btnFocusBg },
538
538
  },
539
539
  });
540
540
 
@@ -870,10 +870,12 @@ export function createSetupTab(screen, services) {
870
870
  padding: { left: 1, right: 1 },
871
871
  style: {
872
872
  bg: 'blue', fg: 'white',
873
- focus: { bg: 'cyan', fg: 'black', bold: true },
874
- hover: { bg: 'cyan', fg: 'black', bold: true },
873
+ focus: { bg: '#2e7d32', fg: 'white', bold: true },
874
+ hover: { bg: '#2e7d32', fg: 'white', bold: true },
875
875
  },
876
876
  });
877
+ btn.on('focus', () => { btn.style.bg = '#2e7d32'; btn.style.fg = 'white'; screen.render(); });
878
+ btn.on('blur', () => { btn.style.bg = 'blue'; btn.style.fg = 'white'; screen.render(); });
877
879
  btn.key(['enter', 'space'], () => onClick());
878
880
  btn.on('click', () => onClick());
879
881
  return btn;
@@ -1115,7 +1117,7 @@ export function createSetupTab(screen, services) {
1115
1117
  style: {
1116
1118
  fg: COLORS.labelFg, bg: COLORS.contentBg,
1117
1119
  border: { fg: 'cyan' },
1118
- selected: { bg: 'blue', fg: 'white', bold: true },
1120
+ selected: { bg: 'blue', fg: 'black', bold: true },
1119
1121
  },
1120
1122
  });
1121
1123
  picker.setFront();
@@ -1154,7 +1156,7 @@ export function createSetupTab(screen, services) {
1154
1156
  style: {
1155
1157
  fg: COLORS.labelFg, bg: COLORS.contentBg,
1156
1158
  border: { fg: 'cyan' },
1157
- selected: { bg: 'blue', fg: 'white', bold: true },
1159
+ selected: { bg: 'blue', fg: 'black', bold: true },
1158
1160
  },
1159
1161
  });
1160
1162
  picker.setFront();
@@ -1268,7 +1270,7 @@ export function createSetupTab(screen, services) {
1268
1270
  style: {
1269
1271
  fg: COLORS.labelFg, bg: COLORS.contentBg,
1270
1272
  border: { fg: 'cyan' },
1271
- selected: { bg: 'blue', fg: 'white', bold: true },
1273
+ selected: { bg: 'blue', fg: 'black', bold: true },
1272
1274
  },
1273
1275
  });
1274
1276
  picker.setFront();
@@ -1326,7 +1328,7 @@ export function createSetupTab(screen, services) {
1326
1328
  style: {
1327
1329
  fg: COLORS.labelFg, bg: COLORS.contentBg,
1328
1330
  border: { fg: 'cyan' },
1329
- selected: { bg: 'blue', fg: 'white', bold: true },
1331
+ selected: { bg: 'blue', fg: 'black', bold: true },
1330
1332
  },
1331
1333
  });
1332
1334
  picker.setFront();
@@ -1364,7 +1366,7 @@ export function createSetupTab(screen, services) {
1364
1366
  style: {
1365
1367
  fg: COLORS.labelFg, bg: COLORS.contentBg,
1366
1368
  border: { fg: 'cyan' },
1367
- selected: { bg: 'blue', fg: 'white', bold: true },
1369
+ selected: { bg: 'blue', fg: 'black', bold: true },
1368
1370
  },
1369
1371
  });
1370
1372
  picker.setFront();
@@ -1400,7 +1402,7 @@ export function createSetupTab(screen, services) {
1400
1402
  style: {
1401
1403
  fg: COLORS.labelFg, bg: COLORS.contentBg,
1402
1404
  border: { fg: 'cyan' },
1403
- selected: { bg: 'blue', fg: 'white', bold: true },
1405
+ selected: { bg: 'blue', fg: 'black', bold: true },
1404
1406
  },
1405
1407
  });
1406
1408
  picker.setFront();
@@ -1501,10 +1503,12 @@ export function createSetupTab(screen, services) {
1501
1503
  padding: { left: 1, right: 1 },
1502
1504
  style: {
1503
1505
  bg: 'blue', fg: 'white',
1504
- focus: { bg: 'cyan', fg: 'black', bold: true },
1505
- hover: { bg: 'cyan', fg: 'black', bold: true },
1506
+ focus: { bg: '#2e7d32', fg: 'white', bold: true },
1507
+ hover: { bg: '#2e7d32', fg: 'white', bold: true },
1506
1508
  },
1507
1509
  });
1510
+ btn.on('focus', () => { btn.style.bg = '#2e7d32'; btn.style.fg = 'white'; screen.render(); });
1511
+ btn.on('blur', () => { btn.style.bg = 'blue'; btn.style.fg = 'white'; screen.render(); });
1508
1512
  btn.key(['enter', 'space'], () => onClick());
1509
1513
  btn.on('click', () => onClick());
1510
1514
  return btn;
@@ -1618,11 +1622,15 @@ export function createSetupTab(screen, services) {
1618
1622
  let _closed = false;
1619
1623
  navigationService?.openModal(null, _closeModal);
1620
1624
 
1625
+ const _folderName = path.basename(targetDir);
1626
+ const _folderPretext = _folderName
1627
+ ? _folderName.charAt(0).toUpperCase() + _folderName.slice(1) + ' here'
1628
+ : '';
1621
1629
  const defaultPretext = {
1622
- 'claude-code': 'Claude Code here',
1623
- 'copilot': 'Copilot here',
1624
- 'codex': 'Codex here',
1625
- 'default': path.basename(targetDir), // default to project folder name
1630
+ 'claude-code': _folderPretext,
1631
+ 'copilot': _folderPretext,
1632
+ 'codex': _folderPretext,
1633
+ 'default': _folderPretext,
1626
1634
  };
1627
1635
 
1628
1636
  // Read global defaults for display
@@ -1747,10 +1755,12 @@ export function createSetupTab(screen, services) {
1747
1755
  style: {
1748
1756
  bg: 'blue',
1749
1757
  fg: 'white',
1750
- focus: { bg: 'cyan', fg: 'black', bold: true },
1751
- hover: { bg: 'cyan', fg: 'black', bold: true },
1758
+ focus: { bg: '#2e7d32', fg: 'white', bold: true },
1759
+ hover: { bg: '#2e7d32', fg: 'white', bold: true },
1752
1760
  },
1753
1761
  });
1762
+ btn.on('focus', () => { btn.style.bg = '#2e7d32'; btn.style.fg = 'white'; screen.render(); });
1763
+ btn.on('blur', () => { btn.style.bg = 'blue'; btn.style.fg = 'white'; screen.render(); });
1754
1764
  btn.key(['enter', 'space'], () => onClick());
1755
1765
  btn.on('click', () => onClick());
1756
1766
  return btn;
@@ -2112,6 +2122,17 @@ export function createSetupTab(screen, services) {
2112
2122
  const _spawnEnv = buildAudioEnv();
2113
2123
  const _isWin = process.platform === 'win32' && !process.env.WSL_DISTRO_NAME;
2114
2124
 
2125
+ // Check if this LLM has mode=remote in transport-config.json so voice previews
2126
+ // are routed to the remote receiver even when the global provider is piper/local.
2127
+ let _llmIsRemote = false;
2128
+ if (llmKey) {
2129
+ try {
2130
+ const _tcPath = path.join(os.homedir(), '.agentvibes', 'transport-config.json');
2131
+ const _tc = JSON.parse(fs.readFileSync(_tcPath, 'utf8'));
2132
+ _llmIsRemote = _tc[llmKey]?.mode === 'remote';
2133
+ } catch {}
2134
+ }
2135
+
2115
2136
  function _killVP() {
2116
2137
  if (_previewProc) {
2117
2138
  try {
@@ -2161,7 +2182,7 @@ export function createSetupTab(screen, services) {
2161
2182
  style: {
2162
2183
  fg: COLORS.labelFg, bg: COLORS.contentBg,
2163
2184
  border: { fg: 'blue' },
2164
- selected: { bg: 'green', fg: 'white', bold: true },
2185
+ selected: { bg: 'green', fg: 'black', bold: true },
2165
2186
  item: { fg: COLORS.labelFg },
2166
2187
  },
2167
2188
  });
@@ -2239,7 +2260,7 @@ export function createSetupTab(screen, services) {
2239
2260
  }
2240
2261
  } catch {}
2241
2262
 
2242
- if (_remoteProviders.includes(_activeProvider)) {
2263
+ if (_remoteProviders.includes(_activeProvider) || _llmIsRemote) {
2243
2264
  const _playTtsName = _isWin
2244
2265
  ? path.join('.claude', 'hooks-windows', 'play-tts.ps1')
2245
2266
  : path.join('.claude', 'hooks', 'play-tts.sh');
@@ -2420,8 +2441,6 @@ export function createSetupTab(screen, services) {
2420
2441
  const inputBox = blessed.textbox({
2421
2442
  parent: editModal, top: 3, left: 2, right: 2, height: 3,
2422
2443
  border: { type: 'line' },
2423
- inputOnFocus: true,
2424
- value: draft.pretext,
2425
2444
  style: {
2426
2445
  fg: 'white', bg: 'black',
2427
2446
  border: { fg: 'blue' },
@@ -2429,21 +2448,79 @@ export function createSetupTab(screen, services) {
2429
2448
  },
2430
2449
  });
2431
2450
 
2451
+ let _editClosed = false;
2452
+ let _cursor = (draft.pretext || '').length;
2453
+ inputBox.value = draft.pretext || '';
2454
+
2455
+ function _renderPretext() {
2456
+ const val = inputBox.value;
2457
+ const lpos = inputBox._getCoords();
2458
+ if (!lpos) { screen.render(); return; }
2459
+ const contentWidth = Math.max(1, (lpos.xl - lpos.xi) - inputBox.iwidth);
2460
+ const start = _cursor > contentWidth - 1 ? _cursor - contentWidth + 1 : 0;
2461
+ inputBox.setContent(val.slice(start));
2462
+ screen.render();
2463
+ screen.program.cup(lpos.yi + inputBox.itop, lpos.xi + inputBox.ileft + (_cursor - start));
2464
+ }
2465
+
2466
+ const _prevGrabKeys = screen.grabKeys;
2432
2467
  function _closeEdit(save) {
2468
+ if (_editClosed) return;
2469
+ _editClosed = true;
2470
+ inputBox.removeAllListeners('keypress');
2471
+ screen.grabKeys = _prevGrabKeys;
2472
+ screen.program.hideCursor();
2433
2473
  if (save) {
2434
- const val = (inputBox.getValue() || '').trim().slice(0, 200);
2435
- draft.pretext = val;
2474
+ draft.pretext = (inputBox.value || '').trim().slice(0, 200);
2436
2475
  }
2437
2476
  destroyList(editModal, screen);
2438
2477
  onDone();
2439
2478
  }
2440
2479
 
2441
- inputBox.key(['enter'], () => _closeEdit(true));
2442
- inputBox.key(['escape'], () => _closeEdit(false));
2480
+ // Guard: if editModal is destroyed externally without _closeEdit being called,
2481
+ // restore grab state so TUI stays responsive.
2482
+ editModal.once('destroy', () => {
2483
+ if (!_editClosed) {
2484
+ _editClosed = true;
2485
+ inputBox.removeAllListeners('keypress');
2486
+ screen.grabKeys = _prevGrabKeys;
2487
+ screen.program.hideCursor();
2488
+ }
2489
+ });
2443
2490
 
2491
+ screen.grabKeys = true;
2444
2492
  inputBox.focus();
2445
- inputBox.readInput(() => {});
2446
- screen.render();
2493
+ screen.render(); // Layout pass so _getCoords() returns valid coords on first _renderPretext
2494
+ screen.program.showCursor();
2495
+ _renderPretext();
2496
+
2497
+ inputBox.on('keypress', function(ch, key) {
2498
+ if (_editClosed) return;
2499
+ const val = inputBox.value;
2500
+ if (key.name === 'enter') { _closeEdit(true); return; }
2501
+ if (key.name === 'escape') { _closeEdit(false); return; }
2502
+ if (key.name === 'home' || (key.ctrl && key.name === 'a')) {
2503
+ _cursor = 0;
2504
+ } else if (key.name === 'end' || (key.ctrl && key.name === 'e')) {
2505
+ _cursor = val.length;
2506
+ } else if (key.name === 'left') {
2507
+ if (_cursor > 0) _cursor--; else return;
2508
+ } else if (key.name === 'right') {
2509
+ if (_cursor < val.length) _cursor++; else return;
2510
+ } else if (key.name === 'backspace') {
2511
+ if (_cursor > 0) { inputBox.value = val.slice(0, _cursor - 1) + val.slice(_cursor); _cursor--; }
2512
+ else return;
2513
+ } else if (key.name === 'delete') {
2514
+ if (_cursor < val.length) { inputBox.value = val.slice(0, _cursor) + val.slice(_cursor + 1); }
2515
+ else return;
2516
+ } else if (ch && !key.ctrl && !key.meta && !/^[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]$/.test(ch)) {
2517
+ inputBox.value = val.slice(0, _cursor) + ch + val.slice(_cursor);
2518
+ _cursor++;
2519
+ } else {
2520
+ return;
2521
+ }
2522
+ _renderPretext();
2523
+ });
2447
2524
  }
2448
2525
 
2449
2526
  // ── Saved toast ───────────────────────────────────────────────────────────
@@ -1122,7 +1122,7 @@ export function createVoicesTab(screen, services) {
1122
1122
  padding: { left: 1, right: 1 },
1123
1123
  style: {
1124
1124
  bg: COLORS.btnDefault,
1125
- fg: 'white',
1125
+ fg: 'bright-white',
1126
1126
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
1127
1127
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
1128
1128
  },
@@ -1136,7 +1136,7 @@ export function createVoicesTab(screen, services) {
1136
1136
  });
1137
1137
  btn.on('blur', () => {
1138
1138
  btn.style.bg = COLORS.btnDefault;
1139
- btn.style.fg = 'white';
1139
+ btn.style.fg = 'bright-white';
1140
1140
  const raw = btn.content.replace(/[►◄]/g, '').trim();
1141
1141
  btn.setContent(raw);
1142
1142
  screen.render();
@@ -1306,7 +1306,7 @@ export function createVoicesTab(screen, services) {
1306
1306
  padding: { left: 1, right: 1 },
1307
1307
  style: {
1308
1308
  bg,
1309
- fg: 'white',
1309
+ fg: 'bright-white',
1310
1310
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
1311
1311
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
1312
1312
  },
@@ -1341,7 +1341,7 @@ export function createVoicesTab(screen, services) {
1341
1341
  padding: { left: 1, right: 1 },
1342
1342
  style: {
1343
1343
  bg: '#e65100',
1344
- fg: 'white',
1344
+ fg: 'bright-white',
1345
1345
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
1346
1346
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
1347
1347
  },
@@ -1550,7 +1550,7 @@ export function createVoicesTab(screen, services) {
1550
1550
  padding: { left: 1, right: 1 },
1551
1551
  style: {
1552
1552
  bg,
1553
- fg: 'white',
1553
+ fg: 'bright-white',
1554
1554
  focus: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
1555
1555
  hover: { bg: COLORS.btnFocus, fg: COLORS.btnFocusFg, bold: true },
1556
1556
  },
package/src/installer.js CHANGED
@@ -74,6 +74,7 @@ import { promptForCustomMusic } from './installer/music-file-input.js';
74
74
  import { createPreviewListPrompt } from './utils/preview-list-prompt.js';
75
75
  import { selectLanguage } from './installer/language-screen.js';
76
76
  import { t } from './i18n/strings.js';
77
+ import { seedAllLlmDefaultsSync } from './services/llm-provider-service.js';
77
78
 
78
79
  const __filename = fileURLToPath(import.meta.url);
79
80
  const __dirname = path.dirname(__filename);
@@ -1248,12 +1249,20 @@ async function collectConfiguration(options = {}) {
1248
1249
  config.provider = process.platform === 'darwin' ? 'macos' : 'piper';
1249
1250
  config.defaultVoice = process.platform === 'darwin' ? 'Samantha' : 'en_US-ryan-high';
1250
1251
  }
1251
- const homeDir = process.env.HOME || process.env.USERPROFILE;
1252
+ const homeDir = process.env.HOME || process.env.USERPROFILE || os.homedir();
1252
1253
  config.piperPath = path.join(homeDir, '.claude', 'piper-voices');
1253
1254
  // AI agent / non-interactive defaults: no reverb, no background music, no hermes
1254
1255
  config.reverb = 'none';
1255
1256
  config.backgroundMusic = { enabled: false, track: 'agentvibes_soft_flamenco_loop.mp3' };
1256
1257
  config.hermes = { enabled: false };
1258
+ // Use folder name as project identity when no existing pretext is set
1259
+ if (!config.pretext) {
1260
+ const folderName = path.basename(process.cwd());
1261
+ // Guard empty basename (e.g. process.cwd() === '/' in some Docker containers)
1262
+ if (folderName) {
1263
+ config.pretext = folderName.charAt(0).toUpperCase() + folderName.slice(1) + ' here';
1264
+ }
1265
+ }
1257
1266
  return config;
1258
1267
  }
1259
1268
 
@@ -5761,6 +5770,11 @@ Troubleshooting:
5761
5770
  }
5762
5771
  // Do NOT unlink tts-pretext.txt when blank — user may have set it via MCP or manually.
5763
5772
 
5773
+ // Seed project-level llm: rows with empty pretext so global ~/.claude/config/audio-effects.cfg
5774
+ // "Claude Code here" rows don't override tts-pretext.txt (play-tts.sh stops searching when it
5775
+ // finds a row with a voice, then falls through to tts-pretext.txt for the pretext).
5776
+ seedAllLlmDefaultsSync(targetDir);
5777
+
5764
5778
  // Apply reverb setting
5765
5779
  const selectedReverb = userConfig.reverb;
5766
5780
  if (selectedReverb && selectedReverb !== 'off') {
@@ -59,7 +59,7 @@ const DEFAULT_LLM_CONFIGS = {
59
59
  bgTrack: 'agent_vibes_chillwave_v2_loop.mp3',
60
60
  bgVolume: '0.15',
61
61
  voice: 'en_US-lessac-high',
62
- pretext: 'Claude Code here',
62
+ pretext: '',
63
63
  ttsEngine: 'piper',
64
64
  },
65
65
  copilot: {
@@ -67,7 +67,7 @@ const DEFAULT_LLM_CONFIGS = {
67
67
  bgTrack: 'agent_vibes_bossa_nova_v2_loop.mp3',
68
68
  bgVolume: '0.15',
69
69
  voice: 'en_US-libritts-high::Anna-11',
70
- pretext: 'Copilot here',
70
+ pretext: '',
71
71
  ttsEngine: 'piper',
72
72
  },
73
73
  codex: {
@@ -78,7 +78,7 @@ const DEFAULT_LLM_CONFIGS = {
78
78
  // Windows Piper installs (loads the model, exits with no output).
79
79
  // lessac-high works reliably, so use it as the default for codex.
80
80
  voice: 'en_US-lessac-high',
81
- pretext: 'Codex here',
81
+ pretext: '',
82
82
  ttsEngine: 'piper',
83
83
  },
84
84
  hermes: {
@@ -86,7 +86,7 @@ const DEFAULT_LLM_CONFIGS = {
86
86
  bgTrack: 'agent_vibes_bachata_v1_loop.mp3',
87
87
  bgVolume: '0.15',
88
88
  voice: 'en_US-libritts-high::Leo-8',
89
- pretext: 'Hermes here',
89
+ pretext: '',
90
90
  ttsEngine: 'piper',
91
91
  },
92
92
  };