@claudexor/cli 1.0.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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/dist/args.d.ts +12 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +88 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/attachment-resolver.d.ts +11 -0
  8. package/dist/attachment-resolver.d.ts.map +1 -0
  9. package/dist/attachment-resolver.js +61 -0
  10. package/dist/attachment-resolver.js.map +1 -0
  11. package/dist/capabilities.d.ts +13 -0
  12. package/dist/capabilities.d.ts.map +1 -0
  13. package/dist/capabilities.js +90 -0
  14. package/dist/capabilities.js.map +1 -0
  15. package/dist/claudexord.d.ts +3 -0
  16. package/dist/claudexord.d.ts.map +1 -0
  17. package/dist/claudexord.js +564 -0
  18. package/dist/claudexord.js.map +1 -0
  19. package/dist/cli-io.d.ts +28 -0
  20. package/dist/cli-io.d.ts.map +1 -0
  21. package/dist/cli-io.js +37 -0
  22. package/dist/cli-io.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +1459 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/command-registry.d.ts +105 -0
  28. package/dist/command-registry.d.ts.map +1 -0
  29. package/dist/command-registry.js +516 -0
  30. package/dist/command-registry.js.map +1 -0
  31. package/dist/daemon-lifecycle.d.ts +18 -0
  32. package/dist/daemon-lifecycle.d.ts.map +1 -0
  33. package/dist/daemon-lifecycle.js +62 -0
  34. package/dist/daemon-lifecycle.js.map +1 -0
  35. package/dist/daemon-run.d.ts +86 -0
  36. package/dist/daemon-run.d.ts.map +1 -0
  37. package/dist/daemon-run.js +269 -0
  38. package/dist/daemon-run.js.map +1 -0
  39. package/dist/decision.d.ts +18 -0
  40. package/dist/decision.d.ts.map +1 -0
  41. package/dist/decision.js +46 -0
  42. package/dist/decision.js.map +1 -0
  43. package/dist/live.d.ts +26 -0
  44. package/dist/live.d.ts.map +1 -0
  45. package/dist/live.js +311 -0
  46. package/dist/live.js.map +1 -0
  47. package/dist/mcp-runner.d.ts +41 -0
  48. package/dist/mcp-runner.d.ts.map +1 -0
  49. package/dist/mcp-runner.js +306 -0
  50. package/dist/mcp-runner.js.map +1 -0
  51. package/dist/ops-commands.d.ts +11 -0
  52. package/dist/ops-commands.d.ts.map +1 -0
  53. package/dist/ops-commands.js +358 -0
  54. package/dist/ops-commands.js.map +1 -0
  55. package/dist/orchestrate-options.d.ts +9 -0
  56. package/dist/orchestrate-options.d.ts.map +1 -0
  57. package/dist/orchestrate-options.js +16 -0
  58. package/dist/orchestrate-options.js.map +1 -0
  59. package/dist/orphan-reaper.d.ts +9 -0
  60. package/dist/orphan-reaper.d.ts.map +1 -0
  61. package/dist/orphan-reaper.js +97 -0
  62. package/dist/orphan-reaper.js.map +1 -0
  63. package/dist/orphan-sweeper.d.ts +7 -0
  64. package/dist/orphan-sweeper.d.ts.map +1 -0
  65. package/dist/orphan-sweeper.js +289 -0
  66. package/dist/orphan-sweeper.js.map +1 -0
  67. package/dist/plugins.d.ts +44 -0
  68. package/dist/plugins.d.ts.map +1 -0
  69. package/dist/plugins.js +1383 -0
  70. package/dist/plugins.js.map +1 -0
  71. package/dist/primary-output.d.ts +14 -0
  72. package/dist/primary-output.d.ts.map +1 -0
  73. package/dist/primary-output.js +34 -0
  74. package/dist/primary-output.js.map +1 -0
  75. package/dist/registry.d.ts +26 -0
  76. package/dist/registry.d.ts.map +1 -0
  77. package/dist/registry.js +71 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/release.d.ts +14 -0
  80. package/dist/release.d.ts.map +1 -0
  81. package/dist/release.js +49 -0
  82. package/dist/release.js.map +1 -0
  83. package/dist/repl.d.ts +26 -0
  84. package/dist/repl.d.ts.map +1 -0
  85. package/dist/repl.js +277 -0
  86. package/dist/repl.js.map +1 -0
  87. package/dist/review-command.d.ts +3 -0
  88. package/dist/review-command.d.ts.map +1 -0
  89. package/dist/review-command.js +83 -0
  90. package/dist/review-command.js.map +1 -0
  91. package/dist/reviewer-options.d.ts +18 -0
  92. package/dist/reviewer-options.d.ts.map +1 -0
  93. package/dist/reviewer-options.js +110 -0
  94. package/dist/reviewer-options.js.map +1 -0
  95. package/dist/run-options.d.ts +8 -0
  96. package/dist/run-options.d.ts.map +1 -0
  97. package/dist/run-options.js +50 -0
  98. package/dist/run-options.js.map +1 -0
  99. package/dist/run-secret-scan.d.ts +2 -0
  100. package/dist/run-secret-scan.d.ts.map +1 -0
  101. package/dist/run-secret-scan.js +5 -0
  102. package/dist/run-secret-scan.js.map +1 -0
  103. package/dist/settings-command.d.ts +3 -0
  104. package/dist/settings-command.d.ts.map +1 -0
  105. package/dist/settings-command.js +202 -0
  106. package/dist/settings-command.js.map +1 -0
  107. package/dist/settings-display.d.ts +3 -0
  108. package/dist/settings-display.d.ts.map +1 -0
  109. package/dist/settings-display.js +33 -0
  110. package/dist/settings-display.js.map +1 -0
  111. package/dist/settings-service.d.ts +15 -0
  112. package/dist/settings-service.d.ts.map +1 -0
  113. package/dist/settings-service.js +91 -0
  114. package/dist/settings-service.js.map +1 -0
  115. package/dist/setup-jobs.d.ts +28 -0
  116. package/dist/setup-jobs.d.ts.map +1 -0
  117. package/dist/setup-jobs.js +477 -0
  118. package/dist/setup-jobs.js.map +1 -0
  119. package/dist/spec.d.ts +84 -0
  120. package/dist/spec.d.ts.map +1 -0
  121. package/dist/spec.js +438 -0
  122. package/dist/spec.js.map +1 -0
  123. package/dist/trust-command.d.ts +3 -0
  124. package/dist/trust-command.d.ts.map +1 -0
  125. package/dist/trust-command.js +80 -0
  126. package/dist/trust-command.js.map +1 -0
  127. package/dist/trust-services.d.ts +7 -0
  128. package/dist/trust-services.d.ts.map +1 -0
  129. package/dist/trust-services.js +35 -0
  130. package/dist/trust-services.js.map +1 -0
  131. package/package.json +59 -0
package/dist/repl.js ADDED
@@ -0,0 +1,277 @@
1
+ import { createInterface } from "node:readline";
2
+ import process from "node:process";
3
+ import { Orchestrator } from "@claudexor/orchestrator";
4
+ import { buildRegistry } from "./registry.js";
5
+ import { renderReplHelp } from "./command-registry.js";
6
+ import { controlApiAddress, followRun } from "./live.js";
7
+ import { ensureDaemon } from "./daemon-run.js";
8
+ /** REPL turn modes that MUTATE the tree. These are ALWAYS daemon-tracked —
9
+ * there is NO in-process fallback for a mutating run (a run no daemon tracks is
10
+ * un-unblockable by the apply gate). Read-only turns (ask/plan/audit, and
11
+ * orchestrate which only plans in the REPL — no --autonomy surface here) may run
12
+ * locally when the daemon cannot be started. */
13
+ const MUTATING_REPL_MODES = new Set(["agent"]);
14
+ /** Does this REPL turn mode mutate the tree? (such turns are daemon-only.) */
15
+ export function replModeIsMutating(mode) {
16
+ return MUTATING_REPL_MODES.has(mode);
17
+ }
18
+ // Rendered from the command registry (REPL_COMMANDS) — the same one owner
19
+ // as the main CLI help.
20
+ const REPL_HELP = renderReplHelp();
21
+ function parseReplLine(line) {
22
+ const trimmed = line.trim();
23
+ if (!trimmed)
24
+ return null;
25
+ if (!trimmed.startsWith("/"))
26
+ return { mode: "agent", prompt: trimmed };
27
+ const [cmd, ...rest] = trimmed.slice(1).split(" ");
28
+ const arg = rest.join(" ").trim();
29
+ switch (cmd) {
30
+ case "ask":
31
+ return { mode: "ask", prompt: arg };
32
+ case "plan":
33
+ return { mode: "plan", prompt: arg };
34
+ case "audit":
35
+ return { mode: "audit", prompt: arg };
36
+ case "best-of":
37
+ return { mode: "agent", prompt: arg, race: true };
38
+ case "orchestrate":
39
+ return { mode: "orchestrate", prompt: arg };
40
+ case "thread":
41
+ return { command: "thread" };
42
+ case "new":
43
+ return { command: "new", arg };
44
+ case "help":
45
+ return { command: "help" };
46
+ case "quit":
47
+ case "exit":
48
+ return { command: "quit" };
49
+ default:
50
+ return { command: "help" };
51
+ }
52
+ }
53
+ /** Daemon control-api reachable right now? (threads SSOT lives there). */
54
+ async function daemonAddress() {
55
+ try {
56
+ const addr = controlApiAddress();
57
+ const res = await fetch(`${addr.baseUrl}/healthz`, { signal: AbortSignal.timeout(1500) });
58
+ return res.ok ? addr : null;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ /**
65
+ * Interactive REPL: `claudexor` with no arguments. A thread of turns over the
66
+ * project in the current directory. The REPL is a THIN CLIENT of the control
67
+ * API — threads live in the daemon SSOT and appear in the macOS app; turns
68
+ * stream live through the same follow pipeline. If no daemon is up we AUTO-START
69
+ * one (the same path `claudexor agent` uses) so mutating turns are daemon-tracked.
70
+ * Only when the daemon cannot be started at all do we fall back to an
71
+ * in-process engine — and that fallback serves READ-ONLY turns only; a mutating
72
+ * (agent) turn there FAILS LOUDLY rather than silently running an in-process
73
+ * Orchestrator that mutates the tree but no daemon tracks (un-unblockable).
74
+ */
75
+ export async function runRepl(repoRoot) {
76
+ const reachable = await daemonAddress();
77
+ if (reachable)
78
+ return runDaemonRepl(repoRoot, reachable);
79
+ // No daemon reachable: auto-start it (mutating REPL turns MUST be daemon-tracked).
80
+ try {
81
+ const { addr } = await ensureDaemon();
82
+ return runDaemonRepl(repoRoot, addr);
83
+ }
84
+ catch (err) {
85
+ process.stdout.write(`claudexor: could not start the daemon (${err instanceof Error ? err.message : String(err)}).\n` +
86
+ `Falling back to a local, READ-ONLY REPL — write turns require the daemon and will be refused.\n`);
87
+ return runLocalRepl(repoRoot);
88
+ }
89
+ }
90
+ async function runDaemonRepl(repoRoot, addr) {
91
+ const headers = { Authorization: `Bearer ${addr.token}`, "content-type": "application/json" };
92
+ const api = async (method, path, body) => {
93
+ const res = await fetch(`${addr.baseUrl}${path}`, { method, headers, body: body === undefined ? undefined : JSON.stringify(body) });
94
+ const text = await res.text();
95
+ const json = text ? JSON.parse(text) : {};
96
+ if (!res.ok)
97
+ throw new Error(typeof json?.error === "string" ? json.error : `HTTP ${res.status}`);
98
+ return json;
99
+ };
100
+ // Lazy thread: a bare `claudexor` that the user immediately quits must NOT
101
+ // litter the app with an empty "repl <date>" thread (the v0.9 leak). The
102
+ // thread is created on the first real turn (or an explicit /new), and titled
103
+ // by its first prompt server-side.
104
+ let thread = null;
105
+ // A title from `/new [title]` that applies to the next lazily-created thread.
106
+ let pendingTitle;
107
+ const ensureThread = async (title) => {
108
+ if (!thread) {
109
+ const effectiveTitle = title ?? pendingTitle;
110
+ thread = await api("POST", "/threads", { ...(effectiveTitle ? { title: effectiveTitle } : {}), scope: { kind: "project", root: repoRoot } });
111
+ pendingTitle = undefined;
112
+ }
113
+ return thread;
114
+ };
115
+ process.stdout.write(`claudexor REPL on ${repoRoot} (daemon-backed; the thread appears in the app on your first message)\nType /help for commands.\n`);
116
+ const rl = createInterface({ input: process.stdin, output: process.stdout, prompt: "claudexor> " });
117
+ rl.prompt();
118
+ for await (const line of rl) {
119
+ const parsed = parseReplLine(line);
120
+ if (!parsed) {
121
+ rl.prompt();
122
+ continue;
123
+ }
124
+ if ("command" in parsed) {
125
+ if (parsed.command === "quit")
126
+ break;
127
+ if (parsed.command === "help")
128
+ process.stdout.write(REPL_HELP + "\n");
129
+ if (parsed.command === "new") {
130
+ // Lazy: forget the current thread (and any pending title) so the NEXT
131
+ // message creates a fresh one. Eagerly POSTing here would re-introduce
132
+ // the empty-thread litter `/new` then quit was meant to avoid.
133
+ thread = null;
134
+ pendingTitle = parsed.arg || undefined;
135
+ process.stdout.write(pendingTitle ? `new thread (will be titled on your first message)\n` : "new thread (starts on your next message)\n");
136
+ }
137
+ if (parsed.command === "thread") {
138
+ if (!thread) {
139
+ process.stdout.write("no thread yet — send a message to start one\n");
140
+ rl.prompt();
141
+ continue;
142
+ }
143
+ try {
144
+ const detail = await api("GET", `/threads/${encodeURIComponent(thread.id)}`);
145
+ process.stdout.write(`thread ${detail.thread.id} (${detail.thread.title ?? "untitled"})\n`);
146
+ for (const t of detail.turns ?? [])
147
+ process.stdout.write(` turn ${t.id} run=${t.runId ?? "-"} [${t.run?.state ?? "?"}] :: ${String(t.prompt).slice(0, 80)}\n`);
148
+ for (const s of detail.sessions ?? [])
149
+ process.stdout.write(` session ${s.harnessId} native=${s.nativeSessionId ?? "-"} state=${s.state ?? "?"}\n`);
150
+ }
151
+ catch (err) {
152
+ process.stdout.write(`thread fetch failed: ${err instanceof Error ? err.message : String(err)}\n`);
153
+ }
154
+ }
155
+ rl.prompt();
156
+ continue;
157
+ }
158
+ if (!parsed.prompt) {
159
+ process.stdout.write("(empty prompt)\n");
160
+ rl.prompt();
161
+ continue;
162
+ }
163
+ try {
164
+ const active = await ensureThread();
165
+ const started = await api("POST", `/threads/${encodeURIComponent(active.id)}/turns`, {
166
+ prompt: parsed.prompt,
167
+ mode: parsed.mode,
168
+ ...(parsed.race ? { n: 2 } : {}),
169
+ });
170
+ if (started.runId) {
171
+ // Live-stream the turn through the shared follow pipeline (replay +
172
+ // push + interactive question answering). Pause our readline so the
173
+ // two stdin consumers never fight.
174
+ rl.pause();
175
+ try {
176
+ await followRun(String(started.runId), false);
177
+ }
178
+ finally {
179
+ rl.resume();
180
+ }
181
+ }
182
+ else {
183
+ process.stdout.write(`turn queued: ${JSON.stringify(started)}\n`);
184
+ }
185
+ }
186
+ catch (err) {
187
+ process.stdout.write(`turn failed: ${err instanceof Error ? err.message : String(err)}\n`);
188
+ }
189
+ rl.prompt();
190
+ }
191
+ rl.close();
192
+ process.stdout.write("bye\n");
193
+ return 0;
194
+ }
195
+ async function runLocalRepl(repoRoot) {
196
+ // No daemon (and it could not be auto-started): in-process engine with
197
+ // EPHEMERAL, in-memory continuity. There is no durable thread store here (the
198
+ // daemon owns threads.json single-writer); native session ids are kept in
199
+ // memory for this process so plan->continue still resumes within the session,
200
+ // and nothing is persisted/shared. This path is READ-ONLY — mutating
201
+ // (agent) turns are refused, never run in-process and left un-unblockable.
202
+ const orch = new Orchestrator({ registry: buildRegistry() });
203
+ let sessions = new Map();
204
+ const localTurns = [];
205
+ process.stdout.write(`claudexor REPL on ${repoRoot} (local engine; READ-ONLY ephemeral thread — start the daemon for write turns and to persist/share with the app)\nType /help for commands.\n`);
206
+ const rl = createInterface({ input: process.stdin, output: process.stdout, prompt: "claudexor> " });
207
+ rl.prompt();
208
+ for await (const line of rl) {
209
+ const parsed = parseReplLine(line);
210
+ if (!parsed) {
211
+ rl.prompt();
212
+ continue;
213
+ }
214
+ if ("command" in parsed) {
215
+ if (parsed.command === "quit")
216
+ break;
217
+ if (parsed.command === "help")
218
+ process.stdout.write(REPL_HELP + "\n");
219
+ if (parsed.command === "new") {
220
+ sessions = new Map();
221
+ localTurns.length = 0;
222
+ process.stdout.write("new ephemeral thread\n");
223
+ }
224
+ if (parsed.command === "thread") {
225
+ process.stdout.write(`ephemeral thread — ${localTurns.length} turn(s)\n`);
226
+ for (const t of localTurns)
227
+ process.stdout.write(` run=${t.runId ?? "-"} [${t.status}] :: ${t.prompt.slice(0, 80)}\n`);
228
+ for (const [harnessId, nativeId] of sessions)
229
+ process.stdout.write(` session ${harnessId} native=${nativeId}\n`);
230
+ }
231
+ rl.prompt();
232
+ continue;
233
+ }
234
+ if (!parsed.prompt) {
235
+ process.stdout.write("(empty prompt)\n");
236
+ rl.prompt();
237
+ continue;
238
+ }
239
+ // a mutating turn must be daemon-tracked. The local engine cannot
240
+ // produce an applicable/unblockable run, so refuse it loudly here instead of
241
+ // silently mutating the tree with a run no daemon owns.
242
+ if (replModeIsMutating(parsed.mode)) {
243
+ process.stdout.write("write turns require the daemon (start it with `claudexor daemon start`, then retry); this local REPL serves read-only turns (/ask, /plan, /audit, /orchestrate) only\n");
244
+ rl.prompt();
245
+ continue;
246
+ }
247
+ try {
248
+ const res = await orch.run({
249
+ repoRoot,
250
+ prompt: parsed.prompt,
251
+ mode: parsed.mode,
252
+ n: parsed.race ? 2 : undefined,
253
+ resumeSessions: Object.fromEntries(sessions),
254
+ onSessionObserved: (harnessId, nativeSessionId) => sessions.set(harnessId, nativeSessionId),
255
+ onHarnessEvent: (ev) => {
256
+ if (ev.type === "message" && ev.text)
257
+ process.stdout.write(ev.text.endsWith("\n") ? ev.text : ev.text + "\n");
258
+ else if (ev.type === "tool_call" && ev.tool)
259
+ process.stdout.write(` [tool] ${ev.tool.name}${ev.tool.target ? `: ${ev.tool.target}` : ""}\n`);
260
+ else if (ev.type === "error" && ev.error)
261
+ process.stdout.write(` [error] ${ev.error}\n`);
262
+ },
263
+ });
264
+ localTurns.push({ runId: res.runId, status: res.status, prompt: parsed.prompt });
265
+ process.stdout.write(`\n[turn done] status=${res.status} run=${res.runId}\n${res.summary ? res.summary.split("\n").slice(0, 6).join("\n") + "\n" : ""}`);
266
+ }
267
+ catch (err) {
268
+ process.stdout.write(`turn failed: ${err instanceof Error ? err.message : String(err)}\n`);
269
+ }
270
+ rl.prompt();
271
+ }
272
+ rl.close();
273
+ process.stdout.write("bye\n");
274
+ return 0;
275
+ }
276
+ export { parseReplLine };
277
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ParsedArgs } from "./args.js";
2
+ export declare function reviewCommand(args: ParsedArgs, json: boolean): Promise<number>;
3
+ //# sourceMappingURL=review-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-command.d.ts","sourceRoot":"","sources":["../src/review-command.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,UAAU,EAAuB,MAAM,WAAW,CAAC;AAQjE,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAiEpF"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * `claudexor review --diff <file>`: thin surface over the engine's
3
+ * scoped diff review — the per-commit gate's PRIMARY route. FAIL CLOSED: an
4
+ * inconclusive reviewer panel (unhealthy cross-family state or
5
+ * INSUFFICIENT_EVIDENCE findings) never reads as a pass.
6
+ */
7
+ import { readFileSync } from "node:fs";
8
+ import { Orchestrator } from "@claudexor/orchestrator";
9
+ import { isBlocking } from "@claudexor/schema";
10
+ import { parseReviewerPanelFlags } from "./run-options.js";
11
+ import { flagStr, flagValues } from "./args.js";
12
+ import { print, printJson, printUsageError } from "./cli-io.js";
13
+ import { buildRegistry } from "./registry.js";
14
+ function panelFlags(args) {
15
+ return parseReviewerPanelFlags(flagValues(args, "reviewer-panel"));
16
+ }
17
+ export async function reviewCommand(args, json) {
18
+ const diffPath = flagStr(args, "diff");
19
+ if (!diffPath) {
20
+ return printUsageError(json, 'usage: claudexor review --diff <file> [--intent "<text>"] [--tests "<evidence>"] [--reviewer-panel <list>] [--json]');
21
+ }
22
+ let diffText;
23
+ try {
24
+ diffText = readFileSync(diffPath, "utf8");
25
+ }
26
+ catch (err) {
27
+ return printUsageError(json, `claudexor review: cannot read --diff '${diffPath}': ${err instanceof Error ? err.message : String(err)}`);
28
+ }
29
+ try {
30
+ const orch = new Orchestrator({
31
+ registry: buildRegistry(),
32
+ reviewerPanel: panelFlags(args),
33
+ });
34
+ const result = await orch.reviewDiff({
35
+ repoRoot: process.cwd(),
36
+ diff: diffText,
37
+ userIntent: flagStr(args, "intent"),
38
+ tests: flagStr(args, "tests"),
39
+ });
40
+ const blockers = result.findings.filter((f) => isBlocking(f));
41
+ // FAIL CLOSED: reviewer setup/parse failures surface as
42
+ // INSUFFICIENT_EVIDENCE findings that isBlocking never counts — an
43
+ // inconclusive panel must NOT read as a pass. The pass bar matches
44
+ // convergence's "clean review": cross-family HEALTHY (parseable findings
45
+ // from >=2 families) AND VERIFIED (stream-observed route proofs).
46
+ const inconclusive = !result.crossFamilyHealthy ||
47
+ !result.crossFamilyVerified ||
48
+ result.findings.some((f) => f.severity === "INSUFFICIENT_EVIDENCE");
49
+ const ok = blockers.length === 0 && !inconclusive;
50
+ if (json) {
51
+ printJson({
52
+ ok,
53
+ inconclusive,
54
+ crossFamilyVerified: result.crossFamilyVerified,
55
+ providers: result.distinctProviders,
56
+ blockers: blockers.length,
57
+ findings: result.findings,
58
+ reviewSpendUsd: result.reviewSpendUsd,
59
+ artifactsDir: result.artifactsDir,
60
+ });
61
+ }
62
+ else {
63
+ print(`reviewers: ${result.distinctProviders.join(", ") || "none"} (cross-family verified: ${result.crossFamilyVerified})`);
64
+ for (const f of result.findings)
65
+ print(` [${f.severity}] ${f.claim}`);
66
+ print(ok
67
+ ? "review: PASS"
68
+ : inconclusive && blockers.length === 0
69
+ ? "review: INCONCLUSIVE (reviewer panel unhealthy) — fail closed"
70
+ : `review: ${blockers.length} blocking finding(s)`);
71
+ }
72
+ return ok ? 0 : 1;
73
+ }
74
+ catch (err) {
75
+ const message = err instanceof Error ? err.message : String(err);
76
+ if (json)
77
+ printJson({ ok: false, error: message });
78
+ else
79
+ process.stderr.write(`claudexor review: ${message}\n`);
80
+ return 1;
81
+ }
82
+ }
83
+ //# sourceMappingURL=review-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-command.js","sourceRoot":"","sources":["../src/review-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ProviderFamily, type ControlReviewerPanelEntry, type EffortHint as EffortHintValue } from "@claudexor/schema";
2
+ /** Parse `--reviewer-effort openai=xhigh,anthropic=high` into the control-api DTO shape. */
3
+ export declare function parseReviewerEffortMap(value: string | undefined): Partial<Record<ProviderFamily, EffortHintValue>> | undefined;
4
+ /**
5
+ * Parse `--reviewer-model openai=gpt-4o-mini,anthropic=claude-haiku` into a
6
+ * per-family model map. Fails loudly on malformed pairs / unknown families
7
+ * (mirrors parseReviewerEffortMap) — a typo'd reviewer model must never be
8
+ * silently dropped and the run continue with the default route.
9
+ */
10
+ export declare function parseReviewerModelMap(value: string | undefined): Partial<Record<ProviderFamily, string>> | undefined;
11
+ /**
12
+ * Parse `--reviewer-panel "claude=claude-opus-4-8:max,cursor=gemini-3.1-pro,cursor=gpt-5.5-extra-high"`
13
+ * into an ordered reviewer list. Entries are harness-id based, not
14
+ * provider-family based, so repeated harnesses are preserved for multi-model
15
+ * panels on the same native provider.
16
+ */
17
+ export declare function parseReviewerPanel(value: string | undefined): ControlReviewerPanelEntry[] | undefined;
18
+ //# sourceMappingURL=reviewer-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-options.d.ts","sourceRoot":"","sources":["../src/reviewer-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,KAAK,yBAAyB,EAC9B,KAAK,UAAU,IAAI,eAAe,EACnC,MAAM,mBAAmB,CAAC;AAE3B,4FAA4F;AAC5F,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,GAAG,SAAS,CAuB9D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAqBrD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,yBAAyB,EAAE,GAAG,SAAS,CAiDzC"}
@@ -0,0 +1,110 @@
1
+ import { EffortHint, ProviderFamily, } from "@claudexor/schema";
2
+ /** Parse `--reviewer-effort openai=xhigh,anthropic=high` into the control-api DTO shape. */
3
+ export function parseReviewerEffortMap(value) {
4
+ if (value === undefined)
5
+ return undefined;
6
+ const map = {};
7
+ for (const pair of value.split(",")) {
8
+ const raw = pair.trim();
9
+ if (!raw)
10
+ throw new Error("invalid --reviewer-effort value (empty comma-separated entry)");
11
+ const eq = raw.indexOf("=");
12
+ const family = (eq === -1 ? raw : raw.slice(0, eq)).trim();
13
+ const effort = (eq === -1 ? "" : raw.slice(eq + 1)).trim();
14
+ if (!family && !effort)
15
+ continue;
16
+ if (!family || !effort || effort.includes("="))
17
+ throw new Error(`invalid --reviewer-effort entry '${pair}' (expected family=effort)`);
18
+ const parsedFamily = ProviderFamily.safeParse(family);
19
+ if (!parsedFamily.success)
20
+ throw new Error(`invalid reviewer provider '${family}' (expected openai|anthropic|google|cursor|opencode|xai|local|unknown)`);
21
+ const parsed = EffortHint.safeParse(effort);
22
+ if (!parsed.success)
23
+ throw new Error(`invalid reviewer effort '${effort}' (expected low|medium|high|xhigh|max)`);
24
+ map[parsedFamily.data] = parsed.data;
25
+ }
26
+ return Object.keys(map).length > 0 ? map : undefined;
27
+ }
28
+ /**
29
+ * Parse `--reviewer-model openai=gpt-4o-mini,anthropic=claude-haiku` into a
30
+ * per-family model map. Fails loudly on malformed pairs / unknown families
31
+ * (mirrors parseReviewerEffortMap) — a typo'd reviewer model must never be
32
+ * silently dropped and the run continue with the default route.
33
+ */
34
+ export function parseReviewerModelMap(value) {
35
+ if (value === undefined)
36
+ return undefined;
37
+ const map = {};
38
+ for (const pair of value.split(",")) {
39
+ const raw = pair.trim();
40
+ if (!raw)
41
+ throw new Error("invalid --reviewer-model value (empty comma-separated entry)");
42
+ // Split on the FIRST '=' only, so a model id that itself contains '=' is preserved.
43
+ const eq = raw.indexOf("=");
44
+ const family = (eq === -1 ? raw : raw.slice(0, eq)).trim();
45
+ const model = (eq === -1 ? "" : raw.slice(eq + 1)).trim();
46
+ if (!family && !model)
47
+ continue;
48
+ if (!family || !model)
49
+ throw new Error(`invalid --reviewer-model entry '${pair}' (expected family=model)`);
50
+ const parsedFamily = ProviderFamily.safeParse(family);
51
+ if (!parsedFamily.success)
52
+ throw new Error(`invalid reviewer provider '${family}' (expected openai|anthropic|google|cursor|opencode|xai|local|unknown)`);
53
+ map[parsedFamily.data] = model;
54
+ }
55
+ return Object.keys(map).length > 0 ? map : undefined;
56
+ }
57
+ /**
58
+ * Parse `--reviewer-panel "claude=claude-opus-4-8:max,cursor=gemini-3.1-pro,cursor=gpt-5.5-extra-high"`
59
+ * into an ordered reviewer list. Entries are harness-id based, not
60
+ * provider-family based, so repeated harnesses are preserved for multi-model
61
+ * panels on the same native provider.
62
+ */
63
+ export function parseReviewerPanel(value) {
64
+ if (value === undefined)
65
+ return undefined;
66
+ const out = [];
67
+ for (const pair of value.split(",")) {
68
+ const raw = pair.trim();
69
+ if (!raw)
70
+ throw new Error(`invalid --reviewer-panel entry '${pair}' (empty entries are not allowed)`);
71
+ const eq = raw.indexOf("=");
72
+ let effort;
73
+ let harness = (eq === -1 ? raw : raw.slice(0, eq)).trim();
74
+ const rest = eq === -1 ? "" : raw.slice(eq + 1).trim();
75
+ if (eq !== -1 && !rest)
76
+ throw new Error(`invalid --reviewer-panel entry '${pair}' (missing model after '=')`);
77
+ if (eq === -1) {
78
+ const colon = harness.lastIndexOf(":");
79
+ if (colon > -1) {
80
+ const suffix = harness.slice(colon + 1).trim();
81
+ const parsedEffort = EffortHint.safeParse(suffix);
82
+ if (!parsedEffort.success)
83
+ throw new Error(`invalid --reviewer-panel entry '${pair}' (expected harness[:effort] or harness[=model[:effort]])`);
84
+ effort = parsedEffort.data;
85
+ harness = harness.slice(0, colon).trim();
86
+ }
87
+ }
88
+ if (!harness)
89
+ throw new Error(`invalid --reviewer-panel entry '${pair}' (expected harness[:effort] or harness[=model[:effort]])`);
90
+ let model = rest || undefined;
91
+ if (model) {
92
+ const colon = model.lastIndexOf(":");
93
+ if (colon > -1) {
94
+ const suffix = model.slice(colon + 1).trim();
95
+ const parsedEffort = EffortHint.safeParse(suffix);
96
+ if (parsedEffort.success) {
97
+ effort = parsedEffort.data;
98
+ model = model.slice(0, colon).trim();
99
+ if (!model)
100
+ throw new Error(`invalid --reviewer-panel entry '${pair}' (missing model after '=')`);
101
+ }
102
+ }
103
+ }
104
+ out.push({ harness, ...(model ? { model } : {}), ...(effort ? { effort } : {}) });
105
+ }
106
+ if (out.length === 0)
107
+ throw new Error("invalid --reviewer-panel value (expected at least one harness entry)");
108
+ return out;
109
+ }
110
+ //# sourceMappingURL=reviewer-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer-options.js","sourceRoot":"","sources":["../src/reviewer-options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ControlReviewerPanelEntry, EffortHint, ProtectedPathApproval, ProviderFamily } from "@claudexor/schema";
2
+ export declare function stringFlagValues(values: Array<string | boolean>, flag: string): string[];
3
+ export declare function parseProtectedPathApprovalFlags(values: Array<string | boolean>): ProtectedPathApproval[] | undefined;
4
+ export declare function parseTestCommandFlags(values: Array<string | boolean>): string[] | undefined;
5
+ export declare function parseReviewerPanelFlags(values: Array<string | boolean>): ControlReviewerPanelEntry[] | undefined;
6
+ export declare function parseReviewerModelFlags(values: Array<string | boolean>): Partial<Record<ProviderFamily, string>> | undefined;
7
+ export declare function parseReviewerEffortFlags(values: Array<string | boolean>): Partial<Record<ProviderFamily, EffortHint>> | undefined;
8
+ //# sourceMappingURL=run-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-options.d.ts","sourceRoot":"","sources":["../src/run-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,UAAU,EACV,qBAAqB,EACrB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAO3B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxF;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,GAC9B,qBAAqB,EAAE,GAAG,SAAS,CAYrC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,SAAS,CAY3F;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,GAC9B,yBAAyB,EAAE,GAAG,SAAS,CAGzC;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAGrD;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,GAAG,SAAS,CAGzD"}
@@ -0,0 +1,50 @@
1
+ import { parseReviewerEffortMap, parseReviewerModelMap, parseReviewerPanel, } from "./reviewer-options.js";
2
+ export function stringFlagValues(values, flag) {
3
+ const strings = values.filter((value) => typeof value === "string");
4
+ if (strings.length !== values.length)
5
+ throw new Error(`invalid --${flag} value (expected a value)`);
6
+ return strings;
7
+ }
8
+ export function parseProtectedPathApprovalFlags(values) {
9
+ const strings = stringFlagValues(values, "allow-protected-path");
10
+ if (strings.length === 0)
11
+ return undefined;
12
+ const paths = [];
13
+ for (const value of strings) {
14
+ for (const part of value.split(",")) {
15
+ const path = part.trim();
16
+ if (!path)
17
+ throw new Error("invalid --allow-protected-path value (empty comma-separated entry)");
18
+ paths.push(path);
19
+ }
20
+ }
21
+ return paths.map((path) => ({ path, reason: "explicit CLI --allow-protected-path" }));
22
+ }
23
+ export function parseTestCommandFlags(values) {
24
+ const strings = stringFlagValues(values, "test");
25
+ if (strings.length === 0)
26
+ return undefined;
27
+ const commands = [];
28
+ for (const value of strings) {
29
+ for (const part of value.split(";;")) {
30
+ const command = part.trim();
31
+ if (!command)
32
+ throw new Error("invalid --test value (empty ;;-separated entry)");
33
+ commands.push(command);
34
+ }
35
+ }
36
+ return commands;
37
+ }
38
+ export function parseReviewerPanelFlags(values) {
39
+ const strings = stringFlagValues(values, "reviewer-panel");
40
+ return parseReviewerPanel(strings.length > 0 ? strings.join(",") : undefined);
41
+ }
42
+ export function parseReviewerModelFlags(values) {
43
+ const strings = stringFlagValues(values, "reviewer-model");
44
+ return parseReviewerModelMap(strings.length > 0 ? strings.join(",") : undefined);
45
+ }
46
+ export function parseReviewerEffortFlags(values) {
47
+ const strings = stringFlagValues(values, "reviewer-effort");
48
+ return parseReviewerEffortMap(strings.length > 0 ? strings.join(",") : undefined);
49
+ }
50
+ //# sourceMappingURL=run-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-options.js","sourceRoot":"","sources":["../src/run-options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function assertCliRunParamsHaveNoInlineSecrets(value: unknown): void;
2
+ //# sourceMappingURL=run-secret-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-secret-scan.d.ts","sourceRoot":"","sources":["../src/run-secret-scan.ts"],"names":[],"mappings":"AAEA,wBAAgB,qCAAqC,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE1E"}
@@ -0,0 +1,5 @@
1
+ import { assertNoInlineSecretValues } from "@claudexor/util";
2
+ export function assertCliRunParamsHaveNoInlineSecrets(value) {
3
+ assertNoInlineSecretValues(value, "$", "CLI run params");
4
+ }
5
+ //# sourceMappingURL=run-secret-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-secret-scan.js","sourceRoot":"","sources":["../src/run-secret-scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,UAAU,qCAAqC,CAAC,KAAc;IAClE,0BAA0B,CAAC,KAAK,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ParsedArgs } from "./args.js";
2
+ export declare function settingsCommand(args: ParsedArgs, json: boolean): Promise<number>;
3
+ //# sourceMappingURL=settings-command.d.ts.map