@pushary/agent-hooks 1.9.50 → 1.9.52
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 +22 -0
- package/README.md +9 -1
- package/dist/api-K6ZROHYB.js +55 -0
- package/dist/bin/pushary-bell-hook.js +28 -25
- package/dist/bin/pushary-bell.js +13 -11
- package/dist/bin/pushary-claude.js +37 -33
- package/dist/bin/pushary-clean.js +68 -42
- package/dist/bin/pushary-codex-bridge.js +23 -20
- package/dist/bin/pushary-codex-hook.js +36 -32
- package/dist/bin/pushary-codex-session.js +17 -616
- package/dist/bin/pushary-codex.js +15 -12
- package/dist/bin/pushary-connect.js +31 -28
- package/dist/bin/pushary-cowork.js +7 -6
- package/dist/bin/pushary-daemon.js +57 -52
- package/dist/bin/pushary-disconnect.js +29 -26
- package/dist/bin/pushary-doctor.js +58 -53
- package/dist/bin/pushary-elicitation-hook.js +29 -26
- package/dist/bin/pushary-gemini-bridge.js +17 -15
- package/dist/bin/pushary-gemini-hook.js +33 -29
- package/dist/bin/pushary-hook.js +34 -31
- package/dist/bin/pushary-login.js +19 -16
- package/dist/bin/pushary-logout.js +30 -27
- package/dist/bin/pushary-mcp.js +16 -9
- package/dist/bin/pushary-mode.js +16 -14
- package/dist/bin/pushary-notification-hook.js +27 -24
- package/dist/bin/pushary-opencode-hook.js +32 -28
- package/dist/bin/pushary-permission-denied-hook.js +32 -29
- package/dist/bin/pushary-permission-hook.js +31 -28
- package/dist/bin/pushary-post-hook.js +27 -24
- package/dist/bin/pushary-prompt-hook.js +27 -24
- package/dist/bin/pushary-session-end-hook.js +27 -24
- package/dist/bin/pushary-session-start-hook.js +34 -29
- package/dist/bin/pushary-setup.js +195 -138
- package/dist/bin/pushary-stats.js +8 -7
- package/dist/bin/pushary-status.js +35 -32
- package/dist/bin/pushary-stop-hook.js +27 -24
- package/dist/bin/pushary-stopfailure-hook.js +27 -24
- package/dist/bin/pushary-suggestions.js +16 -14
- package/dist/bin/pushary-transcript-register.js +19 -17
- package/dist/bin/pushary-transcripts.js +10 -9
- package/dist/bin/pushary-upgrade.js +76 -46
- package/dist/bin/pushary-wait.js +16 -14
- package/dist/bin/pushary.js +10 -8
- package/dist/{chunk-GBKSCDEK.js → chunk-2LEH5IGX.js} +17 -4
- package/dist/chunk-36NGFHE4.js +72 -0
- package/dist/{chunk-B7LV6W7U.js → chunk-3RPN7AAT.js} +1 -1
- package/dist/{chunk-GDDXGBTM.js → chunk-46TC24ET.js} +2 -2
- package/dist/{chunk-KEAIIVW3.js → chunk-4QQEUJL4.js} +2 -2
- package/dist/{chunk-XNZB274I.js → chunk-5463UUO2.js} +1 -1
- package/dist/{chunk-FPKQGWAF.js → chunk-56ZTIY6D.js} +2 -2
- package/dist/{chunk-34AQAQKW.js → chunk-63IQRYVP.js} +4 -4
- package/dist/{chunk-25SYEAW4.js → chunk-6C4S3QYD.js} +3 -3
- package/dist/{chunk-4PCJ6DYK.js → chunk-6SWMKF5E.js} +2 -2
- package/dist/{chunk-Y7WD72J7.js → chunk-7CLLWDCP.js} +1 -1
- package/dist/{chunk-WLT6J3SB.js → chunk-ALZZVC3E.js} +2 -2
- package/dist/{chunk-ZMYLVFXC.js → chunk-BL3WAGIK.js} +14 -9
- package/dist/{chunk-PA54A437.js → chunk-BUXDR6US.js} +1 -1
- package/dist/{chunk-VUS6QGND.js → chunk-CQ5JGRML.js} +5 -1
- package/dist/{chunk-IF2UPWD2.js → chunk-DHJSBK63.js} +1 -1
- package/dist/chunk-DMJFW4KL.js +729 -0
- package/dist/{chunk-ABMEBN2R.js → chunk-EK7SZJ4K.js} +6 -4
- package/dist/{chunk-VCZN7NAB.js → chunk-EPOD7QHT.js} +7 -5
- package/dist/{chunk-KIO2MZQC.js → chunk-FCMWUYIE.js} +5 -3
- package/dist/{chunk-YTYXFA5M.js → chunk-FI73DGNB.js} +1 -1
- package/dist/{chunk-JGNYCRB2.js → chunk-FV34HT35.js} +1 -1
- package/dist/{chunk-KK2DIUVV.js → chunk-GCN73COS.js} +1 -1
- package/dist/{chunk-KBGKWB5T.js → chunk-H57DXSHR.js} +4 -2
- package/dist/{chunk-SALUTWPX.js → chunk-IHUFRAHB.js} +4 -4
- package/dist/chunk-JBT3ZSJS.js +92 -0
- package/dist/{chunk-5Q2FRMPC.js → chunk-JOWF4Y4P.js} +4 -4
- package/dist/{chunk-EP6S6VY3.js → chunk-JPABKXK6.js} +6 -6
- package/dist/{chunk-LLRYP5TR.js → chunk-K23WMLPY.js} +5 -5
- package/dist/{chunk-34RXPM5U.js → chunk-L5YTS2BP.js} +3 -3
- package/dist/{chunk-SE4JFMLW.js → chunk-LD4MWJMD.js} +8 -6
- package/dist/{chunk-OR5F63C2.js → chunk-LF3TLC7B.js} +2 -168
- package/dist/{chunk-XTVEW2NG.js → chunk-LIESRXK5.js} +1 -1
- package/dist/{chunk-ZOKMGBPR.js → chunk-MC4VY5LK.js} +16 -5
- package/dist/{chunk-K73CBZKW.js → chunk-MHQB62K5.js} +4 -4
- package/dist/{chunk-DH4BWFU7.js → chunk-MTKV4RUQ.js} +82 -16
- package/dist/{chunk-Y74IJ2IO.js → chunk-N77BH7H2.js} +10 -4
- package/dist/{chunk-ZTTCYHOM.js → chunk-NECZKPJN.js} +31 -6
- package/dist/{chunk-TGCIFEDE.js → chunk-NELH25J7.js} +13 -11
- package/dist/{chunk-HXRH7ZCK.js → chunk-NHVEQLQC.js} +2 -2
- package/dist/{chunk-OW4DNSQ6.js → chunk-NSY2V7XU.js} +1 -1
- package/dist/chunk-OHSHDQZF.js +271 -0
- package/dist/{chunk-ZYYQJSIO.js → chunk-OML4YFBN.js} +44 -462
- package/dist/{chunk-X3RCIOIH.js → chunk-ONCWYACA.js} +1 -1
- package/dist/{chunk-LZYJMSOY.js → chunk-P2546BBI.js} +3 -3
- package/dist/{chunk-WEY5ZHDB.js → chunk-Q7OXI6VS.js} +5 -5
- package/dist/{chunk-APASKZ2I.js → chunk-QKU46TK5.js} +5 -3
- package/dist/chunk-QTOLNRET.js +169 -0
- package/dist/{chunk-TYTIDEBW.js → chunk-RH6KR6EH.js} +5 -5
- package/dist/{chunk-7RMSB4A2.js → chunk-RL7EOD6I.js} +87 -24
- package/dist/{chunk-BOVSUH4N.js → chunk-S6RNS4UL.js} +2 -2
- package/dist/{chunk-LY3OJFBW.js → chunk-T6RIKJUO.js} +2 -1
- package/dist/{chunk-YVO4HIHX.js → chunk-U2L42GVI.js} +12 -10
- package/dist/{chunk-BXK6ZJVJ.js → chunk-UVT6B6XN.js} +2 -2
- package/dist/{chunk-UCF3EZZL.js → chunk-VQPSWD3A.js} +13 -13
- package/dist/{chunk-XH3F66VD.js → chunk-VYBH6D4X.js} +3 -3
- package/dist/chunk-XCEN33UP.js +7 -0
- package/dist/{chunk-GTGXQ7FJ.js → chunk-XDCXTDHH.js} +11 -11
- package/dist/{chunk-OZLGTMIY.js → chunk-XSUJ2PQY.js} +2 -2
- package/dist/chunk-XUW2DRAQ.js +427 -0
- package/dist/{chunk-UHVD7BSV.js → chunk-XZRLFBEA.js} +6 -6
- package/dist/{chunk-AWMMABVB.js → chunk-ZMPR436Z.js} +52 -138
- package/dist/{chunk-PXUNPXOX.js → chunk-ZOP3I2GQ.js} +3 -3
- package/dist/codex-app-cards-switch-OUQ3DUWF.js +52 -0
- package/dist/codex-desktop-launch-EIFLPLB7.js +27 -0
- package/dist/codex-session-launch-KLH2FSSJ.js +331 -0
- package/dist/config-HX6ZNOIL.js +14 -0
- package/dist/{global-upgrade-AIUSS2YH.js → global-upgrade-AZN3BPI3.js} +8 -6
- package/dist/identity-AQIMUWYN.js +15 -0
- package/dist/live-capabilities-4IIFAMHU.js +53 -0
- package/dist/{paths-RO34TYNM.js → paths-X4IPV2WJ.js} +4 -2
- package/dist/{reapply-KTNPP4XE.js → reapply-CXODG53B.js} +27 -21
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.js +22 -19
- package/dist/{upgrade-lock-5UAGXIW7.js → upgrade-lock-AHISGKER.js} +5 -3
- package/dist/usage-ZC6BKIE3.js +10 -0
- package/package.json +1 -1
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CLI_PACKAGE_NAMES,
|
|
3
|
+
OWNERSHIP_PROBE_COMMAND,
|
|
4
|
+
classifyGlobalFolder,
|
|
5
|
+
classifyGlobalInstall,
|
|
6
|
+
cmdShimTarget,
|
|
7
|
+
decideCommandOwner,
|
|
8
|
+
globalInstallTarget,
|
|
9
|
+
globalPackageFolder,
|
|
10
|
+
globalRootFor,
|
|
11
|
+
isReleaseVersion,
|
|
12
|
+
ownPackageName
|
|
13
|
+
} from "./chunk-QTOLNRET.js";
|
|
14
|
+
|
|
15
|
+
// src/npm.ts
|
|
16
|
+
import { promisify } from "util";
|
|
17
|
+
import { exec, execFile, execFileSync, execSync } from "child_process";
|
|
18
|
+
import { existsSync, readFileSync, readlinkSync, realpathSync } from "fs";
|
|
19
|
+
import { dirname, isAbsolute, join, relative, resolve } from "path";
|
|
20
|
+
var latestReleaseUrl = (packageName) => `https://registry.npmjs.org/${packageName}/latest`;
|
|
21
|
+
var REGISTRY_TIMEOUT_MS = 5e3;
|
|
22
|
+
var LATEST_TAG = "latest";
|
|
23
|
+
var cleanNpmEnv = () => {
|
|
24
|
+
const env = {};
|
|
25
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
26
|
+
if (key.toLowerCase().startsWith("npm_config_workspace")) continue;
|
|
27
|
+
env[key] = value;
|
|
28
|
+
}
|
|
29
|
+
return env;
|
|
30
|
+
};
|
|
31
|
+
var NPM_ERROR_METADATA = /^(code|syscall|path|dest|errno)\s/i;
|
|
32
|
+
var npmErrorMessage = (err) => {
|
|
33
|
+
const e = err;
|
|
34
|
+
const text = [e?.stderr, e?.stdout].map((part) => part ? part.toString() : "").join("\n");
|
|
35
|
+
const line = text.split("\n").map((l) => l.replace(/^npm error\s*/i, "").trim()).find((l) => l && !l.startsWith("A complete log") && !NPM_ERROR_METADATA.test(l));
|
|
36
|
+
return line || e?.message || String(err);
|
|
37
|
+
};
|
|
38
|
+
var execNpm = (args, options = {}) => {
|
|
39
|
+
return execSync(`npm ${args}`, {
|
|
40
|
+
timeout: 12e4,
|
|
41
|
+
stdio: "pipe",
|
|
42
|
+
...options,
|
|
43
|
+
env: { ...cleanNpmEnv(), ...options.env ?? {} }
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
var GLOBAL_PREFIX_TIMEOUT_MS = 5e3;
|
|
47
|
+
var readGlobalPrefix = () => {
|
|
48
|
+
try {
|
|
49
|
+
const prefix = execNpm("prefix -g --no-workspaces", { timeout: GLOBAL_PREFIX_TIMEOUT_MS }).toString().trim();
|
|
50
|
+
return prefix === "" ? void 0 : prefix;
|
|
51
|
+
} catch {
|
|
52
|
+
return void 0;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var resolveGlobalBinary = (name) => {
|
|
56
|
+
const prefix = readGlobalPrefix();
|
|
57
|
+
if (prefix === void 0) return void 0;
|
|
58
|
+
return resolveGlobalBinaryAt(name, prefix);
|
|
59
|
+
};
|
|
60
|
+
var resolveGlobalBinaryAt = (name, prefix, platform = process.platform) => {
|
|
61
|
+
const candidates = platform === "win32" ? [join(prefix, `${name}.cmd`), join(prefix, name)] : [join(prefix, "bin", name)];
|
|
62
|
+
return candidates.find(existsSync);
|
|
63
|
+
};
|
|
64
|
+
var resolvePathBinary = (name, platform = process.platform) => {
|
|
65
|
+
try {
|
|
66
|
+
return execFileSync(platform === "win32" ? "where" : "which", [name], {
|
|
67
|
+
encoding: "utf8",
|
|
68
|
+
stdio: "pipe",
|
|
69
|
+
timeout: 5e3
|
|
70
|
+
}).split(/\r?\n/, 1)[0]?.trim() || void 0;
|
|
71
|
+
} catch {
|
|
72
|
+
return void 0;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
var runFileAsync = promisify(execFile);
|
|
76
|
+
var runShellAsync = promisify(exec);
|
|
77
|
+
var DISCOVERY_TIMEOUT_MS = 5e3;
|
|
78
|
+
var refuseDiscoveryAfterStop = (signal) => signal?.throwIfAborted();
|
|
79
|
+
var runNpmDiscovery = (command, signal) => {
|
|
80
|
+
refuseDiscoveryAfterStop(signal);
|
|
81
|
+
const options = { env: cleanNpmEnv(), timeout: DISCOVERY_TIMEOUT_MS, signal };
|
|
82
|
+
return process.platform === "win32" ? runShellAsync(`npm ${command}`, options) : runFileAsync("npm", command.split(" "), options);
|
|
83
|
+
};
|
|
84
|
+
var readGlobalPrefixAsync = async (signal) => {
|
|
85
|
+
try {
|
|
86
|
+
const { stdout } = await runNpmDiscovery("prefix -g --no-workspaces", signal);
|
|
87
|
+
return stdout.trim() || void 0;
|
|
88
|
+
} catch {
|
|
89
|
+
return void 0;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
var resolvePathBinaryAsync = async (name, signal, platform = process.platform) => {
|
|
93
|
+
try {
|
|
94
|
+
refuseDiscoveryAfterStop(signal);
|
|
95
|
+
const { stdout } = await runFileAsync(platform === "win32" ? "where" : "which", [name], {
|
|
96
|
+
timeout: DISCOVERY_TIMEOUT_MS,
|
|
97
|
+
signal
|
|
98
|
+
});
|
|
99
|
+
return stdout.split(/\r?\n/, 1)[0]?.trim() || void 0;
|
|
100
|
+
} catch {
|
|
101
|
+
return void 0;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
var NPM_MISSING_MESSAGE = "npm is not on PATH, and the hooks run from a global npm install.";
|
|
105
|
+
var NPM_LOOKUP = process.platform === "win32" ? "where npm" : "command -v npm";
|
|
106
|
+
var npmIsOnPath = () => {
|
|
107
|
+
try {
|
|
108
|
+
execSync(NPM_LOOKUP, { env: cleanNpmEnv(), stdio: "ignore", timeout: 5e3 });
|
|
109
|
+
return true;
|
|
110
|
+
} catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
var GLOBAL_LIST_TIMEOUT_MS = 3e4;
|
|
115
|
+
var globalPackageState = (name) => {
|
|
116
|
+
try {
|
|
117
|
+
const listing = JSON.parse(execNpm("list -g --depth=0 --json --no-workspaces", { timeout: GLOBAL_LIST_TIMEOUT_MS }).toString());
|
|
118
|
+
const dependencies = typeof listing === "object" && listing !== null && "dependencies" in listing ? listing.dependencies : void 0;
|
|
119
|
+
return typeof dependencies === "object" && dependencies !== null && name in dependencies ? "installed" : "absent";
|
|
120
|
+
} catch {
|
|
121
|
+
return "unknown";
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
var NpmMissingError = class extends Error {
|
|
125
|
+
constructor() {
|
|
126
|
+
super(NPM_MISSING_MESSAGE);
|
|
127
|
+
this.name = "NpmMissingError";
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
var npmPermissionFailureKind = (code, platform) => code === "EPERM" && platform === "win32" ? "file-in-use" : "global-prefix";
|
|
131
|
+
var NpmPermissionError = class extends Error {
|
|
132
|
+
kind;
|
|
133
|
+
constructor(detail, kind) {
|
|
134
|
+
super(detail);
|
|
135
|
+
this.name = "NpmPermissionError";
|
|
136
|
+
this.kind = kind;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
var NpmInstallError = class extends Error {
|
|
140
|
+
constructor(detail) {
|
|
141
|
+
super(detail);
|
|
142
|
+
this.name = "NpmInstallError";
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
var NPM_PERMISSION_CODE = /\b(EACCES|EPERM)\b/;
|
|
146
|
+
var ERROR_TEXT_FIELDS = ["code", "stderr", "stdout", "message"];
|
|
147
|
+
var errorTextOf = (err) => {
|
|
148
|
+
if (typeof err !== "object" || err === null) return [String(err)];
|
|
149
|
+
return ERROR_TEXT_FIELDS.flatMap((field) => {
|
|
150
|
+
const value = Reflect.get(err, field);
|
|
151
|
+
return typeof value === "string" || Buffer.isBuffer(value) ? [value.toString()] : [];
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
var isNpmPermissionCode = (value) => value === "EACCES" || value === "EPERM";
|
|
155
|
+
var npmPermissionCodeOf = (err) => {
|
|
156
|
+
for (const text of errorTextOf(err)) {
|
|
157
|
+
const code = NPM_PERMISSION_CODE.exec(text)?.[1];
|
|
158
|
+
if (isNpmPermissionCode(code)) return code;
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
};
|
|
162
|
+
var npmInstallFailure = (err, platform = process.platform) => {
|
|
163
|
+
const code = npmPermissionCodeOf(err);
|
|
164
|
+
return code === null ? new NpmInstallError(npmErrorMessage(err)) : new NpmPermissionError(npmErrorMessage(err), npmPermissionFailureKind(code, platform));
|
|
165
|
+
};
|
|
166
|
+
var resolveBinary = (name) => resolveGlobalBinary(name) ?? resolvePathBinary(name);
|
|
167
|
+
var resolvePackageVersionFromBinary = (binary, packageName) => {
|
|
168
|
+
try {
|
|
169
|
+
let dir = dirname(realpathSync(binary));
|
|
170
|
+
const packagePath = packageName.split("/");
|
|
171
|
+
for (let depth = 0; depth < 8; depth++) {
|
|
172
|
+
for (const manifest of [
|
|
173
|
+
join(dir, "package.json"),
|
|
174
|
+
join(dir, "node_modules", ...packagePath, "package.json")
|
|
175
|
+
]) {
|
|
176
|
+
try {
|
|
177
|
+
const value = JSON.parse(readFileSync(manifest, "utf8"));
|
|
178
|
+
if (value.name === packageName && typeof value.version === "string") return value.version;
|
|
179
|
+
} catch {
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const parent = dirname(dir);
|
|
183
|
+
if (parent === dir) break;
|
|
184
|
+
dir = parent;
|
|
185
|
+
}
|
|
186
|
+
} catch {
|
|
187
|
+
}
|
|
188
|
+
return void 0;
|
|
189
|
+
};
|
|
190
|
+
var globalPackageVersionIn = (output, name) => {
|
|
191
|
+
const result = JSON.parse(output);
|
|
192
|
+
if (typeof result !== "object" || result === null || !("dependencies" in result)) return void 0;
|
|
193
|
+
const dependencies = result.dependencies;
|
|
194
|
+
if (typeof dependencies !== "object" || dependencies === null || !(name in dependencies)) return void 0;
|
|
195
|
+
const entry = Reflect.get(dependencies, name);
|
|
196
|
+
if (typeof entry !== "object" || entry === null || !("version" in entry)) return void 0;
|
|
197
|
+
return typeof entry.version === "string" ? entry.version : void 0;
|
|
198
|
+
};
|
|
199
|
+
var resolveGlobalPackageVersion = (name) => {
|
|
200
|
+
try {
|
|
201
|
+
return globalPackageVersionIn(execNpm("list -g --depth=0 --json --no-workspaces", { timeout: DISCOVERY_TIMEOUT_MS }).toString(), name);
|
|
202
|
+
} catch {
|
|
203
|
+
return void 0;
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
var resolveGlobalPackageVersionAsync = async (name, signal) => {
|
|
207
|
+
try {
|
|
208
|
+
const { stdout } = await runNpmDiscovery("list -g --depth=0 --json --no-workspaces", signal);
|
|
209
|
+
return globalPackageVersionIn(stdout, name);
|
|
210
|
+
} catch {
|
|
211
|
+
return void 0;
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
var localImportsPresent = (entry, packageDir, seen = /* @__PURE__ */ new Set()) => {
|
|
215
|
+
if (seen.has(entry)) return true;
|
|
216
|
+
seen.add(entry);
|
|
217
|
+
try {
|
|
218
|
+
const source = readFileSync(entry, "utf8");
|
|
219
|
+
for (const match of source.matchAll(/\b(?:import|export)\s+(?:[^"'()]*?\s+from\s+)?["'](\.{1,2}\/[^"']+)["']|\bimport\s*\(\s*["'](\.{1,2}\/[^"']+)["']/g)) {
|
|
220
|
+
const dependency = resolve(dirname(entry), match[1] ?? match[2]);
|
|
221
|
+
const localPath = relative(packageDir, dependency);
|
|
222
|
+
if (localPath.startsWith("..") || isAbsolute(localPath) || !existsSync(dependency)) return false;
|
|
223
|
+
if (/\.[cm]?js$/.test(dependency) && !localImportsPresent(dependency, packageDir, seen)) return false;
|
|
224
|
+
}
|
|
225
|
+
return true;
|
|
226
|
+
} catch {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
var packageBinsPresent = (packageDir, prefix, platform = process.platform, requiredFiles = []) => {
|
|
231
|
+
try {
|
|
232
|
+
const manifest = JSON.parse(readFileSync(join(packageDir, "package.json"), "utf8"));
|
|
233
|
+
if (!manifest.bin || typeof manifest.bin !== "object" || Array.isArray(manifest.bin)) return false;
|
|
234
|
+
const bins = Object.entries(manifest.bin);
|
|
235
|
+
if (bins.length === 0) return false;
|
|
236
|
+
if (!requiredFiles.every((path) => existsSync(join(packageDir, path)))) return false;
|
|
237
|
+
const seen = /* @__PURE__ */ new Set();
|
|
238
|
+
return bins.every(([name, target]) => {
|
|
239
|
+
if (typeof target !== "string") return false;
|
|
240
|
+
const shims = platform === "win32" ? [join(prefix, `${name}.cmd`), join(prefix, name)] : [join(prefix, "bin", name)];
|
|
241
|
+
const entry = join(packageDir, target);
|
|
242
|
+
return existsSync(entry) && shims.some(existsSync) && localImportsPresent(entry, packageDir, seen);
|
|
243
|
+
});
|
|
244
|
+
} catch {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
var AGENT_HOOKS_RUNTIME_FILES = [
|
|
249
|
+
"data/SKILL.md",
|
|
250
|
+
"data/cursor-plugin/.cursor-plugin/plugin.json",
|
|
251
|
+
"data/cursor-plugin/hooks/hooks.json",
|
|
252
|
+
"data/cursor-plugin/mcp.json",
|
|
253
|
+
"data/cursor-plugin/scripts/pushary-gate.mjs",
|
|
254
|
+
"data/cursor-plugin/scripts/redaction.mjs",
|
|
255
|
+
"data/vscode-plugin/.claude-plugin/plugin.json",
|
|
256
|
+
"data/vscode-plugin/hooks/hooks.json",
|
|
257
|
+
"data/vscode-plugin/.mcp.json",
|
|
258
|
+
"data/vscode-plugin/scripts/pushary-gate.mjs",
|
|
259
|
+
"data/vscode-plugin/scripts/redaction.mjs"
|
|
260
|
+
];
|
|
261
|
+
var globalPackageBinsPresent = (name, prefix, platform) => packageBinsPresent(globalPackageFolder(globalRootFor(prefix, platform), name, platform), prefix, platform, AGENT_HOOKS_RUNTIME_FILES);
|
|
262
|
+
var errorCode = (error) => typeof error === "object" && error !== null && "code" in error ? error.code : void 0;
|
|
263
|
+
var realpathOrUndefined = (path) => {
|
|
264
|
+
try {
|
|
265
|
+
return realpathSync(path);
|
|
266
|
+
} catch {
|
|
267
|
+
return void 0;
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
var definedPaths = (paths) => paths.filter((path) => path !== void 0);
|
|
271
|
+
var readPosixCommandLink = (prefix) => {
|
|
272
|
+
const command = join(prefix, "bin", OWNERSHIP_PROBE_COMMAND);
|
|
273
|
+
try {
|
|
274
|
+
const target = resolve(dirname(command), readlinkSync(command));
|
|
275
|
+
return { kind: "resolved", targets: definedPaths([target, realpathOrUndefined(command)]) };
|
|
276
|
+
} catch (error) {
|
|
277
|
+
if (errorCode(error) === "ENOENT") return { kind: "absent" };
|
|
278
|
+
const real = realpathOrUndefined(command);
|
|
279
|
+
return real === void 0 ? { kind: "unreadable" } : { kind: "resolved", targets: [real] };
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
var readWindowsCommandLink = (prefix) => {
|
|
283
|
+
const shim = join(prefix, `${OWNERSHIP_PROBE_COMMAND}.cmd`);
|
|
284
|
+
try {
|
|
285
|
+
const target = cmdShimTarget(prefix, readFileSync(shim, "utf8"));
|
|
286
|
+
return target === void 0 ? { kind: "unreadable" } : { kind: "resolved", targets: [target] };
|
|
287
|
+
} catch (error) {
|
|
288
|
+
return errorCode(error) === "ENOENT" ? { kind: "absent" } : { kind: "unreadable" };
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
var readCommandLink = (prefix, platform) => platform === "win32" ? readWindowsCommandLink(prefix) : readPosixCommandLink(prefix);
|
|
292
|
+
var readFolderManifest = (folder) => {
|
|
293
|
+
try {
|
|
294
|
+
return { kind: "read", manifest: JSON.parse(readFileSync(join(folder, "package.json"), "utf8")) };
|
|
295
|
+
} catch {
|
|
296
|
+
return { kind: "unreadable" };
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
var readGlobalFolder = (root, name, platform = process.platform) => classifyGlobalFolder(name, readFolderManifest(globalPackageFolder(root, name, platform)));
|
|
300
|
+
var installedIfOurs = (folder) => folder.kind === "ours" ? [folder.installed] : [];
|
|
301
|
+
var readInstalledCliPackages = (root, platform = process.platform) => CLI_PACKAGE_NAMES.flatMap((name) => installedIfOurs(readGlobalFolder(root, name, platform)));
|
|
302
|
+
var globalRootsFor = (prefix, platform) => {
|
|
303
|
+
const root = globalRootFor(prefix, platform);
|
|
304
|
+
return definedPaths([root, realpathOrUndefined(root)]);
|
|
305
|
+
};
|
|
306
|
+
var readCommandOwner = (prefix, platform = process.platform) => decideCommandOwner({
|
|
307
|
+
platform,
|
|
308
|
+
globalRoots: globalRootsFor(prefix, platform),
|
|
309
|
+
link: readCommandLink(prefix, platform),
|
|
310
|
+
installed: readInstalledCliPackages(globalRootFor(prefix, platform), platform).map((installed) => installed.name)
|
|
311
|
+
});
|
|
312
|
+
var NPM_UNAVAILABLE_OWNER = { kind: "unknown", reason: "npm_unavailable" };
|
|
313
|
+
var readGlobalCliInstallAt = (prefix, platform = process.platform) => classifyGlobalInstall(readInstalledCliPackages(globalRootFor(prefix, platform), platform), readCommandOwner(prefix, platform));
|
|
314
|
+
var readGlobalCliInstall = (platform = process.platform) => {
|
|
315
|
+
const prefix = readGlobalPrefix();
|
|
316
|
+
return prefix === void 0 ? { kind: "unavailable" } : readGlobalCliInstallAt(prefix, platform);
|
|
317
|
+
};
|
|
318
|
+
var resolveGlobalBinDir = (probe) => {
|
|
319
|
+
if (process.platform === "win32") return void 0;
|
|
320
|
+
const resolved = resolveGlobalBinary(probe);
|
|
321
|
+
return resolved ? resolved.slice(0, resolved.length - probe.length - 1) : void 0;
|
|
322
|
+
};
|
|
323
|
+
var quoteIfNeeded = (path) => /\s/.test(path) ? `"${path}"` : path;
|
|
324
|
+
var fetchLatestPublishedVersion = async (request) => {
|
|
325
|
+
try {
|
|
326
|
+
const response = await (request.fetchImpl ?? fetch)(latestReleaseUrl(request.packageName), {
|
|
327
|
+
signal: AbortSignal.timeout(request.timeoutMs ?? REGISTRY_TIMEOUT_MS)
|
|
328
|
+
});
|
|
329
|
+
if (!response.ok) return void 0;
|
|
330
|
+
const body = await response.json();
|
|
331
|
+
const version = body && typeof body === "object" && "version" in body ? body.version : void 0;
|
|
332
|
+
return typeof version === "string" && isReleaseVersion(version) ? version : void 0;
|
|
333
|
+
} catch {
|
|
334
|
+
return void 0;
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
var POSIX_SHELL_WORD = /^[\w@%+=:,./-]+$/;
|
|
338
|
+
var quoteForPosixShell = (value) => POSIX_SHELL_WORD.test(value) ? value : `'${value.replaceAll("'", `'\\''`)}'`;
|
|
339
|
+
var installPackageGlobally = (request, runNpm = execNpm) => {
|
|
340
|
+
const prefixFlag = request.prefix === void 0 ? "" : ` --prefix ${quoteForPosixShell(request.prefix)}`;
|
|
341
|
+
const spec = quoteForPosixShell(`${request.packageName}@${request.version}`);
|
|
342
|
+
runNpm(`install -g --no-workspaces${prefixFlag} ${spec}`, { timeout: request.timeoutMs });
|
|
343
|
+
};
|
|
344
|
+
var needsGlobalInstall = (requested, installed, binaryPresent) => requested !== installed || !binaryPresent;
|
|
345
|
+
var planGlobalInstall = (platform) => {
|
|
346
|
+
const prefix = readGlobalPrefix();
|
|
347
|
+
const owner = prefix === void 0 ? NPM_UNAVAILABLE_OWNER : readCommandOwner(prefix, platform);
|
|
348
|
+
return { prefix, packageName: globalInstallTarget(owner, ownPackageName()) };
|
|
349
|
+
};
|
|
350
|
+
var plannedGlobalPackage = () => planGlobalInstall(process.platform).packageName;
|
|
351
|
+
var installedVersionOf = (prefix, name, platform) => {
|
|
352
|
+
const folder = readGlobalFolder(globalRootFor(prefix, platform), name, platform);
|
|
353
|
+
return folder.kind === "ours" ? folder.installed.version : void 0;
|
|
354
|
+
};
|
|
355
|
+
var asCachedResult = (result) => result === "installed" ? "cached" : result;
|
|
356
|
+
var installState;
|
|
357
|
+
var installGlobally = (options) => {
|
|
358
|
+
if (installState) {
|
|
359
|
+
return installState.then(asCachedResult);
|
|
360
|
+
}
|
|
361
|
+
const started = (async () => {
|
|
362
|
+
if (!npmIsOnPath()) throw new NpmMissingError();
|
|
363
|
+
const { withUpgradeLock } = await import("./global-upgrade-AZN3BPI3.js");
|
|
364
|
+
const { installWithUpgradeLock, ownsUpgradeLock } = await import("./upgrade-lock-AHISGKER.js");
|
|
365
|
+
const { autoUpdateLock } = await import("./paths-X4IPV2WJ.js");
|
|
366
|
+
let result = "skipped";
|
|
367
|
+
const install = async () => {
|
|
368
|
+
const platform = process.platform;
|
|
369
|
+
const { prefix, packageName } = planGlobalInstall(platform);
|
|
370
|
+
const pinned = process.env.PUSHARY_PIN_GLOBAL_VERSION !== "0";
|
|
371
|
+
if (pinned && prefix !== void 0 && !needsGlobalInstall(
|
|
372
|
+
options.version,
|
|
373
|
+
installedVersionOf(prefix, packageName, platform),
|
|
374
|
+
globalPackageBinsPresent(packageName, prefix, platform)
|
|
375
|
+
)) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const version = pinned && options.version && options.version !== "0.0.0" ? options.version : LATEST_TAG;
|
|
379
|
+
installWithUpgradeLock({ packageName, version, timeoutMs: options.timeoutMs ?? 12e4 }, options.lockPath);
|
|
380
|
+
result = "installed";
|
|
381
|
+
};
|
|
382
|
+
if (ownsUpgradeLock(options.lockPath ?? autoUpdateLock())) {
|
|
383
|
+
await install();
|
|
384
|
+
} else {
|
|
385
|
+
const lock = await withUpgradeLock(install, options);
|
|
386
|
+
if (lock.kind === "refused") throw new Error(lock.message);
|
|
387
|
+
}
|
|
388
|
+
return result;
|
|
389
|
+
})();
|
|
390
|
+
installState = started;
|
|
391
|
+
started.catch(() => {
|
|
392
|
+
if (installState === started) installState = void 0;
|
|
393
|
+
});
|
|
394
|
+
return started;
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
export {
|
|
398
|
+
LATEST_TAG,
|
|
399
|
+
cleanNpmEnv,
|
|
400
|
+
npmErrorMessage,
|
|
401
|
+
execNpm,
|
|
402
|
+
readGlobalPrefix,
|
|
403
|
+
resolveGlobalBinary,
|
|
404
|
+
resolveGlobalBinaryAt,
|
|
405
|
+
resolvePathBinary,
|
|
406
|
+
readGlobalPrefixAsync,
|
|
407
|
+
resolvePathBinaryAsync,
|
|
408
|
+
npmIsOnPath,
|
|
409
|
+
globalPackageState,
|
|
410
|
+
NpmMissingError,
|
|
411
|
+
NpmPermissionError,
|
|
412
|
+
NpmInstallError,
|
|
413
|
+
npmInstallFailure,
|
|
414
|
+
resolveBinary,
|
|
415
|
+
resolvePackageVersionFromBinary,
|
|
416
|
+
resolveGlobalPackageVersion,
|
|
417
|
+
resolveGlobalPackageVersionAsync,
|
|
418
|
+
readGlobalFolder,
|
|
419
|
+
readGlobalCliInstallAt,
|
|
420
|
+
readGlobalCliInstall,
|
|
421
|
+
resolveGlobalBinDir,
|
|
422
|
+
quoteIfNeeded,
|
|
423
|
+
fetchLatestPublishedVersion,
|
|
424
|
+
installPackageGlobally,
|
|
425
|
+
plannedGlobalPackage,
|
|
426
|
+
installGlobally
|
|
427
|
+
};
|
|
@@ -12,21 +12,21 @@ import {
|
|
|
12
12
|
terminalColumns,
|
|
13
13
|
useColor
|
|
14
14
|
} from "./chunk-FO3MDD26.js";
|
|
15
|
-
import {
|
|
16
|
-
reportedInstallSource
|
|
17
|
-
} from "./chunk-KEAIIVW3.js";
|
|
18
15
|
import {
|
|
19
16
|
callMcpTool
|
|
20
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-P2546BBI.js";
|
|
18
|
+
import {
|
|
19
|
+
reportedInstallSource
|
|
20
|
+
} from "./chunk-4QQEUJL4.js";
|
|
21
21
|
import {
|
|
22
22
|
NPX_LATEST_COMMAND
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-MC4VY5LK.js";
|
|
24
24
|
import {
|
|
25
25
|
NO_PAIRING_COMPUTER,
|
|
26
26
|
PAIR_TTL_SECONDS,
|
|
27
27
|
classifyConfirmResponse,
|
|
28
28
|
isAnswerSource
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-LF3TLC7B.js";
|
|
30
30
|
|
|
31
31
|
// src/reach.ts
|
|
32
32
|
var reachVerdict = (channels) => {
|