@claudexor/cli 3.6.0 → 3.8.1
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/dist/accounts-projection.d.ts +4 -2
- package/dist/accounts-projection.d.ts.map +1 -1
- package/dist/accounts-projection.js +49 -2
- package/dist/accounts-projection.js.map +1 -1
- package/dist/accounts-services.d.ts +7 -1
- package/dist/accounts-services.d.ts.map +1 -1
- package/dist/accounts-services.js +7 -2
- package/dist/accounts-services.js.map +1 -1
- package/dist/agy-quota-source.d.ts +2 -0
- package/dist/agy-quota-source.d.ts.map +1 -1
- package/dist/agy-quota-source.js +83 -108
- package/dist/agy-quota-source.js.map +1 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +6 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/claudexord-entry.d.ts +7 -2
- package/dist/claudexord-entry.d.ts.map +1 -1
- package/dist/claudexord-entry.js +33 -11
- package/dist/claudexord-entry.js.map +1 -1
- package/dist/claudexord.d.ts.map +1 -1
- package/dist/claudexord.js +9 -12
- package/dist/claudexord.js.map +1 -1
- package/dist/cli-io.d.ts +1 -0
- package/dist/cli-io.d.ts.map +1 -1
- package/dist/cli-io.js +14 -0
- package/dist/cli-io.js.map +1 -1
- package/dist/cli.js +12 -18
- package/dist/cli.js.map +1 -1
- package/dist/command-flags.d.ts.map +1 -1
- package/dist/command-flags.js +3 -2
- package/dist/command-flags.js.map +1 -1
- package/dist/control-services.d.ts +824 -806
- package/dist/control-services.d.ts.map +1 -1
- package/dist/control-services.js +4 -16
- package/dist/control-services.js.map +1 -1
- package/dist/credential-commands.d.ts +17 -0
- package/dist/credential-commands.d.ts.map +1 -1
- package/dist/credential-commands.js +62 -14
- package/dist/credential-commands.js.map +1 -1
- package/dist/credential-profile-mutations.d.ts +9 -0
- package/dist/credential-profile-mutations.d.ts.map +1 -1
- package/dist/credential-profile-mutations.js +63 -31
- package/dist/credential-profile-mutations.js.map +1 -1
- package/dist/credential-status-invalidation.d.ts +2 -0
- package/dist/credential-status-invalidation.d.ts.map +1 -1
- package/dist/credential-status-invalidation.js +10 -0
- package/dist/credential-status-invalidation.js.map +1 -1
- package/dist/delegation-belt-descriptor.d.ts +2 -1
- package/dist/delegation-belt-descriptor.d.ts.map +1 -1
- package/dist/delegation-belt-descriptor.js +2 -1
- package/dist/delegation-belt-descriptor.js.map +1 -1
- package/dist/harness-command-specs.d.ts.map +1 -1
- package/dist/harness-command-specs.js +4 -4
- package/dist/harness-command-specs.js.map +1 -1
- package/dist/harness-command.d.ts +5 -3
- package/dist/harness-command.d.ts.map +1 -1
- package/dist/harness-command.js +5 -3
- package/dist/harness-command.js.map +1 -1
- package/dist/harness-install-lease.d.ts +11 -0
- package/dist/harness-install-lease.d.ts.map +1 -0
- package/dist/harness-install-lease.js +98 -0
- package/dist/harness-install-lease.js.map +1 -0
- package/dist/harness-install-proof.d.ts +36 -0
- package/dist/harness-install-proof.d.ts.map +1 -0
- package/dist/harness-install-proof.js +148 -0
- package/dist/harness-install-proof.js.map +1 -0
- package/dist/harness-install-recipes.d.ts +80 -0
- package/dist/harness-install-recipes.d.ts.map +1 -0
- package/dist/harness-install-recipes.js +130 -0
- package/dist/harness-install-recipes.js.map +1 -0
- package/dist/harness-installer.d.ts +45 -46
- package/dist/harness-installer.d.ts.map +1 -1
- package/dist/harness-installer.js +248 -156
- package/dist/harness-installer.js.map +1 -1
- package/dist/mcp-run-projections.d.ts +1 -1
- package/dist/native-login.d.ts +7 -0
- package/dist/native-login.d.ts.map +1 -1
- package/dist/native-login.js +29 -13
- package/dist/native-login.js.map +1 -1
- package/dist/profile-registration.d.ts +2 -0
- package/dist/profile-registration.d.ts.map +1 -1
- package/dist/profile-registration.js +49 -6
- package/dist/profile-registration.js.map +1 -1
- package/dist/quota-services.d.ts +2 -2
- package/dist/remote-command.d.ts +0 -2
- package/dist/remote-command.d.ts.map +1 -1
- package/dist/remote-command.js +3 -74
- package/dist/remote-command.js.map +1 -1
- package/dist/request-preflight.d.ts +1 -1
- package/dist/request-preflight.d.ts.map +1 -1
- package/dist/request-preflight.js +35 -11
- package/dist/request-preflight.js.map +1 -1
- package/dist/retry-command.d.ts.map +1 -1
- package/dist/retry-command.js +4 -0
- package/dist/retry-command.js.map +1 -1
- package/dist/setup-attach-command.d.ts +30 -0
- package/dist/setup-attach-command.d.ts.map +1 -0
- package/dist/setup-attach-command.js +118 -0
- package/dist/setup-attach-command.js.map +1 -0
- package/dist/setup-job-control-services.d.ts +2064 -0
- package/dist/setup-job-control-services.d.ts.map +1 -0
- package/dist/setup-job-control-services.js +33 -0
- package/dist/setup-job-control-services.js.map +1 -0
- package/dist/setup-job-store.d.ts +2 -2
- package/dist/setup-job-support.d.ts +23 -13
- package/dist/setup-job-support.d.ts.map +1 -1
- package/dist/setup-job-support.js +55 -13
- package/dist/setup-job-support.js.map +1 -1
- package/dist/setup-jobs.d.ts +4 -4
- package/dist/setup-jobs.d.ts.map +1 -1
- package/dist/setup-jobs.js +50 -47
- package/dist/setup-jobs.js.map +1 -1
- package/dist/setup-login-capability.d.ts +37 -0
- package/dist/setup-login-capability.d.ts.map +1 -0
- package/dist/setup-login-capability.js +96 -0
- package/dist/setup-login-capability.js.map +1 -0
- package/dist/setup-login-io.d.ts +4 -1
- package/dist/setup-login-io.d.ts.map +1 -1
- package/dist/setup-login-io.js +22 -3
- package/dist/setup-login-io.js.map +1 -1
- package/dist/setup-login-pty.d.ts +64 -22
- package/dist/setup-login-pty.d.ts.map +1 -1
- package/dist/setup-login-pty.js +289 -48
- package/dist/setup-login-pty.js.map +1 -1
- package/dist/setup-login-runner-support.d.ts +12 -0
- package/dist/setup-login-runner-support.d.ts.map +1 -0
- package/dist/setup-login-runner-support.js +65 -0
- package/dist/setup-login-runner-support.js.map +1 -0
- package/dist/setup-login-runner.d.ts +3 -0
- package/dist/setup-login-runner.d.ts.map +1 -1
- package/dist/setup-login-runner.js +133 -116
- package/dist/setup-login-runner.js.map +1 -1
- package/dist/setup-runner-outcome.d.ts +10 -0
- package/dist/setup-runner-outcome.d.ts.map +1 -0
- package/dist/setup-runner-outcome.js +49 -0
- package/dist/setup-runner-outcome.js.map +1 -0
- package/dist/thread-execution-workspace.d.ts +11 -6
- package/dist/thread-execution-workspace.d.ts.map +1 -1
- package/dist/thread-execution-workspace.js +52 -6
- package/dist/thread-execution-workspace.js.map +1 -1
- package/package.json +24 -24
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-install-recipes.d.ts","sourceRoot":"","sources":["../src/harness-install-recipes.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,kBAAkB,CAE/E;AAED;;yDAEyD;AACzD,eAAO,MAAM,uBAAuB,YAAI,OAAO,EAAE,QAAQ,CAAU,CAAC;AACpE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,oBAAoB,CAEnF;AAED,uEAAuE;AACvE,eAAO,MAAM,cAAc,EAAE,MAAM,CACjC,oBAAoB,EACpB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAOpD,CAAC;AAEF;;;;;;aAMa;AACb,MAAM,MAAM,0BAA0B,GAClC,kBAAkB,GAClB,oBAAoB,GACpB,gBAAgB;AAClB;;qDAEqD;GACnD,qBAAqB,CAAC;AAE1B,eAAO,MAAM,QAAQ,EAAE,OAAO,CAC5B,MAAM,CACJ,kBAAkB,EAClB;IACE,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,OAAO,EAAE,sBAAsB,CAAC;IAChC,YAAY,EAAE,OAAO,CAAC,0BAA0B,EAAE,gBAAgB,GAAG,qBAAqB,CAAC,CAAC;CAC7F,CACF,CAoBF,CAAC;AAEF,eAAO,MAAM,kBAAkB,+BAA+B,CAAC;AAC/D;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,8CAA8C,CAAC;AAC3E,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,+CAA+C,CAAC;AAEpF;;2EAE2E;AAC3E,QAAA,MAAM,iBAAiB,EAAE,MAAM,CAC7B,KAAK,GAAG,QAAQ,EAChB;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;CACpB,CAoBF,CAAC;AAEF,KAAK,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAElF;sEACsE;AACtE,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,eAAe,GAAG,IAAI,CAInF;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,yEAAyE;IACzE,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB;;gBAEY;IACZ,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;+EAE2E;IAC3E,YAAY,EAAE,0BAA0B,CAAC;CAC1C;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,GAAE,oBAA+B,GACtC,0BAA0B,CAqC5B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The vendor RECIPES `claudexor harness install` executes, and the disclosure
|
|
3
|
+
* it prints before executing anything. Split from harness-installer.ts so the
|
|
4
|
+
* WHAT (which artifact, from where, into which prefix, with what evidence)
|
|
5
|
+
* stays readable next to itself, while the installer file owns the HOW
|
|
6
|
+
* (lease, spawn, proof, CLI surface). A new vendor is a row in one of the two
|
|
7
|
+
* tables here, never a new branch there.
|
|
8
|
+
*/
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { CLAUDE_VENDOR_CLI_VERSION } from "@claudexor/harness-claude";
|
|
11
|
+
import { CODEX_VENDOR_CLI_VERSION } from "@claudexor/harness-codex";
|
|
12
|
+
import { OPENCODE_VENDOR_CLI_VERSION } from "@claudexor/harness-opencode";
|
|
13
|
+
import { managedNodeRoot } from "@claudexor/core";
|
|
14
|
+
import { INSTALLABLE_HARNESSES } from "./harness-command-specs.js";
|
|
15
|
+
export function isInstallableHarness(value) {
|
|
16
|
+
return INSTALLABLE_HARNESSES.includes(value);
|
|
17
|
+
}
|
|
18
|
+
/** Install destinations. `remote` is the historical issue-#89 SSH-host prefix;
|
|
19
|
+
* `local` is the managed toolchain root this host's harness resolution already
|
|
20
|
+
* reads, so an install there is immediately runnable. */
|
|
21
|
+
export const HARNESS_INSTALL_TARGETS = ["local", "remote"];
|
|
22
|
+
export function isHarnessInstallTarget(value) {
|
|
23
|
+
return HARNESS_INSTALL_TARGETS.includes(value);
|
|
24
|
+
}
|
|
25
|
+
/** ONE table owns each target's npm prefix and how it is disclosed. */
|
|
26
|
+
export const TARGET_LAYOUTS = {
|
|
27
|
+
local: { displayRoot: "~/.claudexor/node", root: managedNodeRoot },
|
|
28
|
+
remote: {
|
|
29
|
+
displayRoot: "~/.claudexor/remote/vendor",
|
|
30
|
+
root: (home) => join(home, ".claudexor", "remote", "vendor"),
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export const NPM_PINS = {
|
|
34
|
+
claude: {
|
|
35
|
+
npmPackage: "@anthropic-ai/claude-code",
|
|
36
|
+
binaryNames: ["claude"],
|
|
37
|
+
version: CLAUDE_VENDOR_CLI_VERSION,
|
|
38
|
+
verification: "release_verified",
|
|
39
|
+
},
|
|
40
|
+
codex: {
|
|
41
|
+
npmPackage: "@openai/codex",
|
|
42
|
+
binaryNames: ["codex"],
|
|
43
|
+
version: CODEX_VENDOR_CLI_VERSION,
|
|
44
|
+
verification: "release_verified",
|
|
45
|
+
},
|
|
46
|
+
opencode: {
|
|
47
|
+
npmPackage: "opencode-ai",
|
|
48
|
+
binaryNames: ["opencode"],
|
|
49
|
+
version: OPENCODE_VENDOR_CLI_VERSION,
|
|
50
|
+
verification: "deterministic_only",
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
export const CURSOR_INSTALL_URL = "https://cursor.com/install";
|
|
54
|
+
/**
|
|
55
|
+
* Google's official Antigravity CLI installer, as published on
|
|
56
|
+
* antigravity.google/docs/cli/install (`curl -fsSL <this url> | bash`, which
|
|
57
|
+
* Claudexor deliberately does NOT do — see the header). Verified end to end on
|
|
58
|
+
* 2026-08-16: the script fetched from this URL installed agy 1.1.13 to
|
|
59
|
+
* `~/.local/bin/agy`, which is the destination disclosed below. The vendor
|
|
60
|
+
* ships one signed Go binary and no npm package, so it takes the same
|
|
61
|
+
* human-observed path as cursor.
|
|
62
|
+
*/
|
|
63
|
+
export const AGY_INSTALL_URL = "https://antigravity.google/cli/install.sh";
|
|
64
|
+
/** The vendor's Windows installer, from the same documentation page. */
|
|
65
|
+
export const AGY_INSTALL_URL_WINDOWS = "https://antigravity.google/cli/install.ps1";
|
|
66
|
+
/** Vendors distributed as a shell installer instead of a pinnable npm
|
|
67
|
+
* artifact. ONE branch serves both entries; the per-harness text below is the
|
|
68
|
+
* only thing that differs, so a third such vendor is a row, not a fork. */
|
|
69
|
+
const SCRIPT_INSTALLERS = {
|
|
70
|
+
agy: {
|
|
71
|
+
binaryName: "agy",
|
|
72
|
+
url: AGY_INSTALL_URL,
|
|
73
|
+
// The one vendor here that publishes a Windows installer of its own; the
|
|
74
|
+
// POSIX row would otherwise be all Claudexor could honestly offer.
|
|
75
|
+
windowsUrl: AGY_INSTALL_URL_WINDOWS,
|
|
76
|
+
installLocation: "~/.local/bin (as selected by Google's Antigravity installer)",
|
|
77
|
+
pinNote: "none — Antigravity ships no pinnable npm artifact; the vendor script is downloaded in full, its size and sha256 print, and it runs in this terminal where you watch it",
|
|
78
|
+
},
|
|
79
|
+
cursor: {
|
|
80
|
+
// The legacy alias every Cursor login/run surface already consumes.
|
|
81
|
+
binaryName: "cursor-agent",
|
|
82
|
+
url: CURSOR_INSTALL_URL,
|
|
83
|
+
installLocation: "~/.local/bin (or ~/.cursor/bin, as selected by Cursor's installer)",
|
|
84
|
+
pinNote: "none — Cursor ships no pinnable npm artifact; the vendor script is downloaded in full, its size and sha256 print, and it runs in this terminal where you watch it",
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
/** Membership is asked of the TABLE, never re-typed: a third script vendor is
|
|
88
|
+
* one row, and cannot be added to the table yet fall through here. */
|
|
89
|
+
export function scriptInstaller(harness) {
|
|
90
|
+
return Object.hasOwn(SCRIPT_INSTALLERS, harness)
|
|
91
|
+
? SCRIPT_INSTALLERS[harness]
|
|
92
|
+
: null;
|
|
93
|
+
}
|
|
94
|
+
export function harnessInstallerDisclosure(harness, target = "remote") {
|
|
95
|
+
const layout = TARGET_LAYOUTS[target];
|
|
96
|
+
const pin = NPM_PINS[harness];
|
|
97
|
+
if (pin) {
|
|
98
|
+
return {
|
|
99
|
+
harness,
|
|
100
|
+
target,
|
|
101
|
+
command: `npm install --global --prefix ${layout.displayRoot} ${pin.npmPackage}@${pin.version}`,
|
|
102
|
+
installLocation: `${layout.displayRoot}/bin`,
|
|
103
|
+
pinnedVersion: pin.version,
|
|
104
|
+
verification: pin.verification,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const script = scriptInstaller(harness);
|
|
108
|
+
/* c8 ignore next -- every non-npm harness has a script row; this is the
|
|
109
|
+
unreachable guard that keeps the two tables honest. */
|
|
110
|
+
if (!script)
|
|
111
|
+
throw new Error(`harness ${harness} has neither an npm pin nor a script installer`);
|
|
112
|
+
const windows = process.platform === "win32";
|
|
113
|
+
const url = windows ? (script.windowsUrl ?? script.url) : script.url;
|
|
114
|
+
const file = windows && script.windowsUrl ? "install.ps1" : "install.sh";
|
|
115
|
+
const runner = windows && script.windowsUrl ? "powershell -ExecutionPolicy Bypass -File" : "/bin/sh";
|
|
116
|
+
return {
|
|
117
|
+
harness,
|
|
118
|
+
target,
|
|
119
|
+
command: `curl --fail --silent --show-error --location ${url} ` +
|
|
120
|
+
`--output <private-tmpdir>/${file} && ${runner} <private-tmpdir>/${file}`,
|
|
121
|
+
// The vendor script picks its own destination, so the local target cannot
|
|
122
|
+
// move it; only the WITNESS differs between the two targets.
|
|
123
|
+
installLocation: windows && script.windowsUrl
|
|
124
|
+
? "%LOCALAPPDATA%\\agy\\bin (as selected by Google's Antigravity installer)"
|
|
125
|
+
: script.installLocation,
|
|
126
|
+
pinnedVersion: null,
|
|
127
|
+
verification: target === "local" ? "unattended_unpinned" : "human_observed",
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=harness-install-recipes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-install-recipes.js","sourceRoot":"","sources":["../src/harness-install-recipes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAInE,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,qBAAqB,CAAC,QAAQ,CAAC,KAA2B,CAAC,CAAC;AACrE,CAAC;AAED;;yDAEyD;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAC;AAGpE,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAA6B,CAAC,CAAC;AACzE,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAGvB;IACF,KAAK,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,eAAe,EAAE;IAClE,MAAM,EAAE;QACN,WAAW,EAAE,4BAA4B;QACzC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC;KAC7D;CACF,CAAC;AAkBF,MAAM,CAAC,MAAM,QAAQ,GAWjB;IACF,MAAM,EAAE;QACN,UAAU,EAAE,2BAA2B;QACvC,WAAW,EAAE,CAAC,QAAQ,CAAC;QACvB,OAAO,EAAE,yBAAyB;QAClC,YAAY,EAAE,kBAAkB;KACjC;IACD,KAAK,EAAE;QACL,UAAU,EAAE,eAAe;QAC3B,WAAW,EAAE,CAAC,OAAO,CAAC;QACtB,OAAO,EAAE,wBAAwB;QACjC,YAAY,EAAE,kBAAkB;KACjC;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,aAAa;QACzB,WAAW,EAAE,CAAC,UAAU,CAAC;QACzB,OAAO,EAAE,2BAA2B;QACpC,YAAY,EAAE,oBAAoB;KACnC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAC/D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,2CAA2C,CAAC;AAC3E,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,4CAA4C,CAAC;AAEpF;;2EAE2E;AAC3E,MAAM,iBAAiB,GAUnB;IACF,GAAG,EAAE;QACH,UAAU,EAAE,KAAK;QACjB,GAAG,EAAE,eAAe;QACpB,yEAAyE;QACzE,mEAAmE;QACnE,UAAU,EAAE,uBAAuB;QACnC,eAAe,EAAE,8DAA8D;QAC/E,OAAO,EACL,wKAAwK;KAC3K;IACD,MAAM,EAAE;QACN,oEAAoE;QACpE,UAAU,EAAE,cAAc;QAC1B,GAAG,EAAE,kBAAkB;QACvB,eAAe,EAAE,oEAAoE;QACrF,OAAO,EACL,mKAAmK;KACtK;CACF,CAAC;AAIF;sEACsE;AACtE,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAC9C,CAAC,CAAC,iBAAiB,CAAC,OAAyC,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAkBD,MAAM,UAAU,0BAA0B,CACxC,OAA2B,EAC3B,MAAM,GAAyB,QAAQ;IAEvC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,GAAG,EAAE,CAAC;QACR,OAAO;YACL,OAAO;YACP,MAAM;YACN,OAAO,EAAE,iCAAiC,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,OAAO,EAAE;YAC/F,eAAe,EAAE,GAAG,MAAM,CAAC,WAAW,MAAM;YAC5C,aAAa,EAAE,GAAG,CAAC,OAAO;YAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;SAC/B,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC;6DACyD;IACzD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,gDAAgD,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACrE,MAAM,IAAI,GAAG,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;IACzE,MAAM,MAAM,GACV,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,SAAS,CAAC;IACxF,OAAO;QACL,OAAO;QACP,MAAM;QACN,OAAO,EACL,gDAAgD,GAAG,GAAG;YACtD,6BAA6B,IAAI,OAAO,MAAM,qBAAqB,IAAI,EAAE;QAC3E,0EAA0E;QAC1E,6DAA6D;QAC7D,eAAe,EACb,OAAO,IAAI,MAAM,CAAC,UAAU;YAC1B,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,MAAM,CAAC,eAAe;QAC5B,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,gBAAgB;KAC5E,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `claudexor harness install` — the disclosed, pinned
|
|
2
|
+
* `claudexor harness install` — the disclosed, pinned vendor installer
|
|
3
3
|
* (issue #89; restored from the PR #82 cut with the security objections
|
|
4
|
-
* fixed).
|
|
4
|
+
* fixed). The historical/default `remote` target remains the SSH-host flow;
|
|
5
|
+
* an explicit `local` target installs into the managed toolchain root that
|
|
6
|
+
* local harness resolution already owns.
|
|
5
7
|
*
|
|
6
8
|
* Contract:
|
|
7
9
|
* - npm-distributed harnesses (claude/codex/opencode) install ONE exact
|
|
@@ -16,13 +18,26 @@
|
|
|
16
18
|
* downloaded first (never piped to a shell), its size and sha256 are
|
|
17
19
|
* printed, and it runs in the visible PTY the operator is watching — the
|
|
18
20
|
* same principle as interactive SSH auth.
|
|
19
|
-
* - NOTHING executes without
|
|
21
|
+
* - NOTHING executes without authorization: the exact command and install
|
|
20
22
|
* destination print first, and execution needs a TTY confirmation or an
|
|
21
23
|
* explicit `--yes` (the macOS flow confirms against this module's own
|
|
22
|
-
* `--dry-run --json` disclosure before passing `--yes`).
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* path
|
|
24
|
+
* `--dry-run --json` disclosure before passing `--yes`). For a host
|
|
25
|
+
* integration, `--target local --yes` IS that authorization, granted by the
|
|
26
|
+
* owner action that invoked it; there is no second confirmation hidden
|
|
27
|
+
* inside the producer, and the unattended script path never claims the
|
|
28
|
+
* human-observed verification the watched remote path earns.
|
|
29
|
+
* - concurrent installs into one prefix are serialized by a cross-process
|
|
30
|
+
* lease. A lease whose owner died is NOT reclaimed automatically: it fails
|
|
31
|
+
* closed with a typed `install_lock_stale` and the exact cleanup path.
|
|
32
|
+
* - failures are typed and loud; a failed download, a non-zero installer exit,
|
|
33
|
+
* or a failed post-install binary/version proof never reads as success, and
|
|
34
|
+
* the temp download dir is removed on every path.
|
|
35
|
+
* - the post-install PROOF is what the local target has instead of a witness.
|
|
36
|
+
* A watched remote install keeps the historical exit-code contract, because
|
|
37
|
+
* the operator is looking at the terminal; an unattended local install must
|
|
38
|
+
* earn its `ok:true`, so exit zero without a resolvable launcher and a
|
|
39
|
+
* matching `--version` is a typed failure, and `installedBinary` /
|
|
40
|
+
* `installedVersion` are present on every local success.
|
|
26
41
|
* - `--json` keeps stdout pure: exactly ONE JSON object. In json mode every
|
|
27
42
|
* human progress line goes to stderr and child processes (npm/curl/the
|
|
28
43
|
* vendor script) run with their stdout routed onto stderr, so vendor
|
|
@@ -31,56 +46,40 @@
|
|
|
31
46
|
import { spawnSync } from "node:child_process";
|
|
32
47
|
import { existsSync, mkdirSync } from "node:fs";
|
|
33
48
|
import { type ParsedArgs } from "./args.js";
|
|
34
|
-
import {
|
|
35
|
-
export type InstallableHarness
|
|
36
|
-
export declare function isInstallableHarness(value: string): value is InstallableHarness;
|
|
37
|
-
/** Exact npm pins. Each version ALIASES the harness package's vendor-version
|
|
38
|
-
* SSOT (vendor-cli-version.ts there). For claude/codex that is the version
|
|
39
|
-
* this release's freshness gates verified; the opencode pin is a
|
|
40
|
-
* deterministic install target only — no recorded verification fixture
|
|
41
|
-
* vouches for it (its vendor-cli-version.ts discloses this). Cursor and agy
|
|
42
|
-
* are absent deliberately: they ship no npm artifact (see SCRIPT_INSTALLERS
|
|
43
|
-
* below). */
|
|
44
|
-
export type HarnessInstallVerification = "release_verified" | "deterministic_only" | "human_observed";
|
|
45
|
-
export declare const CURSOR_INSTALL_URL = "https://cursor.com/install";
|
|
46
|
-
/**
|
|
47
|
-
* Google's official Antigravity CLI installer, as published on
|
|
48
|
-
* antigravity.google/docs/cli/install (`curl -fsSL <this url> | bash`, which
|
|
49
|
-
* Claudexor deliberately does NOT do — see the header). Verified end to end on
|
|
50
|
-
* 2026-08-16: the script fetched from this URL installed agy 1.1.13 to
|
|
51
|
-
* `~/.local/bin/agy`, which is the destination disclosed below. The vendor
|
|
52
|
-
* ships one signed Go binary and no npm package, so it takes the same
|
|
53
|
-
* human-observed path as cursor.
|
|
54
|
-
*/
|
|
55
|
-
export declare const AGY_INSTALL_URL = "https://antigravity.google/cli/install.sh";
|
|
56
|
-
/** The vendor's Windows installer, from the same documentation page. */
|
|
57
|
-
export declare const AGY_INSTALL_URL_WINDOWS = "https://antigravity.google/cli/install.ps1";
|
|
58
|
-
export interface HarnessInstallerDisclosure {
|
|
59
|
-
harness: InstallableHarness;
|
|
60
|
-
command: string;
|
|
61
|
-
installLocation: string;
|
|
62
|
-
/** Exact vendor version the command installs; null exactly for the script
|
|
63
|
-
* vendors (cursor, agy), which have no pinnable artifact — disclosed, never
|
|
64
|
-
* faked. */
|
|
65
|
-
pinnedVersion: string | null;
|
|
66
|
-
/** Evidence behind the install target. Package-registry integrity verifies
|
|
67
|
-
* downloaded bytes for every npm pin, but only release_verified means the
|
|
68
|
-
* exact vendor version was exercised by this release's freshness gates. */
|
|
69
|
-
verification: HarnessInstallVerification;
|
|
70
|
-
}
|
|
71
|
-
export declare function harnessInstallerDisclosure(harness: InstallableHarness): HarnessInstallerDisclosure;
|
|
49
|
+
import { type HarnessInstallTarget, type InstallableHarness } from "./harness-install-recipes.js";
|
|
50
|
+
export { AGY_INSTALL_URL, AGY_INSTALL_URL_WINDOWS, CURSOR_INSTALL_URL, HARNESS_INSTALL_TARGETS, harnessInstallerDisclosure, isHarnessInstallTarget, isInstallableHarness, type HarnessInstallTarget, type InstallableHarness, } from "./harness-install-recipes.js";
|
|
72
51
|
export interface HarnessInstallRunResult {
|
|
73
52
|
exitCode: number;
|
|
74
53
|
/** Set when the installer refused loudly WITHOUT running the vendor
|
|
75
54
|
* payload (failed/unreadable download); never a silent partial install. */
|
|
76
55
|
refusal?: string;
|
|
56
|
+
/** Stable machine reason when the payload did not run or did not verify. */
|
|
57
|
+
code?: string;
|
|
58
|
+
/** Evidence for the exact unpinned vendor-script bytes that ran. */
|
|
59
|
+
installerSha256?: string;
|
|
60
|
+
installerByteLength?: number;
|
|
61
|
+
/** Present on every SUCCESS: the absolute launcher the proof executed. */
|
|
62
|
+
installedBinary?: string;
|
|
63
|
+
/** Present on every SUCCESS: the exact npm pin, or the script vendor's own
|
|
64
|
+
* trimmed `--version` line. */
|
|
65
|
+
installedVersion?: string;
|
|
77
66
|
}
|
|
78
67
|
export declare function runHarnessInstaller(harness: InstallableHarness, options?: {
|
|
79
68
|
home?: string;
|
|
80
69
|
nodePath?: string;
|
|
70
|
+
/** Explicit install layout. Omitted preserves the historical remote target. */
|
|
71
|
+
target?: HarnessInstallTarget;
|
|
81
72
|
spawn?: typeof spawnSync;
|
|
82
73
|
mkdir?: typeof mkdirSync;
|
|
83
74
|
exists?: typeof existsSync;
|
|
75
|
+
/** Production installs serialize cross-process. Tests may disable only this
|
|
76
|
+
* wrapper while preserving the install recipe under test. */
|
|
77
|
+
lock?: boolean;
|
|
78
|
+
lockTimeoutMs?: number;
|
|
79
|
+
platform?: NodeJS.Platform;
|
|
80
|
+
/** Test/integration source before the clean allowlist and target-aware PATH
|
|
81
|
+
* normalization are applied. Provider credentials are still scrubbed. */
|
|
82
|
+
sourceEnv?: NodeJS.ProcessEnv;
|
|
84
83
|
/** `--json` stdout purity: route human progress lines AND child stdout
|
|
85
84
|
* to stderr, so stdout carries exactly one JSON object (the caller's
|
|
86
85
|
* final envelope). Human mode keeps everything on stdout as before. */
|
|
@@ -88,5 +87,5 @@ export declare function runHarnessInstaller(harness: InstallableHarness, options
|
|
|
88
87
|
}): HarnessInstallRunResult;
|
|
89
88
|
export declare function harnessInstallCommand(args: ParsedArgs, json: boolean,
|
|
90
89
|
/** Test seam: forwarded to `runHarnessInstaller` (spawn/home/... fakes). */
|
|
91
|
-
runnerOptions?: Omit<NonNullable<Parameters<typeof runHarnessInstaller>[1]>, "json">): number;
|
|
90
|
+
runnerOptions?: Omit<NonNullable<Parameters<typeof runHarnessInstaller>[1]>, "json" | "target">): number;
|
|
92
91
|
//# sourceMappingURL=harness-installer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-installer.d.ts","sourceRoot":"","sources":["../src/harness-installer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"harness-installer.d.ts","sourceRoot":"","sources":["../src/harness-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAA+C,MAAM,SAAS,CAAC;AAI7F,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAe/D,OAAO,EAQL,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAC;AAItC,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB;+EAC2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;mCAC+B;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6CD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,UAAU,CAAC;IAC3B;iEAC6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B;6EACyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAC9B;;2EAEuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAC;CACX,GACL,uBAAuB,CAkNzB;AA8CD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,OAAO;AACb,4EAA4E;AAC5E,aAAa,GAAE,IAAI,CACjB,WAAW,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,EACtD,MAAM,GAAG,QAAQ,CACb,GACL,MAAM,CA0ER"}
|