@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.
- package/LICENSE +21 -0
- package/README.md +22 -0
- package/dist/args.d.ts +12 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +88 -0
- package/dist/args.js.map +1 -0
- package/dist/attachment-resolver.d.ts +11 -0
- package/dist/attachment-resolver.d.ts.map +1 -0
- package/dist/attachment-resolver.js +61 -0
- package/dist/attachment-resolver.js.map +1 -0
- package/dist/capabilities.d.ts +13 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +90 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/claudexord.d.ts +3 -0
- package/dist/claudexord.d.ts.map +1 -0
- package/dist/claudexord.js +564 -0
- package/dist/claudexord.js.map +1 -0
- package/dist/cli-io.d.ts +28 -0
- package/dist/cli-io.d.ts.map +1 -0
- package/dist/cli-io.js +37 -0
- package/dist/cli-io.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1459 -0
- package/dist/cli.js.map +1 -0
- package/dist/command-registry.d.ts +105 -0
- package/dist/command-registry.d.ts.map +1 -0
- package/dist/command-registry.js +516 -0
- package/dist/command-registry.js.map +1 -0
- package/dist/daemon-lifecycle.d.ts +18 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -0
- package/dist/daemon-lifecycle.js +62 -0
- package/dist/daemon-lifecycle.js.map +1 -0
- package/dist/daemon-run.d.ts +86 -0
- package/dist/daemon-run.d.ts.map +1 -0
- package/dist/daemon-run.js +269 -0
- package/dist/daemon-run.js.map +1 -0
- package/dist/decision.d.ts +18 -0
- package/dist/decision.d.ts.map +1 -0
- package/dist/decision.js +46 -0
- package/dist/decision.js.map +1 -0
- package/dist/live.d.ts +26 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +311 -0
- package/dist/live.js.map +1 -0
- package/dist/mcp-runner.d.ts +41 -0
- package/dist/mcp-runner.d.ts.map +1 -0
- package/dist/mcp-runner.js +306 -0
- package/dist/mcp-runner.js.map +1 -0
- package/dist/ops-commands.d.ts +11 -0
- package/dist/ops-commands.d.ts.map +1 -0
- package/dist/ops-commands.js +358 -0
- package/dist/ops-commands.js.map +1 -0
- package/dist/orchestrate-options.d.ts +9 -0
- package/dist/orchestrate-options.d.ts.map +1 -0
- package/dist/orchestrate-options.js +16 -0
- package/dist/orchestrate-options.js.map +1 -0
- package/dist/orphan-reaper.d.ts +9 -0
- package/dist/orphan-reaper.d.ts.map +1 -0
- package/dist/orphan-reaper.js +97 -0
- package/dist/orphan-reaper.js.map +1 -0
- package/dist/orphan-sweeper.d.ts +7 -0
- package/dist/orphan-sweeper.d.ts.map +1 -0
- package/dist/orphan-sweeper.js +289 -0
- package/dist/orphan-sweeper.js.map +1 -0
- package/dist/plugins.d.ts +44 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +1383 -0
- package/dist/plugins.js.map +1 -0
- package/dist/primary-output.d.ts +14 -0
- package/dist/primary-output.d.ts.map +1 -0
- package/dist/primary-output.js +34 -0
- package/dist/primary-output.js.map +1 -0
- package/dist/registry.d.ts +26 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +71 -0
- package/dist/registry.js.map +1 -0
- package/dist/release.d.ts +14 -0
- package/dist/release.d.ts.map +1 -0
- package/dist/release.js +49 -0
- package/dist/release.js.map +1 -0
- package/dist/repl.d.ts +26 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +277 -0
- package/dist/repl.js.map +1 -0
- package/dist/review-command.d.ts +3 -0
- package/dist/review-command.d.ts.map +1 -0
- package/dist/review-command.js +83 -0
- package/dist/review-command.js.map +1 -0
- package/dist/reviewer-options.d.ts +18 -0
- package/dist/reviewer-options.d.ts.map +1 -0
- package/dist/reviewer-options.js +110 -0
- package/dist/reviewer-options.js.map +1 -0
- package/dist/run-options.d.ts +8 -0
- package/dist/run-options.d.ts.map +1 -0
- package/dist/run-options.js +50 -0
- package/dist/run-options.js.map +1 -0
- package/dist/run-secret-scan.d.ts +2 -0
- package/dist/run-secret-scan.d.ts.map +1 -0
- package/dist/run-secret-scan.js +5 -0
- package/dist/run-secret-scan.js.map +1 -0
- package/dist/settings-command.d.ts +3 -0
- package/dist/settings-command.d.ts.map +1 -0
- package/dist/settings-command.js +202 -0
- package/dist/settings-command.js.map +1 -0
- package/dist/settings-display.d.ts +3 -0
- package/dist/settings-display.d.ts.map +1 -0
- package/dist/settings-display.js +33 -0
- package/dist/settings-display.js.map +1 -0
- package/dist/settings-service.d.ts +15 -0
- package/dist/settings-service.d.ts.map +1 -0
- package/dist/settings-service.js +91 -0
- package/dist/settings-service.js.map +1 -0
- package/dist/setup-jobs.d.ts +28 -0
- package/dist/setup-jobs.d.ts.map +1 -0
- package/dist/setup-jobs.js +477 -0
- package/dist/setup-jobs.js.map +1 -0
- package/dist/spec.d.ts +84 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +438 -0
- package/dist/spec.js.map +1 -0
- package/dist/trust-command.d.ts +3 -0
- package/dist/trust-command.d.ts.map +1 -0
- package/dist/trust-command.js +80 -0
- package/dist/trust-command.js.map +1 -0
- package/dist/trust-services.d.ts +7 -0
- package/dist/trust-services.d.ts.map +1 -0
- package/dist/trust-services.js +35 -0
- package/dist/trust-services.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { appendFileSync, chmodSync, mkdirSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { isAbsolute, join } from "node:path";
|
|
4
|
+
import { DaemonClient, DaemonServer, InteractionRegistry, RunEventBus, ThreadStore, daemonDir, defaultSocketPath, ensureToken, logPath, socketAlive, } from "@claudexor/daemon";
|
|
5
|
+
import { DaemonControlApiServer, normalizeRunStartRequest } from "@claudexor/control-api";
|
|
6
|
+
import { armDaemonLifecycle, runStartupCrashGc } from "./daemon-lifecycle.js";
|
|
7
|
+
import { Orchestrator } from "@claudexor/orchestrator";
|
|
8
|
+
import { loadConfig, updateGlobalConfig } from "@claudexor/config";
|
|
9
|
+
import { listTrustService, updateTrustService } from "./trust-services.js";
|
|
10
|
+
import { SecretStore } from "@claudexor/secrets";
|
|
11
|
+
import { ensureThreadWorktree, diffStaged, git, snapshotTree } from "@claudexor/workspace";
|
|
12
|
+
import { deliver } from "@claudexor/delivery";
|
|
13
|
+
import { containsSecretLikeToken, noProjectRepoRoot, readTextSafe, } from "@claudexor/util";
|
|
14
|
+
import { ControlSettingsUpdateRequest, InterviewAnswer, } from "@claudexor/schema";
|
|
15
|
+
import { invalidateDoctorCache, validateModel } from "@claudexor/core";
|
|
16
|
+
import { resolveAttachments } from "./attachment-resolver.js";
|
|
17
|
+
import { buildGateway, buildRegistry, harnessModels } from "./registry.js";
|
|
18
|
+
import { buildAgentCapabilityCatalog } from "./capabilities.js";
|
|
19
|
+
import { applyHarnessSettingsPatches, assertSettingsPatchValid } from "./settings-service.js";
|
|
20
|
+
import { createSetupJobManager } from "./setup-jobs.js";
|
|
21
|
+
import { buildGroundingPrompt, extractQuestionsFromPlan, freezeSpecFromGrounding, persistSpec, } from "./spec.js";
|
|
22
|
+
const NO_PROJECT_ROOT = noProjectRepoRoot();
|
|
23
|
+
async function main() {
|
|
24
|
+
// The daemon dir holds the auth token, jobs registry, and setup logs: it must
|
|
25
|
+
// never be group/world readable (mkdir mode only applies on creation).
|
|
26
|
+
mkdirSync(daemonDir(), { recursive: true, mode: 0o700 });
|
|
27
|
+
chmodSync(daemonDir(), 0o700);
|
|
28
|
+
const token = ensureToken();
|
|
29
|
+
const socketPath = defaultSocketPath();
|
|
30
|
+
// Live observation plane: every RunEvent is pushed onto the in-process bus
|
|
31
|
+
// (SSE latency drops to immediate; events.jsonl stays the canonical log) and
|
|
32
|
+
// harness questions park in the interaction registry until answered.
|
|
33
|
+
const bus = new RunEventBus();
|
|
34
|
+
const interactions = new InteractionRegistry();
|
|
35
|
+
// Thread/session SSOT: durable conversation registry; vendor CLI session
|
|
36
|
+
// ids are the re-hostable cache that lets later turns resume natively.
|
|
37
|
+
const threads = new ThreadStore(join(daemonDir(), "threads.json"));
|
|
38
|
+
const server = new DaemonServer({
|
|
39
|
+
socketPath,
|
|
40
|
+
token,
|
|
41
|
+
// Durable run registry so the run list survives a daemon/Mac restart.
|
|
42
|
+
persistPath: join(daemonDir(), "jobs.json"),
|
|
43
|
+
// A terminal run must stop advertising waiting_on_user immediately —
|
|
44
|
+
// cancelled/failed runs otherwise park their questions in the registry
|
|
45
|
+
// until the interaction timeout.
|
|
46
|
+
onRunTerminal: (runId) => interactions.dropForRun(runId),
|
|
47
|
+
// A turn whose job died BEFORE a run bound (trust gate, preflight throw)
|
|
48
|
+
// records the refusal on itself — the chat renders it inline instead of
|
|
49
|
+
// an eternally-empty bubble.
|
|
50
|
+
onTurnEnqueueFailed: (turnId, error, code) => threads.setTurnEnqueueError(turnId, error, code),
|
|
51
|
+
runner: async (params, ctx) => {
|
|
52
|
+
const p = normalizeDaemonRunStart(params);
|
|
53
|
+
const mode = p.mode;
|
|
54
|
+
const noProjectAsk = mode === "ask" && p.scope.kind === "none";
|
|
55
|
+
const repoRoot = p.scope.kind === "project" ? p.scope.root : NO_PROJECT_ROOT;
|
|
56
|
+
if (noProjectAsk)
|
|
57
|
+
mkdirSync(NO_PROJECT_ROOT, { recursive: true, mode: 0o700 });
|
|
58
|
+
const orchestrator = new Orchestrator({
|
|
59
|
+
registry: buildRegistry(),
|
|
60
|
+
portfolio: p.portfolio,
|
|
61
|
+
reviewerPanel: p.reviewerPanel,
|
|
62
|
+
reviewerModels: p.reviewerModels && typeof p.reviewerModels === "object" ? p.reviewerModels : undefined,
|
|
63
|
+
reviewerEfforts: p.reviewerEfforts && typeof p.reviewerEfforts === "object"
|
|
64
|
+
? p.reviewerEfforts
|
|
65
|
+
: undefined,
|
|
66
|
+
});
|
|
67
|
+
// Fail loud on bogus socket-caller thread/turn ids (job settles failed).
|
|
68
|
+
const { threadId, turnId } = threads.assertKnownIds(p.threadId, p.turnId);
|
|
69
|
+
// Resolve the execution tree: an ISOLATED thread runs in its persistent
|
|
70
|
+
// worktree (lazily created); in-place threads and ordinary runs use the
|
|
71
|
+
// project root. Config/artifacts stay anchored to repoRoot either way.
|
|
72
|
+
let executionRoot;
|
|
73
|
+
let inPlace = p.execution.isolation === "live";
|
|
74
|
+
if (threadId && repoRoot !== NO_PROJECT_ROOT) {
|
|
75
|
+
const thread = threads.getThread(threadId);
|
|
76
|
+
if (thread?.workspace.mode === "isolated") {
|
|
77
|
+
const wt = await ensureThreadWorktree(repoRoot, threadId);
|
|
78
|
+
executionRoot = wt.path;
|
|
79
|
+
// Persist the base ONLY on creation: `apply` advances base_sha, and a
|
|
80
|
+
// later turn must not clobber it back to the worktree HEAD (which never
|
|
81
|
+
// moves, since turns don't commit) — that would re-apply old work.
|
|
82
|
+
if (wt.created)
|
|
83
|
+
threads.setThreadWorktree(threadId, wt.path, wt.baseSha);
|
|
84
|
+
inPlace = true; // isolated turns run in-place WITHIN the worktree
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Single-writer turn binding: control-api pre-creates the turn and passes
|
|
88
|
+
// its id, which we bind when the run starts. A thread run WITHOUT a
|
|
89
|
+
// pre-created turn (a direct POST /runs with threadId) gets its turn
|
|
90
|
+
// created and bound here, so "a run is always recorded on its thread".
|
|
91
|
+
const onRunStart = (info) => {
|
|
92
|
+
ctx.onRunStart?.(info);
|
|
93
|
+
if (!threadId)
|
|
94
|
+
return;
|
|
95
|
+
try {
|
|
96
|
+
if (turnId) {
|
|
97
|
+
threads.bindTurnRun(turnId, info.runId);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const turn = threads.createTurn(threadId, String(p.prompt ?? ""), {
|
|
101
|
+
parentRunId: typeof p.parentRunId === "string" ? p.parentRunId : null,
|
|
102
|
+
});
|
|
103
|
+
threads.bindTurnRun(turn.id, info.runId);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
/* turn binding must never fail the run */
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
return orchestrator.run({
|
|
111
|
+
onEvent: (event) => bus.publish(event),
|
|
112
|
+
onInteraction: (ctx2) => interactions.register(ctx2),
|
|
113
|
+
interactionTimeoutMs: loadConfig(repoRoot).global.interaction_timeout_ms,
|
|
114
|
+
threadId,
|
|
115
|
+
executionRoot,
|
|
116
|
+
// Native session continuity: resume each routed harness's own prior
|
|
117
|
+
// conversation in this thread; record new native ids for future turns.
|
|
118
|
+
resumeSessions: threadId ? threads.resumeMap(threadId) : undefined,
|
|
119
|
+
onSessionObserved: threadId
|
|
120
|
+
? (harnessId, nativeSessionId, observedModel) => threads.recordSession(threadId, harnessId, nativeSessionId, observedModel)
|
|
121
|
+
: undefined,
|
|
122
|
+
authPreference: p.authPreference,
|
|
123
|
+
// Orchestrate autonomy (suggest/auto_safe/auto_full): consumed by the
|
|
124
|
+
// executor in runOrchestrate. The daemon also lends the executor a live
|
|
125
|
+
// answer-delivery service for answer_question steps (the engine does not
|
|
126
|
+
// own the interaction registry).
|
|
127
|
+
autonomy: p.autonomy,
|
|
128
|
+
answerInteraction: async (subRunId, interactionId, answers) => interactions.answer(subRunId, interactionId, answers).status === "delivered",
|
|
129
|
+
repoRoot,
|
|
130
|
+
prompt: String(p.prompt ?? ""),
|
|
131
|
+
// Attachments ride on the turn (resolved to scoped paths); a direct
|
|
132
|
+
// POST /runs without a turn resolves them here. Never base64 in jobs.json.
|
|
133
|
+
attachments: turnId
|
|
134
|
+
? (threads.getTurn(turnId)?.attachments ?? [])
|
|
135
|
+
: resolveAttachments(p.attachments),
|
|
136
|
+
// Agent-driven browser opt-in (Playwright MCP). The orchestrator gates it
|
|
137
|
+
// on the harness's browser_tool capability + web policy != off.
|
|
138
|
+
browser: p.browser === true,
|
|
139
|
+
mode: p.mode,
|
|
140
|
+
contextMode: noProjectAsk
|
|
141
|
+
? "off"
|
|
142
|
+
: p.scope.kind === "project"
|
|
143
|
+
? p.scope.context
|
|
144
|
+
: undefined,
|
|
145
|
+
harnesses: p.harnesses,
|
|
146
|
+
primaryHarness: p.primaryHarness,
|
|
147
|
+
portfolio: p.portfolio,
|
|
148
|
+
n: p.n,
|
|
149
|
+
attempts: p.attempts ?? null,
|
|
150
|
+
untilClean: p.untilClean === true,
|
|
151
|
+
swarm: p.swarm === true,
|
|
152
|
+
create: p.create === true,
|
|
153
|
+
synthesis: p.synthesis,
|
|
154
|
+
// Policy from the GUI composer / API client (applied, not just displayed).
|
|
155
|
+
maxUsd: p.maxUsd ?? null,
|
|
156
|
+
maxToolCalls: p.maxToolCalls ?? null,
|
|
157
|
+
access: p.access,
|
|
158
|
+
web: p.web ?? p.externalContextPolicy,
|
|
159
|
+
externalContextPolicy: p.externalContextPolicy ?? p.web,
|
|
160
|
+
model: p.model,
|
|
161
|
+
models: p.models,
|
|
162
|
+
effort: p.effort,
|
|
163
|
+
tests: Array.isArray(p.tests) ? p.tests : undefined,
|
|
164
|
+
protectedPathApprovals: Array.isArray(p.protectedPathApprovals)
|
|
165
|
+
? p.protectedPathApprovals
|
|
166
|
+
: undefined,
|
|
167
|
+
specId: typeof p.specId === "string" ? p.specId : undefined,
|
|
168
|
+
specHash: typeof p.specHash === "string" ? p.specHash : undefined,
|
|
169
|
+
specPath: typeof p.specPath === "string" ? p.specPath : undefined,
|
|
170
|
+
inPlace,
|
|
171
|
+
signal: ctx.signal,
|
|
172
|
+
onRunStart,
|
|
173
|
+
});
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
// SINGLETON GUARD FIRST: a second claudexord must refuse BEFORE crash GC —
|
|
177
|
+
// otherwise it would reap the LIVE daemon's recorded children and sweep
|
|
178
|
+
// envelopes its running jobs still own. server.start() re-checks (race-safe
|
|
179
|
+
// enough: the window between the probe and listen is milliseconds, and GC
|
|
180
|
+
// only runs when the probe found no live daemon).
|
|
181
|
+
if (await socketAlive(socketPath)) {
|
|
182
|
+
throw new Error(`a claudexor daemon is already listening on ${socketPath}; stop it first`);
|
|
183
|
+
}
|
|
184
|
+
// Crash GC before any new work (reap surviving children, sweep orphaned
|
|
185
|
+
// envelopes/branches/tmp-homes), then arm live-children bookkeeping and
|
|
186
|
+
// graceful SIGTERM/SIGINT shutdown.
|
|
187
|
+
await runStartupCrashGc({ daemonDir: daemonDir(), logPath: logPath() });
|
|
188
|
+
await server.start();
|
|
189
|
+
appendFileSync(logPath(), `[${new Date().toISOString()}] claudexord listening on ${socketPath}\n`);
|
|
190
|
+
const lifecycle = armDaemonLifecycle({
|
|
191
|
+
daemonDir: daemonDir(),
|
|
192
|
+
logPath: logPath(),
|
|
193
|
+
stop: () => server.stop(),
|
|
194
|
+
});
|
|
195
|
+
const control = process.env.CLAUDEXOR_NO_CONTROL_API === "1"
|
|
196
|
+
? null
|
|
197
|
+
: new DaemonControlApiServer({
|
|
198
|
+
token,
|
|
199
|
+
daemon: new DaemonClient(socketPath, token),
|
|
200
|
+
port: Number(process.env.CLAUDEXOR_CONTROL_PORT ?? 0),
|
|
201
|
+
bus,
|
|
202
|
+
services: controlServices(interactions, threads),
|
|
203
|
+
});
|
|
204
|
+
if (control) {
|
|
205
|
+
const controlAddr = await control.start();
|
|
206
|
+
writeFileSync(join(daemonDir(), "control-api.json"), JSON.stringify({ ...controlAddr, tokenPath: join(daemonDir(), "token") }, null, 2) + "\n", { mode: 0o600 });
|
|
207
|
+
appendFileSync(logPath(), `[${new Date().toISOString()}] claudexor control-api listening on http://${controlAddr.host}:${controlAddr.port}\n`);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
appendFileSync(logPath(), `[${new Date().toISOString()}] claudexor control-api disabled by CLAUDEXOR_NO_CONTROL_API=1\n`);
|
|
211
|
+
}
|
|
212
|
+
await server.waitForShutdown();
|
|
213
|
+
await control?.stop();
|
|
214
|
+
lifecycle.finalize();
|
|
215
|
+
appendFileSync(logPath(), `[${new Date().toISOString()}] claudexord shut down\n`);
|
|
216
|
+
process.exit(0);
|
|
217
|
+
}
|
|
218
|
+
// Run-start normalization has exactly one owner (control-api); the socket
|
|
219
|
+
// runner path delegates so scope/secret/absolute-root rules cannot drift.
|
|
220
|
+
const normalizeDaemonRunStart = (raw) => normalizeRunStartRequest(raw);
|
|
221
|
+
function projectRootFromScopedInput(p, purpose) {
|
|
222
|
+
if ("repoRoot" in p)
|
|
223
|
+
throw new Error("legacy repoRoot field is not accepted; use scope.kind=project with scope.root");
|
|
224
|
+
const scope = p["scope"];
|
|
225
|
+
if (!scope || typeof scope !== "object" || Array.isArray(scope))
|
|
226
|
+
throw new Error(`project scope is required for ${purpose}`);
|
|
227
|
+
const s = scope;
|
|
228
|
+
if (s["kind"] !== "project")
|
|
229
|
+
throw new Error(`project scope is required for ${purpose}`);
|
|
230
|
+
const root = typeof s["root"] === "string" ? s["root"].trim() : "";
|
|
231
|
+
if (!root)
|
|
232
|
+
throw new Error(`project scope root is required for ${purpose}`);
|
|
233
|
+
if (!isAbsolute(root))
|
|
234
|
+
throw new Error("project root must be an absolute path");
|
|
235
|
+
return root;
|
|
236
|
+
}
|
|
237
|
+
/** Deliver an isolated thread's accumulated worktree diff to its project. */
|
|
238
|
+
async function applyThreadDiff(threads, id, opts) {
|
|
239
|
+
const thread = threads.getThread(id);
|
|
240
|
+
if (!thread)
|
|
241
|
+
throw Object.assign(new Error(`no such thread: ${id}`), { status: 404 });
|
|
242
|
+
const ws = thread.workspace;
|
|
243
|
+
if (ws.mode !== "isolated" || !ws.worktree_path || !thread.repo) {
|
|
244
|
+
throw Object.assign(new Error("thread has no isolated worktree to apply (in-place threads write the project directly)"), { status: 400 });
|
|
245
|
+
}
|
|
246
|
+
const projectRoot = thread.repo.root;
|
|
247
|
+
const base = ws.base_sha ?? "HEAD";
|
|
248
|
+
const patch = await diffStaged(ws.worktree_path, base);
|
|
249
|
+
if (!patch.trim())
|
|
250
|
+
return { applied: false, status: "empty", headMoved: false, detail: "no changes to apply" };
|
|
251
|
+
if (containsSecretLikeToken(patch))
|
|
252
|
+
return {
|
|
253
|
+
applied: false,
|
|
254
|
+
status: "rejected",
|
|
255
|
+
headMoved: false,
|
|
256
|
+
detail: "patch contains a secret-like token; refusing apply",
|
|
257
|
+
};
|
|
258
|
+
// Best-effort: did the PROJECT advance past where this thread branched? (a
|
|
259
|
+
// warning, not a blocker — git apply --3way still merges or fails loudly.)
|
|
260
|
+
let headMoved = false;
|
|
261
|
+
try {
|
|
262
|
+
const head = (await git(projectRoot, ["rev-parse", "HEAD"])).stdout.trim();
|
|
263
|
+
const mb = (await git(projectRoot, ["merge-base", "HEAD", base])).stdout.trim();
|
|
264
|
+
headMoved = mb !== "" && head !== "" && mb !== head;
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
/* best-effort */
|
|
268
|
+
}
|
|
269
|
+
const mode = (["apply", "branch", "commit", "pr"].includes(opts.mode) ? opts.mode : "apply");
|
|
270
|
+
const delivered = await deliver(projectRoot, patch, {
|
|
271
|
+
mode,
|
|
272
|
+
branch: opts.branch,
|
|
273
|
+
message: opts.message,
|
|
274
|
+
});
|
|
275
|
+
if (delivered.applied) {
|
|
276
|
+
// Re-base the thread on the new project state so the next apply diffs only new work.
|
|
277
|
+
threads.setThreadWorktree(id, ws.worktree_path, await snapshotTree(ws.worktree_path));
|
|
278
|
+
}
|
|
279
|
+
const status = !delivered.applied
|
|
280
|
+
? "conflict"
|
|
281
|
+
: mode === "branch"
|
|
282
|
+
? "branched"
|
|
283
|
+
: mode === "commit"
|
|
284
|
+
? "committed"
|
|
285
|
+
: mode === "pr"
|
|
286
|
+
? "pr_opened"
|
|
287
|
+
: "applied";
|
|
288
|
+
return { applied: delivered.applied, status, headMoved, detail: delivered.detail ?? null };
|
|
289
|
+
}
|
|
290
|
+
function controlServices(interactions, threads) {
|
|
291
|
+
const secretStore = new SecretStore();
|
|
292
|
+
const setupJobs = createSetupJobManager();
|
|
293
|
+
mkdirSync(NO_PROJECT_ROOT, { recursive: true, mode: 0o700 });
|
|
294
|
+
return {
|
|
295
|
+
createThread: async (input) => threads.createThread((input ?? {})),
|
|
296
|
+
listThreads: async () => ({ threads: threads.listThreads() }),
|
|
297
|
+
threadDetail: async (id) => {
|
|
298
|
+
const thread = threads.getThread(id);
|
|
299
|
+
if (!thread)
|
|
300
|
+
throw Object.assign(new Error(`no such thread: ${id}`), { status: 404 });
|
|
301
|
+
return {
|
|
302
|
+
thread: thread,
|
|
303
|
+
sessions: threads.sessionsForThread(id),
|
|
304
|
+
turns: threads.turnsFor(id),
|
|
305
|
+
};
|
|
306
|
+
},
|
|
307
|
+
createThreadTurn: async (id, prompt, opts) => threads.createTurn(id, prompt, {
|
|
308
|
+
kind: opts.kind,
|
|
309
|
+
parentRunId: opts.parentRunId,
|
|
310
|
+
planRunId: opts.planRunId,
|
|
311
|
+
attachments: resolveAttachments(opts.attachments),
|
|
312
|
+
}),
|
|
313
|
+
updateThread: async (id, patch) => threads.updateThread(id, {
|
|
314
|
+
title: patch.title,
|
|
315
|
+
state: patch.state,
|
|
316
|
+
primaryHarness: patch.primaryHarness,
|
|
317
|
+
eligibleHarnesses: patch.eligibleHarnesses,
|
|
318
|
+
}),
|
|
319
|
+
applyThread: async (id, opts) => applyThreadDiff(threads, id, opts),
|
|
320
|
+
setTurnEnqueueError: (turnId, message, code, retryable) => threads.setTurnEnqueueError(turnId, message, code, retryable ?? true),
|
|
321
|
+
// User-level trust surface (narrow by design): list per-repo trust files
|
|
322
|
+
// and grant/revoke ONE flag — the same file/writer `claudexor trust` owns.
|
|
323
|
+
listTrust: listTrustService,
|
|
324
|
+
updateTrust: updateTrustService,
|
|
325
|
+
pendingInteractions: (runId) => interactions.pendingForRun(runId),
|
|
326
|
+
answerInteraction: (runId, interactionId, answers) => interactions.answer(runId, interactionId, answers),
|
|
327
|
+
harnesses: async () => {
|
|
328
|
+
const statuses = await buildGateway({ includeFakes: false }).statusAll({
|
|
329
|
+
cwd: NO_PROJECT_ROOT,
|
|
330
|
+
});
|
|
331
|
+
// The doctor's configured-model truth check rides the status DTO
|
|
332
|
+
// so the UI renders the same honesty the CLI prints (never a green
|
|
333
|
+
// harness with a doomed configured model).
|
|
334
|
+
const cfg = loadConfig(NO_PROJECT_ROOT);
|
|
335
|
+
return {
|
|
336
|
+
harnesses: await Promise.all(statuses.map(async (s) => {
|
|
337
|
+
const configured = cfg.global.harnesses[s.id]?.default_model ?? null;
|
|
338
|
+
if (!configured)
|
|
339
|
+
return { ...s, configuredModel: null, configuredModelCheck: null };
|
|
340
|
+
const truth = await harnessModels(s.id, NO_PROJECT_ROOT, true);
|
|
341
|
+
const check = validateModel(configured, truth.models.map((m) => m.id), truth.source === "api" ? "api" : "manifest");
|
|
342
|
+
return { ...s, configuredModel: configured, configuredModelCheck: check };
|
|
343
|
+
})),
|
|
344
|
+
};
|
|
345
|
+
},
|
|
346
|
+
harnessModels: async (input) => harnessModels(input.harnessId, NO_PROJECT_ROOT),
|
|
347
|
+
// Derived catalog for external agents; same composer the CLI verb and the
|
|
348
|
+
// MCP tool use, so all three surfaces answer identically.
|
|
349
|
+
agentCapabilities: async () => buildAgentCapabilityCatalog(),
|
|
350
|
+
createSetupJob: async (input) => setupJobs.create(input),
|
|
351
|
+
listSetupJobs: async () => ({ jobs: setupJobs.list() }),
|
|
352
|
+
setupJobStatus: async (input) => setupJobs.status(input),
|
|
353
|
+
cancelSetupJob: async (input) => setupJobs.cancel(input),
|
|
354
|
+
confirmSetupJob: async (input) => setupJobs.confirm(input),
|
|
355
|
+
settings: async () => {
|
|
356
|
+
const cfg = loadConfig(NO_PROJECT_ROOT);
|
|
357
|
+
return {
|
|
358
|
+
sources: cfg.sources,
|
|
359
|
+
defaultPortfolio: cfg.global.default_portfolio,
|
|
360
|
+
interactionTimeoutMs: cfg.global.interaction_timeout_ms,
|
|
361
|
+
routing: {
|
|
362
|
+
defaultPolicy: cfg.global.routing.default_policy,
|
|
363
|
+
primaryHarness: cfg.global.routing.primary_harness,
|
|
364
|
+
eligibleHarnesses: cfg.global.routing.eligible_harnesses,
|
|
365
|
+
envInheritance: cfg.global.routing.env_inheritance,
|
|
366
|
+
authPreference: cfg.global.routing.auth_preference,
|
|
367
|
+
},
|
|
368
|
+
budget: {
|
|
369
|
+
maxUsdPerRun: cfg.global.budget.max_usd_per_run,
|
|
370
|
+
},
|
|
371
|
+
runtime: {
|
|
372
|
+
reviewerTimeoutMs: cfg.global.runtime.reviewer_timeout_ms,
|
|
373
|
+
harnessInactivityTimeoutMs: cfg.global.runtime.harness_inactivity_timeout_ms,
|
|
374
|
+
transientRetry: {
|
|
375
|
+
maxRetries: cfg.global.runtime.transient_retry.max_retries,
|
|
376
|
+
initialDelayMs: cfg.global.runtime.transient_retry.initial_delay_ms,
|
|
377
|
+
maxDelayMs: cfg.global.runtime.transient_retry.max_delay_ms,
|
|
378
|
+
},
|
|
379
|
+
},
|
|
380
|
+
harnesses: Object.fromEntries(Object.entries(cfg.global.harnesses).map(([id, h]) => [
|
|
381
|
+
id,
|
|
382
|
+
{
|
|
383
|
+
enabled: h.enabled,
|
|
384
|
+
defaultModel: h.default_model,
|
|
385
|
+
effort: h.effort,
|
|
386
|
+
maxTurns: h.max_turns,
|
|
387
|
+
maxRounds: h.max_rounds,
|
|
388
|
+
maxUsd: h.max_usd,
|
|
389
|
+
toolsAllow: h.tools_allow,
|
|
390
|
+
toolsDeny: h.tools_deny,
|
|
391
|
+
fallbackModel: h.fallback_model,
|
|
392
|
+
web: h.web,
|
|
393
|
+
authPreference: h.auth_preference,
|
|
394
|
+
},
|
|
395
|
+
])),
|
|
396
|
+
};
|
|
397
|
+
},
|
|
398
|
+
updateSettings: async (patch) => {
|
|
399
|
+
// FAIL LOUDLY on malformed patches: a typo'd field name or bad enum must
|
|
400
|
+
// surface as a 4xx, never be silently dropped.
|
|
401
|
+
const p = ControlSettingsUpdateRequest.parse(patch ?? {});
|
|
402
|
+
await assertSettingsPatchValid(p);
|
|
403
|
+
const nullableName = (value, current) => {
|
|
404
|
+
if (value === undefined)
|
|
405
|
+
return current;
|
|
406
|
+
if (value === null)
|
|
407
|
+
return null;
|
|
408
|
+
return value;
|
|
409
|
+
};
|
|
410
|
+
const updated = updateGlobalConfig((cfg) => ({
|
|
411
|
+
...cfg,
|
|
412
|
+
default_portfolio: p.defaultPortfolio ?? cfg.default_portfolio,
|
|
413
|
+
interaction_timeout_ms: p.interactionTimeoutMs ?? cfg.interaction_timeout_ms,
|
|
414
|
+
routing: {
|
|
415
|
+
...cfg.routing,
|
|
416
|
+
primary_harness: nullableName(p.primaryHarness, cfg.routing.primary_harness),
|
|
417
|
+
default_policy: p.routingPolicy ?? cfg.routing.default_policy,
|
|
418
|
+
env_inheritance: p.envInheritance ?? cfg.routing.env_inheritance,
|
|
419
|
+
eligible_harnesses: p.eligibleHarnesses ?? cfg.routing.eligible_harnesses,
|
|
420
|
+
auth_preference: p.authPreference ?? cfg.routing.auth_preference,
|
|
421
|
+
},
|
|
422
|
+
budget: {
|
|
423
|
+
...cfg.budget,
|
|
424
|
+
max_usd_per_run: p.clearMaxUsdPerRun === true ? null : (p.maxUsdPerRun ?? cfg.budget.max_usd_per_run),
|
|
425
|
+
},
|
|
426
|
+
harnesses: applyHarnessSettingsPatches(cfg.harnesses, p.harnesses),
|
|
427
|
+
}));
|
|
428
|
+
// Routing/auth settings change harness readiness semantics: drop the
|
|
429
|
+
// doctor TTL cache so the next /harnesses reflects the new truth.
|
|
430
|
+
invalidateDoctorCache();
|
|
431
|
+
return updated;
|
|
432
|
+
},
|
|
433
|
+
listSecrets: async () => ({
|
|
434
|
+
backend: secretStore.resolvedBackend(),
|
|
435
|
+
secrets: secretStore.list(),
|
|
436
|
+
}),
|
|
437
|
+
setSecret: async (input) => {
|
|
438
|
+
const p = (input ?? {});
|
|
439
|
+
const name = typeof p["name"] === "string" ? p["name"] : "";
|
|
440
|
+
const value = typeof p["value"] === "string" ? p["value"] : "";
|
|
441
|
+
if (!name || !value)
|
|
442
|
+
throw new Error("name and value are required");
|
|
443
|
+
const backend = secretStore.set(name, value);
|
|
444
|
+
// A new key changes auth readiness immediately: drop the doctor TTL cache.
|
|
445
|
+
invalidateDoctorCache();
|
|
446
|
+
// Keychain->file degradation is disclosed, not silent (UI shows it).
|
|
447
|
+
return {
|
|
448
|
+
name,
|
|
449
|
+
backend,
|
|
450
|
+
stored: true,
|
|
451
|
+
...(secretStore.lastFallbackReason ? { warning: secretStore.lastFallbackReason } : {}),
|
|
452
|
+
};
|
|
453
|
+
},
|
|
454
|
+
deleteSecret: async (name) => {
|
|
455
|
+
secretStore.delete(name);
|
|
456
|
+
// A removed key changes auth readiness immediately: drop the doctor cache.
|
|
457
|
+
invalidateDoctorCache();
|
|
458
|
+
return { name, deleted: true };
|
|
459
|
+
},
|
|
460
|
+
specQuestions: async (input) => {
|
|
461
|
+
const p = (input ?? {});
|
|
462
|
+
const prompt = typeof p["prompt"] === "string" ? p["prompt"] : "";
|
|
463
|
+
if (!prompt.trim())
|
|
464
|
+
throw new Error("prompt is required");
|
|
465
|
+
const repoRoot = projectRootFromScopedInput(p, "spec questions");
|
|
466
|
+
// Drive an interactive, CHOICE-BASED interview: the read-only grounding plan
|
|
467
|
+
// must end with a structured "## Open Questions" section that
|
|
468
|
+
// extractQuestionsFromPlan parses into single/multi/text questions with options.
|
|
469
|
+
// The instruction + its parser are a co-located contract pair in spec.ts.
|
|
470
|
+
// Prior tiers' answers: carried so each round goes DEEPER (adaptive interview).
|
|
471
|
+
const priorDecisions = Array.isArray(p["priorDecisions"])
|
|
472
|
+
? p["priorDecisions"].filter((d) => !!d &&
|
|
473
|
+
typeof d === "object" &&
|
|
474
|
+
typeof d.question === "string" &&
|
|
475
|
+
typeof d.answer === "string")
|
|
476
|
+
: [];
|
|
477
|
+
const plan = await new Orchestrator({ registry: buildRegistry() }).run({
|
|
478
|
+
repoRoot,
|
|
479
|
+
prompt: buildGroundingPrompt(prompt, priorDecisions),
|
|
480
|
+
mode: "plan",
|
|
481
|
+
harnesses: Array.isArray(p["harnesses"])
|
|
482
|
+
? p["harnesses"].filter((x) => typeof x === "string")
|
|
483
|
+
: undefined,
|
|
484
|
+
access: "readonly",
|
|
485
|
+
});
|
|
486
|
+
const planText = readTextSafe(join(plan.runDir, "final", "plan.md")) ?? plan.summary;
|
|
487
|
+
return {
|
|
488
|
+
planRunId: plan.runId,
|
|
489
|
+
planDir: plan.runDir,
|
|
490
|
+
questions: extractQuestionsFromPlan(planText),
|
|
491
|
+
};
|
|
492
|
+
},
|
|
493
|
+
specFreeze: async (input) => {
|
|
494
|
+
const p = (input ?? {});
|
|
495
|
+
const prompt = typeof p["prompt"] === "string" ? p["prompt"] : "";
|
|
496
|
+
const planDir = typeof p["planDir"] === "string" ? p["planDir"] : "";
|
|
497
|
+
const plan = typeof p["plan"] === "string"
|
|
498
|
+
? p["plan"]
|
|
499
|
+
: (readTextSafe(join(planDir, "final", "plan.md")) ?? "");
|
|
500
|
+
if (!prompt.trim() || !plan.trim())
|
|
501
|
+
throw new Error("prompt and plan/planDir are required");
|
|
502
|
+
const repoRoot = projectRootFromScopedInput(p, "spec freeze");
|
|
503
|
+
// Forward the full SpecAnswersFile shape — not just answers — so a client that
|
|
504
|
+
// edited the draft's summary / criteria / non-goals / gates doesn't have them
|
|
505
|
+
// silently dropped from the frozen SpecPack. Fail LOUDLY on a malformed field
|
|
506
|
+
// (e.g. tests:[123]) rather than silently filtering it.
|
|
507
|
+
const strArr = (v, field) => {
|
|
508
|
+
if (v === undefined)
|
|
509
|
+
return undefined;
|
|
510
|
+
if (!Array.isArray(v) || !v.every((x) => typeof x === "string")) {
|
|
511
|
+
throw new Error(`spec freeze: "${field}" must be an array of strings`);
|
|
512
|
+
}
|
|
513
|
+
return v;
|
|
514
|
+
};
|
|
515
|
+
const strOpt = (v, field) => {
|
|
516
|
+
if (v === undefined)
|
|
517
|
+
return undefined;
|
|
518
|
+
if (typeof v !== "string")
|
|
519
|
+
throw new Error(`spec freeze: "${field}" must be a string`);
|
|
520
|
+
return v;
|
|
521
|
+
};
|
|
522
|
+
// Schema-parse the answers at the wire boundary (Bible §3): a malformed item
|
|
523
|
+
// (missing/typed question_id, bad option_ids) fails loudly with a typed error,
|
|
524
|
+
// rather than slipping through an `as never[]` cast. Absent => no answers.
|
|
525
|
+
const answers = p["answers"] === undefined ? [] : InterviewAnswer.array().parse(p["answers"]);
|
|
526
|
+
// Multi-tier interview: prior-tier decisions are folded into decided_tradeoffs
|
|
527
|
+
// so the frozen SpecPack carries EVERY tier, not just the last one the client
|
|
528
|
+
// sent as `answers` (the v0.13 freeze-drops-prior-tiers bug, #8/#9).
|
|
529
|
+
const priorDecisions = Array.isArray(p["priorDecisions"])
|
|
530
|
+
? p["priorDecisions"].filter((d) => !!d &&
|
|
531
|
+
typeof d.question === "string" &&
|
|
532
|
+
typeof d.answer === "string")
|
|
533
|
+
: [];
|
|
534
|
+
const priorLines = priorDecisions.map((d) => `Interview (prior tier) — ${d.question} → ${d.answer}`);
|
|
535
|
+
const explicitTradeoffs = strArr(p["decided_tradeoffs"], "decided_tradeoffs") ?? [];
|
|
536
|
+
const mergedTradeoffs = [...priorLines, ...explicitTradeoffs];
|
|
537
|
+
const spec = await freezeSpecFromGrounding(prompt, plan, {
|
|
538
|
+
answers,
|
|
539
|
+
summary: strOpt(p["summary"], "summary"),
|
|
540
|
+
success_criteria: strArr(p["success_criteria"], "success_criteria"),
|
|
541
|
+
non_goals: strArr(p["non_goals"], "non_goals"),
|
|
542
|
+
forbidden_approaches: strArr(p["forbidden_approaches"], "forbidden_approaches"),
|
|
543
|
+
// undefined-when-empty keeps single-tier behavior byte-identical.
|
|
544
|
+
decided_tradeoffs: mergedTradeoffs.length ? mergedTradeoffs : undefined,
|
|
545
|
+
tests: strArr(p["tests"], "tests"),
|
|
546
|
+
});
|
|
547
|
+
const persisted = persistSpec(repoRoot, spec, plan);
|
|
548
|
+
// specPath = the frozen SpecPack file an Implement run reads (a bare specId
|
|
549
|
+
// does not load content). Single producer; the layout matches persistSpec.
|
|
550
|
+
return {
|
|
551
|
+
specId: spec.id,
|
|
552
|
+
specDir: persisted.specDir,
|
|
553
|
+
specPath: join(persisted.specDir, "spec.json"),
|
|
554
|
+
specHash: persisted.specHash,
|
|
555
|
+
changes: persisted.changes,
|
|
556
|
+
};
|
|
557
|
+
},
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
main().catch((err) => {
|
|
561
|
+
process.stderr.write(`claudexord: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
562
|
+
process.exit(1);
|
|
563
|
+
});
|
|
564
|
+
//# sourceMappingURL=claudexord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudexord.js","sourceRoot":"","sources":["../src/claudexord.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-io.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output helpers: one owner for stdout/JSON purity. `--json` mode emits
|
|
3
|
+
* exactly one JSON object on stdout; usage errors go to stderr (text mode)
|
|
4
|
+
* or a typed {ok:false,exitCode,error} object (json mode).
|
|
5
|
+
*/
|
|
6
|
+
export declare function print(s: string): void;
|
|
7
|
+
export declare function printJson(value: unknown): void;
|
|
8
|
+
export declare function printUsageError(json: boolean, error: string): number;
|
|
9
|
+
export declare function statusGlyph(status: string): string;
|
|
10
|
+
export declare function authSourceAvailability(status: {
|
|
11
|
+
manifest?: {
|
|
12
|
+
auth_modes?: string[];
|
|
13
|
+
capability_profile?: {
|
|
14
|
+
auth?: {
|
|
15
|
+
supported_sources?: string[];
|
|
16
|
+
preferred_source?: string | null;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
} | null;
|
|
20
|
+
}): string;
|
|
21
|
+
export declare function checksSummary(status: {
|
|
22
|
+
checks?: {
|
|
23
|
+
id: string;
|
|
24
|
+
status: string;
|
|
25
|
+
detail?: string;
|
|
26
|
+
}[];
|
|
27
|
+
}): string;
|
|
28
|
+
//# sourceMappingURL=cli-io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-io.d.ts","sourceRoot":"","sources":["../src/cli-io.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAErC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,kBAAkB,CAAC,EAAE;YACnB,IAAI,CAAC,EAAE;gBAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;gBAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;aAAE,CAAC;SAC3E,CAAC;KACH,GAAG,IAAI,CAAC;CACV,GAAG,MAAM,CAQT;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,MAAM,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5D,GAAG,MAAM,CAIT"}
|