@organon-methodology/tools 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -0
  3. package/dist/cli/commands/coverage.d.ts +12 -0
  4. package/dist/cli/commands/coverage.d.ts.map +1 -0
  5. package/dist/cli/commands/coverage.js +80 -0
  6. package/dist/cli/commands/coverage.js.map +1 -0
  7. package/dist/cli/commands/find.d.ts +15 -0
  8. package/dist/cli/commands/find.d.ts.map +1 -0
  9. package/dist/cli/commands/find.js +81 -0
  10. package/dist/cli/commands/find.js.map +1 -0
  11. package/dist/cli/commands/generate-tests.d.ts +14 -0
  12. package/dist/cli/commands/generate-tests.d.ts.map +1 -0
  13. package/dist/cli/commands/generate-tests.js +87 -0
  14. package/dist/cli/commands/generate-tests.js.map +1 -0
  15. package/dist/cli/commands/generate.d.ts +15 -0
  16. package/dist/cli/commands/generate.d.ts.map +1 -0
  17. package/dist/cli/commands/generate.js +77 -0
  18. package/dist/cli/commands/generate.js.map +1 -0
  19. package/dist/cli/commands/health.d.ts +13 -0
  20. package/dist/cli/commands/health.d.ts.map +1 -0
  21. package/dist/cli/commands/health.js +79 -0
  22. package/dist/cli/commands/health.js.map +1 -0
  23. package/dist/cli/commands/init.d.ts +14 -0
  24. package/dist/cli/commands/init.d.ts.map +1 -0
  25. package/dist/cli/commands/init.js +132 -0
  26. package/dist/cli/commands/init.js.map +1 -0
  27. package/dist/cli/commands/mcp.d.ts +11 -0
  28. package/dist/cli/commands/mcp.d.ts.map +1 -0
  29. package/dist/cli/commands/mcp.js +26 -0
  30. package/dist/cli/commands/mcp.js.map +1 -0
  31. package/dist/cli/commands/query.d.ts +19 -0
  32. package/dist/cli/commands/query.d.ts.map +1 -0
  33. package/dist/cli/commands/query.js +103 -0
  34. package/dist/cli/commands/query.js.map +1 -0
  35. package/dist/cli/commands/upgrade.d.ts +13 -0
  36. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  37. package/dist/cli/commands/upgrade.js +162 -0
  38. package/dist/cli/commands/upgrade.js.map +1 -0
  39. package/dist/cli/commands/validate.d.ts +13 -0
  40. package/dist/cli/commands/validate.d.ts.map +1 -0
  41. package/dist/cli/commands/validate.js +89 -0
  42. package/dist/cli/commands/validate.js.map +1 -0
  43. package/dist/cli/commands/verify.d.ts +12 -0
  44. package/dist/cli/commands/verify.d.ts.map +1 -0
  45. package/dist/cli/commands/verify.js +67 -0
  46. package/dist/cli/commands/verify.js.map +1 -0
  47. package/dist/cli/index.d.ts +19 -0
  48. package/dist/cli/index.d.ts.map +1 -0
  49. package/dist/cli/index.js +59 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/core/add-protocols-array.d.ts +17 -0
  52. package/dist/core/add-protocols-array.d.ts.map +1 -0
  53. package/dist/core/add-protocols-array.js +95 -0
  54. package/dist/core/add-protocols-array.js.map +1 -0
  55. package/dist/core/add-protocols-array.test.d.ts +2 -0
  56. package/dist/core/add-protocols-array.test.d.ts.map +1 -0
  57. package/dist/core/add-protocols-array.test.js +86 -0
  58. package/dist/core/add-protocols-array.test.js.map +1 -0
  59. package/dist/core/config.d.ts +44 -0
  60. package/dist/core/config.d.ts.map +1 -0
  61. package/dist/core/config.js +130 -0
  62. package/dist/core/config.js.map +1 -0
  63. package/dist/core/config.test.d.ts +2 -0
  64. package/dist/core/config.test.d.ts.map +1 -0
  65. package/dist/core/config.test.js +88 -0
  66. package/dist/core/config.test.js.map +1 -0
  67. package/dist/core/find.d.ts +29 -0
  68. package/dist/core/find.d.ts.map +1 -0
  69. package/dist/core/find.js +191 -0
  70. package/dist/core/find.js.map +1 -0
  71. package/dist/core/find.test.d.ts +2 -0
  72. package/dist/core/find.test.d.ts.map +1 -0
  73. package/dist/core/find.test.js +91 -0
  74. package/dist/core/find.test.js.map +1 -0
  75. package/dist/core/frontmatter-parser.d.ts +45 -0
  76. package/dist/core/frontmatter-parser.d.ts.map +1 -0
  77. package/dist/core/frontmatter-parser.js +122 -0
  78. package/dist/core/frontmatter-parser.js.map +1 -0
  79. package/dist/core/frontmatter-parser.test.d.ts +2 -0
  80. package/dist/core/frontmatter-parser.test.d.ts.map +1 -0
  81. package/dist/core/frontmatter-parser.test.js +200 -0
  82. package/dist/core/frontmatter-parser.test.js.map +1 -0
  83. package/dist/core/generate-frontmatter.d.ts +27 -0
  84. package/dist/core/generate-frontmatter.d.ts.map +1 -0
  85. package/dist/core/generate-frontmatter.js +219 -0
  86. package/dist/core/generate-frontmatter.js.map +1 -0
  87. package/dist/core/generate-frontmatter.test.d.ts +2 -0
  88. package/dist/core/generate-frontmatter.test.d.ts.map +1 -0
  89. package/dist/core/generate-frontmatter.test.js +161 -0
  90. package/dist/core/generate-frontmatter.test.js.map +1 -0
  91. package/dist/core/generate-tests.d.ts +41 -0
  92. package/dist/core/generate-tests.d.ts.map +1 -0
  93. package/dist/core/generate-tests.js +191 -0
  94. package/dist/core/generate-tests.js.map +1 -0
  95. package/dist/core/generate-tests.test.d.ts +2 -0
  96. package/dist/core/generate-tests.test.d.ts.map +1 -0
  97. package/dist/core/generate-tests.test.js +205 -0
  98. package/dist/core/generate-tests.test.js.map +1 -0
  99. package/dist/core/health.d.ts +16 -0
  100. package/dist/core/health.d.ts.map +1 -0
  101. package/dist/core/health.js +156 -0
  102. package/dist/core/health.js.map +1 -0
  103. package/dist/core/health.test.d.ts +2 -0
  104. package/dist/core/health.test.d.ts.map +1 -0
  105. package/dist/core/health.test.js +97 -0
  106. package/dist/core/health.test.js.map +1 -0
  107. package/dist/core/init.d.ts +25 -0
  108. package/dist/core/init.d.ts.map +1 -0
  109. package/dist/core/init.js +100 -0
  110. package/dist/core/init.js.map +1 -0
  111. package/dist/core/init.test.d.ts +8 -0
  112. package/dist/core/init.test.d.ts.map +1 -0
  113. package/dist/core/init.test.js +203 -0
  114. package/dist/core/init.test.js.map +1 -0
  115. package/dist/core/invariant-coverage.d.ts +41 -0
  116. package/dist/core/invariant-coverage.d.ts.map +1 -0
  117. package/dist/core/invariant-coverage.js +181 -0
  118. package/dist/core/invariant-coverage.js.map +1 -0
  119. package/dist/core/invariant-coverage.test.d.ts +2 -0
  120. package/dist/core/invariant-coverage.test.d.ts.map +1 -0
  121. package/dist/core/invariant-coverage.test.js +188 -0
  122. package/dist/core/invariant-coverage.test.js.map +1 -0
  123. package/dist/core/meta-invariants.test.d.ts +17 -0
  124. package/dist/core/meta-invariants.test.d.ts.map +1 -0
  125. package/dist/core/meta-invariants.test.js +191 -0
  126. package/dist/core/meta-invariants.test.js.map +1 -0
  127. package/dist/core/node-fs.d.ts +22 -0
  128. package/dist/core/node-fs.d.ts.map +1 -0
  129. package/dist/core/node-fs.js +47 -0
  130. package/dist/core/node-fs.js.map +1 -0
  131. package/dist/core/organon-invariants.test.d.ts +15 -0
  132. package/dist/core/organon-invariants.test.d.ts.map +1 -0
  133. package/dist/core/organon-invariants.test.js +149 -0
  134. package/dist/core/organon-invariants.test.js.map +1 -0
  135. package/dist/core/query.d.ts +35 -0
  136. package/dist/core/query.d.ts.map +1 -0
  137. package/dist/core/query.js +139 -0
  138. package/dist/core/query.js.map +1 -0
  139. package/dist/core/query.test.d.ts +2 -0
  140. package/dist/core/query.test.d.ts.map +1 -0
  141. package/dist/core/query.test.js +97 -0
  142. package/dist/core/query.test.js.map +1 -0
  143. package/dist/core/suggest-tools.d.ts +15 -0
  144. package/dist/core/suggest-tools.d.ts.map +1 -0
  145. package/dist/core/suggest-tools.js +139 -0
  146. package/dist/core/suggest-tools.js.map +1 -0
  147. package/dist/core/suggest-tools.test.d.ts +2 -0
  148. package/dist/core/suggest-tools.test.d.ts.map +1 -0
  149. package/dist/core/suggest-tools.test.js +122 -0
  150. package/dist/core/suggest-tools.test.js.map +1 -0
  151. package/dist/core/test-helpers.d.ts +63 -0
  152. package/dist/core/test-helpers.d.ts.map +1 -0
  153. package/dist/core/test-helpers.js +265 -0
  154. package/dist/core/test-helpers.js.map +1 -0
  155. package/dist/core/types.d.ts +277 -0
  156. package/dist/core/types.d.ts.map +1 -0
  157. package/dist/core/types.js +9 -0
  158. package/dist/core/types.js.map +1 -0
  159. package/dist/core/upgrade.d.ts +46 -0
  160. package/dist/core/upgrade.d.ts.map +1 -0
  161. package/dist/core/upgrade.js +227 -0
  162. package/dist/core/upgrade.js.map +1 -0
  163. package/dist/core/upgrade.test.d.ts +8 -0
  164. package/dist/core/upgrade.test.d.ts.map +1 -0
  165. package/dist/core/upgrade.test.js +370 -0
  166. package/dist/core/upgrade.test.js.map +1 -0
  167. package/dist/core/validate-frontmatter.d.ts +20 -0
  168. package/dist/core/validate-frontmatter.d.ts.map +1 -0
  169. package/dist/core/validate-frontmatter.js +529 -0
  170. package/dist/core/validate-frontmatter.js.map +1 -0
  171. package/dist/core/validate-frontmatter.test.d.ts +2 -0
  172. package/dist/core/validate-frontmatter.test.d.ts.map +1 -0
  173. package/dist/core/validate-frontmatter.test.js +366 -0
  174. package/dist/core/validate-frontmatter.test.js.map +1 -0
  175. package/dist/core/validate-workflow.d.ts +17 -0
  176. package/dist/core/validate-workflow.d.ts.map +1 -0
  177. package/dist/core/validate-workflow.js +233 -0
  178. package/dist/core/validate-workflow.js.map +1 -0
  179. package/dist/core/validate-workflow.test.d.ts +2 -0
  180. package/dist/core/validate-workflow.test.d.ts.map +1 -0
  181. package/dist/core/validate-workflow.test.js +205 -0
  182. package/dist/core/validate-workflow.test.js.map +1 -0
  183. package/dist/core/verify-tier4-tests.d.ts +34 -0
  184. package/dist/core/verify-tier4-tests.d.ts.map +1 -0
  185. package/dist/core/verify-tier4-tests.js +106 -0
  186. package/dist/core/verify-tier4-tests.js.map +1 -0
  187. package/dist/core/verify-tier4-tests.test.d.ts +2 -0
  188. package/dist/core/verify-tier4-tests.test.d.ts.map +1 -0
  189. package/dist/core/verify-tier4-tests.test.js +140 -0
  190. package/dist/core/verify-tier4-tests.test.js.map +1 -0
  191. package/dist/core/verify-triplets.d.ts +17 -0
  192. package/dist/core/verify-triplets.d.ts.map +1 -0
  193. package/dist/core/verify-triplets.js +217 -0
  194. package/dist/core/verify-triplets.js.map +1 -0
  195. package/dist/core/verify-triplets.test.d.ts +2 -0
  196. package/dist/core/verify-triplets.test.d.ts.map +1 -0
  197. package/dist/core/verify-triplets.test.js +147 -0
  198. package/dist/core/verify-triplets.test.js.map +1 -0
  199. package/dist/core/verify.d.ts +19 -0
  200. package/dist/core/verify.d.ts.map +1 -0
  201. package/dist/core/verify.js +162 -0
  202. package/dist/core/verify.js.map +1 -0
  203. package/dist/core/verify.test.d.ts +2 -0
  204. package/dist/core/verify.test.d.ts.map +1 -0
  205. package/dist/core/verify.test.js +147 -0
  206. package/dist/core/verify.test.js.map +1 -0
  207. package/dist/index.d.ts +31 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +27 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/mcp/prompts.d.ts +9 -0
  212. package/dist/mcp/prompts.d.ts.map +1 -0
  213. package/dist/mcp/prompts.js +265 -0
  214. package/dist/mcp/prompts.js.map +1 -0
  215. package/dist/mcp/resources.d.ts +7 -0
  216. package/dist/mcp/resources.d.ts.map +1 -0
  217. package/dist/mcp/resources.js +111 -0
  218. package/dist/mcp/resources.js.map +1 -0
  219. package/dist/mcp/server.d.ts +7 -0
  220. package/dist/mcp/server.d.ts.map +1 -0
  221. package/dist/mcp/server.js +31 -0
  222. package/dist/mcp/server.js.map +1 -0
  223. package/dist/mcp/tools.d.ts +7 -0
  224. package/dist/mcp/tools.d.ts.map +1 -0
  225. package/dist/mcp/tools.js +130 -0
  226. package/dist/mcp/tools.js.map +1 -0
  227. package/dist/templates/config.d.ts +6 -0
  228. package/dist/templates/config.d.ts.map +1 -0
  229. package/dist/templates/config.js +30 -0
  230. package/dist/templates/config.js.map +1 -0
  231. package/dist/templates/index.d.ts +7 -0
  232. package/dist/templates/index.d.ts.map +1 -0
  233. package/dist/templates/index.js +7 -0
  234. package/dist/templates/index.js.map +1 -0
  235. package/dist/templates/organon/claude-md.d.ts +7 -0
  236. package/dist/templates/organon/claude-md.d.ts.map +1 -0
  237. package/dist/templates/organon/claude-md.js +32 -0
  238. package/dist/templates/organon/claude-md.js.map +1 -0
  239. package/dist/templates/organon/ethos.d.ts +5 -0
  240. package/dist/templates/organon/ethos.d.ts.map +1 -0
  241. package/dist/templates/organon/ethos.js +69 -0
  242. package/dist/templates/organon/ethos.js.map +1 -0
  243. package/dist/templates/organon/index.d.ts +10 -0
  244. package/dist/templates/organon/index.d.ts.map +1 -0
  245. package/dist/templates/organon/index.js +10 -0
  246. package/dist/templates/organon/index.js.map +1 -0
  247. package/dist/templates/organon/observations-readme.d.ts +5 -0
  248. package/dist/templates/organon/observations-readme.d.ts.map +1 -0
  249. package/dist/templates/organon/observations-readme.js +25 -0
  250. package/dist/templates/organon/observations-readme.js.map +1 -0
  251. package/dist/templates/organon/philosophy.d.ts +5 -0
  252. package/dist/templates/organon/philosophy.d.ts.map +1 -0
  253. package/dist/templates/organon/philosophy.js +75 -0
  254. package/dist/templates/organon/philosophy.js.map +1 -0
  255. package/dist/templates/organon/protocols.d.ts +7 -0
  256. package/dist/templates/organon/protocols.d.ts.map +1 -0
  257. package/dist/templates/organon/protocols.js +197 -0
  258. package/dist/templates/organon/protocols.js.map +1 -0
  259. package/dist/templates/organon/readme.d.ts +5 -0
  260. package/dist/templates/organon/readme.d.ts.map +1 -0
  261. package/dist/templates/organon/readme.js +40 -0
  262. package/dist/templates/organon/readme.js.map +1 -0
  263. package/dist/templates/skills/domain-feature-design.d.ts +9 -0
  264. package/dist/templates/skills/domain-feature-design.d.ts.map +1 -0
  265. package/dist/templates/skills/domain-feature-design.js +123 -0
  266. package/dist/templates/skills/domain-feature-design.js.map +1 -0
  267. package/dist/templates/skills/index.d.ts +15 -0
  268. package/dist/templates/skills/index.d.ts.map +1 -0
  269. package/dist/templates/skills/index.js +35 -0
  270. package/dist/templates/skills/index.js.map +1 -0
  271. package/dist/templates/skills/organon-file-creation.d.ts +9 -0
  272. package/dist/templates/skills/organon-file-creation.d.ts.map +1 -0
  273. package/dist/templates/skills/organon-file-creation.js +138 -0
  274. package/dist/templates/skills/organon-file-creation.js.map +1 -0
  275. package/dist/templates/skills/quality-review.d.ts +9 -0
  276. package/dist/templates/skills/quality-review.d.ts.map +1 -0
  277. package/dist/templates/skills/quality-review.js +127 -0
  278. package/dist/templates/skills/quality-review.js.map +1 -0
  279. package/dist/templates/skills/session-compounding.d.ts +9 -0
  280. package/dist/templates/skills/session-compounding.d.ts.map +1 -0
  281. package/dist/templates/skills/session-compounding.js +118 -0
  282. package/dist/templates/skills/session-compounding.js.map +1 -0
  283. package/dist/templates/skills/verify-and-health.d.ts +9 -0
  284. package/dist/templates/skills/verify-and-health.d.ts.map +1 -0
  285. package/dist/templates/skills/verify-and-health.js +99 -0
  286. package/dist/templates/skills/verify-and-health.js.map +1 -0
  287. package/package.json +72 -0
@@ -0,0 +1,529 @@
1
+ /**
2
+ * Multi-stage frontmatter validation.
3
+ *
4
+ * Stage 1: Schema — required fields, type enums, format rules
5
+ * Stage 2: References — inherits_from, related_domains, related_features, primary_rfcs exist
6
+ * Stage 3: Truthfulness — counts match content, token_estimate order-of-magnitude accurate
7
+ * Stage 4: Consistency — name↔directory, scope↔directory, bidirectional refs
8
+ */
9
+ import { parseFrontmatter, estimateTokens, extractSection, countSectionEntries, countTableRows } from './frontmatter-parser.js';
10
+ import { joinPath, baseName, dirName } from './config.js';
11
+ // ---------------------------------------------------------------------------
12
+ // Constants
13
+ // ---------------------------------------------------------------------------
14
+ const VALID_TYPES = ['navigation', 'constraints', 'rationale', 'procedures', 'mapping'];
15
+ const VALID_SCOPES = ['product', 'domain', 'feature', 'component', 'meta', 'methodology'];
16
+ const KEBAB_CASE_RE = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
17
+ const VERSION_RE = /^\d+\.\d+$/;
18
+ const MAX_SUMMARY_LENGTH = 200;
19
+ const TOKEN_TOLERANCE = 1.0; // 100% — warn when estimate would mislead load-or-skip decisions (off by 2x+)
20
+ // ---------------------------------------------------------------------------
21
+ // Main
22
+ // ---------------------------------------------------------------------------
23
+ export async function validateFrontmatter(options) {
24
+ const { projectRoot, config, fs, stages = [1, 2, 3, 4] } = options;
25
+ const files = options.files && options.files.length > 0
26
+ ? options.files
27
+ : await discoverOrganonFiles(projectRoot, config, fs);
28
+ const allErrors = [];
29
+ const allWarnings = [];
30
+ const results = [];
31
+ // Pre-load all frontmatter for cross-reference checks
32
+ const allFrontmatter = new Map();
33
+ for (const file of files) {
34
+ const absPath = joinPath(projectRoot, file);
35
+ try {
36
+ const content = await fs.readFile(absPath);
37
+ const { frontmatter } = parseFrontmatter(content);
38
+ allFrontmatter.set(file, frontmatter);
39
+ }
40
+ catch {
41
+ allFrontmatter.set(file, null);
42
+ }
43
+ }
44
+ for (const file of files) {
45
+ const fileErrors = [];
46
+ const fileWarnings = [];
47
+ const absPath = joinPath(projectRoot, file);
48
+ let content;
49
+ try {
50
+ content = await fs.readFile(absPath);
51
+ }
52
+ catch {
53
+ fileErrors.push({
54
+ severity: 'error',
55
+ code: 'FILE_READ_ERROR',
56
+ message: `Cannot read file: ${file}`,
57
+ file,
58
+ });
59
+ results.push({ file, valid: false, errors: fileErrors, warnings: fileWarnings });
60
+ allErrors.push(...fileErrors);
61
+ continue;
62
+ }
63
+ const { frontmatter, body } = parseFrontmatter(content);
64
+ if (!frontmatter) {
65
+ fileErrors.push({
66
+ severity: 'error',
67
+ code: 'FRONTMATTER_MISSING',
68
+ message: 'File has no YAML frontmatter',
69
+ file,
70
+ suggestion: 'Add --- delimited YAML block at the top of the file',
71
+ });
72
+ results.push({ file, valid: false, errors: fileErrors, warnings: fileWarnings });
73
+ allErrors.push(...fileErrors);
74
+ continue;
75
+ }
76
+ // Stage 1: Schema validation
77
+ if (stages.includes(1)) {
78
+ validateSchema(frontmatter, file, fileErrors, fileWarnings);
79
+ }
80
+ // Stage 2: Reference validation
81
+ if (stages.includes(2)) {
82
+ await validateReferences(frontmatter, file, allFrontmatter, projectRoot, config, fs, fileErrors, fileWarnings);
83
+ }
84
+ // Stage 3: Truthfulness validation
85
+ if (stages.includes(3)) {
86
+ validateTruthfulness(frontmatter, content, body, file, fileErrors, fileWarnings);
87
+ }
88
+ // Stage 4: Consistency validation
89
+ if (stages.includes(4)) {
90
+ validateConsistency(frontmatter, file, allFrontmatter, fileErrors, fileWarnings);
91
+ }
92
+ const valid = fileErrors.length === 0;
93
+ results.push({ file, valid, errors: fileErrors, warnings: fileWarnings });
94
+ allErrors.push(...fileErrors);
95
+ allWarnings.push(...fileWarnings);
96
+ }
97
+ return {
98
+ success: allErrors.length === 0,
99
+ filesChecked: files.length,
100
+ filesWithErrors: results.filter((r) => !r.valid).length,
101
+ filesWithWarnings: results.filter((r) => r.warnings.length > 0).length,
102
+ results,
103
+ errors: allErrors,
104
+ warnings: allWarnings,
105
+ };
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Stage 1: Schema
109
+ // ---------------------------------------------------------------------------
110
+ function validateSchema(fm, file, errors, warnings) {
111
+ // Required fields
112
+ const required = ['type', 'scope', 'name', 'version', 'summary', 'token_estimate'];
113
+ for (const field of required) {
114
+ if (fm[field] === undefined || fm[field] === null || fm[field] === '') {
115
+ errors.push({
116
+ severity: 'error',
117
+ code: 'FRONTMATTER_MISSING_FIELD',
118
+ message: `Missing required field: ${field}`,
119
+ file,
120
+ suggestion: `Add '${field}:' to the frontmatter`,
121
+ });
122
+ }
123
+ }
124
+ // Type enum
125
+ if (fm.type && !VALID_TYPES.includes(fm.type)) {
126
+ errors.push({
127
+ severity: 'error',
128
+ code: 'FRONTMATTER_INVALID_TYPE',
129
+ message: `Invalid type '${fm.type}'. Must be one of: ${VALID_TYPES.join(', ')}`,
130
+ file,
131
+ });
132
+ }
133
+ // Scope enum
134
+ if (fm.scope && !VALID_SCOPES.includes(fm.scope)) {
135
+ errors.push({
136
+ severity: 'error',
137
+ code: 'FRONTMATTER_INVALID_SCOPE',
138
+ message: `Invalid scope '${fm.scope}'. Must be one of: ${VALID_SCOPES.join(', ')}`,
139
+ file,
140
+ });
141
+ }
142
+ // Name: kebab-case
143
+ if (fm.name && !KEBAB_CASE_RE.test(fm.name)) {
144
+ errors.push({
145
+ severity: 'error',
146
+ code: 'FRONTMATTER_NAME_FORMAT',
147
+ message: `Name '${fm.name}' is not kebab-case`,
148
+ file,
149
+ suggestion: 'Use lowercase letters, numbers, and hyphens (e.g., "my-organon")',
150
+ });
151
+ }
152
+ // Version: X.Y format
153
+ if (fm.version && !VERSION_RE.test(String(fm.version))) {
154
+ errors.push({
155
+ severity: 'error',
156
+ code: 'FRONTMATTER_VERSION_FORMAT',
157
+ message: `Version '${fm.version}' is not in X.Y format`,
158
+ file,
159
+ suggestion: 'Use semantic version format like "1.0" or "3.0"',
160
+ });
161
+ }
162
+ // Summary length
163
+ if (fm.summary && fm.summary.length > MAX_SUMMARY_LENGTH) {
164
+ errors.push({
165
+ severity: 'error',
166
+ code: 'FRONTMATTER_SUMMARY_TOO_LONG',
167
+ message: `Summary is ${fm.summary.length} characters (max ${MAX_SUMMARY_LENGTH})`,
168
+ file,
169
+ suggestion: 'Shorten the summary to one concise sentence',
170
+ });
171
+ }
172
+ // Token estimate must be positive number
173
+ if (fm.token_estimate !== undefined && (typeof fm.token_estimate !== 'number' || fm.token_estimate <= 0)) {
174
+ errors.push({
175
+ severity: 'error',
176
+ code: 'FRONTMATTER_INVALID_TOKEN_ESTIMATE',
177
+ message: `token_estimate must be a positive number, got: ${fm.token_estimate}`,
178
+ file,
179
+ });
180
+ }
181
+ // Type-specific required fields
182
+ if (fm.type === 'constraints') {
183
+ for (const field of ['invariants_count', 'principles_count', 'heuristics_count']) {
184
+ if (fm[field] === undefined) {
185
+ warnings.push({
186
+ severity: 'warning',
187
+ code: 'FRONTMATTER_MISSING_TYPE_FIELD',
188
+ message: `Constraints file missing recommended field: ${field}`,
189
+ file,
190
+ suggestion: `Add '${field}:' to track content counts`,
191
+ });
192
+ }
193
+ }
194
+ }
195
+ if (fm.type === 'rationale') {
196
+ if (fm.decision_count === undefined) {
197
+ warnings.push({
198
+ severity: 'warning',
199
+ code: 'FRONTMATTER_MISSING_TYPE_FIELD',
200
+ message: 'Rationale file missing recommended field: decision_count',
201
+ file,
202
+ });
203
+ }
204
+ }
205
+ if (fm.type === 'procedures') {
206
+ if (fm.protocols_count === undefined) {
207
+ warnings.push({
208
+ severity: 'warning',
209
+ code: 'FRONTMATTER_MISSING_TYPE_FIELD',
210
+ message: 'Procedures file missing recommended field: protocols_count',
211
+ file,
212
+ });
213
+ }
214
+ }
215
+ }
216
+ // ---------------------------------------------------------------------------
217
+ // Stage 2: References
218
+ // ---------------------------------------------------------------------------
219
+ async function validateReferences(fm, file, allFrontmatter, projectRoot, config, fs, errors, warnings) {
220
+ // Check inherits_from references exist
221
+ if (fm.inherits_from) {
222
+ for (const parent of fm.inherits_from) {
223
+ const found = [...allFrontmatter.entries()].some(([, fmData]) => fmData?.name === parent);
224
+ if (!found) {
225
+ warnings.push({
226
+ severity: 'warning',
227
+ code: 'FRONTMATTER_BROKEN_INHERIT',
228
+ message: `inherits_from references '${parent}' but no organon with that name found`,
229
+ file,
230
+ });
231
+ }
232
+ }
233
+ }
234
+ // Check related_domains reference existing domains
235
+ if (fm.related_domains) {
236
+ for (const domain of fm.related_domains) {
237
+ const found = [...allFrontmatter.entries()].some(([, fmData]) => fmData?.name === domain && fmData?.scope === 'domain');
238
+ if (!found) {
239
+ warnings.push({
240
+ severity: 'warning',
241
+ code: 'FRONTMATTER_BROKEN_DOMAIN_REF',
242
+ message: `related_domains references '${domain}' but no domain organon with that name found`,
243
+ file,
244
+ });
245
+ }
246
+ }
247
+ }
248
+ // Check related_features reference existing features
249
+ if (fm.related_features) {
250
+ for (const feature of fm.related_features) {
251
+ const found = [...allFrontmatter.entries()].some(([, fmData]) => fmData?.name === feature && fmData?.scope === 'feature');
252
+ if (!found) {
253
+ warnings.push({
254
+ severity: 'warning',
255
+ code: 'FRONTMATTER_BROKEN_FEATURE_REF',
256
+ message: `related_features references '${feature}' but no feature organon with that name found`,
257
+ file,
258
+ });
259
+ }
260
+ }
261
+ }
262
+ // Check primary_rfcs reference existing RFC files
263
+ if (fm.primary_rfcs) {
264
+ for (const rfcNum of fm.primary_rfcs) {
265
+ // Try common RFC file patterns
266
+ const patterns = [
267
+ `**/RFC-${String(rfcNum).padStart(3, '0')}*`,
268
+ `**/rfc-${String(rfcNum).padStart(3, '0')}*`,
269
+ `**/RFC_${rfcNum}*`,
270
+ ];
271
+ let found = false;
272
+ for (const pattern of patterns) {
273
+ const matches = await fs.glob(pattern, {
274
+ cwd: projectRoot,
275
+ ignore: config.ignorePatterns,
276
+ });
277
+ if (matches.length > 0) {
278
+ found = true;
279
+ break;
280
+ }
281
+ }
282
+ if (!found) {
283
+ warnings.push({
284
+ severity: 'warning',
285
+ code: 'FRONTMATTER_BROKEN_RFC_REF',
286
+ message: `primary_rfcs references RFC ${rfcNum} but no matching file found`,
287
+ file,
288
+ });
289
+ }
290
+ }
291
+ }
292
+ }
293
+ // ---------------------------------------------------------------------------
294
+ // Stage 3: Truthfulness
295
+ // ---------------------------------------------------------------------------
296
+ function validateTruthfulness(fm, fullContent, body, file, errors, warnings) {
297
+ // Token estimate accuracy
298
+ if (fm.token_estimate && typeof fm.token_estimate === 'number') {
299
+ const actual = estimateTokens(fullContent);
300
+ const deviation = Math.abs(fm.token_estimate - actual) / actual;
301
+ if (deviation > TOKEN_TOLERANCE) {
302
+ warnings.push({
303
+ severity: 'warning',
304
+ code: 'FRONTMATTER_TOKEN_DRIFT',
305
+ message: `token_estimate ${fm.token_estimate} deviates ${Math.round(deviation * 100)}% from actual ~${actual}`,
306
+ file,
307
+ suggestion: `Update token_estimate to approximately ${actual}`,
308
+ });
309
+ }
310
+ }
311
+ // Invariants count (for constraints type)
312
+ if (fm.type === 'constraints' && fm.invariants_count !== undefined) {
313
+ const section = extractSection(body, 'Invariants');
314
+ if (section) {
315
+ const actual = countSectionEntries(section);
316
+ if (actual !== fm.invariants_count) {
317
+ errors.push({
318
+ severity: 'error',
319
+ code: 'FRONTMATTER_COUNT_MISMATCH',
320
+ message: `invariants_count is ${fm.invariants_count} but found ${actual} entries`,
321
+ file,
322
+ suggestion: `Update invariants_count to ${actual}`,
323
+ });
324
+ }
325
+ }
326
+ }
327
+ // Principles count (for constraints type)
328
+ if (fm.type === 'constraints' && fm.principles_count !== undefined) {
329
+ const section = extractSection(body, 'Principles');
330
+ if (section) {
331
+ const actual = countSectionEntries(section);
332
+ if (actual !== fm.principles_count) {
333
+ errors.push({
334
+ severity: 'error',
335
+ code: 'FRONTMATTER_COUNT_MISMATCH',
336
+ message: `principles_count is ${fm.principles_count} but found ${actual} entries`,
337
+ file,
338
+ suggestion: `Update principles_count to ${actual}`,
339
+ });
340
+ }
341
+ }
342
+ }
343
+ // Heuristics count (for constraints type) — count table rows
344
+ if (fm.type === 'constraints' && fm.heuristics_count !== undefined) {
345
+ const section = extractSection(body, 'Decision Heuristics');
346
+ if (section) {
347
+ const actual = countTableRows(section);
348
+ if (actual !== fm.heuristics_count) {
349
+ errors.push({
350
+ severity: 'error',
351
+ code: 'FRONTMATTER_COUNT_MISMATCH',
352
+ message: `heuristics_count is ${fm.heuristics_count} but found ${actual} table rows`,
353
+ file,
354
+ suggestion: `Update heuristics_count to ${actual}`,
355
+ });
356
+ }
357
+ }
358
+ }
359
+ // Decision count (for rationale type)
360
+ if (fm.type === 'rationale' && fm.decision_count !== undefined) {
361
+ const section = extractSection(body, 'Design Decisions');
362
+ if (section) {
363
+ const actual = countSectionEntries(section);
364
+ if (actual !== fm.decision_count) {
365
+ errors.push({
366
+ severity: 'error',
367
+ code: 'FRONTMATTER_COUNT_MISMATCH',
368
+ message: `decision_count is ${fm.decision_count} but found ${actual} entries`,
369
+ file,
370
+ suggestion: `Update decision_count to ${actual}`,
371
+ });
372
+ }
373
+ }
374
+ }
375
+ // Protocols count (for procedures type)
376
+ if (fm.type === 'procedures' && fm.protocols_count !== undefined) {
377
+ if (fm.protocols) {
378
+ if (fm.protocols.length !== fm.protocols_count) {
379
+ errors.push({
380
+ severity: 'error',
381
+ code: 'FRONTMATTER_COUNT_MISMATCH',
382
+ message: `protocols_count is ${fm.protocols_count} but protocols array has ${fm.protocols.length} entries`,
383
+ file,
384
+ suggestion: `Update protocols_count to ${fm.protocols.length}`,
385
+ });
386
+ }
387
+ }
388
+ }
389
+ // Invariants array validation (for constraints type)
390
+ if (fm.type === 'constraints' && fm.invariants) {
391
+ const invArray = fm.invariants;
392
+ // Count matches invariants_count
393
+ if (fm.invariants_count !== undefined && invArray.length !== fm.invariants_count) {
394
+ errors.push({
395
+ severity: 'error',
396
+ code: 'FRONTMATTER_INVARIANT_COUNT_MISMATCH',
397
+ message: `invariants_count is ${fm.invariants_count} but invariants array has ${invArray.length} entries`,
398
+ file,
399
+ suggestion: `Update invariants_count to ${invArray.length}`,
400
+ });
401
+ }
402
+ // ID format and duplicates
403
+ const INVARIANT_ID_RE = /^INV-[\w]+-\d+$/;
404
+ const seenIds = new Set();
405
+ for (const inv of invArray) {
406
+ if (inv.id) {
407
+ if (!INVARIANT_ID_RE.test(inv.id)) {
408
+ errors.push({
409
+ severity: 'error',
410
+ code: 'FRONTMATTER_INVARIANT_ID_FORMAT',
411
+ message: `Invariant ID '${inv.id}' does not match INV-{SCOPE}-{N} format`,
412
+ file,
413
+ suggestion: `Use format INV-SCOPE-1, e.g., INV-META-1`,
414
+ });
415
+ }
416
+ if (seenIds.has(inv.id)) {
417
+ errors.push({
418
+ severity: 'error',
419
+ code: 'FRONTMATTER_INVARIANT_DUPLICATE_ID',
420
+ message: `Duplicate invariant ID: ${inv.id}`,
421
+ file,
422
+ });
423
+ }
424
+ seenIds.add(inv.id);
425
+ }
426
+ }
427
+ }
428
+ }
429
+ // ---------------------------------------------------------------------------
430
+ // Stage 4: Consistency
431
+ // ---------------------------------------------------------------------------
432
+ function validateConsistency(fm, file, allFrontmatter, errors, warnings) {
433
+ const dir = dirName(file);
434
+ const dirParts = dir.replace(/\\/g, '/').split('/');
435
+ // Name should match parent directory
436
+ if (fm.name && dirParts.length > 0) {
437
+ const parentDir = dirParts[dirParts.length - 1];
438
+ // Only check for non-root files (skip top-level ETHOS.md etc.)
439
+ if (parentDir !== '.' && parentDir !== '' && baseName(file) !== 'README.md') {
440
+ if (fm.name !== parentDir && fm.name !== parentDir.toLowerCase()) {
441
+ warnings.push({
442
+ severity: 'warning',
443
+ code: 'FRONTMATTER_NAME_DIR_MISMATCH',
444
+ message: `name '${fm.name}' doesn't match parent directory '${parentDir}'`,
445
+ file,
446
+ suggestion: `Consider renaming to '${parentDir.toLowerCase()}'`,
447
+ });
448
+ }
449
+ }
450
+ }
451
+ // Scope should match directory structure
452
+ if (fm.scope) {
453
+ const pathStr = file.replace(/\\/g, '/');
454
+ const scopeFromPath = inferScopeFromPath(pathStr);
455
+ if (scopeFromPath && scopeFromPath !== fm.scope) {
456
+ warnings.push({
457
+ severity: 'warning',
458
+ code: 'FRONTMATTER_SCOPE_DIR_MISMATCH',
459
+ message: `scope '${fm.scope}' doesn't match expected scope '${scopeFromPath}' from directory structure`,
460
+ file,
461
+ });
462
+ }
463
+ }
464
+ // Bidirectional references: if A references B in related_domains, B should reference A
465
+ if (fm.related_domains) {
466
+ for (const domain of fm.related_domains) {
467
+ const targetEntry = [...allFrontmatter.entries()].find(([, fmData]) => fmData?.name === domain);
468
+ if (targetEntry) {
469
+ const [, targetFm] = targetEntry;
470
+ if (targetFm?.related_domains && !targetFm.related_domains.includes(fm.name)) {
471
+ warnings.push({
472
+ severity: 'warning',
473
+ code: 'FRONTMATTER_UNIDIRECTIONAL_REF',
474
+ message: `References domain '${domain}' but '${domain}' doesn't reference back`,
475
+ file,
476
+ suggestion: `Add '${fm.name}' to related_domains in ${domain}'s organon`,
477
+ });
478
+ }
479
+ }
480
+ }
481
+ }
482
+ // Automation tier consistency: if automated, workflow should exist
483
+ if (fm.type === 'procedures' && fm.protocols) {
484
+ for (const proto of fm.protocols) {
485
+ if (proto.automation_tier === 'automated' && !proto.workflow) {
486
+ errors.push({
487
+ severity: 'error',
488
+ code: 'FRONTMATTER_MISSING_WORKFLOW',
489
+ message: `Protocol ${proto.id} declares automation_tier 'automated' but has no workflow binding`,
490
+ file,
491
+ suggestion: `Add 'workflow:' to protocol ${proto.id} or change tier to 'manual'`,
492
+ });
493
+ }
494
+ }
495
+ }
496
+ }
497
+ // ---------------------------------------------------------------------------
498
+ // Helpers
499
+ // ---------------------------------------------------------------------------
500
+ function inferScopeFromPath(path) {
501
+ if (path.includes('/domains/'))
502
+ return 'domain';
503
+ if (path.includes('/features/'))
504
+ return 'feature';
505
+ if (path.includes('/components/'))
506
+ return 'component';
507
+ if (path.includes('/methodology/'))
508
+ return 'methodology';
509
+ if (path.includes('book-llms/') || path.includes('book-humans/'))
510
+ return 'meta';
511
+ return null;
512
+ }
513
+ async function discoverOrganonFiles(projectRoot, config, fs) {
514
+ const allFiles = new Set();
515
+ for (const organonPath of config.organonPaths) {
516
+ for (const pattern of config.organonGlobs) {
517
+ const fullPattern = organonPath === '.' ? pattern : `${organonPath}/${pattern}`;
518
+ const matches = await fs.glob(fullPattern, {
519
+ cwd: projectRoot,
520
+ ignore: config.ignorePatterns,
521
+ });
522
+ for (const m of matches) {
523
+ allFiles.add(m);
524
+ }
525
+ }
526
+ }
527
+ return [...allFiles].sort();
528
+ }
529
+ //# sourceMappingURL=validate-frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-frontmatter.js","sourceRoot":"","sources":["../../src/core/validate-frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAChI,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AA0B1D,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,WAAW,GAAsB,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAC3G,MAAM,YAAY,GAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AAC9G,MAAM,aAAa,GAAG,iCAAiC,CAAC;AACxD,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,8EAA8E;AAE3G,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAmC;IAEnC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC;IAEnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACrD,CAAC,CAAC,OAAO,CAAC,KAAK;QACf,CAAC,CAAC,MAAM,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAExD,MAAM,SAAS,GAAwB,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,sDAAsD;IACtD,MAAM,cAAc,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAClD,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAwB,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAwB,EAAE,CAAC;QAE7C,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CAAC,IAAI,CAAC;gBACd,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,qBAAqB,IAAI,EAAE;gBACpC,IAAI;aACL,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACjF,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAExD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC;gBACd,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,8BAA8B;gBACvC,IAAI;gBACJ,UAAU,EAAE,qDAAqD;aAClE,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACjF,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QAC9D,CAAC;QAED,gCAAgC;QAChC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACjH,CAAC;QAED,mCAAmC;QACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,oBAAoB,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACnF,CAAC;QAED,kCAAkC;QAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,mBAAmB,CAAC,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1E,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC9B,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC;QAC/B,YAAY,EAAE,KAAK,CAAC,MAAM;QAC1B,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM;QACvD,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM;QACtE,OAAO;QACP,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,WAAW;KACtB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,cAAc,CACrB,EAAe,EACf,IAAY,EACZ,MAA2B,EAC3B,QAA6B;IAE7B,kBAAkB;IAClB,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,CAAU,CAAC;IAC5F,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,2BAA2B;gBACjC,OAAO,EAAE,2BAA2B,KAAK,EAAE;gBAC3C,IAAI;gBACJ,UAAU,EAAE,QAAQ,KAAK,uBAAuB;aACjD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,YAAY;IACZ,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,iBAAiB,EAAE,CAAC,IAAI,sBAAsB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC/E,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,aAAa;IACb,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,kBAAkB,EAAE,CAAC,KAAK,sBAAsB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAClF,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,SAAS,EAAE,CAAC,IAAI,qBAAqB;YAC9C,IAAI;YACJ,UAAU,EAAE,kEAAkE;SAC/E,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,IAAI,EAAE,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,YAAY,EAAE,CAAC,OAAO,wBAAwB;YACvD,IAAI;YACJ,UAAU,EAAE,iDAAiD;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;IACjB,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,MAAM,oBAAoB,kBAAkB,GAAG;YACjF,IAAI;YACJ,UAAU,EAAE,6CAA6C;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,yCAAyC;IACzC,IAAI,EAAE,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,KAAK,QAAQ,IAAI,EAAE,CAAC,cAAc,IAAI,CAAC,CAAC,EAAE,CAAC;QACzG,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,oCAAoC;YAC1C,OAAO,EAAE,kDAAkD,EAAE,CAAC,cAAc,EAAE;YAC9E,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,CAAU,EAAE,CAAC;YAC1F,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,gCAAgC;oBACtC,OAAO,EAAE,+CAA+C,KAAK,EAAE;oBAC/D,IAAI;oBACJ,UAAU,EAAE,QAAQ,KAAK,4BAA4B;iBACtD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC5B,IAAI,EAAE,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,gCAAgC;gBACtC,OAAO,EAAE,0DAA0D;gBACnE,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,gCAAgC;gBACtC,OAAO,EAAE,4DAA4D;gBACrE,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,KAAK,UAAU,kBAAkB,CAC/B,EAAe,EACf,IAAY,EACZ,cAA+C,EAC/C,WAAmB,EACnB,MAAqB,EACrB,EAAc,EACd,MAA2B,EAC3B,QAA6B;IAE7B,uCAAuC;IACvC,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CACxC,CAAC;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,6BAA6B,MAAM,uCAAuC;oBACnF,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;QACvB,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,IAAI,MAAM,EAAE,KAAK,KAAK,QAAQ,CACtE,CAAC;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,+BAA+B;oBACrC,OAAO,EAAE,+BAA+B,MAAM,8CAA8C;oBAC5F,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACxB,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,CACxE,CAAC;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,gCAAgC;oBACtC,OAAO,EAAE,gCAAgC,OAAO,+CAA+C;oBAC/F,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;YACrC,+BAA+B;YAC/B,MAAM,QAAQ,GAAG;gBACf,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;gBAC5C,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;gBAC5C,UAAU,MAAM,GAAG;aACpB,CAAC;YACF,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;oBACrC,GAAG,EAAE,WAAW;oBAChB,MAAM,EAAE,MAAM,CAAC,cAAc;iBAC9B,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,KAAK,GAAG,IAAI,CAAC;oBACb,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,+BAA+B,MAAM,6BAA6B;oBAC3E,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,SAAS,oBAAoB,CAC3B,EAAe,EACf,WAAmB,EACnB,IAAY,EACZ,IAAY,EACZ,MAA2B,EAC3B,QAA6B;IAE7B,0BAA0B;IAC1B,IAAI,EAAE,CAAC,cAAc,IAAI,OAAO,EAAE,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;QAChE,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,yBAAyB;gBAC/B,OAAO,EAAE,kBAAkB,EAAE,CAAC,cAAc,aAAa,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,kBAAkB,MAAM,EAAE;gBAC9G,IAAI;gBACJ,UAAU,EAAE,0CAA0C,MAAM,EAAE;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,IAAI,EAAE,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,MAAM,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,uBAAuB,EAAE,CAAC,gBAAgB,cAAc,MAAM,UAAU;oBACjF,IAAI;oBACJ,UAAU,EAAE,8BAA8B,MAAM,EAAE;iBACnD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,IAAI,EAAE,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,MAAM,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,uBAAuB,EAAE,CAAC,gBAAgB,cAAc,MAAM,UAAU;oBACjF,IAAI;oBACJ,UAAU,EAAE,8BAA8B,MAAM,EAAE;iBACnD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,IAAI,EAAE,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QAC5D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,MAAM,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,uBAAuB,EAAE,CAAC,gBAAgB,cAAc,MAAM,aAAa;oBACpF,IAAI;oBACJ,UAAU,EAAE,8BAA8B,MAAM,EAAE;iBACnD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,IAAI,EAAE,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACzD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,MAAM,KAAK,EAAE,CAAC,cAAc,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,qBAAqB,EAAE,CAAC,cAAc,cAAc,MAAM,UAAU;oBAC7E,IAAI;oBACJ,UAAU,EAAE,4BAA4B,MAAM,EAAE;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACjE,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,EAAE,CAAC,eAAe,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,sBAAsB,EAAE,CAAC,eAAe,4BAA4B,EAAE,CAAC,SAAS,CAAC,MAAM,UAAU;oBAC1G,IAAI;oBACJ,UAAU,EAAE,6BAA6B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE;iBAC/D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAmD,CAAC;QAExE,iCAAiC;QACjC,IAAI,EAAE,CAAC,gBAAgB,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,sCAAsC;gBAC5C,OAAO,EAAE,uBAAuB,EAAE,CAAC,gBAAgB,6BAA6B,QAAQ,CAAC,MAAM,UAAU;gBACzG,IAAI;gBACJ,UAAU,EAAE,8BAA8B,QAAQ,CAAC,MAAM,EAAE;aAC5D,CAAC,CAAC;QACL,CAAC;QAED,2BAA2B;QAC3B,MAAM,eAAe,GAAG,iBAAiB,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,OAAO;wBACjB,IAAI,EAAE,iCAAiC;wBACvC,OAAO,EAAE,iBAAiB,GAAG,CAAC,EAAE,yCAAyC;wBACzE,IAAI;wBACJ,UAAU,EAAE,0CAA0C;qBACvD,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,OAAO;wBACjB,IAAI,EAAE,oCAAoC;wBAC1C,OAAO,EAAE,2BAA2B,GAAG,CAAC,EAAE,EAAE;wBAC5C,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,mBAAmB,CAC1B,EAAe,EACf,IAAY,EACZ,cAA+C,EAC/C,MAA2B,EAC3B,QAA6B;IAE7B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpD,qCAAqC;IACrC,IAAI,EAAE,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChD,+DAA+D;QAC/D,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;YAC5E,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;gBACjE,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,+BAA+B;oBACrC,OAAO,EAAE,SAAS,EAAE,CAAC,IAAI,qCAAqC,SAAS,GAAG;oBAC1E,IAAI;oBACJ,UAAU,EAAE,yBAAyB,SAAS,CAAC,WAAW,EAAE,GAAG;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,aAAa,IAAI,aAAa,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,gCAAgC;gBACtC,OAAO,EAAE,UAAU,EAAE,CAAC,KAAK,mCAAmC,aAAa,4BAA4B;gBACvG,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;QACvB,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CACpD,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CACxC,CAAC;YACF,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAC;gBACjC,IAAI,QAAQ,EAAE,eAAe,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7E,QAAQ,CAAC,IAAI,CAAC;wBACZ,QAAQ,EAAE,SAAS;wBACnB,IAAI,EAAE,gCAAgC;wBACtC,OAAO,EAAE,sBAAsB,MAAM,UAAU,MAAM,0BAA0B;wBAC/E,IAAI;wBACJ,UAAU,EAAE,QAAQ,EAAE,CAAC,IAAI,2BAA2B,MAAM,YAAY;qBACzE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC7D,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,8BAA8B;oBACpC,OAAO,EAAE,YAAY,KAAK,CAAC,EAAE,mEAAmE;oBAChG,IAAI;oBACJ,UAAU,EAAE,+BAA+B,KAAK,CAAC,EAAE,6BAA6B;iBACjF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,WAAW,CAAC;IACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,aAAa,CAAC;IACzD,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,MAAM,CAAC;IAChF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,WAAmB,EACnB,MAAqB,EACrB,EAAc;IAEd,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC9C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;YAChF,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;gBACzC,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE,MAAM,CAAC,cAAc;aAC9B,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate-frontmatter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-frontmatter.test.d.ts","sourceRoot":"","sources":["../../src/core/validate-frontmatter.test.ts"],"names":[],"mappings":""}