@sledorze/cairn 0.1.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.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +178 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +77950 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +20 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +168 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/Config.d.ts +80 -0
  12. package/dist/core/Config.d.ts.map +1 -0
  13. package/dist/core/Config.js +135 -0
  14. package/dist/core/Config.js.map +1 -0
  15. package/dist/core/DocSummaries.d.ts +42 -0
  16. package/dist/core/DocSummaries.d.ts.map +1 -0
  17. package/dist/core/DocSummaries.js +74 -0
  18. package/dist/core/DocSummaries.js.map +1 -0
  19. package/dist/core/MarkdownLinks.bench.d.ts +2 -0
  20. package/dist/core/MarkdownLinks.bench.d.ts.map +1 -0
  21. package/dist/core/MarkdownLinks.bench.js +81 -0
  22. package/dist/core/MarkdownLinks.bench.js.map +1 -0
  23. package/dist/core/MarkdownLinks.d.ts +51 -0
  24. package/dist/core/MarkdownLinks.d.ts.map +1 -0
  25. package/dist/core/MarkdownLinks.js +115 -0
  26. package/dist/core/MarkdownLinks.js.map +1 -0
  27. package/dist/core/SummaryTree.bench.d.ts +2 -0
  28. package/dist/core/SummaryTree.bench.d.ts.map +1 -0
  29. package/dist/core/SummaryTree.bench.js +70 -0
  30. package/dist/core/SummaryTree.bench.js.map +1 -0
  31. package/dist/core/SummaryTree.d.ts +45 -0
  32. package/dist/core/SummaryTree.d.ts.map +1 -0
  33. package/dist/core/SummaryTree.js +196 -0
  34. package/dist/core/SummaryTree.js.map +1 -0
  35. package/dist/core/glob.bench.d.ts +2 -0
  36. package/dist/core/glob.bench.d.ts.map +1 -0
  37. package/dist/core/glob.bench.js +62 -0
  38. package/dist/core/glob.bench.js.map +1 -0
  39. package/dist/core/glob.d.ts +7 -0
  40. package/dist/core/glob.d.ts.map +1 -0
  41. package/dist/core/glob.js +52 -0
  42. package/dist/core/glob.js.map +1 -0
  43. package/dist/core/paths.d.ts +3 -0
  44. package/dist/core/paths.d.ts.map +1 -0
  45. package/dist/core/paths.js +6 -0
  46. package/dist/core/paths.js.map +1 -0
  47. package/dist/index.d.ts +12 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +13 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/init/content.d.ts +3 -0
  52. package/dist/init/content.d.ts.map +1 -0
  53. package/dist/init/content.js +127 -0
  54. package/dist/init/content.js.map +1 -0
  55. package/dist/init/generate.d.ts +14 -0
  56. package/dist/init/generate.d.ts.map +1 -0
  57. package/dist/init/generate.js +121 -0
  58. package/dist/init/generate.js.map +1 -0
  59. package/dist/io/DocsFs.d.ts +30 -0
  60. package/dist/io/DocsFs.d.ts.map +1 -0
  61. package/dist/io/DocsFs.js +95 -0
  62. package/dist/io/DocsFs.js.map +1 -0
  63. package/dist/program/CheckLinks.d.ts +27 -0
  64. package/dist/program/CheckLinks.d.ts.map +1 -0
  65. package/dist/program/CheckLinks.js +122 -0
  66. package/dist/program/CheckLinks.js.map +1 -0
  67. package/dist/program/CheckSummaries.d.ts +38 -0
  68. package/dist/program/CheckSummaries.d.ts.map +1 -0
  69. package/dist/program/CheckSummaries.js +198 -0
  70. package/dist/program/CheckSummaries.js.map +1 -0
  71. package/dist/program/JsonReport.d.ts +14 -0
  72. package/dist/program/JsonReport.d.ts.map +1 -0
  73. package/dist/program/JsonReport.js +12 -0
  74. package/dist/program/JsonReport.js.map +1 -0
  75. package/dist/program/locale.d.ts +13 -0
  76. package/dist/program/locale.d.ts.map +1 -0
  77. package/dist/program/locale.js +8 -0
  78. package/dist/program/locale.js.map +1 -0
  79. package/package.json +78 -0
  80. package/schema/cairn.schema.json +77 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Overrides, ResolvedConfig } from './core/Config.ts';
2
+ export type { CairnConfigInput, ChecksConfig, Locale, Overrides, ResolvedConfig } from './core/Config.ts';
3
+ export { CairnConfigSchema, DEFAULT_CONFIG, decodeConfig, formatConfigError, LOCALES } from './core/Config.ts';
4
+ /** Parse JSON, turning a syntax error into a clear, actionable message. */
5
+ export declare const parseRcJson: (text: string, file: string) => unknown;
6
+ export interface ResolvedConfigWithSource {
7
+ readonly config: ResolvedConfig;
8
+ readonly sourceFile: string;
9
+ }
10
+ /** Shown as provenance when no `.cairnrc(.json)` or `package.json#cairn` was found. */
11
+ export declare const DEFAULTS_SOURCE = "defaults (no config found)";
12
+ /** Load the resolved config: defaults <- extends chain <- file/package.json <- CLI overrides,
13
+ * plus which file it came from (an rc file, `<package.json>#cairn`, or `DEFAULTS_SOURCE`).
14
+ * Powers the `cairn config` debug command's "why aren't my docs being checked" answer. */
15
+ export declare const loadConfigWithSource: (cwd: string, overrides?: Overrides, explicitPath?: string) => ResolvedConfigWithSource;
16
+ /** Load just the resolved config: defaults <- extends chain <- file/package.json <- CLI overrides. */
17
+ export declare const loadConfig: (cwd: string, overrides?: Overrides, explicitPath?: string) => ResolvedConfig;
18
+ /** Resolve all configured roots to a de-duplicated list of existing directories (POSIX). */
19
+ export declare const expandRoots: (cwd: string, patterns: readonly string[]) => string[];
20
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKjE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACzG,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAM9G,2EAA2E;AAC3E,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,OAMxD,CAAA;AA8ED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED,uFAAuF;AACvF,eAAO,MAAM,eAAe,+BAA+B,CAAA;AAE3D;;0FAE0F;AAC1F,eAAO,MAAM,oBAAoB,GAC/B,KAAK,MAAM,EACX,YAAW,SAAc,EACzB,eAAe,MAAM,KACpB,wBAUF,CAAA;AAED,sGAAsG;AACtG,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,EAAE,YAAW,SAAc,EAAE,eAAe,MAAM,KAAG,cAChC,CAAA;AAiE3D,4FAA4F;AAC5F,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,UAAU,SAAS,MAAM,EAAE,KAAG,MAAM,EAQ5E,CAAA"}
package/dist/config.js ADDED
@@ -0,0 +1,168 @@
1
+ // Configuration loading & root-glob expansion for the CLI. This is the Node
2
+ // (impure) edge of the tool: it reads `.cairnrc(.json)` or the
3
+ // `cairn` key of `package.json` from disk, decodes it via the pure `core/Config.ts`
4
+ // schema, resolves `extends` chains (also disk IO), and expands `roots` globs to
5
+ // concrete directories. The pure planners never see this — they receive
6
+ // already-resolved values.
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import { Either } from 'effect';
10
+ import { DEFAULT_CONFIG, decodeConfig, formatConfigError, layerConfig } from "./core/Config.js";
11
+ import { globToRegExp } from "./core/glob.js";
12
+ import { toPosix } from "./core/paths.js";
13
+ export { CairnConfigSchema, DEFAULT_CONFIG, decodeConfig, formatConfigError, LOCALES } from "./core/Config.js";
14
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
15
+ const CONFIG_FILENAMES = ['.cairnrc.json', '.cairnrc'];
16
+ /** Parse JSON, turning a syntax error into a clear, actionable message. */
17
+ export const parseRcJson = (text, file) => {
18
+ try {
19
+ return JSON.parse(text);
20
+ }
21
+ catch (error) {
22
+ throw new Error(`cairn: invalid JSON in ${file}: ${error.message}`, { cause: error });
23
+ }
24
+ };
25
+ /** Read the raw config plus the file it came from: an rc file, the package.json key, or null. */
26
+ const readRawConfig = (cwd, explicitPath) => {
27
+ const candidates = explicitPath ? [path.resolve(cwd, explicitPath)] : CONFIG_FILENAMES.map((f) => path.join(cwd, f));
28
+ for (const file of candidates) {
29
+ if (fs.existsSync(file)) {
30
+ return { file, raw: parseRcJson(fs.readFileSync(file, 'utf8'), file) };
31
+ }
32
+ }
33
+ const pkgPath = path.join(cwd, 'package.json');
34
+ if (fs.existsSync(pkgPath)) {
35
+ const pkg = parseRcJson(fs.readFileSync(pkgPath, 'utf8'), pkgPath);
36
+ if (isRecord(pkg) && isRecord(pkg['cairn'])) {
37
+ return { file: `${pkgPath}#cairn`, raw: pkg['cairn'] };
38
+ }
39
+ }
40
+ return null;
41
+ };
42
+ /** Resolve one `extends` specifier (a path, relative to the file that references it),
43
+ * folding it onto `acc` — the single running accumulator threaded through the *entire*
44
+ * resolution — and return the updated accumulator. `visited` (resolved absolute paths of
45
+ * every file in the chain so far) guards against a cycle: without it, `a` extends `b`
46
+ * extends `a` would recurse until the call stack overflows.
47
+ *
48
+ * Threading one accumulator (rather than resolving each `extends` target independently
49
+ * against `DEFAULT_CONFIG` and merging the fully-resolved results together) matters for
50
+ * correctness, not just style: a fully-resolved `ResolvedConfig` has every field
51
+ * populated — including fields a given target never actually set, now holding *its own*
52
+ * defaults — so merging two such snapshots together makes the second silently clobber
53
+ * every field the first one set, not just the ones it overrides. Every field assignment
54
+ * here instead goes through `layerConfig(acc, decoded)`, where `decoded` is always a
55
+ * genuine partial `CairnConfigInput` (only the fields that file actually specified), so
56
+ * "unset" and "set to the default" stay distinguishable all the way through. */
57
+ const resolveExtendsTarget = (cwd, specifier, fromFile, visited, acc) => {
58
+ const resolved = path.isAbsolute(specifier) ? specifier : path.resolve(path.dirname(fromFile), specifier);
59
+ if (!fs.existsSync(resolved)) {
60
+ throw new Error(`cairn: invalid config in ${fromFile}: extends target not found: ${specifier} (resolved to ${resolved})`);
61
+ }
62
+ if (visited.includes(resolved)) {
63
+ throw new Error(`cairn: invalid config in ${fromFile}: circular extends: ${[...visited, resolved].join(' -> ')}`);
64
+ }
65
+ return resolveLayer(cwd, parseRcJson(fs.readFileSync(resolved, 'utf8'), resolved), resolved, visited, acc);
66
+ };
67
+ /** Decode one raw layer, fold in its own `extends` chain (base presets applied first, in
68
+ * order, onto `acc`, then this layer's own fields last), and return the updated
69
+ * accumulator. `decodeConfig` is pure and total (it returns a `Left` on failure, never
70
+ * throws) — the edge is where that `Left` becomes a thrown, human-readable error. */
71
+ const resolveLayer = (cwd, raw, file, visited = [], acc = DEFAULT_CONFIG) => {
72
+ const result = decodeConfig(raw);
73
+ if (Either.isLeft(result)) {
74
+ throw new Error(formatConfigError(result.left, file));
75
+ }
76
+ const decoded = result.right;
77
+ const nextVisited = [...visited, file];
78
+ const withExtends = (decoded.extends ?? []).reduce((innerAcc, specifier) => resolveExtendsTarget(cwd, specifier, file, nextVisited, innerAcc), acc);
79
+ return layerConfig(withExtends, decoded);
80
+ };
81
+ /** Shown as provenance when no `.cairnrc(.json)` or `package.json#cairn` was found. */
82
+ export const DEFAULTS_SOURCE = 'defaults (no config found)';
83
+ /** Load the resolved config: defaults <- extends chain <- file/package.json <- CLI overrides,
84
+ * plus which file it came from (an rc file, `<package.json>#cairn`, or `DEFAULTS_SOURCE`).
85
+ * Powers the `cairn config` debug command's "why aren't my docs being checked" answer. */
86
+ export const loadConfigWithSource = (cwd, overrides = {}, explicitPath) => {
87
+ const found = readRawConfig(cwd, explicitPath);
88
+ const merged = found === null ? DEFAULT_CONFIG : resolveLayer(cwd, found.raw, found.file);
89
+ const config = {
90
+ ...merged,
91
+ ...(overrides.locale === undefined ? {} : { locale: overrides.locale }),
92
+ ...(overrides.roots === undefined || overrides.roots.length === 0 ? {} : { roots: overrides.roots }),
93
+ ...(overrides.thresholdLines === undefined ? {} : { thresholdLines: overrides.thresholdLines }),
94
+ };
95
+ return { config, sourceFile: found?.file ?? DEFAULTS_SOURCE };
96
+ };
97
+ /** Load just the resolved config: defaults <- extends chain <- file/package.json <- CLI overrides. */
98
+ export const loadConfig = (cwd, overrides = {}, explicitPath) => loadConfigWithSource(cwd, overrides, explicitPath).config;
99
+ const hasGlob = (segment) => segment.includes('*') || segment.includes('?');
100
+ /** Expand one root pattern (relative to `cwd`) into existing absolute directories. */
101
+ const expandOne = (cwd, pattern) => {
102
+ const segments = pattern.split('/').filter((s) => s.length > 0);
103
+ const isAbsolute = pattern.startsWith('/');
104
+ let current = [isAbsolute ? '/' : cwd];
105
+ for (const segment of segments) {
106
+ const next = [];
107
+ for (const dir of current) {
108
+ if (segment === '**') {
109
+ // Match this directory and any descendant directory.
110
+ next.push(dir, ...descendantDirs(dir));
111
+ continue;
112
+ }
113
+ if (!hasGlob(segment)) {
114
+ next.push(path.join(dir, segment));
115
+ continue;
116
+ }
117
+ const re = globToRegExp(segment);
118
+ for (const entry of readDirsSafe(dir)) {
119
+ if (re.test(entry)) {
120
+ next.push(path.join(dir, entry));
121
+ }
122
+ }
123
+ }
124
+ current = next;
125
+ }
126
+ return current.filter(isDir);
127
+ };
128
+ const isDir = (p) => {
129
+ try {
130
+ return fs.statSync(p).isDirectory();
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ };
136
+ // Never descend into these when expanding `**` — walking them is pointless and
137
+ // pathologically slow on real repositories.
138
+ const PRUNED_DIRS = new Set(['.git', 'node_modules']);
139
+ const readDirsSafe = (dir) => {
140
+ try {
141
+ return fs
142
+ .readdirSync(dir, { withFileTypes: true })
143
+ .filter((e) => e.isDirectory() && !PRUNED_DIRS.has(e.name))
144
+ .map((e) => e.name);
145
+ }
146
+ catch {
147
+ return [];
148
+ }
149
+ };
150
+ const descendantDirs = (dir) => {
151
+ const out = [];
152
+ for (const name of readDirsSafe(dir)) {
153
+ const child = path.join(dir, name);
154
+ out.push(child, ...descendantDirs(child));
155
+ }
156
+ return out;
157
+ };
158
+ /** Resolve all configured roots to a de-duplicated list of existing directories (POSIX). */
159
+ export const expandRoots = (cwd, patterns) => {
160
+ const seen = new Set();
161
+ for (const pattern of patterns) {
162
+ for (const dir of expandOne(cwd, pattern)) {
163
+ seen.add(toPosix(dir));
164
+ }
165
+ }
166
+ return [...seen];
167
+ };
168
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+DAA+D;AAC/D,oFAAoF;AACpF,iFAAiF;AACjF,wEAAwE;AACxE,2BAA2B;AAE3B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC/F,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAGzC,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE9G,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAEvH,MAAM,gBAAgB,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;AAEtD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,IAAY,EAAW,EAAE;IACjE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAA;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IAClG,CAAC;AACH,CAAC,CAAA;AAED,iGAAiG;AACjG,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,YAAqB,EAAyC,EAAE;IAClG,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;IACpH,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAA;QACxE,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;IAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;QAClE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAA;QACxD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED;;;;;;;;;;;;;;gFAcgF;AAChF,MAAM,oBAAoB,GAAG,CAC3B,GAAW,EACX,SAAiB,EACjB,QAAgB,EAChB,OAA0B,EAC1B,GAAmB,EACH,EAAE;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAA;IACzG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,+BAA+B,SAAS,iBAAiB,QAAQ,GAAG,CACzG,CAAA;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,uBAAuB,CAAC,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACnH,CAAC;IACD,OAAO,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;AAC5G,CAAC,CAAA;AAED;;;qFAGqF;AACrF,MAAM,YAAY,GAAG,CACnB,GAAW,EACX,GAAY,EACZ,IAAY,EACZ,UAA6B,EAAE,EAC/B,MAAsB,cAAc,EACpB,EAAE;IAClB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACvD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAA;IAC5B,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAChD,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,EAC1F,GAAG,CACJ,CAAA;IACD,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;AAC1C,CAAC,CAAA;AAOD,uFAAuF;AACvF,MAAM,CAAC,MAAM,eAAe,GAAG,4BAA4B,CAAA;AAE3D;;0FAE0F;AAC1F,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,GAAW,EACX,YAAuB,EAAE,EACzB,YAAqB,EACK,EAAE;IAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IACzF,MAAM,MAAM,GAAmB;QAC7B,GAAG,MAAM;QACT,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QACvE,GAAG,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;QACpG,GAAG,CAAC,SAAS,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC;KAChG,CAAA;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,IAAI,eAAe,EAAE,CAAA;AAC/D,CAAC,CAAA;AAED,sGAAsG;AACtG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,YAAuB,EAAE,EAAE,YAAqB,EAAkB,EAAE,CAC1G,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,MAAM,CAAA;AAE3D,MAAM,OAAO,GAAG,CAAC,OAAe,EAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAE5F,sFAAsF;AACtF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,OAAe,EAAY,EAAE;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,qDAAqD;gBACrD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtC,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;gBAClC,SAAQ;YACV,CAAC;YACD,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;YAChC,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,CAAS,EAAW,EAAE;IACnC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAA;AAED,+EAA+E;AAC/E,4CAA4C;AAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;AAErD,MAAM,YAAY,GAAG,CAAC,GAAW,EAAY,EAAE;IAC7C,IAAI,CAAC;QACH,OAAO,EAAE;aACN,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACzC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,GAAW,EAAY,EAAE;IAC/C,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAClC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,4FAA4F;AAC5F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,QAA2B,EAAY,EAAE;IAChF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAClB,CAAC,CAAA"}
@@ -0,0 +1,80 @@
1
+ import type { Either } from 'effect';
2
+ import { ParseResult, Schema } from 'effect';
3
+ import type { Naming } from './DocSummaries.ts';
4
+ /** The shape of a `.cairnrc.json` / `package.json#cairn` file, and of every `extends`
5
+ * target: every field optional, `checks`/`naming` deep-mergeable, unknown keys rejected.
6
+ * `$schema` is accepted-but-inert: it's the JSON Schema meta-property IDEs read for
7
+ * autocomplete (see scripts/generate-schema.ts) — not a cairn setting. */
8
+ export declare const CairnConfigSchema: Schema.Struct<{
9
+ $schema: Schema.optional<Schema.SchemaClass<string, string, never>>;
10
+ checks: Schema.optional<Schema.Struct<{
11
+ links: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
12
+ summaries: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
13
+ }>>;
14
+ extends: Schema.optional<Schema.transform<Schema.Union<[typeof Schema.String, Schema.Array$<typeof Schema.String>]>, Schema.Array$<typeof Schema.String>>>;
15
+ ignore: Schema.optional<Schema.Array$<typeof Schema.String>>;
16
+ locale: Schema.optional<Schema.Literal<["en", "fr"]>>;
17
+ naming: Schema.optional<Schema.Struct<{
18
+ dirSummary: Schema.optional<Schema.SchemaClass<string, string, never>>;
19
+ fileSummarySuffix: Schema.optional<Schema.SchemaClass<string, string, never>>;
20
+ }>>;
21
+ requireDirSummaries: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
22
+ roots: Schema.optional<Schema.Array$<typeof Schema.String>>;
23
+ stampCommand: Schema.optional<Schema.SchemaClass<string, string, never>>;
24
+ thresholdLines: Schema.optional<Schema.refine<number, Schema.filter<typeof Schema.Number>>>;
25
+ }>;
26
+ /** One decoded, still-partial config layer (a single file, before `extends` is folded in). */
27
+ export type CairnConfigInput = Schema.Schema.Type<typeof CairnConfigSchema>;
28
+ export interface ChecksConfig {
29
+ readonly links: boolean;
30
+ readonly summaries: boolean;
31
+ }
32
+ /** Report language. English is the default for broad reuse; French mirrors the tool's
33
+ * origin. Defined here (not in `program/locale.ts`, which re-exports it) because it's a
34
+ * config field type, and `core/` cannot depend on `program/` (the dependency points the
35
+ * other way: `program/` orchestrates IO around `core/`, never the reverse).
36
+ * Derived from `LocaleSchema.literals` so the type and the runtime list of valid values
37
+ * (e.g. the CLI's `--locale` choice list) can never drift apart. */
38
+ export declare const LOCALES: readonly ["en", "fr"];
39
+ export type Locale = (typeof LOCALES)[number];
40
+ /** Same reasoning as `Locale` above: `program/CheckSummaries.ts` needs this constant
41
+ * too, and it can't be defined there, since `core/` can't depend on `program/`. */
42
+ export declare const DEFAULT_STAMP_COMMAND = "npx cairn check --summaries-only --stamp";
43
+ export interface ResolvedConfig {
44
+ readonly checks: ChecksConfig;
45
+ readonly ignore: readonly string[];
46
+ readonly locale: Locale;
47
+ readonly naming: Naming;
48
+ readonly requireDirSummaries: boolean;
49
+ readonly roots: readonly string[];
50
+ readonly stampCommand: string;
51
+ readonly thresholdLines: number;
52
+ }
53
+ export interface Overrides {
54
+ readonly locale?: Locale;
55
+ readonly roots?: readonly string[];
56
+ readonly thresholdLines?: number;
57
+ }
58
+ export declare const DEFAULT_CONFIG: ResolvedConfig;
59
+ /** Strictly decode one raw (untrusted) config layer: unknown keys and wrong-typed values
60
+ * are rejected via a `Left` — never silently ignored or defaulted. Total and pure over
61
+ * its actual domain, any value `JSON.parse` can produce (the only inputs this module's
62
+ * callers ever pass, including circular-reference-free by construction): `effect/Schema`
63
+ * already hands back an `Either`, so collapsing it into a thrown exception here (as an
64
+ * earlier version of this function did) would be a purity leak inside a module
65
+ * documented as "no IO" — the throw/catch decision belongs to whichever caller is
66
+ * equipped to make it (the edge, in `../config.ts`), not to the decoder. (Not total over
67
+ * *every* JS value of type `unknown`: an object with a throwing property getter would
68
+ * still propagate that throw — out of scope for a config decoder, not worth the
69
+ * complexity of catching arbitrary property-access exceptions from a value no real
70
+ * caller constructs.) Formatting a `Left` for a human is a separate, equally pure
71
+ * concern (`formatConfigError`, below): decoding has no business knowing which file it
72
+ * came from — that's the caller's context, not the decoder's. */
73
+ export declare const decodeConfig: (raw: unknown) => Either.Either<CairnConfigInput, ParseResult.ParseError>;
74
+ /** Render a decode failure into a clear, actionable, file-scoped message. */
75
+ export declare const formatConfigError: (error: ParseResult.ParseError, file: string) => string;
76
+ /** Layer a decoded config over a resolved base: `checks`/`naming` deep-merge field by
77
+ * field, everything else replaces when present. Used for `extends` presets, the local
78
+ * file, and CLI overrides — always in "later wins" precedence order. */
79
+ export declare const layerConfig: (base: ResolvedConfig, layer: CairnConfigInput) => ResolvedConfig;
80
+ //# sourceMappingURL=Config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../../src/core/Config.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAiD/C;;;0EAG0E;AAC1E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;EA+B5B,CAAA;AAEF,8FAA8F;AAC9F,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;oEAKoE;AACpE,eAAO,MAAM,OAAO,uBAAwB,CAAA;AAC5C,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7C;mFACmF;AACnF,eAAO,MAAM,qBAAqB,6CAA6C,CAAA;AAE/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,eAAO,MAAM,cAAc,EAAE,cAS5B,CAAA;AAED;;;;;;;;;;;;;iEAaiE;AACjE,eAAO,MAAM,YAAY,GAAI,KAAK,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,WAAW,CAAC,UAAU,CACA,CAAA;AAElG,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,GAAI,OAAO,WAAW,CAAC,UAAU,EAAE,MAAM,MAAM,KAAG,MACU,CAAA;AAE1F;;wEAEwE;AACxE,eAAO,MAAM,WAAW,GAAI,MAAM,cAAc,EAAE,OAAO,gBAAgB,KAAG,cAgB1E,CAAA"}
@@ -0,0 +1,135 @@
1
+ // The config domain: shape, defaults, strict decode, and layering — pure decision
2
+ // logic, no IO. The impure edge (`../config.ts`) reads `.cairnrc(.json)` /
3
+ // `package.json`'s `cairn` key from disk and hands the raw JSON here.
4
+ //
5
+ // `CairnConfigSchema` is the single source of truth for: (1) the strict per-layer
6
+ // decode below, and (2) the JSON Schema shipped for editor autocomplete
7
+ // (`scripts/generate-schema.ts` -> `schema/cairn.schema.json`, via `JSONSchema.make`).
8
+ // Every field is optional (a config file only specifies what it overrides), but
9
+ // unknown keys and wrong-typed values are rejected with a clear, actionable error —
10
+ // never silently ignored. A config system that quietly falls back to defaults on a
11
+ // typo would undermine cairn's own thesis: it's a CI *guarantee*, and a guarantee
12
+ // that silently checks the wrong thing isn't one.
13
+ //
14
+ // This module uses `effect`'s `Schema`/`Either`/`ParseResult` — pure, synchronous,
15
+ // side-effect-free combinators (unlike `Effect`/`Layer`/`Runtime`, which represent
16
+ // the effectful, scheduled part of the library) — so it stays within `core/`'s "no
17
+ // IO" contract despite depending on `effect`.
18
+ import { ParseResult, Schema } from 'effect';
19
+ import { DEFAULT_NAMING, DEFAULT_THRESHOLD_LINES } from "./DocSummaries.js";
20
+ const ChecksInputSchema = Schema.Struct({
21
+ links: Schema.optional(Schema.Boolean.annotations({ description: 'Enable Markdown dead-link checking. Default true.' })),
22
+ summaries: Schema.optional(Schema.Boolean.annotations({
23
+ description: 'Enable summary freshness checking (content-hash based). Default true.',
24
+ })),
25
+ }).annotations({ description: 'Which checks `cairn check` runs.', identifier: 'CairnChecksConfig' });
26
+ const NamingInputSchema = Schema.Struct({
27
+ dirSummary: Schema.optional(Schema.String.annotations({ description: 'Directory summary filename. Default "_SUMMARY.md".' })),
28
+ fileSummarySuffix: Schema.optional(Schema.String.annotations({ description: 'Suffix for file summaries. Default ".summary.md".' })),
29
+ }).annotations({ description: 'Configurable filenames for the summary system.', identifier: 'CairnNamingConfig' });
30
+ const LocaleSchema = Schema.Literal('en', 'fr').annotations({
31
+ description: 'Prose locale for generated guidance and report strings. Default "en".',
32
+ });
33
+ // "Make illegal states unrepresentable": thresholdLines is compared as `lineCount >
34
+ // thresholdLines` (core/DocSummaries.ts) — negative or fractional values are nonsensical,
35
+ // not just unusual, so they're rejected at the schema level instead of quietly
36
+ // misbehaving downstream.
37
+ const ThresholdLinesSchema = Schema.Number.pipe(Schema.int(), Schema.nonNegative()).annotations({
38
+ description: 'Line count above which a file needs a summary. Non-negative integer. Default 30.',
39
+ });
40
+ // "Parse, don't validate": raw JSON may write a bare string OR an array (ergonomics —
41
+ // one preset shouldn't force array syntax), but the *decoded* value is always an array.
42
+ // The union is collapsed once, here, instead of every consumer re-deriving
43
+ // `Array.isArray(x) ? x : [x]` for itself.
44
+ const ExtendsInputSchema = Schema.Union(Schema.String, Schema.Array(Schema.String));
45
+ const ExtendsOutputSchema = Schema.Array(Schema.String);
46
+ const ExtendsSchema = Schema.transform(ExtendsInputSchema, ExtendsOutputSchema, {
47
+ decode: (value) => (Array.isArray(value) ? value : [value]),
48
+ encode: (value) => value,
49
+ }).annotations({
50
+ description: 'One or more config files (paths, relative to this file) to inherit from. Local fields win over inherited ones.',
51
+ });
52
+ /** The shape of a `.cairnrc.json` / `package.json#cairn` file, and of every `extends`
53
+ * target: every field optional, `checks`/`naming` deep-mergeable, unknown keys rejected.
54
+ * `$schema` is accepted-but-inert: it's the JSON Schema meta-property IDEs read for
55
+ * autocomplete (see scripts/generate-schema.ts) — not a cairn setting. */
56
+ export const CairnConfigSchema = Schema.Struct({
57
+ $schema: Schema.optional(Schema.String.annotations({ description: 'JSON Schema URL for editor autocomplete/validation. Ignored by cairn.' })),
58
+ checks: Schema.optional(ChecksInputSchema),
59
+ extends: Schema.optional(ExtendsSchema),
60
+ ignore: Schema.optional(Schema.Array(Schema.String).annotations({
61
+ description: 'Globs to exclude from scanning. Default ["**/node_modules/**"].',
62
+ })),
63
+ locale: Schema.optional(LocaleSchema),
64
+ naming: Schema.optional(NamingInputSchema),
65
+ requireDirSummaries: Schema.optional(Schema.Boolean.annotations({
66
+ description: 'Require a directory summary in every in-scope directory. Default true.',
67
+ })),
68
+ roots: Schema.optional(Schema.Array(Schema.String).annotations({
69
+ description: 'Documentation roots to scan (globs allowed). Default ["docs"].',
70
+ })),
71
+ stampCommand: Schema.optional(Schema.String.annotations({ description: 'Command agents should run to stamp hashes after editing docs.' })),
72
+ thresholdLines: Schema.optional(ThresholdLinesSchema),
73
+ }).annotations({
74
+ description: 'Configuration for the cairn CLI (.cairnrc.json, .cairnrc, or the "cairn" key of package.json).',
75
+ identifier: 'CairnConfig',
76
+ title: 'cairn configuration',
77
+ });
78
+ /** Report language. English is the default for broad reuse; French mirrors the tool's
79
+ * origin. Defined here (not in `program/locale.ts`, which re-exports it) because it's a
80
+ * config field type, and `core/` cannot depend on `program/` (the dependency points the
81
+ * other way: `program/` orchestrates IO around `core/`, never the reverse).
82
+ * Derived from `LocaleSchema.literals` so the type and the runtime list of valid values
83
+ * (e.g. the CLI's `--locale` choice list) can never drift apart. */
84
+ export const LOCALES = LocaleSchema.literals;
85
+ /** Same reasoning as `Locale` above: `program/CheckSummaries.ts` needs this constant
86
+ * too, and it can't be defined there, since `core/` can't depend on `program/`. */
87
+ export const DEFAULT_STAMP_COMMAND = 'npx cairn check --summaries-only --stamp';
88
+ export const DEFAULT_CONFIG = {
89
+ checks: { links: true, summaries: true },
90
+ ignore: ['**/node_modules/**'],
91
+ locale: 'en',
92
+ naming: DEFAULT_NAMING,
93
+ requireDirSummaries: true,
94
+ roots: ['docs'],
95
+ stampCommand: DEFAULT_STAMP_COMMAND,
96
+ thresholdLines: DEFAULT_THRESHOLD_LINES,
97
+ };
98
+ /** Strictly decode one raw (untrusted) config layer: unknown keys and wrong-typed values
99
+ * are rejected via a `Left` — never silently ignored or defaulted. Total and pure over
100
+ * its actual domain, any value `JSON.parse` can produce (the only inputs this module's
101
+ * callers ever pass, including circular-reference-free by construction): `effect/Schema`
102
+ * already hands back an `Either`, so collapsing it into a thrown exception here (as an
103
+ * earlier version of this function did) would be a purity leak inside a module
104
+ * documented as "no IO" — the throw/catch decision belongs to whichever caller is
105
+ * equipped to make it (the edge, in `../config.ts`), not to the decoder. (Not total over
106
+ * *every* JS value of type `unknown`: an object with a throwing property getter would
107
+ * still propagate that throw — out of scope for a config decoder, not worth the
108
+ * complexity of catching arbitrary property-access exceptions from a value no real
109
+ * caller constructs.) Formatting a `Left` for a human is a separate, equally pure
110
+ * concern (`formatConfigError`, below): decoding has no business knowing which file it
111
+ * came from — that's the caller's context, not the decoder's. */
112
+ export const decodeConfig = (raw) => Schema.decodeUnknownEither(CairnConfigSchema, { errors: 'all', onExcessProperty: 'error' })(raw);
113
+ /** Render a decode failure into a clear, actionable, file-scoped message. */
114
+ export const formatConfigError = (error, file) => `cairn: invalid config in ${file}:\n${ParseResult.TreeFormatter.formatErrorSync(error)}`;
115
+ /** Layer a decoded config over a resolved base: `checks`/`naming` deep-merge field by
116
+ * field, everything else replaces when present. Used for `extends` presets, the local
117
+ * file, and CLI overrides — always in "later wins" precedence order. */
118
+ export const layerConfig = (base, layer) => ({
119
+ ...base,
120
+ ...(layer.ignore === undefined ? {} : { ignore: layer.ignore }),
121
+ ...(layer.locale === undefined ? {} : { locale: layer.locale }),
122
+ ...(layer.requireDirSummaries === undefined ? {} : { requireDirSummaries: layer.requireDirSummaries }),
123
+ ...(layer.roots === undefined ? {} : { roots: layer.roots }),
124
+ ...(layer.stampCommand === undefined ? {} : { stampCommand: layer.stampCommand }),
125
+ ...(layer.thresholdLines === undefined ? {} : { thresholdLines: layer.thresholdLines }),
126
+ checks: {
127
+ links: layer.checks?.links ?? base.checks.links,
128
+ summaries: layer.checks?.summaries ?? base.checks.summaries,
129
+ },
130
+ naming: {
131
+ dirSummary: layer.naming?.dirSummary ?? base.naming.dirSummary,
132
+ fileSummarySuffix: layer.naming?.fileSummarySuffix ?? base.naming.fileSummarySuffix,
133
+ },
134
+ });
135
+ //# sourceMappingURL=Config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/core/Config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export type SummaryStatus = 'missing' | 'ok' | 'stale';
2
+ /** Configurable filenames for the summary system. */
3
+ export interface Naming {
4
+ /** Per-directory digest filename, e.g. `_SUMMARY.md`. */
5
+ readonly dirSummary: string;
6
+ /** Sibling file-summary suffix, e.g. `.summary.md` (`foo.md` -> `foo.summary.md`). */
7
+ readonly fileSummarySuffix: string;
8
+ }
9
+ /** Defaults matching the original hard-coded convention. */
10
+ export declare const DEFAULT_NAMING: Naming;
11
+ export interface NeedsSummaryArgs {
12
+ readonly lineCount: number;
13
+ readonly naming?: Naming;
14
+ readonly path: string;
15
+ readonly thresholdLines: number;
16
+ }
17
+ export interface ClassifyArgs {
18
+ readonly recordedHash: string | null;
19
+ readonly sourceHash: string;
20
+ readonly summaryExists: boolean;
21
+ }
22
+ /** A Markdown file with more lines than this must carry a summary. */
23
+ export declare const DEFAULT_THRESHOLD_LINES = 30;
24
+ /** Count lines, ignoring a single trailing newline. */
25
+ export declare const countLines: (content: string) => number;
26
+ /** True for the generated summary files themselves. */
27
+ export declare const isSummaryFile: (path: string, naming?: Naming) => boolean;
28
+ /** `docs/a/foo.md` -> `docs/a/foo.summary.md` (suffix configurable). */
29
+ export declare const summaryPathFor: (path: string, naming?: Naming) => string;
30
+ /** A non-summary Markdown file longer than the threshold must have a summary. */
31
+ export declare const needsSummary: ({ lineCount, naming, path, thresholdLines, }: NeedsSummaryArgs) => boolean;
32
+ /** Deterministic content hash used to stamp and verify summaries. */
33
+ export declare const hashContent: (content: string) => string;
34
+ /** The HTML-comment stamp a summary must carry to declare which source it reflects. */
35
+ export declare const sourceHashTag: (hash: string) => string;
36
+ /** Read back the source hash recorded in a summary, or null if absent. */
37
+ export declare const extractSourceHash: (summaryContent: string) => string | null;
38
+ /** Return the summary content stamped with `hash` (replacing any existing stamp). */
39
+ export declare const withSourceHash: (summaryContent: string, hash: string) => string;
40
+ /** Classify a summary: missing, stale (hash absent or mismatched) or ok. */
41
+ export declare const classifySummary: ({ recordedHash, sourceHash, summaryExists }: ClassifyArgs) => SummaryStatus;
42
+ //# sourceMappingURL=DocSummaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocSummaries.d.ts","sourceRoot":"","sources":["../../src/core/DocSummaries.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAA;AAEtD,qDAAqD;AACrD,MAAM,WAAW,MAAM;IACrB,yDAAyD;IACzD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,sFAAsF;IACtF,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CACnC;AAED,4DAA4D;AAC5D,eAAO,MAAM,cAAc,EAAE,MAG5B,CAAA;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;CAChC;AAED,sEAAsE;AACtE,eAAO,MAAM,uBAAuB,KAAK,CAAA;AAIzC,uDAAuD;AACvD,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,KAAG,MAM5C,CAAA;AAED,uDAAuD;AACvD,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,SAAQ,MAAuB,KAAG,OACrC,CAAA;AAEzC,wEAAwE;AACxE,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,EAAE,SAAQ,MAAuB,KAAG,MAC9B,CAAA;AAEjD,iFAAiF;AACjF,eAAO,MAAM,YAAY,GAAI,8CAK1B,gBAAgB,KAAG,OAQrB,CAAA;AAMD,qEAAqE;AACrE,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,KAAG,MAA2C,CAAA;AAEzF,uFAAuF;AACvF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAA2C,CAAA;AAExF,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,GAAI,gBAAgB,MAAM,KAAG,MAAM,GAAG,IAAiD,CAAA;AAErH,qFAAqF;AACrF,eAAO,MAAM,cAAc,GAAI,gBAAgB,MAAM,EAAE,MAAM,MAAM,KAAG,MAMrE,CAAA;AAED,4EAA4E;AAC5E,eAAO,MAAM,eAAe,GAAI,6CAA6C,YAAY,KAAG,aAQ3F,CAAA"}
@@ -0,0 +1,74 @@
1
+ // Pure, IO-free helpers for the "big files carry a fresher .summary.md" rule.
2
+ // Convention: a Markdown file of more than `thresholdLines` lines must have a
3
+ // sibling `X<suffix>` (default `X.summary.md`) that reflects the CURRENT content
4
+ // of `X.md` — a faster-to-read version kept in sync.
5
+ //
6
+ // Freshness is enforced by a content hash, NOT by filesystem mtime: git does not
7
+ // preserve mtimes, so after a clone/checkout (e.g. in CI) every file shares the
8
+ // same timestamp and a time-based check silently passes on stale summaries.
9
+ // Each summary embeds `<!-- source-sha256: ... -->`; the checker recomputes the
10
+ // source hash and flags any mismatch. Deterministic and clone-independent.
11
+ //
12
+ // Naming (directory-summary filename, file-summary suffix) is configurable; the
13
+ // defaults below reproduce the original behaviour. Unit-tested in
14
+ // DocSummaries.unit.test.ts; the Effect program is in ../program/CheckSummaries.ts.
15
+ import { hash as hashHex } from 'node:crypto';
16
+ /** Defaults matching the original hard-coded convention. */
17
+ export const DEFAULT_NAMING = {
18
+ dirSummary: '_SUMMARY.md',
19
+ fileSummarySuffix: '.summary.md',
20
+ };
21
+ /** A Markdown file with more lines than this must carry a summary. */
22
+ export const DEFAULT_THRESHOLD_LINES = 30;
23
+ const HASH_RE = /<!--\s*source-sha256:\s*([a-f0-9]{64})\s*-->/;
24
+ /** Count lines, ignoring a single trailing newline. */
25
+ export const countLines = (content) => {
26
+ const lines = content.split('\n');
27
+ if (lines.at(-1) === '') {
28
+ lines.pop();
29
+ }
30
+ return lines.length;
31
+ };
32
+ /** True for the generated summary files themselves. */
33
+ export const isSummaryFile = (path, naming = DEFAULT_NAMING) => path.endsWith(naming.fileSummarySuffix);
34
+ /** `docs/a/foo.md` -> `docs/a/foo.summary.md` (suffix configurable). */
35
+ export const summaryPathFor = (path, naming = DEFAULT_NAMING) => path.replace(/\.md$/, naming.fileSummarySuffix);
36
+ /** A non-summary Markdown file longer than the threshold must have a summary. */
37
+ export const needsSummary = ({ lineCount, naming = DEFAULT_NAMING, path, thresholdLines, }) => {
38
+ if (!path.endsWith('.md')) {
39
+ return false;
40
+ }
41
+ if (isSummaryFile(path, naming)) {
42
+ return false;
43
+ }
44
+ return lineCount > thresholdLines;
45
+ };
46
+ // One-shot `crypto.hash` (Node >=20.12) skips the streaming Hash object's
47
+ // internal state entirely — faster than `createHash().update().digest()` for
48
+ // the KB-sized markdown content this hashes, at the scale this runs at (once
49
+ // per file/manifest per plan).
50
+ /** Deterministic content hash used to stamp and verify summaries. */
51
+ export const hashContent = (content) => hashHex('sha256', content, 'hex');
52
+ /** The HTML-comment stamp a summary must carry to declare which source it reflects. */
53
+ export const sourceHashTag = (hash) => `<!-- source-sha256: ${hash} -->`;
54
+ /** Read back the source hash recorded in a summary, or null if absent. */
55
+ export const extractSourceHash = (summaryContent) => HASH_RE.exec(summaryContent)?.[1] ?? null;
56
+ /** Return the summary content stamped with `hash` (replacing any existing stamp). */
57
+ export const withSourceHash = (summaryContent, hash) => {
58
+ const tag = sourceHashTag(hash);
59
+ if (HASH_RE.test(summaryContent)) {
60
+ return summaryContent.replace(HASH_RE, tag);
61
+ }
62
+ return `${tag}\n\n${summaryContent}`;
63
+ };
64
+ /** Classify a summary: missing, stale (hash absent or mismatched) or ok. */
65
+ export const classifySummary = ({ recordedHash, sourceHash, summaryExists }) => {
66
+ if (!summaryExists) {
67
+ return 'missing';
68
+ }
69
+ if (recordedHash !== sourceHash) {
70
+ return 'stale';
71
+ }
72
+ return 'ok';
73
+ };
74
+ //# sourceMappingURL=DocSummaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocSummaries.js","sourceRoot":"","sources":["../../src/core/DocSummaries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MarkdownLinks.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownLinks.bench.d.ts","sourceRoot":"","sources":["../../src/core/MarkdownLinks.bench.ts"],"names":[],"mappings":""}