daftari 1.14.0 → 1.16.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 +65 -0
- package/README.md +8 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/curation/lint.d.ts +16 -1
- package/dist/curation/lint.d.ts.map +1 -1
- package/dist/curation/lint.js +91 -78
- package/dist/curation/lint.js.map +1 -1
- package/dist/curation/tension-blast.d.ts +37 -0
- package/dist/curation/tension-blast.d.ts.map +1 -0
- package/dist/curation/tension-blast.js +223 -0
- package/dist/curation/tension-blast.js.map +1 -0
- package/dist/curation/tension-clusters.d.ts +18 -0
- package/dist/curation/tension-clusters.d.ts.map +1 -0
- package/dist/curation/tension-clusters.js +157 -0
- package/dist/curation/tension-clusters.js.map +1 -0
- package/dist/curation/tension.d.ts +4 -0
- package/dist/curation/tension.d.ts.map +1 -1
- package/dist/curation/tension.js +54 -0
- package/dist/curation/tension.js.map +1 -1
- package/dist/curation/vault-docs.d.ts +14 -0
- package/dist/curation/vault-docs.d.ts.map +1 -0
- package/dist/curation/vault-docs.js +90 -0
- package/dist/curation/vault-docs.js.map +1 -0
- package/dist/eval/generate.d.ts +12 -0
- package/dist/eval/generate.d.ts.map +1 -0
- package/dist/eval/generate.js +221 -0
- package/dist/eval/generate.js.map +1 -0
- package/dist/eval/index.d.ts +2 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +311 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/llm.d.ts +47 -0
- package/dist/eval/llm.d.ts.map +1 -0
- package/dist/eval/llm.js +165 -0
- package/dist/eval/llm.js.map +1 -0
- package/dist/eval/prompts.d.ts +5 -0
- package/dist/eval/prompts.d.ts.map +1 -0
- package/dist/eval/prompts.js +44 -0
- package/dist/eval/prompts.js.map +1 -0
- package/dist/eval/run.d.ts +13 -0
- package/dist/eval/run.d.ts.map +1 -0
- package/dist/eval/run.js +78 -0
- package/dist/eval/run.js.map +1 -0
- package/dist/eval/score.d.ts +12 -0
- package/dist/eval/score.d.ts.map +1 -0
- package/dist/eval/score.js +154 -0
- package/dist/eval/score.js.map +1 -0
- package/dist/eval/storage.d.ts +10 -0
- package/dist/eval/storage.d.ts.map +1 -0
- package/dist/eval/storage.js +69 -0
- package/dist/eval/storage.js.map +1 -0
- package/dist/eval/subgraph.d.ts +17 -0
- package/dist/eval/subgraph.d.ts.map +1 -0
- package/dist/eval/subgraph.js +214 -0
- package/dist/eval/subgraph.js.map +1 -0
- package/dist/eval/tool-surface.d.ts +7 -0
- package/dist/eval/tool-surface.d.ts.map +1 -0
- package/dist/eval/tool-surface.js +160 -0
- package/dist/eval/tool-surface.js.map +1 -0
- package/dist/eval/types.d.ts +173 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +44 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/tools/curation.d.ts +4 -0
- package/dist/tools/curation.d.ts.map +1 -1
- package/dist/tools/curation.js +101 -0
- package/dist/tools/curation.js.map +1 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,71 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.16.0] - 2026-06-02
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`daftari eval` cortex quality metric** (Sleep Component B). New CLI
|
|
15
|
+
subcommand that scores how well an LLM can use the Daftari MCP curation
|
|
16
|
+
surface to answer multi-hop questions about the vault. Three tiers
|
|
17
|
+
(retrieval, cross-reference, contradiction) with a tier-weighted aggregate
|
|
18
|
+
(1×/2×/3×) plus per-tier variance and trace-efficiency. The pipeline is
|
|
19
|
+
seeded subgraph sampling → LLM question generation (with tier-mix top-up
|
|
20
|
+
and tension-graph augmentation) → in-process answerer over the existing
|
|
21
|
+
read-only tool surface → LLM grading. Runs persist incrementally, so a
|
|
22
|
+
failed run is resumable with `--resume`. Generator/answerer/grader are all
|
|
23
|
+
LLM-mediated via `@anthropic-ai/sdk` (new dependency, isolated to
|
|
24
|
+
`src/eval/llm.ts`); the rest of the codebase stays LLM-free. Output
|
|
25
|
+
artifacts live under `.daftari/eval/` (gitignored). Components A (multi-pass
|
|
26
|
+
curation) and C (dependency-triggered re-curation) are deferred to
|
|
27
|
+
follow-on specs. See
|
|
28
|
+
[docs/superpowers/specs/2026-05-31-cortex-quality-metric-design.md](docs/superpowers/specs/2026-05-31-cortex-quality-metric-design.md).
|
|
29
|
+
|
|
30
|
+
## [1.15.0] - 2026-05-31
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- **Blast radius of stale tensions** (Step 5 of the Tension Graph plan,
|
|
35
|
+
cross-feature integration). `vault_lint`'s tension health surface now
|
|
36
|
+
reports `blastRadiusOfStaleTensions`: the cardinality of the
|
|
37
|
+
deduplicated `primary_blast` set (sources channel only — the same
|
|
38
|
+
primary set `vault_tension_blast` returns) over the union of contested
|
|
39
|
+
docs from every entry where `resolved: false` AND
|
|
40
|
+
`agingTier === "stale"`. Renders as "Blast radius of stale tensions: N
|
|
41
|
+
downstream documents". When there are no stale unresolved tensions the
|
|
42
|
+
metric is 0; the line always renders for consistency with the rest of
|
|
43
|
+
the tension health section. Reuses `computeBlast` from
|
|
44
|
+
`tension-blast.ts` — advisory link edges still participate in BFS
|
|
45
|
+
traversal, but the published metric stays disciplined to the primary
|
|
46
|
+
channel.
|
|
47
|
+
|
|
48
|
+
- **Tension blast radius** (Phase 3 of the Tension Graph plan). New
|
|
49
|
+
`vault_tension_blast` tool computes the transitive closure of
|
|
50
|
+
downstream documents that cite or link a contested document — or the
|
|
51
|
+
union over a contested cluster. Accepts exactly one of `document` or
|
|
52
|
+
`cluster_id`. Two confidence channels: `primary_blast` (via `sources`
|
|
53
|
+
frontmatter) is authoritative; `advisory_blast` (via in-vault markdown
|
|
54
|
+
links) is suggestive. `superseded_by` is not a blast edge — the doc
|
|
55
|
+
that supersedes a contested doc is the replacement, not an inheritor.
|
|
56
|
+
|
|
57
|
+
- **Tension clusters** (Phase 2 of the Tension Graph plan). New
|
|
58
|
+
`vault_tension_clusters` tool computes connected components of the
|
|
59
|
+
tension graph over unresolved, non-accepted tensions. Cluster IDs are
|
|
60
|
+
content-addressed (`cluster:` + first 8 hex chars of sha256 of
|
|
61
|
+
canonical-sorted member paths) — stable across runs for unchanged
|
|
62
|
+
membership; a different ID encodes a different membership. `vault_lint`
|
|
63
|
+
reports cluster count, max size, and flags clusters that are large
|
|
64
|
+
(>5 docs, smell) or aged (oldest tension >90 days, tech debt).
|
|
65
|
+
|
|
66
|
+
- **Tension aging tiers** (Phase 4 of the Tension Graph plan). Tensions
|
|
67
|
+
in the tension log now report aging tiers (Fresh 0–30d / Aging 31–90d
|
|
68
|
+
/ Stale 90+d) in `vault_lint`, with kind-specific lint copy at the
|
|
69
|
+
stale tier. Unspecified tensions and tensions resolved with kind
|
|
70
|
+
`accepted` are excluded from the aging pipeline — the former because
|
|
71
|
+
they predate classification, the latter because explicitly accepted
|
|
72
|
+
persistent disagreements are stable epistemic features rather than
|
|
73
|
+
debt.
|
|
74
|
+
|
|
10
75
|
## [1.14.0] - 2026-05-31
|
|
11
76
|
|
|
12
77
|
### Added
|
package/README.md
CHANGED
|
@@ -23,8 +23,9 @@ session ends.
|
|
|
23
23
|
|
|
24
24
|
Daftari takes the other path: **compilation over retrieval.** The agent
|
|
25
25
|
synthesizes an answer once, writes it back as a durable document, and every
|
|
26
|
-
later read starts from that compiled result. The
|
|
27
|
-
is
|
|
26
|
+
later read starts from that compiled result. The compiler is the agent;
|
|
27
|
+
Daftari is the substrate that catches and persists what the agent
|
|
28
|
+
consolidates. The vault gets better the more it is used.
|
|
28
29
|
|
|
29
30
|
A human cortex doesn’t re-derive everything from sensory input each time it
|
|
30
31
|
thinks. It consolidates: experiences become memories, memories become
|
|
@@ -72,6 +73,11 @@ The curation engine is advisory: `vault_lint` reports problems and
|
|
|
72
73
|
`vault_tension_log` records contradictions. Neither auto-fixes anything. Every
|
|
73
74
|
change is a deliberate, attributable act.
|
|
74
75
|
|
|
76
|
+
**Evaluate (opt-in, requires an Anthropic API key):** `daftari eval` — scores how
|
|
77
|
+
well an LLM can use the curation surface to answer multi-hop questions about the
|
|
78
|
+
vault. See the [design spec](docs/superpowers/specs/2026-05-31-cortex-quality-metric-design.md)
|
|
79
|
+
for the rationale and the cortex framing.
|
|
80
|
+
|
|
75
81
|
## Two kinds of knowledge
|
|
76
82
|
|
|
77
83
|
Every document declares a `domain`. The distinction drives how the curation
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA8KA,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8DnE;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvD"}
|
package/dist/cli.js
CHANGED
|
@@ -21,6 +21,7 @@ Usage:
|
|
|
21
21
|
daftari --init [path] Scaffold a new vault (default: ./daftari-vault)
|
|
22
22
|
daftari --vault <path> [options] Start the MCP server (stdio) against a vault
|
|
23
23
|
daftari audit [options] Run a cross-repo coherence audit (see: daftari audit --help)
|
|
24
|
+
daftari eval [options] Cortex quality metric (see: daftari eval --help)
|
|
24
25
|
|
|
25
26
|
Server options:
|
|
26
27
|
--user <username> Identity the server runs as (default: guest)
|
|
@@ -206,6 +207,11 @@ export async function run(argv) {
|
|
|
206
207
|
process.exitCode = await runAudit(argv.slice(1));
|
|
207
208
|
return;
|
|
208
209
|
}
|
|
210
|
+
if (argv[0] === "eval") {
|
|
211
|
+
const { runEval } = await import("./eval/index.js");
|
|
212
|
+
process.exitCode = await runEval(argv.slice(1));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
209
215
|
if (argv.includes("--help") || argv.includes("-h")) {
|
|
210
216
|
process.stdout.write(USAGE);
|
|
211
217
|
return;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,eAAe;AACf,EAAE;AACF,0DAA0D;AAC1D,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,+BAA+B;AAE/B,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErD,MAAM,KAAK,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,eAAe;AACf,EAAE;AACF,0DAA0D;AAC1D,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,+BAA+B;AAE/B,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErD,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;CAiBb,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAE5E,MAAM,eAAe,GAAG;;;;;;;;;;;;;CAavB,CAAC;AAEF,0EAA0E;AAC1E,qDAAqD;AACrD,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO;QACL;YACE,IAAI,EAAE,gDAAgD;YACtD,IAAI,EAAE;;;;;;WAMD,KAAK;WACL,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;CAyBf;SACI;QACD;YACE,IAAI,EAAE,uCAAuC;YAC7C,IAAI,EAAE;;;;;;WAMD,KAAK;WACL,KAAK;;;;;;;;;;;;;;;;;;;;;;;;CAwBf;SACI;QACD;YACE,IAAI,EAAE,mCAAmC;YACzC,IAAI,EAAE;;;;;;WAMD,KAAK;WACL,KAAK;;;;;;;;;;;;;;;;;;;;;;CAsBf;SACI;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtC,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,SAAS,4BAA4B,CAAC,CAAC;QAC/F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,oEAAoE;IACpE,4BAA4B;IAC5B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;IACxF,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEpE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,eAAe,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,0EAA0E;IAC1E,yBAAyB;IACzB,MAAM,SAAS,GAAG,MAAM,MAAM,CAC5B,SAAS,EACT,CAAC,GAAG,CAAC,EACL,0BAA0B,EAC1B,oBAAoB,CACrB,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oDAAoD,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,CAChF,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oBAAoB,OAAO,CAAC,KAAK,CAAC,aAAa,QAAQ;YACrD,YAAY,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAC9D,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iDAAiD,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,CAC3E,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC,SAAS,MAAM;QAClD,kBAAkB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC5C,uCAAuC;QACvC,yCAAyC;QACzC,SAAS;QACT,yBAAyB,UAAU,2BAA2B,CACjE,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACtD,OAAO,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,iBAAiB,CAAC;QAC5D,OAAO,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC5E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,2EAA2E;AAC3E,0EAA0E;AAC1E,EAAE;AACF,gFAAgF;AAChF,6EAA6E;AAC7E,0EAA0E;AAC1E,2EAA2E;AAC3E,qDAAqD;AACrD,SAAS,mBAAmB;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,mBAAmB,EAAE,EAAE,CAAC;IAC1B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,IAAI,CAAC,CAAC;QACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/curation/lint.d.ts
CHANGED
|
@@ -6,6 +6,19 @@ export interface LintFinding {
|
|
|
6
6
|
path: string;
|
|
7
7
|
detail: string;
|
|
8
8
|
}
|
|
9
|
+
export interface TensionAging {
|
|
10
|
+
fresh: number;
|
|
11
|
+
aging: number;
|
|
12
|
+
stale: number;
|
|
13
|
+
staleByKind: Record<TensionKind, number>;
|
|
14
|
+
staleMessages: Partial<Record<Exclude<TensionKind, "unspecified">, string>>;
|
|
15
|
+
}
|
|
16
|
+
export interface TensionClustersHealth {
|
|
17
|
+
count: number;
|
|
18
|
+
maxSize: number;
|
|
19
|
+
large: number;
|
|
20
|
+
aged: number;
|
|
21
|
+
}
|
|
9
22
|
export interface TensionHealth {
|
|
10
23
|
total: number;
|
|
11
24
|
byKind: Record<TensionKind, number>;
|
|
@@ -13,6 +26,9 @@ export interface TensionHealth {
|
|
|
13
26
|
byResolutionKind: Record<ResolutionKind, number>;
|
|
14
27
|
stableAcknowledged: number;
|
|
15
28
|
unspecifiedLegacy: number;
|
|
29
|
+
aging: TensionAging;
|
|
30
|
+
clusters: TensionClustersHealth;
|
|
31
|
+
blastRadiusOfStaleTensions: number;
|
|
16
32
|
}
|
|
17
33
|
export interface LintReport {
|
|
18
34
|
generatedAt: string;
|
|
@@ -25,6 +41,5 @@ export interface LintOptions {
|
|
|
25
41
|
draftMaxDays?: number;
|
|
26
42
|
lowConfidenceMaxDays?: number;
|
|
27
43
|
}
|
|
28
|
-
export declare function extractLinks(content: string): string[];
|
|
29
44
|
export declare function runLint(vaultRoot: string, opts?: LintOptions): Promise<Result<LintReport, Error>>;
|
|
30
45
|
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/curation/lint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/curation/lint.ts"],"names":[],"mappings":"AAOA,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAIL,KAAK,cAAc,EAGnB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAWtB,eAAO,MAAM,WAAW,8HAOd,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAyBD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7E;AAOD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACjD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,qBAAqB,CAAC;IAMhC,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AA8BD,wBAAsB,OAAO,CAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAqHpC"}
|
package/dist/curation/lint.js
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
// runs six checks. It only ever *reports*: no file is edited, no status is
|
|
5
5
|
// changed, nothing is auto-fixed. The output is a structured report grouped by
|
|
6
6
|
// check, for a human (or an agent acting on a human's behalf) to triage.
|
|
7
|
-
import { posix } from "node:path";
|
|
8
|
-
import { parseDocument } from "../frontmatter/parser.js";
|
|
9
7
|
import { ok } from "../frontmatter/types.js";
|
|
10
|
-
import { listFiles, readFile, resolveVaultPath } from "../storage/local.js";
|
|
11
8
|
import { DRAFT_MAX_DAYS, LOW_CONFIDENCE_MAX_DAYS } from "./decay.js";
|
|
12
9
|
import { ageInDays, computeStaleness } from "./staleness.js";
|
|
13
|
-
import { listTensions, RESOLUTION_KINDS, TENSION_KINDS, } from "./tension.js";
|
|
10
|
+
import { agingTier, listTensions, RESOLUTION_KINDS, STALE_TIER_LINT_COPY, TENSION_KINDS, } from "./tension.js";
|
|
11
|
+
import { buildReverseLinkMap, buildReverseSourceMap, computeBlast } from "./tension-blast.js";
|
|
12
|
+
import { computeTensionClusters } from "./tension-clusters.js";
|
|
13
|
+
import { buildPathIndexes, extractLinks, loadDocuments, resolveLink, } from "./vault-docs.js";
|
|
14
14
|
export const LINT_CHECKS = [
|
|
15
15
|
"staleFiles",
|
|
16
16
|
"orphanFiles",
|
|
@@ -19,45 +19,6 @@ export const LINT_CHECKS = [
|
|
|
19
19
|
"deprecatedStillLinked",
|
|
20
20
|
"unansweredQuestions",
|
|
21
21
|
];
|
|
22
|
-
// --- link extraction ------------------------------------------------------
|
|
23
|
-
// Pulls every internal link target out of a markdown body: both [[wikilinks]]
|
|
24
|
-
// and [text](target) markdown links. External URLs and anchors are dropped.
|
|
25
|
-
export function extractLinks(content) {
|
|
26
|
-
const targets = [];
|
|
27
|
-
for (const m of content.matchAll(/\[\[([^\]]+)\]\]/g)) {
|
|
28
|
-
// A wikilink may carry a |display alias and/or a #heading anchor.
|
|
29
|
-
const raw = m[1].split("|")[0]?.split("#")[0]?.trim();
|
|
30
|
-
if (raw)
|
|
31
|
-
targets.push(raw);
|
|
32
|
-
}
|
|
33
|
-
for (const m of content.matchAll(/\[[^\]]*\]\(([^)\s]+)\)/g)) {
|
|
34
|
-
const raw = m[1].split("#")[0]?.trim();
|
|
35
|
-
if (!raw)
|
|
36
|
-
continue;
|
|
37
|
-
if (/^(https?:|mailto:|#)/i.test(raw))
|
|
38
|
-
continue;
|
|
39
|
-
targets.push(raw);
|
|
40
|
-
}
|
|
41
|
-
return targets;
|
|
42
|
-
}
|
|
43
|
-
// Resolves a raw link target to a vault-relative path, or null if it points
|
|
44
|
-
// nowhere. Tries, in order: the target as-is, with a .md suffix, resolved
|
|
45
|
-
// relative to the linking file's directory, then a bare basename match (the
|
|
46
|
-
// common [[note-name]] wikilink form).
|
|
47
|
-
function resolveLink(rawTarget, fromPath, byPath, byBasename) {
|
|
48
|
-
const withMd = (p) => (p.endsWith(".md") ? p : `${p}.md`);
|
|
49
|
-
if (byPath.has(rawTarget))
|
|
50
|
-
return rawTarget;
|
|
51
|
-
if (byPath.has(withMd(rawTarget)))
|
|
52
|
-
return withMd(rawTarget);
|
|
53
|
-
const relual = posix.normalize(posix.join(posix.dirname(fromPath), rawTarget));
|
|
54
|
-
if (byPath.has(relual))
|
|
55
|
-
return relual;
|
|
56
|
-
if (byPath.has(withMd(relual)))
|
|
57
|
-
return withMd(relual);
|
|
58
|
-
const base = posix.basename(rawTarget).replace(/\.md$/, "");
|
|
59
|
-
return byBasename.get(base) ?? null;
|
|
60
|
-
}
|
|
61
22
|
// --- question matching ----------------------------------------------------
|
|
62
23
|
// Normalizes a question for cross-document matching: trimmed, lower-cased,
|
|
63
24
|
// internal whitespace collapsed. Exact (normalized) equality is the matching
|
|
@@ -66,39 +27,9 @@ function normalizeQuestion(q) {
|
|
|
66
27
|
return q.trim().toLowerCase().replace(/\s+/g, " ");
|
|
67
28
|
}
|
|
68
29
|
// --- check orchestration --------------------------------------------------
|
|
69
|
-
async function loadDocuments(vaultRoot) {
|
|
70
|
-
const list = await listFiles(vaultRoot);
|
|
71
|
-
if (!list.ok)
|
|
72
|
-
return list;
|
|
73
|
-
const docs = [];
|
|
74
|
-
for (const relPath of list.value) {
|
|
75
|
-
const resolved = resolveVaultPath(vaultRoot, relPath);
|
|
76
|
-
if (!resolved.ok)
|
|
77
|
-
continue;
|
|
78
|
-
const file = await readFile(resolved.value);
|
|
79
|
-
if (!file.ok)
|
|
80
|
-
continue;
|
|
81
|
-
const parsed = parseDocument(file.value);
|
|
82
|
-
if (!parsed.ok)
|
|
83
|
-
continue;
|
|
84
|
-
docs.push({
|
|
85
|
-
path: relPath,
|
|
86
|
-
frontmatter: parsed.value.frontmatter,
|
|
87
|
-
content: parsed.value.content,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
return ok(docs);
|
|
91
|
-
}
|
|
92
30
|
// Maps each document to the set of documents that link to it.
|
|
93
31
|
function buildInboundMap(docs) {
|
|
94
|
-
const byPath =
|
|
95
|
-
const byBasename = new Map();
|
|
96
|
-
for (const d of docs) {
|
|
97
|
-
const base = posix.basename(d.path).replace(/\.md$/, "");
|
|
98
|
-
// First write wins, so a basename collision resolves deterministically.
|
|
99
|
-
if (!byBasename.has(base))
|
|
100
|
-
byBasename.set(base, d.path);
|
|
101
|
-
}
|
|
32
|
+
const { byPath, byBasename } = buildPathIndexes(docs);
|
|
102
33
|
const inbound = new Map();
|
|
103
34
|
for (const d of docs) {
|
|
104
35
|
for (const raw of extractLinks(d.content)) {
|
|
@@ -206,7 +137,7 @@ export async function runLint(vaultRoot, opts = {}) {
|
|
|
206
137
|
}
|
|
207
138
|
}
|
|
208
139
|
const totalFindings = LINT_CHECKS.reduce((n, name) => n + checks[name].length, 0);
|
|
209
|
-
const tensionHealth = await computeTensionHealth(vaultRoot);
|
|
140
|
+
const tensionHealth = await computeTensionHealth(vaultRoot, docs, now);
|
|
210
141
|
if (!tensionHealth.ok)
|
|
211
142
|
return tensionHealth;
|
|
212
143
|
return ok({
|
|
@@ -216,18 +147,29 @@ export async function runLint(vaultRoot, opts = {}) {
|
|
|
216
147
|
tensionHealth: tensionHealth.value,
|
|
217
148
|
});
|
|
218
149
|
}
|
|
219
|
-
// Aggregates the tension log into the Phase 1 health summary
|
|
220
|
-
// is not an error — every counter is
|
|
221
|
-
|
|
150
|
+
// Aggregates the tension log into the Phase 1 health summary plus the Phase 4
|
|
151
|
+
// aging breakdown. A missing log is not an error — every counter is zero.
|
|
152
|
+
//
|
|
153
|
+
// Aging scope: tiers are counted over the active surface only. An entry
|
|
154
|
+
// contributes to fresh / aging / stale iff it is unresolved AND `agingTier`
|
|
155
|
+
// returns a non-null tier (which already excludes `unspecified`). Resolved
|
|
156
|
+
// entries — including `resolution.kind: accepted` — do not appear in any
|
|
157
|
+
// aging tier; they show up in the Phase 1 stable-acknowledged and resolved
|
|
158
|
+
// totals instead.
|
|
159
|
+
async function computeTensionHealth(vaultRoot, docs, now) {
|
|
222
160
|
const tensions = await listTensions(vaultRoot);
|
|
223
161
|
if (!tensions.ok)
|
|
224
162
|
return tensions;
|
|
225
163
|
const byKind = Object.fromEntries(TENSION_KINDS.map((k) => [k, 0]));
|
|
226
164
|
const byResolutionKind = Object.fromEntries(RESOLUTION_KINDS.map((k) => [k, 0]));
|
|
165
|
+
const staleByKind = Object.fromEntries(TENSION_KINDS.map((k) => [k, 0]));
|
|
227
166
|
let total = 0;
|
|
228
167
|
let resolvedLifetime = 0;
|
|
229
168
|
let stableAcknowledged = 0;
|
|
230
169
|
let unspecifiedLegacy = 0;
|
|
170
|
+
let fresh = 0;
|
|
171
|
+
let aging = 0;
|
|
172
|
+
let stale = 0;
|
|
231
173
|
for (const t of tensions.value) {
|
|
232
174
|
total += 1;
|
|
233
175
|
byKind[t.kind] += 1;
|
|
@@ -239,7 +181,75 @@ async function computeTensionHealth(vaultRoot) {
|
|
|
239
181
|
if (t.resolution.kind === "accepted")
|
|
240
182
|
stableAcknowledged += 1;
|
|
241
183
|
}
|
|
184
|
+
if (t.resolved)
|
|
185
|
+
continue;
|
|
186
|
+
const tier = agingTier(t, now);
|
|
187
|
+
if (tier === "fresh")
|
|
188
|
+
fresh += 1;
|
|
189
|
+
else if (tier === "aging")
|
|
190
|
+
aging += 1;
|
|
191
|
+
else if (tier === "stale") {
|
|
192
|
+
stale += 1;
|
|
193
|
+
staleByKind[t.kind] += 1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Render kind-specific stale-tier copy only for kinds with a nonzero count.
|
|
197
|
+
// `unspecified` never produces a message even if the count somehow appears
|
|
198
|
+
// (it can't, since unspecified entries get tier null — defense in depth).
|
|
199
|
+
const staleMessages = {};
|
|
200
|
+
for (const kind of ["temporal", "factual", "interpretive"]) {
|
|
201
|
+
if (staleByKind[kind] > 0) {
|
|
202
|
+
staleMessages[kind] = STALE_TIER_LINT_COPY[kind];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Cluster surface (Phase 2). computeTensionClusters applies the same scope
|
|
206
|
+
// filter the cluster tool does — unresolved AND non-accepted — so the lint
|
|
207
|
+
// metrics line up exactly with what `vault_tension_clusters` reports.
|
|
208
|
+
const clusterResult = computeTensionClusters(tensions.value, now);
|
|
209
|
+
let maxSize = 0;
|
|
210
|
+
let large = 0;
|
|
211
|
+
let aged = 0;
|
|
212
|
+
for (const c of clusterResult.clusters) {
|
|
213
|
+
if (c.size > maxSize)
|
|
214
|
+
maxSize = c.size;
|
|
215
|
+
if (c.size > 5)
|
|
216
|
+
large += 1;
|
|
217
|
+
if (c.oldest_tension_age_days > 90)
|
|
218
|
+
aged += 1;
|
|
242
219
|
}
|
|
220
|
+
const clusters = {
|
|
221
|
+
count: clusterResult.cluster_count,
|
|
222
|
+
maxSize,
|
|
223
|
+
large,
|
|
224
|
+
aged,
|
|
225
|
+
};
|
|
226
|
+
// Step 5 of the tension graph plan (2026-05-31). Collect every contested
|
|
227
|
+
// doc from every entry where `resolved: false` AND `agingTier === "stale"`,
|
|
228
|
+
// then reuse computeBlast to walk the dependency graph from that union as
|
|
229
|
+
// seeds. We report the count of the `primary_blast` channel — the same
|
|
230
|
+
// sources-only primary set that vault_tension_blast returns. Advisory link
|
|
231
|
+
// edges still participate in BFS traversal (so a doc reached via a link
|
|
232
|
+
// edge can still gain `source` classification from a separate incoming
|
|
233
|
+
// source edge), but the published metric is the primary count only — the
|
|
234
|
+
// top-level lint metric stays disciplined against advisory inflation.
|
|
235
|
+
const staleSeeds = new Set();
|
|
236
|
+
for (const t of tensions.value) {
|
|
237
|
+
if (t.resolved)
|
|
238
|
+
continue;
|
|
239
|
+
if (agingTier(t, now) !== "stale")
|
|
240
|
+
continue;
|
|
241
|
+
if (t.sourceA)
|
|
242
|
+
staleSeeds.add(t.sourceA);
|
|
243
|
+
if (t.sourceB)
|
|
244
|
+
staleSeeds.add(t.sourceB);
|
|
245
|
+
}
|
|
246
|
+
const reverseSource = buildReverseSourceMap(docs);
|
|
247
|
+
const reverseLink = buildReverseLinkMap(docs);
|
|
248
|
+
const blast = computeBlast({
|
|
249
|
+
seeds: [...staleSeeds],
|
|
250
|
+
reverseSource,
|
|
251
|
+
reverseLink,
|
|
252
|
+
});
|
|
243
253
|
return ok({
|
|
244
254
|
total,
|
|
245
255
|
byKind,
|
|
@@ -247,6 +257,9 @@ async function computeTensionHealth(vaultRoot) {
|
|
|
247
257
|
byResolutionKind,
|
|
248
258
|
stableAcknowledged,
|
|
249
259
|
unspecifiedLegacy,
|
|
260
|
+
aging: { fresh, aging, stale, staleByKind, staleMessages },
|
|
261
|
+
clusters,
|
|
262
|
+
blastRadiusOfStaleTensions: blast.primary_blast,
|
|
250
263
|
});
|
|
251
264
|
}
|
|
252
265
|
//# sourceMappingURL=lint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/curation/lint.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,yEAAyE;AAEzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/curation/lint.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,yEAAyE;AAEzE,OAAO,EAAE,EAAE,EAAe,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,SAAS,EACT,YAAY,EACZ,gBAAgB,EAEhB,oBAAoB,EACpB,aAAa,GAEd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,gBAAgB,EAChB,YAAY,EAEZ,aAAa,EACb,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY;IACZ,aAAa;IACb,WAAW;IACX,uBAAuB;IACvB,uBAAuB;IACvB,qBAAqB;CACb,CAAC;AAiFX,6EAA6E;AAE7E,2EAA2E;AAC3E,6EAA6E;AAC7E,qEAAqE;AACrE,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,6EAA6E;AAE7E,8DAA8D;AAC9D,SAAS,eAAe,CAAC,IAAiB;IACxC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI;gBAAE,SAAS;YAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,SAAiB,EACjB,OAAoB,EAAE;IAEtB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;IAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,cAAc,CAAC;IACzD,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,uBAAuB,CAAC;IAClF,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,0EAA0E;IAC1E,4EAA4E;IAC5E,sDAAsD;IACtD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC;gBAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAyC;QACnD,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,EAAE;QACb,qBAAqB,EAAE,EAAE;QACzB,qBAAqB,EAAE,EAAE;QACzB,mBAAmB,EAAE,EAAE;KACxB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC;QAE3B,2CAA2C;QAC3C,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;QACxF,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBACrB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EACJ,GAAG,SAAS,CAAC,OAAO,uBAAuB,SAAS,CAAC,OAAO,IAAI;oBAChE,gBAAgB,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;aAChD,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;gBACtB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,0CAA0C;aACnD,CAAC,CAAC;QACL,CAAC;QAED,6DAA6D;QAC7D,IAAI,EAAE,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC;YACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACxC,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;gBAC5B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,aAAa,QAAQ,YAAY,YAAY,IAAI;iBAC1D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,IAAI,EAAE,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5C,IAAI,QAAQ,IAAI,oBAAoB,EAAE,CAAC;gBACrC,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC;oBAChC,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EACJ,iCAAiC,QAAQ,IAAI,GAAG,UAAU,oBAAoB,IAAI;iBACrF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,IAAI,EAAE,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CACvD,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,KAAK,WAAW,CAC/D,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC;oBAChC,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,gCAAgC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACpE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,2EAA2E;QAC3E,MAAM,eAAe,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACvD,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC;gBAC9B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EACJ,GAAG,eAAe,CAAC,MAAM,0CAA0C;oBACnE,iBAAiB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAElF,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACvE,IAAI,CAAC,aAAa,CAAC,EAAE;QAAE,OAAO,aAAa,CAAC;IAE5C,OAAO,EAAE,CAAC;QACR,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;QAC9B,MAAM;QACN,aAAa;QACb,aAAa,EAAE,aAAa,CAAC,KAAK;KACnC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,EAAE;AACF,wEAAwE;AACxE,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,kBAAkB;AAClB,KAAK,UAAU,oBAAoB,CACjC,SAAiB,EACjB,IAAiB,EACjB,GAAS;IAET,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAElC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAGjE,CAAC;IACF,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAG9E,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAGtE,CAAC;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa;YAAE,iBAAiB,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACjB,gBAAgB,IAAI,CAAC,CAAC;YACtB,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,UAAU;gBAAE,kBAAkB,IAAI,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,CAAC,QAAQ;YAAE,SAAS;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,OAAO;YAAE,KAAK,IAAI,CAAC,CAAC;aAC5B,IAAI,IAAI,KAAK,OAAO;YAAE,KAAK,IAAI,CAAC,CAAC;aACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC;YACX,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,aAAa,GAAiE,EAAE,CAAC;IACvF,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc,CAAU,EAAE,CAAC;QACpE,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,aAAa,GAAG,sBAAsB,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,GAAG,OAAO;YAAE,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,uBAAuB,GAAG,EAAE;YAAE,IAAI,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAA0B;QACtC,KAAK,EAAE,aAAa,CAAC,aAAa;QAClC,OAAO;QACP,KAAK;QACL,IAAI;KACL,CAAC;IAEF,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,uEAAuE;IACvE,2EAA2E;IAC3E,wEAAwE;IACxE,uEAAuE;IACvE,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,QAAQ;YAAE,SAAS;QACzB,IAAI,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,OAAO;YAAE,SAAS;QAC5C,IAAI,CAAC,CAAC,OAAO;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,CAAC,OAAO;YAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC;QACzB,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC;QACtB,aAAa;QACb,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC;QACR,KAAK;QACL,MAAM;QACN,gBAAgB;QAChB,gBAAgB;QAChB,kBAAkB;QAClB,iBAAiB;QACjB,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE;QAC1D,QAAQ;QACR,0BAA0B,EAAE,KAAK,CAAC,aAAa;KAChD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type Result } from "../frontmatter/types.js";
|
|
2
|
+
import { type LoadedDoc } from "./vault-docs.js";
|
|
3
|
+
export type BlastDependencyType = "source" | "link";
|
|
4
|
+
export interface BlastDownstreamEntry {
|
|
5
|
+
path: string;
|
|
6
|
+
dependency_type: BlastDependencyType;
|
|
7
|
+
distance: number;
|
|
8
|
+
}
|
|
9
|
+
export interface TensionBlastResult {
|
|
10
|
+
contested_document: string | null;
|
|
11
|
+
cluster_id: string | null;
|
|
12
|
+
cluster_documents: string[];
|
|
13
|
+
downstream: BlastDownstreamEntry[];
|
|
14
|
+
primary_blast: number;
|
|
15
|
+
advisory_blast: number;
|
|
16
|
+
max_depth: number;
|
|
17
|
+
}
|
|
18
|
+
export interface TensionBlastInput {
|
|
19
|
+
document?: string;
|
|
20
|
+
cluster_id?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function buildReverseSourceMap(docs: LoadedDoc[]): Map<string, Set<string>>;
|
|
23
|
+
export declare function buildReverseLinkMap(docs: LoadedDoc[]): Map<string, Set<string>>;
|
|
24
|
+
export interface ComputeBlastArgs {
|
|
25
|
+
seeds: string[];
|
|
26
|
+
reverseSource: Map<string, Set<string>>;
|
|
27
|
+
reverseLink: Map<string, Set<string>>;
|
|
28
|
+
}
|
|
29
|
+
export interface ComputeBlastOutput {
|
|
30
|
+
downstream: BlastDownstreamEntry[];
|
|
31
|
+
primary_blast: number;
|
|
32
|
+
advisory_blast: number;
|
|
33
|
+
max_depth: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function computeBlast(args: ComputeBlastArgs): ComputeBlastOutput;
|
|
36
|
+
export declare function computeTensionBlast(vaultRoot: string, input: TensionBlastInput): Promise<Result<TensionBlastResult, Error>>;
|
|
37
|
+
//# sourceMappingURL=tension-blast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tension-blast.d.ts","sourceRoot":"","sources":["../../src/curation/tension-blast.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAGL,KAAK,SAAS,EAGf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,mBAAmB,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAQD,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAYjF;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAY/E;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,CA8DvE;AAKD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAoE5C"}
|