@pushary/agent-hooks 1.7.1 → 1.7.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.
- package/CHANGELOG.md +17 -0
- package/dist/bin/pushary-bell-hook.js +23 -23
- package/dist/bin/pushary-bell.js +10 -10
- package/dist/bin/pushary-claude.js +46 -35
- package/dist/bin/pushary-clean.js +107 -60
- package/dist/bin/pushary-codex-bridge.js +18 -17
- package/dist/bin/pushary-codex-hook.js +53 -39
- package/dist/bin/pushary-codex.js +14 -12
- package/dist/bin/pushary-connect.js +16 -16
- package/dist/bin/pushary-cowork.js +5 -5
- package/dist/bin/pushary-daemon.js +27 -27
- package/dist/bin/pushary-disconnect.js +19 -17
- package/dist/bin/pushary-doctor.js +63 -35
- package/dist/bin/pushary-elicitation-hook.js +35 -26
- package/dist/bin/pushary-gemini-bridge.js +12 -12
- package/dist/bin/pushary-gemini-hook.js +47 -32
- package/dist/bin/pushary-hook.js +34 -32
- package/dist/bin/pushary-login.js +16 -16
- package/dist/bin/pushary-logout.js +8 -8
- package/dist/bin/pushary-mcp.js +9 -8
- package/dist/bin/pushary-mode.js +10 -10
- package/dist/bin/pushary-notification-hook.js +29 -27
- package/dist/bin/pushary-opencode-hook.js +46 -32
- package/dist/bin/pushary-permission-denied-hook.js +34 -32
- package/dist/bin/pushary-permission-hook.js +33 -31
- package/dist/bin/pushary-post-hook.js +29 -27
- package/dist/bin/pushary-prompt-hook.js +29 -27
- package/dist/bin/pushary-session-end-hook.js +29 -27
- package/dist/bin/pushary-session-start-hook.js +33 -31
- package/dist/bin/pushary-setup.js +69 -56
- package/dist/bin/pushary-stats.js +5 -5
- package/dist/bin/pushary-status.js +19 -19
- package/dist/bin/pushary-stop-hook.js +29 -27
- package/dist/bin/pushary-stopfailure-hook.js +29 -27
- package/dist/bin/pushary-suggestions.js +5 -5
- package/dist/bin/pushary-transcript-register.js +19 -19
- package/dist/bin/pushary-transcripts.js +7 -7
- package/dist/bin/pushary-upgrade.js +20 -20
- package/dist/bin/pushary-wait.js +10 -10
- package/dist/bin/pushary.js +6 -6
- package/dist/{chunk-WM3U2RUK.js → chunk-2B4XCMH6.js} +75 -232
- package/dist/{chunk-ZIIYTQHC.js → chunk-2XOHXZRC.js} +12 -4
- package/dist/{chunk-3QE3BHBW.js → chunk-3NSRL5E7.js} +2 -2
- package/dist/{chunk-7GI6QC3M.js → chunk-3RO2UWJQ.js} +2 -2
- package/dist/{chunk-AAGLDXH4.js → chunk-4S7CCOXB.js} +5 -5
- package/dist/{chunk-6SJQ442W.js → chunk-5GIBNUBD.js} +2 -2
- package/dist/chunk-5OP5MQI7.js +45 -0
- package/dist/{chunk-EIZW73P5.js → chunk-65RN6ZCO.js} +1 -1
- package/dist/{chunk-6PV2JQ64.js → chunk-6NHXKTQU.js} +2 -2
- package/dist/{chunk-KSNAAMU5.js → chunk-6QZK4O36.js} +4 -4
- package/dist/{chunk-WZWXBTRF.js → chunk-A6WQF7FQ.js} +3 -3
- package/dist/{chunk-62TEPRWQ.js → chunk-AWZNDM3B.js} +1 -1
- package/dist/{chunk-NQFGVAT6.js → chunk-D4OGEWLH.js} +19 -2
- package/dist/{chunk-SVEMF2VO.js → chunk-E3PLF7YB.js} +4 -4
- package/dist/{chunk-MCNS4725.js → chunk-F6BMJOSW.js} +1 -1
- package/dist/{chunk-P5CBNSYL.js → chunk-HOIGXMI7.js} +1 -1
- package/dist/{chunk-XMN37YJH.js → chunk-I7B2DNVU.js} +1 -1
- package/dist/{chunk-ZEMSCGDD.js → chunk-INR3RVQ3.js} +8 -3
- package/dist/{chunk-3QORH5EJ.js → chunk-IZVAVXHQ.js} +6 -4
- package/dist/{chunk-MWVCDP64.js → chunk-JMSB6CJT.js} +1 -1
- package/dist/{chunk-WSC53O7I.js → chunk-KAJT6HPI.js} +3 -3
- package/dist/{chunk-XPMOCJHN.js → chunk-KLXYMPTM.js} +1 -1
- package/dist/{chunk-XDASEYRS.js → chunk-L6IF4JOF.js} +3 -3
- package/dist/{chunk-UPKP67TA.js → chunk-LI3C2IQY.js} +2 -2
- package/dist/{chunk-H6JV44TE.js → chunk-M2JGLFFS.js} +1 -1
- package/dist/chunk-MY3UZO5U.js +99 -0
- package/dist/chunk-N6IOSZOE.js +185 -0
- package/dist/{chunk-454KMJHF.js → chunk-NYBZJ44G.js} +34 -1
- package/dist/{chunk-QPR33SHS.js → chunk-OJRB5QKN.js} +6 -6
- package/dist/{chunk-3T35OE7C.js → chunk-OXEF6JHD.js} +4 -4
- package/dist/{chunk-SNWNA3MQ.js → chunk-PWNQGITG.js} +1 -1
- package/dist/{chunk-XPTCPU6V.js → chunk-Q7CDBJXU.js} +1 -1
- package/dist/{chunk-OTZHT34O.js → chunk-QSZ37ROP.js} +1 -1
- package/dist/{chunk-O5JD7UI5.js → chunk-R7ZETVNR.js} +1 -1
- package/dist/{chunk-4C4NRDIC.js → chunk-RLRDPZG4.js} +1 -1
- package/dist/{chunk-IGBDOZUO.js → chunk-SEIZQZEE.js} +1 -1
- package/dist/{chunk-OAL44FM2.js → chunk-SJN64NJX.js} +1 -1
- package/dist/{chunk-NID4UZDN.js → chunk-SKEW3TQX.js} +1 -1
- package/dist/{chunk-NAAZCNKI.js → chunk-SKMWPXGV.js} +351 -37
- package/dist/{chunk-KBLIVEFJ.js → chunk-T3PRPFDY.js} +5 -5
- package/dist/{chunk-2FU43B5Q.js → chunk-TVJYGZXB.js} +2 -2
- package/dist/{chunk-Y6GKOZBT.js → chunk-U3MS6D5X.js} +1 -1
- package/dist/{chunk-O5PRIYFZ.js → chunk-U4TMAANR.js} +3 -0
- package/dist/{chunk-JTQDP4ZL.js → chunk-UFNBKYWT.js} +3 -3
- package/dist/{chunk-42XR73I2.js → chunk-UUTWHVSV.js} +35 -35
- package/dist/{chunk-43SSQCWO.js → chunk-VQDJ6KB3.js} +3 -3
- package/dist/{chunk-YZKS3ME3.js → chunk-VSGKQ3HI.js} +2 -2
- package/dist/{chunk-XFNVG3OV.js → chunk-WWTLAZQA.js} +24 -7
- package/dist/{chunk-VCMFKZON.js → chunk-WXIVUIXA.js} +2 -2
- package/dist/{chunk-AHWJHLG5.js → chunk-YLCSKVQQ.js} +7 -5
- package/dist/{chunk-Q7QRR6YL.js → chunk-YNJ2H2FD.js} +2 -2
- package/dist/{chunk-BYVB3RX3.js → chunk-YU4222G2.js} +2 -2
- package/dist/{chunk-YQN7S57T.js → chunk-YU54LNC6.js} +6 -6
- package/dist/{chunk-7GYGVQBU.js → chunk-ZMWX5SDA.js} +8 -8
- package/dist/{chunk-55RO62FV.js → chunk-ZUKZJQGR.js} +1 -1
- package/dist/{reapply-66GQIBXN.js → reapply-D6RSDYCK.js} +9 -9
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +22 -20
- package/package.json +2 -1
- package/dist/chunk-JMBG47WV.js +0 -336
- package/dist/chunk-YHG74UFF.js +0 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.7.2
|
|
4
|
+
|
|
5
|
+
- **Approval text shows the whole command again.** A credential name that closes a quoted string, as in `grep -rl "password=" . | xargs rm -f`, made 1.7.1 redact everything after it, so the approval read `grep -rl "password="[redacted]"` and hid the `rm`. The value after a credential name is still redacted, and the rest of the command is shown.
|
|
6
|
+
- **Hermes works again after an uninstall.** When setup found Pushary's own Hermes settings already in `~/.hermes/config.yaml`, left by an earlier install, its record of your config included them, and `pushary clean` put them back: approvals stayed pointed at the plugin clean had just uninstalled, and Hermes' `clarify` tool stayed off, so Hermes could not ask you anything in the terminal. Clean now recognises Pushary's own values in that record, including records older versions wrote, and removes `transport: pushary`, the `pushary` plugin entry, and the `clarify` entry that came with Pushary's transport, while restoring everything else you set. Running clean again, or after the Mac app has disconnected Hermes, no longer fails once Hermes' defaults fill the removed settings back in.
|
|
7
|
+
- `pushary clean` says what it did to Hermes: "Pushary settings removed" only when it changed `config.yaml`, "no Pushary settings" when there was nothing of ours, and it skips the plugin uninstall when the plugin is not installed. `--dry-run` previews the exact change without saving it.
|
|
8
|
+
- `pushary doctor` checks Hermes when Pushary set it up: that the plugin is installed in Hermes' Python and enabled, and whether approvals and questions go through Pushary. A plugin the Mac app left installed but disabled is not reported as a failure.
|
|
9
|
+
- Setup on a machine without npm now says so and asks you to install Node.js, instead of printing `/bin/sh: npm: command not found` and suggesting an `npx` retry that needs npm too. Pushary still needs npm; bun, pnpm and yarn installs are not supported yet.
|
|
10
|
+
- `pushary clean` tells an npm it cannot find, a package that is not installed and a failed uninstall apart, instead of calling each of them "not installed". A failed uninstall no longer ends in "Clean complete".
|
|
11
|
+
- `pushary clean --dry-run` lists only the Mac keychain items and preference domains that exist, and the fx setup record only when there is one. It used to list every candidate it would try. A keychain that cannot be read, for example while locked, still counts as possibly holding Pushary's items, so clean tries them and reports a failure instead of calling the keychain clean.
|
|
12
|
+
- `pushary clean` honours `NO_COLOR`.
|
|
13
|
+
- Setup's agent picker shows only the names you picked once you confirm, instead of repeating every agent's description, and the transcript notice is indented like the lines around it.
|
|
14
|
+
- A message you send from your phone or the Mac notch while Claude Code is running a subagent now waits for Claude Code itself. It used to be handed to the subagent's next tool call, where the main conversation never saw it.
|
|
15
|
+
- When your Pushary workspace has no active subscription, Pushary now steps aside and your agent's own approval prompt decides, as it does when Pushary is not installed. Claude Code, Codex, Gemini CLI and OpenCode used to refuse gated tool calls instead, telling you to retry or that the approval was cancelled, and Claude Code questions, plan approvals and MCP forms stopped the same way. A kill switch and your deny rules still apply.
|
|
16
|
+
- Your agent's terminal says once per session why Pushary stepped aside, with the link to subscribe.
|
|
17
|
+
- A Claude Code or Gemini CLI session started from your phone has no prompt on your machine, so it still refuses the call, now saying the workspace has no active subscription instead of asking you to retry.
|
|
18
|
+
- Pairing your phone during setup now says when your workspace has no active subscription, and to subscribe in the Pushary app or at pushary.com before running setup again. It used to say only that pairing failed.
|
|
19
|
+
|
|
3
20
|
## 1.7.1
|
|
4
21
|
|
|
5
22
|
- **fx asks through Pushary.** Setup now adds `"ask_user_question": "deny"` as the last rule in `~/.fx/settings.json`, which removes fx's own terminal question tool from what its agent can call, so every question goes through `mcp_pushary_ask_user`: to the Mac notch at the Mac, to the phone away from it. fx cannot forward its own prompt, so a question asked there used to wait unseen once you walked away. A rule you already set for `ask_user_question` is kept, and setup names it. The instructions in `~/.fx/AGENTS.md` now tell fx's agent to load `mcp_pushary_ask_user` with `mcp_select_tool` by exact name and to ask there even while you are at the terminal, and to ask in its reply only when Pushary hands the question back or cannot be reached.
|
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
handleBell
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-ZUKZJQGR.js";
|
|
5
5
|
import {
|
|
6
6
|
readHookInput
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
7
|
+
} from "../chunk-3RO2UWJQ.js";
|
|
8
|
+
import "../chunk-ZMWX5SDA.js";
|
|
9
9
|
import "../chunk-SGZJ5LYH.js";
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
17
|
-
import "../chunk-
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
10
|
+
import "../chunk-E3PLF7YB.js";
|
|
11
|
+
import "../chunk-I7B2DNVU.js";
|
|
12
|
+
import "../chunk-JMSB6CJT.js";
|
|
13
|
+
import "../chunk-L6IF4JOF.js";
|
|
14
|
+
import "../chunk-4S7CCOXB.js";
|
|
15
|
+
import "../chunk-A6WQF7FQ.js";
|
|
16
|
+
import "../chunk-KLXYMPTM.js";
|
|
17
|
+
import "../chunk-R7ZETVNR.js";
|
|
18
|
+
import "../chunk-QSZ37ROP.js";
|
|
19
|
+
import "../chunk-Q7CDBJXU.js";
|
|
20
20
|
import "../chunk-XHKBHWLX.js";
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
21
|
+
import "../chunk-RLRDPZG4.js";
|
|
22
|
+
import "../chunk-6QZK4O36.js";
|
|
23
23
|
import "../chunk-POFBE6ZY.js";
|
|
24
24
|
import "../chunk-GMXKITVA.js";
|
|
25
|
-
import "../chunk-
|
|
26
|
-
import "../chunk-
|
|
27
|
-
import "../chunk-
|
|
25
|
+
import "../chunk-VSGKQ3HI.js";
|
|
26
|
+
import "../chunk-UFNBKYWT.js";
|
|
27
|
+
import "../chunk-HOIGXMI7.js";
|
|
28
28
|
import "../chunk-7QLSKOSU.js";
|
|
29
29
|
import "../chunk-KZERVKTD.js";
|
|
30
|
-
import "../chunk-
|
|
31
|
-
import "../chunk-
|
|
30
|
+
import "../chunk-LI3C2IQY.js";
|
|
31
|
+
import "../chunk-NYBZJ44G.js";
|
|
32
32
|
import "../chunk-T7E75EKA.js";
|
|
33
|
-
import "../chunk-
|
|
34
|
-
import "../chunk-
|
|
35
|
-
import "../chunk-
|
|
33
|
+
import "../chunk-SJN64NJX.js";
|
|
34
|
+
import "../chunk-65RN6ZCO.js";
|
|
35
|
+
import "../chunk-WWTLAZQA.js";
|
|
36
36
|
|
|
37
37
|
// bin/pushary-bell-hook.ts
|
|
38
38
|
var main = async () => {
|
package/dist/bin/pushary-bell.js
CHANGED
|
@@ -5,37 +5,37 @@ import {
|
|
|
5
5
|
liveAgentCount,
|
|
6
6
|
ring,
|
|
7
7
|
upgradeThreshold
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-ZUKZJQGR.js";
|
|
9
9
|
import {
|
|
10
10
|
addBellHooks,
|
|
11
11
|
bellInstalled,
|
|
12
12
|
removeBellHooks
|
|
13
|
-
} from "../chunk-
|
|
13
|
+
} from "../chunk-KLXYMPTM.js";
|
|
14
14
|
import {
|
|
15
15
|
createIo
|
|
16
|
-
} from "../chunk-
|
|
16
|
+
} from "../chunk-U4TMAANR.js";
|
|
17
17
|
import {
|
|
18
18
|
exitOnHelpFlag
|
|
19
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-6NHXKTQU.js";
|
|
20
20
|
import {
|
|
21
21
|
parseFlags
|
|
22
22
|
} from "../chunk-GMXKITVA.js";
|
|
23
|
-
import "../chunk-
|
|
23
|
+
import "../chunk-VSGKQ3HI.js";
|
|
24
24
|
import "../chunk-7QLSKOSU.js";
|
|
25
25
|
import {
|
|
26
26
|
EXIT
|
|
27
27
|
} from "../chunk-KZERVKTD.js";
|
|
28
|
-
import "../chunk-
|
|
28
|
+
import "../chunk-LI3C2IQY.js";
|
|
29
29
|
import {
|
|
30
30
|
claudeSettings
|
|
31
|
-
} from "../chunk-
|
|
31
|
+
} from "../chunk-NYBZJ44G.js";
|
|
32
32
|
import {
|
|
33
33
|
readJsonSafe,
|
|
34
34
|
writeJsonAtomic
|
|
35
35
|
} from "../chunk-T7E75EKA.js";
|
|
36
|
-
import "../chunk-
|
|
37
|
-
import "../chunk-
|
|
38
|
-
import "../chunk-
|
|
36
|
+
import "../chunk-SJN64NJX.js";
|
|
37
|
+
import "../chunk-65RN6ZCO.js";
|
|
38
|
+
import "../chunk-WWTLAZQA.js";
|
|
39
39
|
|
|
40
40
|
// bin/pushary-bell.ts
|
|
41
41
|
exitOnHelpFlag("bell");
|
|
@@ -8,58 +8,62 @@ import {
|
|
|
8
8
|
describeIdleWindow,
|
|
9
9
|
startProcessOwnership,
|
|
10
10
|
withSpawnProcessOwnership
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-PWNQGITG.js";
|
|
12
12
|
import {
|
|
13
|
+
announceSubscriptionRequired,
|
|
13
14
|
isDeferAnswer
|
|
14
|
-
} from "../chunk-
|
|
15
|
+
} from "../chunk-5OP5MQI7.js";
|
|
15
16
|
import {
|
|
16
17
|
claudeTranscriptPath,
|
|
17
18
|
loadSessionKey,
|
|
18
19
|
registerTranscript,
|
|
19
20
|
registeredTranscriptEnabled
|
|
20
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-ZMWX5SDA.js";
|
|
21
22
|
import "../chunk-SGZJ5LYH.js";
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-
|
|
25
|
-
import "../chunk-
|
|
23
|
+
import "../chunk-E3PLF7YB.js";
|
|
24
|
+
import "../chunk-I7B2DNVU.js";
|
|
25
|
+
import "../chunk-JMSB6CJT.js";
|
|
26
|
+
import "../chunk-L6IF4JOF.js";
|
|
26
27
|
import {
|
|
27
28
|
ensureDaemonRunning
|
|
28
|
-
} from "../chunk-
|
|
29
|
-
import "../chunk-
|
|
30
|
-
import "../chunk-
|
|
29
|
+
} from "../chunk-4S7CCOXB.js";
|
|
30
|
+
import "../chunk-A6WQF7FQ.js";
|
|
31
|
+
import "../chunk-KLXYMPTM.js";
|
|
31
32
|
import {
|
|
32
33
|
encryptRecord
|
|
33
|
-
} from "../chunk-
|
|
34
|
-
import "../chunk-
|
|
34
|
+
} from "../chunk-R7ZETVNR.js";
|
|
35
|
+
import "../chunk-QSZ37ROP.js";
|
|
35
36
|
import {
|
|
36
37
|
transcriptsEnabled
|
|
37
|
-
} from "../chunk-
|
|
38
|
+
} from "../chunk-Q7CDBJXU.js";
|
|
38
39
|
import {
|
|
39
40
|
needsShell,
|
|
40
41
|
spawnClaude
|
|
41
42
|
} from "../chunk-XHKBHWLX.js";
|
|
42
43
|
import {
|
|
43
|
-
DEFAULT_SESSION,
|
|
44
44
|
UNNAMED_ACTION,
|
|
45
45
|
deriveToolTarget,
|
|
46
46
|
describeToolCall,
|
|
47
47
|
fetchModeState,
|
|
48
48
|
getPolicy,
|
|
49
|
+
phoneDrivenEnv,
|
|
50
|
+
repoKeyFor,
|
|
51
|
+
reportEvent,
|
|
52
|
+
scopePathFor
|
|
53
|
+
} from "../chunk-2B4XCMH6.js";
|
|
54
|
+
import {
|
|
55
|
+
DEFAULT_SESSION,
|
|
49
56
|
markPendingCommandDelivered,
|
|
50
57
|
markPendingCommandFailed,
|
|
51
|
-
phoneDrivenEnv,
|
|
52
58
|
readPendingCommand,
|
|
53
59
|
readPendingCommandById,
|
|
54
60
|
removePendingCommand,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
scopePathFor
|
|
59
|
-
} from "../chunk-WM3U2RUK.js";
|
|
60
|
-
import "../chunk-4C4NRDIC.js";
|
|
61
|
+
savePendingCommand
|
|
62
|
+
} from "../chunk-N6IOSZOE.js";
|
|
63
|
+
import "../chunk-RLRDPZG4.js";
|
|
61
64
|
import {
|
|
62
65
|
DECISION_STOP_REASON,
|
|
66
|
+
UNVERIFIABLE_APPROVAL_REASON,
|
|
63
67
|
askUser,
|
|
64
68
|
cancelQuestion,
|
|
65
69
|
isDecisionStopped,
|
|
@@ -67,33 +71,36 @@ import {
|
|
|
67
71
|
nextLongPollMs,
|
|
68
72
|
waitForAnswer,
|
|
69
73
|
withdrawQuestion
|
|
70
|
-
} from "../chunk-
|
|
71
|
-
import "../chunk-
|
|
74
|
+
} from "../chunk-2XOHXZRC.js";
|
|
75
|
+
import "../chunk-6QZK4O36.js";
|
|
72
76
|
import "../chunk-POFBE6ZY.js";
|
|
73
77
|
import "../chunk-GMXKITVA.js";
|
|
74
|
-
import "../chunk-
|
|
75
|
-
import
|
|
76
|
-
|
|
78
|
+
import "../chunk-VSGKQ3HI.js";
|
|
79
|
+
import {
|
|
80
|
+
SubscriptionRequiredError
|
|
81
|
+
} from "../chunk-D4OGEWLH.js";
|
|
82
|
+
import "../chunk-VQDJ6KB3.js";
|
|
83
|
+
import "../chunk-UFNBKYWT.js";
|
|
77
84
|
import {
|
|
78
85
|
getMachineId
|
|
79
|
-
} from "../chunk-
|
|
86
|
+
} from "../chunk-HOIGXMI7.js";
|
|
80
87
|
import "../chunk-7QLSKOSU.js";
|
|
81
88
|
import "../chunk-KZERVKTD.js";
|
|
82
|
-
import "../chunk-
|
|
83
|
-
import "../chunk-
|
|
89
|
+
import "../chunk-LI3C2IQY.js";
|
|
90
|
+
import "../chunk-NYBZJ44G.js";
|
|
84
91
|
import "../chunk-T7E75EKA.js";
|
|
85
92
|
import {
|
|
86
93
|
getApiKey,
|
|
87
94
|
getBaseUrl
|
|
88
|
-
} from "../chunk-
|
|
95
|
+
} from "../chunk-SJN64NJX.js";
|
|
89
96
|
import {
|
|
90
97
|
NPX_LATEST_COMMAND
|
|
91
|
-
} from "../chunk-
|
|
98
|
+
} from "../chunk-65RN6ZCO.js";
|
|
92
99
|
import {
|
|
93
100
|
KILL_REASON,
|
|
94
101
|
redactSecrets,
|
|
95
102
|
resolveGate
|
|
96
|
-
} from "../chunk-
|
|
103
|
+
} from "../chunk-WWTLAZQA.js";
|
|
97
104
|
|
|
98
105
|
// src/wrapper/localPassthrough.ts
|
|
99
106
|
var SIGNAL_NUMBERS = {
|
|
@@ -425,6 +432,8 @@ var BoundedInputQueue = class {
|
|
|
425
432
|
|
|
426
433
|
// src/wrapper/approver.ts
|
|
427
434
|
var DEFAULT_MAX_CONCURRENT = 16;
|
|
435
|
+
var NO_LOCAL_APPROVAL_UI = "This remote session has no local approval UI. Continue in an interactive session or choose a mode that permits remote approval.";
|
|
436
|
+
var SUBSCRIPTION_REQUIRED_NO_LOCAL_APPROVAL_UI = "Your Pushary workspace has no active subscription, so approvals cannot reach your phone, and this remote session has no local approval UI. Continue in an interactive session.";
|
|
428
437
|
var DEFAULT_APPROVAL_WINDOW_MS = 5 * 6e4;
|
|
429
438
|
var MAX_APPROVAL_WINDOW_MS = 30 * 6e4;
|
|
430
439
|
var allow = (input) => ({
|
|
@@ -528,8 +537,10 @@ var createRemoteApprover = (deps) => {
|
|
|
528
537
|
toolTarget,
|
|
529
538
|
repoKey: repoKeyFor(deps.cwd)
|
|
530
539
|
});
|
|
531
|
-
} catch {
|
|
532
|
-
|
|
540
|
+
} catch (error) {
|
|
541
|
+
if (!(error instanceof SubscriptionRequiredError)) return deny(UNVERIFIABLE_APPROVAL_REASON);
|
|
542
|
+
announceSubscriptionRequired(error.upgradeUrl, sessionId);
|
|
543
|
+
return deny(SUBSCRIPTION_REQUIRED_NO_LOCAL_APPROVAL_UI);
|
|
533
544
|
}
|
|
534
545
|
if (isDecisionStopped(question)) return deny(DECISION_STOP_REASON);
|
|
535
546
|
entry.correlationId = question.correlationId;
|
|
@@ -546,7 +557,7 @@ var createRemoteApprover = (deps) => {
|
|
|
546
557
|
if (isDeferAnswer(answer.value)) return deny("Deferred \u2014 handle it on the machine");
|
|
547
558
|
return answer.value === "yes" ? allow(input) : deny("Denied from your phone");
|
|
548
559
|
}
|
|
549
|
-
if (localHandoff) return deny(
|
|
560
|
+
if (localHandoff) return deny(NO_LOCAL_APPROVAL_UI);
|
|
550
561
|
return applyTimeout(policy, input);
|
|
551
562
|
} catch {
|
|
552
563
|
return deny("Approval unavailable; denied by default");
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
HERMES_CONFIG_SCRIPT,
|
|
4
|
-
HERMES_PIP_PACKAGE,
|
|
5
3
|
PUSHARY_SKILL_NAME,
|
|
6
4
|
PUSHARY_SKILL_SOURCE,
|
|
7
5
|
createGuards,
|
|
8
|
-
resolveHermesPython,
|
|
9
|
-
runHermesPythonScript,
|
|
10
6
|
withoutPusharyCursorHooks
|
|
11
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-MY3UZO5U.js";
|
|
12
8
|
import {
|
|
13
9
|
FX_PROFILE_REFUSALS,
|
|
14
10
|
FX_QUESTION_TOOL,
|
|
15
11
|
FX_SETTINGS_REFUSALS,
|
|
12
|
+
HERMES_PIP_PACKAGE,
|
|
16
13
|
fxProfileText,
|
|
17
14
|
fxSettingsText,
|
|
18
15
|
isFxQuestionRuleReceipt,
|
|
19
16
|
readFxFile,
|
|
20
17
|
readFxProfile,
|
|
21
18
|
readFxSettings,
|
|
19
|
+
readHermesStatus,
|
|
22
20
|
removeInstructionBlock,
|
|
21
|
+
resolveHermesPython,
|
|
22
|
+
runHermesConfigScript,
|
|
23
23
|
shortenHome,
|
|
24
24
|
unregisterPluginLocation,
|
|
25
25
|
vscodeSettingsTargets,
|
|
26
26
|
withoutFxPusharyServer,
|
|
27
27
|
withoutPusharyToolsAllowed,
|
|
28
28
|
withoutQuestionsRoutedToPushary
|
|
29
|
-
} from "../chunk-
|
|
30
|
-
import "../chunk-
|
|
29
|
+
} from "../chunk-SKMWPXGV.js";
|
|
30
|
+
import "../chunk-TVJYGZXB.js";
|
|
31
31
|
import {
|
|
32
32
|
OPENCODE_PLUGIN_SIBLING,
|
|
33
33
|
OPENCODE_PLUGIN_SIBLING_CONTENTS,
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
openCodePluginDir,
|
|
40
40
|
openCodePluginFile,
|
|
41
41
|
removeOpenCodeMcpServer
|
|
42
|
-
} from "../chunk-
|
|
42
|
+
} from "../chunk-SKEW3TQX.js";
|
|
43
43
|
import {
|
|
44
44
|
compatibleConfigFile,
|
|
45
45
|
compatibleInstructionsFile,
|
|
@@ -47,42 +47,47 @@ import {
|
|
|
47
47
|
compatiblePermissionRuleFile,
|
|
48
48
|
removeCompatibleHooks,
|
|
49
49
|
removeCompatibleMcpServer
|
|
50
|
-
} from "../chunk-
|
|
50
|
+
} from "../chunk-T3PRPFDY.js";
|
|
51
51
|
import {
|
|
52
52
|
isClaudeMcpSnapshot,
|
|
53
53
|
removeClaudeMcpServers,
|
|
54
54
|
removePusharySettings,
|
|
55
55
|
removePusharyToolPermissions,
|
|
56
56
|
restoreClaudeMcpServer
|
|
57
|
-
} from "../chunk-
|
|
57
|
+
} from "../chunk-KAJT6HPI.js";
|
|
58
58
|
import {
|
|
59
59
|
hookOwnerOf,
|
|
60
60
|
isHookTakeoverReceipt,
|
|
61
61
|
restoreHookTakeover,
|
|
62
62
|
restoreMcpServer
|
|
63
|
-
} from "../chunk-
|
|
64
|
-
import "../chunk-
|
|
63
|
+
} from "../chunk-E3PLF7YB.js";
|
|
64
|
+
import "../chunk-I7B2DNVU.js";
|
|
65
65
|
import {
|
|
66
66
|
liveBridgeProbe,
|
|
67
67
|
resolveBridgeStub
|
|
68
|
-
} from "../chunk-
|
|
69
|
-
import "../chunk-
|
|
68
|
+
} from "../chunk-JMSB6CJT.js";
|
|
69
|
+
import "../chunk-L6IF4JOF.js";
|
|
70
70
|
import {
|
|
71
71
|
disableDaemonService
|
|
72
|
-
} from "../chunk-
|
|
72
|
+
} from "../chunk-4S7CCOXB.js";
|
|
73
73
|
import {
|
|
74
74
|
removeGeminiSettings
|
|
75
|
-
} from "../chunk-
|
|
76
|
-
import "../chunk-
|
|
75
|
+
} from "../chunk-A6WQF7FQ.js";
|
|
76
|
+
import "../chunk-KLXYMPTM.js";
|
|
77
77
|
import "../chunk-XHKBHWLX.js";
|
|
78
|
-
import "../chunk-
|
|
79
|
-
import "../chunk-
|
|
80
|
-
import "../chunk-
|
|
81
|
-
import "../chunk-
|
|
78
|
+
import "../chunk-2B4XCMH6.js";
|
|
79
|
+
import "../chunk-N6IOSZOE.js";
|
|
80
|
+
import "../chunk-RLRDPZG4.js";
|
|
81
|
+
import "../chunk-2XOHXZRC.js";
|
|
82
|
+
import "../chunk-6QZK4O36.js";
|
|
82
83
|
import "../chunk-POFBE6ZY.js";
|
|
84
|
+
import {
|
|
85
|
+
ansiPainter,
|
|
86
|
+
useColor
|
|
87
|
+
} from "../chunk-U4TMAANR.js";
|
|
83
88
|
import {
|
|
84
89
|
exitOnHelpFlag
|
|
85
|
-
} from "../chunk-
|
|
90
|
+
} from "../chunk-6NHXKTQU.js";
|
|
86
91
|
import {
|
|
87
92
|
rejectUnknownFlags
|
|
88
93
|
} from "../chunk-GMXKITVA.js";
|
|
@@ -90,16 +95,18 @@ import {
|
|
|
90
95
|
CANDIDATE_RCS,
|
|
91
96
|
isDisabledExport,
|
|
92
97
|
removeClaudeAlias
|
|
93
|
-
} from "../chunk-
|
|
94
|
-
import "../chunk-
|
|
95
|
-
import "../chunk-
|
|
96
|
-
import "../chunk-
|
|
98
|
+
} from "../chunk-VSGKQ3HI.js";
|
|
99
|
+
import "../chunk-D4OGEWLH.js";
|
|
100
|
+
import "../chunk-VQDJ6KB3.js";
|
|
101
|
+
import "../chunk-UFNBKYWT.js";
|
|
102
|
+
import "../chunk-HOIGXMI7.js";
|
|
97
103
|
import "../chunk-7QLSKOSU.js";
|
|
98
104
|
import {
|
|
99
105
|
EXIT
|
|
100
106
|
} from "../chunk-KZERVKTD.js";
|
|
101
|
-
import "../chunk-
|
|
107
|
+
import "../chunk-LI3C2IQY.js";
|
|
102
108
|
import {
|
|
109
|
+
AGENT_HOOKS_PACKAGE,
|
|
103
110
|
bridgeAgentKey,
|
|
104
111
|
claudeJson,
|
|
105
112
|
claudeMcpReceipt,
|
|
@@ -122,8 +129,11 @@ import {
|
|
|
122
129
|
fxSettings,
|
|
123
130
|
geminiMd,
|
|
124
131
|
geminiSettings,
|
|
132
|
+
globalPackageState,
|
|
133
|
+
hermesConfig,
|
|
125
134
|
hermesConfigReceipt,
|
|
126
135
|
hookTakeoverReceipt,
|
|
136
|
+
npmIsOnPath,
|
|
127
137
|
pusharyDir,
|
|
128
138
|
readCodexMcpAuth,
|
|
129
139
|
removeCodexHookTrust,
|
|
@@ -131,10 +141,10 @@ import {
|
|
|
131
141
|
restoreCodexHookTrust,
|
|
132
142
|
vscodePluginDir,
|
|
133
143
|
vscodePluginMcp
|
|
134
|
-
} from "../chunk-
|
|
144
|
+
} from "../chunk-NYBZJ44G.js";
|
|
135
145
|
import "../chunk-T7E75EKA.js";
|
|
136
|
-
import "../chunk-
|
|
137
|
-
import "../chunk-
|
|
146
|
+
import "../chunk-SJN64NJX.js";
|
|
147
|
+
import "../chunk-65RN6ZCO.js";
|
|
138
148
|
import {
|
|
139
149
|
HOOK_COMPATIBLE_PROFILES,
|
|
140
150
|
HOOK_LOCATOR_BINARY,
|
|
@@ -142,7 +152,7 @@ import {
|
|
|
142
152
|
SUPPORT_EMAIL,
|
|
143
153
|
isValidApiKey,
|
|
144
154
|
redactSecrets
|
|
145
|
-
} from "../chunk-
|
|
155
|
+
} from "../chunk-WWTLAZQA.js";
|
|
146
156
|
|
|
147
157
|
// bin/pushary-clean.ts
|
|
148
158
|
import { existsSync as existsSync6, readFileSync as readFileSync4, copyFileSync, readdirSync as readdirSync4 } from "fs";
|
|
@@ -169,7 +179,7 @@ var TEST_DEFAULTS_PREFIXES = [
|
|
|
169
179
|
var isTestDefaultsDomain = (domain) => TEST_DEFAULTS_PREFIXES.some((prefix) => domain.startsWith(prefix));
|
|
170
180
|
var leakedTestDefaultsDomains = () => {
|
|
171
181
|
try {
|
|
172
|
-
return execSync("defaults domains", { encoding: "utf-8", timeout: 2e4 }).split(",").map((entry) => entry.trim()).filter(isTestDefaultsDomain);
|
|
182
|
+
return execSync("defaults domains", { encoding: "utf-8", timeout: 2e4 }).split(",").map((entry) => entry.trim()).filter(isTestDefaultsDomain).filter(liveMacStatePresence.defaultsDomain);
|
|
173
183
|
} catch {
|
|
174
184
|
return [];
|
|
175
185
|
}
|
|
@@ -211,6 +221,28 @@ var MAC_KEYCHAIN_ACCOUNTS = [
|
|
|
211
221
|
"cachedEnvironment"
|
|
212
222
|
];
|
|
213
223
|
var MAC_DEFAULTS_DOMAINS = ["com.pushary.app", "pushary-bridge", "pushary.render"];
|
|
224
|
+
var PRESENCE_PROBE_TIMEOUT_MS = 1e4;
|
|
225
|
+
var commandSucceeds = (file, args) => {
|
|
226
|
+
try {
|
|
227
|
+
execFileSync(file, args, { stdio: "ignore", timeout: PRESENCE_PROBE_TIMEOUT_MS });
|
|
228
|
+
return true;
|
|
229
|
+
} catch {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
var KEYCHAIN_ITEM_NOT_FOUND = 44;
|
|
234
|
+
var keychainItemMayExist = (service, account) => {
|
|
235
|
+
try {
|
|
236
|
+
execFileSync("security", ["find-generic-password", "-s", service, "-a", account], { stdio: "ignore" });
|
|
237
|
+
return true;
|
|
238
|
+
} catch (error) {
|
|
239
|
+
return !(error instanceof Error && "status" in error && error.status === KEYCHAIN_ITEM_NOT_FOUND);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
var liveMacStatePresence = {
|
|
243
|
+
keychainItem: keychainItemMayExist,
|
|
244
|
+
defaultsDomain: (domain) => commandSucceeds("defaults", ["read", domain])
|
|
245
|
+
};
|
|
214
246
|
var macLibraryState = (home = homedir()) => [
|
|
215
247
|
join(home, "Library", "Application Support", "Pushary"),
|
|
216
248
|
join(home, "Library", "Caches", "com.pushary.app"),
|
|
@@ -284,7 +316,7 @@ var removeDeveloperLeftovers = (guards2, domains, bundles) => {
|
|
|
284
316
|
}
|
|
285
317
|
return removed;
|
|
286
318
|
};
|
|
287
|
-
var removeMacAppState = (guards2, readServices, home) => {
|
|
319
|
+
var removeMacAppState = (guards2, readServices, home, present) => {
|
|
288
320
|
let removed = 0;
|
|
289
321
|
let failed = 0;
|
|
290
322
|
let services;
|
|
@@ -294,7 +326,7 @@ var removeMacAppState = (guards2, readServices, home) => {
|
|
|
294
326
|
return { removed, failed: 1 };
|
|
295
327
|
}
|
|
296
328
|
for (const service of services) {
|
|
297
|
-
for (const account of MAC_KEYCHAIN_ACCOUNTS) {
|
|
329
|
+
for (const account of MAC_KEYCHAIN_ACCOUNTS.filter((account2) => present.keychainItem(service, account2))) {
|
|
298
330
|
try {
|
|
299
331
|
guards2.execFile(
|
|
300
332
|
"security",
|
|
@@ -308,7 +340,7 @@ var removeMacAppState = (guards2, readServices, home) => {
|
|
|
308
340
|
}
|
|
309
341
|
}
|
|
310
342
|
}
|
|
311
|
-
for (const domain of MAC_DEFAULTS_DOMAINS) {
|
|
343
|
+
for (const domain of MAC_DEFAULTS_DOMAINS.filter(present.defaultsDomain)) {
|
|
312
344
|
try {
|
|
313
345
|
guards2.execFile("defaults", ["delete", domain], { stdio: "ignore", timeout: 1e4 }, `delete preferences ${domain}`);
|
|
314
346
|
removed++;
|
|
@@ -479,11 +511,12 @@ var macAppKeepsMcpEntry = (entryKey, keys) => {
|
|
|
479
511
|
|
|
480
512
|
// bin/pushary-clean.ts
|
|
481
513
|
exitOnHelpFlag("clean");
|
|
482
|
-
var
|
|
483
|
-
var
|
|
484
|
-
var
|
|
485
|
-
var
|
|
486
|
-
var
|
|
514
|
+
var paint = ansiPainter(() => useColor());
|
|
515
|
+
var dim = paint("\x1B[2m");
|
|
516
|
+
var bold = paint("\x1B[1m");
|
|
517
|
+
var green = paint("\x1B[32m");
|
|
518
|
+
var yellow = paint("\x1B[33m");
|
|
519
|
+
var red = paint("\x1B[31m");
|
|
487
520
|
var check = green("\u2713");
|
|
488
521
|
var skip = yellow("\u2013");
|
|
489
522
|
var cross = red("\u2717");
|
|
@@ -494,6 +527,7 @@ var CLAUDE_SETTINGS_LOCAL = claudeSettingsLocal();
|
|
|
494
527
|
var CLAUDE_JSON = claudeJson();
|
|
495
528
|
var CLAUDE_MCP_RECEIPT = claudeMcpReceipt();
|
|
496
529
|
var HERMES_CONFIG_RECEIPT = hermesConfigReceipt();
|
|
530
|
+
var HERMES_CONFIG_FILE = hermesConfig();
|
|
497
531
|
var SKILL_DIR = claudeSkillDir();
|
|
498
532
|
var CURSOR_MCP = cursorUserMcp();
|
|
499
533
|
var CURSOR_PLUGIN_DIR = cursorPluginDir();
|
|
@@ -617,7 +651,7 @@ var removeFxQuestionRule = () => {
|
|
|
617
651
|
if (outcome === "removed") writeFxText(path, fxSettingsText(settings), "fx question rule");
|
|
618
652
|
else if (outcome !== "absent") console.log(` ${skip} fx question rule ${dim(`(${FX_QUESTION_TOOL} in ${path}: ${FX_QUESTION_RULE_KEPT[outcome]})`)}`);
|
|
619
653
|
}
|
|
620
|
-
guardedRemove(fxQuestionRuleReceipt(), { force: true });
|
|
654
|
+
if (existsSync6(fxQuestionRuleReceipt())) guardedRemove(fxQuestionRuleReceipt(), { force: true });
|
|
621
655
|
};
|
|
622
656
|
var removeFxInstructions = () => {
|
|
623
657
|
if (guardedInstructionBlockRemoval(fxAgentsMd())) {
|
|
@@ -1099,18 +1133,27 @@ var main = async () => {
|
|
|
1099
1133
|
removeFxInstructions();
|
|
1100
1134
|
const hermesPython = resolveHermesPython();
|
|
1101
1135
|
if (hermesPython) {
|
|
1102
|
-
const
|
|
1103
|
-
if (
|
|
1136
|
+
const configRun = runHermesConfigScript(hermesPython, dryRun ? "clean-preview" : "clean", HERMES_CONFIG_RECEIPT);
|
|
1137
|
+
if (configRun === "failed") {
|
|
1104
1138
|
incompleteClean = true;
|
|
1105
1139
|
console.log(` ${skip} Hermes config ${dim("(could not update config.yaml)")}`);
|
|
1106
1140
|
} else {
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1141
|
+
if (configRun === "changed") {
|
|
1142
|
+
if (dryRun) wouldNote("rewrite", HERMES_CONFIG_FILE);
|
|
1143
|
+
console.log(` ${check} Hermes config ${dim(did("removed"))} ${dim("(Pushary settings)")}`);
|
|
1144
|
+
} else {
|
|
1145
|
+
console.log(` ${skip} Hermes config ${dim("(no Pushary settings)")}`);
|
|
1146
|
+
}
|
|
1147
|
+
if (readHermesStatus(hermesPython)?.pluginInstalled === false) {
|
|
1148
|
+
console.log(` ${skip} Hermes plugin ${dim("(not installed)")}`);
|
|
1149
|
+
} else {
|
|
1150
|
+
try {
|
|
1151
|
+
guards.execFile(hermesPython, ["-m", "pip", "uninstall", "-y", HERMES_PIP_PACKAGE], { stdio: "pipe", timeout: 6e4 }, `pip uninstall ${HERMES_PIP_PACKAGE}`);
|
|
1152
|
+
console.log(` ${check} Hermes plugin ${dim(did("uninstalled"))}`);
|
|
1153
|
+
} catch {
|
|
1154
|
+
incompleteClean = true;
|
|
1155
|
+
console.log(` ${skip} Hermes plugin ${dim("(could not uninstall; setup receipt kept for retry)")}`);
|
|
1156
|
+
}
|
|
1114
1157
|
}
|
|
1115
1158
|
}
|
|
1116
1159
|
} else if (existsSync6(HERMES_CONFIG_RECEIPT)) {
|
|
@@ -1209,26 +1252,30 @@ var main = async () => {
|
|
|
1209
1252
|
if (leftovers > 0) {
|
|
1210
1253
|
console.log(` ${check} Developer leftovers ${dim(did("removed"))} ${dim(`(${leftovers} leaked test preferences and stale app registrations)`)}`);
|
|
1211
1254
|
}
|
|
1212
|
-
const { removed, failed } = process.platform === "darwin" ? removeMacAppState(guards, storedPusharyKeychainServices, homedir5()) : { removed: 0, failed: 0 };
|
|
1255
|
+
const { removed, failed } = process.platform === "darwin" ? removeMacAppState(guards, storedPusharyKeychainServices, homedir5(), liveMacStatePresence) : { removed: 0, failed: 0 };
|
|
1213
1256
|
if (failed > 0) {
|
|
1214
1257
|
incompleteClean = true;
|
|
1215
1258
|
console.log(` ${cross} Mac keychain ${dim(`(${failed} operations failed; unlock your keychain and re-run)`)}`);
|
|
1216
1259
|
}
|
|
1217
1260
|
if (removed > 0) {
|
|
1218
|
-
console.log(` ${check} Mac app state ${dim(did("removed"))} ${dim(`(${removed} keychain
|
|
1261
|
+
console.log(` ${check} Mac app state ${dim(did("removed"))} ${dim(`(${removed} across the keychain, preferences and caches)`)}`);
|
|
1219
1262
|
} else if (failed === 0) {
|
|
1220
1263
|
console.log(` ${skip} Mac app state ${dim("(nothing of ours in the keychain, preferences or caches)")}`);
|
|
1221
1264
|
}
|
|
1222
1265
|
}
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
} else {
|
|
1227
|
-
execNpm("uninstall -g --no-workspaces @pushary/agent-hooks", { stdio: "ignore", timeout: 3e4 });
|
|
1228
|
-
}
|
|
1229
|
-
console.log(` ${check} Global package ${dim(did("uninstalled"))}`);
|
|
1230
|
-
} catch {
|
|
1266
|
+
if (!npmIsOnPath()) {
|
|
1267
|
+
console.log(` ${skip} Global package ${dim(`(npm not found; remove ${AGENT_HOOKS_PACKAGE} with the tool that installed it)`)}`);
|
|
1268
|
+
} else if (globalPackageState(AGENT_HOOKS_PACKAGE) === "absent") {
|
|
1231
1269
|
console.log(` ${skip} Global package ${dim("(not installed)")}`);
|
|
1270
|
+
} else {
|
|
1271
|
+
try {
|
|
1272
|
+
if (dryRun) wouldNote("run ", `npm uninstall -g ${AGENT_HOOKS_PACKAGE}`);
|
|
1273
|
+
else execNpm(`uninstall -g --no-workspaces ${AGENT_HOOKS_PACKAGE}`, { stdio: "ignore", timeout: 3e4 });
|
|
1274
|
+
console.log(` ${check} Global package ${dim(did("uninstalled"))}`);
|
|
1275
|
+
} catch {
|
|
1276
|
+
incompleteClean = true;
|
|
1277
|
+
console.log(` ${cross} Global package ${dim(`(npm uninstall failed; run npm uninstall -g ${AGENT_HOOKS_PACKAGE})`)}`);
|
|
1278
|
+
}
|
|
1232
1279
|
}
|
|
1233
1280
|
console.log();
|
|
1234
1281
|
if (incompleteClean) {
|