lockwire 0.1.25 → 0.1.27
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/README.md +12 -0
- package/dist/actions.d.ts +18 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +72 -14
- package/dist/actions.js.map +1 -1
- package/dist/changed.d.ts +12 -0
- package/dist/changed.d.ts.map +1 -1
- package/dist/changed.js +25 -0
- package/dist/changed.js.map +1 -1
- package/dist/cli.js +74 -15
- package/dist/cli.js.map +1 -1
- package/dist/docindex.js +1 -1
- package/dist/docindex.js.map +1 -1
- package/dist/extract.d.ts.map +1 -1
- package/dist/extract.js +19 -0
- package/dist/extract.js.map +1 -1
- package/dist/hook-common.d.ts.map +1 -1
- package/dist/hook-common.js +2 -1
- package/dist/hook-common.js.map +1 -1
- package/dist/lock.d.ts +3 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +99 -0
- package/dist/lock.js.map +1 -0
- package/dist/lockfile.d.ts +2 -0
- package/dist/lockfile.d.ts.map +1 -1
- package/dist/lockfile.js +14 -2
- package/dist/lockfile.js.map +1 -1
- package/dist/markers.d.ts +10 -0
- package/dist/markers.d.ts.map +1 -1
- package/dist/markers.js +28 -5
- package/dist/markers.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +86 -5
- package/dist/mcp-server.js.map +1 -1
- package/dist/tasks.d.ts +84 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +432 -0
- package/dist/tasks.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/values.d.ts +5 -1
- package/dist/values.d.ts.map +1 -1
- package/dist/values.js +139 -0
- package/dist/values.js.map +1 -1
- package/package.json +1 -1
package/dist/tasks.js
ADDED
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The agent work queue. lockwire doesn't write documentation and has no model of its own; it tells
|
|
3
|
+
* the agent the user already runs (Claude Code, Codex, anything that speaks MCP) exactly which claims
|
|
4
|
+
* are wrong, gives it what it needs to fix each one, and checks the fix:
|
|
5
|
+
*
|
|
6
|
+
* listTasks what needs attention, as a list of tasks (a dry run of `check`, plus unlinked markers)
|
|
7
|
+
* taskContext one task in full: the claim, the bound code or value as stamped and as it is now,
|
|
8
|
+
* and how this claim was resolved before
|
|
9
|
+
* resolveTask after the agent has edited the doc: re-stamp that one claim if it now holds, or say
|
|
10
|
+
* why not — a number that still disagrees with its value is refused
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync } from "node:fs";
|
|
13
|
+
import { readFile } from "node:fs/promises";
|
|
14
|
+
import { ack, check, linkDoc, markerReader, resolveTargetInText } from "./actions.js";
|
|
15
|
+
import { commitsTouching, fileAtCommit } from "./changed.js";
|
|
16
|
+
import { describeDrift } from "./format.js";
|
|
17
|
+
import { fingerprint } from "./hash.js";
|
|
18
|
+
import { appendEvent, historyFor, ledgerPath, readLedger } from "./ledger.js";
|
|
19
|
+
import { withRepoLock } from "./lock.js";
|
|
20
|
+
import { lockfilePath, readLockfile, upsertAnchor, writeFileAtomic, writeLockfile, } from "./lockfile.js";
|
|
21
|
+
import { resolveInsideRepo } from "./repo.js";
|
|
22
|
+
import { tierFingerprint } from "./types.js";
|
|
23
|
+
const label = (t) => `${t.path}${t.symbol ? `#${t.symbol}` : ""}`;
|
|
24
|
+
function kindOf(r) {
|
|
25
|
+
if (r.status === "orphaned")
|
|
26
|
+
return r.claimChanged ? "marker-removed" : "target-missing";
|
|
27
|
+
if (r.value && !r.value.matches)
|
|
28
|
+
return "value-wrong";
|
|
29
|
+
if (r.driftedTiers.includes("value"))
|
|
30
|
+
return "value-changed";
|
|
31
|
+
if (r.driftedTiers.length > 0)
|
|
32
|
+
return "code-changed";
|
|
33
|
+
return "claim-edited";
|
|
34
|
+
}
|
|
35
|
+
const RESOLUTIONS = {
|
|
36
|
+
"code-changed": [
|
|
37
|
+
"Read lockwire_task_context to compare the code as stamped with the code now; update the claim sentence so it is true of the code now (or confirm it still is), then call lockwire_resolve.",
|
|
38
|
+
"If the claim no longer applies at all, delete it and call lockwire_ack with resolution superseded.",
|
|
39
|
+
],
|
|
40
|
+
"value-wrong": [
|
|
41
|
+
"Change the number in the sentence to the current value, at the precision you mean, then call lockwire_resolve: it re-checks the number and refuses if it still disagrees.",
|
|
42
|
+
"If the value itself is wrong (a bad rerun), fix the data, not the doc; the task clears when the value matches the sentence again.",
|
|
43
|
+
],
|
|
44
|
+
"value-changed": [
|
|
45
|
+
"The sentence states no number, so lockwire can't check it: confirm it is still true of the new value, then call lockwire_resolve.",
|
|
46
|
+
],
|
|
47
|
+
"claim-edited": [
|
|
48
|
+
"Someone reworded the claim. Confirm the new sentence is true of the code (lockwire_task_context shows it), then call lockwire_resolve.",
|
|
49
|
+
],
|
|
50
|
+
"target-missing": [
|
|
51
|
+
"If the symbol, key or file was renamed or moved, edit the marker to point at its new path#Symbol, then call lockwire_resolve.",
|
|
52
|
+
"If the thing it described is gone, delete the claim and its marker and call lockwire_ack with resolution superseded.",
|
|
53
|
+
],
|
|
54
|
+
"marker-removed": [
|
|
55
|
+
"If the marker was removed by mistake, restore it (with its id) and call lockwire_resolve.",
|
|
56
|
+
"If the claim was deliberately deleted, call lockwire_ack with resolution superseded.",
|
|
57
|
+
],
|
|
58
|
+
unlinked: [
|
|
59
|
+
"Check the sentence is true of its target (lockwire_task_context shows the target), fix it if not, then call lockwire_resolve to start checking it.",
|
|
60
|
+
],
|
|
61
|
+
};
|
|
62
|
+
function summaryOf(kind, r) {
|
|
63
|
+
const target = label(r.anchor.target);
|
|
64
|
+
const what = describeDrift(r);
|
|
65
|
+
switch (kind) {
|
|
66
|
+
case "value-wrong":
|
|
67
|
+
return `the claim says ${r.value?.claimed.join(", ") || "something else"} but ${target} is ${r.value?.now}`;
|
|
68
|
+
case "value-changed":
|
|
69
|
+
return `${target} changed (${what}) and the sentence states no number lockwire can check`;
|
|
70
|
+
case "code-changed":
|
|
71
|
+
return `${target} changed (${what})${r.claimChanged ? " and the claim was edited" : ""}`;
|
|
72
|
+
case "claim-edited":
|
|
73
|
+
return `the claim sentence was edited since it was checked against ${target}`;
|
|
74
|
+
case "target-missing":
|
|
75
|
+
return `${target} no longer exists`;
|
|
76
|
+
case "marker-removed":
|
|
77
|
+
return `the claim's marker was removed from ${r.anchor.doc}`;
|
|
78
|
+
default:
|
|
79
|
+
return what;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ---- ids -----------------------------------------------------------------------------------
|
|
83
|
+
/** Short content key of a marker: its target and its claim, whitespace-insensitive. */
|
|
84
|
+
const markerKey = (m) => fingerprint(`${label(m.target)}\u0000${m.claimNormHash}`).slice(3, 11);
|
|
85
|
+
function parseUnlinkedId(id) {
|
|
86
|
+
if (!id.startsWith("unlinked:"))
|
|
87
|
+
return null;
|
|
88
|
+
const rest = id.slice("unlinked:".length);
|
|
89
|
+
const k = rest.lastIndexOf(":");
|
|
90
|
+
const key = rest.slice(k + 1);
|
|
91
|
+
const before = rest.slice(0, k);
|
|
92
|
+
const l = before.lastIndexOf(":");
|
|
93
|
+
const line = Number(before.slice(l + 1));
|
|
94
|
+
const doc = before.slice(0, l);
|
|
95
|
+
if (k < 0 || l < 0 || !/^[0-9a-f]{8}$/.test(key) || !Number.isInteger(line) || line < 1 || !doc)
|
|
96
|
+
return null;
|
|
97
|
+
return { doc, line, key };
|
|
98
|
+
}
|
|
99
|
+
function unlinkedTask(u, marker) {
|
|
100
|
+
return {
|
|
101
|
+
id: `unlinked:${u.doc}:${u.line}:${marker ? markerKey(marker) : "00000000"}`,
|
|
102
|
+
kind: "unlinked",
|
|
103
|
+
doc: u.doc,
|
|
104
|
+
line: marker?.claimLine ?? u.line + 1,
|
|
105
|
+
claim: u.excerpt,
|
|
106
|
+
target: u.target,
|
|
107
|
+
summary: `a claim about ${u.target} that nothing is checking (${u.reason})`,
|
|
108
|
+
resolutions: RESOLUTIONS.unlinked,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Everything that needs attention, as tasks, in doc order. A dry run: nothing is written. `paths`
|
|
113
|
+
* scopes it the way `check <paths>` does: anchors whose target or doc is one of them, or is inside a
|
|
114
|
+
* listed directory.
|
|
115
|
+
*/
|
|
116
|
+
export async function listTasks(repoRoot, config, paths) {
|
|
117
|
+
const result = await check(repoRoot, config, paths, { write: false });
|
|
118
|
+
const readMarkers = markerReader(repoRoot);
|
|
119
|
+
const tasks = [];
|
|
120
|
+
for (const r of result.results) {
|
|
121
|
+
if (r.skipped || (r.status !== "drifted" && r.status !== "orphaned"))
|
|
122
|
+
continue;
|
|
123
|
+
const kind = kindOf(r);
|
|
124
|
+
// Where the claim is *now*: lines move as a doc is edited, and an agent edits by line.
|
|
125
|
+
const marker = r.anchor.doc
|
|
126
|
+
? (await readMarkers(r.anchor.doc))?.find((m) => m.id === r.anchor.id)
|
|
127
|
+
: undefined;
|
|
128
|
+
tasks.push({
|
|
129
|
+
id: r.anchor.id,
|
|
130
|
+
kind,
|
|
131
|
+
doc: r.anchor.doc,
|
|
132
|
+
line: marker?.claimLine ?? r.anchor.claim?.line ?? null,
|
|
133
|
+
claim: marker?.claimExcerpt ?? r.anchor.claim?.excerpt ?? null,
|
|
134
|
+
target: label(r.anchor.target),
|
|
135
|
+
summary: summaryOf(kind, r),
|
|
136
|
+
resolutions: RESOLUTIONS[kind],
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
for (const u of result.unlinked) {
|
|
140
|
+
const marker = (await readMarkers(u.doc))?.find((x) => x.line === u.line);
|
|
141
|
+
tasks.push(unlinkedTask(u, marker));
|
|
142
|
+
}
|
|
143
|
+
return tasks.sort((a, b) => (a.doc ?? "\uffff").localeCompare(b.doc ?? "\uffff") ||
|
|
144
|
+
(a.line ?? 0) - (b.line ?? 0) ||
|
|
145
|
+
a.id.localeCompare(b.id));
|
|
146
|
+
}
|
|
147
|
+
/** The narrowest scope that still contains task `id`, so looking one task up doesn't re-check the repo. */
|
|
148
|
+
async function scopeFor(repoRoot, id) {
|
|
149
|
+
const ref = parseUnlinkedId(id);
|
|
150
|
+
if (ref)
|
|
151
|
+
return [ref.doc];
|
|
152
|
+
const anchor = (await readLockfile(repoRoot)).anchors.find((a) => a.id === id);
|
|
153
|
+
if (!anchor)
|
|
154
|
+
return undefined;
|
|
155
|
+
return [...new Set([anchor.target.path, ...(anchor.doc ? [anchor.doc] : [])])];
|
|
156
|
+
}
|
|
157
|
+
/** The open task `id` names. An unlinked id is matched by its content key, so it survives line moves. */
|
|
158
|
+
async function findTask(repoRoot, config, id) {
|
|
159
|
+
const scope = await scopeFor(repoRoot, id);
|
|
160
|
+
const tasks = await listTasks(repoRoot, config, scope);
|
|
161
|
+
const ref = parseUnlinkedId(id);
|
|
162
|
+
if (!ref)
|
|
163
|
+
return { task: tasks.find((t) => t.id === id), scope };
|
|
164
|
+
const same = tasks.filter((t) => {
|
|
165
|
+
const r = t.kind === "unlinked" ? parseUnlinkedId(t.id) : null;
|
|
166
|
+
return r?.doc === ref.doc && r.key === ref.key;
|
|
167
|
+
});
|
|
168
|
+
// Several identical markers: prefer the one on the line the id names.
|
|
169
|
+
const task = same.find((t) => parseUnlinkedId(t.id)?.line === ref.line) ?? same[0];
|
|
170
|
+
return { task, scope };
|
|
171
|
+
}
|
|
172
|
+
const MAX_SOURCE = 20_000;
|
|
173
|
+
const cap = (s) => s.length > MAX_SOURCE
|
|
174
|
+
? { source: `${s.slice(0, MAX_SOURCE)}\n…`, truncated: true }
|
|
175
|
+
: { source: s };
|
|
176
|
+
const parseTarget = (t) => {
|
|
177
|
+
const i = t.indexOf("#");
|
|
178
|
+
return i < 0 ? { path: t } : { path: t.slice(0, i), symbol: t.slice(i + 1) };
|
|
179
|
+
};
|
|
180
|
+
async function snapshotNow(repoRoot, config, target) {
|
|
181
|
+
const abs = resolveInsideRepo(repoRoot, target.path);
|
|
182
|
+
if (!abs)
|
|
183
|
+
return { source: null, note: "outside the repository" };
|
|
184
|
+
if (!existsSync(abs))
|
|
185
|
+
return { source: null, note: `${target.path} does not exist` };
|
|
186
|
+
try {
|
|
187
|
+
const r = await resolveTargetInText(target, await readFile(abs, "utf8"), config);
|
|
188
|
+
if (!r.found)
|
|
189
|
+
return { source: null, note: `${label(target)} was not found in ${target.path}` };
|
|
190
|
+
return cap(r.source ?? "");
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
return { source: null, note: err instanceof Error ? err.message : String(err) };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async function snapshotStamped(repoRoot, config, anchor) {
|
|
197
|
+
if (anchor.value !== undefined && anchor.tiers.includes("value"))
|
|
198
|
+
return { source: anchor.value, commit: anchor.linked.commit, exact: true };
|
|
199
|
+
if (!resolveInsideRepo(repoRoot, anchor.target.path))
|
|
200
|
+
return { source: null, note: "outside the repository" };
|
|
201
|
+
const recorded = anchor.linked.commit;
|
|
202
|
+
/** The target at `commit`, and how many of the bound tiers fingerprint as stamped. */
|
|
203
|
+
const at = async (commit) => {
|
|
204
|
+
const text = fileAtCommit(repoRoot, commit, anchor.target.path);
|
|
205
|
+
if (text === null)
|
|
206
|
+
return null;
|
|
207
|
+
try {
|
|
208
|
+
const then = await resolveTargetInText(anchor.target, text, config);
|
|
209
|
+
if (!then.found)
|
|
210
|
+
return null;
|
|
211
|
+
const matching = anchor.tiers.filter((t) => tierFingerprint(then.fingerprints, t) === tierFingerprint(anchor.fingerprints, t)).length;
|
|
212
|
+
return {
|
|
213
|
+
commit,
|
|
214
|
+
matching,
|
|
215
|
+
exact: matching === anchor.tiers.length,
|
|
216
|
+
source: then.source ?? "",
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
// Claims are usually stamped before the change is committed, so the commit recorded at stamp time
|
|
224
|
+
// can predate the code the claim was checked against: look from there on (oldest first) for the
|
|
225
|
+
// first commit where the target fingerprints exactly as stamped. With no recorded commit, or one
|
|
226
|
+
// that history no longer has (a rebase, a squash-merge), look through all of history, newest first.
|
|
227
|
+
const candidates = [
|
|
228
|
+
...(recorded ? [recorded] : []),
|
|
229
|
+
...commitsTouching(repoRoot, anchor.target.path, recorded),
|
|
230
|
+
];
|
|
231
|
+
let closest = null;
|
|
232
|
+
for (const commit of [...new Set(candidates)]) {
|
|
233
|
+
const snap = await at(commit);
|
|
234
|
+
if (!snap)
|
|
235
|
+
continue;
|
|
236
|
+
if (snap.exact)
|
|
237
|
+
return { commit: snap.commit, exact: true, ...cap(snap.source) };
|
|
238
|
+
if (!closest || snap.matching > closest.matching)
|
|
239
|
+
closest = snap;
|
|
240
|
+
}
|
|
241
|
+
if (closest)
|
|
242
|
+
return {
|
|
243
|
+
commit: closest.commit,
|
|
244
|
+
exact: false,
|
|
245
|
+
...cap(closest.source),
|
|
246
|
+
note: `no commit in the searched history has it exactly as stamped (stamped against uncommitted changes, or in history that was rewritten): this is the closest version found, matching ${closest.matching} of ${anchor.tiers.length} bound tiers`,
|
|
247
|
+
};
|
|
248
|
+
return {
|
|
249
|
+
source: null,
|
|
250
|
+
commit: recorded,
|
|
251
|
+
note: recorded
|
|
252
|
+
? `${label(anchor.target)} could not be read at ${recorded} or in later history (not committed, or git unavailable)`
|
|
253
|
+
: "no commit was recorded when this claim was stamped, and no commit has the target",
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
export async function taskContext(repoRoot, config, id) {
|
|
257
|
+
const { task } = await findTask(repoRoot, config, id);
|
|
258
|
+
if (!task)
|
|
259
|
+
throw new Error(`no open task ${id}: call lockwire_tasks for the current list`);
|
|
260
|
+
const readMarkers = markerReader(repoRoot);
|
|
261
|
+
if (task.kind === "unlinked") {
|
|
262
|
+
const ref = parseUnlinkedId(task.id);
|
|
263
|
+
const marker = task.doc
|
|
264
|
+
? (await readMarkers(task.doc))?.find((m) => m.line === ref?.line)
|
|
265
|
+
: undefined;
|
|
266
|
+
return {
|
|
267
|
+
task,
|
|
268
|
+
claimText: marker?.claimText ?? null,
|
|
269
|
+
tiers: marker?.tiers ?? [],
|
|
270
|
+
now: await snapshotNow(repoRoot, config, parseTarget(task.target)),
|
|
271
|
+
history: [],
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
const anchor = (await readLockfile(repoRoot)).anchors.find((a) => a.id === id);
|
|
275
|
+
if (!anchor)
|
|
276
|
+
throw new Error(`no anchor ${id}`);
|
|
277
|
+
const marker = anchor.doc ? (await readMarkers(anchor.doc))?.find((m) => m.id === id) : undefined;
|
|
278
|
+
return {
|
|
279
|
+
task,
|
|
280
|
+
claimText: marker?.claimText ?? null,
|
|
281
|
+
tiers: anchor.tiers,
|
|
282
|
+
stamped: await snapshotStamped(repoRoot, config, anchor),
|
|
283
|
+
// The task's target, not the lockfile's: after a rename, check relocates the anchor.
|
|
284
|
+
now: await snapshotNow(repoRoot, config, parseTarget(task.target)),
|
|
285
|
+
history: historyFor(await readLedger(repoRoot), id),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/** The files a resolve may change, captured so a resolve that fails its final check can be undone. */
|
|
289
|
+
async function snapshotFiles(repoRoot, doc) {
|
|
290
|
+
const paths = [lockfilePath(repoRoot), ledgerPath(repoRoot)];
|
|
291
|
+
const docAbs = doc ? resolveInsideRepo(repoRoot, doc) : null;
|
|
292
|
+
if (docAbs)
|
|
293
|
+
paths.push(docAbs);
|
|
294
|
+
const saved = await Promise.all(paths.map(async (p) => ({ p, text: existsSync(p) ? await readFile(p, "utf8") : null })));
|
|
295
|
+
return async () => {
|
|
296
|
+
for (const { p, text } of saved)
|
|
297
|
+
if (text !== null)
|
|
298
|
+
await writeFileAtomic(p, text);
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Re-stamp one claim after the agent has fixed it — only that claim, never the rest of its doc. This
|
|
303
|
+
* is the reviewed path (an explicit "I checked this"), recorded in the ledger with the agent's note;
|
|
304
|
+
* a value anchor is still checked against its value and refused if the sentence disagrees. A refusal
|
|
305
|
+
* changes nothing. Runs under the repository lock, so parallel resolves can't lose each other's writes.
|
|
306
|
+
*/
|
|
307
|
+
export function resolveTask(repoRoot, config, id, actor, note) {
|
|
308
|
+
return withRepoLock(repoRoot, () => resolveLocked(repoRoot, config, id, actor, note));
|
|
309
|
+
}
|
|
310
|
+
async function resolveLocked(repoRoot, config, id, actor, note) {
|
|
311
|
+
const { task, scope } = await findTask(repoRoot, config, id);
|
|
312
|
+
const remainingOn = async (doc, without) => (await listTasks(repoRoot, config, doc ? [doc] : scope)).filter((t) => t.doc === doc && t.id !== without);
|
|
313
|
+
const ref = parseUnlinkedId(id);
|
|
314
|
+
if (!task) {
|
|
315
|
+
if (ref)
|
|
316
|
+
return {
|
|
317
|
+
id,
|
|
318
|
+
status: "refused",
|
|
319
|
+
reason: `the marker this task named has changed or gone from ${ref.doc} since the task was listed: call lockwire_tasks again`,
|
|
320
|
+
remaining: await remainingOn(ref.doc, id),
|
|
321
|
+
};
|
|
322
|
+
const anchor = (await readLockfile(repoRoot)).anchors.find((a) => a.id === id);
|
|
323
|
+
if (!anchor)
|
|
324
|
+
throw new Error(`no open task ${id}: call lockwire_tasks for the current list`);
|
|
325
|
+
if (anchor.status === "fresh")
|
|
326
|
+
return { id, status: "already-fresh", remaining: await remainingOn(anchor.doc, id) };
|
|
327
|
+
return {
|
|
328
|
+
id,
|
|
329
|
+
status: "refused",
|
|
330
|
+
reason: anchor.status === "waived"
|
|
331
|
+
? `${id} is waived until ${anchor.waiver?.expires ?? "?"}: there is nothing to resolve until the waiver lapses`
|
|
332
|
+
: `${id} is ${anchor.status}: there is nothing to resolve`,
|
|
333
|
+
remaining: await remainingOn(anchor.doc, id),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
const ledgerNote = `resolved by ${actor.tool?.name ?? actor.type}${note ? `: ${note}` : ""}`;
|
|
337
|
+
const refused = async (reason) => ({
|
|
338
|
+
id,
|
|
339
|
+
status: "refused",
|
|
340
|
+
reason: reason
|
|
341
|
+
.replace(/, then link$/, ", then resolve again")
|
|
342
|
+
.replace(/^target not found$/, `${task.target} doesn't exist: point the marker at the right path#Symbol, or delete the claim if it was never true`),
|
|
343
|
+
remaining: await remainingOn(task.doc, id),
|
|
344
|
+
});
|
|
345
|
+
if (task.kind === "marker-removed")
|
|
346
|
+
return refused(`the marker for ${id} isn't in ${task.doc} any more: restore it to resolve this, or call lockwire_ack with resolution superseded if the claim was deliberately removed`);
|
|
347
|
+
const undo = await snapshotFiles(repoRoot, task.doc);
|
|
348
|
+
const readMarkers = markerReader(repoRoot);
|
|
349
|
+
if (task.kind === "unlinked") {
|
|
350
|
+
const taskRef = parseUnlinkedId(task.id);
|
|
351
|
+
if (!task.doc || !taskRef)
|
|
352
|
+
return refused("the marker's doc is unknown");
|
|
353
|
+
const before = new Set((await readLockfile(repoRoot)).anchors.map((a) => a.id));
|
|
354
|
+
const result = await linkDoc(repoRoot, task.doc, config, actor, {
|
|
355
|
+
reviewed: true,
|
|
356
|
+
only: (m) => m.line === taskRef.line,
|
|
357
|
+
note: ledgerNote,
|
|
358
|
+
});
|
|
359
|
+
if (result.created + result.refreshed === 0)
|
|
360
|
+
return refused(result.skipped[0]?.reason ??
|
|
361
|
+
`no marker at ${task.doc}:${taskRef.line} any more: call lockwire_tasks again`);
|
|
362
|
+
const lock = await readLockfile(repoRoot);
|
|
363
|
+
const linked = (await readMarkers(task.doc))?.find((m) => m.line === taskRef.line);
|
|
364
|
+
const anchorId = linked?.id ?? lock.anchors.find((a) => !before.has(a.id) && a.doc === task.doc)?.id;
|
|
365
|
+
const stillOpen = (await listTasks(repoRoot, config, [task.doc])).some((t) => t.kind === "unlinked" && parseUnlinkedId(t.id)?.line === taskRef.line);
|
|
366
|
+
if (stillOpen) {
|
|
367
|
+
await undo();
|
|
368
|
+
return refused("linked, but the marker still isn't backed by an anchor; nothing was changed");
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
id,
|
|
372
|
+
status: "resolved",
|
|
373
|
+
...(anchorId ? { anchorId } : {}),
|
|
374
|
+
remaining: await remainingOn(task.doc, id),
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
let anchor = (await readLockfile(repoRoot)).anchors.find((a) => a.id === id);
|
|
378
|
+
if (!anchor)
|
|
379
|
+
return refused(`no anchor ${id}`);
|
|
380
|
+
// check relocated this anchor to a renamed symbol (the task names the new one) but, as a dry run,
|
|
381
|
+
// didn't record it. Record it now, so the re-stamp follows the anchor and fixes the marker too.
|
|
382
|
+
if (task.target !== label(anchor.target) && task.kind !== "target-missing") {
|
|
383
|
+
const lockfile = await readLockfile(repoRoot);
|
|
384
|
+
anchor = { ...anchor, target: parseTarget(task.target) };
|
|
385
|
+
await writeLockfile(repoRoot, upsertAnchor(lockfile, anchor));
|
|
386
|
+
await appendEvent(repoRoot, {
|
|
387
|
+
ts: new Date().toISOString(),
|
|
388
|
+
event: "anchor.relocated",
|
|
389
|
+
anchor: id,
|
|
390
|
+
actor,
|
|
391
|
+
commit: null,
|
|
392
|
+
note: `${task.target} (recorded on resolve)`,
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
if (anchor.claim === null || anchor.doc === null) {
|
|
396
|
+
// A binding with no inline claim (`lockwire link <doc> <target>`) has no sentence to fix:
|
|
397
|
+
// resolving it accepts the code or value as it is now.
|
|
398
|
+
try {
|
|
399
|
+
await ack(repoRoot, id, "updated", ledgerNote, actor, config);
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
await undo();
|
|
403
|
+
return refused(err instanceof Error ? err.message : String(err));
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
// The claim is the first marker carrying this id; a copy of it elsewhere in the doc is not ours.
|
|
408
|
+
const canonical = (await readMarkers(anchor.doc))?.find((m) => m.id === id);
|
|
409
|
+
if (!canonical) {
|
|
410
|
+
await undo();
|
|
411
|
+
return refused(`the marker for ${id} isn't in ${anchor.doc}: call lockwire_tasks again`);
|
|
412
|
+
}
|
|
413
|
+
const result = await linkDoc(repoRoot, anchor.doc, config, actor, {
|
|
414
|
+
reviewed: true,
|
|
415
|
+
only: (m) => m.line === canonical.line,
|
|
416
|
+
note: ledgerNote,
|
|
417
|
+
});
|
|
418
|
+
if (result.refreshed === 0) {
|
|
419
|
+
await undo();
|
|
420
|
+
return refused(result.skipped[0]?.reason ??
|
|
421
|
+
`the marker for ${id} isn't in ${anchor.doc}: call lockwire_tasks again`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
// Confirm, from scratch, that the claim now checks clean (the caller gets the truth, not our hope).
|
|
425
|
+
const still = (await listTasks(repoRoot, config, scope)).find((t) => t.id === id);
|
|
426
|
+
if (still) {
|
|
427
|
+
await undo();
|
|
428
|
+
return refused(`it still doesn't check clean after re-stamping (${still.summary}); nothing was changed`);
|
|
429
|
+
}
|
|
430
|
+
return { id, status: "resolved", remaining: await remainingOn(anchor.doc, id) };
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -94,6 +94,8 @@ export interface ResolvedSymbol {
|
|
|
94
94
|
exported: boolean;
|
|
95
95
|
sigTokens: string;
|
|
96
96
|
bodyText: string;
|
|
97
|
+
/** The whole declaration as written, for showing an agent what a claim is about. */
|
|
98
|
+
sourceText: string;
|
|
97
99
|
bodyNormalized: string;
|
|
98
100
|
deps: string[];
|
|
99
101
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC9D,eAAO,MAAM,SAAS,EAAE,SAAS,IAAI,EAA6C,CAAC;AAEnF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;AAEpG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,sHAAsH;IACtH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2GAA2G;AAC3G,wBAAgB,eAAe,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAEnE;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qHAAqH;AACrH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,KAAK,CAAC;CACX;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,EAAE,EAAE,KAAK,CAAC;KACX,CAAC;IACF,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0GAA0G;IAC1G,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GACnB,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,qBAAqB,GACrB,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,CAAC,CAAC;IACL,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;QAClC,kBAAkB,EAAE,MAAM,CAAC;QAC3B,2GAA2G;QAC3G,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AAED,eAAO,MAAM,cAAc,EAAE,cAM5B,CAAC;AAEF,0FAA0F;AAC1F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
|
package/dist/values.d.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
export type DataFormat = "json" | "tex";
|
|
1
|
+
export type DataFormat = "json" | "tex" | "csv" | "tsv";
|
|
2
2
|
export declare function dataFormatOf(path: string): DataFormat | undefined;
|
|
3
3
|
export interface ResolvedValue {
|
|
4
4
|
found: boolean;
|
|
5
5
|
value?: unknown;
|
|
6
6
|
/** The value as a person would write it, for messages: `0.18`, `"advisory"`. */
|
|
7
7
|
display?: string;
|
|
8
|
+
/** Why it wasn't found, when there's more to say than "not there" (an ambiguous row, say). */
|
|
9
|
+
reason?: string;
|
|
8
10
|
}
|
|
11
|
+
/** RFC 4180 rows: quoted fields, `""` escapes, embedded delimiters and newlines, CRLF or LF. */
|
|
12
|
+
export declare function parseDelimited(text: string, delimiter: string): string[][];
|
|
9
13
|
/** Looks up `key` in the data file's text. Throws only on a file that can't be parsed at all. */
|
|
10
14
|
export declare function resolveValue(text: string, format: DataFormat, key: string): ResolvedValue;
|
|
11
15
|
/** A stable serialisation of the value for fingerprinting: key order never matters. */
|
package/dist/values.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAExD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAGjE;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CA8B1E;AAmKD,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAmBzF;AAED,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE5D;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAGzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMnD;AAKD,MAAM,WAAW,WAAW;IAC1B,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,+FAA+F;IAC/F,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAmBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAuExD;AAkBD,MAAM,WAAW,UAAU;IACzB,mFAAmF;IACnF,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,UAAU,CA0BpF"}
|