@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,122 @@
1
+ /**
2
+ * YAML frontmatter extraction utility.
3
+ *
4
+ * Parses the --- delimited YAML block at the top of organon files.
5
+ * Returns typed Frontmatter or null if missing/invalid.
6
+ */
7
+ import { parse as parseYaml } from 'yaml';
8
+ const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n---/;
9
+ /**
10
+ * Extract and parse YAML frontmatter from file content.
11
+ */
12
+ export function parseFrontmatter(content) {
13
+ const match = content.match(FRONTMATTER_REGEX);
14
+ if (!match) {
15
+ return { frontmatter: null, rawFrontmatter: '', body: content };
16
+ }
17
+ const rawFrontmatter = match[1];
18
+ const body = content.slice(match[0].length).replace(/^\r?\n/, '');
19
+ try {
20
+ const parsed = parseYaml(rawFrontmatter);
21
+ if (parsed === null || typeof parsed !== 'object') {
22
+ return { frontmatter: null, rawFrontmatter, body };
23
+ }
24
+ return { frontmatter: parsed, rawFrontmatter, body };
25
+ }
26
+ catch {
27
+ return { frontmatter: null, rawFrontmatter, body };
28
+ }
29
+ }
30
+ /**
31
+ * Build a ParsedOrganonFile from raw file content and path.
32
+ */
33
+ export function parseOrganonFile(path, content) {
34
+ const { frontmatter, rawFrontmatter, body } = parseFrontmatter(content);
35
+ return { path, frontmatter, rawFrontmatter, body, content };
36
+ }
37
+ /**
38
+ * Estimate token count from content.
39
+ * Heuristic: ~3.5 characters per token for markdown text.
40
+ * (Accounts for spaces, punctuation, and markdown syntax)
41
+ */
42
+ export function estimateTokens(content) {
43
+ return Math.ceil(content.length / 3.5);
44
+ }
45
+ /**
46
+ * Count entries in a numbered/bulleted section.
47
+ * Matches patterns like:
48
+ * 1. **Name.**
49
+ * ### 1. Name
50
+ * - **Name.**
51
+ * ### Invariant 1:
52
+ */
53
+ export function countSectionEntries(sectionContent) {
54
+ const lines = sectionContent.split('\n');
55
+ let count = 0;
56
+ for (const line of lines) {
57
+ const trimmed = line.trim();
58
+ // Match numbered entries: "1. **", "1. ", "### 1."
59
+ if (/^\d+\.\s/.test(trimmed)) {
60
+ count++;
61
+ }
62
+ // Match heading-style entries: "### Invariant 1:", "### Name"
63
+ else if (/^#{2,4}\s+(?:Invariant\s+)?\d+/i.test(trimmed)) {
64
+ count++;
65
+ }
66
+ }
67
+ return count;
68
+ }
69
+ /**
70
+ * Extract a specific ## section from markdown content.
71
+ * Returns the content between the matched heading and the next ## heading (or EOF).
72
+ */
73
+ export function extractSection(content, heading) {
74
+ // Escape special regex characters in heading but allow flexible whitespace
75
+ const escapedHeading = heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
76
+ const pattern = new RegExp(`^##\\s+${escapedHeading}.*$`, 'm');
77
+ const match = content.match(pattern);
78
+ if (!match || match.index === undefined)
79
+ return null;
80
+ const start = match.index + match[0].length;
81
+ const rest = content.slice(start);
82
+ // Find next ## heading
83
+ const nextHeading = rest.match(/^##\s+/m);
84
+ const sectionContent = nextHeading && nextHeading.index !== undefined
85
+ ? rest.slice(0, nextHeading.index)
86
+ : rest;
87
+ return sectionContent.trim();
88
+ }
89
+ /**
90
+ * Count rows in a markdown table (excluding header and separator rows).
91
+ */
92
+ export function countTableRows(sectionContent) {
93
+ const lines = sectionContent.split('\n');
94
+ let inTable = false;
95
+ let headerSeen = false;
96
+ let count = 0;
97
+ for (const line of lines) {
98
+ const trimmed = line.trim();
99
+ if (trimmed.startsWith('|') && trimmed.endsWith('|')) {
100
+ if (!inTable) {
101
+ inTable = true;
102
+ continue; // header row
103
+ }
104
+ if (!headerSeen) {
105
+ // separator row (|---|---|)
106
+ if (/^\|[\s\-:|]+\|$/.test(trimmed)) {
107
+ headerSeen = true;
108
+ continue;
109
+ }
110
+ }
111
+ if (headerSeen) {
112
+ count++;
113
+ }
114
+ }
115
+ else {
116
+ inTable = false;
117
+ headerSeen = false;
118
+ }
119
+ }
120
+ return count;
121
+ }
122
+ //# sourceMappingURL=frontmatter-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter-parser.js","sourceRoot":"","sources":["../../src/core/frontmatter-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=frontmatter-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter-parser.test.d.ts","sourceRoot":"","sources":["../../src/core/frontmatter-parser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,200 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseFrontmatter, parseOrganonFile, estimateTokens, countSectionEntries, extractSection, countTableRows, } from './frontmatter-parser.js';
3
+ describe('parseFrontmatter', () => {
4
+ it('parses valid YAML frontmatter', () => {
5
+ const content = `---
6
+ type: constraints
7
+ scope: domain
8
+ name: test
9
+ version: "1.0"
10
+ summary: A test file
11
+ token_estimate: 500
12
+ ---
13
+
14
+ # Content here`;
15
+ const result = parseFrontmatter(content);
16
+ expect(result.frontmatter).not.toBeNull();
17
+ expect(result.frontmatter.type).toBe('constraints');
18
+ expect(result.frontmatter.scope).toBe('domain');
19
+ expect(result.frontmatter.name).toBe('test');
20
+ expect(result.frontmatter.version).toBe('1.0');
21
+ expect(result.body).toContain('# Content here');
22
+ expect(result.rawFrontmatter).toContain('type: constraints');
23
+ });
24
+ it('returns null frontmatter for files without frontmatter', () => {
25
+ const content = '# Just a markdown file\n\nNo frontmatter here.';
26
+ const result = parseFrontmatter(content);
27
+ expect(result.frontmatter).toBeNull();
28
+ expect(result.rawFrontmatter).toBe('');
29
+ expect(result.body).toBe(content);
30
+ });
31
+ it('returns null frontmatter for invalid YAML', () => {
32
+ const content = `---
33
+ {{not: valid: yaml: [}}
34
+ ---
35
+
36
+ # Content`;
37
+ const result = parseFrontmatter(content);
38
+ expect(result.frontmatter).toBeNull();
39
+ });
40
+ it('handles frontmatter with arrays and nested objects', () => {
41
+ const content = `---
42
+ type: procedures
43
+ scope: methodology
44
+ name: test-proto
45
+ version: "1.0"
46
+ summary: Test
47
+ token_estimate: 300
48
+ protocols:
49
+ - id: PROTO-TEST-1
50
+ name: Test Protocol
51
+ steps: 5
52
+ automation_tier: manual
53
+ complexity: medium
54
+ ---
55
+
56
+ # Content`;
57
+ const result = parseFrontmatter(content);
58
+ expect(result.frontmatter.protocols).toHaveLength(1);
59
+ expect(result.frontmatter.protocols[0].id).toBe('PROTO-TEST-1');
60
+ });
61
+ it('handles Windows-style line endings', () => {
62
+ const content = '---\r\ntype: constraints\r\nname: test\r\n---\r\n\r\n# Content';
63
+ const result = parseFrontmatter(content);
64
+ expect(result.frontmatter).not.toBeNull();
65
+ expect(result.frontmatter.type).toBe('constraints');
66
+ });
67
+ });
68
+ describe('parseOrganonFile', () => {
69
+ it('returns a complete ParsedOrganonFile', () => {
70
+ const content = `---
71
+ type: constraints
72
+ scope: meta
73
+ name: test
74
+ version: "1.0"
75
+ summary: Test
76
+ token_estimate: 200
77
+ ---
78
+
79
+ # Body`;
80
+ const result = parseOrganonFile('book-llms/ETHOS.md', content);
81
+ expect(result.path).toBe('book-llms/ETHOS.md');
82
+ expect(result.frontmatter).not.toBeNull();
83
+ expect(result.body).toContain('# Body');
84
+ expect(result.content).toBe(content);
85
+ });
86
+ });
87
+ describe('estimateTokens', () => {
88
+ it('estimates ~1 token per 3.5 characters', () => {
89
+ const content = 'a'.repeat(400);
90
+ expect(estimateTokens(content)).toBe(115); // ceil(400/3.5) = 115
91
+ });
92
+ it('rounds up', () => {
93
+ const content = 'a'.repeat(5);
94
+ expect(estimateTokens(content)).toBe(2); // ceil(5/3.5) = 2
95
+ });
96
+ });
97
+ describe('countSectionEntries', () => {
98
+ it('counts numbered entries', () => {
99
+ const section = `
100
+ 1. **Rule one.** Description.
101
+ 2. **Rule two.** Description.
102
+ 3. **Rule three.** Description.
103
+ `;
104
+ expect(countSectionEntries(section)).toBe(3);
105
+ });
106
+ it('counts heading-style entries', () => {
107
+ const section = `
108
+ ### 1. First heading
109
+ Content.
110
+
111
+ ### 2. Second heading
112
+ Content.
113
+ `;
114
+ expect(countSectionEntries(section)).toBe(2);
115
+ });
116
+ it('returns 0 for empty section', () => {
117
+ expect(countSectionEntries('')).toBe(0);
118
+ });
119
+ it('ignores non-numbered lines', () => {
120
+ const section = `
121
+ Some text before.
122
+ - bullet point
123
+ * another bullet
124
+ 1. **Actual entry.** Real one.
125
+ More text.
126
+ `;
127
+ expect(countSectionEntries(section)).toBe(1);
128
+ });
129
+ });
130
+ describe('extractSection', () => {
131
+ it('extracts a section by heading', () => {
132
+ const content = `## Identity
133
+
134
+ Some identity content.
135
+
136
+ ## Invariants
137
+
138
+ 1. **Rule 1.** Description.
139
+ 2. **Rule 2.** Description.
140
+
141
+ ## Principles
142
+
143
+ 1. **Principle 1.** Description.
144
+ `;
145
+ const section = extractSection(content, 'Invariants');
146
+ expect(section).not.toBeNull();
147
+ expect(section).toContain('Rule 1');
148
+ expect(section).toContain('Rule 2');
149
+ expect(section).not.toContain('Principle 1');
150
+ expect(section).not.toContain('Some identity');
151
+ });
152
+ it('returns null for missing section', () => {
153
+ const content = '## Identity\n\nContent.';
154
+ expect(extractSection(content, 'Invariants')).toBeNull();
155
+ });
156
+ it('extracts the last section (no next heading)', () => {
157
+ const content = `## First
158
+
159
+ First content.
160
+
161
+ ## Last
162
+
163
+ Last content here.
164
+ `;
165
+ const section = extractSection(content, 'Last');
166
+ expect(section).not.toBeNull();
167
+ expect(section).toContain('Last content here.');
168
+ });
169
+ });
170
+ describe('countTableRows', () => {
171
+ it('counts data rows excluding header and separator', () => {
172
+ const section = `
173
+ | Situation | Action |
174
+ |-----------|--------|
175
+ | When X | Do Y |
176
+ | When A | Do B |
177
+ | When C | Do D |
178
+ `;
179
+ expect(countTableRows(section)).toBe(3);
180
+ });
181
+ it('returns 0 for no table', () => {
182
+ expect(countTableRows('Just plain text')).toBe(0);
183
+ });
184
+ it('handles multiple tables', () => {
185
+ const section = `
186
+ | Col1 | Col2 |
187
+ |------|------|
188
+ | A | B |
189
+
190
+ Some text between.
191
+
192
+ | Col1 | Col2 |
193
+ |------|------|
194
+ | C | D |
195
+ | E | F |
196
+ `;
197
+ expect(countTableRows(section)).toBe(3);
198
+ });
199
+ });
200
+ //# sourceMappingURL=frontmatter-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter-parser.test.js","sourceRoot":"","sources":["../../src/core/frontmatter-parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Auto-generate frontmatter from file content.
3
+ *
4
+ * Analyzes the file's content to infer type, scope, name, version,
5
+ * summary, token_estimate, and type-specific counts. Can be used to
6
+ * bootstrap frontmatter for new files or update stale counts.
7
+ */
8
+ import type { FileSystem, Frontmatter, FrontmatterScope, FrontmatterType, GenerateFrontmatterResult, OrganonConfig } from './types.js';
9
+ export interface GenerateFrontmatterOptions {
10
+ projectRoot: string;
11
+ config: OrganonConfig;
12
+ fs: FileSystem;
13
+ /** File to generate frontmatter for (project-relative path) */
14
+ file: string;
15
+ /** If true, write updated frontmatter back to file */
16
+ update?: boolean;
17
+ /** Override auto-detected type */
18
+ type?: FrontmatterType;
19
+ /** Override auto-detected scope */
20
+ scope?: FrontmatterScope;
21
+ }
22
+ export declare function generateFrontmatter(options: GenerateFrontmatterOptions): Promise<GenerateFrontmatterResult>;
23
+ /**
24
+ * Serialize generated frontmatter as a YAML block (with --- delimiters).
25
+ */
26
+ export declare function serializeFrontmatter(fm: Partial<Frontmatter>): string;
27
+ //# sourceMappingURL=generate-frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-frontmatter.d.ts","sourceRoot":"","sources":["../../src/core/generate-frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAEV,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,yBAAyB,EACzB,aAAa,EACd,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,EAAE,UAAU,CAAC;IACf,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,mCAAmC;IACnC,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAMD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC,CAsGpC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAGrE"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Auto-generate frontmatter from file content.
3
+ *
4
+ * Analyzes the file's content to infer type, scope, name, version,
5
+ * summary, token_estimate, and type-specific counts. Can be used to
6
+ * bootstrap frontmatter for new files or update stale counts.
7
+ */
8
+ import { parseFrontmatter, estimateTokens, extractSection, countSectionEntries, countTableRows } from './frontmatter-parser.js';
9
+ import { parseProtocols } from './add-protocols-array.js';
10
+ import { joinPath, baseName, dirName } from './config.js';
11
+ import { stringify as yamlStringify } from 'yaml';
12
+ // ---------------------------------------------------------------------------
13
+ // Main
14
+ // ---------------------------------------------------------------------------
15
+ export async function generateFrontmatter(options) {
16
+ const { projectRoot, fs, file } = options;
17
+ const errors = [];
18
+ const warnings = [];
19
+ const absPath = joinPath(projectRoot, file);
20
+ let content;
21
+ try {
22
+ content = await fs.readFile(absPath);
23
+ }
24
+ catch {
25
+ return {
26
+ success: false,
27
+ file,
28
+ generated: {},
29
+ errors: [{
30
+ severity: 'error',
31
+ code: 'FILE_READ_ERROR',
32
+ message: `Cannot read file: ${file}`,
33
+ file,
34
+ }],
35
+ warnings: [],
36
+ };
37
+ }
38
+ const existing = parseFrontmatter(content);
39
+ const body = existing.body || content;
40
+ const existingFm = existing.frontmatter;
41
+ // Infer fields from content and path
42
+ const type = options.type ?? existingFm?.type ?? inferType(file);
43
+ const scope = options.scope ?? existingFm?.scope ?? inferScope(file);
44
+ const name = existingFm?.name ?? inferName(file);
45
+ const version = existingFm?.version ?? '1.0';
46
+ const summary = existingFm?.summary ?? inferSummary(body);
47
+ const tokenEstimate = estimateTokens(content);
48
+ const generated = {
49
+ type,
50
+ scope,
51
+ name,
52
+ version,
53
+ summary,
54
+ token_estimate: tokenEstimate,
55
+ };
56
+ // Type-specific fields
57
+ if (type === 'constraints') {
58
+ const invariantsSection = extractSection(body, 'Invariants');
59
+ if (invariantsSection) {
60
+ generated.invariants_count = countSectionEntries(invariantsSection);
61
+ }
62
+ const principlesSection = extractSection(body, 'Principles');
63
+ if (principlesSection) {
64
+ generated.principles_count = countSectionEntries(principlesSection);
65
+ }
66
+ const heuristicsSection = extractSection(body, 'Decision Heuristics');
67
+ if (heuristicsSection) {
68
+ generated.heuristics_count = countTableRows(heuristicsSection);
69
+ }
70
+ }
71
+ if (type === 'rationale') {
72
+ const decisionsSection = extractSection(body, 'Design Decisions');
73
+ if (decisionsSection) {
74
+ generated.decision_count = countSectionEntries(decisionsSection);
75
+ }
76
+ }
77
+ if (type === 'procedures') {
78
+ const protocols = parseProtocols(body);
79
+ if (protocols.length > 0) {
80
+ generated.protocols_count = protocols.length;
81
+ generated.protocols = protocols;
82
+ }
83
+ }
84
+ if (type === 'navigation') {
85
+ generated.provides = inferProvides(body);
86
+ generated.parent = inferParent(file);
87
+ }
88
+ // Preserve existing relationship fields
89
+ if (existingFm) {
90
+ if (existingFm.inherits_from)
91
+ generated.inherits_from = existingFm.inherits_from;
92
+ if (existingFm.related_domains)
93
+ generated.related_domains = existingFm.related_domains;
94
+ if (existingFm.related_features)
95
+ generated.related_features = existingFm.related_features;
96
+ if (existingFm.primary_rfcs)
97
+ generated.primary_rfcs = existingFm.primary_rfcs;
98
+ if (existingFm.secondary_rfcs)
99
+ generated.secondary_rfcs = existingFm.secondary_rfcs;
100
+ if (existingFm.load_priority)
101
+ generated.load_priority = existingFm.load_priority;
102
+ if (existingFm.required_for)
103
+ generated.required_for = existingFm.required_for;
104
+ if (existingFm.audience)
105
+ generated.audience = existingFm.audience;
106
+ if (existingFm.last_reviewed)
107
+ generated.last_reviewed = existingFm.last_reviewed;
108
+ if (existingFm.methodology_version)
109
+ generated.methodology_version = existingFm.methodology_version;
110
+ }
111
+ return {
112
+ success: errors.length === 0,
113
+ file,
114
+ generated,
115
+ errors,
116
+ warnings,
117
+ };
118
+ }
119
+ /**
120
+ * Serialize generated frontmatter as a YAML block (with --- delimiters).
121
+ */
122
+ export function serializeFrontmatter(fm) {
123
+ const yaml = yamlStringify(fm, { lineWidth: 120 });
124
+ return `---\n${yaml}---\n`;
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Inference helpers
128
+ // ---------------------------------------------------------------------------
129
+ function inferType(file) {
130
+ const name = baseName(file).toUpperCase();
131
+ if (name === 'ETHOS.MD')
132
+ return 'constraints';
133
+ if (name === 'PHILOSOPHY.MD')
134
+ return 'rationale';
135
+ if (name === 'PROTOCOL.MD' || name === 'PROTOCOLS.MD')
136
+ return 'procedures';
137
+ if (name === 'README.MD')
138
+ return 'navigation';
139
+ if (name === 'COMPONENTS.MD')
140
+ return 'mapping';
141
+ // Default based on content — but since we don't have content here, pick constraints
142
+ return 'constraints';
143
+ }
144
+ function inferScope(file) {
145
+ const path = file.replace(/\\/g, '/');
146
+ if (path.includes('/domains/'))
147
+ return 'domain';
148
+ if (path.includes('/features/'))
149
+ return 'feature';
150
+ if (path.includes('/components/'))
151
+ return 'component';
152
+ if (path.includes('/methodology/'))
153
+ return 'methodology';
154
+ if (path.includes('book-llms/') || path.includes('book-humans/'))
155
+ return 'meta';
156
+ // Top-level files are product scope
157
+ const depth = path.split('/').length;
158
+ if (depth <= 2)
159
+ return 'product';
160
+ return 'meta';
161
+ }
162
+ function inferName(file) {
163
+ const dir = dirName(file);
164
+ const parts = dir.replace(/\\/g, '/').split('/');
165
+ const parentDir = parts[parts.length - 1];
166
+ if (parentDir && parentDir !== '.' && parentDir !== '') {
167
+ return parentDir.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
168
+ }
169
+ // Fallback: use filename without extension
170
+ const filename = baseName(file);
171
+ return filename.replace(/\.md$/i, '').toLowerCase().replace(/[^a-z0-9]+/g, '-');
172
+ }
173
+ function inferSummary(body) {
174
+ // Look for the first line that's not a heading, empty, or horizontal rule
175
+ const lines = body.split('\n');
176
+ for (const line of lines) {
177
+ const trimmed = line.trim();
178
+ if (!trimmed)
179
+ continue;
180
+ if (trimmed.startsWith('#'))
181
+ continue;
182
+ if (trimmed.startsWith('---'))
183
+ continue;
184
+ if (trimmed.startsWith('>')) {
185
+ // Blockquote — use as summary
186
+ const text = trimmed.replace(/^>\s*/, '');
187
+ if (text.length > 200)
188
+ return text.slice(0, 197) + '...';
189
+ return text;
190
+ }
191
+ // First paragraph line
192
+ if (trimmed.length > 200)
193
+ return trimmed.slice(0, 197) + '...';
194
+ return trimmed;
195
+ }
196
+ return 'No summary available';
197
+ }
198
+ function inferProvides(body) {
199
+ const provides = [];
200
+ const lines = body.split('\n');
201
+ for (const line of lines) {
202
+ const trimmed = line.trim();
203
+ // Look for links or list items
204
+ const linkMatch = trimmed.match(/^\-\s*\[([^\]]+)\]/);
205
+ if (linkMatch) {
206
+ provides.push(linkMatch[1]);
207
+ }
208
+ }
209
+ return provides.length > 0 ? provides : ['contents'];
210
+ }
211
+ function inferParent(file) {
212
+ const dir = dirName(file);
213
+ const parts = dir.replace(/\\/g, '/').split('/');
214
+ if (parts.length >= 2) {
215
+ return parts[parts.length - 2];
216
+ }
217
+ return 'root';
218
+ }
219
+ //# sourceMappingURL=generate-frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-frontmatter.js","sourceRoot":"","sources":["../../src/core/generate-frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAChI,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AA6BlD,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAmC;IAEnC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI;YACJ,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,CAAC;oBACP,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,qBAAqB,IAAI,EAAE;oBACpC,IAAI;iBACL,CAAC;YACF,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC;IACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC;IAExC,qCAAqC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,EAAE,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,EAAE,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,IAAI,KAAK,CAAC;IAC7C,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9C,MAAM,SAAS,GAAyB;QACtC,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,OAAO;QACP,OAAO;QACP,cAAc,EAAE,aAAa;KAC9B,CAAC;IAEF,uBAAuB;IACvB,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,iBAAiB,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,iBAAiB,EAAE,CAAC;YACtB,SAAS,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,iBAAiB,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,iBAAiB,EAAE,CAAC;YACtB,SAAS,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,iBAAiB,GAAG,cAAc,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QACtE,IAAI,iBAAiB,EAAE,CAAC;YACtB,SAAS,CAAC,gBAAgB,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QAClE,IAAI,gBAAgB,EAAE,CAAC;YACrB,SAAS,CAAC,cAAc,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC;YAC7C,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,wCAAwC;IACxC,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,aAAa;YAAE,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QACjF,IAAI,UAAU,CAAC,eAAe;YAAE,SAAS,CAAC,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;QACvF,IAAI,UAAU,CAAC,gBAAgB;YAAE,SAAS,CAAC,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC;QAC1F,IAAI,UAAU,CAAC,YAAY;YAAE,SAAS,CAAC,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;QAC9E,IAAI,UAAU,CAAC,cAAc;YAAE,SAAS,CAAC,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC;QACpF,IAAI,UAAU,CAAC,aAAa;YAAE,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QACjF,IAAI,UAAU,CAAC,YAAY;YAAE,SAAS,CAAC,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;QAC9E,IAAI,UAAU,CAAC,QAAQ;YAAE,SAAS,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QAClE,IAAI,UAAU,CAAC,aAAa;YAAE,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QACjF,IAAI,UAAU,CAAC,mBAAmB;YAAE,SAAS,CAAC,mBAAmB,GAAG,UAAU,CAAC,mBAAmB,CAAC;IACrG,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC5B,IAAI;QACJ,SAAS;QACT,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAwB;IAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACnD,OAAO,QAAQ,IAAI,OAAO,CAAC;AAC7B,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,aAAa,CAAC;IAC9C,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,WAAW,CAAC;IACjD,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,YAAY,CAAC;IAC3E,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC;IAC9C,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,SAAS,CAAC;IAC/C,oFAAoF;IACpF,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;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,oCAAoC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,IAAI,SAAS,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,0EAA0E;IAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACtC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QACxC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,8BAA8B;YAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,uBAAuB;QACvB,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QAC/D,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,+BAA+B;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate-frontmatter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-frontmatter.test.d.ts","sourceRoot":"","sources":["../../src/core/generate-frontmatter.test.ts"],"names":[],"mappings":""}