@pushary/agent-hooks 1.9.41 → 1.9.43

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 (105) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/data/SKILL.md +25 -9
  3. package/data/cowork/SKILL.md +3 -1
  4. package/data/cursor-plugin/.cursor-plugin/plugin.json +1 -1
  5. package/data/cursor-plugin/skills/pushary/SKILL.md +24 -8
  6. package/data/vscode-plugin/skills/pushary/SKILL.md +24 -8
  7. package/dist/bin/pushary-bell-hook.js +25 -25
  8. package/dist/bin/pushary-bell.js +9 -9
  9. package/dist/bin/pushary-claude.js +24 -24
  10. package/dist/bin/pushary-clean.js +31 -29
  11. package/dist/bin/pushary-codex-bridge.js +17 -17
  12. package/dist/bin/pushary-codex-hook.js +30 -30
  13. package/dist/bin/pushary-codex.js +12 -12
  14. package/dist/bin/pushary-connect.js +24 -24
  15. package/dist/bin/pushary-cowork.js +5 -5
  16. package/dist/bin/pushary-daemon.js +32 -32
  17. package/dist/bin/pushary-disconnect.js +24 -24
  18. package/dist/bin/pushary-doctor.js +33 -33
  19. package/dist/bin/pushary-elicitation-hook.js +25 -25
  20. package/dist/bin/pushary-gemini-bridge.js +13 -13
  21. package/dist/bin/pushary-gemini-hook.js +27 -27
  22. package/dist/bin/pushary-hook.js +29 -29
  23. package/dist/bin/pushary-login.js +12 -12
  24. package/dist/bin/pushary-logout.js +24 -24
  25. package/dist/bin/pushary-mcp.js +9 -9
  26. package/dist/bin/pushary-mode.js +12 -12
  27. package/dist/bin/pushary-notification-hook.js +24 -24
  28. package/dist/bin/pushary-opencode-hook.js +26 -26
  29. package/dist/bin/pushary-permission-denied-hook.js +29 -29
  30. package/dist/bin/pushary-permission-hook.js +28 -28
  31. package/dist/bin/pushary-post-hook.js +24 -24
  32. package/dist/bin/pushary-prompt-hook.js +24 -24
  33. package/dist/bin/pushary-session-end-hook.js +24 -24
  34. package/dist/bin/pushary-session-start-hook.js +28 -28
  35. package/dist/bin/pushary-setup.js +35 -35
  36. package/dist/bin/pushary-stats.js +5 -5
  37. package/dist/bin/pushary-status.js +26 -26
  38. package/dist/bin/pushary-stop-hook.js +24 -24
  39. package/dist/bin/pushary-stopfailure-hook.js +24 -24
  40. package/dist/bin/pushary-suggestions.js +12 -12
  41. package/dist/bin/pushary-transcript-register.js +17 -17
  42. package/dist/bin/pushary-transcripts.js +7 -7
  43. package/dist/bin/pushary-upgrade.js +30 -30
  44. package/dist/bin/pushary-wait.js +12 -12
  45. package/dist/bin/pushary.js +6 -6
  46. package/dist/{chunk-Q3QRD67J.js → chunk-45W43U2Q.js} +5 -5
  47. package/dist/{chunk-I7EZMNKI.js → chunk-4T2TGP4T.js} +5 -5
  48. package/dist/{chunk-AW4TDBUJ.js → chunk-53KLSE2F.js} +3 -3
  49. package/dist/{chunk-Y3HTWB5S.js → chunk-55FB6OSG.js} +1 -1
  50. package/dist/{chunk-FMYXPJYS.js → chunk-A64UCGX3.js} +5 -5
  51. package/dist/{chunk-B7PZBWBU.js → chunk-AVT7GPOF.js} +7 -7
  52. package/dist/{chunk-M7VKFAAK.js → chunk-C3RVRTHS.js} +3 -3
  53. package/dist/{chunk-ZV56INA6.js → chunk-C54VJJ37.js} +3 -3
  54. package/dist/{chunk-ZJY4KON3.js → chunk-C6QBNBL4.js} +4 -4
  55. package/dist/{chunk-6PABNQVH.js → chunk-CIERFMQT.js} +4 -4
  56. package/dist/{chunk-RBUCXUT7.js → chunk-ENGASUEL.js} +4 -4
  57. package/dist/{chunk-5INZFKHL.js → chunk-F5ALKPNS.js} +1 -1
  58. package/dist/{chunk-PJ3C6IID.js → chunk-F7SZ2RCK.js} +4 -4
  59. package/dist/{chunk-WZNRDDC4.js → chunk-FPJHS6PA.js} +6 -6
  60. package/dist/{chunk-CHD6IUNM.js → chunk-GTOBOC6M.js} +1 -1
  61. package/dist/{chunk-7L6YSHZO.js → chunk-H64CU2VB.js} +2 -2
  62. package/dist/{chunk-4UCTKLHY.js → chunk-H6V5S52A.js} +3 -3
  63. package/dist/{chunk-BDSIE2MT.js → chunk-HC4DQXAT.js} +2 -2
  64. package/dist/{chunk-OLLWYLQX.js → chunk-IDVKJICN.js} +2 -2
  65. package/dist/{chunk-3U3FU6ZX.js → chunk-IMD5FN6Y.js} +3 -3
  66. package/dist/{chunk-MAB6CGL5.js → chunk-J6MVBWF2.js} +1 -1
  67. package/dist/{chunk-IXNVIWNN.js → chunk-JB4JCGRW.js} +2 -2
  68. package/dist/{chunk-ASXBYX2N.js → chunk-JE6GG3OV.js} +1 -1
  69. package/dist/{chunk-M2YE3OEC.js → chunk-JJWG7CBT.js} +3 -3
  70. package/dist/{chunk-ZVMFRUBD.js → chunk-JW4S4O4W.js} +4 -4
  71. package/dist/{chunk-ODPULZZG.js → chunk-LAAOHBLO.js} +2 -2
  72. package/dist/{chunk-DIJ532S7.js → chunk-LDCRV6HG.js} +1 -1
  73. package/dist/{chunk-JBK47Y2M.js → chunk-LE2YVPAT.js} +6 -6
  74. package/dist/{chunk-RETRVO47.js → chunk-LOUZNXTJ.js} +2 -2
  75. package/dist/{chunk-4WM7IVVQ.js → chunk-LWW7SBK3.js} +2 -2
  76. package/dist/{chunk-X7TNLYNZ.js → chunk-MSUMSXTI.js} +1 -1
  77. package/dist/{chunk-BZIXDIIT.js → chunk-NKBAEGT7.js} +1 -1
  78. package/dist/{chunk-T3Q4B6WV.js → chunk-NV2LARV4.js} +2 -2
  79. package/dist/{chunk-FP2ZJK3T.js → chunk-O4SYJVAF.js} +5 -5
  80. package/dist/{chunk-K2SSNAUW.js → chunk-O7ADPLBF.js} +1 -1
  81. package/dist/{chunk-NRSTNZYJ.js → chunk-PIZ65U3D.js} +5 -5
  82. package/dist/{chunk-KYFWYPHN.js → chunk-Q7CUTGT4.js} +1 -1
  83. package/dist/{chunk-EBZK2SJ2.js → chunk-S3OWTQ6Z.js} +4 -4
  84. package/dist/{chunk-RTM5GVRZ.js → chunk-S4QT3YFG.js} +8 -8
  85. package/dist/{chunk-J7OBJZ5S.js → chunk-SATOTPXW.js} +1 -1
  86. package/dist/{chunk-STETTN4K.js → chunk-SCYAXV7U.js} +5 -5
  87. package/dist/{chunk-Z4RM54LU.js → chunk-TH74SUVV.js} +2 -2
  88. package/dist/{chunk-IVUP2EE4.js → chunk-V5SUKRRI.js} +4 -4
  89. package/dist/{chunk-E47JEBUR.js → chunk-VGPEXMYM.js} +7 -5
  90. package/dist/{chunk-AUDM6HU6.js → chunk-VIVLJK3T.js} +2 -2
  91. package/dist/{chunk-QRNNIDGY.js → chunk-VQL62ECJ.js} +1 -1
  92. package/dist/{chunk-QPT4PTUG.js → chunk-W3BO56VE.js} +1 -1
  93. package/dist/{chunk-F43LAKAK.js → chunk-XLHFWG2E.js} +2 -2
  94. package/dist/{chunk-JQX2L3ES.js → chunk-Y3N3SYBX.js} +1 -1
  95. package/dist/{chunk-MI67QQEQ.js → chunk-Y4VZYKSW.js} +10 -10
  96. package/dist/{chunk-CGRVIUKE.js → chunk-YRE6GUFZ.js} +8 -8
  97. package/dist/{chunk-ZX3PFROQ.js → chunk-ZJXEQV3A.js} +1 -1
  98. package/dist/{chunk-DPISXMLL.js → chunk-ZORCUL3Z.js} +4 -4
  99. package/dist/{global-upgrade-YEAGJG4G.js → global-upgrade-FFWOHOJ4.js} +6 -6
  100. package/dist/{paths-HQAICWAF.js → paths-Y2WPCM5Y.js} +2 -2
  101. package/dist/{reapply-XBEB2B5A.js → reapply-N3MV3CKD.js} +20 -20
  102. package/dist/src/index.js +19 -19
  103. package/dist/{upgrade-lock-GIO5QZ7E.js → upgrade-lock-ZXXNRH2P.js} +3 -3
  104. package/package.json +1 -1
  105. /package/dist/{chunk-ORLTWJ2O.js → chunk-RXXKFM22.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.43
4
+
5
+ - Agent and fx setup guidance uses Pushary’s durable personal reminders, which persist after the agent exits and deliver privately to their creator.
6
+
7
+ ## 1.9.42
8
+
9
+ - Complete Mac cleanup removes the Partner enrollment and device-key slots introduced by the native Partner flow, alongside existing session state.
10
+ - Bundled agent guidance preserves native Mac setup, explains store-specific checkout terms and returning to the pairing link after installation or restart, and distinguishes a synthetic question test from a real hook approval check.
11
+
3
12
  ## 1.9.41
4
13
 
5
14
  - Personal Codex sessions reject an invalid question set before asking anything on your phone. Malformed or repeated choices no longer disappear, and ordinary free-text replies, cancellation and host deadlines keep their existing behavior.
package/data/SKILL.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: pushary
3
- version: 0.11.2
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.
3
+ version: 0.12.0
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, paid service; web and native store checkout have different price and trial terms.
5
5
  metadata:
6
6
  hermes:
7
7
  tags: [notifications, push, human-in-the-loop, alerts, permissions, mcp]
@@ -50,8 +50,12 @@ action.
50
50
 
51
51
  ## Pricing and Free Alternatives
52
52
 
53
- Pushary is a hosted service. It costs $9.99/mo after a 3-day trial. The trial asks
54
- for a card up front. Say this plainly when the user asks what Pushary is.
53
+ Pushary is a hosted, paid service. Eligible web signups offer a 3-day trial with
54
+ a card required, then $9.99/mo for the Agent plan. Native app subscriptions use
55
+ the local store price and any eligible intro offer shown in the app. Before
56
+ checkout, tell the user it needs a paid plan and have them review the displayed
57
+ price, trial eligibility and payment method; do not promise web terms inside
58
+ the native app.
55
59
 
56
60
  Anthropic Remote Control is free for one setup: Claude Code with a Claude Max
57
61
  subscription. Recommend it when that is all the user needs.
@@ -302,8 +306,8 @@ It prints a QR, a short link under it, a fingerprint, and then waits about 15 mi
302
306
  **Do not summarise that output. Show it, and walk the user through all four steps:**
303
307
 
304
308
  1. **Show them the QR and the short link.** Both point at the same pairing. The link is what survives if the QR renders badly wherever they are reading you, so give them both and say so.
305
- 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it, so nobody has to restart anything.
306
- 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app will also ask them to sign in and start a plan: $9.99/mo after a 3-day trial, card up front, all inside the app. Say this before they scan rather than letting them discover it mid-flow.
309
+ 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it. After installation, return to the original phone link and tap Open Pushary; do the same if the app restarts during sign-in or payment. If the code expires, run setup again for a fresh one.
310
+ 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app also asks them to sign in and activate a plan, using the store price and any eligible trial shown there. They review and confirm the payment terms themselves. Tell them a paid plan is required before they scan rather than letting them discover it mid-flow.
307
311
  4. **They approve.** Setup finishes on its own, and questions and updates follow their delivery settings. Confirm notifications can offer lock-screen actions; choices and text open the app.
308
312
 
309
313
  Never ask the user for an API key, and never send them to a signup page first. Both are the old flow and both are worse.
@@ -322,12 +326,18 @@ This is web push, not a login tab. It prints a QR for the user's own subscribe p
322
326
 
323
327
  Manual MCP configuration also works, but it needs a key, so the user signs up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copies the key from the dashboard. Prefer `setup`: it needs neither.
324
328
 
325
- After setup, verify with:
329
+ For CLI-owned setup with Node/npm and a CLI credential, explicitly test a synthetic question and answer with:
326
330
 
327
331
  ```bash
328
- npx pushary@latest doctor
332
+ npx pushary@latest doctor --roundtrip
329
333
  ```
330
334
 
335
+ A returned answer proves the question path, not agent hook enforcement. Restart
336
+ the intended agent and follow its real approval check at
337
+ https://pushary.com/docs/agents/supported-agents. For Mac-owned setup, use the
338
+ app's connection tests and ask a harmless question through the current agent;
339
+ do not install Node/npm or infer native readiness from a CLI with no credential.
340
+
331
341
  ## Answer surfaces and account boundaries
332
342
 
333
343
  | Surface | What the user can do |
@@ -337,7 +347,7 @@ npx pushary@latest doctor
337
347
  | Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |
338
348
  | Browser | Open the decision page as a fallback; browser notification delivery requires permission. |
339
349
 
340
- 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.
350
+ 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. Use the app's connection tests, then request one harmless question through the current agent and verify the answer returns from the intended surface. Native setup does not need Node/npm. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
341
351
 
342
352
  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.
343
353
 
@@ -348,6 +358,12 @@ and every returned field, and it is always current. This section adds only what
348
358
  schema cannot say: when to use a tool, what its result means for your next step,
349
359
  and the shapes that are easy to get wrong.
350
360
 
361
+ ### schedule_reminder
362
+
363
+ When the user asks “remind me later,” set a one-time personal reminder with `body` and either `inMinutes` (from the server clock) or `at` (ISO timestamp with explicit UTC offset or Z). Confirm the returned `fireAt` in their local time. Never guess their timezone. For example, `{"body":"Check the deploy","inMinutes":30}`. Pushary persists it and delivers to the authenticated creator even after the agent exits. It does not schedule agent work.
364
+
365
+ Call with no arguments to list pending reminders. Pass `cancelReminderId` to cancel a scheduled reminder; `cancelled:false` means it was not cancelled and it may already be dispatching. Limits: 30 days ahead, 25 pending per user/site. Delivery normally follows within about a minute, requires a connected phone, and respects current account access, membership and stop/mute. Test reminders never notify. Do not use `ask_user` for reminders or promise exact delivery time.
366
+
351
367
  ### send_notification
352
368
 
353
369
  Send a one-way push notification to the user. Optionally include structured context for a rich detail page.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary-cowork
3
- version: 0.5.0
3
+ version: 0.6.0
4
4
  description: Use Pushary in Claude Chat, Cowork, or Claude Code when the user asks for phone updates, a missing decision blocks work, an action needs approval outside existing authorization, or meaningful unattended work finishes or fails. Send task updates and confirm, choice, or text questions to the user's connected devices, then read the returned answer and handoff. Requires the Pushary connector and a paid Pushary account. This skill does not install native permission hooks.
5
5
  metadata:
6
6
  tags: notifications, push, mcp, human-in-the-loop, cowork, claude, alerts, approvals
@@ -18,6 +18,8 @@ Every question costs the user their attention wherever they are. Before a run of
18
18
 
19
19
  ## When to reach out
20
20
 
21
+ For a personal reminder later, call `schedule_reminder` with `body` and `inMinutes`, or `at` with an explicit UTC offset. Never guess the timezone; confirm the returned time. Pushary saves the reminder and delivers after this conversation ends. It does not reopen Claude or perform future agent work. No arguments lists pending reminders; `cancelReminderId` cancels a scheduled one. Delivery can be about a minute late and requires a connected phone. Do not use `ask_user` for reminders.
22
+
21
23
  - **You need a decision or a clarifying answer.** Call `ask_user` instead of guessing or stalling. Use type `confirm` for yes or no, `select` for a fixed set of options, and `input` for free text.
22
24
  - **An action outside your existing authorization is risky or irreversible.** Deleting or overwriting files, spending money, sending anything external, bulk changes: call `ask_user` with type `confirm` first and wait for approval.
23
25
  - **Meaningful work finishes while the user is away, or they requested an alert.** Call `send_notification` with a short summary of what changed, and pass `context.type` as `task_complete`. That is what marks it a task update, and the user's setting for where task updates land can only route one that says so. Keep a reply channel open only for a specific unresolved decision needed to finish, as described below.
@@ -2,7 +2,7 @@
2
2
  "name": "pushary",
3
3
  "displayName": "Pushary — Control Panel for AI Agents",
4
4
  "description": "Push notifications, human-in-the-loop questions, and permission gating for your AI coding agent. Get a push when a task finishes, answer the agent from your phone, and approve risky commands before they run.",
5
- "version": "0.2.6",
5
+ "version": "0.2.7",
6
6
  "author": { "name": "Pushary", "email": "business@pushary.com" },
7
7
  "homepage": "https://pushary.com",
8
8
  "repository": "https://github.com/Pushary/cursor-plugin",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary
3
- 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.
3
+ 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, paid service; web and native store checkout have different price and trial terms.
4
4
  ---
5
5
 
6
6
  # Pushary - Push Notifications for AI Agents
@@ -43,8 +43,12 @@ action.
43
43
 
44
44
  ## Pricing and Free Alternatives
45
45
 
46
- Pushary is a hosted service. It costs $9.99/mo after a 3-day trial. The trial asks
47
- for a card up front. Say this plainly when the user asks what Pushary is.
46
+ Pushary is a hosted, paid service. Eligible web signups offer a 3-day trial with
47
+ a card required, then $9.99/mo for the Agent plan. Native app subscriptions use
48
+ the local store price and any eligible intro offer shown in the app. Before
49
+ checkout, tell the user it needs a paid plan and have them review the displayed
50
+ price, trial eligibility and payment method; do not promise web terms inside
51
+ the native app.
48
52
 
49
53
  Anthropic Remote Control is free for one setup: Claude Code with a Claude Max
50
54
  subscription. Recommend it when that is all the user needs.
@@ -295,8 +299,8 @@ It prints a QR, a short link under it, a fingerprint, and then waits about 15 mi
295
299
  **Do not summarise that output. Show it, and walk the user through all four steps:**
296
300
 
297
301
  1. **Show them the QR and the short link.** Both point at the same pairing. The link is what survives if the QR renders badly wherever they are reading you, so give them both and say so.
298
- 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it, so nobody has to restart anything.
299
- 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app will also ask them to sign in and start a plan: $9.99/mo after a 3-day trial, card up front, all inside the app. Say this before they scan rather than letting them discover it mid-flow.
302
+ 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it. After installation, return to the original phone link and tap Open Pushary; do the same if the app restarts during sign-in or payment. If the code expires, run setup again for a fresh one.
303
+ 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app also asks them to sign in and activate a plan, using the store price and any eligible trial shown there. They review and confirm the payment terms themselves. Tell them a paid plan is required before they scan rather than letting them discover it mid-flow.
300
304
  4. **They approve.** Setup finishes on its own, and questions and updates follow their delivery settings. Confirm notifications can offer lock-screen actions; choices and text open the app.
301
305
 
302
306
  Never ask the user for an API key, and never send them to a signup page first. Both are the old flow and both are worse.
@@ -315,12 +319,18 @@ This is web push, not a login tab. It prints a QR for the user's own subscribe p
315
319
 
316
320
  Manual MCP configuration also works, but it needs a key, so the user signs up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copies the key from the dashboard. Prefer `setup`: it needs neither.
317
321
 
318
- After setup, verify with:
322
+ For CLI-owned setup with Node/npm and a CLI credential, explicitly test a synthetic question and answer with:
319
323
 
320
324
  ```bash
321
- npx pushary@latest doctor
325
+ npx pushary@latest doctor --roundtrip
322
326
  ```
323
327
 
328
+ A returned answer proves the question path, not agent hook enforcement. Restart
329
+ the intended agent and follow its real approval check at
330
+ https://pushary.com/docs/agents/supported-agents. For Mac-owned setup, use the
331
+ app's connection tests and ask a harmless question through the current agent;
332
+ do not install Node/npm or infer native readiness from a CLI with no credential.
333
+
324
334
  ## Answer surfaces and account boundaries
325
335
 
326
336
  | Surface | What the user can do |
@@ -330,7 +340,7 @@ npx pushary@latest doctor
330
340
  | Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |
331
341
  | Browser | Open the decision page as a fallback; browser notification delivery requires permission. |
332
342
 
333
- 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.
343
+ 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. Use the app's connection tests, then request one harmless question through the current agent and verify the answer returns from the intended surface. Native setup does not need Node/npm. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
334
344
 
335
345
  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.
336
346
 
@@ -341,6 +351,12 @@ and every returned field, and it is always current. This section adds only what
341
351
  schema cannot say: when to use a tool, what its result means for your next step,
342
352
  and the shapes that are easy to get wrong.
343
353
 
354
+ ### schedule_reminder
355
+
356
+ When the user asks “remind me later,” set a one-time personal reminder with `body` and either `inMinutes` (from the server clock) or `at` (ISO timestamp with explicit UTC offset or Z). Confirm the returned `fireAt` in their local time. Never guess their timezone. For example, `{"body":"Check the deploy","inMinutes":30}`. Pushary persists it and delivers to the authenticated creator even after the agent exits. It does not schedule agent work.
357
+
358
+ Call with no arguments to list pending reminders. Pass `cancelReminderId` to cancel a scheduled reminder; `cancelled:false` means it was not cancelled and it may already be dispatching. Limits: 30 days ahead, 25 pending per user/site. Delivery normally follows within about a minute, requires a connected phone, and respects current account access, membership and stop/mute. Test reminders never notify. Do not use `ask_user` for reminders or promise exact delivery time.
359
+
344
360
  ### send_notification
345
361
 
346
362
  Send a one-way push notification to the user. Optionally include structured context for a rich detail page.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary
3
- 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.
3
+ 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, paid service; web and native store checkout have different price and trial terms.
4
4
  ---
5
5
 
6
6
  # Pushary - Push Notifications for AI Agents
@@ -43,8 +43,12 @@ action.
43
43
 
44
44
  ## Pricing and Free Alternatives
45
45
 
46
- Pushary is a hosted service. It costs $9.99/mo after a 3-day trial. The trial asks
47
- for a card up front. Say this plainly when the user asks what Pushary is.
46
+ Pushary is a hosted, paid service. Eligible web signups offer a 3-day trial with
47
+ a card required, then $9.99/mo for the Agent plan. Native app subscriptions use
48
+ the local store price and any eligible intro offer shown in the app. Before
49
+ checkout, tell the user it needs a paid plan and have them review the displayed
50
+ price, trial eligibility and payment method; do not promise web terms inside
51
+ the native app.
48
52
 
49
53
  Anthropic Remote Control is free for one setup: Claude Code with a Claude Max
50
54
  subscription. Recommend it when that is all the user needs.
@@ -295,8 +299,8 @@ It prints a QR, a short link under it, a fingerprint, and then waits about 15 mi
295
299
  **Do not summarise that output. Show it, and walk the user through all four steps:**
296
300
 
297
301
  1. **Show them the QR and the short link.** Both point at the same pairing. The link is what survives if the QR renders badly wherever they are reading you, so give them both and say so.
298
- 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it, so nobody has to restart anything.
299
- 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app will also ask them to sign in and start a plan: $9.99/mo after a 3-day trial, card up front, all inside the app. Say this before they scan rather than letting them discover it mid-flow.
302
+ 2. **They need the Pushary app.** It is the thing that receives approvals. If they do not have it: https://pushary.com/download. Setup keeps waiting while they install it. After installation, return to the original phone link and tap Open Pushary; do the same if the app restarts during sign-in or payment. If the code expires, run setup again for a fresh one.
303
+ 3. **They scan the QR, or open the link on the phone.** The app shows a fingerprint. Tell them it must match the one in your output before they approve. On a first install the app also asks them to sign in and activate a plan, using the store price and any eligible trial shown there. They review and confirm the payment terms themselves. Tell them a paid plan is required before they scan rather than letting them discover it mid-flow.
300
304
  4. **They approve.** Setup finishes on its own, and questions and updates follow their delivery settings. Confirm notifications can offer lock-screen actions; choices and text open the app.
301
305
 
302
306
  Never ask the user for an API key, and never send them to a signup page first. Both are the old flow and both are worse.
@@ -315,12 +319,18 @@ This is web push, not a login tab. It prints a QR for the user's own subscribe p
315
319
 
316
320
  Manual MCP configuration also works, but it needs a key, so the user signs up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copies the key from the dashboard. Prefer `setup`: it needs neither.
317
321
 
318
- After setup, verify with:
322
+ For CLI-owned setup with Node/npm and a CLI credential, explicitly test a synthetic question and answer with:
319
323
 
320
324
  ```bash
321
- npx pushary@latest doctor
325
+ npx pushary@latest doctor --roundtrip
322
326
  ```
323
327
 
328
+ A returned answer proves the question path, not agent hook enforcement. Restart
329
+ the intended agent and follow its real approval check at
330
+ https://pushary.com/docs/agents/supported-agents. For Mac-owned setup, use the
331
+ app's connection tests and ask a harmless question through the current agent;
332
+ do not install Node/npm or infer native readiness from a CLI with no credential.
333
+
324
334
  ## Answer surfaces and account boundaries
325
335
 
326
336
  | Surface | What the user can do |
@@ -330,7 +340,7 @@ npx pushary@latest doctor
330
340
  | Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |
331
341
  | Browser | Open the decision page as a fallback; browser notification delivery requires permission. |
332
342
 
333
- 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.
343
+ 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. Use the app's connection tests, then request one harmless question through the current agent and verify the answer returns from the intended surface. Native setup does not need Node/npm. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.
334
344
 
335
345
  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.
336
346
 
@@ -341,6 +351,12 @@ and every returned field, and it is always current. This section adds only what
341
351
  schema cannot say: when to use a tool, what its result means for your next step,
342
352
  and the shapes that are easy to get wrong.
343
353
 
354
+ ### schedule_reminder
355
+
356
+ When the user asks “remind me later,” set a one-time personal reminder with `body` and either `inMinutes` (from the server clock) or `at` (ISO timestamp with explicit UTC offset or Z). Confirm the returned `fireAt` in their local time. Never guess their timezone. For example, `{"body":"Check the deploy","inMinutes":30}`. Pushary persists it and delivers to the authenticated creator even after the agent exits. It does not schedule agent work.
357
+
358
+ Call with no arguments to list pending reminders. Pass `cancelReminderId` to cancel a scheduled reminder; `cancelled:false` means it was not cancelled and it may already be dispatching. Limits: 30 days ahead, 25 pending per user/site. Delivery normally follows within about a minute, requires a connected phone, and respects current account access, membership and stop/mute. Test reminders never notify. Do not use `ask_user` for reminders or promise exact delivery time.
359
+
344
360
  ### send_notification
345
361
 
346
362
  Send a one-way push notification to the user. Optionally include structured context for a rich detail page.
@@ -1,41 +1,41 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handleBell
4
- } from "../chunk-ASXBYX2N.js";
4
+ } from "../chunk-JE6GG3OV.js";
5
5
  import {
6
6
  readHookInput
7
- } from "../chunk-6PABNQVH.js";
8
- import "../chunk-RTM5GVRZ.js";
7
+ } from "../chunk-CIERFMQT.js";
8
+ import "../chunk-S4QT3YFG.js";
9
9
  import "../chunk-DWQYCOPI.js";
10
- import "../chunk-STETTN4K.js";
11
- import "../chunk-X7TNLYNZ.js";
12
- import "../chunk-MAB6CGL5.js";
13
- import "../chunk-QRNNIDGY.js";
10
+ import "../chunk-SCYAXV7U.js";
11
+ import "../chunk-MSUMSXTI.js";
12
+ import "../chunk-J6MVBWF2.js";
13
+ import "../chunk-VQL62ECJ.js";
14
14
  import "../chunk-XHKBHWLX.js";
15
- import "../chunk-IVUP2EE4.js";
16
- import "../chunk-NRSTNZYJ.js";
17
- import "../chunk-3U3FU6ZX.js";
18
- import "../chunk-KYFWYPHN.js";
19
- import "../chunk-Y3HTWB5S.js";
15
+ import "../chunk-V5SUKRRI.js";
16
+ import "../chunk-PIZ65U3D.js";
17
+ import "../chunk-IMD5FN6Y.js";
18
+ import "../chunk-Q7CUTGT4.js";
19
+ import "../chunk-55FB6OSG.js";
20
20
  import "../chunk-GMXKITVA.js";
21
21
  import "../chunk-6ICPEJY5.js";
22
- import "../chunk-M7VKFAAK.js";
23
- import "../chunk-CGRVIUKE.js";
24
- import "../chunk-K2SSNAUW.js";
25
- import "../chunk-I7EZMNKI.js";
22
+ import "../chunk-C3RVRTHS.js";
23
+ import "../chunk-YRE6GUFZ.js";
24
+ import "../chunk-O7ADPLBF.js";
25
+ import "../chunk-4T2TGP4T.js";
26
26
  import "../chunk-POFBE6ZY.js";
27
- import "../chunk-AW4TDBUJ.js";
28
- import "../chunk-ZV56INA6.js";
29
- import "../chunk-4UCTKLHY.js";
30
- import "../chunk-QPT4PTUG.js";
27
+ import "../chunk-53KLSE2F.js";
28
+ import "../chunk-C54VJJ37.js";
29
+ import "../chunk-H6V5S52A.js";
30
+ import "../chunk-W3BO56VE.js";
31
31
  import "../chunk-7QLSKOSU.js";
32
32
  import "../chunk-KZERVKTD.js";
33
- import "../chunk-ODPULZZG.js";
34
- import "../chunk-EBZK2SJ2.js";
33
+ import "../chunk-LAAOHBLO.js";
34
+ import "../chunk-S3OWTQ6Z.js";
35
35
  import "../chunk-AQFEP65J.js";
36
- import "../chunk-CHD6IUNM.js";
37
- import "../chunk-DIJ532S7.js";
38
- import "../chunk-ORLTWJ2O.js";
36
+ import "../chunk-GTOBOC6M.js";
37
+ import "../chunk-LDCRV6HG.js";
38
+ import "../chunk-RXXKFM22.js";
39
39
 
40
40
  // bin/pushary-bell-hook.ts
41
41
  var main = async () => {
@@ -5,39 +5,39 @@ import {
5
5
  liveAgentCount,
6
6
  ring,
7
7
  upgradeThreshold
8
- } from "../chunk-ASXBYX2N.js";
8
+ } from "../chunk-JE6GG3OV.js";
9
9
  import {
10
10
  createIo
11
11
  } from "../chunk-FO3MDD26.js";
12
12
  import {
13
13
  exitOnHelpFlag
14
- } from "../chunk-F43LAKAK.js";
14
+ } from "../chunk-XLHFWG2E.js";
15
15
  import {
16
16
  addBellHooks,
17
17
  bellInstalled,
18
18
  removeBellHooks
19
- } from "../chunk-Y3HTWB5S.js";
19
+ } from "../chunk-55FB6OSG.js";
20
20
  import {
21
21
  parseFlags
22
22
  } from "../chunk-GMXKITVA.js";
23
- import "../chunk-M7VKFAAK.js";
23
+ import "../chunk-C3RVRTHS.js";
24
24
  import "../chunk-7QLSKOSU.js";
25
25
  import {
26
26
  EXIT
27
27
  } from "../chunk-KZERVKTD.js";
28
- import "../chunk-ODPULZZG.js";
28
+ import "../chunk-LAAOHBLO.js";
29
29
  import {
30
30
  claudeSettings
31
- } from "../chunk-EBZK2SJ2.js";
31
+ } from "../chunk-S3OWTQ6Z.js";
32
32
  import {
33
33
  readJsonSafe,
34
34
  writeJsonAtomic
35
35
  } from "../chunk-AQFEP65J.js";
36
- import "../chunk-CHD6IUNM.js";
37
- import "../chunk-DIJ532S7.js";
36
+ import "../chunk-GTOBOC6M.js";
37
+ import "../chunk-LDCRV6HG.js";
38
38
  import {
39
39
  isRecord
40
- } from "../chunk-ORLTWJ2O.js";
40
+ } from "../chunk-RXXKFM22.js";
41
41
 
42
42
  // bin/pushary-bell.ts
43
43
  exitOnHelpFlag("bell");
@@ -8,39 +8,39 @@ import {
8
8
  describeIdleWindow,
9
9
  startProcessOwnership,
10
10
  withSpawnProcessOwnership
11
- } from "../chunk-4WM7IVVQ.js";
11
+ } from "../chunk-LWW7SBK3.js";
12
12
  import {
13
13
  announceSubscriptionRequired,
14
14
  isDeferAnswer
15
- } from "../chunk-ZX3PFROQ.js";
15
+ } from "../chunk-ZJXEQV3A.js";
16
16
  import {
17
17
  claudeTranscriptPath,
18
18
  loadSessionKey,
19
19
  registerTranscript,
20
20
  registeredTranscriptEnabled
21
- } from "../chunk-RTM5GVRZ.js";
21
+ } from "../chunk-S4QT3YFG.js";
22
22
  import "../chunk-DWQYCOPI.js";
23
23
  import {
24
24
  ensureDaemonRunning
25
- } from "../chunk-STETTN4K.js";
25
+ } from "../chunk-SCYAXV7U.js";
26
26
  import {
27
27
  encryptRecord
28
- } from "../chunk-X7TNLYNZ.js";
29
- import "../chunk-MAB6CGL5.js";
28
+ } from "../chunk-MSUMSXTI.js";
29
+ import "../chunk-J6MVBWF2.js";
30
30
  import {
31
31
  transcriptsEnabled
32
- } from "../chunk-QRNNIDGY.js";
32
+ } from "../chunk-VQL62ECJ.js";
33
33
  import {
34
34
  needsShell,
35
35
  spawnClaude
36
36
  } from "../chunk-XHKBHWLX.js";
37
- import "../chunk-NRSTNZYJ.js";
38
- import "../chunk-3U3FU6ZX.js";
39
- import "../chunk-KYFWYPHN.js";
40
- import "../chunk-Y3HTWB5S.js";
37
+ import "../chunk-PIZ65U3D.js";
38
+ import "../chunk-IMD5FN6Y.js";
39
+ import "../chunk-Q7CUTGT4.js";
40
+ import "../chunk-55FB6OSG.js";
41
41
  import "../chunk-GMXKITVA.js";
42
42
  import "../chunk-6ICPEJY5.js";
43
- import "../chunk-M7VKFAAK.js";
43
+ import "../chunk-C3RVRTHS.js";
44
44
  import {
45
45
  DEFAULT_SESSION,
46
46
  UNNAMED_ACTION,
@@ -58,8 +58,8 @@ import {
58
58
  reportEvent,
59
59
  savePendingCommand,
60
60
  scopePathFor
61
- } from "../chunk-CGRVIUKE.js";
62
- import "../chunk-K2SSNAUW.js";
61
+ } from "../chunk-YRE6GUFZ.js";
62
+ import "../chunk-O7ADPLBF.js";
63
63
  import {
64
64
  askUser,
65
65
  cancelQuestion,
@@ -70,28 +70,28 @@ import {
70
70
  waitForAnswer,
71
71
  waitsForThePhone,
72
72
  withdrawQuestion
73
- } from "../chunk-I7EZMNKI.js";
73
+ } from "../chunk-4T2TGP4T.js";
74
74
  import "../chunk-POFBE6ZY.js";
75
75
  import {
76
76
  SubscriptionRequiredError
77
- } from "../chunk-AW4TDBUJ.js";
78
- import "../chunk-ZV56INA6.js";
79
- import "../chunk-4UCTKLHY.js";
77
+ } from "../chunk-53KLSE2F.js";
78
+ import "../chunk-C54VJJ37.js";
79
+ import "../chunk-H6V5S52A.js";
80
80
  import {
81
81
  getMachineId
82
- } from "../chunk-QPT4PTUG.js";
82
+ } from "../chunk-W3BO56VE.js";
83
83
  import "../chunk-7QLSKOSU.js";
84
84
  import "../chunk-KZERVKTD.js";
85
- import "../chunk-ODPULZZG.js";
86
- import "../chunk-EBZK2SJ2.js";
85
+ import "../chunk-LAAOHBLO.js";
86
+ import "../chunk-S3OWTQ6Z.js";
87
87
  import "../chunk-AQFEP65J.js";
88
88
  import {
89
89
  getApiKey,
90
90
  getBaseUrl
91
- } from "../chunk-CHD6IUNM.js";
91
+ } from "../chunk-GTOBOC6M.js";
92
92
  import {
93
93
  NPX_LATEST_COMMAND
94
- } from "../chunk-DIJ532S7.js";
94
+ } from "../chunk-LDCRV6HG.js";
95
95
  import {
96
96
  DECISION_STOP_REASON,
97
97
  HAND_BACK_WITHOUT_A_PROMPT,
@@ -101,7 +101,7 @@ import {
101
101
  redactSecretsFromContent,
102
102
  resolveGate,
103
103
  timeoutActionWithoutLocalPrompt
104
- } from "../chunk-ORLTWJ2O.js";
104
+ } from "../chunk-RXXKFM22.js";
105
105
 
106
106
  // src/wrapper/localPassthrough.ts
107
107
  var SIGNAL_NUMBERS = {