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.
- package/.agentvibes/install-manifest.json +438 -0
- package/.claude/github-star-reminder.txt +1 -1
- package/.claude/hooks/play-tts-ssh-remote.sh +14 -0
- package/.claude/hooks/play-tts.sh +2 -2
- package/README.md +14 -2
- package/RELEASE_NOTES.md +36 -0
- package/package.json +1 -1
- package/src/console/app.js +7 -0
- package/src/console/tabs/agents-tab.js +81 -16
- package/src/console/tabs/music-tab.js +4 -4
- package/src/console/tabs/settings-tab.js +1 -1
- package/src/console/tabs/setup-tab.js +106 -29
- package/src/console/tabs/voices-tab.js +5 -5
- package/src/installer.js +15 -1
- package/src/services/llm-provider-service.js +4 -4
|
@@ -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
|
-
|
|
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
|
[](https://github.com/paulpreibisch/AgentVibes/actions/workflows/publish.yml)
|
|
12
12
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
13
13
|
|
|
14
|
-
**Author**: Paul Preibisch ([@997Fire](https://x.com/997Fire)) | **Version**: v5.7.
|
|
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.
|
|
43
|
+
## 🌟 NEW IN v5.7.5 — TUI 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.
|
|
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": [
|
package/src/console/app.js
CHANGED
|
@@ -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('');
|
|
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
|
-
|
|
1055
|
+
_refreshVP();
|
|
1053
1056
|
}
|
|
1054
1057
|
|
|
1055
|
-
|
|
1058
|
+
const _clearAfterMinDisplay = () => {
|
|
1056
1059
|
if (_previewVoiceId === voiceId) {
|
|
1057
1060
|
_previewVoiceId = null;
|
|
1058
1061
|
_previewProc = null;
|
|
1059
|
-
if (!_vpClosed) { vpPreviewLine.setContent('');
|
|
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
|
-
|
|
1146
|
-
|
|
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
|
-
|
|
1153
|
-
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
874
|
-
hover: { bg: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
1505
|
-
hover: { bg: '
|
|
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':
|
|
1623
|
-
'copilot':
|
|
1624
|
-
'codex':
|
|
1625
|
-
'default':
|
|
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: '
|
|
1751
|
-
hover: { bg: '
|
|
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: '
|
|
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
|
-
|
|
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
|
-
|
|
2442
|
-
|
|
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
|
-
|
|
2446
|
-
screen.
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
89
|
+
pretext: '',
|
|
90
90
|
ttsEngine: 'piper',
|
|
91
91
|
},
|
|
92
92
|
};
|