@pushary/agent-hooks 0.74.0 → 0.76.0
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 +67 -0
- package/data/SKILL.md +14 -6
- package/data/cursor-plugin/CHANGELOG.md +27 -1
- package/data/cursor-plugin/CONTRIBUTING.md +28 -0
- package/data/cursor-plugin/README.md +1 -1
- package/data/cursor-plugin/scripts/pushary-gate.mjs +305 -131
- package/data/cursor-plugin/scripts/pushary-gate.test.mjs +130 -0
- package/data/cursor-plugin/skills/pushary/SKILL.md +14 -6
- package/data/vscode-plugin/CONTRIBUTING.md +28 -0
- package/data/vscode-plugin/skills/pushary/SKILL.md +14 -6
- package/dist/bin/pushary-claude.js +18 -3
- package/dist/bin/pushary-clean.js +5 -5
- package/dist/bin/pushary-codex-hook.js +4 -4
- package/dist/bin/pushary-codex.js +2 -2
- package/dist/bin/pushary-connect.js +3 -3
- package/dist/bin/pushary-doctor.js +7 -7
- package/dist/bin/pushary-gemini-hook.js +4 -4
- package/dist/bin/pushary-hook.js +6 -6
- package/dist/bin/pushary-login.js +2 -2
- package/dist/bin/pushary-logout.js +2 -2
- package/dist/bin/pushary-mode.js +3 -3
- package/dist/bin/pushary-notification-hook.js +2 -2
- package/dist/bin/pushary-permission-denied-hook.js +6 -6
- package/dist/bin/pushary-permission-hook.js +6 -6
- package/dist/bin/pushary-post-hook.js +2 -2
- package/dist/bin/pushary-prompt-hook.js +2 -2
- package/dist/bin/pushary-session-end-hook.js +2 -2
- package/dist/bin/pushary-session-start-hook.js +2 -2
- package/dist/bin/pushary-setup.js +17 -13
- package/dist/bin/pushary-stats.js +2 -2
- package/dist/bin/pushary-status.js +2 -2
- package/dist/bin/pushary-stop-hook.js +2 -2
- package/dist/bin/pushary-stopfailure-hook.js +2 -2
- package/dist/bin/pushary-upgrade.js +4 -4
- package/dist/bin/pushary-wait.js +3 -3
- package/dist/{chunk-Q5QV4I42.js → chunk-3CBPY2G5.js} +1 -1
- package/dist/{chunk-4S3E5DQJ.js → chunk-46UEJXQO.js} +2 -2
- package/dist/{chunk-VQSTA23N.js → chunk-7BBUTWBD.js} +1 -1
- package/dist/{chunk-HAJA47IK.js → chunk-7L57N7WN.js} +1 -1
- package/dist/{chunk-CJET52NP.js → chunk-CC2K2SST.js} +1 -1
- package/dist/{chunk-34HABKL7.js → chunk-DJHWBNM3.js} +5 -5
- package/dist/{chunk-43NDA7LR.js → chunk-DLBW37U6.js} +1 -1
- package/dist/{chunk-3BJUW2SH.js → chunk-IA5GBKNL.js} +1 -1
- package/dist/{chunk-NDCIOAL7.js → chunk-IZA7SWXX.js} +1 -1
- package/dist/{chunk-PZ4UCGWG.js → chunk-QCYN5VXB.js} +1 -1
- package/dist/{chunk-SM7EMSDQ.js → chunk-UPPHYOIZ.js} +2 -2
- package/dist/src/index.js +6 -6
- package/package.json +1 -1
- /package/dist/{chunk-TIZNAOTS.js → chunk-TJJBF73A.js} +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// Parity tests for the vendored policy logic in pushary-gate.mjs.
|
|
2
|
+
//
|
|
3
|
+
// The gate cannot depend on @pushary/contracts — a Cursor plugin is cloned, not
|
|
4
|
+
// installed — so the matcher is vendored. These cases mirror policy.test.ts in
|
|
5
|
+
// the Pushary monorepo. If they drift, Cursor silently resolves a different
|
|
6
|
+
// policy from every other agent, which is the bug this file exists to prevent.
|
|
7
|
+
//
|
|
8
|
+
// Run: node --test scripts/pushary-gate.test.mjs
|
|
9
|
+
|
|
10
|
+
import assert from 'node:assert/strict'
|
|
11
|
+
import { describe, it } from 'node:test'
|
|
12
|
+
import { matchToolPattern, resolvePolicy, isDestructive, normalizeRepoRemote } from './pushary-gate.mjs'
|
|
13
|
+
|
|
14
|
+
const base = {
|
|
15
|
+
defaultTimeoutSeconds: 60,
|
|
16
|
+
defaultTimeoutAction: 'escalate',
|
|
17
|
+
defaultMode: 'push_first',
|
|
18
|
+
defaultPushFirstSeconds: 20,
|
|
19
|
+
}
|
|
20
|
+
const cfg = (...policies) => ({ ...base, policies })
|
|
21
|
+
const allow = { timeoutSeconds: 0, timeoutAction: 'approve', mode: 'terminal_only', pushFirstSeconds: 0 }
|
|
22
|
+
const denyRule = { timeoutSeconds: 0, timeoutAction: 'deny', mode: 'push_only', pushFirstSeconds: 0 }
|
|
23
|
+
const autoApproves = (p) => p.timeoutSeconds === 0 && p.timeoutAction === 'approve'
|
|
24
|
+
|
|
25
|
+
describe('matchToolPattern', () => {
|
|
26
|
+
it('matches bare, exact and prefix forms', () => {
|
|
27
|
+
assert.equal(matchToolPattern('Bash', 'Bash', 'npm test'), 'tool')
|
|
28
|
+
assert.equal(matchToolPattern('Bash(git status)', 'Bash', 'git status'), 'exact')
|
|
29
|
+
assert.equal(matchToolPattern('Bash(npm test:*)', 'Bash', 'npm test -- --watch'), 'prefix')
|
|
30
|
+
assert.equal(matchToolPattern('Bash(npm test:*)', 'Bash', 'npm install'), 'none')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('checks :* before globs so destructive prefixes keep their meaning', () => {
|
|
34
|
+
assert.equal(matchToolPattern('Bash(rm -rf:*)', 'Bash', 'rm -rf /tmp/x'), 'prefix')
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('supports globs', () => {
|
|
38
|
+
assert.equal(matchToolPattern('Bash(deploy *)', 'Bash', 'deploy staging'), 'prefix')
|
|
39
|
+
assert.equal(matchToolPattern('Bash(deploy *)', 'Bash', 'deploy'), 'none')
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('does not backtrack on adversarial star patterns', () => {
|
|
43
|
+
const started = Date.now()
|
|
44
|
+
assert.equal(matchToolPattern(`Bash(${'*'.repeat(8)}x)`, 'Bash', 'a'.repeat(4000)), 'none')
|
|
45
|
+
assert.ok(Date.now() - started < 1000, 'must not backtrack')
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
describe('argument rules, which the gate previously ignored entirely', () => {
|
|
50
|
+
it("honours a user's explicit deny under a broad allow", () => {
|
|
51
|
+
const config = cfg({ tool: 'Bash', ...allow }, { tool: 'Bash(rm:*)', ...denyRule })
|
|
52
|
+
const resolved = resolvePolicy(config, 'Bash', null, 'rm -rf /important', undefined)
|
|
53
|
+
assert.equal(resolved.timeoutAction, 'deny')
|
|
54
|
+
assert.equal(autoApproves(resolved), false)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('honours the preset always-ask rule for force pushes', () => {
|
|
58
|
+
const config = cfg({ tool: 'Bash', ...allow }, { tool: 'Bash(git push:*)', timeoutSeconds: 60, timeoutAction: 'wait', mode: 'push_first', pushFirstSeconds: 20 })
|
|
59
|
+
assert.equal(resolvePolicy(config, 'Bash', null, 'git push --force origin main', undefined).timeoutAction, 'wait')
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('prefers an exact rule over a matching prefix rule', () => {
|
|
63
|
+
const config = cfg({ tool: 'Bash(git:*)', ...denyRule }, { tool: 'Bash(git status)', ...allow })
|
|
64
|
+
assert.equal(autoApproves(resolvePolicy(config, 'Bash', null, 'git status', undefined)), true)
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
describe('destructive ceiling', () => {
|
|
69
|
+
it('refuses to auto-approve a destructive command through a bare-tool allow', () => {
|
|
70
|
+
const resolved = resolvePolicy(cfg({ tool: 'Bash', ...allow }), 'Bash', null, 'rm -rf /important', undefined)
|
|
71
|
+
assert.equal(autoApproves(resolved), false)
|
|
72
|
+
assert.equal(resolved.timeoutAction, 'wait')
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('refuses through a wildcard allow too', () => {
|
|
76
|
+
assert.equal(autoApproves(resolvePolicy(cfg({ tool: '*', ...allow }), 'Bash', null, 'git push --force origin main', undefined)), false)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('still lets an explicit rule the user wrote win', () => {
|
|
80
|
+
const config = cfg({ tool: 'Bash', ...allow }, { tool: 'Bash(rm -rf:*)', ...allow })
|
|
81
|
+
assert.equal(autoApproves(resolvePolicy(config, 'Bash', null, 'rm -rf /tmp/x', undefined)), true)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it('leaves ordinary commands alone', () => {
|
|
85
|
+
assert.equal(autoApproves(resolvePolicy(cfg({ tool: 'Bash', ...allow }), 'Bash', null, 'npm test', undefined)), true)
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
it('flags the classifier set', () => {
|
|
89
|
+
for (const c of ['rm -rf /', 'sudo reboot', 'git reset --hard', 'terraform destroy', 'npm publish', 'DROP TABLE users']) {
|
|
90
|
+
assert.equal(isDestructive(c), true, c)
|
|
91
|
+
}
|
|
92
|
+
assert.equal(isDestructive('npm test'), false)
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
describe('repo scoping', () => {
|
|
97
|
+
const scoped = { tool: 'Bash', repoKey: 'github.com/acme/api', ...denyRule }
|
|
98
|
+
|
|
99
|
+
it('applies a scoped rule only in its own repository', () => {
|
|
100
|
+
assert.equal(resolvePolicy(cfg(scoped), 'Bash', null, 'npm test', 'github.com/acme/api').timeoutAction, 'deny')
|
|
101
|
+
assert.notEqual(resolvePolicy(cfg(scoped), 'Bash', null, 'npm test', 'github.com/acme/web').timeoutAction, 'deny')
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('never applies a scoped rule when the repository is unknown', () => {
|
|
105
|
+
assert.notEqual(resolvePolicy(cfg(scoped), 'Bash', null, 'npm test', undefined).timeoutAction, 'deny')
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('prefers the scoped rule at equal rank', () => {
|
|
109
|
+
const config = cfg({ tool: 'Bash', ...allow }, scoped)
|
|
110
|
+
assert.equal(resolvePolicy(config, 'Bash', null, 'npm test', 'github.com/acme/api').timeoutAction, 'deny')
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
describe('repo identity', () => {
|
|
115
|
+
it('collapses the forms of one remote', () => {
|
|
116
|
+
for (const r of ['https://github.com/acme/api.git', 'git@github.com:acme/api.git', 'ssh://git@github.com:22/acme/api.git']) {
|
|
117
|
+
assert.equal(normalizeRepoRemote(r), 'github.com/acme/api', r)
|
|
118
|
+
}
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
it('never lets a credential survive', () => {
|
|
122
|
+
const key = normalizeRepoRemote('https://user:ghp_SECRET@github.com/acme/api.git')
|
|
123
|
+
assert.equal(key, 'github.com/acme/api')
|
|
124
|
+
assert.ok(!key.includes('ghp_') && !key.includes('@'))
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
it('returns undefined without a stable identity', () => {
|
|
128
|
+
for (const r of ['', '../rel', 'file:///Users/dev/repo']) assert.equal(normalizeRepoRemote(r), undefined, r)
|
|
129
|
+
})
|
|
130
|
+
})
|
|
@@ -53,16 +53,24 @@ If the user runs Claude Code with a Claude Max subscription, Anthropic Remote Co
|
|
|
53
53
|
|
|
54
54
|
## Setup
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
Just run it. No account, no API key, and nothing to paste first:
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
```bash
|
|
59
|
+
npx @pushary/agent-hooks@latest setup
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
It configures MCP, hooks, permissions and the skill in one step, then prints a QR code and waits.
|
|
59
63
|
|
|
60
|
-
|
|
64
|
+
**Show the user your output and ask them to scan that QR with their phone camera.** Scanning pairs their Pushary app, which is what hands this machine its key. A tappable link and a fingerprint print under the QR for a phone already in hand. Do not ask the user for an API key, and do not send them to a signup page first: that is the old flow and it is strictly worse.
|
|
61
65
|
|
|
62
|
-
|
|
66
|
+
Signup starts a 7-day trial and asks for a card up front, which happens in the app.
|
|
67
|
+
|
|
68
|
+
If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
|
|
69
|
+
|
|
70
|
+
No app on their phone yet? They can get it at https://pushary.com/download, or approve in a browser tab instead:
|
|
63
71
|
|
|
64
72
|
```bash
|
|
65
|
-
npx @pushary/agent-hooks@latest setup
|
|
73
|
+
npx @pushary/agent-hooks@latest setup --connect browser
|
|
66
74
|
```
|
|
67
75
|
|
|
68
76
|
Or add Pushary manually to your MCP configuration:
|
|
@@ -81,7 +89,7 @@ Or add Pushary manually to your MCP configuration:
|
|
|
81
89
|
}
|
|
82
90
|
```
|
|
83
91
|
|
|
84
|
-
|
|
92
|
+
Manual configuration needs a key, so it means signing up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copying the key from the dashboard. Prefer `setup` above: it needs neither.
|
|
85
93
|
|
|
86
94
|
After setup, verify with:
|
|
87
95
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for looking. Please read this before opening a pull request, because of
|
|
4
|
+
where this code lives.
|
|
5
|
+
|
|
6
|
+
**This repository is a published copy, not the place the code is written.** The
|
|
7
|
+
source is a directory inside Pushary's private monorepo, and it is pushed here
|
|
8
|
+
whenever it changes. Anything committed directly to this repo is overwritten by
|
|
9
|
+
the next publish.
|
|
10
|
+
|
|
11
|
+
That is not hypothetical. Two pull requests were merged here and then sat
|
|
12
|
+
stranded for a month, because nothing carried them back upstream and the next
|
|
13
|
+
publish would have deleted them.
|
|
14
|
+
|
|
15
|
+
## So what should you do
|
|
16
|
+
|
|
17
|
+
**Open an issue.** Bugs, missing behaviour, a patch you have already written and
|
|
18
|
+
want applied: an issue is read and acted on, and the fix is made upstream and
|
|
19
|
+
published here. Paste your diff into the issue if you have one, and it will be
|
|
20
|
+
credited.
|
|
21
|
+
|
|
22
|
+
**Security issues**: email aadil@pushary.com rather than opening an issue.
|
|
23
|
+
|
|
24
|
+
## If you do open a pull request
|
|
25
|
+
|
|
26
|
+
It will not be merged as a pull request, because merging it would guarantee it
|
|
27
|
+
gets erased. It will be treated as a patch submission: applied upstream, and
|
|
28
|
+
this repo updated on the next publish. You will be told when that has happened.
|
|
@@ -53,16 +53,24 @@ If the user runs Claude Code with a Claude Max subscription, Anthropic Remote Co
|
|
|
53
53
|
|
|
54
54
|
## Setup
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
Just run it. No account, no API key, and nothing to paste first:
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
```bash
|
|
59
|
+
npx @pushary/agent-hooks@latest setup
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
It configures MCP, hooks, permissions and the skill in one step, then prints a QR code and waits.
|
|
59
63
|
|
|
60
|
-
|
|
64
|
+
**Show the user your output and ask them to scan that QR with their phone camera.** Scanning pairs their Pushary app, which is what hands this machine its key. A tappable link and a fingerprint print under the QR for a phone already in hand. Do not ask the user for an API key, and do not send them to a signup page first: that is the old flow and it is strictly worse.
|
|
61
65
|
|
|
62
|
-
|
|
66
|
+
Signup starts a 7-day trial and asks for a card up front, which happens in the app.
|
|
67
|
+
|
|
68
|
+
If `PUSHARY_API_KEY` is already in the environment or in an existing MCP config, setup uses it and skips pairing entirely.
|
|
69
|
+
|
|
70
|
+
No app on their phone yet? They can get it at https://pushary.com/download, or approve in a browser tab instead:
|
|
63
71
|
|
|
64
72
|
```bash
|
|
65
|
-
npx @pushary/agent-hooks@latest setup
|
|
73
|
+
npx @pushary/agent-hooks@latest setup --connect browser
|
|
66
74
|
```
|
|
67
75
|
|
|
68
76
|
Or add Pushary manually to your MCP configuration:
|
|
@@ -81,7 +89,7 @@ Or add Pushary manually to your MCP configuration:
|
|
|
81
89
|
}
|
|
82
90
|
```
|
|
83
91
|
|
|
84
|
-
|
|
92
|
+
Manual configuration needs a key, so it means signing up first at https://pushary.com/sign-up?utm_source=skill&utm_medium=setup and copying the key from the dashboard. Prefer `setup` above: it needs neither.
|
|
85
93
|
|
|
86
94
|
After setup, verify with:
|
|
87
95
|
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
KILL_REASON,
|
|
8
8
|
isDeferAnswer,
|
|
9
9
|
resolveGate
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-UPPHYOIZ.js";
|
|
11
11
|
import {
|
|
12
12
|
askUser,
|
|
13
13
|
cancelQuestion,
|
|
@@ -19,13 +19,13 @@ import {
|
|
|
19
19
|
reportEvent,
|
|
20
20
|
scopePathFor,
|
|
21
21
|
waitForAnswer
|
|
22
|
-
} from "../chunk-
|
|
22
|
+
} from "../chunk-7L57N7WN.js";
|
|
23
23
|
import "../chunk-BSZYIAZL.js";
|
|
24
24
|
import "../chunk-SAF6HGAA.js";
|
|
25
25
|
import "../chunk-7QLSKOSU.js";
|
|
26
26
|
import {
|
|
27
27
|
redactSecrets
|
|
28
|
-
} from "../chunk-
|
|
28
|
+
} from "../chunk-TJJBF73A.js";
|
|
29
29
|
import {
|
|
30
30
|
getMachineId
|
|
31
31
|
} from "../chunk-RN3NOEJF.js";
|
|
@@ -1047,18 +1047,33 @@ var flagValue = (args2, index) => {
|
|
|
1047
1047
|
const next = args2[index + 1];
|
|
1048
1048
|
return next && !next.startsWith("-") ? next : void 0;
|
|
1049
1049
|
};
|
|
1050
|
+
var VALUE_TAKING_FLAGS = /* @__PURE__ */ new Set(["--model", "-m", "--cwd", "--add-dir", "--settings"]);
|
|
1051
|
+
var markValueConsumed = (args2, index, consumed, ownsNextToken) => {
|
|
1052
|
+
if (args2[index]?.includes("=")) return;
|
|
1053
|
+
const next = args2[index + 1];
|
|
1054
|
+
if (next == null) return;
|
|
1055
|
+
if (!ownsNextToken && next.startsWith("-")) return;
|
|
1056
|
+
consumed.add(index + 1);
|
|
1057
|
+
};
|
|
1050
1058
|
var parseRemoteArgs = (args2) => {
|
|
1051
1059
|
let initialPrompt;
|
|
1052
1060
|
let resume;
|
|
1053
1061
|
let permissionMode;
|
|
1062
|
+
const consumedAsValue = /* @__PURE__ */ new Set();
|
|
1054
1063
|
for (let i = 0; i < args2.length; i++) {
|
|
1055
1064
|
const arg = args2[i];
|
|
1065
|
+
if (consumedAsValue.has(i)) continue;
|
|
1056
1066
|
if (arg === "-p" || arg === "--print" || arg?.startsWith("--print=")) {
|
|
1057
1067
|
initialPrompt = flagValue(args2, i);
|
|
1068
|
+
markValueConsumed(args2, i, consumedAsValue, false);
|
|
1058
1069
|
} else if (arg === "-r" || arg === "--resume" || arg?.startsWith("--resume=")) {
|
|
1059
1070
|
resume = flagValue(args2, i);
|
|
1071
|
+
markValueConsumed(args2, i, consumedAsValue, false);
|
|
1060
1072
|
} else if (arg === "--permission-mode" || arg?.startsWith("--permission-mode=")) {
|
|
1061
1073
|
permissionMode = flagValue(args2, i);
|
|
1074
|
+
markValueConsumed(args2, i, consumedAsValue, false);
|
|
1075
|
+
} else if (VALUE_TAKING_FLAGS.has(arg ?? "")) {
|
|
1076
|
+
markValueConsumed(args2, i, consumedAsValue, true);
|
|
1062
1077
|
}
|
|
1063
1078
|
}
|
|
1064
1079
|
return { initialPrompt, resume, permissionMode };
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
import {
|
|
3
3
|
removeClaudeMcpServers,
|
|
4
4
|
removePusharySettings
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-3CBPY2G5.js";
|
|
6
6
|
import {
|
|
7
7
|
removeInstructionBlock,
|
|
8
8
|
shortenHome,
|
|
9
9
|
unregisterPluginLocation,
|
|
10
10
|
vscodeSettingsTargets
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-IZA7SWXX.js";
|
|
12
12
|
import {
|
|
13
13
|
removeGeminiSettings
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-CC2K2SST.js";
|
|
15
15
|
import {
|
|
16
16
|
claudeJson,
|
|
17
17
|
claudeSettings,
|
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
pusharyDir,
|
|
30
30
|
removeCodexHooks,
|
|
31
31
|
vscodePluginDir
|
|
32
|
-
} from "../chunk-
|
|
32
|
+
} from "../chunk-QCYN5VXB.js";
|
|
33
33
|
import {
|
|
34
34
|
removeClaudeAlias
|
|
35
35
|
} from "../chunk-BC3VCZ3E.js";
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
} from "../chunk-BBK3TTU2.js";
|
|
45
45
|
import "../chunk-7OYGFJYZ.js";
|
|
46
46
|
import "../chunk-7QLSKOSU.js";
|
|
47
|
-
import "../chunk-
|
|
47
|
+
import "../chunk-TJJBF73A.js";
|
|
48
48
|
import {
|
|
49
49
|
EXIT
|
|
50
50
|
} from "../chunk-KZERVKTD.js";
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
denyReasonFrom,
|
|
5
5
|
isDeferAnswer,
|
|
6
6
|
resolveGate
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-UPPHYOIZ.js";
|
|
8
8
|
import {
|
|
9
9
|
CODEX_AGENT,
|
|
10
10
|
DEFAULT_SESSION,
|
|
@@ -35,11 +35,11 @@ import {
|
|
|
35
35
|
toPolicyLookup,
|
|
36
36
|
toPolicyLookups,
|
|
37
37
|
waitForAnswer
|
|
38
|
-
} from "../chunk-
|
|
38
|
+
} from "../chunk-7L57N7WN.js";
|
|
39
39
|
import {
|
|
40
40
|
isGatingMoment,
|
|
41
41
|
recordKeylessMoment
|
|
42
|
-
} from "../chunk-
|
|
42
|
+
} from "../chunk-IA5GBKNL.js";
|
|
43
43
|
import "../chunk-BSZYIAZL.js";
|
|
44
44
|
import "../chunk-SAF6HGAA.js";
|
|
45
45
|
import "../chunk-7QLSKOSU.js";
|
|
@@ -48,7 +48,7 @@ import {
|
|
|
48
48
|
effectiveWaitSeconds,
|
|
49
49
|
hookWaitClamped,
|
|
50
50
|
hookWaitDeadline
|
|
51
|
-
} from "../chunk-
|
|
51
|
+
} from "../chunk-TJJBF73A.js";
|
|
52
52
|
import {
|
|
53
53
|
getMachineId
|
|
54
54
|
} from "../chunk-RN3NOEJF.js";
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
askUser,
|
|
4
4
|
reportEvent,
|
|
5
5
|
waitForAnswer
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-7L57N7WN.js";
|
|
7
7
|
import "../chunk-BSZYIAZL.js";
|
|
8
8
|
import "../chunk-SAF6HGAA.js";
|
|
9
9
|
import "../chunk-7QLSKOSU.js";
|
|
10
|
-
import "../chunk-
|
|
10
|
+
import "../chunk-TJJBF73A.js";
|
|
11
11
|
import {
|
|
12
12
|
getMachineId
|
|
13
13
|
} from "../chunk-RN3NOEJF.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
printKeyCheck
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-7BBUTWBD.js";
|
|
5
5
|
import {
|
|
6
6
|
confirmAppConnection,
|
|
7
7
|
connectDevice,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
import "../chunk-6MTNS63X.js";
|
|
15
15
|
import {
|
|
16
16
|
checkApiKey
|
|
17
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-DLBW37U6.js";
|
|
18
18
|
import {
|
|
19
19
|
createIo
|
|
20
20
|
} from "../chunk-TX7KBKT7.js";
|
|
@@ -31,7 +31,7 @@ import "../chunk-SAF6HGAA.js";
|
|
|
31
31
|
import {
|
|
32
32
|
UsageError
|
|
33
33
|
} from "../chunk-7QLSKOSU.js";
|
|
34
|
-
import "../chunk-
|
|
34
|
+
import "../chunk-TJJBF73A.js";
|
|
35
35
|
import "../chunk-2UMNXADU.js";
|
|
36
36
|
import {
|
|
37
37
|
EXIT
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
claudeWired,
|
|
7
7
|
codexWired,
|
|
8
8
|
geminiWired
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-46UEJXQO.js";
|
|
10
10
|
import {
|
|
11
11
|
agentProbes,
|
|
12
12
|
detectAgent,
|
|
@@ -15,12 +15,12 @@ import {
|
|
|
15
15
|
isDetected,
|
|
16
16
|
isPluginRegistered,
|
|
17
17
|
vscodeSettingsTargets
|
|
18
|
-
} from "../chunk-
|
|
18
|
+
} from "../chunk-IZA7SWXX.js";
|
|
19
19
|
import {
|
|
20
20
|
GEMINI_HOOK_BINARY,
|
|
21
21
|
hasGeminiHooks,
|
|
22
22
|
missingGeminiHookEvents
|
|
23
|
-
} from "../chunk-
|
|
23
|
+
} from "../chunk-CC2K2SST.js";
|
|
24
24
|
import {
|
|
25
25
|
claudeJson,
|
|
26
26
|
claudeSettings,
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
readCodexMcpAuth,
|
|
40
40
|
untrustedCodexHookEvents,
|
|
41
41
|
vscodePluginDir
|
|
42
|
-
} from "../chunk-
|
|
42
|
+
} from "../chunk-QCYN5VXB.js";
|
|
43
43
|
import {
|
|
44
44
|
describeReach,
|
|
45
45
|
fetchChannels,
|
|
@@ -54,7 +54,7 @@ import "../chunk-6MTNS63X.js";
|
|
|
54
54
|
import {
|
|
55
55
|
checkApiKey,
|
|
56
56
|
describeKeyCheck
|
|
57
|
-
} from "../chunk-
|
|
57
|
+
} from "../chunk-DLBW37U6.js";
|
|
58
58
|
import {
|
|
59
59
|
createIo
|
|
60
60
|
} from "../chunk-TX7KBKT7.js";
|
|
@@ -73,7 +73,7 @@ import {
|
|
|
73
73
|
} from "../chunk-7OYGFJYZ.js";
|
|
74
74
|
import {
|
|
75
75
|
readLedgerSummary
|
|
76
|
-
} from "../chunk-
|
|
76
|
+
} from "../chunk-IA5GBKNL.js";
|
|
77
77
|
import {
|
|
78
78
|
callMcpTool,
|
|
79
79
|
sendMcpRequest
|
|
@@ -82,7 +82,7 @@ import "../chunk-SAF6HGAA.js";
|
|
|
82
82
|
import {
|
|
83
83
|
UsageError
|
|
84
84
|
} from "../chunk-7QLSKOSU.js";
|
|
85
|
-
import "../chunk-
|
|
85
|
+
import "../chunk-TJJBF73A.js";
|
|
86
86
|
import {
|
|
87
87
|
getMachineId
|
|
88
88
|
} from "../chunk-RN3NOEJF.js";
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
denyReasonFrom,
|
|
5
5
|
isDeferAnswer,
|
|
6
6
|
resolveGate
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-UPPHYOIZ.js";
|
|
8
8
|
import {
|
|
9
9
|
DEFAULT_SESSION,
|
|
10
10
|
askUser,
|
|
@@ -26,11 +26,11 @@ import {
|
|
|
26
26
|
scopePathFor,
|
|
27
27
|
sendNotification,
|
|
28
28
|
waitForAnswer
|
|
29
|
-
} from "../chunk-
|
|
29
|
+
} from "../chunk-7L57N7WN.js";
|
|
30
30
|
import {
|
|
31
31
|
isGatingMoment,
|
|
32
32
|
recordKeylessMoment
|
|
33
|
-
} from "../chunk-
|
|
33
|
+
} from "../chunk-IA5GBKNL.js";
|
|
34
34
|
import "../chunk-BSZYIAZL.js";
|
|
35
35
|
import "../chunk-SAF6HGAA.js";
|
|
36
36
|
import "../chunk-7QLSKOSU.js";
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
effectiveWaitSeconds,
|
|
40
40
|
hookWaitClamped,
|
|
41
41
|
hookWaitDeadline
|
|
42
|
-
} from "../chunk-
|
|
42
|
+
} from "../chunk-TJJBF73A.js";
|
|
43
43
|
import {
|
|
44
44
|
getMachineId
|
|
45
45
|
} from "../chunk-RN3NOEJF.js";
|
package/dist/bin/pushary-hook.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
handlePreToolUse
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-DJHWBNM3.js";
|
|
5
|
+
import "../chunk-3CBPY2G5.js";
|
|
6
6
|
import {
|
|
7
7
|
exitOnHelpFlag
|
|
8
8
|
} from "../chunk-BBK3TTU2.js";
|
|
9
9
|
import "../chunk-7OYGFJYZ.js";
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
10
|
+
import "../chunk-UPPHYOIZ.js";
|
|
11
|
+
import "../chunk-7L57N7WN.js";
|
|
12
|
+
import "../chunk-IA5GBKNL.js";
|
|
13
13
|
import "../chunk-BSZYIAZL.js";
|
|
14
14
|
import "../chunk-SAF6HGAA.js";
|
|
15
15
|
import "../chunk-7QLSKOSU.js";
|
|
16
|
-
import "../chunk-
|
|
16
|
+
import "../chunk-TJJBF73A.js";
|
|
17
17
|
import "../chunk-RN3NOEJF.js";
|
|
18
18
|
import "../chunk-2UMNXADU.js";
|
|
19
19
|
import "../chunk-KZERVKTD.js";
|
|
@@ -11,7 +11,7 @@ import "../chunk-6MTNS63X.js";
|
|
|
11
11
|
import {
|
|
12
12
|
checkApiKey,
|
|
13
13
|
describeKeyCheck
|
|
14
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-DLBW37U6.js";
|
|
15
15
|
import {
|
|
16
16
|
createIo
|
|
17
17
|
} from "../chunk-TX7KBKT7.js";
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
} from "../chunk-7QLSKOSU.js";
|
|
32
32
|
import {
|
|
33
33
|
isValidApiKey
|
|
34
|
-
} from "../chunk-
|
|
34
|
+
} from "../chunk-TJJBF73A.js";
|
|
35
35
|
import "../chunk-2UMNXADU.js";
|
|
36
36
|
import {
|
|
37
37
|
EXIT
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
codexConfigToml,
|
|
5
5
|
cursorUserMcp,
|
|
6
6
|
geminiSettings
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-QCYN5VXB.js";
|
|
8
8
|
import {
|
|
9
9
|
clearKey,
|
|
10
10
|
readKeySource
|
|
@@ -24,7 +24,7 @@ import "../chunk-7OYGFJYZ.js";
|
|
|
24
24
|
import {
|
|
25
25
|
UsageError
|
|
26
26
|
} from "../chunk-7QLSKOSU.js";
|
|
27
|
-
import "../chunk-
|
|
27
|
+
import "../chunk-TJJBF73A.js";
|
|
28
28
|
import {
|
|
29
29
|
getBaseUrl
|
|
30
30
|
} from "../chunk-2UMNXADU.js";
|
package/dist/bin/pushary-mode.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
exitOnFailedResponse
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-7BBUTWBD.js";
|
|
5
|
+
import "../chunk-DLBW37U6.js";
|
|
6
6
|
import {
|
|
7
7
|
createIo
|
|
8
8
|
} from "../chunk-TX7KBKT7.js";
|
|
@@ -17,7 +17,7 @@ import "../chunk-SAF6HGAA.js";
|
|
|
17
17
|
import {
|
|
18
18
|
UsageError
|
|
19
19
|
} from "../chunk-7QLSKOSU.js";
|
|
20
|
-
import "../chunk-
|
|
20
|
+
import "../chunk-TJJBF73A.js";
|
|
21
21
|
import {
|
|
22
22
|
getApiKey,
|
|
23
23
|
getBaseUrl
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
handleNotification
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-7L57N7WN.js";
|
|
5
5
|
import "../chunk-BSZYIAZL.js";
|
|
6
6
|
import "../chunk-SAF6HGAA.js";
|
|
7
7
|
import "../chunk-7QLSKOSU.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-TJJBF73A.js";
|
|
9
9
|
import "../chunk-RN3NOEJF.js";
|
|
10
10
|
import "../chunk-2UMNXADU.js";
|
|
11
11
|
import "../chunk-KZERVKTD.js";
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
handlePermissionDenied
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-DJHWBNM3.js";
|
|
5
|
+
import "../chunk-3CBPY2G5.js";
|
|
6
|
+
import "../chunk-UPPHYOIZ.js";
|
|
7
|
+
import "../chunk-7L57N7WN.js";
|
|
8
|
+
import "../chunk-IA5GBKNL.js";
|
|
9
9
|
import "../chunk-BSZYIAZL.js";
|
|
10
10
|
import "../chunk-SAF6HGAA.js";
|
|
11
11
|
import "../chunk-7QLSKOSU.js";
|
|
12
|
-
import "../chunk-
|
|
12
|
+
import "../chunk-TJJBF73A.js";
|
|
13
13
|
import "../chunk-RN3NOEJF.js";
|
|
14
14
|
import "../chunk-2UMNXADU.js";
|
|
15
15
|
import "../chunk-KZERVKTD.js";
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
handlePermissionRequest
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-DJHWBNM3.js";
|
|
5
|
+
import "../chunk-3CBPY2G5.js";
|
|
6
|
+
import "../chunk-UPPHYOIZ.js";
|
|
7
|
+
import "../chunk-7L57N7WN.js";
|
|
8
|
+
import "../chunk-IA5GBKNL.js";
|
|
9
9
|
import "../chunk-BSZYIAZL.js";
|
|
10
10
|
import "../chunk-SAF6HGAA.js";
|
|
11
11
|
import "../chunk-7QLSKOSU.js";
|
|
12
|
-
import "../chunk-
|
|
12
|
+
import "../chunk-TJJBF73A.js";
|
|
13
13
|
import "../chunk-RN3NOEJF.js";
|
|
14
14
|
import "../chunk-2UMNXADU.js";
|
|
15
15
|
import "../chunk-KZERVKTD.js";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
handlePostToolUse
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-7L57N7WN.js";
|
|
5
5
|
import "../chunk-BSZYIAZL.js";
|
|
6
6
|
import "../chunk-SAF6HGAA.js";
|
|
7
7
|
import "../chunk-7QLSKOSU.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-TJJBF73A.js";
|
|
9
9
|
import "../chunk-RN3NOEJF.js";
|
|
10
10
|
import "../chunk-2UMNXADU.js";
|
|
11
11
|
import "../chunk-KZERVKTD.js";
|