pushary 1.8.0 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +27 -19
  3. package/data/SKILL.md +8 -8
  4. package/data/cowork/SKILL.md +2 -2
  5. package/data/cursor-plugin/README.md +2 -2
  6. package/data/cursor-plugin/scripts/redaction.mjs +4 -2
  7. package/data/cursor-plugin/skills/pushary/SKILL.md +7 -7
  8. package/data/vscode-plugin/README.md +4 -4
  9. package/data/vscode-plugin/scripts/pushary-gate.mjs +2 -2
  10. package/data/vscode-plugin/scripts/redaction.mjs +4 -2
  11. package/data/vscode-plugin/skills/pushary/SKILL.md +7 -7
  12. package/dist/bin/pushary-bell-hook.js +24 -23
  13. package/dist/bin/pushary-bell.js +9 -9
  14. package/dist/bin/pushary-claude.js +27 -26
  15. package/dist/bin/pushary-clean.js +35 -32
  16. package/dist/bin/pushary-codex-bridge.js +23 -21
  17. package/dist/bin/pushary-codex-hook.js +32 -31
  18. package/dist/bin/pushary-codex.js +13 -13
  19. package/dist/bin/pushary-connect.js +13 -13
  20. package/dist/bin/pushary-cowork.js +5 -5
  21. package/dist/bin/pushary-daemon.js +100 -36
  22. package/dist/bin/pushary-disconnect.js +19 -18
  23. package/dist/bin/pushary-doctor.js +41 -38
  24. package/dist/bin/pushary-elicitation-hook.js +26 -25
  25. package/dist/bin/pushary-gemini-bridge.js +18 -15
  26. package/dist/bin/pushary-gemini-hook.js +29 -28
  27. package/dist/bin/pushary-hook.js +33 -32
  28. package/dist/bin/pushary-login.js +12 -12
  29. package/dist/bin/pushary-logout.js +7 -7
  30. package/dist/bin/pushary-mcp.js +9 -9
  31. package/dist/bin/pushary-mode.js +9 -9
  32. package/dist/bin/pushary-notification-hook.js +29 -28
  33. package/dist/bin/pushary-opencode-hook.js +28 -27
  34. package/dist/bin/pushary-permission-denied-hook.js +33 -32
  35. package/dist/bin/pushary-permission-hook.js +32 -31
  36. package/dist/bin/pushary-post-hook.js +29 -28
  37. package/dist/bin/pushary-prompt-hook.js +29 -28
  38. package/dist/bin/pushary-session-end-hook.js +29 -28
  39. package/dist/bin/pushary-session-start-hook.js +33 -32
  40. package/dist/bin/pushary-setup.js +52 -108
  41. package/dist/bin/pushary-stats.js +5 -5
  42. package/dist/bin/pushary-status.js +17 -15
  43. package/dist/bin/pushary-stop-hook.js +29 -28
  44. package/dist/bin/pushary-stopfailure-hook.js +29 -28
  45. package/dist/bin/pushary-suggestions.js +4 -4
  46. package/dist/bin/pushary-transcript-register.js +20 -19
  47. package/dist/bin/pushary-transcripts.js +7 -7
  48. package/dist/bin/pushary-upgrade.js +29 -27
  49. package/dist/bin/pushary-wait.js +9 -9
  50. package/dist/bin/pushary.js +6 -6
  51. package/dist/{chunk-2OY3ZZ5N.js → chunk-2SLCHCVN.js} +3 -3
  52. package/dist/{chunk-E4FJTUH4.js → chunk-35X5UDML.js} +7 -7
  53. package/dist/{chunk-LXQ5FBBD.js → chunk-4A3UQERT.js} +1 -1
  54. package/dist/{chunk-CJVVKOSR.js → chunk-5DGNEUXK.js} +2 -2
  55. package/dist/{chunk-DB3ONZB4.js → chunk-5Y2DY6X4.js} +2 -2
  56. package/dist/{chunk-NQTHFF4W.js → chunk-5YY3IJT4.js} +21 -19
  57. package/dist/{chunk-AXPCESYO.js → chunk-644AEX4T.js} +3 -3
  58. package/dist/{chunk-UI36QSBI.js → chunk-64H5IZZD.js} +2 -2
  59. package/dist/chunk-6ICPEJY5.js +20 -0
  60. package/dist/{chunk-OLQRRFBX.js → chunk-72WOCX22.js} +1 -1
  61. package/dist/{chunk-JU6W3XAU.js → chunk-7ITOAMCD.js} +1 -1
  62. package/dist/{chunk-JYG4B33G.js → chunk-7U7ZWUTR.js} +1 -1
  63. package/dist/{chunk-VQKRG3AC.js → chunk-B3UVRGYP.js} +11 -9
  64. package/dist/{chunk-KVQBWI5T.js → chunk-BDMC5H5L.js} +2 -2
  65. package/dist/{chunk-HZVVNGEW.js → chunk-CB23AO4D.js} +2 -2
  66. package/dist/{chunk-D2FX3EPW.js → chunk-CHMOVJ2M.js} +1 -1
  67. package/dist/{chunk-ZVSKMPBZ.js → chunk-DLEKCAQL.js} +1 -1
  68. package/dist/{chunk-JZTHGAPA.js → chunk-DUA5O6X5.js} +8 -8
  69. package/dist/{chunk-2ABTSGFT.js → chunk-DVW2MYCM.js} +3 -3
  70. package/dist/{chunk-TY4JT7W3.js → chunk-DXBS2EL7.js} +1 -1
  71. package/dist/{chunk-KGDWDSNL.js → chunk-EESPY5DG.js} +2 -2
  72. package/dist/{chunk-WE2J62NC.js → chunk-EIGJYCOE.js} +5 -5
  73. package/dist/{chunk-CULUZTWQ.js → chunk-F6NTWZZC.js} +9 -9
  74. package/dist/{chunk-IPVKH2ST.js → chunk-HMNR7B2F.js} +1 -1
  75. package/dist/{chunk-OKXS7WDZ.js → chunk-HOEB6AKG.js} +1 -1
  76. package/dist/{chunk-R7437YI3.js → chunk-HVDMGDYV.js} +2 -2
  77. package/dist/{chunk-DE4Y6TCC.js → chunk-I3XLHSOC.js} +8 -7
  78. package/dist/{chunk-M5ICYGHT.js → chunk-I4HKMUZQ.js} +3 -3
  79. package/dist/{chunk-M5JDZ45W.js → chunk-INSMZNS7.js} +5 -5
  80. package/dist/{chunk-CVQYGMSR.js → chunk-KB2FTO4O.js} +4 -4
  81. package/dist/{chunk-MDEPU45E.js → chunk-LK2S5XIV.js} +6 -6
  82. package/dist/{chunk-NGDD6TXY.js → chunk-MMVCI6DT.js} +5 -5
  83. package/dist/{chunk-J5TIV3J6.js → chunk-MOTNSXC3.js} +5 -5
  84. package/dist/{chunk-C2WCPBF7.js → chunk-MYHG7PX2.js} +1 -1
  85. package/dist/{chunk-7Z7Q4GGS.js → chunk-N6JJJTPH.js} +6 -3
  86. package/dist/{chunk-EX3GAPA4.js → chunk-NHCUXTEM.js} +1 -1
  87. package/dist/{chunk-Q7E4I6UA.js → chunk-NNWQ5VDB.js} +13 -10
  88. package/dist/{chunk-AHV4LNB5.js → chunk-NOLPURUI.js} +1 -1
  89. package/dist/{chunk-GPEGOGRJ.js → chunk-ON5JW2HP.js} +1 -1
  90. package/dist/{chunk-SIFVFP6T.js → chunk-RIVNNBEK.js} +2 -1
  91. package/dist/{chunk-3EVPNIBE.js → chunk-S2UNQQQS.js} +7 -20
  92. package/dist/{chunk-SLFABHW3.js → chunk-T55H6YEP.js} +2 -2
  93. package/dist/{chunk-P7WQEVWA.js → chunk-TJMAXQ5Q.js} +2 -2
  94. package/dist/{chunk-SAXBC4AZ.js → chunk-UMMCHS6P.js} +1 -1
  95. package/dist/{chunk-A2A2YTMG.js → chunk-UPLV5AJF.js} +1 -1
  96. package/dist/{chunk-MPWXGONV.js → chunk-URNXU3FO.js} +1 -1
  97. package/dist/{chunk-EPCXUP3P.js → chunk-VFFHQC7W.js} +1 -1
  98. package/dist/{chunk-RHR6NARM.js → chunk-W2LJ4O3A.js} +2 -2
  99. package/dist/{chunk-6J2JC2RT.js → chunk-XEGVVU5H.js} +3 -3
  100. package/dist/chunk-XQZEIWAV.js +150 -0
  101. package/dist/{chunk-EYK3GSRH.js → chunk-YNCGXHM4.js} +4 -4
  102. package/dist/{chunk-ZSZSSJCV.js → chunk-ZJYJAD52.js} +1 -1
  103. package/dist/{reapply-CW3MA66V.js → reapply-3UERAKQN.js} +10 -9
  104. package/dist/src/index.js +21 -20
  105. package/package.json +1 -1
  106. package/dist/chunk-HQ6G3B5R.js +0 -59
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.8.2
4
+
5
+ - **Starting Codex from your phone no longer picks an old, broken Codex over the one you use.** The daemon looked for agents in npm's global folder before the ones your shell runs, so a broken npm copy of Codex won over a working one elsewhere on your PATH, and the session died at once with `spawn ... ENOENT`. On macOS and Linux the daemon and both session bridges now start the agent your shell finds first. Windows keeps npm's `.cmd` launcher first, because the first match on PATH there can be a script Windows cannot run.
6
+ - A Codex install with no native program left in its package, as XProtect left some npm installs, is no longer offered to your phone, and a request for it fails with the path it found and "Reinstall Codex". This is read from the disk; Pushary never runs the agent to check it. Setup, `pushary doctor` and `pushary upgrade` still treat that Codex as installed, as before, so they never stop the background service because of it, and they check the service against the agents it can actually start, so a broken Codex does not make them report that the service failed.
7
+ - The daemon checks every minute which agents it can start, so installing or repairing an agent shows on your phone without restarting the daemon. The daemon log says when that list changes.
8
+ - The daemon log now records how each session started from your phone ended: finished, stopped from Pushary, interrupted, stopped by a signal, or exited with its code, and after how long. Only an exit with an error code is recorded as the daemon's last error, which `pushary daemon status` and `pushary doctor` show. Stopping a session from your phone, or the kill switch halting it, is not an error.
9
+ - The Codex install check that setup also uses no longer judges a standalone Codex by an unrelated npm copy in a folder above it.
10
+
11
+ ## 1.8.1
12
+
13
+ - The CLI is now also published as `pushary`, from the same build as `@pushary/agent-hooks`, and the commands it prints now show `npx pushary@latest`. `npx @pushary/agent-hooks@latest` keeps working.
14
+
3
15
  ## 1.8.0
4
16
 
5
17
  - **An approval you give after auto mode blocks a call is no longer lost when the agent rewords the call.** Your approval covers only the exact call that was blocked. Claude Code tells the agent only that it may retry, and an agent that sent a changed command was blocked again, so the approval you gave from your phone or the Mac notch did nothing. Pushary now refuses the first changed call and tells the agent to send the blocked call again unchanged. If the agent ends its turn without sending it, Pushary tells it to send it.
package/README.md CHANGED
@@ -1,15 +1,15 @@
1
1
  # Pushary
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/@pushary/agent-hooks.svg)](https://www.npmjs.com/package/@pushary/agent-hooks)
4
- [![npm downloads](https://img.shields.io/npm/dm/@pushary/agent-hooks.svg)](https://www.npmjs.com/package/@pushary/agent-hooks)
5
- [![license](https://img.shields.io/npm/l/@pushary/agent-hooks.svg)](./LICENSE)
3
+ [![npm version](https://img.shields.io/npm/v/pushary.svg)](https://www.npmjs.com/package/pushary)
4
+ [![npm downloads](https://img.shields.io/npm/dm/pushary.svg)](https://www.npmjs.com/package/pushary)
5
+ [![license](https://img.shields.io/npm/l/pushary.svg)](./LICENSE)
6
6
 
7
7
  Push notifications, questions, and permission approvals for AI agents. Get a push when your agent finishes work, answer its questions from your phone, and approve risky commands before they run. Works with Claude Code, Codex, Cursor, VS Code, OpenCode, Gemini CLI, Hermes, and fx.
8
8
 
9
9
  Your agent froze waiting for a yes. This is how it reaches you.
10
10
 
11
11
  ```bash
12
- npx @pushary/agent-hooks@latest setup
12
+ npx pushary@latest setup
13
13
  ```
14
14
 
15
15
  One command wires up the MCP server, the permission hooks, and the agent instruction files. Then you close your laptop and the agent still reaches you.
@@ -30,7 +30,7 @@ If your agent runs in front of you and you only need to know when it finishes,
30
30
  you do not need any of the above and you should not pay for it:
31
31
 
32
32
  ```bash
33
- npx @pushary/agent-hooks@latest bell
33
+ npx pushary@latest bell
34
34
  ```
35
35
 
36
36
  That is the whole thing. It makes a noise in your terminal and raises a desktop
@@ -80,7 +80,7 @@ talking. Set `PUSHARY_BELL_QUIET=1` if you would rather it never mentioned it.
80
80
  Run setup:
81
81
 
82
82
  ```bash
83
- npx @pushary/agent-hooks@latest setup
83
+ npx pushary@latest setup
84
84
  ```
85
85
 
86
86
  It shows a QR code and short link. Open either in the Pushary app, check that the
@@ -91,13 +91,13 @@ pairing.
91
91
  For CI or another non-interactive install, pass an existing key explicitly:
92
92
 
93
93
  ```bash
94
- npx @pushary/agent-hooks@latest setup --key pk_xxx.sk_xxx --skip-phone
94
+ npx pushary@latest setup --key pk_xxx.sk_xxx --skip-phone
95
95
  ```
96
96
 
97
97
  Verify it worked:
98
98
 
99
99
  ```bash
100
- npx @pushary/agent-hooks@latest doctor
100
+ npx pushary@latest doctor
101
101
  ```
102
102
 
103
103
  Setup installs this package globally with npm, at the version you ran, because the
@@ -106,12 +106,20 @@ hooks run from that install. You never install it by hand.
106
106
  ## Remove it
107
107
 
108
108
  ```bash
109
- npx @pushary/agent-hooks@latest clean
109
+ npx pushary@latest clean
110
110
  ```
111
111
 
112
112
  It removes the hooks, the MCP entries, the stored key and the background service.
113
113
  Add `--dry-run` to see what it would remove first.
114
114
 
115
+ ## One package, two names
116
+
117
+ `pushary` and `@pushary/agent-hooks` are the same build, published at the same
118
+ version. Every older command keeps working: `npx @pushary/agent-hooks@latest setup`
119
+ does exactly what `npx pushary@latest setup` does.
120
+
121
+ `pip install pushary` is a different package: the Pushary Python SDK.
122
+
115
123
  ## Supported agents
116
124
 
117
125
  | Agent | Notify | Ask | Gate |
@@ -227,19 +235,19 @@ defaults rather than waiting for a keypress that can never arrive.
227
235
 
228
236
  ```bash
229
237
  # Everything detected on this machine, no prompts
230
- npx @pushary/agent-hooks@latest setup --key-stdin --yes --skip-phone < key.txt
238
+ npx pushary@latest setup --key-stdin --yes --skip-phone < key.txt
231
239
 
232
240
  # Named agents only
233
- npx @pushary/agent-hooks@latest setup --agents claude_code,codex --yes --skip-phone
241
+ npx pushary@latest setup --agents claude_code,codex --yes --skip-phone
234
242
 
235
243
  # Store the key and configure nothing
236
- npx @pushary/agent-hooks@latest setup --agents none --yes
244
+ npx pushary@latest setup --agents none --yes
237
245
 
238
246
  # Show what would be written, change nothing
239
- npx @pushary/agent-hooks@latest setup --agents auto --dry-run
247
+ npx pushary@latest setup --agents auto --dry-run
240
248
 
241
249
  # One machine-readable object on stdout; every human line goes to stderr
242
- npx @pushary/agent-hooks@latest setup --agents auto --yes --json
250
+ npx pushary@latest setup --agents auto --yes --json
243
251
  ```
244
252
 
245
253
  Prefer `--key-stdin` over `--key` in CI: `--key` puts the secret in argv, where
@@ -252,9 +260,9 @@ that failed), `130` cancelled with Ctrl-C.
252
260
  Examples:
253
261
 
254
262
  ```bash
255
- npx @pushary/agent-hooks@latest mode push_only --for 30m
256
- npx @pushary/agent-hooks@latest wait 45
257
- npx @pushary/agent-hooks@latest clean
263
+ npx pushary@latest mode push_only --for 30m
264
+ npx pushary@latest wait 45
265
+ npx pushary@latest clean
258
266
  ```
259
267
 
260
268
  ## Updates
@@ -266,7 +274,7 @@ already run from, then refreshes each agent's config the way `pushary upgrade` d
266
274
  The session does not wait for it, and the new version runs from the next hook call.
267
275
 
268
276
  - It stays within the same major version. A new major shows in `pushary doctor`, and
269
- you move to it with `npx @pushary/agent-hooks@latest upgrade`.
277
+ you move to it with `npx pushary@latest upgrade`.
270
278
  - It only updates a global npm install. A copy run through `npx`, a plugin, or the Mac
271
279
  app updates by its own route.
272
280
  - It never uses `sudo`. If npm cannot write to the global folder, the attempt is
@@ -323,7 +331,7 @@ MIT
323
331
 
324
332
  ## Claude Desktop and Cowork
325
333
 
326
- Run `pushary cowork` (or `npx @pushary/agent-hooks@latest cowork`) for connector setup. `pushary setup --agents cowork` opens the same setup path without storing a CLI key or writing hooks. Add the OAuth URL in Claude and sign in with the account used by your Pushary phone/Mac app.
334
+ Run `pushary cowork` (or `npx pushary@latest cowork`) for connector setup. `pushary setup --agents cowork` opens the same setup path without storing a CLI key or writing hooks. Add the OAuth URL in Claude and sign in with the account used by your Pushary phone/Mac app.
327
335
 
328
336
  Use `pushary cowork --instructions` for standing instructions or `pushary cowork --skill > SKILL.md` to export the bundled skill for upload. `--json` reports `manual_setup_required`; printing a link does not prove a connection. Ask a test question in Claude, answer it in Pushary, and verify Claude receives it.
329
337
 
package/data/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary
3
- version: 0.11.1
3
+ version: 0.11.2
4
4
  description: Push notifications and human-in-the-loop for AI agents. Use this whenever a running agent needs a human and nobody is at the terminal, such as before an irreversible or destructive action, before spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, when running unattended and you hit a genuine ambiguity, when another skill's workflow says to confirm with the user, and when a long task finishes or fails with nobody watching. Also use it when the user says things like keep going and ping me on my phone if you need anything, notify me when my agent needs me, approve from my phone, ask me questions while I am away from the terminal, run this overnight, keep working while I am in a meeting, I am stepping away, do not wait for me, or wants a long task to run unattended. Send alerts when tasks finish or fail, ask questions (yes/no, multiple choice, or free text) via push, and get answers from their connected devices. Use these tools proactively - do not wait for the user to ask for notifications. Every question and answer is recorded, so an unattended run stays reviewable afterwards. Works with Claude Code, Codex, Cursor, VS Code, Windsurf, Hermes, Lovable, or any MCP client; no Claude Max subscription required. Pushary is a hosted service, $9.99/mo after a 3-day card-first trial.
5
5
  metadata:
6
6
  hermes:
@@ -203,7 +203,7 @@ into the agent configuration files it wires, not into `~/.pushary/config.json`.
203
203
  machine the app set up therefore prints `mac-app` and nothing else. Treat it as
204
204
  ready.
205
205
 
206
- Check it with `npx @pushary/agent-hooks@latest status --json`. The exit code is the answer:
206
+ Check it with `npx pushary@latest status --json`. The exit code is the answer:
207
207
 
208
208
  | Code | Meaning |
209
209
  | --- | --- |
@@ -214,7 +214,7 @@ Check it with `npx @pushary/agent-hooks@latest status --json`. The exit code is
214
214
  | 6 | No device can answer |
215
215
  | 8 | Pushary could not be reached |
216
216
 
217
- On 6, the user needs to connect a phone: `npx @pushary/agent-hooks@latest connect`. That adds a phone and rewrites no agent configuration.
217
+ On 6, the user needs to connect a phone: `npx pushary@latest connect`. That adds a phone and rewrites no agent configuration.
218
218
 
219
219
  If `mac-app` printed, the Mac app is installed here and it may also own the hooks. Read the hook command to know, because the command is the record:
220
220
 
@@ -241,7 +241,7 @@ The command line works on macOS too. Offer it if the user prefers the terminal,
241
241
  There is no Mac app for these machines. Use the command line. It is fully supported.
242
242
 
243
243
  ```bash
244
- npx @pushary/agent-hooks@latest setup
244
+ npx pushary@latest setup
245
245
  ```
246
246
 
247
247
  Node 20.17+, 22.13+ or 23.5+ is necessary. Then the user needs a phone to answer on:
@@ -258,7 +258,7 @@ Run `setup`. It reads the key the app signed in with, so it mints no second key,
258
258
  ### What setup does
259
259
 
260
260
  ```bash
261
- npx @pushary/agent-hooks@latest setup
261
+ npx pushary@latest setup
262
262
  ```
263
263
 
264
264
  Setup pairs first and configures MCP, hooks, permissions and the skill only once pairing succeeds. Until someone completes the steps below, nothing is written and this machine has no Pushary. Treat pairing as the task, not as a prompt to wait out.
@@ -281,7 +281,7 @@ If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config,
281
281
  No app on their phone yet? They can get it at https://pushary.com/download. Or answer through the browser instead:
282
282
 
283
283
  ```bash
284
- npx @pushary/agent-hooks@latest setup --connect browser
284
+ npx pushary@latest setup --connect browser
285
285
  ```
286
286
 
287
287
  This is web push, not a login tab. It prints a QR for the user's own subscribe page, and it waits for a browser on that page to subscribe. On iOS the user must first add that page to the Home Screen, because iOS sends web push only from an installed page.
@@ -291,7 +291,7 @@ Manual MCP configuration also works, but it needs a key, so the user signs up fi
291
291
  After setup, verify with:
292
292
 
293
293
  ```bash
294
- npx @pushary/agent-hooks@latest doctor
294
+ npx pushary@latest doctor
295
295
  ```
296
296
 
297
297
  ## Answer surfaces and account boundaries
@@ -303,7 +303,7 @@ npx @pushary/agent-hooks@latest doctor
303
303
  | Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |
304
304
  | Browser | Open the decision page as a fallback; browser notification delivery requires permission. |
305
305
 
306
- Personal setup connects the operator's devices. For a Mac, install from https://pushary.com/download, sign in to the same personal account and connect your agents in the app. Run `npx @pushary/agent-hooks@latest doctor`, then request one harmless test question and verify it reaches the intended surface. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
306
+ Personal setup connects the operator's devices. For a Mac, install from https://pushary.com/download, sign in to the same personal account and connect your agents in the app. Run `npx pushary@latest doctor`, then request one harmless test question and verify it reaches the intended surface. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
307
307
 
308
308
  Partner customers use scoped enrollment links issued by their application. Do not enroll them into the operator's account or send their decisions through personal tools. The Mac notch currently uses the personal account/session API; do not promise a Partner customer inbox on Mac. See https://pushary.com/docs/agents/embed for Partner setup.
309
309
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary-cowork
3
- version: 0.4.2
3
+ version: 0.4.3
4
4
  description: Phone notifications and human-in-the-loop for Claude Cowork through the Pushary connector. Use inside a Cowork session whenever you need a human and nobody is watching the session, such as before an irreversible or destructive action, before spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, when running unattended and you hit a genuine ambiguity, when another skill's workflow says to confirm with the user, and when a task finishes or fails with nobody watching. Also use it when the user says things like ping me on my phone when this is done, ask me before doing anything risky, keep me in the loop while I am away, or notify me if you get stuck. Sends completion alerts, asks questions (yes/no, multiple choice, or free text) via push, and gets answers from connected devices. This Pushary connector is cooperative; it does not install native Cowork permission hooks. Pushary is a hosted service, $9.99/mo after a 3-day card-first trial.
5
5
  metadata:
6
6
  tags: notifications, push, mcp, human-in-the-loop, cowork, claude, alerts, approvals
@@ -55,7 +55,7 @@ Delivery is controlled by the user's policy: `push_first` uses presence, `push_o
55
55
  | Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |
56
56
  | Browser | Open the decision page as a fallback; browser notification delivery requires permission. |
57
57
 
58
- Personal setup connects the operator's devices. For a Mac, install from https://pushary.com/download, sign in to the same personal account and connect your agents in the app. Run `npx @pushary/agent-hooks@latest cowork` for connector setup, then ask one harmless test question inside Cowork, answer it from Pushary, and verify Cowork receives the answer. CLI doctor checks do not verify a hosted connector. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
58
+ Personal setup connects the operator's devices. For a Mac, install from https://pushary.com/download, sign in to the same personal account and connect your agents in the app. Run `npx pushary@latest cowork` for connector setup, then ask one harmless test question inside Cowork, answer it from Pushary, and verify Cowork receives the answer. CLI doctor checks do not verify a hosted connector. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
59
59
 
60
60
  Partner customers use scoped enrollment links issued by their application. Do not enroll them into the operator's account or send their decisions through personal tools. The Mac notch currently uses the personal account/session API; do not promise a Partner customer inbox on Mac. See https://pushary.com/docs/agents/embed for Partner setup.
61
61
 
@@ -35,7 +35,7 @@ Open the Marketplace panel in Cursor, search for Pushary, and click install. The
35
35
  This also sets up Claude Code, Codex, and Hermes if you use them.
36
36
 
37
37
  ```bash
38
- npx @pushary/agent-hooks@latest setup
38
+ npx pushary@latest setup
39
39
  ```
40
40
 
41
41
  ### Option 3: Manual MCP
@@ -94,7 +94,7 @@ Timeout approvals apply only after the configured wait actually elapsed. Short e
94
94
 
95
95
  ## Development
96
96
 
97
- `skills/pushary/SKILL.md` mirrors the Pushary skill that ships with `@pushary/agent-hooks`. Keep the two the same.
97
+ `skills/pushary/SKILL.md` mirrors the Pushary skill that ships with the Pushary CLI (`pushary` on npm). Keep the two the same.
98
98
 
99
99
  Test the plugin locally before publishing:
100
100
 
@@ -11,12 +11,14 @@ const credentialAssignmentRule = (key, doubleQuoted, singleQuoted, bare) => ({
11
11
  replacement: '$1$2$3$4[redacted]$2$3',
12
12
  });
13
13
  const DISPLAYED_SECRET_SHAPES = {
14
+ separator: String.raw `[ \t]`,
14
15
  privateKeyBody: String.raw `${PEM_LINE_BREAK}?(?:(?:Proc-Type|DEK-Info): [A-Za-z0-9,-]+${PEM_LINE_BREAK})*(?:[A-Za-z0-9+/=\r\n]|\\[rn])*?`,
15
16
  urlPassword: `${SHELL_INERT_URL_PASSWORD_UNIT}+`,
16
17
  authorizationValue: `${SHELL_INERT_UNIT}+`,
17
18
  credentialAssignment: credentialAssignmentRule(DISPLAYED_CREDENTIAL_KEY, `${SHELL_INERT_UNIT}*"`, `${SHELL_INERT_SINGLE_QUOTED_UNIT}*'`, `${SHELL_INERT_UNIT}+`),
18
19
  };
19
20
  const CUT_OFF_SECRET_SHAPES = {
21
+ separator: String.raw `\s`,
20
22
  privateKeyBody: String.raw `[\s\S]*?`,
21
23
  urlPassword: String.raw `[^\s@/]+`,
22
24
  authorizationValue: String.raw `\S+`,
@@ -38,8 +40,8 @@ const secretRedactionRules = (shapes) => [
38
40
  { pattern: /\bxai-[A-Za-z0-9]{16,}\b/g, replacement: '[redacted]' },
39
41
  { pattern: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g, replacement: '[redacted]' },
40
42
  { pattern: new RegExp(String.raw `\b([a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:)${shapes.urlPassword}@`, 'gi'), replacement: '$1[redacted]@' },
41
- { pattern: /\bbearer\s+[A-Za-z0-9._~+/=-]+/gi, replacement: 'bearer [redacted]' },
42
- { pattern: new RegExp(String.raw `\bauthorization:\s*${shapes.authorizationValue}`, 'gi'), replacement: 'authorization: [redacted]' },
43
+ { pattern: new RegExp(String.raw `\bbearer${shapes.separator}+[A-Za-z0-9._~+/=-]+`, 'gi'), replacement: 'bearer [redacted]' },
44
+ { pattern: new RegExp(String.raw `\bauthorization:${shapes.separator}*${shapes.authorizationValue}`, 'gi'), replacement: 'authorization: [redacted]' },
43
45
  shapes.credentialAssignment,
44
46
  ];
45
47
  export const SECRET_REDACTION_RULES = secretRedactionRules(DISPLAYED_SECRET_SHAPES);
@@ -196,7 +196,7 @@ into the agent configuration files it wires, not into `~/.pushary/config.json`.
196
196
  machine the app set up therefore prints `mac-app` and nothing else. Treat it as
197
197
  ready.
198
198
 
199
- Check it with `npx @pushary/agent-hooks@latest status --json`. The exit code is the answer:
199
+ Check it with `npx pushary@latest status --json`. The exit code is the answer:
200
200
 
201
201
  | Code | Meaning |
202
202
  | --- | --- |
@@ -207,7 +207,7 @@ Check it with `npx @pushary/agent-hooks@latest status --json`. The exit code is
207
207
  | 6 | No device can answer |
208
208
  | 8 | Pushary could not be reached |
209
209
 
210
- On 6, the user needs to connect a phone: `npx @pushary/agent-hooks@latest connect`. That adds a phone and rewrites no agent configuration.
210
+ On 6, the user needs to connect a phone: `npx pushary@latest connect`. That adds a phone and rewrites no agent configuration.
211
211
 
212
212
  If `mac-app` printed, the Mac app is installed here and it may also own the hooks. Read the hook command to know, because the command is the record:
213
213
 
@@ -234,7 +234,7 @@ The command line works on macOS too. Offer it if the user prefers the terminal,
234
234
  There is no Mac app for these machines. Use the command line. It is fully supported.
235
235
 
236
236
  ```bash
237
- npx @pushary/agent-hooks@latest setup
237
+ npx pushary@latest setup
238
238
  ```
239
239
 
240
240
  Node 20.17+, 22.13+ or 23.5+ is necessary. Then the user needs a phone to answer on:
@@ -251,7 +251,7 @@ Run `setup`. It reads the key the app signed in with, so it mints no second key,
251
251
  ### What setup does
252
252
 
253
253
  ```bash
254
- npx @pushary/agent-hooks@latest setup
254
+ npx pushary@latest setup
255
255
  ```
256
256
 
257
257
  Setup pairs first and configures MCP, hooks, permissions and the skill only once pairing succeeds. Until someone completes the steps below, nothing is written and this machine has no Pushary. Treat pairing as the task, not as a prompt to wait out.
@@ -274,7 +274,7 @@ If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config,
274
274
  No app on their phone yet? They can get it at https://pushary.com/download. Or answer through the browser instead:
275
275
 
276
276
  ```bash
277
- npx @pushary/agent-hooks@latest setup --connect browser
277
+ npx pushary@latest setup --connect browser
278
278
  ```
279
279
 
280
280
  This is web push, not a login tab. It prints a QR for the user's own subscribe page, and it waits for a browser on that page to subscribe. On iOS the user must first add that page to the Home Screen, because iOS sends web push only from an installed page.
@@ -284,7 +284,7 @@ Manual MCP configuration also works, but it needs a key, so the user signs up fi
284
284
  After setup, verify with:
285
285
 
286
286
  ```bash
287
- npx @pushary/agent-hooks@latest doctor
287
+ npx pushary@latest doctor
288
288
  ```
289
289
 
290
290
  ## Answer surfaces and account boundaries
@@ -296,7 +296,7 @@ npx @pushary/agent-hooks@latest doctor
296
296
  | Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |
297
297
  | Browser | Open the decision page as a fallback; browser notification delivery requires permission. |
298
298
 
299
- Personal setup connects the operator's devices. For a Mac, install from https://pushary.com/download, sign in to the same personal account and connect your agents in the app. Run `npx @pushary/agent-hooks@latest doctor`, then request one harmless test question and verify it reaches the intended surface. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
299
+ Personal setup connects the operator's devices. For a Mac, install from https://pushary.com/download, sign in to the same personal account and connect your agents in the app. Run `npx pushary@latest doctor`, then request one harmless test question and verify it reaches the intended surface. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
300
300
 
301
301
  Partner customers use scoped enrollment links issued by their application. Do not enroll them into the operator's account or send their decisions through personal tools. The Mac notch currently uses the personal account/session API; do not promise a Partner customer inbox on Mac. See https://pushary.com/docs/agents/embed for Partner setup.
302
302
 
@@ -35,13 +35,13 @@ There are three things.
35
35
  This installs the plugin, registers it with VS Code, and links your API key. It also sets up Claude Code, Codex, Cursor, and Hermes if you use them.
36
36
 
37
37
  ```bash
38
- npx @pushary/agent-hooks@latest setup
38
+ npx pushary@latest setup
39
39
  ```
40
40
 
41
41
  To configure only VS Code:
42
42
 
43
43
  ```bash
44
- npx @pushary/agent-hooks@latest setup --agents vscode
44
+ npx pushary@latest setup --agents vscode
45
45
  ```
46
46
 
47
47
  ### Option 2: Install from source
@@ -106,11 +106,11 @@ This repository uses the `.claude-plugin/plugin.json` layout, which VS Code, Git
106
106
 
107
107
  The layout is portable; this plugin is not meant to be. `hooks/hooks.json` uses VS Code's flat hook form, and the gate speaks VS Code's tool names, so treat this as a VS Code plugin that happens to sit in a portable folder shape.
108
108
 
109
- Claude Code users are served by `npx @pushary/agent-hooks@latest setup --agents claude_code`, which installs a hook built for Claude Code's own tool names and matcher format. Do not install this directory as a Claude Code plugin as well: at best it duplicates the MCP server, and the two installs would fight over the same approvals.
109
+ Claude Code users are served by `npx pushary@latest setup --agents claude_code`, which installs a hook built for Claude Code's own tool names and matcher format. Do not install this directory as a Claude Code plugin as well: at best it duplicates the MCP server, and the two installs would fight over the same approvals.
110
110
 
111
111
  ## Development
112
112
 
113
- `skills/pushary/SKILL.md` mirrors the Pushary skill that ships with `@pushary/agent-hooks`. Keep the two the same.
113
+ `skills/pushary/SKILL.md` mirrors the Pushary skill that ships with the Pushary CLI (`pushary` on npm). Keep the two the same.
114
114
 
115
115
  Test the gate without VS Code:
116
116
 
@@ -703,9 +703,9 @@ const main = async () => {
703
703
 
704
704
  const apiKey = resolveApiKey()
705
705
  if (!apiKey) {
706
- diag('no API key found (PUSHARY_API_KEY, the plugin .mcp.json, or ~/.pushary/config.json). Run: npx @pushary/agent-hooks@latest setup')
706
+ diag('no API key found (PUSHARY_API_KEY, the plugin .mcp.json, or ~/.pushary/config.json). Run: npx pushary@latest setup')
707
707
  return respond(
708
- unresolved(input.tool_name, 'Pushary is not configured: run `npx @pushary/agent-hooks@latest setup` (get a key at https://pushary.com) to route this approval to your phone.')
708
+ unresolved(input.tool_name, 'Pushary is not configured: run `npx pushary@latest setup` (get a key at https://pushary.com) to route this approval to your phone.')
709
709
  )
710
710
  }
711
711
 
@@ -11,12 +11,14 @@ const credentialAssignmentRule = (key, doubleQuoted, singleQuoted, bare) => ({
11
11
  replacement: '$1$2$3$4[redacted]$2$3',
12
12
  });
13
13
  const DISPLAYED_SECRET_SHAPES = {
14
+ separator: String.raw `[ \t]`,
14
15
  privateKeyBody: String.raw `${PEM_LINE_BREAK}?(?:(?:Proc-Type|DEK-Info): [A-Za-z0-9,-]+${PEM_LINE_BREAK})*(?:[A-Za-z0-9+/=\r\n]|\\[rn])*?`,
15
16
  urlPassword: `${SHELL_INERT_URL_PASSWORD_UNIT}+`,
16
17
  authorizationValue: `${SHELL_INERT_UNIT}+`,
17
18
  credentialAssignment: credentialAssignmentRule(DISPLAYED_CREDENTIAL_KEY, `${SHELL_INERT_UNIT}*"`, `${SHELL_INERT_SINGLE_QUOTED_UNIT}*'`, `${SHELL_INERT_UNIT}+`),
18
19
  };
19
20
  const CUT_OFF_SECRET_SHAPES = {
21
+ separator: String.raw `\s`,
20
22
  privateKeyBody: String.raw `[\s\S]*?`,
21
23
  urlPassword: String.raw `[^\s@/]+`,
22
24
  authorizationValue: String.raw `\S+`,
@@ -38,8 +40,8 @@ const secretRedactionRules = (shapes) => [
38
40
  { pattern: /\bxai-[A-Za-z0-9]{16,}\b/g, replacement: '[redacted]' },
39
41
  { pattern: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g, replacement: '[redacted]' },
40
42
  { pattern: new RegExp(String.raw `\b([a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:)${shapes.urlPassword}@`, 'gi'), replacement: '$1[redacted]@' },
41
- { pattern: /\bbearer\s+[A-Za-z0-9._~+/=-]+/gi, replacement: 'bearer [redacted]' },
42
- { pattern: new RegExp(String.raw `\bauthorization:\s*${shapes.authorizationValue}`, 'gi'), replacement: 'authorization: [redacted]' },
43
+ { pattern: new RegExp(String.raw `\bbearer${shapes.separator}+[A-Za-z0-9._~+/=-]+`, 'gi'), replacement: 'bearer [redacted]' },
44
+ { pattern: new RegExp(String.raw `\bauthorization:${shapes.separator}*${shapes.authorizationValue}`, 'gi'), replacement: 'authorization: [redacted]' },
43
45
  shapes.credentialAssignment,
44
46
  ];
45
47
  export const SECRET_REDACTION_RULES = secretRedactionRules(DISPLAYED_SECRET_SHAPES);
@@ -196,7 +196,7 @@ into the agent configuration files it wires, not into `~/.pushary/config.json`.
196
196
  machine the app set up therefore prints `mac-app` and nothing else. Treat it as
197
197
  ready.
198
198
 
199
- Check it with `npx @pushary/agent-hooks@latest status --json`. The exit code is the answer:
199
+ Check it with `npx pushary@latest status --json`. The exit code is the answer:
200
200
 
201
201
  | Code | Meaning |
202
202
  | --- | --- |
@@ -207,7 +207,7 @@ Check it with `npx @pushary/agent-hooks@latest status --json`. The exit code is
207
207
  | 6 | No device can answer |
208
208
  | 8 | Pushary could not be reached |
209
209
 
210
- On 6, the user needs to connect a phone: `npx @pushary/agent-hooks@latest connect`. That adds a phone and rewrites no agent configuration.
210
+ On 6, the user needs to connect a phone: `npx pushary@latest connect`. That adds a phone and rewrites no agent configuration.
211
211
 
212
212
  If `mac-app` printed, the Mac app is installed here and it may also own the hooks. Read the hook command to know, because the command is the record:
213
213
 
@@ -234,7 +234,7 @@ The command line works on macOS too. Offer it if the user prefers the terminal,
234
234
  There is no Mac app for these machines. Use the command line. It is fully supported.
235
235
 
236
236
  ```bash
237
- npx @pushary/agent-hooks@latest setup
237
+ npx pushary@latest setup
238
238
  ```
239
239
 
240
240
  Node 20.17+, 22.13+ or 23.5+ is necessary. Then the user needs a phone to answer on:
@@ -251,7 +251,7 @@ Run `setup`. It reads the key the app signed in with, so it mints no second key,
251
251
  ### What setup does
252
252
 
253
253
  ```bash
254
- npx @pushary/agent-hooks@latest setup
254
+ npx pushary@latest setup
255
255
  ```
256
256
 
257
257
  Setup pairs first and configures MCP, hooks, permissions and the skill only once pairing succeeds. Until someone completes the steps below, nothing is written and this machine has no Pushary. Treat pairing as the task, not as a prompt to wait out.
@@ -274,7 +274,7 @@ If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config,
274
274
  No app on their phone yet? They can get it at https://pushary.com/download. Or answer through the browser instead:
275
275
 
276
276
  ```bash
277
- npx @pushary/agent-hooks@latest setup --connect browser
277
+ npx pushary@latest setup --connect browser
278
278
  ```
279
279
 
280
280
  This is web push, not a login tab. It prints a QR for the user's own subscribe page, and it waits for a browser on that page to subscribe. On iOS the user must first add that page to the Home Screen, because iOS sends web push only from an installed page.
@@ -284,7 +284,7 @@ Manual MCP configuration also works, but it needs a key, so the user signs up fi
284
284
  After setup, verify with:
285
285
 
286
286
  ```bash
287
- npx @pushary/agent-hooks@latest doctor
287
+ npx pushary@latest doctor
288
288
  ```
289
289
 
290
290
  ## Answer surfaces and account boundaries
@@ -296,7 +296,7 @@ npx @pushary/agent-hooks@latest doctor
296
296
  | Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |
297
297
  | Browser | Open the decision page as a fallback; browser notification delivery requires permission. |
298
298
 
299
- Personal setup connects the operator's devices. For a Mac, install from https://pushary.com/download, sign in to the same personal account and connect your agents in the app. Run `npx @pushary/agent-hooks@latest doctor`, then request one harmless test question and verify it reaches the intended surface. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
299
+ Personal setup connects the operator's devices. For a Mac, install from https://pushary.com/download, sign in to the same personal account and connect your agents in the app. Run `npx pushary@latest doctor`, then request one harmless test question and verify it reaches the intended surface. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
300
300
 
301
301
  Partner customers use scoped enrollment links issued by their application. Do not enroll them into the operator's account or send their decisions through personal tools. The Mac notch currently uses the personal account/session API; do not promise a Partner customer inbox on Mac. See https://pushary.com/docs/agents/embed for Partner setup.
302
302
 
@@ -1,38 +1,39 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleBell
4
- } from "../chunk-IPVKH2ST.js";
4
+ } from "../chunk-HMNR7B2F.js";
5
5
  import {
6
6
  readHookInput
7
- } from "../chunk-KGDWDSNL.js";
8
- import "../chunk-JZTHGAPA.js";
7
+ } from "../chunk-EESPY5DG.js";
8
+ import "../chunk-DUA5O6X5.js";
9
9
  import "../chunk-SGZJ5LYH.js";
10
- import "../chunk-EYK3GSRH.js";
11
- import "../chunk-ZVSKMPBZ.js";
12
- import "../chunk-C2WCPBF7.js";
13
- import "../chunk-6J2JC2RT.js";
14
- import "../chunk-WE2J62NC.js";
15
- import "../chunk-3EVPNIBE.js";
16
- import "../chunk-OKXS7WDZ.js";
17
- import "../chunk-MPWXGONV.js";
18
- import "../chunk-SAXBC4AZ.js";
19
- import "../chunk-OLQRRFBX.js";
10
+ import "../chunk-YNCGXHM4.js";
11
+ import "../chunk-DLEKCAQL.js";
12
+ import "../chunk-MYHG7PX2.js";
13
+ import "../chunk-XEGVVU5H.js";
14
+ import "../chunk-EIGJYCOE.js";
15
+ import "../chunk-S2UNQQQS.js";
16
+ import "../chunk-HOEB6AKG.js";
17
+ import "../chunk-URNXU3FO.js";
18
+ import "../chunk-UMMCHS6P.js";
19
+ import "../chunk-72WOCX22.js";
20
20
  import "../chunk-XHKBHWLX.js";
21
- import "../chunk-EPCXUP3P.js";
22
- import "../chunk-CVQYGMSR.js";
21
+ import "../chunk-6ICPEJY5.js";
22
+ import "../chunk-VFFHQC7W.js";
23
+ import "../chunk-KB2FTO4O.js";
23
24
  import "../chunk-POFBE6ZY.js";
24
25
  import "../chunk-GMXKITVA.js";
25
- import "../chunk-P7WQEVWA.js";
26
- import "../chunk-2OY3ZZ5N.js";
27
- import "../chunk-LXQ5FBBD.js";
26
+ import "../chunk-TJMAXQ5Q.js";
27
+ import "../chunk-2SLCHCVN.js";
28
+ import "../chunk-4A3UQERT.js";
28
29
  import "../chunk-7QLSKOSU.js";
29
30
  import "../chunk-KZERVKTD.js";
30
- import "../chunk-DB3ONZB4.js";
31
- import "../chunk-A2A2YTMG.js";
31
+ import "../chunk-5Y2DY6X4.js";
32
+ import "../chunk-UPLV5AJF.js";
32
33
  import "../chunk-T7E75EKA.js";
33
- import "../chunk-GPEGOGRJ.js";
34
- import "../chunk-E4FJTUH4.js";
35
- import "../chunk-NQTHFF4W.js";
34
+ import "../chunk-ON5JW2HP.js";
35
+ import "../chunk-35X5UDML.js";
36
+ import "../chunk-5YY3IJT4.js";
36
37
 
37
38
  // bin/pushary-bell-hook.ts
38
39
  var main = async () => {
@@ -5,37 +5,37 @@ import {
5
5
  liveAgentCount,
6
6
  ring,
7
7
  upgradeThreshold
8
- } from "../chunk-IPVKH2ST.js";
8
+ } from "../chunk-HMNR7B2F.js";
9
9
  import {
10
10
  addBellHooks,
11
11
  bellInstalled,
12
12
  removeBellHooks
13
- } from "../chunk-OKXS7WDZ.js";
13
+ } from "../chunk-HOEB6AKG.js";
14
14
  import {
15
15
  createIo
16
16
  } from "../chunk-U4TMAANR.js";
17
17
  import {
18
18
  exitOnHelpFlag
19
- } from "../chunk-HZVVNGEW.js";
19
+ } from "../chunk-CB23AO4D.js";
20
20
  import {
21
21
  parseFlags
22
22
  } from "../chunk-GMXKITVA.js";
23
- import "../chunk-P7WQEVWA.js";
23
+ import "../chunk-TJMAXQ5Q.js";
24
24
  import "../chunk-7QLSKOSU.js";
25
25
  import {
26
26
  EXIT
27
27
  } from "../chunk-KZERVKTD.js";
28
- import "../chunk-DB3ONZB4.js";
28
+ import "../chunk-5Y2DY6X4.js";
29
29
  import {
30
30
  claudeSettings
31
- } from "../chunk-A2A2YTMG.js";
31
+ } from "../chunk-UPLV5AJF.js";
32
32
  import {
33
33
  readJsonSafe,
34
34
  writeJsonAtomic
35
35
  } from "../chunk-T7E75EKA.js";
36
- import "../chunk-GPEGOGRJ.js";
37
- import "../chunk-E4FJTUH4.js";
38
- import "../chunk-NQTHFF4W.js";
36
+ import "../chunk-ON5JW2HP.js";
37
+ import "../chunk-35X5UDML.js";
38
+ import "../chunk-5YY3IJT4.js";
39
39
 
40
40
  // bin/pushary-bell.ts
41
41
  exitOnHelpFlag("bell");