lockwire 0.1.26 → 0.1.28

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.
@@ -0,0 +1,506 @@
1
+ /**
2
+ * `lockwire autofix`: run the agent the user already pays for against lockwire's work queue, then
3
+ * check what it did. lockwire supplies no model and never edits a sentence itself; it decides whether
4
+ * there is anything to do (so an agent is only started when a claim is actually wrong), hands the
5
+ * agent the fix-docs instructions and lockwire's own MCP server, and afterwards re-checks every claim
6
+ * from scratch and refuses a run that changed anything other than documentation.
7
+ *
8
+ * Agents: Claude Code (`claude -p`), Codex (`codex exec`), or any command (`--agent-command`), which
9
+ * gets the prompt and an MCP config through LOCKWIRE_PROMPT_FILE / LOCKWIRE_MCP_CONFIG.
10
+ */
11
+ import { spawn, spawnSync } from "node:child_process";
12
+ import { createHash } from "node:crypto";
13
+ import { closeSync, copyFileSync, existsSync, lstatSync, mkdirSync, mkdtempSync, openSync, readFileSync, readlinkSync, readSync, rmSync, writeFileSync, } from "node:fs";
14
+ import { readFile } from "node:fs/promises";
15
+ import { homedir, tmpdir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { fileURLToPath } from "node:url";
18
+ import { headCommit, indexEntries } from "./changed.js";
19
+ import { readConfig } from "./config.js";
20
+ import { canonicalJson } from "./hash.js";
21
+ import { ledgerPath, verifiedRecord } from "./ledger.js";
22
+ import { readLockfile } from "./lockfile.js";
23
+ import { scanMarkers } from "./markers.js";
24
+ import { isScannedDoc, resolveInsideRepo, walkFiles } from "./repo.js";
25
+ import { fixDocsPrompt, listTasks } from "./tasks.js";
26
+ /** The argv that starts a built-in agent on `prompt`. Exported so the exact flags are tested. */
27
+ export function agentArgv(agent, prompt, files, opts = {}) {
28
+ if (agent === "claude-code")
29
+ return {
30
+ command: "claude",
31
+ args: [
32
+ "-p",
33
+ prompt,
34
+ // In CI, --bare: don't run the repository's own .claude/settings.json hooks or .mcp.json
35
+ // servers (repository-controlled code) with the API key in the environment. Not locally,
36
+ // where it would also switch off a subscription login.
37
+ ...(opts.bare ? ["--bare"] : []),
38
+ "--mcp-config",
39
+ files.mcpConfig,
40
+ "--strict-mcp-config",
41
+ // Read and edit files, and use lockwire's tools; no shell, so the agent can't run repo code.
42
+ "--allowedTools",
43
+ "mcp__lockwire__*",
44
+ "Read",
45
+ "Edit",
46
+ "Write",
47
+ "Glob",
48
+ "Grep",
49
+ "--permission-mode",
50
+ "acceptEdits",
51
+ "--max-turns",
52
+ String(opts.maxTurns ?? 40),
53
+ "--output-format",
54
+ "json",
55
+ ],
56
+ };
57
+ return {
58
+ command: "codex",
59
+ // MCP servers come from $CODEX_HOME/config.toml, which autofix writes (see codexHome).
60
+ args: ["exec", "--sandbox", "workspace-write", "--skip-git-repo-check", prompt],
61
+ };
62
+ }
63
+ /** Claude Code's `--mcp-config` file: lockwire's MCP server, started the way this lockwire runs. */
64
+ export function mcpConfigJson(lockwire) {
65
+ return `${JSON.stringify({ mcpServers: { lockwire: { command: lockwire.command, args: lockwire.args } } }, null, 2)}\n`;
66
+ }
67
+ const tomlString = (s) => JSON.stringify(s); // a TOML basic string is a JSON string
68
+ /** Codex's config.toml: lockwire's MCP server, required, its tools approved without prompting. */
69
+ export function codexConfigToml(lockwire) {
70
+ return [
71
+ "[mcp_servers.lockwire]",
72
+ `command = ${tomlString(lockwire.command)}`,
73
+ `args = [${lockwire.args.map(tomlString).join(", ")}]`,
74
+ "required = true",
75
+ 'default_tools_approval_mode = "approve"',
76
+ "",
77
+ ].join("\n");
78
+ }
79
+ function defaultLockwireCommand() {
80
+ const cli = join(fileURLToPath(new URL(".", import.meta.url)), "cli.js");
81
+ return { command: process.execPath, args: [cli, "mcp"] };
82
+ }
83
+ /** A file's content hash, read in chunks (any size); a symlink hashes as its target path. */
84
+ function fileHash(abs) {
85
+ try {
86
+ const st = lstatSync(abs);
87
+ if (st.isSymbolicLink())
88
+ return `link:${readlinkSync(abs)}`;
89
+ if (!st.isFile())
90
+ return null; // a FIFO or device could block a read forever
91
+ }
92
+ catch {
93
+ return null; // vanished mid-walk
94
+ }
95
+ let fd;
96
+ try {
97
+ fd = openSync(abs, "r");
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ try {
103
+ const hash = createHash("sha256");
104
+ const buf = Buffer.allocUnsafe(1 << 20);
105
+ for (let n = readSync(fd, buf, 0, buf.length, null); n > 0; n = readSync(fd, buf, 0, buf.length, null))
106
+ hash.update(buf.subarray(0, n));
107
+ return hash.digest("hex");
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ finally {
113
+ closeSync(fd);
114
+ }
115
+ }
116
+ /** Files under `dir` (repo-relative, posix), or none if it isn't a directory. */
117
+ function filesUnder(repoRoot, dir) {
118
+ try {
119
+ if (!lstatSync(join(repoRoot, dir)).isDirectory())
120
+ return [];
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ return walkFiles(join(repoRoot, dir)).map((rel) => `${dir}/${rel}`);
126
+ }
127
+ /** lockwire's own scratch files, which its tools rewrite on every call. */
128
+ const LOCKWIRE_SCRATCH = /^\.lockwire\/(cache\/|lock$|hook\.log$)/;
129
+ /**
130
+ * Content hashes of everything a run could change that matters: the tree (minus .git and
131
+ * node_modules), lockwire's state in .lockwire/ (its config and ledger, not its cache), and the git
132
+ * settings that run code on the next git command (.git/config, hooks, info).
133
+ */
134
+ function treeHashes(repoRoot) {
135
+ const out = new Map();
136
+ const paths = [
137
+ ...walkFiles(repoRoot),
138
+ ...filesUnder(repoRoot, ".lockwire").filter((p) => !LOCKWIRE_SCRATCH.test(p)),
139
+ ".git/config",
140
+ ...filesUnder(repoRoot, ".git/hooks"),
141
+ ...filesUnder(repoRoot, ".git/info"),
142
+ ];
143
+ for (const rel of paths) {
144
+ const h = fileHash(join(repoRoot, rel));
145
+ if (h !== null)
146
+ out.set(rel, h);
147
+ }
148
+ return out;
149
+ }
150
+ /** Paths whose entry differs; if one side is missing altogether (a repo appeared or vanished), all of them. */
151
+ function diffMaps(before, after) {
152
+ if (!before || !after)
153
+ return [...(before ?? after ?? new Map()).keys()];
154
+ const changed = new Set();
155
+ for (const [p, h] of after)
156
+ if (before.get(p) !== h)
157
+ changed.add(p);
158
+ for (const p of before.keys())
159
+ if (!after.has(p))
160
+ changed.add(p);
161
+ return [...changed];
162
+ }
163
+ /** How long an agent gets to exit after SIGTERM before everything it started is killed. */
164
+ const KILL_GRACE_MS = 2000;
165
+ function run(command, args, opts) {
166
+ // On POSIX the agent leads its own process group, so a timeout (or the end of the run) stops
167
+ // everything it started, not just the shell or launcher at the top: nothing it spawned can keep
168
+ // writing to the tree after lockwire has judged it.
169
+ const group = process.platform !== "win32";
170
+ return new Promise((resolve) => {
171
+ let child;
172
+ try {
173
+ child = spawn(command, args, {
174
+ cwd: opts.cwd,
175
+ env: opts.env,
176
+ shell: opts.shell,
177
+ detached: group,
178
+ // The agent's output goes to stderr, so `lockwire autofix --json` keeps stdout for the report.
179
+ stdio: ["ignore", opts.show ? 2 : "ignore", opts.show ? 2 : "ignore"],
180
+ });
181
+ }
182
+ catch (err) {
183
+ resolve({ exitCode: null, error: String(err) });
184
+ return;
185
+ }
186
+ const kill = (signal) => {
187
+ if (child.pid === undefined)
188
+ return;
189
+ try {
190
+ if (group)
191
+ process.kill(-child.pid, signal);
192
+ else if (signal === "SIGKILL")
193
+ spawnSync("taskkill", ["/pid", String(child.pid), "/T", "/F"], { stdio: "ignore" });
194
+ else
195
+ child.kill(signal);
196
+ }
197
+ catch {
198
+ // already gone
199
+ }
200
+ };
201
+ let timedOut = false;
202
+ let hard;
203
+ const timer = setTimeout(() => {
204
+ timedOut = true;
205
+ if (!group)
206
+ return kill("SIGKILL"); // Windows: taskkill the tree while its root is still there
207
+ kill("SIGTERM");
208
+ hard = setTimeout(() => kill("SIGKILL"), KILL_GRACE_MS);
209
+ }, opts.timeoutMs);
210
+ // A detached group doesn't get the terminal's Ctrl-C: pass it on, then die of it as usual.
211
+ const signals = group ? ["SIGINT", "SIGTERM", "SIGHUP"] : [];
212
+ const onSignal = (signal) => {
213
+ kill("SIGKILL");
214
+ for (const s of signals)
215
+ process.off(s, onSignal);
216
+ process.kill(process.pid, signal);
217
+ };
218
+ for (const s of signals)
219
+ process.on(s, onSignal);
220
+ let done = false;
221
+ const finish = (result) => {
222
+ if (done)
223
+ return;
224
+ done = true;
225
+ clearTimeout(timer);
226
+ clearTimeout(hard);
227
+ for (const s of signals)
228
+ process.off(s, onSignal);
229
+ if (group)
230
+ kill("SIGKILL"); // whatever the agent left running in the background
231
+ resolve(result);
232
+ };
233
+ child.on("error", (err) => finish({ exitCode: null, error: err.message }));
234
+ child.on("exit", (code, signal) => finish(timedOut
235
+ ? {
236
+ exitCode: null,
237
+ error: `stopped after the ${Math.round(opts.timeoutMs / 1000)}s timeout`,
238
+ }
239
+ : signal
240
+ ? { exitCode: null, error: `stopped by ${signal}` }
241
+ : { exitCode: code }));
242
+ });
243
+ }
244
+ const RESOLUTION_EVENTS = new Set([
245
+ "anchor.resolved",
246
+ "anchor.created",
247
+ "anchor.acknowledged",
248
+ ]);
249
+ /** lockwire's own files: a run may change them, but only through lockwire (see {@link lockwireStateProblems}). */
250
+ const LOCKWIRE_OWN = new Set(["lockwire.lock", ".lockwire/ledger.jsonl"]);
251
+ const readText = (path) => (existsSync(path) ? readFileSync(path, "utf8") : "");
252
+ const errorText = (err) => (err instanceof Error ? err.message : String(err));
253
+ /** A task's identity across a run: an unlinked marker's id carries its line, which edits above it shift. */
254
+ const identity = (t) => t.id.startsWith("unlinked:") ? t.id.replace(/:\d+:([0-9a-f]{8})$/, ":$1") : t.id;
255
+ /** How many of the tasks before a run are gone after it. New problems don't offset fixed ones. */
256
+ export function fixedCount(before, after) {
257
+ const open = new Set(after.map(identity));
258
+ return before.filter((t) => !open.has(identity(t))).length;
259
+ }
260
+ /** An anchor as written, for comparison; a backfilled `claim.normHash` (lockwire check adds it) isn't a change. */
261
+ function comparable(a, was) {
262
+ if (a.claim && was.claim && !was.claim.normHash && a.claim.normHash) {
263
+ const { normHash: _, ...claim } = a.claim;
264
+ return canonicalJson({ ...a, claim });
265
+ }
266
+ return canonicalJson(a);
267
+ }
268
+ /**
269
+ * The ledger records a run appended, and anything wrong with how lockwire's state changed. lockwire's
270
+ * tools only append verified records to the ledger, and change an anchor only with a record for it;
271
+ * an agent editing either file by hand (to make a claim look fixed) breaks one of those rules.
272
+ */
273
+ function lockwireStateProblems(ledgerBefore, ledgerAfter, lockBefore, lockAfter) {
274
+ const problems = [];
275
+ const added = [];
276
+ if (!ledgerAfter.startsWith(ledgerBefore)) {
277
+ problems.push("The ledger was rewritten during the run: lockwire only ever appends to it.");
278
+ }
279
+ else {
280
+ const lines = ledgerAfter.slice(ledgerBefore.length).split("\n");
281
+ for (const line of lines) {
282
+ if (!line.trim())
283
+ continue;
284
+ const record = verifiedRecord(line.replace(/\r$/, ""));
285
+ if (record)
286
+ added.push(record);
287
+ else
288
+ problems.push("A ledger record added during the run doesn't verify (its hash doesn't match): it was written by hand, not by lockwire.");
289
+ }
290
+ }
291
+ const recorded = new Set(added.map((r) => r.anchor));
292
+ const created = new Set(added.filter((r) => r.event === "anchor.created").map((r) => r.anchor));
293
+ const was = new Map(lockBefore.anchors.map((a) => [a.id, a]));
294
+ for (const a of lockAfter.anchors) {
295
+ const prev = was.get(a.id);
296
+ if (prev && comparable(a, prev) === canonicalJson(prev))
297
+ continue;
298
+ if (prev ? !recorded.has(a.id) : !created.has(a.id))
299
+ problems.push(`lockwire.lock was edited by hand: anchor ${a.id} ${prev ? "changed" : "appeared"} with no ledger record of lockwire doing it.`);
300
+ }
301
+ return { added, problems: [...new Set(problems)] };
302
+ }
303
+ /**
304
+ * Tasks a run silenced rather than fixed: the anchor was retired (superseded or waived) or dropped,
305
+ * but the claim is still in the doc, marker and all, or as the same sentence with its marker deleted.
306
+ * A wrong claim that's merely no longer tracked is still wrong.
307
+ */
308
+ async function retiredInPlace(repoRoot, before, after, lockAfter) {
309
+ const open = new Set(after.map(identity));
310
+ const out = [];
311
+ for (const t of before) {
312
+ if (t.id.startsWith("unlinked:") || open.has(identity(t)) || !t.doc)
313
+ continue;
314
+ const anchor = lockAfter.anchors.find((a) => a.id === t.id);
315
+ if (anchor && anchor.status !== "superseded" && anchor.status !== "waived")
316
+ continue;
317
+ const abs = resolveInsideRepo(repoRoot, t.doc);
318
+ if (!abs || !existsSync(abs))
319
+ continue;
320
+ const text = await readFile(abs, "utf8");
321
+ // A marker whose anchor is gone shows up as unlinked already; one whose anchor was retired doesn't.
322
+ const markerThere = scanMarkers(text).some((m) => m.id === t.id);
323
+ const sentence = (t.claim ?? "").replace(/…$/, "").replace(/\s+/g, " ").trim();
324
+ const sentenceThere = t.kind !== "marker-removed" &&
325
+ sentence.length >= 8 &&
326
+ text.replace(/\s+/g, " ").includes(sentence);
327
+ if ((markerThere && anchor) || (!markerThere && sentenceThere))
328
+ out.push({
329
+ ...t,
330
+ summary: `retired (${anchor?.status ?? "removed from lockwire.lock"}) during the run, but the claim is still in ${t.doc}: fix or delete the sentence. Was: ${t.summary}`,
331
+ });
332
+ }
333
+ return out;
334
+ }
335
+ export async function autofix(repoRoot, opts = {}) {
336
+ const config = await readConfig(repoRoot);
337
+ const before = await listTasks(repoRoot, config, opts.scope);
338
+ const empty = { fixed: 0, problems: [], resolutions: [], changedFiles: [], outOfBounds: [] };
339
+ if (before.length === 0)
340
+ return {
341
+ status: "nothing-to-do",
342
+ before,
343
+ after: [],
344
+ ...empty,
345
+ markdown: "lockwire: no documentation claims need attention.\n",
346
+ };
347
+ const lockwire = opts.lockwireCommand ?? defaultLockwireCommand();
348
+ const prompt = `${fixDocsPrompt(opts.scope)}\n\nThere are ${before.length} task${before.length === 1 ? "" : "s"} right now.`;
349
+ const work = mkdtempSync(join(tmpdir(), "lockwire-autofix-"));
350
+ const files = { prompt: join(work, "prompt.md"), mcpConfig: join(work, "mcp.json") };
351
+ writeFileSync(files.prompt, prompt, "utf8");
352
+ writeFileSync(files.mcpConfig, mcpConfigJson(lockwire), "utf8");
353
+ const env = {
354
+ ...(opts.env ?? process.env),
355
+ LOCKWIRE_PROMPT_FILE: files.prompt,
356
+ LOCKWIRE_MCP_CONFIG: files.mcpConfig,
357
+ LOCKWIRE_REPO: repoRoot,
358
+ };
359
+ let command;
360
+ let args;
361
+ let shell = false;
362
+ if (opts.agentCommand) {
363
+ command = opts.agentCommand;
364
+ args = [];
365
+ shell = true;
366
+ }
367
+ else {
368
+ const agent = opts.agent ?? "claude-code";
369
+ ({ command, args } = agentArgv(agent, prompt, files, {
370
+ ...(opts.maxTurns !== undefined ? { maxTurns: opts.maxTurns } : {}),
371
+ bare: Boolean(env.CI),
372
+ }));
373
+ if (agent === "codex") {
374
+ // Codex reads MCP servers from $CODEX_HOME/config.toml: give it one with lockwire in it, and
375
+ // the user's own login if they have one (CI passes CODEX_API_KEY instead).
376
+ const home = join(work, "codex-home");
377
+ mkdirSync(home);
378
+ writeFileSync(join(home, "config.toml"), codexConfigToml(lockwire), "utf8");
379
+ const auth = join(env.CODEX_HOME ?? join(homedir(), ".codex"), "auth.json");
380
+ if (existsSync(auth))
381
+ copyFileSync(auth, join(home, "auth.json"));
382
+ env.CODEX_HOME = home;
383
+ }
384
+ }
385
+ const shown = shell
386
+ ? command
387
+ : [command, ...args.map((a) => (a === prompt ? "<fix-docs prompt>" : a))].join(" ");
388
+ if (opts.dryRun) {
389
+ rmSync(work, { recursive: true, force: true });
390
+ return {
391
+ status: "partial",
392
+ before,
393
+ after: before,
394
+ ...empty,
395
+ agent: { command: shown, exitCode: null },
396
+ markdown: `Dry run: would run \`${shown}\` on ${before.length} task(s).\n`,
397
+ };
398
+ }
399
+ // Everything the verdict is judged against is taken before the agent starts, never from state the
400
+ // agent could have edited: which files are docs, the anchors, the ledger, the commit and the index.
401
+ const lockBefore = await readLockfile(repoRoot);
402
+ const knownDocs = new Set(lockBefore.anchors.flatMap((a) => (a.doc ? [a.doc] : [])));
403
+ const ledgerBefore = readText(ledgerPath(repoRoot));
404
+ const headBefore = headCommit(repoRoot);
405
+ const indexBefore = indexEntries(repoRoot);
406
+ const treeBefore = treeHashes(repoRoot);
407
+ const outcome = await run(command, args, {
408
+ cwd: repoRoot,
409
+ env,
410
+ shell,
411
+ timeoutMs: opts.timeoutMs ?? 30 * 60 * 1000,
412
+ show: opts.showAgentOutput !== false,
413
+ });
414
+ rmSync(work, { recursive: true, force: true });
415
+ // The verdict is lockwire's, from scratch, not the agent's account of itself.
416
+ const problems = [];
417
+ const changed = new Set(diffMaps(treeBefore, treeHashes(repoRoot)));
418
+ for (const p of diffMaps(indexBefore, indexEntries(repoRoot)))
419
+ changed.add(p); // staged, not on disk
420
+ const changedFiles = [...changed].sort();
421
+ const outOfBounds = changedFiles.filter((f) => !LOCKWIRE_OWN.has(f) && !knownDocs.has(f) && !isScannedDoc(f, config));
422
+ const headAfter = headCommit(repoRoot);
423
+ if (headAfter !== headBefore)
424
+ problems.push(`The agent moved HEAD (${headBefore ?? "no commit"} to ${headAfter ?? "no commit"}): it committed or checked something out, and its commits would ride into the pull request.`);
425
+ let after = before;
426
+ let lockAfter = lockBefore;
427
+ let added = [];
428
+ try {
429
+ lockAfter = await readLockfile(repoRoot);
430
+ const state = lockwireStateProblems(ledgerBefore, readText(ledgerPath(repoRoot)), lockBefore, lockAfter);
431
+ added = state.added;
432
+ problems.push(...state.problems);
433
+ after = await listTasks(repoRoot, config, opts.scope);
434
+ after = [...after, ...(await retiredInPlace(repoRoot, before, after, lockAfter))];
435
+ }
436
+ catch (err) {
437
+ problems.push(`lockwire couldn't re-check the claims after the run: ${errorText(err)}`);
438
+ }
439
+ const resolutions = added
440
+ .filter((e) => RESOLUTION_EVENTS.has(e.event))
441
+ .map((e) => {
442
+ const a = lockAfter.anchors.find((x) => x.id === e.anchor);
443
+ return {
444
+ event: e.event,
445
+ anchor: e.anchor,
446
+ doc: a?.doc ?? null,
447
+ target: a ? `${a.target.path}${a.target.symbol ? `#${a.target.symbol}` : ""}` : "?",
448
+ claim: a?.claim?.excerpt ?? null,
449
+ note: e.note ?? null,
450
+ by: e.actor.tool?.name ?? e.actor.type,
451
+ };
452
+ });
453
+ const agentFailed = outcome.exitCode !== 0;
454
+ const status = outOfBounds.length > 0 ||
455
+ problems.length > 0 ||
456
+ (agentFailed && changedFiles.length === 0 && after.length === before.length)
457
+ ? "refused"
458
+ : after.length === 0
459
+ ? "fixed"
460
+ : "partial";
461
+ const report = {
462
+ status,
463
+ before,
464
+ after,
465
+ fixed: fixedCount(before, after),
466
+ problems,
467
+ resolutions,
468
+ changedFiles,
469
+ outOfBounds,
470
+ agent: {
471
+ command: shown,
472
+ exitCode: outcome.exitCode,
473
+ ...(outcome.error ? { error: outcome.error } : {}),
474
+ },
475
+ markdown: "",
476
+ };
477
+ report.markdown = summaryMarkdown(report);
478
+ return report;
479
+ }
480
+ const cell = (s) => (s ?? "").replace(/\|/g, "\\|").replace(/\r\n|\r|\n/g, " ");
481
+ /** A pull-request body for an autofix run. */
482
+ export function summaryMarkdown(r) {
483
+ const lines = [];
484
+ const fixed = fixedCount(r.before, r.after);
485
+ lines.push(r.status === "refused"
486
+ ? "## lockwire autofix: refused"
487
+ : `## lockwire autofix: ${fixed} of ${r.before.length} documentation claim${r.before.length === 1 ? "" : "s"} fixed`, "");
488
+ if (r.outOfBounds.length > 0)
489
+ lines.push("The agent changed files that aren't documentation, so this run must not be merged as a docs fix:", "", ...r.outOfBounds.map((f) => `- \`${cell(f)}\``), "");
490
+ if ((r.problems ?? []).length > 0)
491
+ lines.push(...(r.problems ?? []).map((p) => `- ${cell(p)}`), "");
492
+ if (r.agent?.error || (r.agent && r.agent.exitCode !== 0))
493
+ lines.push(`The agent (\`${cell(r.agent.command)}\`) ${r.agent.error ? `failed: ${cell(r.agent.error)}` : `exited with code ${r.agent.exitCode}`}.`, "");
494
+ if (r.resolutions.length > 0) {
495
+ lines.push("| Claim | Bound to | What the agent did |", "| --- | --- | --- |");
496
+ for (const x of r.resolutions)
497
+ lines.push(`| ${cell(x.doc)}: ${cell(x.claim)} | \`${cell(x.target)}\` | ${cell(x.event === "anchor.acknowledged" ? `retired (${x.note ?? "superseded"})` : (x.note ?? "re-stamped"))} |`);
498
+ lines.push("");
499
+ }
500
+ if (r.after.length > 0) {
501
+ lines.push(`Still open (${r.after.length}):`, "", ...r.after.map((t) => `- \`${cell(t.id)}\` ${t.kind} — ${cell(t.doc ?? "(lockfile-only)")}:${t.line ?? "-"}: ${cell(t.summary)}`), "");
502
+ }
503
+ lines.push("Every change above was re-checked by lockwire after the agent finished: a number that still disagreed with its data, or a marker pointing at nothing, would still be listed as open. `lockwire history <id>` shows each claim's full record.");
504
+ return `${lines.join("\n")}\n`;
505
+ }
506
+ //# sourceMappingURL=autofix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autofix.js","sourceRoot":"","sources":["../src/autofix.ts"],"names":[],"mappings":"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"}
package/dist/changed.d.ts CHANGED
@@ -17,6 +17,11 @@ export declare function changedFiles(repoRoot: string, opts?: ChangedOptions): s
17
17
  * not cached: a long-lived process (the MCP server) outlives many commits.
18
18
  */
19
19
  export declare function headCommit(repoRoot: string): string | null;
20
+ /**
21
+ * The git index, path by path (`<mode> <object> <stage>`), or null outside a git repository. A run that
22
+ * only stages a file still changes what the next `git commit` records, so autofix compares this too.
23
+ */
24
+ export declare function indexEntries(repoRoot: string): Map<string, string> | null;
20
25
  /**
21
26
  * A file's text at `commit`, read from git, or null if git, the commit or the file isn't there.
22
27
  * `commit` comes from the lockfile, which anyone can edit, so only a plain hex object name is passed
@@ -1 +1 @@
1
- {"version":3,"file":"changed.d.ts","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,mGAAmG;IACnG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AA2BtC,wFAAwF;AACxF,wBAAgB,WAAW,CACzB,GAAG,EAAE,GAAG,EACR,QAAQ,CAAC,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAiBR;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,EAAE,CAoBlF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1F;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,KAAK,SAAM,GACV,MAAM,EAAE,CAUV"}
1
+ {"version":3,"file":"changed.d.ts","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,mGAAmG;IACnG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AA2BtC,wFAAwF;AACxF,wBAAgB,WAAW,CACzB,GAAG,EAAE,GAAG,EACR,QAAQ,CAAC,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAiBR;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,EAAE,CAoBlF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE1D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CASzE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG1F;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,KAAK,SAAM,GACV,MAAM,EAAE,CAUV"}
package/dist/changed.js CHANGED
@@ -69,6 +69,22 @@ export function changedFiles(repoRoot, opts = {}) {
69
69
  export function headCommit(repoRoot) {
70
70
  return tryGit(gitRunner(repoRoot), ["rev-parse", "--short", "HEAD"])?.trim() || null;
71
71
  }
72
+ /**
73
+ * The git index, path by path (`<mode> <object> <stage>`), or null outside a git repository. A run that
74
+ * only stages a file still changes what the next `git commit` records, so autofix compares this too.
75
+ */
76
+ export function indexEntries(repoRoot) {
77
+ const out = tryGit(gitRunner(repoRoot), ["ls-files", "--stage", "-z"]);
78
+ if (out === null)
79
+ return null;
80
+ const entries = new Map();
81
+ for (const entry of out.split("\0")) {
82
+ const tab = entry.indexOf("\t");
83
+ if (tab > 0)
84
+ entries.set(toPosix(entry.slice(tab + 1)), entry.slice(0, tab));
85
+ }
86
+ return entries;
87
+ }
72
88
  /**
73
89
  * A file's text at `commit`, read from git, or null if git, the commit or the file isn't there.
74
90
  * `commit` comes from the lockfile, which anyone can edit, so only a plain hex object name is passed
@@ -1 +1 @@
1
- {"version":3,"file":"changed.js","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"changed.js","sourceRoot":"","sources":["../src/changed.ts"],"names":[],"mappings":"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"}