crosscheck-cli 0.0.11 → 0.0.12
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/cli.js +10 -3
- package/dist/cli.js.map +1 -1
- package/dist/doctor.js +107 -0
- package/dist/doctor.js.map +1 -0
- package/dist/keychain.js +227 -21
- package/dist/keychain.js.map +1 -1
- package/dist/keys-setup.js +6 -5
- package/dist/keys-setup.js.map +1 -1
- package/dist/mcp.js +3 -2
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -3
package/dist/cli.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* commander or yargs slots in here.
|
|
7
7
|
*/
|
|
8
8
|
import { activate } from "./activate.js";
|
|
9
|
+
import { runDoctor } from "./doctor.js";
|
|
9
10
|
import { runHeartbeat } from "./heartbeat.js";
|
|
10
11
|
import { deleteSecret, getSecret, listSecrets, setSecret, } from "./keychain.js";
|
|
11
12
|
import { captureKeyViaBrowser } from "./keys-browser-flow.js";
|
|
@@ -24,12 +25,14 @@ Usage:
|
|
|
24
25
|
crosscheck deactivate Wipe local credentials.
|
|
25
26
|
crosscheck heartbeat Check status against the server.
|
|
26
27
|
crosscheck keys setup Interactive wizard for all provider keys.
|
|
27
|
-
crosscheck keys add <provider> [--paste] Store one upstream LLM key
|
|
28
|
+
crosscheck keys add <provider> [--paste] Store one upstream LLM key locally on this machine
|
|
28
29
|
(default: opens a browser form; --paste falls
|
|
29
30
|
back to stdin for CI / headless environments).
|
|
30
31
|
crosscheck keys list List stored upstream-provider key names (not values).
|
|
31
32
|
crosscheck keys remove <provider> Remove an upstream LLM key.
|
|
32
33
|
crosscheck serve Start the MCP server (stdio).
|
|
34
|
+
crosscheck doctor Diagnose a broken install (Node, secret store,
|
|
35
|
+
engine, activation, keys).
|
|
33
36
|
crosscheck help Show this help.
|
|
34
37
|
|
|
35
38
|
Providers: anthropic, openai, gemini, grok
|
|
@@ -76,7 +79,7 @@ async function main() {
|
|
|
76
79
|
await deleteSecret(item.account);
|
|
77
80
|
}
|
|
78
81
|
// eslint-disable-next-line no-console
|
|
79
|
-
console.log(`✓ Removed ${items.length}
|
|
82
|
+
console.log(`✓ Removed ${items.length} stored credential${items.length === 1 ? "" : "s"}. To set up again, run \`crosscheck install\`.`);
|
|
80
83
|
return;
|
|
81
84
|
}
|
|
82
85
|
case "heartbeat": {
|
|
@@ -87,6 +90,10 @@ async function main() {
|
|
|
87
90
|
process.exit(2);
|
|
88
91
|
return;
|
|
89
92
|
}
|
|
93
|
+
case "doctor": {
|
|
94
|
+
await runDoctor();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
90
97
|
case "keys": {
|
|
91
98
|
const sub = rest[0];
|
|
92
99
|
const provider = rest[1];
|
|
@@ -146,7 +153,7 @@ async function main() {
|
|
|
146
153
|
}
|
|
147
154
|
await setSecret(`key:${provider}`, value);
|
|
148
155
|
// eslint-disable-next-line no-console
|
|
149
|
-
console.log(`✓ Stored ${provider} key
|
|
156
|
+
console.log(`✓ Stored ${provider} key locally on this machine (never sent to Crosscheck).`);
|
|
150
157
|
return;
|
|
151
158
|
}
|
|
152
159
|
if (sub === "remove") {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `crosscheck doctor` — diagnose a broken install without guessing.
|
|
3
|
+
*
|
|
4
|
+
* Prints a checklist and exits non-zero if a CRITICAL check fails, so users
|
|
5
|
+
* (and support) get an actionable cause instead of Claude Code's bare
|
|
6
|
+
* "-32000: Connection closed". Each check is independent and never throws —
|
|
7
|
+
* a thrown check is reported as a failure, not a crash.
|
|
8
|
+
*/
|
|
9
|
+
import { createRequire } from "node:module";
|
|
10
|
+
import { ENGINE_PACKAGE, SERVER_URL } from "./config.js";
|
|
11
|
+
import { deleteSecret, getSecret, listSecrets, secretBackend, setSecret, } from "./keychain.js";
|
|
12
|
+
import { verifyJwt } from "./jwt.js";
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
14
|
+
function line(level, msg) {
|
|
15
|
+
const mark = level === "ok" ? "✓" : level === "warn" ? "!" : "✗";
|
|
16
|
+
// eslint-disable-next-line no-console
|
|
17
|
+
console.log(` ${mark} ${msg}`);
|
|
18
|
+
}
|
|
19
|
+
export async function runDoctor() {
|
|
20
|
+
let critical = 0;
|
|
21
|
+
// eslint-disable-next-line no-console
|
|
22
|
+
console.log("\ncrosscheck doctor — checking your install\n");
|
|
23
|
+
// 1. Node version.
|
|
24
|
+
const major = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
|
|
25
|
+
if (major >= 20) {
|
|
26
|
+
line("ok", `Node ${process.versions.node}`);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
line("fail", `Node ${process.versions.node} — crosscheck needs Node 20+. Install from https://nodejs.org`);
|
|
30
|
+
critical += 1;
|
|
31
|
+
}
|
|
32
|
+
// 2. Secret store round-trip (the former native-keyring failure point).
|
|
33
|
+
const backend = secretBackend();
|
|
34
|
+
try {
|
|
35
|
+
const probe = "key:__doctor_probe__";
|
|
36
|
+
const token = `probe-${process.pid}`;
|
|
37
|
+
await setSecret(probe, token);
|
|
38
|
+
const got = await getSecret(probe);
|
|
39
|
+
await deleteSecret(probe);
|
|
40
|
+
if (got === token) {
|
|
41
|
+
line("ok", `Secret store works (backend: ${backend})`);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
line("fail", `Secret store read/write mismatch (backend: ${backend})`);
|
|
45
|
+
critical += 1;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
line("fail", `Secret store unusable (backend: ${backend}): ${e.message}`);
|
|
50
|
+
if (backend === "keychain") {
|
|
51
|
+
line("warn", "Try forcing the file store: export CROSSCHECK_SECRET_STORE=file");
|
|
52
|
+
}
|
|
53
|
+
critical += 1;
|
|
54
|
+
}
|
|
55
|
+
// 3. Engine resolvable (else it falls back to npx).
|
|
56
|
+
try {
|
|
57
|
+
const entry = require.resolve(ENGINE_PACKAGE);
|
|
58
|
+
line("ok", `Engine found: ${entry}`);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
line("warn", `Engine (${ENGINE_PACKAGE}) not installed alongside the CLI — serve will use the npx fallback.`);
|
|
62
|
+
}
|
|
63
|
+
// 4. Activation.
|
|
64
|
+
try {
|
|
65
|
+
const jwt = await getSecret("jwt");
|
|
66
|
+
if (!jwt) {
|
|
67
|
+
line("warn", "Not activated yet — run `crosscheck activate`.");
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const v = await verifyJwt(jwt);
|
|
71
|
+
if (v.ok)
|
|
72
|
+
line("ok", "Activation JWT is valid.");
|
|
73
|
+
else {
|
|
74
|
+
line("fail", `Activation is ${v.reason} — re-run \`crosscheck activate\` (manage devices at ${SERVER_URL}/account).`);
|
|
75
|
+
critical += 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
line("fail", `Could not check activation: ${e.message}`);
|
|
81
|
+
critical += 1;
|
|
82
|
+
}
|
|
83
|
+
// 5. Provider keys.
|
|
84
|
+
try {
|
|
85
|
+
const keys = (await listSecrets()).filter((i) => i.account.startsWith("key:"));
|
|
86
|
+
if (keys.length === 0) {
|
|
87
|
+
line("warn", "No provider keys yet — run `crosscheck keys setup` (one browser page).");
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const names = keys.map((k) => k.account.slice("key:".length)).join(", ");
|
|
91
|
+
line("ok", `${keys.length} provider key${keys.length === 1 ? "" : "s"}: ${names}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
line("warn", `Could not list provider keys: ${e.message}`);
|
|
96
|
+
}
|
|
97
|
+
// eslint-disable-next-line no-console
|
|
98
|
+
console.log("");
|
|
99
|
+
if (critical > 0) {
|
|
100
|
+
// eslint-disable-next-line no-console
|
|
101
|
+
console.log(`${critical} critical issue${critical === 1 ? "" : "s"} found. Fix the ✗ items above, then reconnect MCP in Claude Code.\n`);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
// eslint-disable-next-line no-console
|
|
105
|
+
console.log("All clear. If Claude Code still can't connect, reconnect MCP servers (or restart it).\n");
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/keychain.js
CHANGED
|
@@ -1,41 +1,247 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* ships prebuilt binaries for every platform — no node-gyp, no Python, no
|
|
4
|
-
* compile step at install time:
|
|
5
|
-
* - macOS: Keychain
|
|
6
|
-
* - Windows: Credential Manager
|
|
7
|
-
* - Linux: Secret Service (GNOME Keyring / KWallet via libsecret)
|
|
2
|
+
* Secret store — NO native dependencies.
|
|
8
3
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* Replaces the former `@napi-rs/keyring` backend, whose per-platform native
|
|
5
|
+
* binary kept corrupting on `npx` installs (truncated `.node` → dlopen
|
|
6
|
+
* failure; npm/cli#4828). The public API is unchanged so call sites don't move.
|
|
11
7
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
8
|
+
* Backends:
|
|
9
|
+
* - "keychain" (macOS): shells out to `/usr/bin/security` (absolute path —
|
|
10
|
+
* no PATH lookup). Items live as generic passwords under the same
|
|
11
|
+
* service/account namespace the old backend used, so existing keys are
|
|
12
|
+
* read seamlessly. Every spawn is hard-timeout-bounded with captured
|
|
13
|
+
* stdio, so a Keychain Access GUI prompt can NEVER block a
|
|
14
|
+
* non-interactive `serve` (a timeout is treated as "not found" — we
|
|
15
|
+
* degrade, we never hang).
|
|
16
|
+
* - "file" (everywhere else, and the universal fallback): an encrypted file
|
|
17
|
+
* at <dir>/secrets.enc (AES-256-GCM) keyed by a random 32-byte key at
|
|
18
|
+
* <dir>/secret.key (mode 0400); data file 0600, dir 0700. Pure Node
|
|
19
|
+
* `crypto`. Threat model: protects against casual file copying / sync, not
|
|
20
|
+
* a process already running as you (same as gh/aws/.env). Keys never leave
|
|
21
|
+
* the machine in either backend.
|
|
22
|
+
*
|
|
23
|
+
* Selection: CROSSCHECK_SECRET_STORE = auto | file | keychain
|
|
24
|
+
* (default "auto": macOS → keychain, else → file).
|
|
16
25
|
*/
|
|
17
|
-
import {
|
|
26
|
+
import { spawnSync } from "node:child_process";
|
|
27
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
28
|
+
import os from "node:os";
|
|
29
|
+
import path from "node:path";
|
|
30
|
+
import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
|
|
18
31
|
import { KEYCHAIN_SERVICE } from "./config.js";
|
|
19
|
-
|
|
20
|
-
|
|
32
|
+
// macOS security binary — absolute so a broken PATH can't hide it.
|
|
33
|
+
const SECURITY_BIN = "/usr/bin/security";
|
|
34
|
+
// Hard ceiling on any `security` spawn. A keychain GUI prompt would otherwise
|
|
35
|
+
// block forever in a non-interactive context; we'd rather time out and treat
|
|
36
|
+
// the secret as absent.
|
|
37
|
+
const SECURITY_TIMEOUT_MS = 5_000;
|
|
38
|
+
/** Every secret name Crosscheck may store — used by listSecrets() to enumerate
|
|
39
|
+
* without a keychain dump (which would prompt). Provider list mirrors mcp.ts's
|
|
40
|
+
* KEY_BINDINGS. Migration-safe: finds items written by the old backend too. */
|
|
41
|
+
const PROVIDER_KEYS = [
|
|
42
|
+
"anthropic",
|
|
43
|
+
"openai",
|
|
44
|
+
"gemini",
|
|
45
|
+
"grok",
|
|
46
|
+
"groq",
|
|
47
|
+
"deepseek",
|
|
48
|
+
"mistral",
|
|
49
|
+
];
|
|
50
|
+
const KNOWN_SECRET_NAMES = [
|
|
51
|
+
"jwt",
|
|
52
|
+
"hmacSigningKey",
|
|
53
|
+
"jwtJti",
|
|
54
|
+
"jwtPublicKey",
|
|
55
|
+
"installUuid",
|
|
56
|
+
...PROVIDER_KEYS.map((p) => `key:${p}`),
|
|
57
|
+
];
|
|
58
|
+
function selectBackend() {
|
|
59
|
+
const forced = (process.env.CROSSCHECK_SECRET_STORE ?? "auto").toLowerCase();
|
|
60
|
+
if (forced === "file" || forced === "keychain")
|
|
61
|
+
return forced;
|
|
62
|
+
// auto
|
|
63
|
+
if (process.platform === "darwin" && existsSync(SECURITY_BIN))
|
|
64
|
+
return "keychain";
|
|
65
|
+
return "file";
|
|
21
66
|
}
|
|
22
|
-
|
|
23
|
-
|
|
67
|
+
/** Active backend, resolved once. */
|
|
68
|
+
const BACKEND = selectBackend();
|
|
69
|
+
/** Backend label for `crosscheck doctor`. */
|
|
70
|
+
export function secretBackend() {
|
|
71
|
+
return BACKEND;
|
|
24
72
|
}
|
|
25
|
-
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Storage directory (shared by the file backend + key material).
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
function dataDir() {
|
|
77
|
+
const base = process.env.CROSSCHECK_DATA_DIR ||
|
|
78
|
+
path.join(os.homedir() || os.tmpdir(), ".crosscheck");
|
|
79
|
+
mkdirSync(base, { recursive: true, mode: 0o700 });
|
|
80
|
+
try {
|
|
81
|
+
chmodSync(base, 0o700);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
/* best-effort on platforms without POSIX modes */
|
|
85
|
+
}
|
|
86
|
+
return base;
|
|
87
|
+
}
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// macOS `security` backend.
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
function securitySet(name, value) {
|
|
92
|
+
// -U: update if present. -A: allow access without a per-read GUI prompt
|
|
93
|
+
// (so a non-interactive `serve` never blocks). The secret is passed via
|
|
94
|
+
// argv; the exposure window is brief and local-user-only.
|
|
95
|
+
const r = spawnSync(SECURITY_BIN, ["add-generic-password", "-U", "-s", KEYCHAIN_SERVICE, "-a", name, "-w", value, "-A"], { timeout: SECURITY_TIMEOUT_MS, encoding: "utf8", stdio: ["ignore", "ignore", "pipe"] });
|
|
96
|
+
if (r.status !== 0) {
|
|
97
|
+
throw new Error(`keychain write failed (${r.status ?? r.signal ?? "timeout"}): ${(r.stderr || "").trim() || "unknown"}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function securityGet(name) {
|
|
101
|
+
const r = spawnSync(SECURITY_BIN, ["find-generic-password", "-s", KEYCHAIN_SERVICE, "-a", name, "-w"], { timeout: SECURITY_TIMEOUT_MS, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
|
|
102
|
+
// status 0 → found; 44 → not found; null → timed out (treat as not found).
|
|
103
|
+
if (r.status !== 0)
|
|
104
|
+
return null;
|
|
105
|
+
// `-w` prints the password followed by a newline.
|
|
106
|
+
return (r.stdout ?? "").replace(/\n$/, "");
|
|
107
|
+
}
|
|
108
|
+
function securityDelete(name) {
|
|
109
|
+
const r = spawnSync(SECURITY_BIN, ["delete-generic-password", "-s", KEYCHAIN_SERVICE, "-a", name], { timeout: SECURITY_TIMEOUT_MS, encoding: "utf8", stdio: ["ignore", "ignore", "pipe"] });
|
|
110
|
+
return r.status === 0;
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Encrypted-file backend.
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
function keyFilePath() {
|
|
116
|
+
return path.join(dataDir(), "secret.key");
|
|
117
|
+
}
|
|
118
|
+
function dataFilePath() {
|
|
119
|
+
return path.join(dataDir(), "secrets.enc");
|
|
120
|
+
}
|
|
121
|
+
function loadOrCreateKey() {
|
|
122
|
+
const kp = keyFilePath();
|
|
123
|
+
if (existsSync(kp)) {
|
|
124
|
+
const raw = readFileSync(kp);
|
|
125
|
+
if (raw.length === 32)
|
|
126
|
+
return raw;
|
|
127
|
+
// Corrupt/short key → regenerate (a truncated key can't decrypt the
|
|
128
|
+
// existing data anyway).
|
|
129
|
+
}
|
|
130
|
+
const key = randomBytes(32);
|
|
131
|
+
writeFileSync(kp, key, { mode: 0o400 });
|
|
132
|
+
try {
|
|
133
|
+
chmodSync(kp, 0o400);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
/* best-effort */
|
|
137
|
+
}
|
|
138
|
+
return key;
|
|
139
|
+
}
|
|
140
|
+
function readFileMap() {
|
|
141
|
+
const fp = dataFilePath();
|
|
142
|
+
if (!existsSync(fp))
|
|
143
|
+
return {};
|
|
144
|
+
try {
|
|
145
|
+
const blob = JSON.parse(readFileSync(fp, "utf8"));
|
|
146
|
+
const key = loadOrCreateKey();
|
|
147
|
+
const decipher = createDecipheriv("aes-256-gcm", key, Buffer.from(blob.iv, "base64"));
|
|
148
|
+
decipher.setAuthTag(Buffer.from(blob.tag, "base64"));
|
|
149
|
+
const out = Buffer.concat([
|
|
150
|
+
decipher.update(Buffer.from(blob.data, "base64")),
|
|
151
|
+
decipher.final(),
|
|
152
|
+
]);
|
|
153
|
+
return JSON.parse(out.toString("utf8"));
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Unreadable (key rotated / corrupt) → treat as empty rather than crash.
|
|
157
|
+
return {};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function writeFileMap(map) {
|
|
161
|
+
const key = loadOrCreateKey();
|
|
162
|
+
const iv = randomBytes(12);
|
|
163
|
+
const cipher = createCipheriv("aes-256-gcm", key, iv);
|
|
164
|
+
const enc = Buffer.concat([
|
|
165
|
+
cipher.update(Buffer.from(JSON.stringify(map), "utf8")),
|
|
166
|
+
cipher.final(),
|
|
167
|
+
]);
|
|
168
|
+
const tag = cipher.getAuthTag();
|
|
169
|
+
const payload = JSON.stringify({
|
|
170
|
+
iv: iv.toString("base64"),
|
|
171
|
+
tag: tag.toString("base64"),
|
|
172
|
+
data: enc.toString("base64"),
|
|
173
|
+
});
|
|
174
|
+
const fp = dataFilePath();
|
|
175
|
+
const tmp = `${fp}.tmp`;
|
|
176
|
+
writeFileSync(tmp, payload, { mode: 0o600 });
|
|
177
|
+
renameSync(tmp, fp);
|
|
26
178
|
try {
|
|
27
|
-
|
|
179
|
+
chmodSync(fp, 0o600);
|
|
28
180
|
}
|
|
29
181
|
catch {
|
|
30
|
-
|
|
182
|
+
/* best-effort */
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Public API (unchanged signatures).
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
export async function setSecret(name, value) {
|
|
189
|
+
if (BACKEND === "keychain") {
|
|
190
|
+
securitySet(name, value);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const map = readFileMap();
|
|
194
|
+
map[name] = value;
|
|
195
|
+
writeFileMap(map);
|
|
196
|
+
}
|
|
197
|
+
export async function getSecret(name) {
|
|
198
|
+
if (BACKEND === "keychain")
|
|
199
|
+
return securityGet(name);
|
|
200
|
+
return readFileMap()[name] ?? null;
|
|
201
|
+
}
|
|
202
|
+
export async function deleteSecret(name) {
|
|
203
|
+
if (BACKEND === "keychain")
|
|
204
|
+
return securityDelete(name);
|
|
205
|
+
const map = readFileMap();
|
|
206
|
+
if (!(name in map))
|
|
31
207
|
return false;
|
|
208
|
+
delete map[name];
|
|
209
|
+
if (Object.keys(map).length === 0) {
|
|
210
|
+
// Nothing left — drop the file entirely.
|
|
211
|
+
try {
|
|
212
|
+
rmSync(dataFilePath(), { force: true });
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
/* ignore */
|
|
216
|
+
}
|
|
32
217
|
}
|
|
218
|
+
else {
|
|
219
|
+
writeFileMap(map);
|
|
220
|
+
}
|
|
221
|
+
return true;
|
|
33
222
|
}
|
|
34
223
|
/**
|
|
35
224
|
* List every Crosscheck-owned credential. Used by `crosscheck keys list` and
|
|
36
225
|
* by deactivation to wipe everything in one pass.
|
|
226
|
+
*
|
|
227
|
+
* The file backend lists its map directly. The keychain backend can't be
|
|
228
|
+
* enumerated without `security dump-keychain` (which prompts), so it probes
|
|
229
|
+
* the known name set instead — which also picks up items written by the old
|
|
230
|
+
* @napi-rs/keyring backend (migration).
|
|
37
231
|
*/
|
|
38
232
|
export async function listSecrets() {
|
|
39
|
-
|
|
233
|
+
if (BACKEND === "file") {
|
|
234
|
+
return Object.entries(readFileMap()).map(([account, password]) => ({
|
|
235
|
+
account,
|
|
236
|
+
password,
|
|
237
|
+
}));
|
|
238
|
+
}
|
|
239
|
+
const out = [];
|
|
240
|
+
for (const name of KNOWN_SECRET_NAMES) {
|
|
241
|
+
const v = securityGet(name);
|
|
242
|
+
if (v !== null)
|
|
243
|
+
out.push({ account: name, password: v });
|
|
244
|
+
}
|
|
245
|
+
return out;
|
|
40
246
|
}
|
|
41
247
|
//# sourceMappingURL=keychain.js.map
|
package/dist/keychain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"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"}
|
package/dist/keys-setup.js
CHANGED
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
* (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY).
|
|
7
7
|
* 2. For any provider still missing a key, open ONE browser page that
|
|
8
8
|
* collects them all at once and posts them straight to a localhost
|
|
9
|
-
* loopback server →
|
|
9
|
+
* loopback server → the local secret store. Zero terminal typing.
|
|
10
10
|
*
|
|
11
|
-
* Keys are stored only in the
|
|
11
|
+
* Keys are stored only in the local secret store (see keychain.ts: OS keychain
|
|
12
|
+
* on macOS, an encrypted file elsewhere) and never transit crosscheckagent.com.
|
|
12
13
|
* Power users who want to type a single key can still use
|
|
13
14
|
* `crosscheck keys add <provider> --paste`.
|
|
14
15
|
*/
|
|
@@ -53,8 +54,8 @@ export async function importEnvKeys() {
|
|
|
53
54
|
/** Standalone `crosscheck keys setup`: env-import, then one browser page for the rest. */
|
|
54
55
|
export async function runKeysSetup() {
|
|
55
56
|
log("");
|
|
56
|
-
log("Setting up provider keys. They're stored
|
|
57
|
-
log("sent to Crosscheck — you bring your own keys.");
|
|
57
|
+
log("Setting up provider keys. They're stored locally on your machine and");
|
|
58
|
+
log("never sent to Crosscheck — you bring your own keys.");
|
|
58
59
|
log("");
|
|
59
60
|
const { configured: base, need } = await importEnvKeys();
|
|
60
61
|
let configured = base;
|
|
@@ -71,7 +72,7 @@ export async function runKeysSetup() {
|
|
|
71
72
|
const n = Object.keys(captured).length;
|
|
72
73
|
log("");
|
|
73
74
|
log(n > 0
|
|
74
|
-
? `✓ Saved ${n} provider key${n === 1 ? "" : "s"}
|
|
75
|
+
? `✓ Saved ${n} provider key${n === 1 ? "" : "s"} locally on this machine.`
|
|
75
76
|
: "No keys entered. Run `crosscheck keys setup` any time to add them.");
|
|
76
77
|
}
|
|
77
78
|
catch (err) {
|
package/dist/keys-setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys-setup.js","sourceRoot":"","sources":["../src/keys-setup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"keys-setup.js","sourceRoot":"","sources":["../src/keys-setup.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.js
CHANGED
|
@@ -74,7 +74,8 @@ export async function startMcpServer() {
|
|
|
74
74
|
// 1. License gate.
|
|
75
75
|
const jwt = await getSecret("jwt");
|
|
76
76
|
if (!jwt) {
|
|
77
|
-
process.stderr.write("Not activated. Run `crosscheck
|
|
77
|
+
process.stderr.write("Not activated. Run `crosscheck install` first.\n" +
|
|
78
|
+
"(If you just installed and this looks wrong, run `crosscheck doctor` to diagnose.)\n");
|
|
78
79
|
process.exit(1);
|
|
79
80
|
}
|
|
80
81
|
const verified = await verifyJwt(jwt);
|
|
@@ -89,7 +90,7 @@ export async function startMcpServer() {
|
|
|
89
90
|
process.stderr.write("\ncrosscheck: no provider keys found, so there are no models to orchestrate yet.\n" +
|
|
90
91
|
"\nAdd at least one (Anthropic, OpenAI, Google, or xAI) — one browser page, no typing:\n" +
|
|
91
92
|
"\n npx -y crosscheck-cli@latest keys setup\n" +
|
|
92
|
-
"\nYour keys are stored
|
|
93
|
+
"\nYour keys are stored locally on your machine and never sent to Crosscheck.\n" +
|
|
93
94
|
"Then reconnect MCP servers in Claude Code (or restart it).\n\n");
|
|
94
95
|
process.exit(1);
|
|
95
96
|
}
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,oFAAoF;AACpF,MAAM,YAAY,GAA4B;IAC5C,CAAC,eAAe,EAAE,mBAAmB,CAAC;IACtC,CAAC,YAAY,EAAE,gBAAgB,CAAC;IAChC,CAAC,YAAY,EAAE,gBAAgB,CAAC;IAChC,CAAC,UAAU,EAAE,aAAa,CAAC;IAC3B,CAAC,UAAU,EAAE,cAAc,CAAC;IAC5B,CAAC,cAAc,EAAE,kBAAkB,CAAC;IACpC,CAAC,aAAa,EAAE,iBAAiB,CAAC;CACnC,CAAC;AAEF,KAAK,UAAU,gBAAgB;IAC7B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC;YAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,qBAAqB;IAC5B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC9C,uEAAuE;QACvE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,2EAA2E;QAC3E,wDAAwD;QACxD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,cAAc,IAAI,uBAAuB,EAAE,CAAC,EAAE,CAAC;IACxF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,mBAAmB;IACnB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crosscheck-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"description": "Crosscheck — multi-LLM orchestration MCP for the terminal. Single-machine activation, BYO upstream LLM keys, content-free telemetry. Installs into Claude Code in one command.",
|
|
5
5
|
"license": "SEE LICENSE.md",
|
|
6
6
|
"type": "module",
|
|
@@ -27,8 +27,6 @@
|
|
|
27
27
|
"prepublishOnly": "npm run build"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
31
|
-
"@napi-rs/keyring": "^1.3.0",
|
|
32
30
|
"crosscheck-mcp": "^0.1.3"
|
|
33
31
|
},
|
|
34
32
|
"devDependencies": {
|