@lucas_zaia/agent-voice 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +314 -103
- package/package.json +32 -8
package/README.md
CHANGED
|
@@ -1,132 +1,256 @@
|
|
|
1
1
|
# agent-voice
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@lucas_zaia/agent-voice)
|
|
4
|
+
[](https://github.com/LucasZaia/agent-voice/actions/workflows/test.yml)
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
3
8
|
**Make your coding agent talk to you.** When Claude Code or Codex finishes a
|
|
4
|
-
long task
|
|
5
|
-
loud:
|
|
9
|
+
long task, or stops to wait for your permission, a speaker says so out loud:
|
|
6
10
|
|
|
7
|
-
> *"Claude Code terminou na sessão Home assistant repo, depois de cerca de 4
|
|
11
|
+
> 🔊 *"Claude Code terminou na sessão Home assistant repo, depois de cerca de 4
|
|
8
12
|
> minutos. Você tinha pedido: criar o docker compose."*
|
|
13
|
+
>
|
|
14
|
+
> 🔊 *"Codex precisa de você na sessão azul, do projeto api, para usar o Bash."*
|
|
15
|
+
|
|
16
|
+
It works on macOS, Windows and Linux. It can speak through an Amazon Echo (via
|
|
17
|
+
Home Assistant), your computer's own voice, or any command you choose. It has
|
|
18
|
+
no dependencies and needs only Node.js.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Contents
|
|
9
23
|
|
|
10
|
-
|
|
24
|
+
- [Quick start](#quick-start)
|
|
25
|
+
- [Why](#why)
|
|
26
|
+
- [When it speaks](#when-it-speaks)
|
|
27
|
+
- [Speakers](#speakers): [Echo / Alexa](#echo--alexa-via-home-assistant) · [Computer voice](#your-computers-voice) · [Any command](#any-command)
|
|
28
|
+
- [Agents](#agents)
|
|
29
|
+
- [Tuning](#tuning)
|
|
30
|
+
- [Changing what it says](#changing-what-it-says)
|
|
31
|
+
- [Commands](#commands)
|
|
32
|
+
- [Windows notes](#windows-notes)
|
|
33
|
+
- [Troubleshooting](#troubleshooting)
|
|
34
|
+
- [How it works](#how-it-works)
|
|
35
|
+
- [Development](#development)
|
|
11
36
|
|
|
12
|
-
|
|
13
|
-
your computer's own voice, or any command you like.
|
|
37
|
+
---
|
|
14
38
|
|
|
15
|
-
##
|
|
39
|
+
## Quick start
|
|
16
40
|
|
|
17
|
-
|
|
41
|
+
You need Node.js 20 or newer.
|
|
18
42
|
|
|
19
43
|
```bash
|
|
20
44
|
npm install -g @lucas_zaia/agent-voice
|
|
21
45
|
agent-voice setup
|
|
22
46
|
```
|
|
23
47
|
|
|
24
|
-
`setup`
|
|
25
|
-
adds, and backing up the file first), asks how you want it to speak, and says a
|
|
26
|
-
test sentence so you know it works.
|
|
48
|
+
`setup` takes about a minute:
|
|
27
49
|
|
|
28
|
-
**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
50
|
+
1. **Finds your agents** (Claude Code, Codex) and shows the exact hooks it will
|
|
51
|
+
add. The config file is backed up before anything is written.
|
|
52
|
+
2. **Asks how to speak**: Echo, your computer's voice, or a command.
|
|
53
|
+
3. **Speaks a test sentence** and asks whether you heard it. If you didn't, it
|
|
54
|
+
removes that speaker and lets you try another.
|
|
33
55
|
|
|
34
|
-
|
|
35
|
-
`agent-voice` is on your PATH), or tell the hooks how to call it before
|
|
36
|
-
connecting:
|
|
56
|
+
To check everything afterwards:
|
|
37
57
|
|
|
38
58
|
```bash
|
|
39
|
-
|
|
59
|
+
agent-voice status
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Agents
|
|
64
|
+
claude-code connected
|
|
65
|
+
codex not installed
|
|
66
|
+
Outputs (* = enabled)
|
|
67
|
+
* echo alexa notify.echo_dot_announce @ http://localhost:8123
|
|
68
|
+
Settings
|
|
69
|
+
minSeconds=30
|
|
70
|
+
cooldownSeconds=120
|
|
71
|
+
maxSpeechChars=90
|
|
72
|
+
Log (~/.local/state/agent-voice/events.log)
|
|
73
|
+
2026-09-25 16:05:23 claude-code 04c02385 spoke via echo: Claude Code terminou na sessão…
|
|
74
|
+
2026-09-25 16:07:41 claude-code 04c02385 silent (turn 12s < 30s)
|
|
40
75
|
```
|
|
41
76
|
|
|
42
|
-
|
|
43
|
-
|
|
77
|
+
> On Windows, see [Windows notes](#windows-notes) if PowerShell refuses to run `npm`.
|
|
78
|
+
|
|
79
|
+
---
|
|
44
80
|
|
|
45
81
|
## Why
|
|
46
82
|
|
|
47
|
-
You
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
83
|
+
You give an agent something that takes a while and stop watching it. Then one
|
|
84
|
+
of two things happens: the work finishes and waits for you to notice, or, worse,
|
|
85
|
+
the agent stopped at a permission prompt thirty seconds in. A popup shows up in
|
|
86
|
+
the window you are no longer looking at. A voice reaches you anyway.
|
|
87
|
+
|
|
88
|
+
agent-voice follows two rules:
|
|
51
89
|
|
|
52
|
-
- **Say something specific**: which session,
|
|
53
|
-
|
|
90
|
+
- **Say something specific**: which session it is, how long it took, and what
|
|
91
|
+
you had asked for.
|
|
92
|
+
- **Stay quiet most of the time**: short turns are never announced. A notifier
|
|
93
|
+
that talks after every reply gets muted on day one.
|
|
94
|
+
|
|
95
|
+
---
|
|
54
96
|
|
|
55
97
|
## When it speaks
|
|
56
98
|
|
|
57
99
|
| Situation | What happens |
|
|
58
100
|
|---|---|
|
|
59
|
-
| A turn finishes in under 30s | Silent |
|
|
60
|
-
| A turn finishes in over 30s | **Speaks**, with how long it took and what you asked |
|
|
101
|
+
| A turn finishes in **under 30s** | Silent |
|
|
102
|
+
| A turn finishes in **over 30s** | **Speaks**, with how long it took and what you asked |
|
|
61
103
|
| Background work finishes (a subagent, a task) | **Speaks**, at most once every 120s per session |
|
|
62
104
|
| Background work with nothing to report | Silent |
|
|
63
|
-
| The agent needs your permission or input | **Always speaks
|
|
64
|
-
|
|
65
|
-
Every decision, including every silence, goes to the log with its reason —
|
|
66
|
-
`agent-voice status` shows the latest lines.
|
|
105
|
+
| The agent **needs your permission or input** | **Always speaks**, even inside the cooldown |
|
|
67
106
|
|
|
68
|
-
|
|
107
|
+
Every decision, including every silence, is written to the log with its reason:
|
|
69
108
|
|
|
70
109
|
```
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
agent-voice output add <alexa|local|command> [name]
|
|
75
|
-
agent-voice output list | remove | enable | disable | test [name]
|
|
76
|
-
agent-voice wrap [--name <label>] -- <command...>
|
|
77
|
-
agent-voice status
|
|
78
|
-
agent-voice config get [key] | set <key> <value> | reset <key>
|
|
79
|
-
agent-voice test
|
|
110
|
+
16:05:23 claude-code notif1 spoke via echo: Claude Code precisa de você na sessão verde.
|
|
111
|
+
15:57:38 claude-code a891ee silent (turn 21s < 30s)
|
|
112
|
+
15:46:12 claude-code 04c023 silent (background_done with no content)
|
|
80
113
|
```
|
|
81
114
|
|
|
115
|
+
When a session has no name, it gets a color ("na sessão azul, do projeto api").
|
|
116
|
+
Colors are easy to tell apart by ear, which random ids are not.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
82
120
|
## Speakers
|
|
83
121
|
|
|
84
|
-
|
|
122
|
+
A speaker (an *output*) is added with `agent-voice output add <type> [name]`.
|
|
123
|
+
You can have several; every enabled one speaks, and each gets at most 15
|
|
124
|
+
seconds.
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
agent-voice output list # * marks the enabled ones
|
|
128
|
+
agent-voice output test [name] # speak the test sentence
|
|
129
|
+
agent-voice output disable <name> # keep it, but stop using it
|
|
130
|
+
agent-voice output remove <name>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Echo / Alexa (via Home Assistant)
|
|
134
|
+
|
|
135
|
+
You need:
|
|
136
|
+
|
|
137
|
+
1. **Home Assistant**, reachable from this machine (e.g. `http://localhost:8123`).
|
|
138
|
+
2. The **[Alexa Media Player](https://github.com/alandtse/alexa_media_player)**
|
|
139
|
+
integration, which creates `notify.<device>_speak` and
|
|
140
|
+
`notify.<device>_announce` entities for each Echo.
|
|
141
|
+
3. A **long-lived access token**: Home Assistant → your profile → *Security* →
|
|
142
|
+
*Long-lived access tokens* → *Create token*.
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
agent-voice output add alexa
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
It asks for the URL and the token, checks the token right away, lists your
|
|
149
|
+
`notify.*` devices (with `_announce` first; those play a chime before speaking),
|
|
150
|
+
and says the test sentence. The token is stored only in your config directory,
|
|
151
|
+
with permissions `600`.
|
|
152
|
+
|
|
153
|
+
### Your computer's voice
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
agent-voice output add local
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
| OS | Engine | Needs |
|
|
85
160
|
|---|---|---|
|
|
86
|
-
|
|
|
87
|
-
|
|
|
88
|
-
|
|
|
161
|
+
| macOS | `say` | nothing |
|
|
162
|
+
| Windows | SAPI (via PowerShell) | nothing |
|
|
163
|
+
| Linux | `spd-say`, `espeak-ng` or `espeak` | `sudo apt install espeak-ng` |
|
|
164
|
+
|
|
165
|
+
A Brazilian Portuguese voice is selected automatically when one is installed.
|
|
89
166
|
|
|
90
|
-
|
|
91
|
-
|
|
167
|
+
### Any command
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
agent-voice output add command
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Enter the command line. `{text}` is replaced by the sentence; if there is no
|
|
174
|
+
`{text}`, the sentence is sent on stdin. Some examples:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
~/bin/falar.sh -a {text} # your own script
|
|
178
|
+
curl -s -d {text} ntfy.sh/my-agent-topic # phone push notification
|
|
179
|
+
notify-send agent-voice {text} # desktop notification
|
|
180
|
+
```
|
|
92
181
|
|
|
93
|
-
|
|
94
|
-
leading `~`, `$HOME` or `%USERPROFILE%`
|
|
95
|
-
`.cmd`/`.bat`
|
|
96
|
-
escaped, so the sentence can never run anything
|
|
97
|
-
|
|
182
|
+
The command never goes through a shell. Arguments are passed exactly as typed,
|
|
183
|
+
and a leading `~`, `$HOME` or `%USERPROFILE%` is expanded to your home
|
|
184
|
+
directory. On Windows, `.cmd`/`.bat` speakers go through `cmd.exe` with every
|
|
185
|
+
argument quoted and escaped, so the sentence can never run anything.
|
|
186
|
+
|
|
187
|
+
---
|
|
98
188
|
|
|
99
189
|
## Agents
|
|
100
190
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
191
|
+
| Agent | Hooks live in | Notes |
|
|
192
|
+
|---|---|---|
|
|
193
|
+
| **Claude Code** | `~/.claude/settings.json` | After connecting, open `/hooks` once so a running session reloads its config. |
|
|
194
|
+
| **Codex CLI** | `~/.codex/hooks.json` | Codex only runs hooks you have trusted: open Codex and run `/hooks` once after connecting. |
|
|
195
|
+
| **Anything else** | none | Use `agent-voice wrap`, below. |
|
|
106
196
|
|
|
107
|
-
|
|
197
|
+
```bash
|
|
198
|
+
agent-voice connect claude-code # asks first; --yes to skip the question
|
|
199
|
+
agent-voice disconnect claude-code # removes only agent-voice's hooks
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`connect` never changes hooks it did not add. Running it again changes
|
|
203
|
+
nothing, and it always backs up the file first (`settings.json.bak-<date>`).
|
|
204
|
+
|
|
205
|
+
**Any other CLI** (Aider, a long build, a test suite) can use `wrap`. It speaks
|
|
206
|
+
when the command finishes, if it ran longer than the threshold:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
agent-voice wrap -- aider --message "refactor the parser"
|
|
210
|
+
agent-voice wrap --name "build" -- npm run build
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
The exit code of the wrapped command is passed through. `wrap` cannot announce
|
|
214
|
+
"needs you", because it cannot see inside the program.
|
|
215
|
+
|
|
216
|
+
To support a new agent natively, see [`docs/adapters.md`](docs/adapters.md).
|
|
217
|
+
|
|
218
|
+
---
|
|
108
219
|
|
|
109
220
|
## Tuning
|
|
110
221
|
|
|
111
|
-
Tune against your own log. If most of your turns
|
|
112
|
-
will
|
|
222
|
+
Tune the thresholds against your own log. If most of your turns take less
|
|
223
|
+
time than the threshold, it will seem broken, because it will simply never
|
|
224
|
+
speak.
|
|
113
225
|
|
|
114
226
|
```bash
|
|
227
|
+
agent-voice config get # everything, including the phrases
|
|
115
228
|
agent-voice config set minSeconds 20
|
|
116
229
|
agent-voice config set cooldownSeconds 300
|
|
230
|
+
agent-voice config reset minSeconds # back to the default
|
|
117
231
|
```
|
|
118
232
|
|
|
119
|
-
| Key | Default | Env override |
|
|
120
|
-
|
|
121
|
-
| `minSeconds` | 30 | `AV_MIN_SECONDS` |
|
|
122
|
-
| `cooldownSeconds` | 120 | `AV_COOLDOWN_SECONDS` |
|
|
123
|
-
| `maxSpeechChars` | 90 | `AV_MAX_SPEECH_CHARS` |
|
|
233
|
+
| Key | Default | Meaning | Env override |
|
|
234
|
+
|---|---|---|---|
|
|
235
|
+
| `minSeconds` | 30 | A shorter turn is not announced | `AV_MIN_SECONDS` |
|
|
236
|
+
| `cooldownSeconds` | 120 | Minimum gap between background announcements, per session | `AV_COOLDOWN_SECONDS` |
|
|
237
|
+
| `maxSpeechChars` | 90 | How much of your request is quoted back | `AV_MAX_SPEECH_CHARS` |
|
|
238
|
+
|
|
239
|
+
---
|
|
124
240
|
|
|
125
241
|
## Changing what it says
|
|
126
242
|
|
|
127
|
-
Each sentence is a template you can
|
|
128
|
-
|
|
129
|
-
|
|
243
|
+
Each sentence is a template you can rewrite:
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
agent-voice config set phrases.taskDone "{agent} acabou {where}, levou {duration}.[ Pedido: {request}.]"
|
|
247
|
+
agent-voice config set phrases.needsInput "Ei! {agent} precisa de você {where}{notice}."
|
|
248
|
+
agent-voice config reset phrases.taskDone # back to the default
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
`{name}` is a variable. A `[section]` is spoken only when every variable inside
|
|
252
|
+
it has a value, so an empty request drops the whole clause instead of leaving
|
|
253
|
+
"Pedido: ." behind.
|
|
130
254
|
|
|
131
255
|
| Key | Variables | Default |
|
|
132
256
|
|---|---|---|
|
|
@@ -134,19 +258,110 @@ empty request drops its whole clause.
|
|
|
134
258
|
| `phrases.backgroundDone` | `{agent}` `{where}` `{text}` | `{agent} terminou um trabalho em segundo plano {where}.[ Era: {text}.]` |
|
|
135
259
|
| `phrases.needsInput` | `{agent}` `{where}` `{notice}` | `{agent} precisa de você {where}{notice}.` |
|
|
136
260
|
|
|
261
|
+
| Variable | Example |
|
|
262
|
+
|---|---|
|
|
263
|
+
| `{agent}` | `Claude Code`, `Codex` |
|
|
264
|
+
| `{where}` | `na sessão Home assistant repo` / `na sessão azul, do projeto api` |
|
|
265
|
+
| `{duration}` | `cerca de 4 minutos` |
|
|
266
|
+
| `{request}` | what you asked, without links, file paths or markdown |
|
|
267
|
+
| `{text}` | what the background work was, e.g. `code-reviewer` |
|
|
268
|
+
| `{notice}` | the agent's notice, translated: `, para usar o Bash`; empty when it adds nothing |
|
|
269
|
+
|
|
270
|
+
A template with an unknown variable or unbalanced brackets is refused, so the
|
|
271
|
+
speaker never reads out broken text.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Commands
|
|
276
|
+
|
|
277
|
+
```
|
|
278
|
+
agent-voice setup guided setup
|
|
279
|
+
agent-voice status agents, outputs, settings, latest log lines
|
|
280
|
+
agent-voice test speak a test sentence on every enabled output
|
|
281
|
+
|
|
282
|
+
agent-voice connect <claude-code|codex> [--yes] add hooks to an agent
|
|
283
|
+
agent-voice disconnect <claude-code|codex> remove them
|
|
284
|
+
|
|
285
|
+
agent-voice output add <alexa|local|command> [name]
|
|
286
|
+
agent-voice output list | test [name] | enable <name> | disable <name> | remove <name>
|
|
287
|
+
|
|
288
|
+
agent-voice config get [key] | set <key> <value> | reset <key>
|
|
289
|
+
agent-voice wrap [--name <label>] -- <command...> announce when any command finishes
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
`agent-voice notify <agent> <event>` is also available: it is the hook entry
|
|
293
|
+
point, called by your agent. You never need to run it yourself.
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## Windows notes
|
|
298
|
+
|
|
299
|
+
**"execução de scripts foi desabilitada" / "running scripts is disabled".**
|
|
300
|
+
PowerShell blocks npm's `.ps1` launchers by default. You can allow them once,
|
|
301
|
+
for your user only:
|
|
302
|
+
|
|
303
|
+
```powershell
|
|
304
|
+
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Or use `npm.cmd` and `agent-voice.cmd` instead. The agent hooks are not
|
|
308
|
+
affected either way, because they call `agent-voice.cmd`.
|
|
309
|
+
|
|
310
|
+
**"agent-voice não é reconhecido" / "is not recognized".** npm's global folder
|
|
311
|
+
is not on your PATH. Add it, then open a new terminal and restart Claude Code:
|
|
312
|
+
|
|
313
|
+
```powershell
|
|
314
|
+
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$(npm prefix -g)", "User")
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Troubleshooting
|
|
320
|
+
|
|
321
|
+
Run `agent-voice status` first. The reason is almost always in the log lines it
|
|
322
|
+
prints.
|
|
323
|
+
|
|
324
|
+
| You see | It means |
|
|
325
|
+
|---|---|
|
|
326
|
+
| `silent (turn 21s < 30s)` | Working as configured. Lower `minSeconds` if you want it to speak sooner. |
|
|
327
|
+
| `silent (cooldown 120s)` | A background announcement was held back so the speaker doesn't chatter. |
|
|
328
|
+
| `FAILED via <output> (…)` | The speaker failed; the parenthesis says why. Try `agent-voice output test <name>`. |
|
|
329
|
+
| `no such output: <name>` | The output is enabled but not configured. Run `agent-voice output add`. |
|
|
330
|
+
| Agent shows `legacy` | It still has hooks from the old bash version. Run `agent-voice connect <agent>`. |
|
|
331
|
+
| Nothing in the log at all | The hooks are not firing. Claude Code: open `/hooks` once. Codex: trust them in `/hooks`. Check that `agent-voice` is on the PATH your agent sees. |
|
|
332
|
+
|
|
333
|
+
**Uninstall:**
|
|
334
|
+
|
|
137
335
|
```bash
|
|
138
|
-
agent-voice
|
|
139
|
-
agent-voice
|
|
140
|
-
agent-voice config reset phrases.taskDone # back to the default
|
|
336
|
+
agent-voice disconnect claude-code # and/or codex
|
|
337
|
+
npm rm -g @lucas_zaia/agent-voice
|
|
141
338
|
```
|
|
142
339
|
|
|
143
|
-
|
|
144
|
-
name), `{duration}` is "cerca de 4 minutos", and `{notice}` is the agent's
|
|
145
|
-
notice translated — ", para usar o Bash" — or empty. A template with an
|
|
146
|
-
unknown variable or unbalanced brackets is refused, so the speaker never reads
|
|
147
|
-
out broken text.
|
|
340
|
+
---
|
|
148
341
|
|
|
149
|
-
##
|
|
342
|
+
## How it works
|
|
343
|
+
|
|
344
|
+
```
|
|
345
|
+
agent hook ──▶ adapter ──▶ core ──▶ output ──▶ speaker
|
|
346
|
+
translate decide speak
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
| Piece | Job |
|
|
350
|
+
|---|---|
|
|
351
|
+
| **Adapter** (`src/adapters/`) | Knows one agent. Turns its hook payload into a standard event. Decides nothing. |
|
|
352
|
+
| **Core** (`src/core/`) | Knows no agent. Measures turns, applies thresholds and cooldown, cleans the text (no links, paths or markdown), builds the sentence. |
|
|
353
|
+
| **Output** (`src/outputs/`) | Takes a finished sentence and makes a device say it. |
|
|
354
|
+
|
|
355
|
+
Some guarantees:
|
|
356
|
+
|
|
357
|
+
- **It cannot break your agent.** The hook entry point always exits 0, never
|
|
358
|
+
waits more than a few seconds for input, and writes nothing your agent would
|
|
359
|
+
read. Failures go to the log and nowhere else.
|
|
360
|
+
- **Parallel sessions never mix.** State is kept per agent and per session, so
|
|
361
|
+
turns, durations and cooldowns stay separate.
|
|
362
|
+
- **Language.** The code and docs are in English. The spoken sentences are in
|
|
363
|
+
Brazilian Portuguese, and you can reword them (see
|
|
364
|
+
[Changing what it says](#changing-what-it-says)).
|
|
150
365
|
|
|
151
366
|
| | Config | State and `events.log` |
|
|
152
367
|
|---|---|---|
|
|
@@ -154,35 +369,31 @@ out broken text.
|
|
|
154
369
|
| macOS | `~/Library/Application Support/agent-voice` | `…/agent-voice/state` |
|
|
155
370
|
| Windows | `%APPDATA%\agent-voice` | `%LOCALAPPDATA%\agent-voice` |
|
|
156
371
|
|
|
157
|
-
|
|
372
|
+
---
|
|
158
373
|
|
|
159
|
-
|
|
374
|
+
## Development
|
|
160
375
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
## Upgrading from the bash version
|
|
376
|
+
```bash
|
|
377
|
+
git clone https://github.com/LucasZaia/agent-voice.git
|
|
378
|
+
cd agent-voice
|
|
379
|
+
npm test # node:test, no dependencies
|
|
380
|
+
npm link # puts this checkout's agent-voice on your PATH
|
|
381
|
+
```
|
|
168
382
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
`~/softwares/home-assistant/falar.sh -a {text}`, or pick `alexa` to talk to
|
|
172
|
-
Home Assistant directly.
|
|
173
|
-
3. `agent-voice connect claude-code` replaces the old `…/bin/notify` hooks.
|
|
383
|
+
To point the hooks at a checkout without `npm link`, set the command they call
|
|
384
|
+
before connecting:
|
|
174
385
|
|
|
175
|
-
|
|
386
|
+
```bash
|
|
387
|
+
AV_HOOK_COMMAND="node /path/to/agent-voice/bin/agent-voice.js" agent-voice connect claude-code
|
|
388
|
+
```
|
|
176
389
|
|
|
177
|
-
|
|
390
|
+
CI runs the suite on Linux, macOS and Windows with Node 20 and 22.
|
|
178
391
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
-
|
|
182
|
-
|
|
183
|
-
- **Concurrency.** State is keyed per agent and per session, so parallel
|
|
184
|
-
sessions never mix up their turns, durations or cooldowns.
|
|
392
|
+
**Upgrading from the old bash version:** install the package, run
|
|
393
|
+
`agent-voice setup` (to reuse a speaker script, choose `command`), then run
|
|
394
|
+
`agent-voice connect claude-code`. That replaces the old `…/bin/notify` hooks.
|
|
395
|
+
The existing state in `~/.local/state/agent-voice` is reused as-is.
|
|
185
396
|
|
|
186
397
|
## License
|
|
187
398
|
|
|
188
|
-
MIT
|
|
399
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,14 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lucas_zaia/agent-voice",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Make your coding agent talk to you: a smart speaker says when a long task finishes or when the agent needs you.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
"bin": {
|
|
7
|
+
"agent-voice": "bin/agent-voice.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"src",
|
|
12
|
+
"docs/adapters.md",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=20"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"test": "node --test"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/LucasZaia/agent-voice.git"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"claude-code",
|
|
28
|
+
"codex",
|
|
29
|
+
"alexa",
|
|
30
|
+
"home-assistant",
|
|
31
|
+
"tts",
|
|
32
|
+
"notifications"
|
|
33
|
+
],
|
|
12
34
|
"license": "MIT",
|
|
13
|
-
"publishConfig": {
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
}
|
|
14
38
|
}
|