@maadb/core 0.0.1 → 0.7.9

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 (407) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -3
  3. package/dist/architect.d.ts +2 -0
  4. package/dist/architect.d.ts.map +1 -0
  5. package/dist/architect.js +273 -0
  6. package/dist/architect.js.map +1 -0
  7. package/dist/auth/resolve.d.ts +36 -0
  8. package/dist/auth/resolve.d.ts.map +1 -0
  9. package/dist/auth/resolve.js +77 -0
  10. package/dist/auth/resolve.js.map +1 -0
  11. package/dist/auth/token-store.d.ts +82 -0
  12. package/dist/auth/token-store.d.ts.map +1 -0
  13. package/dist/auth/token-store.js +464 -0
  14. package/dist/auth/token-store.js.map +1 -0
  15. package/dist/auth/types.d.ts +75 -0
  16. package/dist/auth/types.d.ts.map +1 -0
  17. package/dist/auth/types.js +15 -0
  18. package/dist/auth/types.js.map +1 -0
  19. package/dist/backend/adapter.d.ts +57 -0
  20. package/dist/backend/adapter.d.ts.map +1 -0
  21. package/dist/backend/adapter.js +6 -0
  22. package/dist/backend/adapter.js.map +1 -0
  23. package/dist/backend/index.d.ts +3 -0
  24. package/dist/backend/index.d.ts.map +1 -0
  25. package/dist/backend/index.js +2 -0
  26. package/dist/backend/index.js.map +1 -0
  27. package/dist/backend/sqlite/index.d.ts +63 -0
  28. package/dist/backend/sqlite/index.d.ts.map +1 -0
  29. package/dist/backend/sqlite/index.js +521 -0
  30. package/dist/backend/sqlite/index.js.map +1 -0
  31. package/dist/backend/sqlite/schema.d.ts +2 -0
  32. package/dist/backend/sqlite/schema.d.ts.map +1 -0
  33. package/dist/backend/sqlite/schema.js +88 -0
  34. package/dist/backend/sqlite/schema.js.map +1 -0
  35. package/dist/claude-md.d.ts +2 -0
  36. package/dist/claude-md.d.ts.map +1 -0
  37. package/dist/claude-md.js +97 -0
  38. package/dist/claude-md.js.map +1 -0
  39. package/dist/cli/commands/audit.d.ts +4 -0
  40. package/dist/cli/commands/audit.d.ts.map +1 -0
  41. package/dist/cli/commands/audit.js +39 -0
  42. package/dist/cli/commands/audit.js.map +1 -0
  43. package/dist/cli/commands/auth.d.ts +8 -0
  44. package/dist/cli/commands/auth.d.ts.map +1 -0
  45. package/dist/cli/commands/auth.js +242 -0
  46. package/dist/cli/commands/auth.js.map +1 -0
  47. package/dist/cli/commands/discover.d.ts +5 -0
  48. package/dist/cli/commands/discover.d.ts.map +1 -0
  49. package/dist/cli/commands/discover.js +48 -0
  50. package/dist/cli/commands/discover.js.map +1 -0
  51. package/dist/cli/commands/maintain.d.ts +6 -0
  52. package/dist/cli/commands/maintain.d.ts.map +1 -0
  53. package/dist/cli/commands/maintain.js +168 -0
  54. package/dist/cli/commands/maintain.js.map +1 -0
  55. package/dist/cli/commands/read.d.ts +7 -0
  56. package/dist/cli/commands/read.d.ts.map +1 -0
  57. package/dist/cli/commands/read.js +139 -0
  58. package/dist/cli/commands/read.js.map +1 -0
  59. package/dist/cli/commands/write.d.ts +4 -0
  60. package/dist/cli/commands/write.d.ts.map +1 -0
  61. package/dist/cli/commands/write.js +99 -0
  62. package/dist/cli/commands/write.js.map +1 -0
  63. package/dist/cli/helpers.d.ts +8 -0
  64. package/dist/cli/helpers.d.ts.map +1 -0
  65. package/dist/cli/helpers.js +17 -0
  66. package/dist/cli/helpers.js.map +1 -0
  67. package/dist/cli/index.d.ts +3 -0
  68. package/dist/cli/index.d.ts.map +1 -0
  69. package/dist/cli/index.js +296 -0
  70. package/dist/cli/index.js.map +1 -0
  71. package/dist/cli.d.ts +3 -0
  72. package/dist/cli.d.ts.map +1 -0
  73. package/dist/cli.js +7 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/engine/audit.d.ts +15 -0
  76. package/dist/engine/audit.d.ts.map +1 -0
  77. package/dist/engine/audit.js +42 -0
  78. package/dist/engine/audit.js.map +1 -0
  79. package/dist/engine/composites.d.ts +6 -0
  80. package/dist/engine/composites.d.ts.map +1 -0
  81. package/dist/engine/composites.js +102 -0
  82. package/dist/engine/composites.js.map +1 -0
  83. package/dist/engine/context.d.ts +47 -0
  84. package/dist/engine/context.d.ts.map +1 -0
  85. package/dist/engine/context.js +55 -0
  86. package/dist/engine/context.js.map +1 -0
  87. package/dist/engine/docid-safe.d.ts +8 -0
  88. package/dist/engine/docid-safe.d.ts.map +1 -0
  89. package/dist/engine/docid-safe.js +0 -0
  90. package/dist/engine/docid-safe.js.map +1 -0
  91. package/dist/engine/helpers.d.ts +8 -0
  92. package/dist/engine/helpers.d.ts.map +1 -0
  93. package/dist/engine/helpers.js +102 -0
  94. package/dist/engine/helpers.js.map +1 -0
  95. package/dist/engine/index.d.ts +209 -0
  96. package/dist/engine/index.d.ts.map +1 -0
  97. package/dist/engine/index.js +489 -0
  98. package/dist/engine/index.js.map +1 -0
  99. package/dist/engine/indexing.d.ts +14 -0
  100. package/dist/engine/indexing.d.ts.map +1 -0
  101. package/dist/engine/indexing.js +225 -0
  102. package/dist/engine/indexing.js.map +1 -0
  103. package/dist/engine/journal.d.ts +32 -0
  104. package/dist/engine/journal.d.ts.map +1 -0
  105. package/dist/engine/journal.js +111 -0
  106. package/dist/engine/journal.js.map +1 -0
  107. package/dist/engine/logger.d.ts +19 -0
  108. package/dist/engine/logger.d.ts.map +1 -0
  109. package/dist/engine/logger.js +40 -0
  110. package/dist/engine/logger.js.map +1 -0
  111. package/dist/engine/maintenance.d.ts +15 -0
  112. package/dist/engine/maintenance.d.ts.map +1 -0
  113. package/dist/engine/maintenance.js +87 -0
  114. package/dist/engine/maintenance.js.map +1 -0
  115. package/dist/engine/mutex.d.ts +24 -0
  116. package/dist/engine/mutex.d.ts.map +1 -0
  117. package/dist/engine/mutex.js +50 -0
  118. package/dist/engine/mutex.js.map +1 -0
  119. package/dist/engine/pathguard.d.ts +16 -0
  120. package/dist/engine/pathguard.d.ts.map +1 -0
  121. package/dist/engine/pathguard.js +41 -0
  122. package/dist/engine/pathguard.js.map +1 -0
  123. package/dist/engine/reads.d.ts +24 -0
  124. package/dist/engine/reads.d.ts.map +1 -0
  125. package/dist/engine/reads.js +701 -0
  126. package/dist/engine/reads.js.map +1 -0
  127. package/dist/engine/types.d.ts +350 -0
  128. package/dist/engine/types.d.ts.map +1 -0
  129. package/dist/engine/types.js +5 -0
  130. package/dist/engine/types.js.map +1 -0
  131. package/dist/engine/writes.d.ts +10 -0
  132. package/dist/engine/writes.d.ts.map +1 -0
  133. package/dist/engine/writes.js +606 -0
  134. package/dist/engine/writes.js.map +1 -0
  135. package/dist/engine.d.ts +3 -0
  136. package/dist/engine.d.ts.map +1 -0
  137. package/dist/engine.js +6 -0
  138. package/dist/engine.js.map +1 -0
  139. package/dist/errors.d.ts +20 -0
  140. package/dist/errors.d.ts.map +1 -0
  141. package/dist/errors.js +17 -0
  142. package/dist/errors.js.map +1 -0
  143. package/dist/extractor/fields.d.ts +3 -0
  144. package/dist/extractor/fields.d.ts.map +1 -0
  145. package/dist/extractor/fields.js +58 -0
  146. package/dist/extractor/fields.js.map +1 -0
  147. package/dist/extractor/index.d.ts +7 -0
  148. package/dist/extractor/index.d.ts.map +1 -0
  149. package/dist/extractor/index.js +22 -0
  150. package/dist/extractor/index.js.map +1 -0
  151. package/dist/extractor/normalizers.d.ts +22 -0
  152. package/dist/extractor/normalizers.d.ts.map +1 -0
  153. package/dist/extractor/normalizers.js +250 -0
  154. package/dist/extractor/normalizers.js.map +1 -0
  155. package/dist/extractor/objects.d.ts +3 -0
  156. package/dist/extractor/objects.d.ts.map +1 -0
  157. package/dist/extractor/objects.js +33 -0
  158. package/dist/extractor/objects.js.map +1 -0
  159. package/dist/extractor/relationships.d.ts +3 -0
  160. package/dist/extractor/relationships.d.ts.map +1 -0
  161. package/dist/extractor/relationships.js +58 -0
  162. package/dist/extractor/relationships.js.map +1 -0
  163. package/dist/git/commit.d.ts +63 -0
  164. package/dist/git/commit.d.ts.map +1 -0
  165. package/dist/git/commit.js +161 -0
  166. package/dist/git/commit.js.map +1 -0
  167. package/dist/git/diff.d.ts +4 -0
  168. package/dist/git/diff.d.ts.map +1 -0
  169. package/dist/git/diff.js +56 -0
  170. package/dist/git/diff.js.map +1 -0
  171. package/dist/git/index.d.ts +41 -0
  172. package/dist/git/index.d.ts.map +1 -0
  173. package/dist/git/index.js +86 -0
  174. package/dist/git/index.js.map +1 -0
  175. package/dist/git/log.d.ts +13 -0
  176. package/dist/git/log.d.ts.map +1 -0
  177. package/dist/git/log.js +116 -0
  178. package/dist/git/log.js.map +1 -0
  179. package/dist/git/snapshot.d.ts +4 -0
  180. package/dist/git/snapshot.d.ts.map +1 -0
  181. package/dist/git/snapshot.js +65 -0
  182. package/dist/git/snapshot.js.map +1 -0
  183. package/dist/instance/config.d.ts +19 -0
  184. package/dist/instance/config.d.ts.map +1 -0
  185. package/dist/instance/config.js +107 -0
  186. package/dist/instance/config.js.map +1 -0
  187. package/dist/instance/pool.d.ts +138 -0
  188. package/dist/instance/pool.d.ts.map +1 -0
  189. package/dist/instance/pool.js +335 -0
  190. package/dist/instance/pool.js.map +1 -0
  191. package/dist/instance/session.d.ts +140 -0
  192. package/dist/instance/session.d.ts.map +1 -0
  193. package/dist/instance/session.js +267 -0
  194. package/dist/instance/session.js.map +1 -0
  195. package/dist/logging.d.ts +108 -0
  196. package/dist/logging.d.ts.map +1 -0
  197. package/dist/logging.js +120 -0
  198. package/dist/logging.js.map +1 -0
  199. package/dist/maad-md.d.ts +11 -0
  200. package/dist/maad-md.d.ts.map +1 -0
  201. package/dist/maad-md.js +252 -0
  202. package/dist/maad-md.js.map +1 -0
  203. package/dist/mcp/bulk-cap.d.ts +10 -0
  204. package/dist/mcp/bulk-cap.d.ts.map +1 -0
  205. package/dist/mcp/bulk-cap.js +37 -0
  206. package/dist/mcp/bulk-cap.js.map +1 -0
  207. package/dist/mcp/config.d.ts +18 -0
  208. package/dist/mcp/config.d.ts.map +1 -0
  209. package/dist/mcp/config.js +20 -0
  210. package/dist/mcp/config.js.map +1 -0
  211. package/dist/mcp/ctx.d.ts +17 -0
  212. package/dist/mcp/ctx.d.ts.map +1 -0
  213. package/dist/mcp/ctx.js +7 -0
  214. package/dist/mcp/ctx.js.map +1 -0
  215. package/dist/mcp/guardrails.d.ts +21 -0
  216. package/dist/mcp/guardrails.d.ts.map +1 -0
  217. package/dist/mcp/guardrails.js +39 -0
  218. package/dist/mcp/guardrails.js.map +1 -0
  219. package/dist/mcp/idempotency.d.ts +69 -0
  220. package/dist/mcp/idempotency.d.ts.map +1 -0
  221. package/dist/mcp/idempotency.js +168 -0
  222. package/dist/mcp/idempotency.js.map +1 -0
  223. package/dist/mcp/instance-reload.d.ts +23 -0
  224. package/dist/mcp/instance-reload.d.ts.map +1 -0
  225. package/dist/mcp/instance-reload.js +126 -0
  226. package/dist/mcp/instance-reload.js.map +1 -0
  227. package/dist/mcp/kinds.d.ts +22 -0
  228. package/dist/mcp/kinds.d.ts.map +1 -0
  229. package/dist/mcp/kinds.js +110 -0
  230. package/dist/mcp/kinds.js.map +1 -0
  231. package/dist/mcp/lifecycle.d.ts +8 -0
  232. package/dist/mcp/lifecycle.d.ts.map +1 -0
  233. package/dist/mcp/lifecycle.js +65 -0
  234. package/dist/mcp/lifecycle.js.map +1 -0
  235. package/dist/mcp/notifications.d.ts +87 -0
  236. package/dist/mcp/notifications.d.ts.map +1 -0
  237. package/dist/mcp/notifications.js +154 -0
  238. package/dist/mcp/notifications.js.map +1 -0
  239. package/dist/mcp/query-depth.d.ts +28 -0
  240. package/dist/mcp/query-depth.d.ts.map +1 -0
  241. package/dist/mcp/query-depth.js +43 -0
  242. package/dist/mcp/query-depth.js.map +1 -0
  243. package/dist/mcp/rate-limit.d.ts +60 -0
  244. package/dist/mcp/rate-limit.d.ts.map +1 -0
  245. package/dist/mcp/rate-limit.js +203 -0
  246. package/dist/mcp/rate-limit.js.map +1 -0
  247. package/dist/mcp/reload-signal.d.ts +13 -0
  248. package/dist/mcp/reload-signal.d.ts.map +1 -0
  249. package/dist/mcp/reload-signal.js +68 -0
  250. package/dist/mcp/reload-signal.js.map +1 -0
  251. package/dist/mcp/response.d.ts +109 -0
  252. package/dist/mcp/response.d.ts.map +1 -0
  253. package/dist/mcp/response.js +132 -0
  254. package/dist/mcp/response.js.map +1 -0
  255. package/dist/mcp/roles.d.ts +7 -0
  256. package/dist/mcp/roles.d.ts.map +1 -0
  257. package/dist/mcp/roles.js +56 -0
  258. package/dist/mcp/roles.js.map +1 -0
  259. package/dist/mcp/server.d.ts +33 -0
  260. package/dist/mcp/server.d.ts.map +1 -0
  261. package/dist/mcp/server.js +242 -0
  262. package/dist/mcp/server.js.map +1 -0
  263. package/dist/mcp/shutdown.d.ts +32 -0
  264. package/dist/mcp/shutdown.d.ts.map +1 -0
  265. package/dist/mcp/shutdown.js +130 -0
  266. package/dist/mcp/shutdown.js.map +1 -0
  267. package/dist/mcp/tools/audit.d.ts +4 -0
  268. package/dist/mcp/tools/audit.d.ts.map +1 -0
  269. package/dist/mcp/tools/audit.js +45 -0
  270. package/dist/mcp/tools/audit.js.map +1 -0
  271. package/dist/mcp/tools/auth.d.ts +4 -0
  272. package/dist/mcp/tools/auth.d.ts.map +1 -0
  273. package/dist/mcp/tools/auth.js +181 -0
  274. package/dist/mcp/tools/auth.js.map +1 -0
  275. package/dist/mcp/tools/discover.d.ts +4 -0
  276. package/dist/mcp/tools/discover.d.ts.map +1 -0
  277. package/dist/mcp/tools/discover.js +83 -0
  278. package/dist/mcp/tools/discover.js.map +1 -0
  279. package/dist/mcp/tools/instance.d.ts +15 -0
  280. package/dist/mcp/tools/instance.d.ts.map +1 -0
  281. package/dist/mcp/tools/instance.js +207 -0
  282. package/dist/mcp/tools/instance.js.map +1 -0
  283. package/dist/mcp/tools/maintain.d.ts +4 -0
  284. package/dist/mcp/tools/maintain.d.ts.map +1 -0
  285. package/dist/mcp/tools/maintain.js +118 -0
  286. package/dist/mcp/tools/maintain.js.map +1 -0
  287. package/dist/mcp/tools/read.d.ts +4 -0
  288. package/dist/mcp/tools/read.d.ts.map +1 -0
  289. package/dist/mcp/tools/read.js +260 -0
  290. package/dist/mcp/tools/read.js.map +1 -0
  291. package/dist/mcp/tools/write.d.ts +4 -0
  292. package/dist/mcp/tools/write.d.ts.map +1 -0
  293. package/dist/mcp/tools/write.js +342 -0
  294. package/dist/mcp/tools/write.js.map +1 -0
  295. package/dist/mcp/transport/auth.d.ts +41 -0
  296. package/dist/mcp/transport/auth.d.ts.map +1 -0
  297. package/dist/mcp/transport/auth.js +115 -0
  298. package/dist/mcp/transport/auth.js.map +1 -0
  299. package/dist/mcp/transport/http.d.ts +62 -0
  300. package/dist/mcp/transport/http.d.ts.map +1 -0
  301. package/dist/mcp/transport/http.js +357 -0
  302. package/dist/mcp/transport/http.js.map +1 -0
  303. package/dist/mcp/transport/pin.d.ts +15 -0
  304. package/dist/mcp/transport/pin.d.ts.map +1 -0
  305. package/dist/mcp/transport/pin.js +71 -0
  306. package/dist/mcp/transport/pin.js.map +1 -0
  307. package/dist/mcp/transport/telemetry.d.ts +79 -0
  308. package/dist/mcp/transport/telemetry.d.ts.map +1 -0
  309. package/dist/mcp/transport/telemetry.js +97 -0
  310. package/dist/mcp/transport/telemetry.js.map +1 -0
  311. package/dist/mcp/with-session.d.ts +26 -0
  312. package/dist/mcp/with-session.d.ts.map +1 -0
  313. package/dist/mcp/with-session.js +275 -0
  314. package/dist/mcp/with-session.js.map +1 -0
  315. package/dist/parser/annotations.d.ts +3 -0
  316. package/dist/parser/annotations.d.ts.map +1 -0
  317. package/dist/parser/annotations.js +41 -0
  318. package/dist/parser/annotations.js.map +1 -0
  319. package/dist/parser/blocks.d.ts +3 -0
  320. package/dist/parser/blocks.d.ts.map +1 -0
  321. package/dist/parser/blocks.js +99 -0
  322. package/dist/parser/blocks.js.map +1 -0
  323. package/dist/parser/frontmatter.d.ts +9 -0
  324. package/dist/parser/frontmatter.d.ts.map +1 -0
  325. package/dist/parser/frontmatter.js +33 -0
  326. package/dist/parser/frontmatter.js.map +1 -0
  327. package/dist/parser/index.d.ts +11 -0
  328. package/dist/parser/index.d.ts.map +1 -0
  329. package/dist/parser/index.js +54 -0
  330. package/dist/parser/index.js.map +1 -0
  331. package/dist/parser/matter.d.ts +3 -0
  332. package/dist/parser/matter.d.ts.map +1 -0
  333. package/dist/parser/matter.js +32 -0
  334. package/dist/parser/matter.js.map +1 -0
  335. package/dist/parser/tags.d.ts +3 -0
  336. package/dist/parser/tags.d.ts.map +1 -0
  337. package/dist/parser/tags.js +32 -0
  338. package/dist/parser/tags.js.map +1 -0
  339. package/dist/parser/verbatim.d.ts +4 -0
  340. package/dist/parser/verbatim.d.ts.map +1 -0
  341. package/dist/parser/verbatim.js +121 -0
  342. package/dist/parser/verbatim.js.map +1 -0
  343. package/dist/parser/yaml-profile.d.ts +4 -0
  344. package/dist/parser/yaml-profile.d.ts.map +1 -0
  345. package/dist/parser/yaml-profile.js +73 -0
  346. package/dist/parser/yaml-profile.js.map +1 -0
  347. package/dist/registry/index.d.ts +2 -0
  348. package/dist/registry/index.d.ts.map +1 -0
  349. package/dist/registry/index.js +2 -0
  350. package/dist/registry/index.js.map +1 -0
  351. package/dist/registry/loader.d.ts +4 -0
  352. package/dist/registry/loader.d.ts.map +1 -0
  353. package/dist/registry/loader.js +147 -0
  354. package/dist/registry/loader.js.map +1 -0
  355. package/dist/registry/types.d.ts +2 -0
  356. package/dist/registry/types.d.ts.map +1 -0
  357. package/dist/registry/types.js +5 -0
  358. package/dist/registry/types.js.map +1 -0
  359. package/dist/scanner.d.ts +57 -0
  360. package/dist/scanner.d.ts.map +1 -0
  361. package/dist/scanner.js +223 -0
  362. package/dist/scanner.js.map +1 -0
  363. package/dist/schema/index.d.ts +3 -0
  364. package/dist/schema/index.d.ts.map +1 -0
  365. package/dist/schema/index.js +3 -0
  366. package/dist/schema/index.js.map +1 -0
  367. package/dist/schema/loader.d.ts +4 -0
  368. package/dist/schema/loader.d.ts.map +1 -0
  369. package/dist/schema/loader.js +303 -0
  370. package/dist/schema/loader.js.map +1 -0
  371. package/dist/schema/precision.d.ts +6 -0
  372. package/dist/schema/precision.d.ts.map +1 -0
  373. package/dist/schema/precision.js +59 -0
  374. package/dist/schema/precision.js.map +1 -0
  375. package/dist/schema/validator.d.ts +21 -0
  376. package/dist/schema/validator.d.ts.map +1 -0
  377. package/dist/schema/validator.js +200 -0
  378. package/dist/schema/validator.js.map +1 -0
  379. package/dist/schema-md.d.ts +8 -0
  380. package/dist/schema-md.d.ts.map +1 -0
  381. package/dist/schema-md.js +98 -0
  382. package/dist/schema-md.js.map +1 -0
  383. package/dist/skill-files.d.ts +3 -0
  384. package/dist/skill-files.d.ts.map +1 -0
  385. package/dist/skill-files.js +362 -0
  386. package/dist/skill-files.js.map +1 -0
  387. package/dist/skills-scaffold.d.ts +10 -0
  388. package/dist/skills-scaffold.d.ts.map +1 -0
  389. package/dist/skills-scaffold.js +52 -0
  390. package/dist/skills-scaffold.js.map +1 -0
  391. package/dist/types.d.ts +309 -0
  392. package/dist/types.d.ts.map +1 -0
  393. package/dist/types.js +111 -0
  394. package/dist/types.js.map +1 -0
  395. package/dist/writer/index.d.ts +7 -0
  396. package/dist/writer/index.d.ts.map +1 -0
  397. package/dist/writer/index.js +32 -0
  398. package/dist/writer/index.js.map +1 -0
  399. package/dist/writer/serializer.d.ts +4 -0
  400. package/dist/writer/serializer.d.ts.map +1 -0
  401. package/dist/writer/serializer.js +103 -0
  402. package/dist/writer/serializer.js.map +1 -0
  403. package/dist/writer/template.d.ts +3 -0
  404. package/dist/writer/template.d.ts.map +1 -0
  405. package/dist/writer/template.js +27 -0
  406. package/dist/writer/template.js.map +1 -0
  407. package/package.json +59 -7
@@ -0,0 +1,57 @@
1
+ export interface FileScanResult {
2
+ filePath: string;
3
+ sizeBytes: number;
4
+ lineCount: number;
5
+ frontmatter: Record<string, unknown> | null;
6
+ frontmatterFields: string[];
7
+ headings: Array<{
8
+ level: number;
9
+ text: string;
10
+ line: number;
11
+ }>;
12
+ blockCount: number;
13
+ annotations: Array<{
14
+ type: string;
15
+ value: string;
16
+ label: string;
17
+ }>;
18
+ valueCalls: string[];
19
+ detectedPatterns: {
20
+ dates: string[];
21
+ emails: string[];
22
+ amounts: string[];
23
+ urls: string[];
24
+ };
25
+ }
26
+ export interface CorpusScanResult {
27
+ directory: string;
28
+ totalFiles: number;
29
+ totalLines: number;
30
+ files: Array<{
31
+ path: string;
32
+ lineCount: number;
33
+ hasFrontmatter: boolean;
34
+ frontmatterFields: string[];
35
+ }>;
36
+ frontmatterFieldFrequency: Record<string, number>;
37
+ headingPatterns: Array<{
38
+ text: string;
39
+ level: number;
40
+ occurrences: number;
41
+ }>;
42
+ likelyDocumentFamilies: Array<{
43
+ name: string;
44
+ fileCount: number;
45
+ sharedFields: string[];
46
+ sharedHeadings: string[];
47
+ sampleFiles: string[];
48
+ }>;
49
+ entitySummary: Array<{
50
+ type: string;
51
+ value: string;
52
+ occurrences: number;
53
+ }>;
54
+ }
55
+ export declare function scanFile(filePath: string): Promise<FileScanResult>;
56
+ export declare function scanDirectory(dirPath: string): Promise<CorpusScanResult>;
57
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;CACH;AAID,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACxG,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,sBAAsB,EAAE,KAAK,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC,CAAC;IACH,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAID,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAmDxE;AAID,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwE9E"}
@@ -0,0 +1,223 @@
1
+ // ============================================================================
2
+ // Scanner
3
+ // Structural analysis of raw markdown files — no registry, no schema needed.
4
+ // Two modes: single file (detailed) and directory (corpus-level patterns).
5
+ // ============================================================================
6
+ import { readFile } from 'node:fs/promises';
7
+ import path from 'node:path';
8
+ import { parseMatter } from './parser/matter.js';
9
+ import { parseBlocks } from './parser/blocks.js';
10
+ import { extractAnnotations } from './parser/annotations.js';
11
+ import { extractValueCalls } from './parser/tags.js';
12
+ import { findVerbatimZones } from './parser/verbatim.js';
13
+ import { DEFAULT_SUBTYPE_MAP } from './types.js';
14
+ // --- File scan ---------------------------------------------------------------
15
+ export async function scanFile(filePath) {
16
+ const raw = await readFile(filePath, 'utf-8');
17
+ const lines = raw.split('\n');
18
+ const stats = await import('node:fs').then(fs => fs.statSync(filePath));
19
+ // Parse frontmatter (tolerant — no validation)
20
+ let frontmatter = null;
21
+ let body = raw;
22
+ let bodyStartLine = 1;
23
+ try {
24
+ const parsed = parseMatter(raw);
25
+ if (parsed.data && typeof parsed.data === 'object' && !Array.isArray(parsed.data)) {
26
+ frontmatter = parsed.data;
27
+ body = parsed.content;
28
+ if (parsed.matter && parsed.matter.length > 0) {
29
+ bodyStartLine = parsed.matter.split('\n').length + 2;
30
+ }
31
+ }
32
+ }
33
+ catch {
34
+ // No valid frontmatter — treat entire file as body
35
+ }
36
+ const frontmatterFields = frontmatter ? Object.keys(frontmatter) : [];
37
+ // Parse blocks (headings + structure)
38
+ const blocks = parseBlocks(body, bodyStartLine);
39
+ const headings = blocks
40
+ .filter(b => b.heading !== '')
41
+ .map(b => ({ level: b.level, text: b.heading, line: b.startLine }));
42
+ // Extract annotations using default subtype map
43
+ const verbatimZones = findVerbatimZones(body, bodyStartLine);
44
+ const annotations = extractAnnotations(body, bodyStartLine, filePath, DEFAULT_SUBTYPE_MAP, verbatimZones);
45
+ const valueCalls = extractValueCalls(body, bodyStartLine, filePath, verbatimZones);
46
+ // Detect common patterns in raw text via regex
47
+ const detectedPatterns = detectPatterns(raw);
48
+ return {
49
+ filePath,
50
+ sizeBytes: stats.size,
51
+ lineCount: lines.length,
52
+ frontmatter,
53
+ frontmatterFields,
54
+ headings,
55
+ blockCount: blocks.length,
56
+ annotations: annotations.map(a => ({ type: a.rawType, value: a.value, label: a.label })),
57
+ valueCalls: valueCalls.map(v => v.field),
58
+ detectedPatterns,
59
+ };
60
+ }
61
+ // --- Corpus scan -------------------------------------------------------------
62
+ export async function scanDirectory(dirPath) {
63
+ const files = await collectAllMarkdown(dirPath);
64
+ const scanResults = [];
65
+ for (const file of files) {
66
+ try {
67
+ scanResults.push(await scanFile(file));
68
+ }
69
+ catch {
70
+ // Skip unreadable files
71
+ }
72
+ }
73
+ // Aggregate frontmatter field frequency
74
+ const fieldFreq = {};
75
+ for (const scan of scanResults) {
76
+ for (const field of scan.frontmatterFields) {
77
+ fieldFreq[field] = (fieldFreq[field] ?? 0) + 1;
78
+ }
79
+ }
80
+ // Aggregate heading patterns
81
+ const headingMap = new Map();
82
+ for (const scan of scanResults) {
83
+ for (const h of scan.headings) {
84
+ const key = `${h.level}:${h.text}`;
85
+ const existing = headingMap.get(key);
86
+ if (existing) {
87
+ existing.count++;
88
+ }
89
+ else {
90
+ headingMap.set(key, { level: h.level, count: 1 });
91
+ }
92
+ }
93
+ }
94
+ const headingPatterns = [...headingMap.entries()]
95
+ .map(([key, val]) => ({ text: key.split(':').slice(1).join(':'), level: val.level, occurrences: val.count }))
96
+ .filter(h => h.occurrences > 1)
97
+ .sort((a, b) => b.occurrences - a.occurrences);
98
+ // Aggregate entities
99
+ const entityMap = new Map();
100
+ for (const scan of scanResults) {
101
+ for (const ann of scan.annotations) {
102
+ const key = `${ann.type}:${ann.value}`;
103
+ entityMap.set(key, (entityMap.get(key) ?? 0) + 1);
104
+ }
105
+ }
106
+ const entitySummary = [...entityMap.entries()]
107
+ .map(([key, count]) => {
108
+ const [type, ...valueParts] = key.split(':');
109
+ return { type: type, value: valueParts.join(':'), occurrences: count };
110
+ })
111
+ .sort((a, b) => b.occurrences - a.occurrences)
112
+ .slice(0, 30);
113
+ // Detect document families by clustering on shared frontmatter fields
114
+ const families = detectFamilies(scanResults, dirPath);
115
+ return {
116
+ directory: dirPath,
117
+ totalFiles: scanResults.length,
118
+ totalLines: scanResults.reduce((sum, s) => sum + s.lineCount, 0),
119
+ files: scanResults.map(s => ({
120
+ path: path.relative(dirPath, s.filePath),
121
+ lineCount: s.lineCount,
122
+ hasFrontmatter: s.frontmatter !== null,
123
+ frontmatterFields: s.frontmatterFields,
124
+ })),
125
+ frontmatterFieldFrequency: fieldFreq,
126
+ headingPatterns,
127
+ likelyDocumentFamilies: families,
128
+ entitySummary,
129
+ };
130
+ }
131
+ // --- Pattern detection -------------------------------------------------------
132
+ const DATE_REGEX = /\b\d{4}-\d{2}-\d{2}\b/g;
133
+ const EMAIL_REGEX = /\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b/g;
134
+ const AMOUNT_REGEX = /\b\d[\d,.]*\s*(?:USD|EUR|GBP|CAD|AUD|\$|dollars?)\b/gi;
135
+ const URL_REGEX = /https?:\/\/[^\s)>\]]+/g;
136
+ function detectPatterns(raw) {
137
+ const dedupe = (matches) => [...new Set(matches ?? [])];
138
+ return {
139
+ dates: dedupe(raw.match(DATE_REGEX)).slice(0, 10),
140
+ emails: dedupe(raw.match(EMAIL_REGEX)).slice(0, 10),
141
+ amounts: dedupe(raw.match(AMOUNT_REGEX)).slice(0, 10),
142
+ urls: dedupe(raw.match(URL_REGEX)).slice(0, 10),
143
+ };
144
+ }
145
+ // --- Family detection --------------------------------------------------------
146
+ function detectFamilies(scans, rootDir) {
147
+ // Strategy: group files by their frontmatter field signature + heading signature
148
+ const groups = new Map();
149
+ for (const scan of scans) {
150
+ // Fingerprint on frontmatter fields only — headings may vary within a family
151
+ const fieldSig = scan.frontmatterFields.filter(f => f !== 'doc_id' && f !== 'doc_type' && f !== 'schema').sort().join(',');
152
+ const fingerprint = fieldSig;
153
+ const group = groups.get(fingerprint);
154
+ if (group) {
155
+ group.push(scan);
156
+ }
157
+ else {
158
+ groups.set(fingerprint, [scan]);
159
+ }
160
+ }
161
+ // Convert groups to families (only groups with 2+ files)
162
+ const families = [];
163
+ let familyIndex = 0;
164
+ for (const [, members] of groups) {
165
+ if (members.length < 2)
166
+ continue;
167
+ familyIndex++;
168
+ // Determine shared fields and headings
169
+ const sharedFields = members[0].frontmatterFields.filter(f => f !== 'doc_id' && f !== 'doc_type' && f !== 'schema' &&
170
+ members.every(m => m.frontmatterFields.includes(f)));
171
+ const sharedHeadings = members[0].headings
172
+ .filter(h => members.every(m => m.headings.some(mh => mh.text === h.text && mh.level === h.level)))
173
+ .map(h => h.text);
174
+ // Try to name the family from doc_type or directory
175
+ const docTypes = members
176
+ .map(m => m.frontmatter?.['doc_type'])
177
+ .filter((t) => typeof t === 'string');
178
+ const uniqueDocTypes = [...new Set(docTypes)];
179
+ let name;
180
+ if (uniqueDocTypes.length === 1) {
181
+ name = uniqueDocTypes[0];
182
+ }
183
+ else {
184
+ // Use the most common parent directory
185
+ const dirs = members.map(m => path.dirname(path.relative(rootDir, m.filePath)));
186
+ const dirCounts = new Map();
187
+ for (const d of dirs)
188
+ dirCounts.set(d, (dirCounts.get(d) ?? 0) + 1);
189
+ const topDir = [...dirCounts.entries()].sort((a, b) => b[1] - a[1])[0];
190
+ name = topDir ? topDir[0] : `family-${familyIndex}`;
191
+ }
192
+ families.push({
193
+ name,
194
+ fileCount: members.length,
195
+ sharedFields,
196
+ sharedHeadings,
197
+ sampleFiles: members.slice(0, 3).map(m => path.relative(rootDir, m.filePath)),
198
+ });
199
+ }
200
+ return families.sort((a, b) => b.fileCount - a.fileCount);
201
+ }
202
+ // --- File collection ---------------------------------------------------------
203
+ async function collectAllMarkdown(dirPath) {
204
+ const files = [];
205
+ const { readdir } = await import('node:fs/promises');
206
+ async function walk(dir) {
207
+ const entries = await readdir(dir, { withFileTypes: true });
208
+ for (const entry of entries) {
209
+ const fullPath = path.join(dir, entry.name);
210
+ if (entry.name.startsWith('_') || entry.name.startsWith('.') || entry.name === 'node_modules')
211
+ continue;
212
+ if (entry.isDirectory()) {
213
+ await walk(fullPath);
214
+ }
215
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
216
+ files.push(fullPath);
217
+ }
218
+ }
219
+ }
220
+ await walk(dirPath);
221
+ return files.sort();
222
+ }
223
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { loadSchemas } from './loader.js';
2
+ export { validateFrontmatter } from './validator.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { loadSchemas } from './loader.js';
2
+ export { validateFrontmatter } from './validator.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Result } from '../errors.js';
2
+ import { type Registry, type SchemaStore } from '../types.js';
3
+ export declare function loadSchemas(projectRoot: string, registry: Registry): Promise<Result<SchemaStore>>;
4
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/schema/loader.ts"],"names":[],"mappings":"AASA,OAAO,EAAsB,KAAK,MAAM,EAAkB,MAAM,cAAc,CAAC;AAE/E,OAAO,EAGL,KAAK,QAAQ,EAOb,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAIrB,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAuFvG"}
@@ -0,0 +1,303 @@
1
+ // ============================================================================
2
+ // Schema Loader
3
+ // Reads and validates _schema/*.yaml files referenced by the registry.
4
+ // ============================================================================
5
+ import { readFile, stat } from 'node:fs/promises';
6
+ import { statSync } from 'node:fs';
7
+ import path from 'node:path';
8
+ import { parseMatter } from '../parser/matter.js';
9
+ import { ok, err, maadError } from '../errors.js';
10
+ import { isPrecision, comparePrecision } from './precision.js';
11
+ import { docType, } from '../types.js';
12
+ const VALID_FIELD_TYPES = ['string', 'number', 'date', 'enum', 'ref', 'boolean', 'list', 'amount'];
13
+ export async function loadSchemas(projectRoot, registry) {
14
+ const errors = [];
15
+ const schemas = new Map();
16
+ const typeToSchema = new Map();
17
+ // 0.7.7 (fup-2026-202) — capture mtime+size per file for staleness checks.
18
+ // Includes the registry file too, so registry edits (new/removed types,
19
+ // path/schemaRef remap) trigger reload alongside per-schema edits.
20
+ const cachedFiles = new Map();
21
+ const registryPath = path.join(projectRoot, '_registry', 'object_types.yaml');
22
+ try {
23
+ const st = await stat(registryPath);
24
+ cachedFiles.set(registryPath, { mtimeMs: st.mtimeMs, size: st.size });
25
+ }
26
+ catch {
27
+ // Empty / missing registry — leave out of cache; isStale will pick up
28
+ // the file when it appears via stat throwing on a cached entry that
29
+ // doesn't exist. For an absent registry the schemas map is empty anyway.
30
+ }
31
+ for (const [, regType] of registry.types) {
32
+ const schemaFile = path.join(projectRoot, '_schema', `${regType.schemaRef}.yaml`);
33
+ let raw;
34
+ try {
35
+ raw = await readFile(schemaFile, 'utf-8');
36
+ const st = await stat(schemaFile);
37
+ cachedFiles.set(schemaFile, { mtimeMs: st.mtimeMs, size: st.size });
38
+ }
39
+ catch (e) {
40
+ errors.push(maadError('SCHEMA_NOT_FOUND', `Schema file not found for type "${regType.name}": ${schemaFile}`));
41
+ continue;
42
+ }
43
+ let data;
44
+ try {
45
+ if (raw.trimStart().startsWith('---')) {
46
+ data = parseMatter(raw).data;
47
+ }
48
+ else {
49
+ data = parseMatter(`---\n${raw}\n---`).data;
50
+ }
51
+ }
52
+ catch (e) {
53
+ const message = e instanceof Error ? e.message : 'Unknown parse error';
54
+ errors.push(maadError('PARSE_ERROR', `Failed to parse schema "${regType.schemaRef}": ${message}`));
55
+ continue;
56
+ }
57
+ const result = parseSchemaDefinition(data, regType.schemaRef, registry);
58
+ if (!result.ok) {
59
+ errors.push(...result.errors);
60
+ continue;
61
+ }
62
+ schemas.set(regType.schemaRef, result.value);
63
+ typeToSchema.set(result.value.type, regType.schemaRef);
64
+ }
65
+ if (errors.length > 0) {
66
+ return err(errors);
67
+ }
68
+ const store = {
69
+ schemas,
70
+ cachedFiles,
71
+ getSchema(ref) {
72
+ return schemas.get(ref);
73
+ },
74
+ getSchemaForType(type) {
75
+ const ref = typeToSchema.get(type);
76
+ if (ref === undefined)
77
+ return undefined;
78
+ return schemas.get(ref);
79
+ },
80
+ isStale() {
81
+ // Sync stat — called on every write entry so latency matters; for the
82
+ // typical project (5-20 schemas) this is microseconds. Any disagreement
83
+ // with cached mtime/size is treated as stale; an absent file (cached
84
+ // but stat throws ENOENT) is also stale.
85
+ for (const [absPath, cached] of cachedFiles) {
86
+ try {
87
+ const st = statSync(absPath);
88
+ if (st.mtimeMs !== cached.mtimeMs || st.size !== cached.size)
89
+ return true;
90
+ }
91
+ catch {
92
+ return true;
93
+ }
94
+ }
95
+ return false;
96
+ },
97
+ };
98
+ return ok(store);
99
+ }
100
+ function parseSchemaDefinition(data, ref, registry) {
101
+ const errors = [];
102
+ // Type
103
+ const typeName = data['type'];
104
+ if (typeof typeName !== 'string') {
105
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${ref}" must have a "type" string`));
106
+ return err(errors);
107
+ }
108
+ // Version
109
+ const version = data['version'];
110
+ const versionNum = typeof version === 'number' ? version : parseVersionFromRef(ref);
111
+ // Required fields
112
+ const requiredRaw = data['required'];
113
+ const required = [];
114
+ if (Array.isArray(requiredRaw)) {
115
+ for (const r of requiredRaw) {
116
+ if (typeof r === 'string')
117
+ required.push(r);
118
+ }
119
+ }
120
+ // Fields
121
+ const fieldsRaw = data['fields'];
122
+ const fields = new Map();
123
+ if (fieldsRaw !== undefined && typeof fieldsRaw === 'object' && fieldsRaw !== null) {
124
+ for (const [fieldName, fieldDef] of Object.entries(fieldsRaw)) {
125
+ if (typeof fieldDef !== 'object' || fieldDef === null) {
126
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${ref}" field "${fieldName}" must be a mapping`));
127
+ continue;
128
+ }
129
+ const fd = fieldDef;
130
+ const fieldResult = parseFieldDefinition(fieldName, fd, ref, registry);
131
+ if (!fieldResult.ok) {
132
+ errors.push(...fieldResult.errors);
133
+ continue;
134
+ }
135
+ fields.set(fieldName, fieldResult.value);
136
+ }
137
+ }
138
+ // Validate required fields exist in fields map
139
+ for (const req of required) {
140
+ if (req === 'doc_id' || req === 'doc_type' || req === 'schema')
141
+ continue;
142
+ if (!fields.has(req)) {
143
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${ref}" lists "${req}" as required but it is not defined in fields`));
144
+ }
145
+ }
146
+ // Template
147
+ let template = null;
148
+ const templateRaw = data['template'];
149
+ if (templateRaw !== undefined && typeof templateRaw === 'object' && templateRaw !== null) {
150
+ const tpl = templateRaw;
151
+ const headingsRaw = tpl['headings'];
152
+ if (Array.isArray(headingsRaw)) {
153
+ template = [];
154
+ for (const h of headingsRaw) {
155
+ if (typeof h === 'object' && h !== null) {
156
+ const hDef = h;
157
+ template.push({
158
+ level: typeof hDef['level'] === 'number' ? hDef['level'] : 1,
159
+ text: typeof hDef['text'] === 'string' ? hDef['text'] : '',
160
+ id: typeof hDef['id'] === 'string' ? hDef['id'] : null,
161
+ });
162
+ }
163
+ }
164
+ }
165
+ }
166
+ if (errors.length > 0) {
167
+ return err(errors);
168
+ }
169
+ return ok({
170
+ type: docType(typeName),
171
+ version: versionNum,
172
+ required,
173
+ fields,
174
+ template,
175
+ });
176
+ }
177
+ function parseFieldDefinition(name, fd, schemaRef, registry) {
178
+ const errors = [];
179
+ const typeStr = fd['type'];
180
+ if (typeof typeStr !== 'string' || !VALID_FIELD_TYPES.includes(typeStr)) {
181
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" has invalid type "${String(typeStr)}". Valid: ${VALID_FIELD_TYPES.join(', ')}`));
182
+ return err(errors);
183
+ }
184
+ const fieldType = typeStr;
185
+ const index = fd['index'] === true;
186
+ const role = typeof fd['role'] === 'string' ? fd['role'] : null;
187
+ const format = typeof fd['format'] === 'string' ? fd['format'] : (fieldType === 'date' ? 'YYYY-MM-DD' : null);
188
+ // Ref target validation — applies to ref fields AND list fields with item_type: ref
189
+ let target = null;
190
+ const needsTarget = fieldType === 'ref' || (fieldType === 'list' && fd['item_type'] === 'ref');
191
+ if (needsTarget) {
192
+ const targetStr = fd['target'];
193
+ if (typeof targetStr !== 'string') {
194
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" has ref target but no "target" type specified`));
195
+ }
196
+ else {
197
+ if (!registry.types.has(docType(targetStr))) {
198
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" references unknown type "${targetStr}"`));
199
+ }
200
+ target = docType(targetStr);
201
+ }
202
+ }
203
+ // Enum values
204
+ let values = null;
205
+ if (fieldType === 'enum') {
206
+ const valuesRaw = fd['values'];
207
+ if (!Array.isArray(valuesRaw) || valuesRaw.length === 0) {
208
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" is an enum but has no "values" array`));
209
+ }
210
+ else {
211
+ values = valuesRaw.map(String);
212
+ }
213
+ }
214
+ // List item type
215
+ let itemType = null;
216
+ if (fieldType === 'list') {
217
+ const itemTypeStr = fd['item_type'];
218
+ if (typeof itemTypeStr === 'string' && VALID_FIELD_TYPES.includes(itemTypeStr)) {
219
+ itemType = itemTypeStr;
220
+ }
221
+ // item_type is optional for lists — default to string items
222
+ }
223
+ const defaultValue = fd['default'] ?? null;
224
+ // --- 0.6.7 schema precision hints (only meaningful on date fields) -----
225
+ let storePrecision = null;
226
+ let onCoarser = null;
227
+ let displayPrecision = null;
228
+ if (fieldType === 'date') {
229
+ const spRaw = fd['store_precision'];
230
+ if (spRaw !== undefined) {
231
+ if (!isPrecision(spRaw)) {
232
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" has invalid store_precision "${String(spRaw)}". ` +
233
+ `Valid: year, month, day, hour, minute, second, millisecond`));
234
+ }
235
+ else {
236
+ storePrecision = spRaw;
237
+ }
238
+ }
239
+ const ocRaw = fd['on_coarser'];
240
+ if (ocRaw !== undefined) {
241
+ if (ocRaw !== 'warn' && ocRaw !== 'error') {
242
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" has invalid on_coarser "${String(ocRaw)}". ` +
243
+ `Valid: warn, error`));
244
+ }
245
+ else {
246
+ onCoarser = ocRaw;
247
+ }
248
+ }
249
+ else if (storePrecision !== null) {
250
+ // Default to warn when store_precision is declared — the non-breaking
251
+ // rollout target. Callers who want strict behavior must opt in.
252
+ onCoarser = 'warn';
253
+ }
254
+ const dpRaw = fd['display_precision'];
255
+ if (dpRaw !== undefined) {
256
+ if (!isPrecision(dpRaw)) {
257
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" has invalid display_precision "${String(dpRaw)}". ` +
258
+ `Valid: year, month, day, hour, minute, second, millisecond`));
259
+ }
260
+ else {
261
+ displayPrecision = dpRaw;
262
+ }
263
+ }
264
+ // display_precision must be coarser-or-equal to store_precision (i.e.
265
+ // display no finer than storage). Inverted is nonsense — render finer
266
+ // than what's actually captured.
267
+ if (storePrecision !== null && displayPrecision !== null) {
268
+ if (comparePrecision(displayPrecision, storePrecision) > 0) {
269
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" has display_precision "${displayPrecision}" finer than ` +
270
+ `store_precision "${storePrecision}". display must be coarser-or-equal to store.`));
271
+ }
272
+ }
273
+ }
274
+ else {
275
+ // Non-date fields must not declare precision keys.
276
+ for (const k of ['store_precision', 'on_coarser', 'display_precision']) {
277
+ if (fd[k] !== undefined) {
278
+ errors.push(maadError('SCHEMA_INVALID', `Schema "${schemaRef}" field "${name}" of type "${fieldType}" cannot declare "${k}" — only valid on date fields`));
279
+ }
280
+ }
281
+ }
282
+ if (errors.length > 0)
283
+ return err(errors);
284
+ return ok({
285
+ name,
286
+ type: fieldType,
287
+ index,
288
+ role,
289
+ format,
290
+ target,
291
+ values,
292
+ defaultValue,
293
+ itemType,
294
+ storePrecision,
295
+ onCoarser,
296
+ displayPrecision,
297
+ });
298
+ }
299
+ function parseVersionFromRef(ref) {
300
+ const match = /\.v(\d+)$/.exec(ref);
301
+ return match ? parseInt(match[1], 10) : 1;
302
+ }
303
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/schema/loader.ts"],"names":[],"mappings":"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"}