daftari 1.28.0 → 1.30.0
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/CHANGELOG.md +197 -0
- package/README.md +167 -28
- package/dist/asof/git-read.d.ts +17 -0
- package/dist/asof/git-read.d.ts.map +1 -0
- package/dist/asof/git-read.js +163 -0
- package/dist/asof/git-read.js.map +1 -0
- package/dist/asof/index.d.ts +2 -0
- package/dist/asof/index.d.ts.map +1 -0
- package/dist/asof/index.js +151 -0
- package/dist/asof/index.js.map +1 -0
- package/dist/asof/report.d.ts +11 -0
- package/dist/asof/report.d.ts.map +1 -0
- package/dist/asof/report.js +119 -0
- package/dist/asof/report.js.map +1 -0
- package/dist/asof/snapshot.d.ts +72 -0
- package/dist/asof/snapshot.d.ts.map +1 -0
- package/dist/asof/snapshot.js +207 -0
- package/dist/asof/snapshot.js.map +1 -0
- package/dist/backfill/apply.js +2 -2
- package/dist/backfill/apply.js.map +1 -1
- package/dist/backfill/plan.js +2 -2
- package/dist/backfill/plan.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -1
- package/dist/consolidate/call-budget.d.ts +3 -0
- package/dist/consolidate/call-budget.d.ts.map +1 -0
- package/dist/consolidate/call-budget.js +37 -0
- package/dist/consolidate/call-budget.js.map +1 -0
- package/dist/consolidate/constants.d.ts +1 -0
- package/dist/consolidate/constants.d.ts.map +1 -1
- package/dist/consolidate/constants.js +5 -0
- package/dist/consolidate/constants.js.map +1 -1
- package/dist/consolidate/index.d.ts.map +1 -1
- package/dist/consolidate/index.js +96 -27
- package/dist/consolidate/index.js.map +1 -1
- package/dist/court/docket.d.ts +39 -0
- package/dist/court/docket.d.ts.map +1 -0
- package/dist/court/docket.js +103 -0
- package/dist/court/docket.js.map +1 -0
- package/dist/court/index.d.ts +2 -0
- package/dist/court/index.d.ts.map +1 -0
- package/dist/court/index.js +169 -0
- package/dist/court/index.js.map +1 -0
- package/dist/court/precedent.d.ts +18 -0
- package/dist/court/precedent.d.ts.map +1 -0
- package/dist/court/precedent.js +84 -0
- package/dist/court/precedent.js.map +1 -0
- package/dist/court/report.d.ts +10 -0
- package/dist/court/report.d.ts.map +1 -0
- package/dist/court/report.js +77 -0
- package/dist/court/report.js.map +1 -0
- package/dist/curation/staged-actions.d.ts.map +1 -1
- package/dist/curation/staged-actions.js +15 -6
- package/dist/curation/staged-actions.js.map +1 -1
- package/dist/curation/staleness.js +1 -1
- package/dist/curation/staleness.js.map +1 -1
- package/dist/curation/tension-access.d.ts +7 -0
- package/dist/curation/tension-access.d.ts.map +1 -0
- package/dist/curation/tension-access.js +44 -0
- package/dist/curation/tension-access.js.map +1 -0
- package/dist/curation/tension-blast.d.ts +2 -1
- package/dist/curation/tension-blast.d.ts.map +1 -1
- package/dist/curation/tension-blast.js +2 -2
- package/dist/curation/tension-blast.js.map +1 -1
- package/dist/curation/tension-clusters.d.ts +1 -1
- package/dist/curation/tension-clusters.d.ts.map +1 -1
- package/dist/curation/tension-clusters.js +5 -2
- package/dist/curation/tension-clusters.js.map +1 -1
- package/dist/curation/tension.d.ts +1 -0
- package/dist/curation/tension.d.ts.map +1 -1
- package/dist/curation/tension.js +18 -10
- package/dist/curation/tension.js.map +1 -1
- package/dist/curation/vault-docs.js +1 -1
- package/dist/curation/vault-docs.js.map +1 -1
- package/dist/eval/llm-openrouter.d.ts +9 -0
- package/dist/eval/llm-openrouter.d.ts.map +1 -0
- package/dist/eval/llm-openrouter.js +171 -0
- package/dist/eval/llm-openrouter.js.map +1 -0
- package/dist/frontmatter/parser.d.ts +1 -0
- package/dist/frontmatter/parser.d.ts.map +1 -1
- package/dist/frontmatter/parser.js +12 -0
- package/dist/frontmatter/parser.js.map +1 -1
- package/dist/frontmatter/schema.d.ts.map +1 -1
- package/dist/frontmatter/schema.js +19 -2
- package/dist/frontmatter/schema.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/search/contested.d.ts +18 -0
- package/dist/search/contested.d.ts.map +1 -0
- package/dist/search/contested.js +119 -0
- package/dist/search/contested.js.map +1 -0
- package/dist/search/hybrid.d.ts +5 -0
- package/dist/search/hybrid.d.ts.map +1 -1
- package/dist/search/hybrid.js +112 -9
- package/dist/search/hybrid.js.map +1 -1
- package/dist/search/reindex.d.ts.map +1 -1
- package/dist/search/reindex.js +16 -13
- package/dist/search/reindex.js.map +1 -1
- package/dist/search/watcher.js +2 -2
- package/dist/search/watcher.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/sleep/cycle.d.ts +59 -0
- package/dist/sleep/cycle.d.ts.map +1 -0
- package/dist/sleep/cycle.js +127 -0
- package/dist/sleep/cycle.js.map +1 -0
- package/dist/sleep/index.d.ts +3 -0
- package/dist/sleep/index.d.ts.map +1 -0
- package/dist/sleep/index.js +129 -0
- package/dist/sleep/index.js.map +1 -0
- package/dist/sleep/report.d.ts +11 -0
- package/dist/sleep/report.d.ts.map +1 -0
- package/dist/sleep/report.js +87 -0
- package/dist/sleep/report.js.map +1 -0
- package/dist/storage/index-db.d.ts +2 -0
- package/dist/storage/index-db.d.ts.map +1 -1
- package/dist/storage/index-db.js +106 -19
- package/dist/storage/index-db.js.map +1 -1
- package/dist/storage/local.d.ts +6 -1
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +30 -4
- package/dist/storage/local.js.map +1 -1
- package/dist/tools/curation.d.ts.map +1 -1
- package/dist/tools/curation.js +60 -3
- package/dist/tools/curation.js.map +1 -1
- package/dist/tools/edges.js +2 -2
- package/dist/tools/edges.js.map +1 -1
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/receipt.d.ts +65 -0
- package/dist/tools/receipt.d.ts.map +1 -0
- package/dist/tools/receipt.js +248 -0
- package/dist/tools/receipt.js.map +1 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +40 -8
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/staged-actions.js +1 -1
- package/dist/tools/staged-actions.js.map +1 -1
- package/dist/tools/themes.d.ts +1 -0
- package/dist/tools/themes.d.ts.map +1 -1
- package/dist/tools/themes.js +159 -45
- package/dist/tools/themes.js.map +1 -1
- package/dist/tools/witness.d.ts +9 -0
- package/dist/tools/witness.d.ts.map +1 -0
- package/dist/tools/witness.js +66 -0
- package/dist/tools/witness.js.map +1 -0
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +101 -53
- package/dist/tools/write.js.map +1 -1
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +48 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +15 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/redos.d.ts +2 -0
- package/dist/utils/redos.d.ts.map +1 -0
- package/dist/utils/redos.js +101 -0
- package/dist/utils/redos.js.map +1 -0
- package/dist/utils/vault-gitignore.d.ts +1 -1
- package/dist/utils/vault-gitignore.d.ts.map +1 -1
- package/dist/utils/vault-gitignore.js +2 -0
- package/dist/utils/vault-gitignore.js.map +1 -1
- package/dist/witness/track-record.d.ts +42 -0
- package/dist/witness/track-record.d.ts.map +1 -0
- package/dist/witness/track-record.js +189 -0
- package/dist/witness/track-record.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Top-level entry for `daftari asof` — belief archaeology over the vault's
|
|
2
|
+
// git history. Strictly read-only: never checks anything out, never writes
|
|
3
|
+
// to the repo, needs no index and no API key.
|
|
4
|
+
//
|
|
5
|
+
// Exit codes (the audit convention):
|
|
6
|
+
// 0 — report produced
|
|
7
|
+
// 2 — config/usage error (bad ref or date, not a git repo, unknown doc)
|
|
8
|
+
// 3 — runtime error (IO failure writing the report)
|
|
9
|
+
import { writeFile } from "node:fs/promises";
|
|
10
|
+
import { resolve } from "node:path";
|
|
11
|
+
import { listTensions } from "../curation/tension.js";
|
|
12
|
+
import { isGitRepo } from "../utils/git.js";
|
|
13
|
+
import { resolveAsofCommit } from "./git-read.js";
|
|
14
|
+
import { renderJson, renderMarkdown } from "./report.js";
|
|
15
|
+
import { beliefSnapshot, counterfactualReplay, docTrajectory } from "./snapshot.js";
|
|
16
|
+
const HELP = `daftari asof — what did the vault believe at a past point?
|
|
17
|
+
|
|
18
|
+
Usage:
|
|
19
|
+
daftari asof <ref-or-date> [--vault <path>] [options]
|
|
20
|
+
daftari asof --help
|
|
21
|
+
|
|
22
|
+
<ref-or-date> is either a git ref (HEAD~5, a branch, a commit hash, a tag)
|
|
23
|
+
or a YYYY-MM-DD date, meaning the last commit on or before the end of that
|
|
24
|
+
day (committer clock).
|
|
25
|
+
|
|
26
|
+
The default report is a belief snapshot: the vault's document and tension
|
|
27
|
+
state at that point, plus the drift since — documents added/removed, status
|
|
28
|
+
and confidence transitions, and tensions opened or resolved.
|
|
29
|
+
|
|
30
|
+
Flags:
|
|
31
|
+
--vault <path> Vault root (default: current directory).
|
|
32
|
+
--doc <relpath> Add a single-document trajectory: its frontmatter
|
|
33
|
+
then vs now, and every commit touching it since.
|
|
34
|
+
--blast <relpath> Add a counterfactual replay: the blast radius of the
|
|
35
|
+
document computed over the tree AS OF the commit
|
|
36
|
+
(same source/link edge semantics as
|
|
37
|
+
vault_tension_blast), each downstream doc annotated
|
|
38
|
+
with its status today. "This fact turned out wrong —
|
|
39
|
+
who had inherited it, and where are they now?"
|
|
40
|
+
--output <md> Markdown report destination (default: stdout).
|
|
41
|
+
--output-json <json> JSON report destination (default: not written).
|
|
42
|
+
|
|
43
|
+
Read-only. Works on any daftari vault that uses git as its version layer.
|
|
44
|
+
|
|
45
|
+
Exit codes:
|
|
46
|
+
0 — report produced
|
|
47
|
+
2 — config/usage error (bad ref/date, not a git repo, unknown doc)
|
|
48
|
+
3 — runtime error (IO failure)
|
|
49
|
+
`;
|
|
50
|
+
function readStringArg(argv, flag) {
|
|
51
|
+
const raw = argv.find((a) => a === flag || a.startsWith(`${flag}=`));
|
|
52
|
+
if (raw === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
const idx = argv.indexOf(raw);
|
|
55
|
+
return raw.includes("=") ? raw.slice(raw.indexOf("=") + 1) : argv[idx + 1];
|
|
56
|
+
}
|
|
57
|
+
export async function runAsof(argv) {
|
|
58
|
+
if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) {
|
|
59
|
+
process.stdout.write(HELP);
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
const refOrDate = findPositional(argv);
|
|
63
|
+
if (!refOrDate) {
|
|
64
|
+
process.stderr.write("daftari asof: missing <ref-or-date>\n");
|
|
65
|
+
return 2;
|
|
66
|
+
}
|
|
67
|
+
const vaultRoot = resolve(readStringArg(argv, "--vault") ?? ".");
|
|
68
|
+
if (!(await isGitRepo(vaultRoot))) {
|
|
69
|
+
process.stderr.write(`daftari asof: not a git repository: ${vaultRoot}\n`);
|
|
70
|
+
return 2;
|
|
71
|
+
}
|
|
72
|
+
const commit = await resolveAsofCommit(vaultRoot, refOrDate);
|
|
73
|
+
if (!commit.ok) {
|
|
74
|
+
process.stderr.write(`daftari asof: ${commit.error.message}\n`);
|
|
75
|
+
return 2;
|
|
76
|
+
}
|
|
77
|
+
const tensionsNow = await listTensions(vaultRoot);
|
|
78
|
+
if (!tensionsNow.ok) {
|
|
79
|
+
process.stderr.write(`daftari asof: ${tensionsNow.error.message}\n`);
|
|
80
|
+
return 3;
|
|
81
|
+
}
|
|
82
|
+
const snapshot = await beliefSnapshot(vaultRoot, commit.value, tensionsNow.value);
|
|
83
|
+
if (!snapshot.ok) {
|
|
84
|
+
process.stderr.write(`daftari asof: ${snapshot.error.message}\n`);
|
|
85
|
+
return 3;
|
|
86
|
+
}
|
|
87
|
+
const docPath = readStringArg(argv, "--doc");
|
|
88
|
+
let trajectory = null;
|
|
89
|
+
if (docPath) {
|
|
90
|
+
const t = await docTrajectory(vaultRoot, commit.value, docPath);
|
|
91
|
+
if (!t.ok) {
|
|
92
|
+
process.stderr.write(`daftari asof: ${t.error.message}\n`);
|
|
93
|
+
return 2;
|
|
94
|
+
}
|
|
95
|
+
trajectory = t.value;
|
|
96
|
+
}
|
|
97
|
+
const blastPath = readStringArg(argv, "--blast");
|
|
98
|
+
let replay = null;
|
|
99
|
+
if (blastPath) {
|
|
100
|
+
const r = await counterfactualReplay(vaultRoot, commit.value, blastPath);
|
|
101
|
+
if (!r.ok) {
|
|
102
|
+
process.stderr.write(`daftari asof: ${r.error.message}\n`);
|
|
103
|
+
return 2;
|
|
104
|
+
}
|
|
105
|
+
replay = r.value;
|
|
106
|
+
}
|
|
107
|
+
const report = {
|
|
108
|
+
generatedAt: new Date().toISOString(),
|
|
109
|
+
vault: vaultRoot,
|
|
110
|
+
snapshot: snapshot.value,
|
|
111
|
+
trajectory,
|
|
112
|
+
replay,
|
|
113
|
+
};
|
|
114
|
+
const md = renderMarkdown(report);
|
|
115
|
+
const outputMd = readStringArg(argv, "--output");
|
|
116
|
+
const outputJson = readStringArg(argv, "--output-json");
|
|
117
|
+
try {
|
|
118
|
+
if (outputMd) {
|
|
119
|
+
await writeFile(resolve(outputMd), md, "utf-8");
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
process.stdout.write(md);
|
|
123
|
+
}
|
|
124
|
+
if (outputJson) {
|
|
125
|
+
await writeFile(resolve(outputJson), renderJson(report), "utf-8");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
130
|
+
process.stderr.write(`daftari asof: write failed: ${reason}\n`);
|
|
131
|
+
return 3;
|
|
132
|
+
}
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
135
|
+
// The positional <ref-or-date> is the first argv entry that is neither a
|
|
136
|
+
// --flag nor the value of a value-taking flag (the `--flag value` form; the
|
|
137
|
+
// `--flag=value` form never occupies its own entry).
|
|
138
|
+
const VALUE_FLAGS = ["--vault", "--doc", "--blast", "--output", "--output-json"];
|
|
139
|
+
function findPositional(argv) {
|
|
140
|
+
for (let i = 0; i < argv.length; i++) {
|
|
141
|
+
const a = argv[i];
|
|
142
|
+
if (a.startsWith("--"))
|
|
143
|
+
continue;
|
|
144
|
+
const prev = i > 0 ? argv[i - 1] : undefined;
|
|
145
|
+
if (prev !== undefined && VALUE_FLAGS.includes(prev))
|
|
146
|
+
continue;
|
|
147
|
+
return a;
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/asof/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AsofReplay, AsofSnapshot, DocTrajectory } from "./snapshot.js";
|
|
2
|
+
export interface AsofReport {
|
|
3
|
+
generatedAt: string;
|
|
4
|
+
vault: string;
|
|
5
|
+
snapshot: AsofSnapshot;
|
|
6
|
+
trajectory: DocTrajectory | null;
|
|
7
|
+
replay: AsofReplay | null;
|
|
8
|
+
}
|
|
9
|
+
export declare function renderMarkdown(report: AsofReport): string;
|
|
10
|
+
export declare function renderJson(report: AsofReport): string;
|
|
11
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/asof/report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI7E,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;CAC3B;AAeD,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA2GzD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Markdown + JSON rendering for `daftari asof`. Mirrors the audit report's
|
|
2
|
+
// conventions: markdown to stdout by default, JSON carries the same
|
|
3
|
+
// structure with full detail, long lists are capped in markdown (never in
|
|
4
|
+
// JSON) with an explicit "+n more" so truncation is visible, not silent.
|
|
5
|
+
const LIST_CAP = 50;
|
|
6
|
+
function cappedList(items, render) {
|
|
7
|
+
const shown = items.slice(0, LIST_CAP).map(render);
|
|
8
|
+
if (items.length > LIST_CAP)
|
|
9
|
+
shown.push(`- …and ${items.length - LIST_CAP} more`);
|
|
10
|
+
return shown;
|
|
11
|
+
}
|
|
12
|
+
function countLine(counts) {
|
|
13
|
+
const parts = Object.entries(counts)
|
|
14
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
15
|
+
.map(([k, n]) => `${k} ${n}`);
|
|
16
|
+
return parts.length > 0 ? parts.join(" · ") : "(none)";
|
|
17
|
+
}
|
|
18
|
+
export function renderMarkdown(report) {
|
|
19
|
+
const { snapshot, trajectory, replay } = report;
|
|
20
|
+
const short = snapshot.commit.hash.slice(0, 8);
|
|
21
|
+
const lines = [];
|
|
22
|
+
lines.push(`# Belief Snapshot — as of ${snapshot.commit.date} (${short})`);
|
|
23
|
+
lines.push("");
|
|
24
|
+
lines.push(`> ${snapshot.commit.subject}`);
|
|
25
|
+
lines.push("");
|
|
26
|
+
lines.push("## The vault then");
|
|
27
|
+
lines.push(`- documents: **${snapshot.docCount}**`);
|
|
28
|
+
lines.push(`- by status: ${countLine(snapshot.byStatus)}`);
|
|
29
|
+
lines.push(`- by collection: ${countLine(snapshot.byCollection)}`);
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push(`## Drift since (${short}..now)`);
|
|
32
|
+
const d = snapshot.drift;
|
|
33
|
+
lines.push(`- added: **${d.added.length}** · removed: **${d.removed.length}** · ` +
|
|
34
|
+
`belief transitions: **${d.transitions.length}** · bodies changed: **${d.bodiesChanged}**`);
|
|
35
|
+
lines.push("");
|
|
36
|
+
if (d.transitions.length > 0) {
|
|
37
|
+
lines.push("### Belief transitions");
|
|
38
|
+
lines.push("| doc | field | then | now |");
|
|
39
|
+
lines.push("|-----|-------|------|-----|");
|
|
40
|
+
for (const t of d.transitions.slice(0, LIST_CAP)) {
|
|
41
|
+
lines.push(`| ${t.path} | ${t.field} | ${t.from} | ${t.to} |`);
|
|
42
|
+
}
|
|
43
|
+
if (d.transitions.length > LIST_CAP) {
|
|
44
|
+
lines.push(`| …and ${d.transitions.length - LIST_CAP} more | | | |`);
|
|
45
|
+
}
|
|
46
|
+
lines.push("");
|
|
47
|
+
}
|
|
48
|
+
if (d.added.length > 0) {
|
|
49
|
+
lines.push("### Added since");
|
|
50
|
+
lines.push(...cappedList(d.added, (p) => `- ${p}`));
|
|
51
|
+
lines.push("");
|
|
52
|
+
}
|
|
53
|
+
if (d.removed.length > 0) {
|
|
54
|
+
lines.push("### Removed since");
|
|
55
|
+
lines.push(...cappedList(d.removed, (p) => `- ${p}`));
|
|
56
|
+
lines.push("");
|
|
57
|
+
}
|
|
58
|
+
const tn = snapshot.tensions;
|
|
59
|
+
lines.push("## Tensions");
|
|
60
|
+
lines.push(`- open then: **${tn.openThen}** · open now: **${tn.openNow}**`);
|
|
61
|
+
if (tn.openedSince.length > 0) {
|
|
62
|
+
lines.push(`- opened since: **${tn.openedSince.length}**`);
|
|
63
|
+
for (const t of tn.openedSince.slice(0, LIST_CAP)) {
|
|
64
|
+
lines.push(` - ${t.date} · ${t.kind} · ${t.title}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (tn.resolvedSince.length > 0) {
|
|
68
|
+
lines.push(`- resolved since: **${tn.resolvedSince.length}**`);
|
|
69
|
+
for (const t of tn.resolvedSince.slice(0, LIST_CAP)) {
|
|
70
|
+
lines.push(` - ${t.date} · ${t.kind} · ${t.title} → ${t.resolutionKind}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
lines.push("");
|
|
74
|
+
if (replay) {
|
|
75
|
+
lines.push(`## Counterfactual replay — ${replay.document}`);
|
|
76
|
+
lines.push(`Downstream of this document **as of ${snapshot.commit.date}**: ` +
|
|
77
|
+
`**${replay.downstreamThen.length}** documents ` +
|
|
78
|
+
`(primary ${replay.primaryBlast}, advisory ${replay.advisoryBlast}, ` +
|
|
79
|
+
`max depth ${replay.maxDepth}). ` +
|
|
80
|
+
`Of those, **${replay.stillCanonicalNow}** are still canonical today and ` +
|
|
81
|
+
`**${replay.goneNow}** are gone.`);
|
|
82
|
+
lines.push("");
|
|
83
|
+
if (replay.downstreamThen.length > 0) {
|
|
84
|
+
lines.push("| downstream doc (then) | dependency | distance | status now |");
|
|
85
|
+
lines.push("|----------------------|------------|----------|------------|");
|
|
86
|
+
for (const e of replay.downstreamThen.slice(0, LIST_CAP)) {
|
|
87
|
+
lines.push(`| ${e.path} | ${e.dependency_type} | ${e.distance} | ${e.statusNow} |`);
|
|
88
|
+
}
|
|
89
|
+
if (replay.downstreamThen.length > LIST_CAP) {
|
|
90
|
+
lines.push(`| …and ${replay.downstreamThen.length - LIST_CAP} more | | | |`);
|
|
91
|
+
}
|
|
92
|
+
lines.push("");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (trajectory) {
|
|
96
|
+
lines.push(`## Document trajectory — ${trajectory.path}`);
|
|
97
|
+
lines.push("| | then | now |");
|
|
98
|
+
lines.push("|-|------|-----|");
|
|
99
|
+
const fields = ["title", "status", "confidence", "updated", "provenance"];
|
|
100
|
+
for (const f of fields) {
|
|
101
|
+
const a = trajectory.asOf ? trajectory.asOf[f] : "(absent)";
|
|
102
|
+
const b = trajectory.current ? trajectory.current[f] : "(gone)";
|
|
103
|
+
lines.push(`| ${f} | ${a} | ${b} |`);
|
|
104
|
+
}
|
|
105
|
+
lines.push("");
|
|
106
|
+
if (trajectory.commitsBetween.length > 0) {
|
|
107
|
+
lines.push(`### Commits touching it since (${trajectory.commitsBetween.length})`);
|
|
108
|
+
for (const c of trajectory.commitsBetween.slice(0, LIST_CAP)) {
|
|
109
|
+
lines.push(`- ${c.date} · ${c.hash.slice(0, 8)} · ${c.author} · ${c.subject}`);
|
|
110
|
+
}
|
|
111
|
+
lines.push("");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return `${lines.join("\n")}\n`;
|
|
115
|
+
}
|
|
116
|
+
export function renderJson(report) {
|
|
117
|
+
return `${JSON.stringify(report, null, 2)}\n`;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/asof/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type TensionEntry } from "../curation/tension.js";
|
|
2
|
+
import { type BlastDependencyType } from "../curation/tension-blast.js";
|
|
3
|
+
import { type LoadedDoc } from "../curation/vault-docs.js";
|
|
4
|
+
import { type Result } from "../frontmatter/types.js";
|
|
5
|
+
import { type AsofCommit, type RangeCommit } from "./git-read.js";
|
|
6
|
+
export declare function loadDocumentsAt(vaultRoot: string, commit: string): Promise<Result<LoadedDoc[], Error>>;
|
|
7
|
+
export interface BeliefTransition {
|
|
8
|
+
path: string;
|
|
9
|
+
field: "status" | "confidence";
|
|
10
|
+
from: string;
|
|
11
|
+
to: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AsofSnapshot {
|
|
14
|
+
commit: AsofCommit;
|
|
15
|
+
docCount: number;
|
|
16
|
+
byStatus: Record<string, number>;
|
|
17
|
+
byCollection: Record<string, number>;
|
|
18
|
+
drift: {
|
|
19
|
+
added: string[];
|
|
20
|
+
removed: string[];
|
|
21
|
+
transitions: BeliefTransition[];
|
|
22
|
+
bodiesChanged: number;
|
|
23
|
+
};
|
|
24
|
+
tensions: {
|
|
25
|
+
openThen: number;
|
|
26
|
+
openNow: number;
|
|
27
|
+
openedSince: {
|
|
28
|
+
title: string;
|
|
29
|
+
date: string;
|
|
30
|
+
kind: string;
|
|
31
|
+
}[];
|
|
32
|
+
resolvedSince: {
|
|
33
|
+
title: string;
|
|
34
|
+
date: string;
|
|
35
|
+
kind: string;
|
|
36
|
+
resolutionKind: string;
|
|
37
|
+
}[];
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare function computeTransitions(then: LoadedDoc[], now: LoadedDoc[]): BeliefTransition[];
|
|
41
|
+
export declare function beliefSnapshot(vaultRoot: string, commit: AsofCommit, tensionsNow: TensionEntry[]): Promise<Result<AsofSnapshot, Error>>;
|
|
42
|
+
export interface ReplayEntry {
|
|
43
|
+
path: string;
|
|
44
|
+
dependency_type: BlastDependencyType;
|
|
45
|
+
distance: number;
|
|
46
|
+
statusNow: string;
|
|
47
|
+
}
|
|
48
|
+
export interface AsofReplay {
|
|
49
|
+
document: string;
|
|
50
|
+
downstreamThen: ReplayEntry[];
|
|
51
|
+
primaryBlast: number;
|
|
52
|
+
advisoryBlast: number;
|
|
53
|
+
maxDepth: number;
|
|
54
|
+
stillCanonicalNow: number;
|
|
55
|
+
goneNow: number;
|
|
56
|
+
}
|
|
57
|
+
export declare function counterfactualReplay(vaultRoot: string, commit: AsofCommit, document: string): Promise<Result<AsofReplay, Error>>;
|
|
58
|
+
export interface DocState {
|
|
59
|
+
title: string;
|
|
60
|
+
status: string;
|
|
61
|
+
confidence: string;
|
|
62
|
+
updated: string;
|
|
63
|
+
provenance: string;
|
|
64
|
+
}
|
|
65
|
+
export interface DocTrajectory {
|
|
66
|
+
path: string;
|
|
67
|
+
asOf: DocState | null;
|
|
68
|
+
current: DocState | null;
|
|
69
|
+
commitsBetween: RangeCommit[];
|
|
70
|
+
}
|
|
71
|
+
export declare function docTrajectory(vaultRoot: string, commit: AsofCommit, path: string): Promise<Result<DocTrajectory, Error>>;
|
|
72
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/asof/snapshot.ts"],"names":[],"mappings":"AAQA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACL,KAAK,mBAAmB,EAIzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,2BAA2B,CAAC;AAE1E,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACL,KAAK,UAAU,EAGf,KAAK,WAAW,EAEjB,MAAM,eAAe,CAAC;AAMvB,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC,CAoBrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,WAAW,EAAE,gBAAgB,EAAE,CAAC;QAChC,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC7D,aAAa,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACxF,CAAC;CACH;AAmBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,gBAAgB,EAAE,CA2B1F;AAWD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,YAAY,EAAE,GAC1B,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAmDtC;AAMD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,mBAAmB,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IAGjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAgCpC;AAMD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,WAAW,EAAE,CAAC;CAC/B;AAYD,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAqBvC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// Belief archaeology core — what the vault believed at a past commit, and
|
|
2
|
+
// how belief has drifted since.
|
|
3
|
+
//
|
|
4
|
+
// Everything here resolves by discovery: the "then" state is read from the
|
|
5
|
+
// git tree (the same markdown, parsed by the same parser as the live tools),
|
|
6
|
+
// the "now" state from the working tree, and every reported difference is a
|
|
7
|
+
// literal comparison between the two. Nothing is synthesized.
|
|
8
|
+
import { parseTensionLog } from "../curation/tension.js";
|
|
9
|
+
import { buildReverseLinkMap, buildReverseSourceMap, computeBlast, } from "../curation/tension-blast.js";
|
|
10
|
+
import { loadDocuments } from "../curation/vault-docs.js";
|
|
11
|
+
import { parseDocument } from "../frontmatter/parser.js";
|
|
12
|
+
import { err, ok } from "../frontmatter/types.js";
|
|
13
|
+
import { listTreeDocs, logRangeForPath, readBlobsAt, } from "./git-read.js";
|
|
14
|
+
const TENSIONS_LOG = ".daftari/tensions.md";
|
|
15
|
+
// Loads every managed document from the tree at `commit`, parsed with the
|
|
16
|
+
// same parser and the same skip-malformed tolerance as the live loader.
|
|
17
|
+
export async function loadDocumentsAt(vaultRoot, commit) {
|
|
18
|
+
const paths = await listTreeDocs(vaultRoot, commit);
|
|
19
|
+
if (!paths.ok)
|
|
20
|
+
return paths;
|
|
21
|
+
const blobs = await readBlobsAt(vaultRoot, commit, paths.value);
|
|
22
|
+
if (!blobs.ok)
|
|
23
|
+
return blobs;
|
|
24
|
+
const docs = [];
|
|
25
|
+
for (const path of paths.value) {
|
|
26
|
+
const raw = blobs.value.get(path);
|
|
27
|
+
if (raw === undefined)
|
|
28
|
+
continue;
|
|
29
|
+
const parsed = parseDocument(raw);
|
|
30
|
+
if (!parsed.ok)
|
|
31
|
+
continue;
|
|
32
|
+
docs.push({
|
|
33
|
+
path,
|
|
34
|
+
frontmatter: parsed.value.frontmatter,
|
|
35
|
+
content: parsed.value.content,
|
|
36
|
+
validation: parsed.value.validation,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return ok(docs);
|
|
40
|
+
}
|
|
41
|
+
function countBy(docs, key) {
|
|
42
|
+
const out = {};
|
|
43
|
+
for (const d of docs) {
|
|
44
|
+
const k = key(d);
|
|
45
|
+
out[k] = (out[k] ?? 0) + 1;
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
function collectionOf(d) {
|
|
50
|
+
return d.frontmatter.collection || (d.path.split("/")[0] ?? "");
|
|
51
|
+
}
|
|
52
|
+
function tensionIdentity(t) {
|
|
53
|
+
return t.id ?? `${t.date}:${t.title}`;
|
|
54
|
+
}
|
|
55
|
+
export function computeTransitions(then, now) {
|
|
56
|
+
const nowByPath = new Map(now.map((d) => [d.path, d]));
|
|
57
|
+
const transitions = [];
|
|
58
|
+
for (const t of then) {
|
|
59
|
+
const n = nowByPath.get(t.path);
|
|
60
|
+
if (!n)
|
|
61
|
+
continue;
|
|
62
|
+
if (t.frontmatter.status !== n.frontmatter.status) {
|
|
63
|
+
transitions.push({
|
|
64
|
+
path: t.path,
|
|
65
|
+
field: "status",
|
|
66
|
+
from: t.frontmatter.status,
|
|
67
|
+
to: n.frontmatter.status,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (t.frontmatter.confidence !== n.frontmatter.confidence) {
|
|
71
|
+
transitions.push({
|
|
72
|
+
path: t.path,
|
|
73
|
+
field: "confidence",
|
|
74
|
+
from: t.frontmatter.confidence,
|
|
75
|
+
to: n.frontmatter.confidence,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
transitions.sort((a, b) => a.path === b.path ? (a.field < b.field ? -1 : 1) : a.path < b.path ? -1 : 1);
|
|
80
|
+
return transitions;
|
|
81
|
+
}
|
|
82
|
+
// The tension log at a past commit, parsed with the live parser. A vault
|
|
83
|
+
// with no committed log at that point reads as zero tensions.
|
|
84
|
+
async function tensionsAt(vaultRoot, commit) {
|
|
85
|
+
const blob = await readBlobsAt(vaultRoot, commit, [TENSIONS_LOG]);
|
|
86
|
+
if (!blob.ok)
|
|
87
|
+
return [];
|
|
88
|
+
const raw = blob.value.get(TENSIONS_LOG);
|
|
89
|
+
return raw === undefined ? [] : parseTensionLog(raw);
|
|
90
|
+
}
|
|
91
|
+
export async function beliefSnapshot(vaultRoot, commit, tensionsNow) {
|
|
92
|
+
const thenDocs = await loadDocumentsAt(vaultRoot, commit.hash);
|
|
93
|
+
if (!thenDocs.ok)
|
|
94
|
+
return thenDocs;
|
|
95
|
+
const nowDocs = await loadDocuments(vaultRoot);
|
|
96
|
+
if (!nowDocs.ok)
|
|
97
|
+
return nowDocs;
|
|
98
|
+
const thenPaths = new Set(thenDocs.value.map((d) => d.path));
|
|
99
|
+
const nowPaths = new Set(nowDocs.value.map((d) => d.path));
|
|
100
|
+
const added = [...nowPaths].filter((p) => !thenPaths.has(p)).sort();
|
|
101
|
+
const removed = [...thenPaths].filter((p) => !nowPaths.has(p)).sort();
|
|
102
|
+
const nowByPath = new Map(nowDocs.value.map((d) => [d.path, d]));
|
|
103
|
+
let bodiesChanged = 0;
|
|
104
|
+
for (const t of thenDocs.value) {
|
|
105
|
+
const n = nowByPath.get(t.path);
|
|
106
|
+
if (n && n.content !== t.content)
|
|
107
|
+
bodiesChanged += 1;
|
|
108
|
+
}
|
|
109
|
+
const thenTensions = await tensionsAt(vaultRoot, commit.hash);
|
|
110
|
+
const thenIds = new Set(thenTensions.map(tensionIdentity));
|
|
111
|
+
const thenUnresolvedIds = new Set(thenTensions.filter((t) => !t.resolved).map(tensionIdentity));
|
|
112
|
+
const openedSince = tensionsNow
|
|
113
|
+
.filter((t) => !thenIds.has(tensionIdentity(t)))
|
|
114
|
+
.map((t) => ({ title: t.title, date: t.date, kind: t.kind }));
|
|
115
|
+
const resolvedSince = tensionsNow
|
|
116
|
+
.filter((t) => t.resolved && thenUnresolvedIds.has(tensionIdentity(t)))
|
|
117
|
+
.map((t) => ({
|
|
118
|
+
title: t.title,
|
|
119
|
+
date: t.date,
|
|
120
|
+
kind: t.kind,
|
|
121
|
+
resolutionKind: t.resolution?.kind ?? "",
|
|
122
|
+
}));
|
|
123
|
+
return ok({
|
|
124
|
+
commit,
|
|
125
|
+
docCount: thenDocs.value.length,
|
|
126
|
+
byStatus: countBy(thenDocs.value, (d) => d.frontmatter.status),
|
|
127
|
+
byCollection: countBy(thenDocs.value, collectionOf),
|
|
128
|
+
drift: {
|
|
129
|
+
added,
|
|
130
|
+
removed,
|
|
131
|
+
transitions: computeTransitions(thenDocs.value, nowDocs.value),
|
|
132
|
+
bodiesChanged,
|
|
133
|
+
},
|
|
134
|
+
tensions: {
|
|
135
|
+
openThen: thenTensions.filter((t) => !t.resolved).length,
|
|
136
|
+
openNow: tensionsNow.filter((t) => !t.resolved).length,
|
|
137
|
+
openedSince,
|
|
138
|
+
resolvedSince,
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// "This fact turned out wrong — who had inherited it at the time, and where
|
|
143
|
+
// are they now?" Blast is computed over the tree AS OF the commit (the same
|
|
144
|
+
// source/link edge semantics as vault_tension_blast), then each downstream
|
|
145
|
+
// doc is annotated with its present-day status.
|
|
146
|
+
export async function counterfactualReplay(vaultRoot, commit, document) {
|
|
147
|
+
const thenDocs = await loadDocumentsAt(vaultRoot, commit.hash);
|
|
148
|
+
if (!thenDocs.ok)
|
|
149
|
+
return thenDocs;
|
|
150
|
+
if (!thenDocs.value.some((d) => d.path === document)) {
|
|
151
|
+
return err(new Error(`document not found in the vault at ${commit.hash.slice(0, 8)}: ${document}`));
|
|
152
|
+
}
|
|
153
|
+
const nowDocs = await loadDocuments(vaultRoot);
|
|
154
|
+
if (!nowDocs.ok)
|
|
155
|
+
return nowDocs;
|
|
156
|
+
const statusNowByPath = new Map(nowDocs.value.map((d) => [d.path, d.frontmatter.status]));
|
|
157
|
+
const blast = computeBlast({
|
|
158
|
+
seeds: [document],
|
|
159
|
+
reverseSource: buildReverseSourceMap(thenDocs.value),
|
|
160
|
+
reverseLink: buildReverseLinkMap(thenDocs.value),
|
|
161
|
+
});
|
|
162
|
+
const downstreamThen = blast.downstream.map((e) => ({
|
|
163
|
+
...e,
|
|
164
|
+
statusNow: statusNowByPath.get(e.path) ?? "gone",
|
|
165
|
+
}));
|
|
166
|
+
return ok({
|
|
167
|
+
document,
|
|
168
|
+
downstreamThen,
|
|
169
|
+
primaryBlast: blast.primary_blast,
|
|
170
|
+
advisoryBlast: blast.advisory_blast,
|
|
171
|
+
maxDepth: blast.max_depth,
|
|
172
|
+
stillCanonicalNow: downstreamThen.filter((e) => e.statusNow === "canonical").length,
|
|
173
|
+
goneNow: downstreamThen.filter((e) => e.statusNow === "gone").length,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
function docState(d) {
|
|
177
|
+
return {
|
|
178
|
+
title: d.frontmatter.title,
|
|
179
|
+
status: d.frontmatter.status,
|
|
180
|
+
confidence: d.frontmatter.confidence,
|
|
181
|
+
updated: d.frontmatter.updated,
|
|
182
|
+
provenance: d.frontmatter.provenance,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
export async function docTrajectory(vaultRoot, commit, path) {
|
|
186
|
+
const thenDocs = await loadDocumentsAt(vaultRoot, commit.hash);
|
|
187
|
+
if (!thenDocs.ok)
|
|
188
|
+
return thenDocs;
|
|
189
|
+
const nowDocs = await loadDocuments(vaultRoot);
|
|
190
|
+
if (!nowDocs.ok)
|
|
191
|
+
return nowDocs;
|
|
192
|
+
const thenDoc = thenDocs.value.find((d) => d.path === path) ?? null;
|
|
193
|
+
const nowDoc = nowDocs.value.find((d) => d.path === path) ?? null;
|
|
194
|
+
if (!thenDoc && !nowDoc) {
|
|
195
|
+
return err(new Error(`document not found then or now: ${path}`));
|
|
196
|
+
}
|
|
197
|
+
const commits = await logRangeForPath(vaultRoot, commit.hash, path);
|
|
198
|
+
if (!commits.ok)
|
|
199
|
+
return commits;
|
|
200
|
+
return ok({
|
|
201
|
+
path,
|
|
202
|
+
asOf: thenDoc ? docState(thenDoc) : null,
|
|
203
|
+
current: nowDoc ? docState(nowDoc) : null,
|
|
204
|
+
commitsBetween: commits.value,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/asof/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/backfill/apply.js
CHANGED
|
@@ -78,7 +78,7 @@ export async function applyPlan(vaultRoot, scope, agent) {
|
|
|
78
78
|
skipped.push({ path: entry.path, reason: resolved.error.message });
|
|
79
79
|
continue;
|
|
80
80
|
}
|
|
81
|
-
const existing = await readFile(resolved.value);
|
|
81
|
+
const existing = await readFile(resolved.value.absPath);
|
|
82
82
|
if (!existing.ok) {
|
|
83
83
|
skipped.push({ path: entry.path, reason: existing.error.message });
|
|
84
84
|
continue;
|
|
@@ -94,7 +94,7 @@ export async function applyPlan(vaultRoot, scope, agent) {
|
|
|
94
94
|
continue;
|
|
95
95
|
}
|
|
96
96
|
try {
|
|
97
|
-
await writeFile(resolved.value, rendered.value, "utf-8");
|
|
97
|
+
await writeFile(resolved.value.absPath, rendered.value, "utf-8");
|
|
98
98
|
}
|
|
99
99
|
catch (e) {
|
|
100
100
|
const reason = e instanceof Error ? e.message : String(e);
|