@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 @@
1
+ {"version":3,"file":"combined-schema.d.ts","sourceRoot":"","sources":["../../src/schema/combined-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,UAAU,YAAY;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC9C,OAAO,GAAE,YAAiB,GACzB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAaxC"}
@@ -0,0 +1,23 @@
1
+ import { checkReservedFieldCollision, reservedFieldsSchema } from './reserved-fields.js';
2
+ import { buildZodSchema } from './build-schema.js';
3
+ /**
4
+ * Build a complete element Zod schema: reserved fields + dynamic fields (DEC-3.7).
5
+ *
6
+ * 1. Checks for reserved field collisions (DEC-3.2) — throws SchemaError
7
+ * 2. Builds dynamic schema from field_schemas
8
+ * 3. Merges reserved + dynamic into one flat Zod object schema
9
+ *
10
+ * The resulting schema validates a complete element in one pass.
11
+ */
12
+ export function buildElementSchema(fieldSchemas, options = {}) {
13
+ // Step 1: Check for collisions
14
+ checkReservedFieldCollision(fieldSchemas);
15
+ // Step 2: Build dynamic schema
16
+ const dynamicSchema = buildZodSchema(fieldSchemas, options);
17
+ // Step 3: Merge reserved + dynamic (flat namespace)
18
+ // Use .extend() to add dynamic fields onto the reserved schema
19
+ const combined = reservedFieldsSchema.extend(dynamicSchema.shape);
20
+ // Allow extra fields (passthrough) so unknown fields don't cause errors
21
+ return combined.passthrough();
22
+ }
23
+ //# sourceMappingURL=combined-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combined-schema.js","sourceRoot":"","sources":["../../src/schema/combined-schema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAA8C,EAC9C,UAAwB,EAAE;IAE1B,+BAA+B;IAC/B,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAE1C,+BAA+B;IAC/B,MAAM,aAAa,GAAG,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE5D,oDAAoD;IACpD,+DAA+D;IAC/D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAElE,wEAAwE;IACxE,OAAO,QAAQ,CAAC,WAAW,EAA4C,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Resolve timezone using fallback chain: config → system → UTC (DEC-3.4)
4
+ */
5
+ export declare function resolveTimezone(configTimezone?: string): string;
6
+ /**
7
+ * Create a Zod schema for datetime fields (DEC-3.4).
8
+ * Validates ISO 8601 strings and appends timezone if missing.
9
+ */
10
+ export declare function createDatetimeSchema(defaultTimezone?: string): z.ZodType<string>;
11
+ //# sourceMappingURL=datetime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datetime.d.ts","sourceRoot":"","sources":["../../src/schema/datetime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,wBAAgB,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAW/D;AA6CD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAqBhF"}
@@ -0,0 +1,81 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Resolve timezone using fallback chain: config → system → UTC (DEC-3.4)
4
+ */
5
+ export function resolveTimezone(configTimezone) {
6
+ if (configTimezone)
7
+ return configTimezone;
8
+ try {
9
+ const systemTz = Intl.DateTimeFormat().resolvedOptions().timeZone;
10
+ if (systemTz)
11
+ return systemTz;
12
+ }
13
+ catch {
14
+ // Intl not available
15
+ }
16
+ return 'UTC';
17
+ }
18
+ /**
19
+ * Check if an ISO 8601 string includes timezone information.
20
+ */
21
+ function hasTimezone(isoString) {
22
+ // Check for Z, +HH:MM, -HH:MM at the end
23
+ return /(?:Z|[+-]\d{2}:\d{2})\s*$/.test(isoString);
24
+ }
25
+ /**
26
+ * Append a timezone offset to an ISO 8601 string that lacks one.
27
+ * Uses the IANA timezone name to compute the offset for the given datetime.
28
+ */
29
+ function appendTimezone(isoString, timezone) {
30
+ if (timezone === 'UTC') {
31
+ return isoString + 'Z';
32
+ }
33
+ try {
34
+ // Parse the date and format with the target timezone to get the offset
35
+ const date = new Date(isoString + 'Z'); // Parse as UTC first
36
+ const formatter = new Intl.DateTimeFormat('en-US', {
37
+ timeZone: timezone,
38
+ timeZoneName: 'shortOffset',
39
+ });
40
+ const parts = formatter.formatToParts(date);
41
+ const tzPart = parts.find(p => p.type === 'timeZoneName');
42
+ if (tzPart) {
43
+ // Convert "GMT-4" or "GMT+5:30" to "-04:00" or "+05:30"
44
+ const match = tzPart.value.match(/GMT([+-]?)(\d+)(?::(\d+))?/);
45
+ if (match) {
46
+ const sign = match[1] || '+';
47
+ const hours = match[2].padStart(2, '0');
48
+ const minutes = (match[3] || '0').padStart(2, '0');
49
+ return isoString + sign + hours + ':' + minutes;
50
+ }
51
+ }
52
+ }
53
+ catch {
54
+ // Fallback: just append Z
55
+ }
56
+ return isoString + 'Z';
57
+ }
58
+ /**
59
+ * Create a Zod schema for datetime fields (DEC-3.4).
60
+ * Validates ISO 8601 strings and appends timezone if missing.
61
+ */
62
+ export function createDatetimeSchema(defaultTimezone) {
63
+ const timezone = resolveTimezone(defaultTimezone);
64
+ return z.string().transform((val, ctx) => {
65
+ // Validate it's a parseable date
66
+ const date = new Date(val.includes('T') ? val : val + 'T00:00:00');
67
+ if (isNaN(date.getTime())) {
68
+ ctx.addIssue({
69
+ code: z.ZodIssueCode.custom,
70
+ message: `Invalid datetime: "${val}" is not a valid ISO 8601 datetime`,
71
+ });
72
+ return val;
73
+ }
74
+ // Append timezone if missing
75
+ if (!hasTimezone(val)) {
76
+ return appendTimezone(val, timezone);
77
+ }
78
+ return val;
79
+ });
80
+ }
81
+ //# sourceMappingURL=datetime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datetime.js","sourceRoot":"","sources":["../../src/schema/datetime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,cAAuB;IACrD,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;QAClE,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,SAAiB;IACpC,yCAAyC;IACzC,OAAO,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,SAAiB,EAAE,QAAgB;IACzD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,SAAS,GAAG,GAAG,CAAC;IACzB,CAAC;IAED,IAAI,CAAC;QACH,uEAAuE;QACvE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,qBAAqB;QAC7D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACjD,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,aAAa;SAC5B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QAC1D,IAAI,MAAM,EAAE,CAAC;YACX,wDAAwD;YACxD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC/D,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACnD,OAAO,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,OAAO,SAAS,GAAG,GAAG,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,eAAwB;IAC3D,MAAM,QAAQ,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;IAElD,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,iCAAiC;QACjC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,sBAAsB,GAAG,oCAAoC;aACvE,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ import type { FieldSchemaEntry } from './field-schema.js';
3
+ import type { CategoryDefinition, DefaultsFile } from './category-definition.js';
4
+ /**
5
+ * Load and validate the built-in defaults.yaml (DEC-9.4).
6
+ * Uses the same YAML -> Zod pipeline as user files.
7
+ */
8
+ export declare function loadDefaults(): DefaultsFile;
9
+ /**
10
+ * Merge _all field_schemas with per-category field_schemas (DEC-2.8).
11
+ * Per-category fields win on collision.
12
+ */
13
+ export declare function mergeAllFieldSchemas(allSchemas: Record<string, FieldSchemaEntry>, categorySchemas: Record<string, FieldSchemaEntry> | undefined): Record<string, FieldSchemaEntry>;
14
+ /**
15
+ * Build a complete element Zod schema for a category (convenience function).
16
+ * Merges _all + per-category field_schemas, then builds the element schema.
17
+ */
18
+ export declare function buildCategoryElementSchema(categoryDef: CategoryDefinition, allFieldSchemas: Record<string, FieldSchemaEntry>, options?: {
19
+ defaultTimezone?: string;
20
+ }): z.ZodObject<Record<string, z.ZodType>>;
21
+ //# sourceMappingURL=defaults-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults-loader.d.ts","sourceRoot":"","sources":["../../src/schema/defaults-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKjF;;;GAGG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAc3C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC5C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,GAC5D,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAMlC;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,kBAAkB,EAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACjD,OAAO,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAYxC"}
@@ -0,0 +1,55 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import * as yaml from 'js-yaml';
5
+ import { defaultsFileSchema } from './category-definition.js';
6
+ import { buildElementSchema } from './combined-schema.js';
7
+ import { RESERVED_FIELD_NAMES } from './reserved-fields.js';
8
+ /**
9
+ * Load and validate the built-in defaults.yaml (DEC-9.4).
10
+ * Uses the same YAML -> Zod pipeline as user files.
11
+ */
12
+ export function loadDefaults() {
13
+ // Resolve path relative to this source file
14
+ let resolvedPath;
15
+ try {
16
+ const thisDir = path.dirname(fileURLToPath(import.meta.url));
17
+ resolvedPath = path.resolve(thisDir, '../data/defaults.yaml');
18
+ }
19
+ catch {
20
+ // Fallback for CJS contexts where import.meta.url may not be available
21
+ resolvedPath = path.resolve(__dirname, '../data/defaults.yaml');
22
+ }
23
+ const content = fs.readFileSync(resolvedPath, 'utf-8');
24
+ const parsed = yaml.load(content);
25
+ return defaultsFileSchema.parse(parsed);
26
+ }
27
+ /**
28
+ * Merge _all field_schemas with per-category field_schemas (DEC-2.8).
29
+ * Per-category fields win on collision.
30
+ */
31
+ export function mergeAllFieldSchemas(allSchemas, categorySchemas) {
32
+ if (!categorySchemas) {
33
+ return { ...allSchemas };
34
+ }
35
+ // _all provides the base; per-category overrides on collision
36
+ return { ...allSchemas, ...categorySchemas };
37
+ }
38
+ /**
39
+ * Build a complete element Zod schema for a category (convenience function).
40
+ * Merges _all + per-category field_schemas, then builds the element schema.
41
+ */
42
+ export function buildCategoryElementSchema(categoryDef, allFieldSchemas, options) {
43
+ const merged = mergeAllFieldSchemas(allFieldSchemas, categoryDef.field_schemas);
44
+ // Filter out reserved fields — they are already defined by reservedFieldsSchema.
45
+ // The _all block may declare them for documentation/dogfooding, but buildElementSchema
46
+ // enforces that field_schemas cannot collide with reserved fields (DEC-3.2).
47
+ const filtered = {};
48
+ for (const [key, value] of Object.entries(merged)) {
49
+ if (!RESERVED_FIELD_NAMES.has(key)) {
50
+ filtered[key] = value;
51
+ }
52
+ }
53
+ return buildElementSchema(filtered, options);
54
+ }
55
+ //# sourceMappingURL=defaults-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults-loader.js","sourceRoot":"","sources":["../../src/schema/defaults-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAIhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,4CAA4C;IAC5C,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAA4C,EAC5C,eAA6D;IAE7D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IAC3B,CAAC;IACD,8DAA8D;IAC9D,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,eAAe,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAA+B,EAC/B,eAAiD,EACjD,OAAsC;IAEtC,MAAM,MAAM,GAAG,oBAAoB,CAAC,eAAe,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IAChF,iFAAiF;IACjF,uFAAuF;IACvF,6EAA6E;IAC7E,MAAM,QAAQ,GAAqC,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ import type { FieldType } from './types.js';
3
+ /**
4
+ * A field schema entry from field_schemas definitions.
5
+ * Per DEC-3.3b, DEC-3.10, DEC-3.12, DEC-10.11.
6
+ */
7
+ export interface FieldSchemaEntry {
8
+ type: FieldType;
9
+ required?: boolean;
10
+ display_name?: string;
11
+ /** For 'list' type — element schema (DEC-3.10) */
12
+ items?: FieldSchemaEntry;
13
+ /** For 'dict' type — value schema (DEC-3.10). For 'enum' type — allowed values (DEC-10.11). */
14
+ values?: FieldSchemaEntry | string[];
15
+ /** For 'model' type — nested field definitions (DEC-3.12) */
16
+ fields?: Record<string, FieldSchemaEntry>;
17
+ }
18
+ /**
19
+ * Recursive Zod schema that validates raw YAML field_schemas entries
20
+ * into FieldSchemaEntry objects.
21
+ */
22
+ export declare const fieldSchemaEntrySchema: z.ZodType<FieldSchemaEntry>;
23
+ //# sourceMappingURL=field-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-schema.d.ts","sourceRoot":"","sources":["../../src/schema/field-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAAC;IACrC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAY9D,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ import { FIELD_TYPES } from './types.js';
3
+ /**
4
+ * Recursive Zod schema that validates raw YAML field_schemas entries
5
+ * into FieldSchemaEntry objects.
6
+ */
7
+ export const fieldSchemaEntrySchema = z.lazy(() => z.object({
8
+ type: z.enum(FIELD_TYPES),
9
+ required: z.boolean().optional(),
10
+ display_name: z.string().optional(),
11
+ items: fieldSchemaEntrySchema.optional(),
12
+ values: z.union([
13
+ z.array(z.string()), // enum values
14
+ fieldSchemaEntrySchema, // dict value schema
15
+ ]).optional(),
16
+ fields: z.record(z.string(), fieldSchemaEntrySchema).optional(),
17
+ }));
18
+ //# sourceMappingURL=field-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-schema.js","sourceRoot":"","sources":["../../src/schema/field-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkBzC;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAgC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAC7E,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,WAA+C,CAAoC;IAChG,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAChC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,sBAAsB,CAAC,QAAQ,EAAE;IACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC;QACd,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAQ,cAAc;QACzC,sBAAsB,EAAK,oBAAoB;KAChD,CAAC,CAAC,QAAQ,EAAE;IACb,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAQ,EAAE;CAChE,CAAC,CACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type { FieldType } from './types.js';
2
+ export type { FieldSchemaEntry } from './field-schema.js';
3
+ export type { CategoryDefinition, AllFieldSchemas, DefaultsFile } from './category-definition.js';
4
+ export type { ReservedFields } from './reserved-fields.js';
5
+ export { FIELD_TYPES } from './types.js';
6
+ export { RESERVED_FIELD_NAMES } from './reserved-fields.js';
7
+ export { isFieldType } from './types.js';
8
+ export { isReservedField, checkReservedFieldCollision } from './reserved-fields.js';
9
+ export { resolveTimezone } from './datetime.js';
10
+ export { buildZodSchema } from './build-schema.js';
11
+ export { buildElementSchema } from './combined-schema.js';
12
+ export { buildCategoryElementSchema, loadDefaults, mergeAllFieldSchemas } from './defaults-loader.js';
13
+ export { createDatetimeSchema } from './datetime.js';
14
+ export { reservedFieldsSchema } from './reserved-fields.js';
15
+ export { fieldSchemaEntrySchema } from './field-schema.js';
16
+ export { categoryDefinitionSchema, allFieldSchemasSchema, defaultsFileSchema } from './category-definition.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClG,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,17 @@
1
+ // Constants
2
+ export { FIELD_TYPES } from './types.js';
3
+ export { RESERVED_FIELD_NAMES } from './reserved-fields.js';
4
+ // Type guards and helpers
5
+ export { isFieldType } from './types.js';
6
+ export { isReservedField, checkReservedFieldCollision } from './reserved-fields.js';
7
+ export { resolveTimezone } from './datetime.js';
8
+ // Schema builders
9
+ export { buildZodSchema } from './build-schema.js';
10
+ export { buildElementSchema } from './combined-schema.js';
11
+ export { buildCategoryElementSchema, loadDefaults, mergeAllFieldSchemas } from './defaults-loader.js';
12
+ export { createDatetimeSchema } from './datetime.js';
13
+ // Zod schemas (for direct use/extension)
14
+ export { reservedFieldsSchema } from './reserved-fields.js';
15
+ export { fieldSchemaEntrySchema } from './field-schema.js';
16
+ export { categoryDefinitionSchema, allFieldSchemasSchema, defaultsFileSchema } from './category-definition.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAMA,YAAY;AACZ,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,0BAA0B;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,yCAAyC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ import type { FieldSchemaEntry } from './field-schema.js';
3
+ /**
4
+ * Reserved field names that cannot be redefined by field_schemas (DEC-3.2).
5
+ * These are structural fields owned by GVP core.
6
+ */
7
+ export declare const RESERVED_FIELD_NAMES: ReadonlySet<string>;
8
+ /** Check if a field name is reserved */
9
+ export declare function isReservedField(name: string): boolean;
10
+ /**
11
+ * Throw SchemaError if any field_schemas key collides with a reserved field (DEC-3.2).
12
+ * Called during catalog construction.
13
+ */
14
+ export declare function checkReservedFieldCollision(fieldSchemas: Record<string, FieldSchemaEntry>): void;
15
+ /**
16
+ * Zod schema for reserved/structural fields on every element (DEC-3.2, DEC-3.7).
17
+ * Provenance fields use z.unknown() as placeholders — refined in Phase 9.
18
+ */
19
+ export declare const reservedFieldsSchema: z.ZodObject<{
20
+ id: z.ZodString;
21
+ name: z.ZodString;
22
+ status: z.ZodDefault<z.ZodString>;
23
+ tags: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
24
+ maps_to: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
25
+ origin: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodUnknown>, z.ZodUnknown]>>;
26
+ updated_by: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodUnknown>, z.ZodUnknown]>>;
27
+ reviewed_by: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodUnknown>, z.ZodUnknown]>>;
28
+ priority: z.ZodOptional<z.ZodNumber>;
29
+ }, z.core.$strip>;
30
+ /** Type inferred from the reserved fields schema */
31
+ export type ReservedFields = z.infer<typeof reservedFieldsSchema>;
32
+ //# sourceMappingURL=reserved-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reserved-fields.d.ts","sourceRoot":"","sources":["../../src/schema/reserved-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAGnD,CAAC;AAEH,wCAAwC;AACxC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC7C,IAAI,CASN;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;iBAU/B,CAAC;AAEH,oDAAoD;AACpD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ import { SchemaError } from '../errors.js';
3
+ /**
4
+ * Reserved field names that cannot be redefined by field_schemas (DEC-3.2).
5
+ * These are structural fields owned by GVP core.
6
+ */
7
+ export const RESERVED_FIELD_NAMES = new Set([
8
+ 'id', 'name', 'status', 'tags', 'maps_to',
9
+ 'origin', 'updated_by', 'reviewed_by', 'priority',
10
+ ]);
11
+ /** Check if a field name is reserved */
12
+ export function isReservedField(name) {
13
+ return RESERVED_FIELD_NAMES.has(name);
14
+ }
15
+ /**
16
+ * Throw SchemaError if any field_schemas key collides with a reserved field (DEC-3.2).
17
+ * Called during catalog construction.
18
+ */
19
+ export function checkReservedFieldCollision(fieldSchemas) {
20
+ for (const key of Object.keys(fieldSchemas)) {
21
+ if (RESERVED_FIELD_NAMES.has(key)) {
22
+ throw new SchemaError(`Field '${key}' is reserved and cannot be redefined in field_schemas. ` +
23
+ `Reserved fields: ${[...RESERVED_FIELD_NAMES].join(', ')}`);
24
+ }
25
+ }
26
+ }
27
+ /**
28
+ * Zod schema for reserved/structural fields on every element (DEC-3.2, DEC-3.7).
29
+ * Provenance fields use z.unknown() as placeholders — refined in Phase 9.
30
+ */
31
+ export const reservedFieldsSchema = z.object({
32
+ id: z.string(),
33
+ name: z.string(),
34
+ status: z.string().default('active'),
35
+ tags: z.array(z.string()).optional().default([]),
36
+ maps_to: z.array(z.string()).optional().default([]),
37
+ origin: z.union([z.array(z.unknown()), z.unknown()]).optional(),
38
+ updated_by: z.union([z.array(z.unknown()), z.unknown()]).optional(),
39
+ reviewed_by: z.union([z.array(z.unknown()), z.unknown()]).optional(),
40
+ priority: z.number().optional(),
41
+ });
42
+ //# sourceMappingURL=reserved-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reserved-fields.js","sourceRoot":"","sources":["../../src/schema/reserved-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IAC/D,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS;IACzC,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU;CAClD,CAAC,CAAC;AAEH,wCAAwC;AACxC,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,YAA8C;IAE9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,WAAW,CACnB,UAAU,GAAG,0DAA0D;gBACvE,oBAAoB,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/D,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Supported field types in GVP field_schemas (DEC-3.4, DEC-10.11) */
2
+ export type FieldType = 'string' | 'number' | 'boolean' | 'list' | 'dict' | 'model' | 'datetime' | 'enum';
3
+ /** All supported field types as a frozen array */
4
+ export declare const FIELD_TYPES: readonly FieldType[];
5
+ /** Type guard for FieldType */
6
+ export declare function isFieldType(value: string): value is FieldType;
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1G,kDAAkD;AAClD,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAEjC,CAAC;AAEZ,+BAA+B;AAC/B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D"}
@@ -0,0 +1,9 @@
1
+ /** All supported field types as a frozen array */
2
+ export const FIELD_TYPES = Object.freeze([
3
+ 'string', 'number', 'boolean', 'list', 'dict', 'model', 'datetime', 'enum',
4
+ ]);
5
+ /** Type guard for FieldType */
6
+ export function isFieldType(value) {
7
+ return FIELD_TYPES.includes(value);
8
+ }
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"AAGA,kDAAkD;AAClD,MAAM,CAAC,MAAM,WAAW,GAAyB,MAAM,CAAC,MAAM,CAAC;IAC7D,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM;CAClE,CAAC,CAAC;AAEZ,+BAA+B;AAC/B,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAQ,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function setVerbosity(level: number): void;
2
+ export declare function getVerbosity(): number;
3
+ export declare function log(level: number, ...args: unknown[]): void;
4
+ export declare function logv(...args: unknown[]): void;
5
+ export declare function logvv(...args: unknown[]): void;
6
+ export declare function logvvv(...args: unknown[]): void;
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAI3D;AAED,wBAAgB,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAqB;AACnE,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAqB;AACpE,wBAAgB,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAqB"}
@@ -0,0 +1,16 @@
1
+ let verbosity = 0;
2
+ export function setVerbosity(level) {
3
+ verbosity = level;
4
+ }
5
+ export function getVerbosity() {
6
+ return verbosity;
7
+ }
8
+ export function log(level, ...args) {
9
+ if (verbosity >= level) {
10
+ console.error('[cairn]', ...args);
11
+ }
12
+ }
13
+ export function logv(...args) { log(1, ...args); }
14
+ export function logvv(...args) { log(2, ...args); }
15
+ export function logvvv(...args) { log(3, ...args); }
16
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,GAAG,IAAe;IACnD,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAG,IAAe,IAAU,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACnE,MAAM,UAAU,KAAK,CAAC,GAAG,IAAe,IAAU,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACpE,MAAM,UAAU,MAAM,CAAC,GAAG,IAAe,IAAU,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Catalog } from '../catalog/catalog.js';
2
+ /**
3
+ * Find the project root by walking up from the catalog's first document.
4
+ * Project root is determined by:
5
+ * 1. Parent of the .gvp directory (if found)
6
+ * 2. Directory containing .git (fallback)
7
+ * 3. null if neither found
8
+ */
9
+ export declare function findProjectRoot(catalog: Catalog): string | null;
10
+ /**
11
+ * Find the project root from a directory path (not catalog).
12
+ */
13
+ export declare function findProjectRootFromDir(startDir: string): string | null;
14
+ //# sourceMappingURL=project-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/utils/project-root.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkB/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAatE"}
@@ -0,0 +1,48 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ /**
4
+ * Find the project root by walking up from the catalog's first document.
5
+ * Project root is determined by:
6
+ * 1. Parent of the .gvp directory (if found)
7
+ * 2. Directory containing .git (fallback)
8
+ * 3. null if neither found
9
+ */
10
+ export function findProjectRoot(catalog) {
11
+ const docs = catalog.documents;
12
+ if (docs.length === 0)
13
+ return null;
14
+ let current = path.dirname(path.resolve(docs[0].filePath));
15
+ while (true) {
16
+ // Check for .gvp directory — parent is project root
17
+ if (fs.existsSync(path.join(current, '.gvp'))) {
18
+ return current;
19
+ }
20
+ // Fallback: .git directory
21
+ if (fs.existsSync(path.join(current, '.git'))) {
22
+ return current;
23
+ }
24
+ const parent = path.dirname(current);
25
+ if (parent === current)
26
+ return null;
27
+ current = parent;
28
+ }
29
+ }
30
+ /**
31
+ * Find the project root from a directory path (not catalog).
32
+ */
33
+ export function findProjectRootFromDir(startDir) {
34
+ let current = path.resolve(startDir);
35
+ while (true) {
36
+ if (fs.existsSync(path.join(current, '.gvp'))) {
37
+ return current;
38
+ }
39
+ if (fs.existsSync(path.join(current, '.git'))) {
40
+ return current;
41
+ }
42
+ const parent = path.dirname(current);
43
+ if (parent === current)
44
+ return null;
45
+ current = parent;
46
+ }
47
+ }
48
+ //# sourceMappingURL=project-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/utils/project-root.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,OAAO,IAAI,EAAE,CAAC;QACZ,oDAAoD;QACpD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,2BAA2B;QAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ export type DiagnosticSeverity = 'error' | 'warning';
2
+ export interface DiagnosticContext {
3
+ elementId?: string;
4
+ documentPath?: string;
5
+ categoryName?: string;
6
+ fieldName?: string;
7
+ details?: string;
8
+ }
9
+ /**
10
+ * A validation finding (DEC-5.4).
11
+ * Used for both errors and warnings from validation passes.
12
+ */
13
+ export interface Diagnostic {
14
+ code: string;
15
+ name: string;
16
+ description: string;
17
+ severity: DiagnosticSeverity;
18
+ pass: string;
19
+ context: DiagnosticContext;
20
+ }
21
+ /** Create a diagnostic */
22
+ export declare function createDiagnostic(code: string, name: string, description: string, severity: DiagnosticSeverity, pass: string, context?: DiagnosticContext): Diagnostic;
23
+ //# sourceMappingURL=diagnostic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/validation/diagnostic.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,0BAA0B;AAC1B,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,iBAAsB,GAC9B,UAAU,CAEZ"}
@@ -0,0 +1,5 @@
1
+ /** Create a diagnostic */
2
+ export function createDiagnostic(code, name, description, severity, pass, context = {}) {
3
+ return { code, name, description, severity, pass, context };
4
+ }
5
+ //# sourceMappingURL=diagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/validation/diagnostic.ts"],"names":[],"mappings":"AAuBA,0BAA0B;AAC1B,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,IAAY,EACZ,WAAmB,EACnB,QAA4B,EAC5B,IAAY,EACZ,UAA6B,EAAE;IAE/B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type { Diagnostic, DiagnosticSeverity, DiagnosticContext } from './diagnostic.js';
2
+ export { createDiagnostic } from './diagnostic.js';
3
+ export type { ValidationPass } from './runner.js';
4
+ export { runValidation, hasErrors } from './runner.js';
5
+ export { builtinPasses, optionalPasses } from './passes/index.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createDiagnostic } from './diagnostic.js';
2
+ export { runValidation, hasErrors } from './runner.js';
3
+ export { builtinPasses, optionalPasses } from './passes/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Catalog } from '../../catalog/catalog.js';
2
+ import type { GVPConfig } from '../../config/schema.js';
3
+ import type { Diagnostic } from '../diagnostic.js';
4
+ /**
5
+ * Coverage pass — bidirectional ref coverage check (W012, W013).
6
+ * This is an optional pass, not part of the 5 canonical passes.
7
+ * Only runs when explicitly requested.
8
+ */
9
+ export declare function coveragePass(catalog: Catalog, config: GVPConfig): Diagnostic[];
10
+ //# sourceMappingURL=coverage-pass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-pass.d.ts","sourceRoot":"","sources":["../../../src/validation/passes/coverage-pass.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAkBnD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,EAAE,CAqE9E"}