@principled/cairn 1.0.0-beta

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 (313) hide show
  1. package/README.md +182 -0
  2. package/dist/analysis/analyzer.d.ts +13 -0
  3. package/dist/analysis/analyzer.d.ts.map +1 -0
  4. package/dist/analysis/analyzer.js +47 -0
  5. package/dist/analysis/analyzer.js.map +1 -0
  6. package/dist/analysis/embedding-provider.d.ts +12 -0
  7. package/dist/analysis/embedding-provider.d.ts.map +1 -0
  8. package/dist/analysis/embedding-provider.js +21 -0
  9. package/dist/analysis/embedding-provider.js.map +1 -0
  10. package/dist/analysis/index.d.ts +4 -0
  11. package/dist/analysis/index.d.ts.map +1 -0
  12. package/dist/analysis/index.js +4 -0
  13. package/dist/analysis/index.js.map +1 -0
  14. package/dist/analysis/stub-provider.d.ts +12 -0
  15. package/dist/analysis/stub-provider.d.ts.map +1 -0
  16. package/dist/analysis/stub-provider.js +30 -0
  17. package/dist/analysis/stub-provider.js.map +1 -0
  18. package/dist/catalog/catalog.d.ts +40 -0
  19. package/dist/catalog/catalog.d.ts.map +1 -0
  20. package/dist/catalog/catalog.js +118 -0
  21. package/dist/catalog/catalog.js.map +1 -0
  22. package/dist/catalog/category-merger.d.ts +25 -0
  23. package/dist/catalog/category-merger.d.ts.map +1 -0
  24. package/dist/catalog/category-merger.js +75 -0
  25. package/dist/catalog/category-merger.js.map +1 -0
  26. package/dist/catalog/index.d.ts +4 -0
  27. package/dist/catalog/index.d.ts.map +1 -0
  28. package/dist/catalog/index.js +4 -0
  29. package/dist/catalog/index.js.map +1 -0
  30. package/dist/catalog/post-merge-validation.d.ts +7 -0
  31. package/dist/catalog/post-merge-validation.d.ts.map +1 -0
  32. package/dist/catalog/post-merge-validation.js +59 -0
  33. package/dist/catalog/post-merge-validation.js.map +1 -0
  34. package/dist/cli/commands/add.d.ts +3 -0
  35. package/dist/cli/commands/add.d.ts.map +1 -0
  36. package/dist/cli/commands/add.js +107 -0
  37. package/dist/cli/commands/add.js.map +1 -0
  38. package/dist/cli/commands/analyze.d.ts +3 -0
  39. package/dist/cli/commands/analyze.d.ts.map +1 -0
  40. package/dist/cli/commands/analyze.js +44 -0
  41. package/dist/cli/commands/analyze.js.map +1 -0
  42. package/dist/cli/commands/diff.d.ts +3 -0
  43. package/dist/cli/commands/diff.d.ts.map +1 -0
  44. package/dist/cli/commands/diff.js +69 -0
  45. package/dist/cli/commands/diff.js.map +1 -0
  46. package/dist/cli/commands/edit.d.ts +3 -0
  47. package/dist/cli/commands/edit.d.ts.map +1 -0
  48. package/dist/cli/commands/edit.js +93 -0
  49. package/dist/cli/commands/edit.js.map +1 -0
  50. package/dist/cli/commands/export.d.ts +3 -0
  51. package/dist/cli/commands/export.d.ts.map +1 -0
  52. package/dist/cli/commands/export.js +46 -0
  53. package/dist/cli/commands/export.js.map +1 -0
  54. package/dist/cli/commands/init.d.ts +3 -0
  55. package/dist/cli/commands/init.d.ts.map +1 -0
  56. package/dist/cli/commands/init.js +21 -0
  57. package/dist/cli/commands/init.js.map +1 -0
  58. package/dist/cli/commands/inspect.d.ts +3 -0
  59. package/dist/cli/commands/inspect.d.ts.map +1 -0
  60. package/dist/cli/commands/inspect.js +153 -0
  61. package/dist/cli/commands/inspect.js.map +1 -0
  62. package/dist/cli/commands/query.d.ts +3 -0
  63. package/dist/cli/commands/query.d.ts.map +1 -0
  64. package/dist/cli/commands/query.js +77 -0
  65. package/dist/cli/commands/query.js.map +1 -0
  66. package/dist/cli/commands/review.d.ts +3 -0
  67. package/dist/cli/commands/review.d.ts.map +1 -0
  68. package/dist/cli/commands/review.js +118 -0
  69. package/dist/cli/commands/review.js.map +1 -0
  70. package/dist/cli/commands/validate.d.ts +3 -0
  71. package/dist/cli/commands/validate.d.ts.map +1 -0
  72. package/dist/cli/commands/validate.js +125 -0
  73. package/dist/cli/commands/validate.js.map +1 -0
  74. package/dist/cli/helpers.d.ts +24 -0
  75. package/dist/cli/helpers.d.ts.map +1 -0
  76. package/dist/cli/helpers.js +152 -0
  77. package/dist/cli/helpers.js.map +1 -0
  78. package/dist/cli/index.d.ts +3 -0
  79. package/dist/cli/index.d.ts.map +1 -0
  80. package/dist/cli/index.js +34 -0
  81. package/dist/cli/index.js.map +1 -0
  82. package/dist/config/index.d.ts +5 -0
  83. package/dist/config/index.d.ts.map +1 -0
  84. package/dist/config/index.js +3 -0
  85. package/dist/config/index.js.map +1 -0
  86. package/dist/config/loader.d.ts +45 -0
  87. package/dist/config/loader.d.ts.map +1 -0
  88. package/dist/config/loader.js +201 -0
  89. package/dist/config/loader.js.map +1 -0
  90. package/dist/config/schema.d.ts +37 -0
  91. package/dist/config/schema.d.ts.map +1 -0
  92. package/dist/config/schema.js +42 -0
  93. package/dist/config/schema.js.map +1 -0
  94. package/dist/data/data/defaults.yaml +101 -0
  95. package/dist/data/defaults.yaml +101 -0
  96. package/dist/errors.d.ts +45 -0
  97. package/dist/errors.d.ts.map +1 -0
  98. package/dist/errors.js +84 -0
  99. package/dist/errors.js.map +1 -0
  100. package/dist/exporters/base.d.ts +17 -0
  101. package/dist/exporters/base.d.ts.map +1 -0
  102. package/dist/exporters/base.js +7 -0
  103. package/dist/exporters/base.js.map +1 -0
  104. package/dist/exporters/csv-exporter.d.ts +13 -0
  105. package/dist/exporters/csv-exporter.d.ts.map +1 -0
  106. package/dist/exporters/csv-exporter.js +73 -0
  107. package/dist/exporters/csv-exporter.js.map +1 -0
  108. package/dist/exporters/dot-exporter.d.ts +12 -0
  109. package/dist/exporters/dot-exporter.d.ts.map +1 -0
  110. package/dist/exporters/dot-exporter.js +72 -0
  111. package/dist/exporters/dot-exporter.js.map +1 -0
  112. package/dist/exporters/index.d.ts +8 -0
  113. package/dist/exporters/index.d.ts.map +1 -0
  114. package/dist/exporters/index.js +8 -0
  115. package/dist/exporters/index.js.map +1 -0
  116. package/dist/exporters/json-exporter.d.ts +14 -0
  117. package/dist/exporters/json-exporter.d.ts.map +1 -0
  118. package/dist/exporters/json-exporter.js +41 -0
  119. package/dist/exporters/json-exporter.js.map +1 -0
  120. package/dist/exporters/markdown-exporter.d.ts +14 -0
  121. package/dist/exporters/markdown-exporter.d.ts.map +1 -0
  122. package/dist/exporters/markdown-exporter.js +65 -0
  123. package/dist/exporters/markdown-exporter.js.map +1 -0
  124. package/dist/exporters/registry.d.ts +4 -0
  125. package/dist/exporters/registry.d.ts.map +1 -0
  126. package/dist/exporters/registry.js +20 -0
  127. package/dist/exporters/registry.js.map +1 -0
  128. package/dist/exporters/sqlite-exporter.d.ts +10 -0
  129. package/dist/exporters/sqlite-exporter.d.ts.map +1 -0
  130. package/dist/exporters/sqlite-exporter.js +20 -0
  131. package/dist/exporters/sqlite-exporter.js.map +1 -0
  132. package/dist/index.d.ts +13 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +14 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/inheritance/alias-resolver.d.ts +21 -0
  137. package/dist/inheritance/alias-resolver.d.ts.map +1 -0
  138. package/dist/inheritance/alias-resolver.js +40 -0
  139. package/dist/inheritance/alias-resolver.js.map +1 -0
  140. package/dist/inheritance/index.d.ts +9 -0
  141. package/dist/inheritance/index.d.ts.map +1 -0
  142. package/dist/inheritance/index.js +5 -0
  143. package/dist/inheritance/index.js.map +1 -0
  144. package/dist/inheritance/inheritance-resolver.d.ts +37 -0
  145. package/dist/inheritance/inheritance-resolver.d.ts.map +1 -0
  146. package/dist/inheritance/inheritance-resolver.js +164 -0
  147. package/dist/inheritance/inheritance-resolver.js.map +1 -0
  148. package/dist/inheritance/reference-parser.d.ts +27 -0
  149. package/dist/inheritance/reference-parser.d.ts.map +1 -0
  150. package/dist/inheritance/reference-parser.js +74 -0
  151. package/dist/inheritance/reference-parser.js.map +1 -0
  152. package/dist/inheritance/source-resolver.d.ts +29 -0
  153. package/dist/inheritance/source-resolver.d.ts.map +1 -0
  154. package/dist/inheritance/source-resolver.js +87 -0
  155. package/dist/inheritance/source-resolver.js.map +1 -0
  156. package/dist/model/category-registry.d.ts +48 -0
  157. package/dist/model/category-registry.d.ts.map +1 -0
  158. package/dist/model/category-registry.js +83 -0
  159. package/dist/model/category-registry.js.map +1 -0
  160. package/dist/model/document-meta.d.ts +38 -0
  161. package/dist/model/document-meta.d.ts.map +1 -0
  162. package/dist/model/document-meta.js +62 -0
  163. package/dist/model/document-meta.js.map +1 -0
  164. package/dist/model/document-parser.d.ts +17 -0
  165. package/dist/model/document-parser.d.ts.map +1 -0
  166. package/dist/model/document-parser.js +66 -0
  167. package/dist/model/document-parser.js.map +1 -0
  168. package/dist/model/document.d.ts +27 -0
  169. package/dist/model/document.d.ts.map +1 -0
  170. package/dist/model/document.js +42 -0
  171. package/dist/model/document.js.map +1 -0
  172. package/dist/model/element.d.ts +51 -0
  173. package/dist/model/element.d.ts.map +1 -0
  174. package/dist/model/element.js +78 -0
  175. package/dist/model/element.js.map +1 -0
  176. package/dist/model/graph.d.ts +42 -0
  177. package/dist/model/graph.d.ts.map +1 -0
  178. package/dist/model/graph.js +177 -0
  179. package/dist/model/graph.js.map +1 -0
  180. package/dist/model/index.d.ts +8 -0
  181. package/dist/model/index.d.ts.map +1 -0
  182. package/dist/model/index.js +7 -0
  183. package/dist/model/index.js.map +1 -0
  184. package/dist/parsers/base.d.ts +28 -0
  185. package/dist/parsers/base.d.ts.map +1 -0
  186. package/dist/parsers/base.js +19 -0
  187. package/dist/parsers/base.js.map +1 -0
  188. package/dist/parsers/index.d.ts +6 -0
  189. package/dist/parsers/index.d.ts.map +1 -0
  190. package/dist/parsers/index.js +6 -0
  191. package/dist/parsers/index.js.map +1 -0
  192. package/dist/parsers/markdown-parser.d.ts +12 -0
  193. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  194. package/dist/parsers/markdown-parser.js +37 -0
  195. package/dist/parsers/markdown-parser.js.map +1 -0
  196. package/dist/parsers/registry.d.ts +11 -0
  197. package/dist/parsers/registry.d.ts.map +1 -0
  198. package/dist/parsers/registry.js +21 -0
  199. package/dist/parsers/registry.js.map +1 -0
  200. package/dist/parsers/typescript-parser.d.ts +12 -0
  201. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  202. package/dist/parsers/typescript-parser.js +74 -0
  203. package/dist/parsers/typescript-parser.js.map +1 -0
  204. package/dist/parsers/yaml-parser.d.ts +12 -0
  205. package/dist/parsers/yaml-parser.d.ts.map +1 -0
  206. package/dist/parsers/yaml-parser.js +30 -0
  207. package/dist/parsers/yaml-parser.js.map +1 -0
  208. package/dist/provenance/index.d.ts +5 -0
  209. package/dist/provenance/index.d.ts.map +1 -0
  210. package/dist/provenance/index.js +4 -0
  211. package/dist/provenance/index.js.map +1 -0
  212. package/dist/provenance/review-hash.d.ts +11 -0
  213. package/dist/provenance/review-hash.d.ts.map +1 -0
  214. package/dist/provenance/review-hash.js +18 -0
  215. package/dist/provenance/review-hash.js.map +1 -0
  216. package/dist/provenance/schemas.d.ts +36 -0
  217. package/dist/provenance/schemas.d.ts.map +1 -0
  218. package/dist/provenance/schemas.js +26 -0
  219. package/dist/provenance/schemas.js.map +1 -0
  220. package/dist/provenance/staleness.d.ts +12 -0
  221. package/dist/provenance/staleness.d.ts.map +1 -0
  222. package/dist/provenance/staleness.js +46 -0
  223. package/dist/provenance/staleness.js.map +1 -0
  224. package/dist/refs/git-diff-tracer.d.ts +35 -0
  225. package/dist/refs/git-diff-tracer.d.ts.map +1 -0
  226. package/dist/refs/git-diff-tracer.js +143 -0
  227. package/dist/refs/git-diff-tracer.js.map +1 -0
  228. package/dist/schema/build-schema.d.ts +15 -0
  229. package/dist/schema/build-schema.d.ts.map +1 -0
  230. package/dist/schema/build-schema.js +83 -0
  231. package/dist/schema/build-schema.js.map +1 -0
  232. package/dist/schema/category-definition.d.ts +41 -0
  233. package/dist/schema/category-definition.d.ts.map +1 -0
  234. package/dist/schema/category-definition.js +22 -0
  235. package/dist/schema/category-definition.js.map +1 -0
  236. package/dist/schema/combined-schema.d.ts +17 -0
  237. package/dist/schema/combined-schema.d.ts.map +1 -0
  238. package/dist/schema/combined-schema.js +23 -0
  239. package/dist/schema/combined-schema.js.map +1 -0
  240. package/dist/schema/datetime.d.ts +11 -0
  241. package/dist/schema/datetime.d.ts.map +1 -0
  242. package/dist/schema/datetime.js +81 -0
  243. package/dist/schema/datetime.js.map +1 -0
  244. package/dist/schema/defaults-loader.d.ts +21 -0
  245. package/dist/schema/defaults-loader.d.ts.map +1 -0
  246. package/dist/schema/defaults-loader.js +55 -0
  247. package/dist/schema/defaults-loader.js.map +1 -0
  248. package/dist/schema/field-schema.d.ts +23 -0
  249. package/dist/schema/field-schema.d.ts.map +1 -0
  250. package/dist/schema/field-schema.js +18 -0
  251. package/dist/schema/field-schema.js.map +1 -0
  252. package/dist/schema/index.d.ts +17 -0
  253. package/dist/schema/index.d.ts.map +1 -0
  254. package/dist/schema/index.js +17 -0
  255. package/dist/schema/index.js.map +1 -0
  256. package/dist/schema/reserved-fields.d.ts +32 -0
  257. package/dist/schema/reserved-fields.d.ts.map +1 -0
  258. package/dist/schema/reserved-fields.js +42 -0
  259. package/dist/schema/reserved-fields.js.map +1 -0
  260. package/dist/schema/types.d.ts +7 -0
  261. package/dist/schema/types.d.ts.map +1 -0
  262. package/dist/schema/types.js +9 -0
  263. package/dist/schema/types.js.map +1 -0
  264. package/dist/utils/logger.d.ts +7 -0
  265. package/dist/utils/logger.d.ts.map +1 -0
  266. package/dist/utils/logger.js +16 -0
  267. package/dist/utils/logger.js.map +1 -0
  268. package/dist/utils/project-root.d.ts +14 -0
  269. package/dist/utils/project-root.d.ts.map +1 -0
  270. package/dist/utils/project-root.js +48 -0
  271. package/dist/utils/project-root.js.map +1 -0
  272. package/dist/validation/diagnostic.d.ts +23 -0
  273. package/dist/validation/diagnostic.d.ts.map +1 -0
  274. package/dist/validation/diagnostic.js +5 -0
  275. package/dist/validation/diagnostic.js.map +1 -0
  276. package/dist/validation/index.d.ts +6 -0
  277. package/dist/validation/index.d.ts.map +1 -0
  278. package/dist/validation/index.js +4 -0
  279. package/dist/validation/index.js.map +1 -0
  280. package/dist/validation/passes/coverage-pass.d.ts +10 -0
  281. package/dist/validation/passes/coverage-pass.d.ts.map +1 -0
  282. package/dist/validation/passes/coverage-pass.js +99 -0
  283. package/dist/validation/passes/coverage-pass.js.map +1 -0
  284. package/dist/validation/passes/index.d.ts +6 -0
  285. package/dist/validation/passes/index.d.ts.map +1 -0
  286. package/dist/validation/passes/index.js +19 -0
  287. package/dist/validation/passes/index.js.map +1 -0
  288. package/dist/validation/passes/schema-pass.d.ts +12 -0
  289. package/dist/validation/passes/schema-pass.d.ts.map +1 -0
  290. package/dist/validation/passes/schema-pass.js +38 -0
  291. package/dist/validation/passes/schema-pass.js.map +1 -0
  292. package/dist/validation/passes/semantic-pass.d.ts +8 -0
  293. package/dist/validation/passes/semantic-pass.d.ts.map +1 -0
  294. package/dist/validation/passes/semantic-pass.js +126 -0
  295. package/dist/validation/passes/semantic-pass.js.map +1 -0
  296. package/dist/validation/passes/structural-pass.d.ts +8 -0
  297. package/dist/validation/passes/structural-pass.d.ts.map +1 -0
  298. package/dist/validation/passes/structural-pass.js +150 -0
  299. package/dist/validation/passes/structural-pass.js.map +1 -0
  300. package/dist/validation/passes/traceability-pass.d.ts +9 -0
  301. package/dist/validation/passes/traceability-pass.d.ts.map +1 -0
  302. package/dist/validation/passes/traceability-pass.js +87 -0
  303. package/dist/validation/passes/traceability-pass.js.map +1 -0
  304. package/dist/validation/passes/user-rules-pass.d.ts +9 -0
  305. package/dist/validation/passes/user-rules-pass.d.ts.map +1 -0
  306. package/dist/validation/passes/user-rules-pass.js +72 -0
  307. package/dist/validation/passes/user-rules-pass.js.map +1 -0
  308. package/dist/validation/runner.d.ts +17 -0
  309. package/dist/validation/runner.d.ts.map +1 -0
  310. package/dist/validation/runner.js +33 -0
  311. package/dist/validation/runner.js.map +1 -0
  312. package/package.json +43 -0
  313. package/src/data/defaults.yaml +101 -0
@@ -0,0 +1,152 @@
1
+ import { loadConfig } from '../config/loader.js';
2
+ import { loadDefaults } from '../schema/defaults-loader.js';
3
+ import { CategoryRegistry } from '../model/category-registry.js';
4
+ import { parseDocument } from '../model/document-parser.js';
5
+ import { resolveInheritance } from '../inheritance/inheritance-resolver.js';
6
+ import { Catalog } from '../catalog/catalog.js';
7
+ import { setVerbosity, logv } from '../utils/logger.js';
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ /**
11
+ * Parse global options from a Commander command into LoadConfigOptions.
12
+ */
13
+ export function parseConfigOptions(cmd) {
14
+ const opts = cmd.optsWithGlobals();
15
+ const inlineOverrides = {};
16
+ if (opts.override) {
17
+ for (const entry of opts.override) {
18
+ const eqIdx = entry.indexOf('=');
19
+ if (eqIdx > 0) {
20
+ inlineOverrides[entry.substring(0, eqIdx)] = entry.substring(eqIdx + 1);
21
+ }
22
+ }
23
+ }
24
+ const configOptions = {
25
+ configPath: opts.config === false ? undefined : opts.config,
26
+ noConfig: opts.config === false,
27
+ inlineOverrides: Object.keys(inlineOverrides).length > 0 ? inlineOverrides : undefined,
28
+ };
29
+ const config = loadConfig(configOptions);
30
+ // Apply verbose level (R9)
31
+ setVerbosity(opts.verbose ?? 0);
32
+ // Apply --strict flag override
33
+ if (opts.strict) {
34
+ config.strict = true;
35
+ }
36
+ return { config, configOptions };
37
+ }
38
+ /**
39
+ * Build a Catalog from the current working directory.
40
+ */
41
+ export function buildCatalog(config, cwd = process.cwd()) {
42
+ const defaults = loadDefaults();
43
+ const registry = CategoryRegistry.fromDefaults(defaults);
44
+ // Find the library directory
45
+ let libraryDir;
46
+ let current = path.resolve(cwd);
47
+ while (true) {
48
+ const gvpLib = path.join(current, '.gvp', 'library');
49
+ if (fs.existsSync(gvpLib)) {
50
+ libraryDir = gvpLib;
51
+ break;
52
+ }
53
+ const gvpDir = path.join(current, 'gvp');
54
+ if (fs.existsSync(gvpDir) && fs.statSync(gvpDir).isDirectory()) {
55
+ libraryDir = gvpDir;
56
+ break;
57
+ }
58
+ const parent = path.dirname(current);
59
+ if (parent === current)
60
+ break;
61
+ current = parent;
62
+ }
63
+ if (!libraryDir) {
64
+ console.error('No GVP library found. Initialize with `cairn init` or create a .gvp/library/ directory.');
65
+ process.exit(1);
66
+ }
67
+ logv(`Loading library from ${libraryDir}`);
68
+ const source = config.source ?? '@local';
69
+ // Load all YAML files in the library directory
70
+ const yamlFiles = findYamlFiles(libraryDir);
71
+ if (yamlFiles.length === 0) {
72
+ console.error(`No YAML files found in ${libraryDir}`);
73
+ process.exit(1);
74
+ }
75
+ // Load all documents in the library
76
+ const docCache = new Map();
77
+ for (const file of yamlFiles) {
78
+ const docPath = path.relative(libraryDir, file).replace(/\.ya?ml$/, '');
79
+ const doc = loadDocumentFile(file, docPath, source, registry);
80
+ docCache.set(docPath, doc);
81
+ }
82
+ const loader = (_src, docPath) => {
83
+ const cached = docCache.get(docPath);
84
+ if (cached)
85
+ return cached;
86
+ const filePath = path.join(libraryDir, docPath + '.yaml');
87
+ if (!fs.existsSync(filePath)) {
88
+ const ymlPath = path.join(libraryDir, docPath + '.yml');
89
+ if (fs.existsSync(ymlPath)) {
90
+ return loadDocumentFile(ymlPath, docPath, source, registry);
91
+ }
92
+ throw new Error(`Document not found: ${filePath}`);
93
+ }
94
+ return loadDocumentFile(filePath, docPath, source, registry);
95
+ };
96
+ // Find leaf documents (ones not inherited by any other document)
97
+ const inheritedDocPaths = new Set();
98
+ for (const doc of docCache.values()) {
99
+ const inherits = doc.meta.inherits;
100
+ if (inherits && Array.isArray(inherits)) {
101
+ for (const entry of inherits) {
102
+ if (typeof entry === 'string') {
103
+ inheritedDocPaths.add(entry);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ // Use the deepest leaf as the entry point (it will pull in all ancestors)
109
+ const leafDocs = [...docCache.entries()]
110
+ .filter(([docPath]) => !inheritedDocPaths.has(docPath))
111
+ .map(([, doc]) => doc);
112
+ logv(`Found ${yamlFiles.length} documents`);
113
+ const entryDoc = leafDocs[0] ?? docCache.values().next().value;
114
+ const resolved = resolveInheritance(entryDoc, loader);
115
+ const catalog = new Catalog(resolved, config);
116
+ logv(`Catalog built: ${catalog.getAllElements().length} elements`);
117
+ return catalog;
118
+ }
119
+ /**
120
+ * Require user identity for provenance operations (DEC-4.3, DEC-4.8).
121
+ * Exits with an error if user identity is not configured.
122
+ */
123
+ export function requireUserIdentity(config) {
124
+ if (!config.user || !config.user.name || !config.user.email) {
125
+ console.error('Error: GVP user identity not configured (DEC-4.3).');
126
+ console.error('');
127
+ console.error('Set your identity in .gvp.yaml or .gvp/config.yaml:');
128
+ console.error('');
129
+ console.error(' user:');
130
+ console.error(' name: "Your Name"');
131
+ console.error(' email: "you@example.com"');
132
+ process.exit(1);
133
+ }
134
+ return config.user;
135
+ }
136
+ function loadDocumentFile(filePath, docPath, source, registry) {
137
+ const content = fs.readFileSync(filePath, 'utf-8');
138
+ return parseDocument(content, filePath, docPath, source, registry);
139
+ }
140
+ function findYamlFiles(dir) {
141
+ const files = [];
142
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
143
+ if (entry.isFile() && /\.ya?ml$/.test(entry.name)) {
144
+ files.push(path.join(dir, entry.name));
145
+ }
146
+ else if (entry.isDirectory()) {
147
+ files.push(...findYamlFiles(path.join(dir, entry.name)));
148
+ }
149
+ }
150
+ return files.sort();
151
+ }
152
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/cli/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { validateCommand } from './commands/validate.js';
4
+ import { exportCommand } from './commands/export.js';
5
+ import { diffCommand } from './commands/diff.js';
6
+ import { addCommand } from './commands/add.js';
7
+ import { inspectCommand } from './commands/inspect.js';
8
+ import { queryCommand } from './commands/query.js';
9
+ import { reviewCommand } from './commands/review.js';
10
+ import { editCommand } from './commands/edit.js';
11
+ import { analyzeCommand } from './commands/analyze.js';
12
+ import { initCommand } from './commands/init.js';
13
+ const program = new Command();
14
+ program
15
+ .name('cairn')
16
+ .description('Cairn — decision traceability framework (Goals, Values, and Principles)')
17
+ .version('1.0.0-beta')
18
+ .option('--config <path>', 'Load specific config file (replaces discovery)')
19
+ .option('--no-config', 'Skip all config files')
20
+ .option('-c, --override <key=value...>', 'Inline config override (highest precedence)')
21
+ .option('--strict', 'Promote warnings to errors')
22
+ .option('-v, --verbose', 'Verbose output (-v, -vv, -vvv)', (_, prev) => (prev ?? 0) + 1, 0);
23
+ program.addCommand(validateCommand());
24
+ program.addCommand(exportCommand());
25
+ program.addCommand(diffCommand());
26
+ program.addCommand(addCommand());
27
+ program.addCommand(inspectCommand());
28
+ program.addCommand(queryCommand());
29
+ program.addCommand(reviewCommand());
30
+ program.addCommand(editCommand());
31
+ program.addCommand(analyzeCommand());
32
+ program.addCommand(initCommand());
33
+ program.parse();
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,yEAAyE,CAAC;KACtF,OAAO,CAAC,YAAY,CAAC;KACrB,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAAC;KAC9C,MAAM,CAAC,+BAA+B,EAAE,6CAA6C,CAAC;KACtF,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC;KAChD,MAAM,CAAC,eAAe,EAAE,gCAAgC,EAAE,CAAC,CAAS,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAE9G,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type { GVPConfig } from './schema.js';
2
+ export { configSchema, userIdentitySchema } from './schema.js';
3
+ export { loadConfig, discoverConfigPaths, mergeConfigs, applyInlineOverrides, applyEnvVarOverrides, } from './loader.js';
4
+ export type { LoadConfigOptions, ConfigPaths } from './loader.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { configSchema, userIdentitySchema } from './schema.js';
2
+ export { loadConfig, discoverConfigPaths, mergeConfigs, applyInlineOverrides, applyEnvVarOverrides, } from './loader.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type GVPConfig } from './schema.js';
2
+ /** Config layer paths in priority order (closest scope first) */
3
+ export interface ConfigPaths {
4
+ system?: string;
5
+ global?: string;
6
+ project?: string;
7
+ local?: string;
8
+ }
9
+ /**
10
+ * Discover config files by walking backwards from cwd (CFG-1, DEC-8.9).
11
+ */
12
+ export declare function discoverConfigPaths(cwd?: string): ConfigPaths;
13
+ /**
14
+ * Apply env var overrides for config paths (DEC-8.1).
15
+ * Empty string or /dev/null means skip that layer.
16
+ */
17
+ export declare function applyEnvVarOverrides(paths: ConfigPaths): ConfigPaths;
18
+ /**
19
+ * Merge config layers (CFG-2: closer scope wins on conflict).
20
+ * Order: system < global < project < local (local wins).
21
+ */
22
+ export declare function mergeConfigs(...layers: Record<string, unknown>[]): Record<string, unknown>;
23
+ /**
24
+ * Apply inline -c overrides (DEC-8.1: highest precedence).
25
+ * Supports dot-separated keys: -c display.truncation_width=80
26
+ */
27
+ export declare function applyInlineOverrides(config: Record<string, unknown>, overrides: Record<string, string>): Record<string, unknown>;
28
+ /** Options for config loading */
29
+ export interface LoadConfigOptions {
30
+ /** Path to specific config file (--config flag, replaces discovery) */
31
+ configPath?: string;
32
+ /** Skip all config files (--no-config flag) */
33
+ noConfig?: boolean;
34
+ /** Inline overrides from -c flag */
35
+ inlineOverrides?: Record<string, string>;
36
+ /** Working directory for discovery */
37
+ cwd?: string;
38
+ }
39
+ /**
40
+ * Load, merge, and validate the full config (DEC-5.13: eager validation).
41
+ *
42
+ * Pipeline: discover -> env vars -> load files -> merge -> inline overrides -> validate
43
+ */
44
+ export declare function loadConfig(options?: LoadConfigOptions): GVPConfig;
45
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAG3D,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAsB,GAAG,WAAW,CA6B5E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAsBpE;AAuBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0B1F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4BzB;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,SAAS,CAyCrE"}
@@ -0,0 +1,201 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as yaml from 'js-yaml';
4
+ import { configSchema } from './schema.js';
5
+ import { ConfigError } from '../errors.js';
6
+ /**
7
+ * Discover config files by walking backwards from cwd (CFG-1, DEC-8.9).
8
+ */
9
+ export function discoverConfigPaths(cwd = process.cwd()) {
10
+ const paths = {};
11
+ // System config
12
+ const systemPath = '/etc/gvp/config.yaml';
13
+ if (fs.existsSync(systemPath))
14
+ paths.system = systemPath;
15
+ // Global config
16
+ const home = process.env.HOME || process.env.USERPROFILE || '';
17
+ if (home) {
18
+ const globalPath = path.join(home, '.config', 'gvp', 'config.yaml');
19
+ if (fs.existsSync(globalPath))
20
+ paths.global = globalPath;
21
+ }
22
+ // Walk backwards for project and local configs
23
+ let current = path.resolve(cwd);
24
+ while (true) {
25
+ const projectPath = path.join(current, '.gvp', 'config.yaml');
26
+ const localPath = path.join(current, '.gvp.yaml');
27
+ if (!paths.project && fs.existsSync(projectPath))
28
+ paths.project = projectPath;
29
+ if (!paths.local && fs.existsSync(localPath))
30
+ paths.local = localPath;
31
+ const parent = path.dirname(current);
32
+ if (parent === current)
33
+ break; // filesystem root
34
+ current = parent;
35
+ }
36
+ return paths;
37
+ }
38
+ /**
39
+ * Apply env var overrides for config paths (DEC-8.1).
40
+ * Empty string or /dev/null means skip that layer.
41
+ */
42
+ export function applyEnvVarOverrides(paths) {
43
+ const envMap = {
44
+ system: 'GVP_CONFIG_SYSTEM',
45
+ global: 'GVP_CONFIG_GLOBAL',
46
+ project: 'GVP_CONFIG_PROJECT',
47
+ local: 'GVP_CONFIG_LOCAL',
48
+ };
49
+ const result = { ...paths };
50
+ for (const [key, envVar] of Object.entries(envMap)) {
51
+ const envValue = process.env[envVar];
52
+ if (envValue !== undefined) {
53
+ if (envValue === '' || envValue === '/dev/null') {
54
+ delete result[key];
55
+ }
56
+ else {
57
+ result[key] = envValue;
58
+ }
59
+ }
60
+ }
61
+ return result;
62
+ }
63
+ /**
64
+ * Load a single YAML config file, returning empty object if not found.
65
+ */
66
+ function loadConfigFile(filePath) {
67
+ try {
68
+ const content = fs.readFileSync(filePath, 'utf-8');
69
+ const parsed = yaml.load(content);
70
+ if (parsed === null || parsed === undefined)
71
+ return {};
72
+ if (typeof parsed !== 'object') {
73
+ throw new ConfigError(`Config file ${filePath} must be a YAML mapping, got ${typeof parsed}`);
74
+ }
75
+ return parsed;
76
+ }
77
+ catch (e) {
78
+ if (e instanceof ConfigError)
79
+ throw e;
80
+ if (e.code === 'ENOENT')
81
+ return {};
82
+ throw new ConfigError(`Failed to load config file ${filePath}: ${e.message}`);
83
+ }
84
+ }
85
+ /**
86
+ * Merge config layers (CFG-2: closer scope wins on conflict).
87
+ * Order: system < global < project < local (local wins).
88
+ */
89
+ export function mergeConfigs(...layers) {
90
+ const result = {};
91
+ for (const layer of layers) {
92
+ for (const [key, value] of Object.entries(layer)) {
93
+ if (key === 'suppress_diagnostics' && Array.isArray(value)) {
94
+ // Union merge for suppress_diagnostics
95
+ const existing = result[key];
96
+ result[key] = [...new Set([...(existing || []), ...value])];
97
+ }
98
+ else if (key === 'validation_rules' && Array.isArray(value)) {
99
+ // Concatenate for validation_rules
100
+ const existing = result[key];
101
+ result[key] = [...(existing || []), ...value];
102
+ }
103
+ else if (key === 'strict') {
104
+ // OR merge for strict (any source enabling wins — once true, stays true)
105
+ if (value === true || result[key] === true) {
106
+ result[key] = true;
107
+ }
108
+ else {
109
+ result[key] = value;
110
+ }
111
+ }
112
+ else {
113
+ // Default: closer scope wins (later layer overwrites)
114
+ result[key] = value;
115
+ }
116
+ }
117
+ }
118
+ return result;
119
+ }
120
+ /**
121
+ * Apply inline -c overrides (DEC-8.1: highest precedence).
122
+ * Supports dot-separated keys: -c display.truncation_width=80
123
+ */
124
+ export function applyInlineOverrides(config, overrides) {
125
+ const result = { ...config };
126
+ for (const [key, rawValue] of Object.entries(overrides)) {
127
+ // Parse value: try boolean, number, then string
128
+ let value = rawValue;
129
+ if (rawValue === 'true')
130
+ value = true;
131
+ else if (rawValue === 'false')
132
+ value = false;
133
+ else if (!isNaN(Number(rawValue)) && rawValue !== '')
134
+ value = Number(rawValue);
135
+ // Handle dot-separated keys
136
+ const parts = key.split('.');
137
+ if (parts.length === 1) {
138
+ result[key] = value;
139
+ }
140
+ else {
141
+ let current = result;
142
+ for (let i = 0; i < parts.length - 1; i++) {
143
+ const part = parts[i];
144
+ if (!(part in current) || typeof current[part] !== 'object') {
145
+ current[part] = {};
146
+ }
147
+ current = current[part];
148
+ }
149
+ current[parts[parts.length - 1]] = value;
150
+ }
151
+ }
152
+ return result;
153
+ }
154
+ /**
155
+ * Load, merge, and validate the full config (DEC-5.13: eager validation).
156
+ *
157
+ * Pipeline: discover -> env vars -> load files -> merge -> inline overrides -> validate
158
+ */
159
+ export function loadConfig(options = {}) {
160
+ // --no-config disables everything (DEC-8.1)
161
+ if (options.noConfig) {
162
+ let raw = {};
163
+ if (options.inlineOverrides) {
164
+ raw = applyInlineOverrides(raw, options.inlineOverrides);
165
+ }
166
+ return configSchema.parse(raw);
167
+ }
168
+ let raw;
169
+ if (options.configPath) {
170
+ // --config <path>: load only this file, replacing discovery (DEC-8.1)
171
+ raw = loadConfigFile(options.configPath);
172
+ }
173
+ else {
174
+ // Normal discovery
175
+ let paths = discoverConfigPaths(options.cwd);
176
+ paths = applyEnvVarOverrides(paths);
177
+ // Load in priority order: system, global, project, local
178
+ const layers = [];
179
+ if (paths.system)
180
+ layers.push(loadConfigFile(paths.system));
181
+ if (paths.global)
182
+ layers.push(loadConfigFile(paths.global));
183
+ if (paths.project)
184
+ layers.push(loadConfigFile(paths.project));
185
+ if (paths.local)
186
+ layers.push(loadConfigFile(paths.local));
187
+ raw = mergeConfigs(...layers);
188
+ }
189
+ // Apply inline overrides (highest precedence)
190
+ if (options.inlineOverrides) {
191
+ raw = applyInlineOverrides(raw, options.inlineOverrides);
192
+ }
193
+ // Eager validation (DEC-5.13)
194
+ try {
195
+ return configSchema.parse(raw);
196
+ }
197
+ catch (e) {
198
+ throw new ConfigError(`Invalid config: ${e.message}`);
199
+ }
200
+ }
201
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ /** User identity for provenance (DEC-4.3) */
3
+ export declare const userIdentitySchema: z.ZodObject<{
4
+ name: z.ZodString;
5
+ email: z.ZodString;
6
+ }, z.core.$strip>;
7
+ /** GVP config schema */
8
+ export declare const configSchema: z.ZodObject<{
9
+ user: z.ZodOptional<z.ZodObject<{
10
+ name: z.ZodString;
11
+ email: z.ZodString;
12
+ }, z.core.$strip>>;
13
+ strict: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
14
+ suppress_diagnostics: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
15
+ display: z.ZodOptional<z.ZodObject<{
16
+ truncation_width: z.ZodOptional<z.ZodNumber>;
17
+ }, z.core.$strip>>;
18
+ default_timezone: z.ZodOptional<z.ZodString>;
19
+ strict_export_options: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
20
+ source: z.ZodOptional<z.ZodString>;
21
+ coverage: z.ZodOptional<z.ZodObject<{
22
+ exclude: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
23
+ }, z.core.$strip>>;
24
+ validation_rules: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodUnknown>>>;
25
+ priority: z.ZodOptional<z.ZodObject<{
26
+ elements: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
27
+ ancestor: "ancestor";
28
+ descendant: "descendant";
29
+ }>>>;
30
+ definitions: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
31
+ ancestor: "ancestor";
32
+ descendant: "descendant";
33
+ }>>>;
34
+ }, z.core.$strip>>;
35
+ }, z.core.$loose>;
36
+ export type GVPConfig = z.infer<typeof configSchema>;
37
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AAEH,wBAAwB;AACxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyCT,CAAC;AAEjB,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ /** User identity for provenance (DEC-4.3) */
3
+ export const userIdentitySchema = z.object({
4
+ name: z.string(),
5
+ email: z.string().email(),
6
+ });
7
+ /** GVP config schema */
8
+ export const configSchema = z.object({
9
+ // User identity (DEC-4.3, DEC-4.8: personal only, excluded from config_overrides)
10
+ user: userIdentitySchema.optional(),
11
+ // Validation settings
12
+ strict: z.boolean().optional().default(false),
13
+ suppress_diagnostics: z.array(z.string()).optional().default([]),
14
+ // Display settings (DEC-8.3: magic numbers as config)
15
+ display: z
16
+ .object({
17
+ truncation_width: z.number().optional(),
18
+ })
19
+ .optional(),
20
+ // Timezone (DEC-3.4: config -> system -> UTC fallback)
21
+ default_timezone: z.string().optional(),
22
+ // Export options strictness (DEC-3.8)
23
+ strict_export_options: z.boolean().optional().default(true),
24
+ // Source identity for local library (DEC-6.6)
25
+ source: z.string().optional(),
26
+ // Coverage settings (W012 exclusions)
27
+ coverage: z
28
+ .object({
29
+ exclude: z.array(z.string()).optional().default([]),
30
+ })
31
+ .optional(),
32
+ // Validation rules (VAL-6: user-defined)
33
+ validation_rules: z.array(z.unknown()).optional().default([]),
34
+ // Priority direction (DEC-2.1)
35
+ priority: z
36
+ .object({
37
+ elements: z.enum(['ancestor', 'descendant']).optional().default('ancestor'),
38
+ definitions: z.enum(['ancestor', 'descendant']).optional().default('descendant'),
39
+ })
40
+ .optional(),
41
+ }).passthrough(); // Allow unknown keys for forward compat
42
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;CAC1B,CAAC,CAAC;AAEH,wBAAwB;AACxB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,kFAAkF;IAClF,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE;IAEnC,sBAAsB;IACtB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7C,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAEhE,sDAAsD;IACtD,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACxC,CAAC;SACD,QAAQ,EAAE;IAEb,uDAAuD;IACvD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAEvC,sCAAsC;IACtC,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAE3D,8CAA8C;IAC9C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE7B,sCAAsC;IACtC,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACpD,CAAC;SACD,QAAQ,EAAE;IAEb,yCAAyC;IACzC,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAE7D,+BAA+B;IAC/B,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3E,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;KACjF,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,wCAAwC"}