@pushary/agent-hooks 0.87.2 → 0.87.3

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 (63) hide show
  1. package/data/cursor-plugin/hooks/hooks.json +7 -0
  2. package/data/cursor-plugin/scripts/pushary-gate.mjs +85 -28
  3. package/data/cursor-plugin/scripts/pushary-gate.test.mjs +42 -1
  4. package/dist/bin/pushary-bell-hook.js +4 -4
  5. package/dist/bin/pushary-bell.js +7 -6
  6. package/dist/bin/pushary-claude.js +14 -11
  7. package/dist/bin/pushary-clean.js +36 -20
  8. package/dist/bin/pushary-codex-bridge.js +6 -5
  9. package/dist/bin/pushary-codex-hook.js +129 -52
  10. package/dist/bin/pushary-codex.js +4 -3
  11. package/dist/bin/pushary-connect.js +6 -6
  12. package/dist/bin/pushary-daemon.js +5 -4
  13. package/dist/bin/pushary-disconnect.js +65 -8
  14. package/dist/bin/pushary-doctor.js +79 -18
  15. package/dist/bin/pushary-elicitation-hook.js +1 -1
  16. package/dist/bin/pushary-gemini-bridge.js +6 -5
  17. package/dist/bin/pushary-gemini-hook.js +12 -10
  18. package/dist/bin/pushary-hook.js +6 -5
  19. package/dist/bin/pushary-login.js +4 -4
  20. package/dist/bin/pushary-logout.js +5 -4
  21. package/dist/bin/pushary-mode.js +3 -3
  22. package/dist/bin/pushary-notification-hook.js +4 -3
  23. package/dist/bin/pushary-opencode-hook.d.ts +1 -0
  24. package/dist/bin/pushary-opencode-hook.js +329 -0
  25. package/dist/bin/pushary-permission-denied-hook.js +6 -5
  26. package/dist/bin/pushary-permission-hook.js +6 -5
  27. package/dist/bin/pushary-post-hook.js +4 -3
  28. package/dist/bin/pushary-prompt-hook.js +4 -3
  29. package/dist/bin/pushary-session-end-hook.js +4 -3
  30. package/dist/bin/pushary-session-start-hook.js +4 -3
  31. package/dist/bin/pushary-setup.js +238 -84
  32. package/dist/bin/pushary-stats.js +2 -2
  33. package/dist/bin/pushary-status.js +5 -5
  34. package/dist/bin/pushary-stop-hook.js +4 -3
  35. package/dist/bin/pushary-stopfailure-hook.js +4 -3
  36. package/dist/bin/pushary-upgrade.js +7 -6
  37. package/dist/bin/pushary-wait.js +3 -3
  38. package/dist/{chunk-5646VKR4.js → chunk-2JYQAW4B.js} +5 -53
  39. package/dist/chunk-7J67NYK4.js +287 -0
  40. package/dist/{chunk-M7RYIZX6.js → chunk-B7ZBHWOW.js} +10 -1
  41. package/dist/{chunk-7YJS2VTG.js → chunk-DMW54VWK.js} +12 -1
  42. package/dist/{chunk-LT2VLPUK.js → chunk-DPUOW6NS.js} +18 -2
  43. package/dist/{chunk-3LKYBFWA.js → chunk-EJL3PJU7.js} +1 -1
  44. package/dist/chunk-GIRT7677.js +11 -0
  45. package/dist/{chunk-HAUTLCMA.js → chunk-ICERLAE2.js} +1 -1
  46. package/dist/{chunk-ZZE6FN7T.js → chunk-K42RXJPG.js} +52 -1
  47. package/dist/{chunk-Y3UTTFTZ.js → chunk-KBS53WOE.js} +1 -1
  48. package/dist/{chunk-SJVLFIYP.js → chunk-KCAFCGGY.js} +1 -1
  49. package/dist/{chunk-A4I5JGCW.js → chunk-KFAH6KRE.js} +1 -1
  50. package/dist/{chunk-QBWYNVKY.js → chunk-LGVHYFIB.js} +1 -1
  51. package/dist/{chunk-HJ44HIUW.js → chunk-OMA2OZRE.js} +11 -9
  52. package/dist/{chunk-ECEUMWBH.js → chunk-QLMX5LLV.js} +1 -1
  53. package/dist/{chunk-XW5CHAQX.js → chunk-TAYHEJFF.js} +2 -2
  54. package/dist/{chunk-JAICP7BA.js → chunk-TD3M232T.js} +1 -1
  55. package/dist/{chunk-WLLBFDVY.js → chunk-TV3UFGT7.js} +1 -1
  56. package/dist/{chunk-7MBDFNUC.js → chunk-VIHRP25S.js} +1 -1
  57. package/dist/{chunk-B3V2H6SA.js → chunk-VL5ZNK6V.js} +43 -12
  58. package/dist/{chunk-V2XPF77V.js → chunk-VOE4SYPR.js} +42 -279
  59. package/dist/{chunk-OT4YD54Q.js → chunk-YX6ZKCC5.js} +1 -1
  60. package/dist/{chunk-2T3GX7WG.js → chunk-YYTLTEGU.js} +1 -1
  61. package/dist/chunk-ZGC3W23N.js +371 -0
  62. package/dist/src/index.js +6 -5
  63. package/package.json +2 -1
@@ -6,11 +6,12 @@ import {
6
6
  claudeWired,
7
7
  codexWired,
8
8
  geminiWired
9
- } from "../chunk-XW5CHAQX.js";
9
+ } from "../chunk-TAYHEJFF.js";
10
10
  import {
11
11
  readDaemonStatus
12
- } from "../chunk-SJVLFIYP.js";
12
+ } from "../chunk-KCAFCGGY.js";
13
13
  import {
14
+ CURSOR_GATE_EVENTS,
14
15
  agentProbes,
15
16
  detectAgent,
16
17
  detectAllAgents,
@@ -18,12 +19,20 @@ import {
18
19
  isDetected,
19
20
  isPluginRegistered,
20
21
  vscodeSettingsTargets
21
- } from "../chunk-LT2VLPUK.js";
22
+ } from "../chunk-DPUOW6NS.js";
23
+ import {
24
+ OPENCODE_PLUGIN_PLACEHOLDER,
25
+ openCodePluginDir,
26
+ openCodePluginFile,
27
+ openCodeWired
28
+ } from "../chunk-ZGC3W23N.js";
22
29
  import {
23
30
  GEMINI_HOOK_BINARY,
24
31
  hasGeminiHooks,
25
32
  missingGeminiHookEvents
26
- } from "../chunk-ZZE6FN7T.js";
33
+ } from "../chunk-K42RXJPG.js";
34
+ import "../chunk-ATBKJNWS.js";
35
+ import "../chunk-B7ZBHWOW.js";
27
36
  import "../chunk-XHKBHWLX.js";
28
37
  import {
29
38
  execNpm
@@ -47,10 +56,12 @@ import {
47
56
  readCodexMcpAuth,
48
57
  untrustedCodexHookEvents,
49
58
  vscodePluginDir
50
- } from "../chunk-B3V2H6SA.js";
59
+ } from "../chunk-VL5ZNK6V.js";
51
60
  import {
52
61
  readLedgerSummary
53
- } from "../chunk-7MBDFNUC.js";
62
+ } from "../chunk-VIHRP25S.js";
63
+ import "../chunk-GIRT7677.js";
64
+ import "../chunk-7J67NYK4.js";
54
65
  import {
55
66
  getMachineId
56
67
  } from "../chunk-RN3NOEJF.js";
@@ -60,19 +71,19 @@ import {
60
71
  fetchChannels,
61
72
  reachVerdict,
62
73
  verifyRoundTrip
63
- } from "../chunk-3LKYBFWA.js";
74
+ } from "../chunk-EJL3PJU7.js";
64
75
  import "../chunk-3EGEA4KH.js";
65
76
  import {
66
77
  checkApiKey,
67
78
  describeKeyCheck
68
- } from "../chunk-A4I5JGCW.js";
79
+ } from "../chunk-KFAH6KRE.js";
69
80
  import {
70
81
  createIo
71
82
  } from "../chunk-5RUIFDTP.js";
72
83
  import {
73
84
  keyPrefix,
74
85
  readKeySource
75
- } from "../chunk-OT4YD54Q.js";
86
+ } from "../chunk-YX6ZKCC5.js";
76
87
  import {
77
88
  parseFlags
78
89
  } from "../chunk-GMXKITVA.js";
@@ -90,7 +101,7 @@ import {
90
101
  sendMcpRequest
91
102
  } from "../chunk-BSZYIAZL.js";
92
103
  import "../chunk-SAF6HGAA.js";
93
- import "../chunk-Y3UTTFTZ.js";
104
+ import "../chunk-KBS53WOE.js";
94
105
  import {
95
106
  UsageError
96
107
  } from "../chunk-7QLSKOSU.js";
@@ -100,7 +111,7 @@ import {
100
111
  import {
101
112
  getBaseUrl
102
113
  } from "../chunk-2UMNXADU.js";
103
- import "../chunk-7YJS2VTG.js";
114
+ import "../chunk-DMW54VWK.js";
104
115
 
105
116
  // bin/pushary-doctor.ts
106
117
  import { existsSync, readFileSync, writeFileSync } from "fs";
@@ -537,15 +548,23 @@ var main = async () => {
537
548
  checking("Cursor");
538
549
  const cursorUserHooks2 = cursorUserHooks();
539
550
  const userHooks = readJson(cursorUserHooks2);
540
- const gateEntry = userHooks?.hooks?.beforeShellExecution?.find(
541
- (h) => String(h.command ?? "").includes("pushary-gate")
542
- );
543
- if (!gateEntry) {
551
+ const gateEntries = CURSOR_GATE_EVENTS.map((event) => ({
552
+ event,
553
+ entry: userHooks?.hooks?.[event]?.find((h) => String(h.command ?? "").includes("pushary-gate"))
554
+ }));
555
+ const missing = gateEntries.filter(({ entry }) => !entry).map(({ event }) => event);
556
+ if (missing.length === gateEntries.length) {
544
557
  check(false, "Cursor: permission gate registered", "no Pushary gate in ~/.cursor/hooks.json \u2014 re-run setup (a plugin-only hooks.json is never read by Cursor)");
558
+ } else if (missing.length > 0) {
559
+ check(false, "Cursor: permission gate registered", `${missing.join(", ")} not registered \u2014 re-run setup`);
545
560
  } else {
546
- const scriptPath = String(gateEntry.command).match(/"([^"]+)"/)?.[1] ?? "";
547
- const resolves = scriptPath ? existsSync(scriptPath) : false;
548
- check(resolves, "Cursor: permission gate registered", resolves ? `~/.cursor/hooks.json \u2192 ${scriptPath}` : `gate script not found: ${scriptPath || gateEntry.command} \u2014 re-run setup`);
561
+ const paths_ = gateEntries.map(({ entry }) => String(entry.command).match(/"([^"]+)"/)?.[1] ?? "");
562
+ const broken = paths_.filter((path) => !path || !existsSync(path));
563
+ check(
564
+ broken.length === 0,
565
+ "Cursor: permission gate registered",
566
+ broken.length === 0 ? `~/.cursor/hooks.json \u2192 ${paths_[0]} (${gateEntries.length} events)` : `gate script not found: ${broken[0]} \u2014 re-run setup`
567
+ );
549
568
  }
550
569
  const cursorMcp = readJson(join(cursorPluginDir2, "mcp.json"));
551
570
  const cursorServers = cursorMcp?.mcpServers ?? {};
@@ -601,6 +620,48 @@ var main = async () => {
601
620
  } else {
602
621
  skipped("VS Code", installed("vscode") ? "installed, but Pushary is not set up for it" : "not installed");
603
622
  }
623
+ if (openCodeWired()) {
624
+ checking("OpenCode");
625
+ const plugin = openCodePluginFile();
626
+ const contents = (() => {
627
+ try {
628
+ return readFileSync(plugin, "utf-8");
629
+ } catch {
630
+ return "";
631
+ }
632
+ })();
633
+ check(true, "OpenCode: plugin present", plugin);
634
+ const substituted = !contents.includes(OPENCODE_PLUGIN_PLACEHOLDER);
635
+ check(
636
+ substituted,
637
+ "OpenCode: hook command written",
638
+ substituted ? "the plugin carries this machine's command" : "placeholder never replaced \u2014 re-run setup"
639
+ );
640
+ const target = String(contents.match(/const COMMAND = (\[[^\n]*\])/)?.[1] ?? "");
641
+ const argv = (() => {
642
+ try {
643
+ return JSON.parse(target);
644
+ } catch {
645
+ return [];
646
+ }
647
+ })();
648
+ const binary = argv.find((part) => part.includes("/") && part.includes("pushary"));
649
+ if (binary) {
650
+ check(
651
+ existsSync(binary),
652
+ "OpenCode: hook binary resolves",
653
+ existsSync(binary) ? binary : `${binary} is not there \u2014 re-run setup`
654
+ );
655
+ }
656
+ const manifest = join(openCodePluginDir(), "package.json");
657
+ check(
658
+ existsSync(manifest),
659
+ "OpenCode: plugins directory declares ESM",
660
+ existsSync(manifest) ? manifest : `no package.json beside the plugin; Node may load it as CommonJS \u2014 re-run setup`
661
+ );
662
+ } else {
663
+ skipped("OpenCode", installed("opencode") ? "installed, but Pushary is not set up for it" : "not installed");
664
+ }
604
665
  check(
605
666
  agentsChecked.length > 0,
606
667
  "Wired to at least one agent",
@@ -27,7 +27,7 @@ import {
27
27
  hookWaitDeadline,
28
28
  parseAgentQuestionAnswers,
29
29
  renderElicitationOutput
30
- } from "../chunk-7YJS2VTG.js";
30
+ } from "../chunk-DMW54VWK.js";
31
31
 
32
32
  // bin/pushary-elicitation-hook.ts
33
33
  import { basename } from "path";
@@ -5,19 +5,20 @@ import {
5
5
  postLiveSession,
6
6
  postLiveSessionUntilAccepted,
7
7
  startLiveSessionHeartbeat
8
- } from "../chunk-WLLBFDVY.js";
9
- import "../chunk-ECEUMWBH.js";
8
+ } from "../chunk-TV3UFGT7.js";
9
+ import "../chunk-QLMX5LLV.js";
10
10
  import {
11
11
  startProcessOwnership,
12
12
  withSpawnProcessOwnership
13
- } from "../chunk-QBWYNVKY.js";
13
+ } from "../chunk-LGVHYFIB.js";
14
14
  import {
15
15
  spawnClaude
16
16
  } from "../chunk-XHKBHWLX.js";
17
17
  import {
18
18
  resolveBinary
19
19
  } from "../chunk-VT4IVERX.js";
20
- import "../chunk-B3V2H6SA.js";
20
+ import "../chunk-VL5ZNK6V.js";
21
+ import "../chunk-GIRT7677.js";
21
22
  import {
22
23
  getMachineId
23
24
  } from "../chunk-RN3NOEJF.js";
@@ -26,7 +27,7 @@ import {
26
27
  getApiKey,
27
28
  getBaseUrl
28
29
  } from "../chunk-2UMNXADU.js";
29
- import "../chunk-7YJS2VTG.js";
30
+ import "../chunk-DMW54VWK.js";
30
31
 
31
32
  // bin/pushary-gemini-bridge.ts
32
33
  import { existsSync } from "fs";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  isGatingMoment,
4
4
  recordKeylessMoment
5
- } from "../chunk-7MBDFNUC.js";
5
+ } from "../chunk-VIHRP25S.js";
6
6
  import {
7
7
  readHookInput
8
8
  } from "../chunk-6CUUA7HO.js";
@@ -11,10 +11,6 @@ import {
11
11
  isDeferAnswer
12
12
  } from "../chunk-YHG74UFF.js";
13
13
  import {
14
- deriveActionBody,
15
- deriveBlocker,
16
- deriveToolTarget,
17
- describeToolCall,
18
14
  fetchModeState,
19
15
  getPolicy,
20
16
  handlePostToolUse,
@@ -24,9 +20,8 @@ import {
24
20
  readLastPrompt,
25
21
  readLastUserPrompt,
26
22
  repoKeyFor,
27
- reportEvent,
28
- scopePathFor
29
- } from "../chunk-V2XPF77V.js";
23
+ reportEvent
24
+ } from "../chunk-VOE4SYPR.js";
30
25
  import {
31
26
  DEFAULT_SESSION,
32
27
  askUser,
@@ -35,12 +30,19 @@ import {
35
30
  sendNotification,
36
31
  waitForAnswer
37
32
  } from "../chunk-J3YDT4HM.js";
33
+ import {
34
+ deriveActionBody,
35
+ deriveBlocker,
36
+ deriveToolTarget,
37
+ describeToolCall,
38
+ scopePathFor
39
+ } from "../chunk-7J67NYK4.js";
38
40
  import {
39
41
  getMachineId
40
42
  } from "../chunk-RN3NOEJF.js";
41
43
  import "../chunk-BSZYIAZL.js";
42
44
  import "../chunk-SAF6HGAA.js";
43
- import "../chunk-Y3UTTFTZ.js";
45
+ import "../chunk-KBS53WOE.js";
44
46
  import "../chunk-7QLSKOSU.js";
45
47
  import "../chunk-KZERVKTD.js";
46
48
  import {
@@ -54,7 +56,7 @@ import {
54
56
  hookWaitClamped,
55
57
  hookWaitDeadline,
56
58
  resolveGate
57
- } from "../chunk-7YJS2VTG.js";
59
+ } from "../chunk-DMW54VWK.js";
58
60
 
59
61
  // bin/pushary-gemini-hook.ts
60
62
  import { basename } from "path";
@@ -1,15 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  handlePreToolUse
4
- } from "../chunk-HJ44HIUW.js";
4
+ } from "../chunk-OMA2OZRE.js";
5
5
  import "../chunk-ATBKJNWS.js";
6
- import "../chunk-7MBDFNUC.js";
6
+ import "../chunk-VIHRP25S.js";
7
7
  import {
8
8
  readHookInput
9
9
  } from "../chunk-6CUUA7HO.js";
10
10
  import "../chunk-YHG74UFF.js";
11
- import "../chunk-V2XPF77V.js";
11
+ import "../chunk-VOE4SYPR.js";
12
12
  import "../chunk-J3YDT4HM.js";
13
+ import "../chunk-7J67NYK4.js";
13
14
  import "../chunk-RN3NOEJF.js";
14
15
  import {
15
16
  exitOnHelpFlag
@@ -18,11 +19,11 @@ import "../chunk-GOEXZ5QJ.js";
18
19
  import "../chunk-DINDL2CF.js";
19
20
  import "../chunk-BSZYIAZL.js";
20
21
  import "../chunk-SAF6HGAA.js";
21
- import "../chunk-Y3UTTFTZ.js";
22
+ import "../chunk-KBS53WOE.js";
22
23
  import "../chunk-7QLSKOSU.js";
23
24
  import "../chunk-KZERVKTD.js";
24
25
  import "../chunk-2UMNXADU.js";
25
- import "../chunk-7YJS2VTG.js";
26
+ import "../chunk-DMW54VWK.js";
26
27
 
27
28
  // bin/pushary-hook.ts
28
29
  exitOnHelpFlag("hook");
@@ -6,14 +6,14 @@ import "../chunk-3EGEA4KH.js";
6
6
  import {
7
7
  checkApiKey,
8
8
  describeKeyCheck
9
- } from "../chunk-A4I5JGCW.js";
9
+ } from "../chunk-KFAH6KRE.js";
10
10
  import {
11
11
  createIo
12
12
  } from "../chunk-5RUIFDTP.js";
13
13
  import {
14
14
  readKeySource,
15
15
  writeKey
16
- } from "../chunk-OT4YD54Q.js";
16
+ } from "../chunk-YX6ZKCC5.js";
17
17
  import {
18
18
  parseFlags
19
19
  } from "../chunk-GMXKITVA.js";
@@ -27,7 +27,7 @@ import {
27
27
  } from "../chunk-DINDL2CF.js";
28
28
  import "../chunk-6MTNS63X.js";
29
29
  import "../chunk-SAF6HGAA.js";
30
- import "../chunk-Y3UTTFTZ.js";
30
+ import "../chunk-KBS53WOE.js";
31
31
  import {
32
32
  UsageError
33
33
  } from "../chunk-7QLSKOSU.js";
@@ -37,7 +37,7 @@ import {
37
37
  import "../chunk-2UMNXADU.js";
38
38
  import {
39
39
  isValidApiKey
40
- } from "../chunk-7YJS2VTG.js";
40
+ } from "../chunk-DMW54VWK.js";
41
41
 
42
42
  // bin/pushary-login.ts
43
43
  exitOnHelpFlag("login");
@@ -4,14 +4,15 @@ import {
4
4
  codexConfigToml,
5
5
  cursorUserMcp,
6
6
  geminiSettings
7
- } from "../chunk-B3V2H6SA.js";
7
+ } from "../chunk-VL5ZNK6V.js";
8
+ import "../chunk-GIRT7677.js";
8
9
  import {
9
10
  createIo
10
11
  } from "../chunk-5RUIFDTP.js";
11
12
  import {
12
13
  clearKey,
13
14
  readKeySource
14
- } from "../chunk-OT4YD54Q.js";
15
+ } from "../chunk-YX6ZKCC5.js";
15
16
  import {
16
17
  parseFlags
17
18
  } from "../chunk-GMXKITVA.js";
@@ -22,7 +23,7 @@ import "../chunk-GOEXZ5QJ.js";
22
23
  import "../chunk-BC3VCZ3E.js";
23
24
  import "../chunk-DINDL2CF.js";
24
25
  import "../chunk-6MTNS63X.js";
25
- import "../chunk-Y3UTTFTZ.js";
26
+ import "../chunk-KBS53WOE.js";
26
27
  import {
27
28
  UsageError
28
29
  } from "../chunk-7QLSKOSU.js";
@@ -32,7 +33,7 @@ import {
32
33
  import {
33
34
  getBaseUrl
34
35
  } from "../chunk-2UMNXADU.js";
35
- import "../chunk-7YJS2VTG.js";
36
+ import "../chunk-DMW54VWK.js";
36
37
 
37
38
  // bin/pushary-logout.ts
38
39
  import { existsSync } from "fs";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exitOnFailedResponse
4
- } from "../chunk-JAICP7BA.js";
5
- import "../chunk-A4I5JGCW.js";
4
+ } from "../chunk-TD3M232T.js";
5
+ import "../chunk-KFAH6KRE.js";
6
6
  import {
7
7
  createIo
8
8
  } from "../chunk-5RUIFDTP.js";
@@ -25,7 +25,7 @@ import {
25
25
  getApiKey,
26
26
  getBaseUrl
27
27
  } from "../chunk-2UMNXADU.js";
28
- import "../chunk-7YJS2VTG.js";
28
+ import "../chunk-DMW54VWK.js";
29
29
 
30
30
  // bin/pushary-mode.ts
31
31
  exitOnHelpFlag("mode");
@@ -4,16 +4,17 @@ import {
4
4
  } from "../chunk-6CUUA7HO.js";
5
5
  import {
6
6
  handleNotification
7
- } from "../chunk-V2XPF77V.js";
7
+ } from "../chunk-VOE4SYPR.js";
8
8
  import "../chunk-J3YDT4HM.js";
9
+ import "../chunk-7J67NYK4.js";
9
10
  import "../chunk-RN3NOEJF.js";
10
11
  import "../chunk-BSZYIAZL.js";
11
12
  import "../chunk-SAF6HGAA.js";
12
- import "../chunk-Y3UTTFTZ.js";
13
+ import "../chunk-KBS53WOE.js";
13
14
  import "../chunk-7QLSKOSU.js";
14
15
  import "../chunk-KZERVKTD.js";
15
16
  import "../chunk-2UMNXADU.js";
16
- import "../chunk-7YJS2VTG.js";
17
+ import "../chunk-DMW54VWK.js";
17
18
 
18
19
  // bin/pushary-notification-hook.ts
19
20
  var main = async () => {
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node