@pushary/agent-hooks 1.9.81 → 1.9.83

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 (137) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/data/SKILL.md +132 -465
  3. package/data/cowork/SKILL.md +8 -8
  4. package/data/cursor-plugin/.cursor-plugin/plugin.json +1 -1
  5. package/data/cursor-plugin/CHANGELOG.md +8 -0
  6. package/data/cursor-plugin/commands/notify-when-done.md +1 -1
  7. package/data/cursor-plugin/rules/pushary.mdc +5 -4
  8. package/data/cursor-plugin/skills/pushary/SKILL.md +131 -464
  9. package/data/vscode-plugin/.claude-plugin/plugin.json +1 -1
  10. package/data/vscode-plugin/CHANGELOG.md +8 -0
  11. package/data/vscode-plugin/commands/notify-when-done.md +1 -1
  12. package/data/vscode-plugin/skills/pushary/SKILL.md +131 -464
  13. package/dist/{api-VFUZ5HBR.js → api-EKLKVJQG.js} +11 -11
  14. package/dist/bin/pushary-bell-hook.js +26 -26
  15. package/dist/bin/pushary-bell.js +11 -11
  16. package/dist/bin/pushary-claude.js +27 -27
  17. package/dist/bin/pushary-clean.js +37 -34
  18. package/dist/bin/pushary-codex-bridge.js +22 -22
  19. package/dist/bin/pushary-codex-hook.js +31 -31
  20. package/dist/bin/pushary-codex-session.js +8 -8
  21. package/dist/bin/pushary-codex.js +14 -14
  22. package/dist/bin/pushary-connect.js +27 -27
  23. package/dist/bin/pushary-cowork.js +6 -6
  24. package/dist/bin/pushary-daemon.js +39 -39
  25. package/dist/bin/pushary-disconnect.js +26 -26
  26. package/dist/bin/pushary-display-hook.js +17 -17
  27. package/dist/bin/pushary-doctor.js +48 -44
  28. package/dist/bin/pushary-elicitation-hook.js +26 -26
  29. package/dist/bin/pushary-gemini-bridge.js +16 -16
  30. package/dist/bin/pushary-gemini-hook.js +28 -28
  31. package/dist/bin/pushary-hook.js +30 -30
  32. package/dist/bin/pushary-login.js +21 -21
  33. package/dist/bin/pushary-logout.js +25 -25
  34. package/dist/bin/pushary-mcp.js +12 -12
  35. package/dist/bin/pushary-mode.js +16 -16
  36. package/dist/bin/pushary-notification-hook.js +25 -25
  37. package/dist/bin/pushary-opencode-hook.js +27 -27
  38. package/dist/bin/pushary-permission-denied-hook.js +30 -30
  39. package/dist/bin/pushary-permission-hook.js +30 -30
  40. package/dist/bin/pushary-post-hook.js +25 -25
  41. package/dist/bin/pushary-prompt-hook.js +25 -25
  42. package/dist/bin/pushary-session-end-hook.js +27 -27
  43. package/dist/bin/pushary-session-start-hook.js +35 -35
  44. package/dist/bin/pushary-setup.js +52 -49
  45. package/dist/bin/pushary-stats.js +6 -6
  46. package/dist/bin/pushary-status.js +32 -32
  47. package/dist/bin/pushary-stop-hook.js +25 -25
  48. package/dist/bin/pushary-stopfailure-hook.js +25 -25
  49. package/dist/bin/pushary-suggestions.js +16 -16
  50. package/dist/bin/pushary-transcript-register.js +17 -17
  51. package/dist/bin/pushary-transcripts.js +19 -19
  52. package/dist/bin/pushary-upgrade.js +40 -40
  53. package/dist/bin/pushary-wait.js +16 -16
  54. package/dist/bin/pushary.js +8 -8
  55. package/dist/{chunk-DPP3ZCEE.js → chunk-2B7YU4EK.js} +3 -3
  56. package/dist/{chunk-ALTTZKDU.js → chunk-2BDGGE2G.js} +9 -8
  57. package/dist/{chunk-TTTK44RK.js → chunk-2KVELJZX.js} +1 -1
  58. package/dist/{chunk-4TR4G7A4.js → chunk-35ABA2JQ.js} +1 -1
  59. package/dist/{chunk-X772USE7.js → chunk-42RQG2VG.js} +7 -6
  60. package/dist/{chunk-74QJBFMG.js → chunk-44R5ATBR.js} +2 -2
  61. package/dist/{chunk-5WC7TXSS.js → chunk-46P53RBT.js} +13 -13
  62. package/dist/{chunk-LFEJVQWI.js → chunk-4P256ZAU.js} +6 -6
  63. package/dist/{chunk-NVEDZZ3V.js → chunk-5FM4BQOM.js} +14 -12
  64. package/dist/{chunk-NK3I2QQA.js → chunk-5UPZR3C3.js} +4 -4
  65. package/dist/{chunk-IQQQ2LGB.js → chunk-6BD5ZZLL.js} +5 -5
  66. package/dist/{chunk-TJZIUFWK.js → chunk-6CJ4MSZU.js} +20 -19
  67. package/dist/{chunk-5WIVX2NN.js → chunk-6PWU2LBT.js} +4 -4
  68. package/dist/{chunk-SFUJLUBM.js → chunk-7EIMASAA.js} +1 -1
  69. package/dist/{chunk-KXSZ43Z6.js → chunk-7MRX5JYA.js} +9 -9
  70. package/dist/{chunk-HG5EUDF3.js → chunk-7YYJASRF.js} +2 -2
  71. package/dist/{chunk-AZV3DQQU.js → chunk-A3TMREYJ.js} +4 -4
  72. package/dist/{chunk-PJ26BODT.js → chunk-ACM4OINM.js} +1 -1
  73. package/dist/{chunk-7JU6DPO7.js → chunk-ASEHRBD4.js} +3 -3
  74. package/dist/{chunk-B2HMISVL.js → chunk-B2RDWRKR.js} +86 -46
  75. package/dist/{chunk-QNEWV4JV.js → chunk-BG4YJEFE.js} +1 -1
  76. package/dist/{chunk-K5QN6V5K.js → chunk-BJN7LMMK.js} +9 -6
  77. package/dist/{chunk-3BFCJZBU.js → chunk-BLM6O2QL.js} +1 -1
  78. package/dist/{chunk-DLBUDQEE.js → chunk-BUXMFD5C.js} +4 -4
  79. package/dist/{chunk-M5XNFUXN.js → chunk-C5EWCNJF.js} +1 -1
  80. package/dist/{chunk-35S7VB26.js → chunk-CVPVP4KP.js} +5 -5
  81. package/dist/{chunk-BB4W35D6.js → chunk-ELYJNNXG.js} +10 -10
  82. package/dist/{chunk-VYRJAPZ6.js → chunk-EMT7I74E.js} +3 -3
  83. package/dist/{chunk-NPBPH7KI.js → chunk-FEF3ILT6.js} +2 -2
  84. package/dist/{chunk-ESS7CW3I.js → chunk-FGWRVOBP.js} +5 -5
  85. package/dist/{chunk-LJ4TUZJV.js → chunk-G4HTRKCP.js} +6 -6
  86. package/dist/{chunk-UUASO2FU.js → chunk-GGI6GTBL.js} +4 -4
  87. package/dist/{chunk-RVC7OSC7.js → chunk-GKWPIE6R.js} +1 -1
  88. package/dist/{chunk-KERGWHCK.js → chunk-GMZTABMV.js} +7 -7
  89. package/dist/{chunk-IA53GEP5.js → chunk-HCLP2QBX.js} +6 -6
  90. package/dist/{chunk-ZBST77LF.js → chunk-HIMEVTA5.js} +3 -3
  91. package/dist/{chunk-3YOXBN7V.js → chunk-IBULUTHA.js} +4 -4
  92. package/dist/{chunk-W3VRQEL3.js → chunk-IUZCERPQ.js} +2 -2
  93. package/dist/{chunk-YAAJ3VZA.js → chunk-J2PAQ3HF.js} +6 -6
  94. package/dist/{chunk-WPGSQRMW.js → chunk-JIC5PGNI.js} +17 -11
  95. package/dist/{chunk-YNWEE2WC.js → chunk-KR3KVDXD.js} +1 -1
  96. package/dist/{chunk-WG67W43Y.js → chunk-L4THAI7Q.js} +1 -1
  97. package/dist/{chunk-ZBYZCM6Y.js → chunk-LLQBPDFQ.js} +2 -2
  98. package/dist/{chunk-DF7A5AWF.js → chunk-MA6FJ7U3.js} +3 -3
  99. package/dist/{chunk-ER4UCECJ.js → chunk-MND7HQ4P.js} +1 -1
  100. package/dist/{chunk-ID46TTYS.js → chunk-NDLOWIYO.js} +4 -4
  101. package/dist/{chunk-IO3OLTED.js → chunk-OKZC4FHN.js} +4 -4
  102. package/dist/{chunk-JTO6UPTJ.js → chunk-OUYFUUWB.js} +2 -2
  103. package/dist/{chunk-SEVGKJ7K.js → chunk-QPJQAE2L.js} +4 -4
  104. package/dist/{chunk-JTYZEP4Q.js → chunk-S55CXRFD.js} +1 -1
  105. package/dist/{chunk-JXE4UQFJ.js → chunk-SN22OXY3.js} +1 -1
  106. package/dist/{chunk-BYFFELB3.js → chunk-SSNLMIFR.js} +6 -6
  107. package/dist/{chunk-X2P3O4PX.js → chunk-SVAGMJOH.js} +1 -1
  108. package/dist/{chunk-ONUAAXAW.js → chunk-TBU4WXA4.js} +1 -1
  109. package/dist/{chunk-VII55DVC.js → chunk-TMBLBDPB.js} +2 -2
  110. package/dist/{chunk-YIKIQ6YN.js → chunk-TNWQ6SKS.js} +3 -3
  111. package/dist/{chunk-47RUEZZA.js → chunk-UNEJNC6X.js} +5 -5
  112. package/dist/{chunk-ZIJKTWNO.js → chunk-VBY2AHSX.js} +1 -1
  113. package/dist/{chunk-HNUK557P.js → chunk-VCMDY6YL.js} +3 -3
  114. package/dist/{chunk-IXVMMDIG.js → chunk-VRHVOMH2.js} +3 -3
  115. package/dist/{chunk-FIMSM5SW.js → chunk-VUI4HK5O.js} +2 -2
  116. package/dist/{chunk-GOYYPBBJ.js → chunk-XHHX63PY.js} +3 -3
  117. package/dist/{chunk-7WCB2BC4.js → chunk-XYEGVQST.js} +7 -7
  118. package/dist/{chunk-VK2CHU3L.js → chunk-Y32CL7XZ.js} +1 -1
  119. package/dist/{chunk-IS5YVKUX.js → chunk-YIAJOV2X.js} +7 -5
  120. package/dist/{chunk-CRKODLLY.js → chunk-YZVAAY6B.js} +2 -2
  121. package/dist/{chunk-QZ666HLH.js → chunk-ZGZ2L3QN.js} +5 -5
  122. package/dist/{chunk-LJFB5ZJ4.js → chunk-ZS27XXDA.js} +4 -4
  123. package/dist/{chunk-QTOLNRET.js → chunk-ZVU6WMMU.js} +10 -0
  124. package/dist/{codex-app-cards-switch-ZL6OHUXQ.js → codex-app-cards-switch-CTAOTOCH.js} +12 -12
  125. package/dist/{codex-desktop-launch-LQF5CPKU.js → codex-desktop-launch-2DZVA5C7.js} +1 -1
  126. package/dist/{codex-session-launch-5WBL5YHX.js → codex-session-launch-TMOSTWEH.js} +19 -19
  127. package/dist/{config-MZDRETL2.js → config-OV6WLZXO.js} +3 -3
  128. package/dist/{global-upgrade-HDDPHNGX.js → global-upgrade-FI42NJNL.js} +11 -11
  129. package/dist/{identity-RNZLFMKW.js → identity-PCA25OI5.js} +5 -5
  130. package/dist/{live-capabilities-Y2Q5QBVK.js → live-capabilities-CYFXHTOI.js} +6 -6
  131. package/dist/{paths-WILX6YI3.js → paths-4YFDMUK6.js} +4 -4
  132. package/dist/{reapply-KF7ZZSA2.js → reapply-PBQ46BPS.js} +28 -28
  133. package/dist/src/index.js +29 -29
  134. package/dist/{upgrade-lock-7Q4VWMDA.js → upgrade-lock-22J2AMVY.js} +5 -5
  135. package/dist/usage-7KTINNRK.js +11 -0
  136. package/package.json +1 -1
  137. package/dist/usage-MSILPJVQ.js +0 -11
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pushary-cowork
3
- version: 0.6.0
3
+ version: 0.7.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
@@ -14,7 +14,7 @@ Pushary is connected as a custom connector. It reaches the user on their phone,
14
14
 
15
15
  Honor authorization already granted in this session. Ask only for a missing decision or an action outside that authorization, or when an enforced host policy requires it. A multi-step task alone does not require plan approval. Never ask again merely because the next authorized step deletes, deploys or publishes something. These skills guide the agent; supported hooks and runtime approval gates enforce policy. Do not bypass an enforced gate.
16
16
 
17
- Every question costs the user their attention wherever they are. Before a run of more than a step or two, work out where you will need a human and fold those points together: one `select` carrying the real options beats three `confirm`s in a row, ask once at a boundary rather than once per instance, and never ask what you can determine yourself from the task or from a tool call you can make.
17
+ Every question costs the user their attention wherever they are. Before a run of more than a step or two, work out where you will need a human and fold those points together: one `select` carrying the real options beats three `confirm`s in a row, ask once at a boundary rather than once per instance, and never ask what you can determine yourself from the task or from a tool call you can make. If you would take your default without asking at all, and it is reversible, spends nothing and stays inside the task, do not ask: take it and list the decision in your final message so the user can change it. An irreversible step, spending money or a decision outside your authority still gets a question unless the user already approved it.
18
18
 
19
19
  ## When to reach out
20
20
 
@@ -22,7 +22,7 @@ For a personal reminder later, call `schedule_reminder` with `body` and `inMinut
22
22
 
23
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.
24
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.
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.
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. Ask before you stop only for a specific unresolved decision needed to finish, as described below.
26
26
  - **You are blocked or hit an error you cannot resolve.** Call `send_notification` with `context.type` as `error` so the user knows, and `ask_user` if you need a decision to continue.
27
27
  - **Another skill's workflow says to confirm with the user.** That instruction assumes someone is watching the session. Often nobody is. Route the confirmation through `ask_user` so the run continues when they answer, instead of stalling on a prompt they never see.
28
28
 
@@ -30,11 +30,11 @@ For a personal reminder later, call `schedule_reminder` with `body` and `inMinut
30
30
 
31
31
  The connector carries only the updates and questions you send. Once your turn ends, this connector is no longer listening for answers. It cannot start a new Chat, Cowork, or Claude Code task, so a reply that says "now do X" reaches nobody unless you asked for it before you stopped.
32
32
 
33
- When a specific unresolved decision is needed before you can finish, keep the channel open:
33
+ When a specific unresolved decision is needed before you can finish, ask it before you stop:
34
34
 
35
- 1. Call `send_notification` with `context.type` set to `task_complete` and `context.askQuestion` set to an `input` question, such as "Which of these two drafts should I publish?".
36
- 2. Poll the returned `linkedCorrelationId` once with `wait_for_answer`, then follow its handoff.
37
- 3. Act on the answer in this same session, then hand back the same way again if more work follows.
35
+ 1. Call `ask_user` with the decision, such as "Which of these two drafts should I publish?".
36
+ 2. While it is pending, keep waiting with `wait_for_answer`, then follow its handoff. A question from this connector closes 10 minutes after it is sent; most answers arrive within a minute.
37
+ 3. Act on the answer in this same session. If it closes unanswered, that is not approval: ask in the chat instead.
38
38
 
39
39
  Do not create a question just to keep the turn alive or ask for optional feedback after every result. Once this turn ends, the user must send follow-up work in Claude.
40
40
 
@@ -45,7 +45,7 @@ Read `answered`, `status` and `handoffAction` (falling back to `nextAction`) on
45
45
  Delivery is controlled by the user's policy: `push_first` uses presence, `push_only` requests push every time, `notify_only` leaves the decision in the current client, and `terminal_only` avoids push. Do not override the mode or duplicate a question on every surface. The runtime owns delivery, expiry and settlement; do not claim that a reply can restart an ended agent turn.
46
46
 
47
47
  - If a poll ends while pending, keep waiting with the same question id. Cancel only when explicitly handing off or the answer is no longer needed. If cancellation returns `handoffAction: "stop"`, stop. Otherwise, if cancellation returns false, poll once for 1 second and honor the answer that won the race.
48
- - On long tasks where the user might be away, prefer `send_notification` with `context.askQuestion` over a blocking `ask_user`. The user can answer from the notification page while the question remains live. Poll the returned `linkedCorrelationId` once when you need the result, then follow the returned handoff; do not promise an overnight wait or a reply after the turn ends.
48
+ - Ask with `ask_user`, not with `send_notification` and `context.askQuestion`. Do not promise an overnight wait or a reply after the turn ends.
49
49
  - Use `cancel_question` to retract a question that is no longer needed.
50
50
 
51
51
  ## Answer surfaces and account boundaries
@@ -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.8",
5
+ "version": "0.2.9",
6
6
  "minClientVersions": {
7
7
  "grokbot": "never",
8
8
  "sand": "never"
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.9
4
+
5
+ - The always-on rule no longer sends every question to your phone or asks you to approve a plan for work you already asked for. It asks in the chat when you are there and through `ask_user` when you are away.
6
+ - The bundled Pushary skill asks each question once, on one channel: in the chat when you are there, through `ask_user` when you are away. It no longer sends a question inside a notification.
7
+ - A reversible choice the agent would make anyway, inside the task, is made and listed in its final message instead of asked. An irreversible step, spending money or a decision outside its authority still gets a question.
8
+ - A question that closes unanswered is never approval: the agent does not take the step and asks you in the chat instead.
9
+ - Notification bodies are kept under 180 characters, where the phone cuts them.
10
+
3
11
  ## 0.2.8
4
12
 
5
13
  - Hidden from Grok Bot. This plugin needs an API key and command hooks on your own computer, which a Bot's cloud computer does not have. Grok Bot users install [Pushary for Grok Bot](https://github.com/Pushary/grok-bot-plugin) instead.
@@ -7,7 +7,7 @@ When you finish the current task, send a Pushary push notification so the user k
7
7
 
8
8
  Call `send_notification` with:
9
9
  - `title`: a short summary (under 60 chars) of what was completed
10
- - `body`: one line on the outcome (under 200 chars)
10
+ - `body`: one line on the outcome (under 180 chars)
11
11
  - `agentName`: `"Cursor - {project}"`
12
12
  - `context`: `{ type: "task_complete", summary, filesChanged, nextSteps }`
13
13
 
@@ -9,12 +9,13 @@ Pushary is connected as an MCP server. It reaches the user on their phone, so us
9
9
 
10
10
  ## Ask the user through Pushary
11
11
 
12
- When Pushary is connected, it is your channel for reaching the user. Any time you would stop and ask the user something, ask it through the `ask_user` tool and wait for the answer, instead of only asking in the chat. This covers all of your questions:
12
+ Ask once, on one channel. If the user just wrote to you in this chat and has not said they are leaving, ask there in plain text and wait. Otherwise ask through the `ask_user` tool and wait for the answer:
13
13
 
14
14
  - Yes or no. Use type "confirm".
15
- - Multiple choice. Use type "select" with 2 to 6 options.
15
+ - Multiple choice. Use type "select" with 2 to 6 options, your recommendation first.
16
16
  - A name, a path, a value, or other free text. Use type "input".
17
- - Approval of a plan or an approach before you start. Use type "select" with the options the user is choosing between, or "confirm" to approve a single plan.
17
+
18
+ Do not ask to approve a plan or an approach for work the user already asked for. If you would take your default without asking at all, and it is reversible, spends nothing and stays inside the task, take it and list it in your final message. An irreversible step, a deploy, spending money, or a decision outside your authority still needs a question unless the user already approved it. The risky shell commands below are already gated for you.
18
19
 
19
20
  `ask_user` blocks and returns `{ answered, value, nextAction, handoffAction }`. Always set `context` to one line on what you are doing, and set `agentName` to "Cursor - {project}". If `answered` is false, follow `handoffAction` when present, otherwise `nextAction`: keep waiting with the same correlationId while pending. Cancel only for an explicit handoff or when the answer is no longer needed. Never assume approval.
20
21
 
@@ -34,7 +35,7 @@ Risky shell commands (rm, force push, history rewrites, database drops, deploys,
34
35
 
35
36
  ## Keep it tidy
36
37
 
37
- - Keep titles under 60 characters and bodies under 200. Put detail in the `context` object, not the title.
38
+ - Keep titles under 60 characters and bodies under 180. Put detail in the `context` object, not the title.
38
39
  - Send at most 3 notifications per task unless the user asks for more.
39
40
 
40
41
  For the full tool reference, with every parameter, examples, and return values, see the pushary skill.