@poetics/cli 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/backfill.d.ts +98 -0
  2. package/dist/backfill.d.ts.map +1 -0
  3. package/dist/backfill.js +582 -0
  4. package/dist/backfill.js.map +1 -0
  5. package/dist/change.d.ts +18 -0
  6. package/dist/change.d.ts.map +1 -0
  7. package/dist/change.js +155 -0
  8. package/dist/change.js.map +1 -0
  9. package/dist/changes.d.ts +4 -0
  10. package/dist/changes.d.ts.map +1 -0
  11. package/dist/changes.js +38 -0
  12. package/dist/changes.js.map +1 -0
  13. package/dist/commands.d.ts.map +1 -1
  14. package/dist/commands.js +6 -2
  15. package/dist/commands.js.map +1 -1
  16. package/dist/coverage.d.ts +39 -0
  17. package/dist/coverage.d.ts.map +1 -0
  18. package/dist/coverage.js +88 -0
  19. package/dist/coverage.js.map +1 -0
  20. package/dist/declarations.d.ts +26 -0
  21. package/dist/declarations.d.ts.map +1 -0
  22. package/dist/declarations.js +34 -0
  23. package/dist/declarations.js.map +1 -0
  24. package/dist/drift.d.ts +29 -0
  25. package/dist/drift.d.ts.map +1 -0
  26. package/dist/drift.js +84 -0
  27. package/dist/drift.js.map +1 -0
  28. package/dist/frameworks.d.ts +6 -0
  29. package/dist/frameworks.d.ts.map +1 -0
  30. package/dist/frameworks.js +8 -0
  31. package/dist/frameworks.js.map +1 -0
  32. package/dist/git.d.ts +19 -0
  33. package/dist/git.d.ts.map +1 -0
  34. package/dist/git.js +40 -0
  35. package/dist/git.js.map +1 -0
  36. package/dist/history.d.ts +6 -0
  37. package/dist/history.d.ts.map +1 -0
  38. package/dist/history.js +53 -0
  39. package/dist/history.js.map +1 -0
  40. package/dist/index.d.ts +21 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +12 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/indexing.d.ts +91 -0
  45. package/dist/indexing.d.ts.map +1 -0
  46. package/dist/indexing.js +372 -0
  47. package/dist/indexing.js.map +1 -0
  48. package/dist/init.d.ts +35 -0
  49. package/dist/init.d.ts.map +1 -0
  50. package/dist/init.js +186 -0
  51. package/dist/init.js.map +1 -0
  52. package/dist/rehash.d.ts +31 -0
  53. package/dist/rehash.d.ts.map +1 -0
  54. package/dist/rehash.js +73 -0
  55. package/dist/rehash.js.map +1 -0
  56. package/dist/run.d.ts +2 -2
  57. package/dist/run.d.ts.map +1 -1
  58. package/dist/run.js +258 -2
  59. package/dist/run.js.map +1 -1
  60. package/package.json +6 -3
@@ -0,0 +1,582 @@
1
+ // poetics backfill --snapshot (ADR 0011): a unit file for every export that has
2
+ // none, with a rationale extracted from evidence already in the repository and
3
+ // an `inferred` record saying how sure it is. Units that have a file are never
4
+ // written to; what they lack is listed for someone to add.
5
+ import { existsSync, readFileSync } from "node:fs";
6
+ import { dirname, join } from "node:path";
7
+ import ts from "typescript";
8
+ import { contentTree, createTypeScriptIndexer, detectUnits, fingerprint, signatureText } from "@poetics/adapter-typescript";
9
+ import { REMOVED_CONTENT_HASH, contentHash, isRemoved, matchIdentities, mintUid } from "@poetics/core";
10
+ import { appendVersion, createMatcher, createUnit, filesInScope, parseUnit, readUnitFiles, setPrehistory, storePaths } from "@poetics/store";
11
+ import { git, showAt } from "./git.js";
12
+ import { pluginsFor } from "./frameworks.js";
13
+ import { planIndex } from "./indexing.js";
14
+ const BY = "poetics-backfill";
15
+ const NOTE_COMMENT = /\/\/\s*(.*\b(?:HACK|XXX|workaround|work around|do not|don't|never|must)\b.*)$/i;
16
+ const AGENT_TRAILER = /\b(claude|copilot|codex|gemini|cursor|devin|aider|chatgpt)\b/i;
17
+ /** What a snapshot backfill would write. Nothing is written until `applyBackfill`. */
18
+ export async function planBackfill(root, config) {
19
+ const index = await planIndex(root, config, { rationale: "backfill" });
20
+ // The same index planIndex just built, from its cache: spans for blame, docs for the gaps.
21
+ const { parseable } = await filesInScope(root, config);
22
+ const tsconfig = config.typescript?.tsconfig;
23
+ const code = createTypeScriptIndexer({ root, files: parseable, cacheFile: join(storePaths(root).cache, "typescript.json"), plugins: pluginsFor(config), ...(tsconfig ? { tsconfig } : {}) }).index().units;
24
+ const place = (file, name, kind) => `${file}#${name}#${kind === "type"}`;
25
+ const codeAt = new Map(code.map((unit) => [place(unit.span.file, unit.name, unit.kind), unit]));
26
+ const blame = blameLines(root);
27
+ const commits = commitReader(root);
28
+ // How many new units each commit introduced: text shared by many units speaks to none of them in particular.
29
+ const introducedBy = new Map();
30
+ for (const unit of index.created) {
31
+ const at = codeAt.get(place(unit.location.file, unit.name, unit.kind));
32
+ // The declaration's first line: the commit that wrote the unit's header as it stands.
33
+ introducedBy.set(unit.uid, at ? blame(unit.location.file, at.startLine) : undefined);
34
+ }
35
+ const perCommit = new Map();
36
+ for (const sha of introducedBy.values())
37
+ if (sha)
38
+ perCommit.set(sha, (perCommit.get(sha) ?? 0) + 1);
39
+ const plan = {
40
+ created: [],
41
+ byConfidence: { high: 0, medium: 0, low: 0 },
42
+ unrecorded: new Set([...index.versions, ...index.moves, ...index.removed].map((entry) => entry.uid)).size,
43
+ missingDocs: [],
44
+ missingTests: [],
45
+ candidateNotes: [],
46
+ };
47
+ const docsMentioning = docMentions(root);
48
+ const changesets = changesetReader(root);
49
+ for (const unit of index.created) {
50
+ const sha = introducedBy.get(unit.uid);
51
+ const commit = sha ? commits(sha) : undefined;
52
+ const evidence = [];
53
+ const links = [];
54
+ let rationale;
55
+ let confidence = "low";
56
+ const changeset = commit ? changesets(commit.sha, packageOf(root, unit.location.file)) : undefined;
57
+ if (changeset) {
58
+ evidence.push({ source: "changeset", ref: changeset.path, text: changeset.text });
59
+ links.push({ kind: "changeset", ref: changeset.path });
60
+ rationale = changeset.text;
61
+ // A changeset describes its package's change; it speaks to this unit only when it names it.
62
+ confidence = names(changeset.text, unit.name) ? "high" : "medium";
63
+ }
64
+ if (commit) {
65
+ evidence.push({ source: "commit", ref: commit.sha, ...(commit.body || commit.subject ? { text: commit.body || commit.subject } : {}) });
66
+ for (const issue of commit.issues)
67
+ links.push({ kind: "github-issue", ref: issue });
68
+ if (!rationale && (commit.body || commit.subject)) {
69
+ rationale = commit.body || commit.subject;
70
+ confidence = perCommit.get(commit.sha) === 1 || names(rationale, unit.name) ? "high" : "medium";
71
+ }
72
+ }
73
+ if (unit.docs) {
74
+ evidence.push({ source: "comment", ref: unit.location.file, text: unit.docs });
75
+ rationale ??= unit.docs;
76
+ }
77
+ for (const test of unit.tests ?? [])
78
+ evidence.push({ source: "test", ref: test.file });
79
+ for (const doc of docsMentioning(unit.name)) {
80
+ evidence.push({ source: "doc", ref: doc });
81
+ links.push({ kind: "doc", ref: doc });
82
+ }
83
+ const version = unit.versions[0];
84
+ version.rationale = rationale ?? `Present in ${unit.location.file} when Poetics was adopted; nothing in the repository says why.`;
85
+ if (links.length > 0)
86
+ version.links = dedupe(links);
87
+ if (commit)
88
+ version.commit = commit.sha;
89
+ version.actor = commit?.agent ? { kind: "agent", tool: commit.agent, reviewed: false } : { kind: "human" };
90
+ version.inferred = { by: BY, confidence, sources: [...new Set(evidence.map((e) => e.source))], drafted: false, reviewed: false };
91
+ plan.byConfidence[confidence]++;
92
+ plan.created.push({ unit, evidence });
93
+ }
94
+ const existing = (await readUnitFiles(storePaths(root))).map(parseUnit).filter((unit) => !isRemoved(unit));
95
+ listGaps(root, parseable, existing, codeAt, plan);
96
+ return plan;
97
+ }
98
+ /** Writes the planned units, each as the actor its evidence names. Returns how many were written. */
99
+ export async function applyBackfill(root, plan, layout = "flat") {
100
+ for (const { unit } of plan.created) {
101
+ await createUnit({ paths: storePaths(root), actor: unit.versions[0].actor }, unit, layout);
102
+ }
103
+ return plan.created.length;
104
+ }
105
+ /** The report for people: confidence counts, then what to add or record by hand. */
106
+ export function formatBackfillPlan(plan, written) {
107
+ const lines = [];
108
+ for (const { unit } of plan.created) {
109
+ const version = unit.versions[0];
110
+ lines.push(`+ ${unit.location.file}#${unit.name} [${version.inferred.confidence}] ${firstLine(version.rationale)}`);
111
+ }
112
+ for (const gap of plan.missingDocs)
113
+ lines.push(`docs? ${gap.file}#${gap.name} has TSDoc its unit file lacks`);
114
+ for (const gap of plan.missingTests)
115
+ lines.push(`tests? ${gap.file}#${gap.name} looks tested by ${gap.test}`);
116
+ for (const note of plan.candidateNotes)
117
+ lines.push(`note? ${note.file}:${note.line} ${note.text}`);
118
+ if (plan.unrecorded > 0)
119
+ lines.push(`${plan.unrecorded} existing unit(s) have unrecorded changes; poetics index records those.`);
120
+ const { high, medium, low } = plan.byConfidence;
121
+ const counts = `${plan.created.length} new unit(s) (${high} high, ${medium} medium, ${low} low confidence)`;
122
+ lines.push(written === undefined ? `Would create ${counts}. Run with --write to write them.` : `Created ${counts}.`);
123
+ return lines.join("\n");
124
+ }
125
+ /** Whether there is anything to write. */
126
+ export function hasBackfill(plan) {
127
+ return plan.created.length > 0;
128
+ }
129
+ // Docs, tests and candidate notes for units that already have a file: listed, never written.
130
+ function listGaps(root, parseable, existing, codeAt, plan) {
131
+ for (const unit of existing) {
132
+ const at = codeAt.get(`${unit.location.file}#${unit.name}#${unit.kind === "type"}`);
133
+ if (!at)
134
+ continue;
135
+ if (!unit.docs && at.docs)
136
+ plan.missingDocs.push({ uid: unit.uid, name: unit.name, file: unit.location.file });
137
+ const test = siblingTest(root, unit.location.file, unit.name);
138
+ if (test && !(unit.tests ?? []).some((t) => t.file === test))
139
+ plan.missingTests.push({ uid: unit.uid, name: unit.name, file: unit.location.file, test });
140
+ }
141
+ for (const file of parseable) {
142
+ readFileSync(join(root, file), "utf8")
143
+ .split("\n")
144
+ .forEach((line, i) => {
145
+ const match = NOTE_COMMENT.exec(line);
146
+ if (match)
147
+ plan.candidateNotes.push({ file, line: i + 1, text: match[1].trim() });
148
+ });
149
+ }
150
+ }
151
+ /** Line-by-line authorship from `git blame`, one run per file; undefined for uncommitted lines or untracked files. */
152
+ function blameLines(root) {
153
+ const files = new Map();
154
+ return (file, line) => {
155
+ if (!files.has(file)) {
156
+ const shas = [];
157
+ try {
158
+ // Porcelain gives every line's full hash and final line number; `-l` shortens boundary commits to 39 characters.
159
+ for (const row of git(root, ["blame", "--porcelain", "--", file]).split("\n")) {
160
+ const header = /^([0-9a-f]{40}) \d+ (\d+)/.exec(row);
161
+ if (header)
162
+ shas[Number(header[2]) - 1] = header[1];
163
+ }
164
+ }
165
+ catch {
166
+ // Untracked, or no commits yet: nothing to attribute.
167
+ }
168
+ files.set(file, shas);
169
+ }
170
+ const sha = files.get(file)[line - 1];
171
+ return sha && !/^0+$/.test(sha) ? sha : undefined;
172
+ };
173
+ }
174
+ function commitReader(root) {
175
+ const cache = new Map();
176
+ return (sha) => {
177
+ if (!cache.has(sha)) {
178
+ const [subject = "", raw = ""] = git(root, ["show", "-s", "--format=%s%x00%b", sha]).split("\0");
179
+ const trailers = raw.split("\n").filter((line) => /^[A-Za-z-]+: .+/.test(line.trim()));
180
+ const body = raw
181
+ .split("\n")
182
+ .filter((line) => !trailers.includes(line))
183
+ .join("\n")
184
+ .split(/\n\s*\n/)[0]
185
+ .replace(/\s+/g, " ")
186
+ .trim();
187
+ const agentTrailer = trailers.find((line) => /^co-authored-by:/i.test(line) && AGENT_TRAILER.test(line));
188
+ const info = {
189
+ sha,
190
+ // The Conventional Commit prefix says what kind of change, not why.
191
+ subject: subject.replace(/^[a-z]+(\([^)]*\))?!?:\s*/, "").trim(),
192
+ body,
193
+ issues: [...new Set([...`${subject}\n${raw}`.matchAll(/(?:^|[\s(])#(\d+)\b/g)].map((m) => `#${m[1]}`))],
194
+ };
195
+ const agent = agentTrailer?.replace(/^co-authored-by:\s*/i, "").replace(/\s*<[^>]*>\s*$/, "").trim();
196
+ if (agent)
197
+ info.agent = agent;
198
+ cache.set(sha, info);
199
+ }
200
+ return cache.get(sha);
201
+ };
202
+ }
203
+ /**
204
+ * The changesets each commit added, read once per commit since many units share
205
+ * one. A changeset naming the unit's package is the most specific "why" the
206
+ * repository keeps.
207
+ */
208
+ function changesetReader(root) {
209
+ const byCommit = new Map();
210
+ return (sha, pkg) => {
211
+ if (!pkg)
212
+ return undefined;
213
+ if (!byCommit.has(sha)) {
214
+ const added = git(root, ["show", "--name-only", "--diff-filter=A", "--format=", sha]).split("\n").filter((f) => /^\.changeset\/[^/]+\.md$/.test(f));
215
+ byCommit.set(sha, added.flatMap((path) => {
216
+ const [, front = "", body = ""] = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/.exec(showAt(root, sha, path) ?? "") ?? [];
217
+ return front ? [{ path, front, text: body.trim().split(/\n\s*\n/)[0].replace(/\s+/g, " ") }] : [];
218
+ }));
219
+ }
220
+ const found = byCommit.get(sha).find(({ front }) => front.includes(`"${pkg}"`) || front.includes(`'${pkg}'`) || new RegExp(`^${pkg}:`, "m").test(front));
221
+ return found && { path: found.path, text: found.text };
222
+ };
223
+ }
224
+ /** The name in the nearest package.json above `file`. */
225
+ function packageOf(root, file) {
226
+ for (let dir = dirname(file);; dir = dirname(dir)) {
227
+ const path = join(root, dir, "package.json");
228
+ if (existsSync(path))
229
+ return JSON.parse(readFileSync(path, "utf8")).name;
230
+ if (dir === "." || dir === "/" || dir === "")
231
+ return undefined;
232
+ }
233
+ }
234
+ /** Markdown files under docs/ and READMEs that mention a name in code style, indexed once by name. */
235
+ function docMentions(root) {
236
+ let byName;
237
+ return (name) => {
238
+ if (!byName) {
239
+ byName = new Map();
240
+ const docs = git(root, ["ls-files", "--", "*.md"])
241
+ .split("\n")
242
+ .filter((path) => path && (path.startsWith("docs/") || /(^|\/)README\.md$/.test(path)));
243
+ for (const path of docs) {
244
+ for (const [, code] of readFileSync(join(root, path), "utf8").matchAll(/`([^`\n]+)`/g)) {
245
+ const paths = byName.get(code) ?? [];
246
+ if (!paths.includes(path))
247
+ byName.set(code, [...paths, path]);
248
+ }
249
+ }
250
+ }
251
+ return byName.get(name) ?? [];
252
+ };
253
+ }
254
+ function siblingTest(root, file, name) {
255
+ const test = file.replace(/\.(tsx?|mts|cts)$/, ".test.$1");
256
+ if (test === file || !existsSync(join(root, test)))
257
+ return undefined;
258
+ return readFileSync(join(root, test), "utf8").includes(name) ? test : undefined;
259
+ }
260
+ /** Whether the repository has a first commit, so there is history to walk. */
261
+ function hasCommits(root) {
262
+ try {
263
+ git(root, ["rev-parse", "--verify", "--quiet", "HEAD"]);
264
+ return true;
265
+ }
266
+ catch {
267
+ return false;
268
+ }
269
+ }
270
+ /** Whether `text` names `name` as a word, as prose about a unit does. */
271
+ function names(text, name) {
272
+ return new RegExp(`(?<![\\w$])${name.replace(/[$]/g, "\\$")}(?![\\w$])`).test(text);
273
+ }
274
+ function dedupe(links) {
275
+ const seen = new Set();
276
+ return links.filter((link) => {
277
+ const key = typeof link === "string" ? link : `${link.kind}:${link.ref}`;
278
+ if (seen.has(key))
279
+ return false;
280
+ seen.add(key);
281
+ return true;
282
+ });
283
+ }
284
+ function firstLine(text) {
285
+ const line = text.split("\n")[0];
286
+ return line.length > 100 ? `${line.slice(0, 99)}…` : line;
287
+ }
288
+ /**
289
+ * `poetics backfill --history` (ADR 0011): walks the first-parent history,
290
+ * reads each changed file's units syntactically, and follows them from commit
291
+ * to commit with `matchIdentities`, recording a version whenever a unit's code
292
+ * changed. A unit's prehistory is what happened before the commit that first
293
+ * recorded its unit file. Where matching would only queue a unit, its history
294
+ * restarts there, and the plan says so: history is never guessed.
295
+ *
296
+ * `range` limits the walk to the first-parent commits after `from` up to `to`
297
+ * (default: the root to HEAD). Code that exists at `from` starts there: its
298
+ * first change in the range opens its prehistory, which a later walk from
299
+ * further back extends. Units first recorded after `to` are left out, since
300
+ * prehistory that stops short of their recording could never be filled in.
301
+ */
302
+ export async function planPrehistory(root, config, range = {}) {
303
+ const plugins = pluginsFor(config);
304
+ const inScope = createMatcher(config.include, config.exclude ?? []);
305
+ const indexable = (file) => inScope(file) && /\.(ts|tsx|mts|cts)$/.test(file) && !file.endsWith(".d.ts");
306
+ const empty = !hasCommits(root);
307
+ if (empty && (range.from || range.to))
308
+ throw new Error("The repository has no commits to walk a range of");
309
+ const head = empty ? "" : resolveCommit(root, "HEAD");
310
+ const to = range.to ? resolveCommit(root, range.to) : head;
311
+ const from = range.from ? resolveCommit(root, range.from) : undefined;
312
+ const line = empty ? [] : git(root, ["rev-list", "--first-parent", "--reverse", to]).split("\n").filter(Boolean);
313
+ if (from && !line.includes(from))
314
+ throw new Error(`${range.from} is not on the first-parent line of ${range.to ?? "HEAD"}, so there is no range between them`);
315
+ const commits = from ? line.slice(line.indexOf(from) + 1) : line;
316
+ const read = commitReader(root);
317
+ const all = (await readUnitFiles(storePaths(root))).map(parseUnit);
318
+ const store = new Map(all.filter((unit) => !isRemoved(unit)).map((unit) => [unit.uid, unit]));
319
+ // A deletion already recovered, by where the code was and the commit that deleted it, so a rerun mints nothing new.
320
+ const deletion = (file, name, commit) => `${file}#${name}@${commit}`;
321
+ const recovered = new Set(all.filter(isRemoved).map((unit) => deletion(unit.location.file, unit.name, unit.versions.at(-1).commit ?? "")));
322
+ const state = new Map();
323
+ const plan = { commits: commits.length, range: { ...(from ? { from } : {}), to }, units: [], beyond: 0, removed: [] };
324
+ const done = new Set();
325
+ const startsAt = from ? `the range starts after ${from.slice(0, 7)}; earlier history was not walked` : undefined;
326
+ if (from) {
327
+ // Units recorded by `from` have their prehistory before the range; none of it is here.
328
+ for (const path of git(root, ["ls-tree", "-r", "--name-only", from, "--", ".poetics/units"]).split("\n")) {
329
+ const recorded = /([0-9A-Z]{26})\.json$/.exec(path);
330
+ if (recorded)
331
+ done.add(recorded[1]);
332
+ }
333
+ // The code at `from` is where the walk starts: followed, with no history it can claim.
334
+ for (const file of git(root, ["ls-tree", "-r", "--name-only", from]).split("\n").filter(indexable)) {
335
+ const text = showAt(root, from, file);
336
+ if (text === undefined)
337
+ continue;
338
+ const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true);
339
+ state.set(file, detectUnits(source, file, plugins).map((unit) => {
340
+ const tree = contentTree(unit);
341
+ return {
342
+ code: { key: unit.key, file, name: unit.name, kind: unit.kind, contentHash: contentHash(tree), fingerprint: fingerprint(tree) },
343
+ framework: unit.framework,
344
+ runtimeHash: contentHash(contentTree(unit, true)),
345
+ signature: signatureText(unit, source, plugins),
346
+ history: [],
347
+ };
348
+ }));
349
+ }
350
+ }
351
+ // A unit's prehistory is the history at its place just before its unit file was first committed.
352
+ const capture = (uid, location) => {
353
+ const unit = store.get(uid);
354
+ if (!unit || done.has(uid))
355
+ return;
356
+ done.add(uid);
357
+ const followed = (state.get(location.file) ?? []).find((f) => f.code.name === location.name && (f.code.kind === "type") === (location.kind === "type"));
358
+ if (followed)
359
+ followed.recorded = true;
360
+ if (!followed || followed.history.length === 0)
361
+ return;
362
+ const entry = { uid, name: unit.name, file: unit.location.file, prehistory: followed.history };
363
+ if (followed.stoppedAt)
364
+ entry.stoppedAt = followed.stoppedAt;
365
+ plan.units.push(entry);
366
+ };
367
+ commits.forEach((sha, i) => {
368
+ const parent = i === 0 ? from : commits[i - 1];
369
+ const changes = git(root, parent ? ["diff-tree", "-r", "--name-status", "-M", parent, sha] : ["diff-tree", "-r", "--name-status", "--root", sha])
370
+ .split("\n")
371
+ .filter(Boolean)
372
+ .map((line) => line.split("\t"));
373
+ const recordedHere = [];
374
+ for (const [status, path] of changes) {
375
+ const added = /^\.poetics\/units\/(?:[^/]+\/)?([0-9A-Z]{26})\.json$/.exec(path ?? "");
376
+ if (status === "A" && added) {
377
+ const recorded = JSON.parse(showAt(root, sha, path) ?? "{}");
378
+ if (recorded.location && recorded.name && recorded.kind) {
379
+ const location = { file: recorded.location.file, name: recorded.name, kind: recorded.kind };
380
+ capture(added[1], location);
381
+ recordedHere.push(location);
382
+ }
383
+ }
384
+ }
385
+ // A unit file committed with its code describes the code after this commit, so mark it once the commit is read.
386
+ const markRecorded = () => {
387
+ for (const location of recordedHere) {
388
+ const followed = (state.get(location.file) ?? []).find((f) => f.code.name === location.name && (f.code.kind === "type") === (location.kind === "type"));
389
+ if (followed)
390
+ followed.recorded = true;
391
+ }
392
+ };
393
+ const touched = new Set();
394
+ const present = [];
395
+ for (const [status, first, second] of changes) {
396
+ for (const file of [first, second])
397
+ if (file && indexable(file))
398
+ touched.add(file);
399
+ const now = status?.startsWith("R") || status?.startsWith("C") ? second : first;
400
+ if (now && status !== "D" && indexable(now))
401
+ present.push(now);
402
+ }
403
+ if (touched.size === 0)
404
+ return markRecorded();
405
+ const before = [...touched].flatMap((file) => state.get(file) ?? []);
406
+ const after = present.flatMap((file) => {
407
+ const text = showAt(root, sha, file);
408
+ if (text === undefined)
409
+ return [];
410
+ const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true);
411
+ return detectUnits(source, file, plugins).map((unit) => {
412
+ const tree = contentTree(unit);
413
+ return {
414
+ code: { key: unit.key, file, name: unit.name, kind: unit.kind, contentHash: contentHash(tree), fingerprint: fingerprint(tree) },
415
+ framework: unit.framework,
416
+ runtimeHash: contentHash(contentTree(unit, true)),
417
+ signature: signatureText(unit, source, plugins),
418
+ };
419
+ });
420
+ });
421
+ const ids = new Map(before.map((followed, n) => [`h${n}`, followed]));
422
+ const result = matchIdentities([...ids].map(([uid, followed]) => ({ ...followed.code, uid })), after.map((a) => a.code));
423
+ const afterByKey = new Map(after.map((a) => [a.code.key, a]));
424
+ const info = read(sha);
425
+ const changed = [];
426
+ const version = (parentHash, next, change) => {
427
+ const v = {
428
+ contentHash: next.code.contentHash,
429
+ parent: parentHash,
430
+ change,
431
+ commit: sha,
432
+ actor: info.agent ? { kind: "agent", tool: info.agent, reviewed: false } : { kind: "human" },
433
+ rationale: info.body || info.subject || `Changed in ${sha.slice(0, 7)}; the commit does not say why.`,
434
+ };
435
+ if (info.issues.length > 0)
436
+ v.links = info.issues.map((ref) => ({ kind: "github-issue", ref }));
437
+ return v;
438
+ };
439
+ const next = new Map();
440
+ const place = (followed) => next.set(followed.code.file, [...(next.get(followed.code.file) ?? []), followed]);
441
+ for (const match of result.matched) {
442
+ const was = ids.get(match.uid);
443
+ const now = afterByKey.get(match.key);
444
+ const followed = { ...was, code: now.code, runtimeHash: now.runtimeHash, signature: now.signature };
445
+ if (now.code.contentHash !== was.code.contentHash && was.history.length === 0) {
446
+ // Code that was there when the range started: its first change here opens its prehistory, as created, and a
447
+ // walk from further back that reaches it records the same version with its real change and parent.
448
+ const v = version(null, now, "created");
449
+ followed.history = [v];
450
+ followed.stoppedAt = { commit: sha, reason: startsAt };
451
+ changed.push({ followed, version: v });
452
+ }
453
+ else if (now.code.contentHash !== was.code.contentHash) {
454
+ // Interface from the signature as written: the checker's hash would need this commit's dependencies.
455
+ const change = now.signature !== was.signature ? "interface" : now.runtimeHash === was.runtimeHash ? "cosmetic" : "behaviour";
456
+ const v = version(was.code.contentHash, now, change);
457
+ followed.history = [...was.history, v];
458
+ changed.push({ followed, version: v });
459
+ }
460
+ place(followed);
461
+ }
462
+ const queuedKeys = new Set(result.queued.flatMap((q) => q.keys));
463
+ for (const created of [...result.created.map((c) => c.key), ...queuedKeys]) {
464
+ const now = afterByKey.get(created);
465
+ const v = version(null, now, "created");
466
+ const followed = { code: now.code, framework: now.framework, runtimeHash: now.runtimeHash, signature: now.signature, history: [v] };
467
+ // A unit matching would only have queued starts afresh here; what came before is not claimed.
468
+ if (queuedKeys.has(created))
469
+ followed.stoppedAt = { commit: sha, reason: result.queued.find((q) => q.keys.includes(created)).reason };
470
+ changed.push({ followed, version: v });
471
+ place(followed);
472
+ }
473
+ for (const file of touched)
474
+ state.delete(file);
475
+ for (const [file, list] of next)
476
+ state.set(file, list);
477
+ markRecorded();
478
+ // Text shared by everything a commit changed speaks to none of them in particular.
479
+ const sources = info.body || info.subject ? ["commit"] : [];
480
+ for (const { followed, version: v } of changed) {
481
+ const confidence = sources.length === 0 ? "low" : changed.length === 1 || names(v.rationale, followed.code.name) ? "high" : "medium";
482
+ const last = followed.history.at(-1);
483
+ last.inferred = { by: BY, confidence, sources, drafted: false, reviewed: false };
484
+ }
485
+ // Exports this commit deleted before anyone recorded them. Matching is confident they are gone: a unit it would
486
+ // only have queued is not claimed, and code present when the range started has no history here to recover.
487
+ if (!range.includeRemoved)
488
+ return;
489
+ const gone = result.removed.map((r) => ids.get(r.uid)).filter((was) => !was.recorded && was.history.length > 0 && !recovered.has(deletion(was.code.file, was.code.name, sha)));
490
+ for (const was of gone) {
491
+ const rationale = info.body || info.subject || `Deleted in ${sha.slice(0, 7)}; the commit does not say why.`;
492
+ const confidence = sources.length === 0 ? "low" : gone.length + changed.length === 1 || names(rationale, was.code.name) ? "high" : "medium";
493
+ const last = was.history.at(-1);
494
+ const removed = {
495
+ contentHash: REMOVED_CONTENT_HASH,
496
+ provisional: true,
497
+ parent: last.contentHash,
498
+ change: "removed",
499
+ commit: sha,
500
+ actor: info.agent ? { kind: "agent", tool: info.agent, reviewed: false } : { kind: "human" },
501
+ rationale,
502
+ inferred: { by: BY, confidence, sources, drafted: false, reviewed: false },
503
+ };
504
+ if (info.issues.length > 0)
505
+ removed.links = info.issues.map((ref) => ({ kind: "github-issue", ref }));
506
+ plan.removed.push({
507
+ uid: mintUid(),
508
+ kind: was.code.kind,
509
+ framework: was.framework,
510
+ name: was.code.name,
511
+ location: { file: was.code.file },
512
+ prehistory: was.history,
513
+ // What a snapshot taken just before the deletion would have recorded: the code as it last was, then its removal.
514
+ versions: [{ ...last, parent: null, change: "created" }, removed],
515
+ });
516
+ }
517
+ });
518
+ // Units whose unit file is not committed yet were recorded from the code as it is now, which a walk to HEAD reaches.
519
+ for (const unit of store.values()) {
520
+ if (done.has(unit.uid))
521
+ continue;
522
+ if (to === head)
523
+ capture(unit.uid, { file: unit.location.file, name: unit.name, kind: unit.kind });
524
+ else
525
+ plan.beyond++;
526
+ }
527
+ const byPlace = (a, b) => (a.file === b.file ? (a.name < b.name ? -1 : 1) : a.file < b.file ? -1 : 1);
528
+ plan.units.sort(byPlace);
529
+ plan.removed.sort((a, b) => byPlace({ file: a.location.file, name: a.name }, { file: b.location.file, name: b.name }));
530
+ return plan;
531
+ }
532
+ /** Writes each unit's prehistory, unless it already has exactly that, and a unit file for each recovered deletion. Returns how many unit files changed. */
533
+ export async function applyPrehistory(root, plan, layout = "flat") {
534
+ const paths = storePaths(root);
535
+ let written = 0;
536
+ for (const unit of plan.removed) {
537
+ // Created as a snapshot just before the deletion would have, then removed, through the store's own rules.
538
+ const [created, removed] = unit.versions;
539
+ await createUnit({ paths, actor: created.actor }, { ...unit, versions: [created] }, layout);
540
+ await appendVersion({ paths, actor: removed.actor }, unit.uid, removed);
541
+ written++;
542
+ }
543
+ for (const entry of plan.units) {
544
+ const unit = parseUnit((await readUnitFiles(paths)).find((file) => file.relativePath.endsWith(`${entry.uid}.json`)));
545
+ if (JSON.stringify(unit.prehistory ?? []) === JSON.stringify(entry.prehistory))
546
+ continue;
547
+ await setPrehistory({ paths, actor: { kind: "human" } }, entry.uid, entry.prehistory);
548
+ written++;
549
+ }
550
+ return written;
551
+ }
552
+ /** A ref or commit id as the full id of the commit it names. */
553
+ function resolveCommit(root, ref) {
554
+ try {
555
+ return git(root, ["rev-parse", "--verify", "--quiet", "--end-of-options", `${ref}^{commit}`]).trim();
556
+ }
557
+ catch {
558
+ throw new Error(`${ref} does not name a commit`);
559
+ }
560
+ }
561
+ /** The prehistory plan for people: one line per unit with how far back it reaches, then a summary. */
562
+ export function formatPrehistoryPlan(plan, written) {
563
+ const lines = plan.units.map((entry) => {
564
+ const first = entry.prehistory[0];
565
+ const stop = entry.stoppedAt ? `; stops at ${entry.stoppedAt.commit.slice(0, 7)} (${entry.stoppedAt.reason})` : "";
566
+ return `${entry.file}#${entry.name}: ${entry.prehistory.length} version(s) back to ${first.commit.slice(0, 7)}${stop}`;
567
+ });
568
+ const versions = plan.units.reduce((n, entry) => n + entry.prehistory.length, 0);
569
+ const walked = `${plan.commits} commit(s)${plan.range.from ? ` after ${plan.range.from.slice(0, 7)}` : ""}`;
570
+ const counts = `${versions} version(s) of prehistory for ${plan.units.length} unit(s), from ${walked}`;
571
+ for (const unit of plan.removed) {
572
+ const removed = unit.versions.at(-1);
573
+ lines.push(`- ${unit.location.file}#${unit.name}: deleted in ${removed.commit.slice(0, 7)} [${removed.inferred.confidence}], ${unit.prehistory.length} version(s) before; ${firstLine(removed.rationale)}`);
574
+ }
575
+ if (plan.removed.length > 0)
576
+ lines.push(`${plan.removed.length} deleted export(s) would be recovered as removed units.`.replace("would be", written === undefined ? "would be" : "were"));
577
+ if (plan.beyond > 0)
578
+ lines.push(`${plan.beyond} unit(s) were recorded after ${plan.range.to.slice(0, 7)}, where the range ends; walk to a later commit to reach them.`);
579
+ lines.push(written === undefined ? `Would record ${counts}. Run with --write to record it.` : `Recorded ${counts}; ${written} unit file(s) changed.`);
580
+ return lines.join("\n");
581
+ }
582
+ //# sourceMappingURL=backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../src/backfill.ts"],"names":[],"mappings":"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"}