@sledorze/cairn 0.2.0 → 0.3.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/README.md +37 -1
- package/dist/cli.js +1011 -526
- package/dist/cli.js.map +1 -1
- package/dist/core/Config.d.ts +1 -1
- package/dist/core/Config.d.ts.map +1 -1
- package/dist/core/Config.js +1 -1
- package/dist/core/Config.js.map +1 -1
- package/dist/core/hashing.d.ts +3 -0
- package/dist/core/hashing.d.ts.map +1 -0
- package/dist/core/hashing.js +16 -0
- package/dist/core/hashing.js.map +1 -0
- package/dist/core/links/Anchors.d.ts +30 -0
- package/dist/core/links/Anchors.d.ts.map +1 -0
- package/dist/core/links/Anchors.js +119 -0
- package/dist/core/links/Anchors.js.map +1 -0
- package/dist/core/links/MarkdownLinks.bench.d.ts.map +1 -0
- package/dist/core/links/MarkdownLinks.bench.js.map +1 -0
- package/dist/core/links/MarkdownLinks.d.ts +121 -0
- package/dist/core/links/MarkdownLinks.d.ts.map +1 -0
- package/dist/core/links/MarkdownLinks.js +228 -0
- package/dist/core/links/MarkdownLinks.js.map +1 -0
- package/dist/core/links/RefStore.d.ts +32 -0
- package/dist/core/links/RefStore.d.ts.map +1 -0
- package/dist/core/links/RefStore.js +60 -0
- package/dist/core/links/RefStore.js.map +1 -0
- package/dist/core/links/markdownFences.d.ts +10 -0
- package/dist/core/links/markdownFences.d.ts.map +1 -0
- package/dist/core/links/markdownFences.js +51 -0
- package/dist/core/links/markdownFences.js.map +1 -0
- package/dist/core/paths.d.ts +8 -0
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +13 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/core/sidecar.d.ts +45 -0
- package/dist/core/sidecar.d.ts.map +1 -0
- package/dist/core/sidecar.js +83 -0
- package/dist/core/sidecar.js.map +1 -0
- package/dist/core/{DocSummaries.d.ts → summaries/DocSummaries.d.ts} +0 -2
- package/dist/core/summaries/DocSummaries.d.ts.map +1 -0
- package/dist/core/{DocSummaries.js → summaries/DocSummaries.js} +6 -8
- package/dist/core/summaries/DocSummaries.js.map +1 -0
- package/dist/core/summaries/StampStore.d.ts +19 -0
- package/dist/core/summaries/StampStore.d.ts.map +1 -0
- package/dist/core/summaries/StampStore.js +34 -0
- package/dist/core/summaries/StampStore.js.map +1 -0
- package/dist/core/summaries/SummaryTree.bench.d.ts.map +1 -0
- package/dist/core/{SummaryTree.bench.js → summaries/SummaryTree.bench.js} +2 -1
- package/dist/core/summaries/SummaryTree.bench.js.map +1 -0
- package/dist/core/summaries/SummaryTree.d.ts.map +1 -0
- package/dist/core/{SummaryTree.js → summaries/SummaryTree.js} +4 -3
- package/dist/core/summaries/SummaryTree.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/program/JsonReport.d.ts +2 -2
- package/dist/program/JsonReport.d.ts.map +1 -1
- package/dist/program/JsonReport.js +2 -2
- package/dist/program/JsonReport.js.map +1 -1
- package/dist/program/{CheckLinks.d.ts → links/CheckLinks.d.ts} +9 -4
- package/dist/program/links/CheckLinks.d.ts.map +1 -0
- package/dist/program/links/CheckLinks.js +243 -0
- package/dist/program/links/CheckLinks.js.map +1 -0
- package/dist/program/links/CheckRefs.d.ts +47 -0
- package/dist/program/links/CheckRefs.d.ts.map +1 -0
- package/dist/program/links/CheckRefs.js +151 -0
- package/dist/program/links/CheckRefs.js.map +1 -0
- package/dist/program/summaries/CheckSummaries.bench.d.ts.map +1 -0
- package/dist/program/{CheckSummaries.bench.js → summaries/CheckSummaries.bench.js} +6 -4
- package/dist/program/summaries/CheckSummaries.bench.js.map +1 -0
- package/dist/program/{CheckSummaries.d.ts → summaries/CheckSummaries.d.ts} +7 -7
- package/dist/program/summaries/CheckSummaries.d.ts.map +1 -0
- package/dist/program/{CheckSummaries.js → summaries/CheckSummaries.js} +13 -12
- package/dist/program/summaries/CheckSummaries.js.map +1 -0
- package/package.json +3 -2
- package/dist/core/DocSummaries.d.ts.map +0 -1
- package/dist/core/DocSummaries.js.map +0 -1
- package/dist/core/MarkdownLinks.bench.d.ts.map +0 -1
- package/dist/core/MarkdownLinks.bench.js.map +0 -1
- package/dist/core/MarkdownLinks.d.ts +0 -51
- package/dist/core/MarkdownLinks.d.ts.map +0 -1
- package/dist/core/MarkdownLinks.js +0 -115
- package/dist/core/MarkdownLinks.js.map +0 -1
- package/dist/core/StampStore.d.ts +0 -47
- package/dist/core/StampStore.d.ts.map +0 -1
- package/dist/core/StampStore.js +0 -90
- package/dist/core/StampStore.js.map +0 -1
- package/dist/core/SummaryTree.bench.d.ts.map +0 -1
- package/dist/core/SummaryTree.bench.js.map +0 -1
- package/dist/core/SummaryTree.d.ts.map +0 -1
- package/dist/core/SummaryTree.js.map +0 -1
- package/dist/program/CheckLinks.d.ts.map +0 -1
- package/dist/program/CheckLinks.js +0 -122
- package/dist/program/CheckLinks.js.map +0 -1
- package/dist/program/CheckSummaries.bench.d.ts.map +0 -1
- package/dist/program/CheckSummaries.bench.js.map +0 -1
- package/dist/program/CheckSummaries.d.ts.map +0 -1
- package/dist/program/CheckSummaries.js.map +0 -1
- /package/dist/core/{MarkdownLinks.bench.d.ts → links/MarkdownLinks.bench.d.ts} +0 -0
- /package/dist/core/{MarkdownLinks.bench.js → links/MarkdownLinks.bench.js} +0 -0
- /package/dist/core/{SummaryTree.bench.d.ts → summaries/SummaryTree.bench.d.ts} +0 -0
- /package/dist/core/{SummaryTree.d.ts → summaries/SummaryTree.d.ts} +0 -0
- /package/dist/program/{CheckSummaries.bench.d.ts → summaries/CheckSummaries.bench.d.ts} +0 -0
|
@@ -16,8 +16,12 @@
|
|
|
16
16
|
//
|
|
17
17
|
// Naming (directory-summary filename, file-summary suffix) is configurable; the
|
|
18
18
|
// defaults below reproduce the original behaviour. Unit-tested in
|
|
19
|
-
// DocSummaries.unit.test.ts; the Effect program is in
|
|
20
|
-
|
|
19
|
+
// DocSummaries.unit.test.ts; the Effect program is in ../../program/summaries/CheckSummaries.ts.
|
|
20
|
+
//
|
|
21
|
+
// `hashContent` itself lives in `../hashing.ts`, not here — it's genuinely
|
|
22
|
+
// shared (links/CheckRefs.ts hashes REFERENCED targets with the exact same
|
|
23
|
+
// function), not summary-specific; found via an import-graph audit that
|
|
24
|
+
// this file was the one summaries/ module a links/ program also depended on.
|
|
21
25
|
/** Defaults matching the original hard-coded convention. */
|
|
22
26
|
export const DEFAULT_NAMING = {
|
|
23
27
|
dirSummary: '_SUMMARY.md',
|
|
@@ -48,12 +52,6 @@ export const needsSummary = ({ lineCount, naming = DEFAULT_NAMING, path, thresho
|
|
|
48
52
|
}
|
|
49
53
|
return lineCount > thresholdLines;
|
|
50
54
|
};
|
|
51
|
-
// One-shot `crypto.hash` (Node >=20.12) skips the streaming Hash object's
|
|
52
|
-
// internal state entirely — faster than `createHash().update().digest()` for
|
|
53
|
-
// the KB-sized markdown content this hashes, at the scale this runs at (once
|
|
54
|
-
// per file/manifest per plan).
|
|
55
|
-
/** Deterministic content hash used to stamp and verify summaries. */
|
|
56
|
-
export const hashContent = (content) => hashHex('sha256', content, 'hex');
|
|
57
55
|
/** The HTML-comment stamp a summary must carry to declare which source it reflects. */
|
|
58
56
|
export const sourceHashTag = (hash) => `<!-- source-sha256: ${hash} -->`;
|
|
59
57
|
/** Read back the source hash recorded in a summary, or null if absent. */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocSummaries.js","sourceRoot":"","sources":["../../../src/core/summaries/DocSummaries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface StampRecord {
|
|
2
|
+
readonly sha256: string;
|
|
3
|
+
readonly version: number;
|
|
4
|
+
}
|
|
5
|
+
/** Bumped only if the sidecar's own shape changes incompatibly (never for adding
|
|
6
|
+
* an optional field — the codec already tolerates unknown keys, forward-compatible
|
|
7
|
+
* with a future, richer sidecar). */
|
|
8
|
+
export declare const STAMP_VERSION = 1;
|
|
9
|
+
/** The sidecar's on-disk JSON form. Trailing newline for a clean git diff. */
|
|
10
|
+
export declare const serializeStamp: (record: StampRecord) => string;
|
|
11
|
+
/**
|
|
12
|
+
* Read a sidecar's `StampRecord` back, or `null` if it's missing/corrupt/
|
|
13
|
+
* malformed/hand-edited/merge-conflicted — this must NEVER throw. A stamp that
|
|
14
|
+
* can't be trusted is exactly equivalent to no stamp: the node it covers reads
|
|
15
|
+
* as stale, not as a crash (see AGENTS.md's note on treating an unparsable
|
|
16
|
+
* stamp the same as a missing one).
|
|
17
|
+
*/
|
|
18
|
+
export declare const parseStamp: (content: string) => StampRecord | null;
|
|
19
|
+
//# sourceMappingURL=StampStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StampStore.d.ts","sourceRoot":"","sources":["../../../src/core/summaries/StampStore.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED;;qCAEqC;AACrC,eAAO,MAAM,aAAa,IAAI,CAAA;AAS9B,8EAA8E;AAC9E,eAAO,MAAM,cAAc,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAA6B,CAAA;AAEnF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,WAAW,GAAG,IAAuB,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// The hidden, hierarchy-mirroring metadata tree that replaces the in-content
|
|
2
|
+
// `<!-- source-sha256: H -->` stamp (see AGENTS.md / issue #35). Every
|
|
3
|
+
// summarizable node keeps its authored prose stamp-free; instead, a sidecar
|
|
4
|
+
// JSON file under `<base>/.cairn/` mirrors the node's path 1:1 and carries the
|
|
5
|
+
// freshness hash. This module is pure (no IO): the `StampRecord` shape only.
|
|
6
|
+
// `../../program/summaries/CheckSummaries.ts` is the impure edge that reads/
|
|
7
|
+
// writes sidecars via `DocsFs`.
|
|
8
|
+
//
|
|
9
|
+
// Path mapping and the lenient-decode codec mechanics live in `../sidecar.ts`
|
|
10
|
+
// — genuinely shared with `../links/RefStore.ts` (both are `.cairn/**`
|
|
11
|
+
// sidecars), kept out of this file so it stays about ONE thing: what a
|
|
12
|
+
// summary-freshness record actually contains.
|
|
13
|
+
import { Schema } from 'effect';
|
|
14
|
+
import { makeSidecarCodec } from '../sidecar.js';
|
|
15
|
+
/** Bumped only if the sidecar's own shape changes incompatibly (never for adding
|
|
16
|
+
* an optional field — the codec already tolerates unknown keys, forward-compatible
|
|
17
|
+
* with a future, richer sidecar). */
|
|
18
|
+
export const STAMP_VERSION = 1;
|
|
19
|
+
const StampRecordSchema = Schema.Struct({
|
|
20
|
+
sha256: Schema.String,
|
|
21
|
+
version: Schema.Number,
|
|
22
|
+
});
|
|
23
|
+
const stampCodec = makeSidecarCodec(StampRecordSchema);
|
|
24
|
+
/** The sidecar's on-disk JSON form. Trailing newline for a clean git diff. */
|
|
25
|
+
export const serializeStamp = stampCodec.serialize;
|
|
26
|
+
/**
|
|
27
|
+
* Read a sidecar's `StampRecord` back, or `null` if it's missing/corrupt/
|
|
28
|
+
* malformed/hand-edited/merge-conflicted — this must NEVER throw. A stamp that
|
|
29
|
+
* can't be trusted is exactly equivalent to no stamp: the node it covers reads
|
|
30
|
+
* as stale, not as a crash (see AGENTS.md's note on treating an unparsable
|
|
31
|
+
* stamp the same as a missing one).
|
|
32
|
+
*/
|
|
33
|
+
export const parseStamp = stampCodec.parse;
|
|
34
|
+
//# sourceMappingURL=StampStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StampStore.js","sourceRoot":"","sources":["../../../src/core/summaries/StampStore.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,uEAAuE;AACvE,4EAA4E;AAC5E,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,gCAAgC;AAChC,EAAE;AACF,8EAA8E;AAC9E,uEAAuE;AACvE,uEAAuE;AACvE,8CAA8C;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAOhD;;qCAEqC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAA;AAE9B,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC,CAAA;AAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAA;AAEtD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAoC,UAAU,CAAC,SAAS,CAAA;AAEnF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAA4C,UAAU,CAAC,KAAK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryTree.bench.d.ts","sourceRoot":"","sources":["../../../src/core/summaries/SummaryTree.bench.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as nodePath from 'node:path';
|
|
2
2
|
import { bench, describe } from 'vitest';
|
|
3
|
-
import { hashContent
|
|
3
|
+
import { hashContent } from '../hashing.js';
|
|
4
|
+
import { isSummaryFile, summaryPathFor } from './DocSummaries.js';
|
|
4
5
|
import { DIR_SUMMARY, isDirSummary, planSummaries } from './SummaryTree.js';
|
|
5
6
|
const path = nodePath.posix;
|
|
6
7
|
const bigContent = (seed) => Array.from({ length: 40 }, (_, i) => `${seed} body line ${i} with some representative prose content`).join('\n');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryTree.bench.js","sourceRoot":"","sources":["../../../src/core/summaries/SummaryTree.bench.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryTree.d.ts","sourceRoot":"","sources":["../../../src/core/summaries/SummaryTree.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAO9D,6CAA6C;AAC7C,eAAO,MAAM,WAAW,QAA4B,CAAA;AAEpD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAA;IAC7B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAC/B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC;;oFAEgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC;;;oBAGgB;IAChB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;CACnC;AAMD,wEAAwE;AACxE,eAAO,MAAM,YAAY,MAAO,MAAM,WAAU,MAAM,KAAoB,OACV,CAAA;AA2BhE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,8CAA+C,YAAY,KAAG,MAU1F,CAAA;AAED,iFAAiF;AACjF,eAAO,MAAM,aAAa,mFAQvB,QAAQ,KAAG,WA2Hb,CAAA"}
|
|
@@ -24,9 +24,10 @@
|
|
|
24
24
|
// Filenames (`naming`), the line threshold, ignored globs and whether directory
|
|
25
25
|
// summaries are required are all configurable; defaults reproduce the original.
|
|
26
26
|
import * as nodePath from 'node:path';
|
|
27
|
-
import {
|
|
28
|
-
import { matchesAny } from '
|
|
29
|
-
import {
|
|
27
|
+
import { extractLinks, isCheckableTarget, stripAnchor, stripCode } from '../links/MarkdownLinks.js';
|
|
28
|
+
import { matchesAny } from '../glob.js';
|
|
29
|
+
import { hashContent } from '../hashing.js';
|
|
30
|
+
import { countLines, DEFAULT_NAMING, isSummaryFile, summaryPathFor } from './DocSummaries.js';
|
|
30
31
|
// POSIX path semantics so the plan is identical on every OS (inputs normalised
|
|
31
32
|
// to `/` at the IO boundary).
|
|
32
33
|
const path = nodePath.posix;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SummaryTree.js","sourceRoot":"","sources":["../../../src/core/summaries/SummaryTree.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,0BAA0B;AAC1B,iFAAiF;AACjF,8EAA8E;AAC9E,8EAA8E;AAC9E,oCAAoC;AACpC,EAAE;AACF,iFAAiF;AACjF,8EAA8E;AAC9E,0CAA0C;AAC1C,mDAAmD;AACnD,mFAAmF;AACnF,2EAA2E;AAC3E,gFAAgF;AAChF,iFAAiF;AACjF,wEAAwE;AACxE,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,iFAAiF;AACjF,oCAAoC;AACpC,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAEhF,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAE7F,+EAA+E;AAC/E,8BAA8B;AAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAA;AAE3B,6CAA6C;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAA;AAoCpD,MAAM,YAAY,GAAgC,IAAI,GAAG,EAAE,CAAA;AAE3D,MAAM,uBAAuB,GAAG,EAAE,CAAA;AAElC,wEAAwE;AACxE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,MAAM,GAAW,cAAc,EAAW,EAAE,CAClF,CAAC,KAAK,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;AAEhE,sFAAsF;AACtF,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,GAAW,EAAe,EAAE;IACjE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,SAAQ;QACV,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;QAC/B,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,MAAe,EAAE,QAAuB,EAAE,QAAgB,EAAiB,EAAE;IAC7F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AASD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAgB,EAAU,EAAE;IAClG,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,MAAM;SACpB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;SACrF,QAAQ,EAAE;SACV,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;AAC9B,CAAC,CAAA;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,KAAK,EACL,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,cAAc,EACvB,mBAAmB,GAAG,IAAI,EAC1B,KAAK,EACL,MAAM,GAAG,YAAY,EACrB,cAAc,GAAG,uBAAuB,GAC/B,EAAe,EAAE;IAC1B,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IAClC,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAiB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IAEpE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAC5G,CAAA;IACD,wEAAwE;IACxE,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAA;IACtG,MAAM,KAAK,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAExD,yBAAyB;IACzB,MAAM,SAAS,GAAe,EAAE,CAAA;IAChC,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,SAAQ;QACV,CAAC;QACD,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACtC,MAAM,YAAY,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QACvF,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjC,SAAS,CAAC,IAAI,CAAC;YACb,YAAY;YACZ,MAAM,EAAE,CAAC,GAAG,CAAC;YACb,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,EAAE;YAChB,IAAI,EAAE,EAAE;YACR,YAAY;YACZ,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,YAAY,CAAC;SAC5D,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAA;QAC7F,MAAM,YAAY,GAAG,iBAAiB,CAAC;YACrC,iBAAiB,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM;YACN,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE;SAC9B,CAAC,CAAA;QACF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAA;IACtG,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3F,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACzB,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACX,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC9B,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,MAAK;YACP,CAAC;YACD,CAAC,GAAG,MAAM,CAAA;QACZ,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,oEAAoE;IACpE,mDAAmD;IACnD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAA;IAChD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAA;IAChD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,QAAQ,GAAe,EAAE,CAAA;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,MAAM,GAAG;YACb,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3E,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;SAC7D,CAAA;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QAC7C,MAAM,YAAY,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;QAChF,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC7B,sEAAsE;QACtE,MAAM,aAAa,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,CAAA;QAClD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;QACtD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QACrF,MAAM,KAAK,GAAG,MAAM,IAAI,YAAY,KAAK,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,CAAA;QAClF,QAAQ,CAAC,IAAI,CAAC;YACZ,YAAY;YACZ,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;YACzB,IAAI,EAAE,KAAK;YACX,YAAY;YACZ,IAAI,EAAE,GAAG;YACT,YAAY;YACZ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;SACtD,CAAC,CAAA;IACJ,CAAC;IAED,kEAAkE;IAClE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;IACxD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAEtF,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAA;IACzC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAA;IAClF,MAAM,YAAY,GAAG,iBAAiB,CAAC;QACrC,iBAAiB,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM;QACN,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE;KAC9B,CAAC,CAAA;IACF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAA;AACvF,CAAC,CAAA;AAQD;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAG,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,cAAc,EAAyB,EAAY,EAAE,CAC3G,CAAC,GAAG,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;AAUnG;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAmB,EAAY,EAAE;IACvG,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAClD,MAAM,eAAe,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CACtF,CAAA;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;AACnE,CAAC,CAAA;AAED,iIAAiI;AACjI,MAAM,oBAAoB,GAAG,CAAC,CAAS,EAAE,MAAc,EAAE,mBAA4B,EAAW,EAAE,CAChG,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export * from './core/DocSummaries.ts';
|
|
1
|
+
export * from './core/summaries/DocSummaries.ts';
|
|
2
2
|
export * from './core/glob.ts';
|
|
3
|
-
export * from './core/MarkdownLinks.ts';
|
|
4
|
-
export * from './core/SummaryTree.ts';
|
|
3
|
+
export * from './core/links/MarkdownLinks.ts';
|
|
4
|
+
export * from './core/summaries/SummaryTree.ts';
|
|
5
5
|
export * from './io/DocsFs.ts';
|
|
6
|
-
export * from './program/CheckLinks.ts';
|
|
7
|
-
export * from './program/CheckSummaries.ts';
|
|
6
|
+
export * from './program/links/CheckLinks.ts';
|
|
7
|
+
export * from './program/summaries/CheckSummaries.ts';
|
|
8
8
|
export * from './program/locale.ts';
|
|
9
9
|
export * from './config.ts';
|
|
10
10
|
export type { AgentTarget, InitArgs, InitResult } from './init/generate.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kCAAkC,CAAA;AAChD,cAAc,gBAAgB,CAAA;AAC9B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gBAAgB,CAAA;AAC9B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,uCAAuC,CAAA;AACrD,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// Public API surface. The CLI (`cairn`) is the primary entrypoint, but the pure
|
|
2
2
|
// planners and Effect programs are exported for programmatic use and testing.
|
|
3
|
-
export * from './core/DocSummaries.js';
|
|
3
|
+
export * from './core/summaries/DocSummaries.js';
|
|
4
4
|
export * from './core/glob.js';
|
|
5
|
-
export * from './core/MarkdownLinks.js';
|
|
6
|
-
export * from './core/SummaryTree.js';
|
|
5
|
+
export * from './core/links/MarkdownLinks.js';
|
|
6
|
+
export * from './core/summaries/SummaryTree.js';
|
|
7
7
|
export * from './io/DocsFs.js';
|
|
8
|
-
export * from './program/CheckLinks.js';
|
|
9
|
-
export * from './program/CheckSummaries.js';
|
|
8
|
+
export * from './program/links/CheckLinks.js';
|
|
9
|
+
export * from './program/summaries/CheckSummaries.js';
|
|
10
10
|
export * from './program/locale.js';
|
|
11
11
|
export * from './config.js';
|
|
12
12
|
export { runInit } from './init/generate.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8EAA8E;AAE9E,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8EAA8E;AAE9E,cAAc,kCAAkC,CAAA;AAChD,cAAc,gBAAgB,CAAA;AAC9B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,gBAAgB,CAAA;AAC9B,cAAc,+BAA+B,CAAA;AAC7C,cAAc,uCAAuC,CAAA;AACrD,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAE3B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { SummaryPlan } from '../core/SummaryTree.ts';
|
|
2
|
-
import type { LinkCheckResult } from './CheckLinks.ts';
|
|
1
|
+
import type { SummaryPlan } from '../core/summaries/SummaryTree.ts';
|
|
2
|
+
import type { LinkCheckResult } from './links/CheckLinks.ts';
|
|
3
3
|
export interface JsonReport {
|
|
4
4
|
readonly exitCode: number;
|
|
5
5
|
readonly links: LinkCheckResult | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonReport.d.ts","sourceRoot":"","sources":["../../src/program/JsonReport.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"JsonReport.d.ts","sourceRoot":"","sources":["../../src/program/JsonReport.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAI5D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAA;CACvC;AAED,sGAAsG;AACtG,eAAO,MAAM,eAAe,yBAA0B,cAAc,KAAG,UAItE,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// `--json`: a single combined, machine-readable result for `cairn check`.
|
|
2
2
|
// Wraps the already-structured `SummaryPlan`/`LinkCheckResult` — no new
|
|
3
3
|
// computation, just packaging + the same exit-code rules as the text report.
|
|
4
|
-
import { linkExitCode } from './CheckLinks.js';
|
|
5
|
-
import { summaryExitCode } from './CheckSummaries.js';
|
|
4
|
+
import { linkExitCode } from './links/CheckLinks.js';
|
|
5
|
+
import { summaryExitCode } from './summaries/CheckSummaries.js';
|
|
6
6
|
/** `summaries`/`links` are `null` when that check was skipped (`--links-only`/`--summaries-only`). */
|
|
7
7
|
export const buildJsonReport = ({ links, summaries }) => {
|
|
8
8
|
const summaryCode = summaries === null ? 0 : summaryExitCode(summaries);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonReport.js","sourceRoot":"","sources":["../../src/program/JsonReport.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wEAAwE;AACxE,6EAA6E;AAI7E,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"JsonReport.js","sourceRoot":"","sources":["../../src/program/JsonReport.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wEAAwE;AACxE,6EAA6E;AAI7E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAa/D,sGAAsG;AACtG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAkB,EAAc,EAAE;IAClF,MAAM,WAAW,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;IACvE,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IACzD,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;AACxE,CAAC,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect } from 'effect';
|
|
2
|
-
import type { BrokenLink } from '
|
|
3
|
-
import { DocsFs } from '
|
|
4
|
-
import type { Locale } from '
|
|
2
|
+
import type { BrokenLink } from '../../core/links/MarkdownLinks.ts';
|
|
3
|
+
import { DocsFs } from '../../io/DocsFs.ts';
|
|
4
|
+
import type { Locale } from '../locale.ts';
|
|
5
5
|
export interface FileBroken {
|
|
6
6
|
readonly file: string;
|
|
7
7
|
readonly links: readonly BrokenLink[];
|
|
@@ -12,6 +12,11 @@ export interface LinkCheckResult {
|
|
|
12
12
|
readonly fixed: number;
|
|
13
13
|
}
|
|
14
14
|
export interface CheckLinksArgs {
|
|
15
|
+
/** The repository checkout root — the hard boundary a target outside
|
|
16
|
+
* `roots` may still be verified within (issue #39's security requirement:
|
|
17
|
+
* nothing outside `base` is ever stat'd, so cairn can't be turned into a
|
|
18
|
+
* filesystem-existence oracle by an untrusted PR's link targets). */
|
|
19
|
+
readonly base: string;
|
|
15
20
|
readonly fix: boolean;
|
|
16
21
|
readonly ignore?: readonly string[];
|
|
17
22
|
readonly roots: readonly string[];
|
|
@@ -23,5 +28,5 @@ export interface LinkReportOptions {
|
|
|
23
28
|
export declare const linkExitCode: (result: LinkCheckResult) => number;
|
|
24
29
|
/** Human-readable report lines (pure, so it can be unit-tested). */
|
|
25
30
|
export declare const formatLinkReport: (result: LinkCheckResult, options?: LinkReportOptions) => string[];
|
|
26
|
-
export declare const checkLinks: ({ fix, ignore, roots, }: CheckLinksArgs) => Effect.Effect<LinkCheckResult, never, DocsFs>;
|
|
31
|
+
export declare const checkLinks: ({ base, fix, ignore, roots, }: CheckLinksArgs) => Effect.Effect<LinkCheckResult, never, DocsFs>;
|
|
27
32
|
//# sourceMappingURL=CheckLinks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckLinks.d.ts","sourceRoot":"","sources":["../../../src/program/links/CheckLinks.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAS/B,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,mCAAmC,CAAA;AAKjF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAM1C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAA;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B;;;yEAGqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AA+CD,kDAAkD;AAClD,eAAO,MAAM,YAAY,WAAY,eAAe,KAAG,MAA4C,CAAA;AAEnG,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,WAAY,eAAe,YAAW,iBAAiB,KAAQ,MAAM,EA0BjG,CAAA;AAwHD,eAAO,MAAM,UAAU,kCAKpB,cAAc,KAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,CAiF5D,CAAA"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// Effect program: scan Markdown files for dead relative links and, when
|
|
2
|
+
// `fix` is set, auto-repair the unambiguous ones. Pure link logic lives in
|
|
3
|
+
// ../../core/links/MarkdownLinks.ts; filesystem access goes through the DocsFs service.
|
|
4
|
+
import * as nodePath from 'node:path';
|
|
5
|
+
import { Effect } from 'effect';
|
|
6
|
+
import { describeAnchors, extractAnchors, isValidLineAnchor, normalizeAnchor, parseLineAnchor, } from '../../core/links/Anchors.js';
|
|
7
|
+
import { buildBasenameIndex, checkContent, stripCode, suggestFix } from '../../core/links/MarkdownLinks.js';
|
|
8
|
+
import { matchesAny } from '../../core/glob.js';
|
|
9
|
+
import { isWithinBase } from '../../core/paths.js';
|
|
10
|
+
import { DocsFs } from '../../io/DocsFs.js';
|
|
11
|
+
import { pick } from '../locale.js';
|
|
12
|
+
// POSIX path semantics (inputs are normalised to `/` at the IO boundary).
|
|
13
|
+
const path = nodePath.posix;
|
|
14
|
+
const withAncestors = (files) => {
|
|
15
|
+
const set = new Set(files);
|
|
16
|
+
for (const file of files) {
|
|
17
|
+
let dir = path.dirname(file);
|
|
18
|
+
while (!set.has(dir)) {
|
|
19
|
+
set.add(dir);
|
|
20
|
+
const parent = path.dirname(dir);
|
|
21
|
+
if (parent === dir) {
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
dir = parent;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return set;
|
|
28
|
+
};
|
|
29
|
+
/** Occurrences of `token` in `text`. */
|
|
30
|
+
const countOccurrences = (text, token) => (token === '' ? 0 : text.split(token).length - 1);
|
|
31
|
+
/**
|
|
32
|
+
* Replace a broken link/definition target with its suggestion, but ONLY when the
|
|
33
|
+
* target does not also appear inside a code span — replacing it there would
|
|
34
|
+
* corrupt a code example. Returns the new content and whether a change was made.
|
|
35
|
+
*/
|
|
36
|
+
const applyFix = (content, target, suggestion) => {
|
|
37
|
+
const masked = stripCode(content);
|
|
38
|
+
let next = content;
|
|
39
|
+
let changed = false;
|
|
40
|
+
for (const [from, to] of [
|
|
41
|
+
[`](${target})`, `](${suggestion})`],
|
|
42
|
+
[`]: ${target}`, `]: ${suggestion}`],
|
|
43
|
+
]) {
|
|
44
|
+
if (countOccurrences(content, from) === 0) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// Every occurrence must be outside code (full count === masked count).
|
|
48
|
+
if (countOccurrences(masked, from) !== countOccurrences(content, from)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
next = next.split(from).join(to);
|
|
52
|
+
changed = true;
|
|
53
|
+
}
|
|
54
|
+
return { changed, content: next };
|
|
55
|
+
};
|
|
56
|
+
/** 0 when no broken links remain, 1 otherwise. */
|
|
57
|
+
export const linkExitCode = (result) => (result.broken.length > 0 ? 1 : 0);
|
|
58
|
+
/** Human-readable report lines (pure, so it can be unit-tested). */
|
|
59
|
+
export const formatLinkReport = (result, options = {}) => {
|
|
60
|
+
const locale = options.locale ?? 'en';
|
|
61
|
+
const lines = [];
|
|
62
|
+
if (result.fixed > 0) {
|
|
63
|
+
lines.push(pick(locale, { en: `🔧 Auto-repaired ${result.fixed} link(s).`, fr: `🔧 Auto-réparé ${result.fixed} lien(s).` }));
|
|
64
|
+
}
|
|
65
|
+
if (result.broken.length === 0) {
|
|
66
|
+
lines.push(pick(locale, {
|
|
67
|
+
en: `✅ Markdown links OK (${result.checked} file(s) checked).`,
|
|
68
|
+
fr: `✅ Liens Markdown OK (${result.checked} fichier(s) vérifié(s)).`,
|
|
69
|
+
}));
|
|
70
|
+
return lines;
|
|
71
|
+
}
|
|
72
|
+
const total = result.broken.reduce((n, f) => n + f.links.length, 0);
|
|
73
|
+
lines.push(pick(locale, { en: `❌ ${total} dead link(s):`, fr: `❌ ${total} lien(s) mort(s) :` }));
|
|
74
|
+
for (const { file, links } of result.broken) {
|
|
75
|
+
lines.push(` ${file}`);
|
|
76
|
+
for (const link of links) {
|
|
77
|
+
lines.push(` ✗ [${link.text}](${link.target})${linkHint(locale, link)}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return lines;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Why a link is broken, for a human — distinct from `(no unique target)`
|
|
84
|
+
* (a *path* with no unambiguous fix) so an anchor/line failure never reads as
|
|
85
|
+
* a missing-file problem: the target resolves fine, only its `#fragment` doesn't.
|
|
86
|
+
*/
|
|
87
|
+
const linkHint = (locale, link) => {
|
|
88
|
+
if (link.suggestion !== undefined) {
|
|
89
|
+
return pick(locale, { en: ` → suggestion: ${link.suggestion}`, fr: ` → suggestion : ${link.suggestion}` });
|
|
90
|
+
}
|
|
91
|
+
const detail = link.detail !== undefined ? ` — ${link.detail}` : '';
|
|
92
|
+
if (link.reason === 'anchor') {
|
|
93
|
+
return pick(locale, { en: ` (heading/anchor not found${detail})`, fr: ` (ancre introuvable${detail})` });
|
|
94
|
+
}
|
|
95
|
+
if (link.reason === 'line') {
|
|
96
|
+
return pick(locale, { en: ` (line number out of range${detail})`, fr: ` (numéro de ligne hors limites${detail})` });
|
|
97
|
+
}
|
|
98
|
+
return pick(locale, { en: ' (no unique target)', fr: ' (aucune cible unique)' });
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Resolve one deferred `PendingCheck` with real IO, bounded by `base`
|
|
102
|
+
* (issue #39's security requirement — a target outside `base` is never
|
|
103
|
+
* stat'd, existence-oracle risk closed regardless of what's actually there).
|
|
104
|
+
* `existsCache`/`contentCache`/`anchorCache` are shared across every pending
|
|
105
|
+
* check in a run so a file referenced by many links is only ever stat'd/
|
|
106
|
+
* read/slugged once. Content is fetched only when an anchor actually needs
|
|
107
|
+
* validating — a plain out-of-root existence check (no `#fragment`) never
|
|
108
|
+
* reads the target's full body just to confirm it's there.
|
|
109
|
+
*/
|
|
110
|
+
const resolvePendingCheck = ({ base, existsCache, contentCache, anchorCache, dfs, index, item, known, }) => Effect.gen(function* () {
|
|
111
|
+
let exists = existsCache.get(item.targetAbs);
|
|
112
|
+
if (exists === undefined) {
|
|
113
|
+
if (known.has(item.targetAbs)) {
|
|
114
|
+
exists = true;
|
|
115
|
+
}
|
|
116
|
+
else if (isWithinBase(item.targetAbs, base)) {
|
|
117
|
+
exists = yield* dfs.exists(item.targetAbs);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Outside the checkout root entirely: never touched, unconditionally
|
|
121
|
+
// "cannot verify" — the observable signal stays constant regardless
|
|
122
|
+
// of what's actually on disk there.
|
|
123
|
+
exists = false;
|
|
124
|
+
}
|
|
125
|
+
existsCache.set(item.targetAbs, exists);
|
|
126
|
+
}
|
|
127
|
+
if (!exists) {
|
|
128
|
+
const suggestion = suggestFix({ fromDir: item.fromDir, index, target: item.target });
|
|
129
|
+
return suggestion
|
|
130
|
+
? { reason: 'path', suggestion, target: item.target, text: item.text }
|
|
131
|
+
: { reason: 'path', target: item.target, text: item.text };
|
|
132
|
+
}
|
|
133
|
+
if (item.anchor === null) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
let content = contentCache.get(item.targetAbs);
|
|
137
|
+
if (content === undefined) {
|
|
138
|
+
// `exists` only proves the path resolves to SOMETHING — a directory
|
|
139
|
+
// (from `known`'s ancestor-dir entries, or from a real out-of-root
|
|
140
|
+
// directory) also "exists" but isn't readable as text, and would
|
|
141
|
+
// otherwise die here (Effect.orDie) and take the whole run down over
|
|
142
|
+
// one malformed/unusual link. Existence already holds, so this is
|
|
143
|
+
// genuinely unverifiable, not broken and not a crash.
|
|
144
|
+
content = yield* dfs.readFile(item.targetAbs).pipe(Effect.catchDefect(() => Effect.succeed(null)));
|
|
145
|
+
contentCache.set(item.targetAbs, content);
|
|
146
|
+
}
|
|
147
|
+
if (content === null) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
const normalized = normalizeAnchor(item.anchor);
|
|
151
|
+
const lineRange = parseLineAnchor(normalized);
|
|
152
|
+
if (lineRange) {
|
|
153
|
+
const lineCount = content.split('\n').length;
|
|
154
|
+
if (isValidLineAnchor(lineRange, lineCount)) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const detail = `target has ${lineCount} line${lineCount === 1 ? '' : 's'}`;
|
|
158
|
+
return { detail, reason: 'line', target: item.target, text: item.text };
|
|
159
|
+
}
|
|
160
|
+
if (!item.targetAbs.toLowerCase().endsWith('.md')) {
|
|
161
|
+
// A non-line, non-md fragment is a symbol anchor (`x.ts#someExport`) —
|
|
162
|
+
// explicitly out of v1 scope (issue #39, scenario G): unverifiable, so
|
|
163
|
+
// never flagged broken rather than risk a false positive.
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
let anchors = anchorCache.get(item.targetAbs);
|
|
167
|
+
if (!anchors) {
|
|
168
|
+
anchors = extractAnchors(content);
|
|
169
|
+
anchorCache.set(item.targetAbs, anchors);
|
|
170
|
+
}
|
|
171
|
+
return anchors.has(normalized)
|
|
172
|
+
? null
|
|
173
|
+
: { detail: describeAnchors(anchors), reason: 'anchor', target: item.target, text: item.text };
|
|
174
|
+
});
|
|
175
|
+
export const checkLinks = ({ base, fix, ignore = [], roots, }) => Effect.gen(function* () {
|
|
176
|
+
const dfs = yield* DocsFs;
|
|
177
|
+
// The existence universe stays complete (so links to ignored files still
|
|
178
|
+
// resolve); `ignore` only removes files from the set we scan as sources.
|
|
179
|
+
const allFiles = yield* dfs.listFiles(roots);
|
|
180
|
+
const index = buildBasenameIndex(allFiles);
|
|
181
|
+
const known = withAncestors(allFiles);
|
|
182
|
+
const existsAbs = (p) => known.has(p);
|
|
183
|
+
const inRoots = (p) => roots.some((root) => p === root || p.startsWith(`${root}/`));
|
|
184
|
+
const mdFiles = allFiles.filter((file) => file.endsWith('.md') && !matchesAny(file, ignore));
|
|
185
|
+
const scans = [];
|
|
186
|
+
for (const file of mdFiles) {
|
|
187
|
+
const content = yield* dfs.readFile(file);
|
|
188
|
+
const { broken: syncBroken, pending } = checkContent({ content, existsAbs, fileAbs: file, inRoots, index });
|
|
189
|
+
scans.push({ content, file, pending, resolvedExtra: [], syncBroken });
|
|
190
|
+
}
|
|
191
|
+
// Resolve every deferred anchor/cross-hierarchy check once, sharing
|
|
192
|
+
// per-target caches across the whole run.
|
|
193
|
+
const existsCache = new Map();
|
|
194
|
+
const contentCache = new Map();
|
|
195
|
+
const anchorCache = new Map();
|
|
196
|
+
for (const scan of scans) {
|
|
197
|
+
for (const item of scan.pending) {
|
|
198
|
+
const result = yield* resolvePendingCheck({
|
|
199
|
+
anchorCache,
|
|
200
|
+
base,
|
|
201
|
+
contentCache,
|
|
202
|
+
dfs,
|
|
203
|
+
existsCache,
|
|
204
|
+
index,
|
|
205
|
+
item,
|
|
206
|
+
known,
|
|
207
|
+
});
|
|
208
|
+
if (result) {
|
|
209
|
+
scan.resolvedExtra.push(result);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const broken = [];
|
|
214
|
+
let fixed = 0;
|
|
215
|
+
for (const scan of scans) {
|
|
216
|
+
let content = scan.content;
|
|
217
|
+
const links = [...scan.syncBroken, ...scan.resolvedExtra];
|
|
218
|
+
if (links.length === 0) {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const remaining = [];
|
|
222
|
+
let changed = false;
|
|
223
|
+
for (const link of links) {
|
|
224
|
+
const repair = fix && link.suggestion !== undefined ? applyFix(content, link.target, link.suggestion) : undefined;
|
|
225
|
+
if (repair?.changed) {
|
|
226
|
+
content = repair.content;
|
|
227
|
+
changed = true;
|
|
228
|
+
fixed += 1;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
remaining.push(link);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (changed) {
|
|
235
|
+
yield* dfs.writeFile(scan.file, content);
|
|
236
|
+
}
|
|
237
|
+
if (remaining.length > 0) {
|
|
238
|
+
broken.push({ file: scan.file, links: remaining });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return { broken, checked: mdFiles.length, fixed };
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=CheckLinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckLinks.js","sourceRoot":"","sources":["../../../src/program/links/CheckLinks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import { DocsFs } from '../../io/DocsFs.ts';
|
|
3
|
+
import type { Locale } from '../locale.ts';
|
|
4
|
+
export interface CheckRefsArgs {
|
|
5
|
+
readonly base: string;
|
|
6
|
+
readonly roots: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export interface StaleRef {
|
|
9
|
+
readonly anchor?: string;
|
|
10
|
+
readonly currentHash: string;
|
|
11
|
+
readonly recordedHash: string;
|
|
12
|
+
readonly target: string;
|
|
13
|
+
}
|
|
14
|
+
export interface FileStaleRefs {
|
|
15
|
+
readonly file: string;
|
|
16
|
+
readonly refs: readonly StaleRef[];
|
|
17
|
+
}
|
|
18
|
+
export interface RefsCheckResult {
|
|
19
|
+
readonly checked: number;
|
|
20
|
+
readonly stale: readonly FileStaleRefs[];
|
|
21
|
+
}
|
|
22
|
+
export interface StampRefsResult {
|
|
23
|
+
readonly stamped: number;
|
|
24
|
+
}
|
|
25
|
+
/** 0 when nothing is stale, 1 otherwise — same convention as `linkExitCode`. */
|
|
26
|
+
export declare const refsExitCode: (result: RefsCheckResult) => number;
|
|
27
|
+
/**
|
|
28
|
+
* Record the current content hash of every real reference each scanned doc
|
|
29
|
+
* makes. Overwrites any previously-recorded sidecar unconditionally (same
|
|
30
|
+
* "stamp always writes fresh state" convention as `stampSummaries`) — a doc
|
|
31
|
+
* with no resolvable references gets no sidecar at all (nothing to compare
|
|
32
|
+
* against later, and no reason to create an empty one).
|
|
33
|
+
*/
|
|
34
|
+
export declare const stampRefs: ({ base, roots }: CheckRefsArgs) => Effect.Effect<StampRefsResult, never, DocsFs>;
|
|
35
|
+
/**
|
|
36
|
+
* Compare each scanned doc's recorded reference hashes (if any) against
|
|
37
|
+
* current target content, reporting drift. A doc with no refs sidecar
|
|
38
|
+
* (never stamped, or every reference already broken/unrecordable) is
|
|
39
|
+
* silently skipped — nothing recorded, nothing to compare.
|
|
40
|
+
*/
|
|
41
|
+
export declare const checkRefs: ({ base, roots }: CheckRefsArgs) => Effect.Effect<RefsCheckResult, never, DocsFs>;
|
|
42
|
+
export interface RefsReportOptions {
|
|
43
|
+
readonly locale?: Locale;
|
|
44
|
+
}
|
|
45
|
+
/** Human-readable report lines (pure, so it can be unit-tested). */
|
|
46
|
+
export declare const formatRefsReport: (result: RefsCheckResult, options?: RefsReportOptions) => string[];
|
|
47
|
+
//# sourceMappingURL=CheckRefs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckRefs.d.ts","sourceRoot":"","sources":["../../../src/program/links/CheckRefs.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAQ/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAK1C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,gFAAgF;AAChF,eAAO,MAAM,YAAY,WAAY,eAAe,KAAG,MAA2C,CAAA;AAyClG;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,oBAAqB,aAAa,KAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,CAuBnG,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,SAAS,oBAAqB,aAAa,KAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,CAwCnG,CAAA;AAEJ,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,WAAY,eAAe,YAAW,iBAAiB,KAAQ,MAAM,EA6BjG,CAAA"}
|