@maadb/core 0.0.1 → 0.7.10-rc.3

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 (419) 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/backup.d.ts +9 -0
  80. package/dist/engine/backup.d.ts.map +1 -0
  81. package/dist/engine/backup.js +100 -0
  82. package/dist/engine/backup.js.map +1 -0
  83. package/dist/engine/composites.d.ts +6 -0
  84. package/dist/engine/composites.d.ts.map +1 -0
  85. package/dist/engine/composites.js +102 -0
  86. package/dist/engine/composites.js.map +1 -0
  87. package/dist/engine/context.d.ts +47 -0
  88. package/dist/engine/context.d.ts.map +1 -0
  89. package/dist/engine/context.js +55 -0
  90. package/dist/engine/context.js.map +1 -0
  91. package/dist/engine/docid-safe.d.ts +8 -0
  92. package/dist/engine/docid-safe.d.ts.map +1 -0
  93. package/dist/engine/docid-safe.js +0 -0
  94. package/dist/engine/docid-safe.js.map +1 -0
  95. package/dist/engine/helpers.d.ts +8 -0
  96. package/dist/engine/helpers.d.ts.map +1 -0
  97. package/dist/engine/helpers.js +102 -0
  98. package/dist/engine/helpers.js.map +1 -0
  99. package/dist/engine/index.d.ts +215 -0
  100. package/dist/engine/index.d.ts.map +1 -0
  101. package/dist/engine/index.js +494 -0
  102. package/dist/engine/index.js.map +1 -0
  103. package/dist/engine/indexing.d.ts +14 -0
  104. package/dist/engine/indexing.d.ts.map +1 -0
  105. package/dist/engine/indexing.js +225 -0
  106. package/dist/engine/indexing.js.map +1 -0
  107. package/dist/engine/journal.d.ts +32 -0
  108. package/dist/engine/journal.d.ts.map +1 -0
  109. package/dist/engine/journal.js +111 -0
  110. package/dist/engine/journal.js.map +1 -0
  111. package/dist/engine/logger.d.ts +19 -0
  112. package/dist/engine/logger.d.ts.map +1 -0
  113. package/dist/engine/logger.js +40 -0
  114. package/dist/engine/logger.js.map +1 -0
  115. package/dist/engine/maintenance.d.ts +15 -0
  116. package/dist/engine/maintenance.d.ts.map +1 -0
  117. package/dist/engine/maintenance.js +87 -0
  118. package/dist/engine/maintenance.js.map +1 -0
  119. package/dist/engine/mutex.d.ts +24 -0
  120. package/dist/engine/mutex.d.ts.map +1 -0
  121. package/dist/engine/mutex.js +50 -0
  122. package/dist/engine/mutex.js.map +1 -0
  123. package/dist/engine/pathguard.d.ts +16 -0
  124. package/dist/engine/pathguard.d.ts.map +1 -0
  125. package/dist/engine/pathguard.js +41 -0
  126. package/dist/engine/pathguard.js.map +1 -0
  127. package/dist/engine/reads.d.ts +25 -0
  128. package/dist/engine/reads.d.ts.map +1 -0
  129. package/dist/engine/reads.js +904 -0
  130. package/dist/engine/reads.js.map +1 -0
  131. package/dist/engine/types.d.ts +396 -0
  132. package/dist/engine/types.d.ts.map +1 -0
  133. package/dist/engine/types.js +5 -0
  134. package/dist/engine/types.js.map +1 -0
  135. package/dist/engine/writes.d.ts +10 -0
  136. package/dist/engine/writes.d.ts.map +1 -0
  137. package/dist/engine/writes.js +606 -0
  138. package/dist/engine/writes.js.map +1 -0
  139. package/dist/engine.d.ts +3 -0
  140. package/dist/engine.d.ts.map +1 -0
  141. package/dist/engine.js +6 -0
  142. package/dist/engine.js.map +1 -0
  143. package/dist/errors.d.ts +20 -0
  144. package/dist/errors.d.ts.map +1 -0
  145. package/dist/errors.js +17 -0
  146. package/dist/errors.js.map +1 -0
  147. package/dist/extractor/fields.d.ts +3 -0
  148. package/dist/extractor/fields.d.ts.map +1 -0
  149. package/dist/extractor/fields.js +58 -0
  150. package/dist/extractor/fields.js.map +1 -0
  151. package/dist/extractor/index.d.ts +7 -0
  152. package/dist/extractor/index.d.ts.map +1 -0
  153. package/dist/extractor/index.js +22 -0
  154. package/dist/extractor/index.js.map +1 -0
  155. package/dist/extractor/normalizers.d.ts +22 -0
  156. package/dist/extractor/normalizers.d.ts.map +1 -0
  157. package/dist/extractor/normalizers.js +250 -0
  158. package/dist/extractor/normalizers.js.map +1 -0
  159. package/dist/extractor/objects.d.ts +3 -0
  160. package/dist/extractor/objects.d.ts.map +1 -0
  161. package/dist/extractor/objects.js +33 -0
  162. package/dist/extractor/objects.js.map +1 -0
  163. package/dist/extractor/relationships.d.ts +3 -0
  164. package/dist/extractor/relationships.d.ts.map +1 -0
  165. package/dist/extractor/relationships.js +58 -0
  166. package/dist/extractor/relationships.js.map +1 -0
  167. package/dist/git/commit.d.ts +63 -0
  168. package/dist/git/commit.d.ts.map +1 -0
  169. package/dist/git/commit.js +161 -0
  170. package/dist/git/commit.js.map +1 -0
  171. package/dist/git/diff.d.ts +4 -0
  172. package/dist/git/diff.d.ts.map +1 -0
  173. package/dist/git/diff.js +56 -0
  174. package/dist/git/diff.js.map +1 -0
  175. package/dist/git/index.d.ts +63 -0
  176. package/dist/git/index.d.ts.map +1 -0
  177. package/dist/git/index.js +151 -0
  178. package/dist/git/index.js.map +1 -0
  179. package/dist/git/log.d.ts +13 -0
  180. package/dist/git/log.d.ts.map +1 -0
  181. package/dist/git/log.js +116 -0
  182. package/dist/git/log.js.map +1 -0
  183. package/dist/git/snapshot.d.ts +4 -0
  184. package/dist/git/snapshot.d.ts.map +1 -0
  185. package/dist/git/snapshot.js +65 -0
  186. package/dist/git/snapshot.js.map +1 -0
  187. package/dist/instance/config.d.ts +19 -0
  188. package/dist/instance/config.d.ts.map +1 -0
  189. package/dist/instance/config.js +107 -0
  190. package/dist/instance/config.js.map +1 -0
  191. package/dist/instance/pool.d.ts +138 -0
  192. package/dist/instance/pool.d.ts.map +1 -0
  193. package/dist/instance/pool.js +335 -0
  194. package/dist/instance/pool.js.map +1 -0
  195. package/dist/instance/session.d.ts +140 -0
  196. package/dist/instance/session.d.ts.map +1 -0
  197. package/dist/instance/session.js +267 -0
  198. package/dist/instance/session.js.map +1 -0
  199. package/dist/logging.d.ts +108 -0
  200. package/dist/logging.d.ts.map +1 -0
  201. package/dist/logging.js +120 -0
  202. package/dist/logging.js.map +1 -0
  203. package/dist/maad-md.d.ts +11 -0
  204. package/dist/maad-md.d.ts.map +1 -0
  205. package/dist/maad-md.js +252 -0
  206. package/dist/maad-md.js.map +1 -0
  207. package/dist/mcp/bulk-cap.d.ts +10 -0
  208. package/dist/mcp/bulk-cap.d.ts.map +1 -0
  209. package/dist/mcp/bulk-cap.js +37 -0
  210. package/dist/mcp/bulk-cap.js.map +1 -0
  211. package/dist/mcp/config.d.ts +18 -0
  212. package/dist/mcp/config.d.ts.map +1 -0
  213. package/dist/mcp/config.js +20 -0
  214. package/dist/mcp/config.js.map +1 -0
  215. package/dist/mcp/ctx.d.ts +17 -0
  216. package/dist/mcp/ctx.d.ts.map +1 -0
  217. package/dist/mcp/ctx.js +7 -0
  218. package/dist/mcp/ctx.js.map +1 -0
  219. package/dist/mcp/guardrails.d.ts +42 -0
  220. package/dist/mcp/guardrails.d.ts.map +1 -0
  221. package/dist/mcp/guardrails.js +58 -0
  222. package/dist/mcp/guardrails.js.map +1 -0
  223. package/dist/mcp/idempotency.d.ts +69 -0
  224. package/dist/mcp/idempotency.d.ts.map +1 -0
  225. package/dist/mcp/idempotency.js +168 -0
  226. package/dist/mcp/idempotency.js.map +1 -0
  227. package/dist/mcp/instance-reload.d.ts +23 -0
  228. package/dist/mcp/instance-reload.d.ts.map +1 -0
  229. package/dist/mcp/instance-reload.js +126 -0
  230. package/dist/mcp/instance-reload.js.map +1 -0
  231. package/dist/mcp/kinds.d.ts +22 -0
  232. package/dist/mcp/kinds.d.ts.map +1 -0
  233. package/dist/mcp/kinds.js +112 -0
  234. package/dist/mcp/kinds.js.map +1 -0
  235. package/dist/mcp/lifecycle.d.ts +8 -0
  236. package/dist/mcp/lifecycle.d.ts.map +1 -0
  237. package/dist/mcp/lifecycle.js +65 -0
  238. package/dist/mcp/lifecycle.js.map +1 -0
  239. package/dist/mcp/memory-pressure.d.ts +37 -0
  240. package/dist/mcp/memory-pressure.d.ts.map +1 -0
  241. package/dist/mcp/memory-pressure.js +179 -0
  242. package/dist/mcp/memory-pressure.js.map +1 -0
  243. package/dist/mcp/notifications.d.ts +87 -0
  244. package/dist/mcp/notifications.d.ts.map +1 -0
  245. package/dist/mcp/notifications.js +154 -0
  246. package/dist/mcp/notifications.js.map +1 -0
  247. package/dist/mcp/query-depth.d.ts +28 -0
  248. package/dist/mcp/query-depth.d.ts.map +1 -0
  249. package/dist/mcp/query-depth.js +43 -0
  250. package/dist/mcp/query-depth.js.map +1 -0
  251. package/dist/mcp/rate-limit.d.ts +60 -0
  252. package/dist/mcp/rate-limit.d.ts.map +1 -0
  253. package/dist/mcp/rate-limit.js +203 -0
  254. package/dist/mcp/rate-limit.js.map +1 -0
  255. package/dist/mcp/reload-signal.d.ts +13 -0
  256. package/dist/mcp/reload-signal.d.ts.map +1 -0
  257. package/dist/mcp/reload-signal.js +68 -0
  258. package/dist/mcp/reload-signal.js.map +1 -0
  259. package/dist/mcp/response.d.ts +109 -0
  260. package/dist/mcp/response.d.ts.map +1 -0
  261. package/dist/mcp/response.js +132 -0
  262. package/dist/mcp/response.js.map +1 -0
  263. package/dist/mcp/roles.d.ts +7 -0
  264. package/dist/mcp/roles.d.ts.map +1 -0
  265. package/dist/mcp/roles.js +57 -0
  266. package/dist/mcp/roles.js.map +1 -0
  267. package/dist/mcp/server.d.ts +33 -0
  268. package/dist/mcp/server.d.ts.map +1 -0
  269. package/dist/mcp/server.js +252 -0
  270. package/dist/mcp/server.js.map +1 -0
  271. package/dist/mcp/shutdown.d.ts +32 -0
  272. package/dist/mcp/shutdown.d.ts.map +1 -0
  273. package/dist/mcp/shutdown.js +130 -0
  274. package/dist/mcp/shutdown.js.map +1 -0
  275. package/dist/mcp/tools/audit.d.ts +4 -0
  276. package/dist/mcp/tools/audit.d.ts.map +1 -0
  277. package/dist/mcp/tools/audit.js +45 -0
  278. package/dist/mcp/tools/audit.js.map +1 -0
  279. package/dist/mcp/tools/auth.d.ts +4 -0
  280. package/dist/mcp/tools/auth.d.ts.map +1 -0
  281. package/dist/mcp/tools/auth.js +181 -0
  282. package/dist/mcp/tools/auth.js.map +1 -0
  283. package/dist/mcp/tools/backup.d.ts +4 -0
  284. package/dist/mcp/tools/backup.d.ts.map +1 -0
  285. package/dist/mcp/tools/backup.js +52 -0
  286. package/dist/mcp/tools/backup.js.map +1 -0
  287. package/dist/mcp/tools/discover.d.ts +4 -0
  288. package/dist/mcp/tools/discover.d.ts.map +1 -0
  289. package/dist/mcp/tools/discover.js +83 -0
  290. package/dist/mcp/tools/discover.js.map +1 -0
  291. package/dist/mcp/tools/instance.d.ts +15 -0
  292. package/dist/mcp/tools/instance.d.ts.map +1 -0
  293. package/dist/mcp/tools/instance.js +207 -0
  294. package/dist/mcp/tools/instance.js.map +1 -0
  295. package/dist/mcp/tools/maintain.d.ts +4 -0
  296. package/dist/mcp/tools/maintain.d.ts.map +1 -0
  297. package/dist/mcp/tools/maintain.js +123 -0
  298. package/dist/mcp/tools/maintain.js.map +1 -0
  299. package/dist/mcp/tools/read.d.ts +4 -0
  300. package/dist/mcp/tools/read.d.ts.map +1 -0
  301. package/dist/mcp/tools/read.js +304 -0
  302. package/dist/mcp/tools/read.js.map +1 -0
  303. package/dist/mcp/tools/write.d.ts +4 -0
  304. package/dist/mcp/tools/write.d.ts.map +1 -0
  305. package/dist/mcp/tools/write.js +342 -0
  306. package/dist/mcp/tools/write.js.map +1 -0
  307. package/dist/mcp/transport/auth.d.ts +41 -0
  308. package/dist/mcp/transport/auth.d.ts.map +1 -0
  309. package/dist/mcp/transport/auth.js +115 -0
  310. package/dist/mcp/transport/auth.js.map +1 -0
  311. package/dist/mcp/transport/http.d.ts +62 -0
  312. package/dist/mcp/transport/http.d.ts.map +1 -0
  313. package/dist/mcp/transport/http.js +357 -0
  314. package/dist/mcp/transport/http.js.map +1 -0
  315. package/dist/mcp/transport/pin.d.ts +15 -0
  316. package/dist/mcp/transport/pin.d.ts.map +1 -0
  317. package/dist/mcp/transport/pin.js +71 -0
  318. package/dist/mcp/transport/pin.js.map +1 -0
  319. package/dist/mcp/transport/telemetry.d.ts +79 -0
  320. package/dist/mcp/transport/telemetry.d.ts.map +1 -0
  321. package/dist/mcp/transport/telemetry.js +97 -0
  322. package/dist/mcp/transport/telemetry.js.map +1 -0
  323. package/dist/mcp/with-session.d.ts +26 -0
  324. package/dist/mcp/with-session.d.ts.map +1 -0
  325. package/dist/mcp/with-session.js +275 -0
  326. package/dist/mcp/with-session.js.map +1 -0
  327. package/dist/parser/annotations.d.ts +3 -0
  328. package/dist/parser/annotations.d.ts.map +1 -0
  329. package/dist/parser/annotations.js +41 -0
  330. package/dist/parser/annotations.js.map +1 -0
  331. package/dist/parser/blocks.d.ts +3 -0
  332. package/dist/parser/blocks.d.ts.map +1 -0
  333. package/dist/parser/blocks.js +101 -0
  334. package/dist/parser/blocks.js.map +1 -0
  335. package/dist/parser/frontmatter.d.ts +9 -0
  336. package/dist/parser/frontmatter.d.ts.map +1 -0
  337. package/dist/parser/frontmatter.js +33 -0
  338. package/dist/parser/frontmatter.js.map +1 -0
  339. package/dist/parser/index.d.ts +11 -0
  340. package/dist/parser/index.d.ts.map +1 -0
  341. package/dist/parser/index.js +54 -0
  342. package/dist/parser/index.js.map +1 -0
  343. package/dist/parser/matter.d.ts +3 -0
  344. package/dist/parser/matter.d.ts.map +1 -0
  345. package/dist/parser/matter.js +32 -0
  346. package/dist/parser/matter.js.map +1 -0
  347. package/dist/parser/tags.d.ts +3 -0
  348. package/dist/parser/tags.d.ts.map +1 -0
  349. package/dist/parser/tags.js +32 -0
  350. package/dist/parser/tags.js.map +1 -0
  351. package/dist/parser/verbatim.d.ts +4 -0
  352. package/dist/parser/verbatim.d.ts.map +1 -0
  353. package/dist/parser/verbatim.js +121 -0
  354. package/dist/parser/verbatim.js.map +1 -0
  355. package/dist/parser/yaml-profile.d.ts +4 -0
  356. package/dist/parser/yaml-profile.d.ts.map +1 -0
  357. package/dist/parser/yaml-profile.js +73 -0
  358. package/dist/parser/yaml-profile.js.map +1 -0
  359. package/dist/registry/index.d.ts +2 -0
  360. package/dist/registry/index.d.ts.map +1 -0
  361. package/dist/registry/index.js +2 -0
  362. package/dist/registry/index.js.map +1 -0
  363. package/dist/registry/loader.d.ts +4 -0
  364. package/dist/registry/loader.d.ts.map +1 -0
  365. package/dist/registry/loader.js +147 -0
  366. package/dist/registry/loader.js.map +1 -0
  367. package/dist/registry/types.d.ts +2 -0
  368. package/dist/registry/types.d.ts.map +1 -0
  369. package/dist/registry/types.js +5 -0
  370. package/dist/registry/types.js.map +1 -0
  371. package/dist/scanner.d.ts +57 -0
  372. package/dist/scanner.d.ts.map +1 -0
  373. package/dist/scanner.js +223 -0
  374. package/dist/scanner.js.map +1 -0
  375. package/dist/schema/index.d.ts +3 -0
  376. package/dist/schema/index.d.ts.map +1 -0
  377. package/dist/schema/index.js +3 -0
  378. package/dist/schema/index.js.map +1 -0
  379. package/dist/schema/loader.d.ts +4 -0
  380. package/dist/schema/loader.d.ts.map +1 -0
  381. package/dist/schema/loader.js +303 -0
  382. package/dist/schema/loader.js.map +1 -0
  383. package/dist/schema/precision.d.ts +6 -0
  384. package/dist/schema/precision.d.ts.map +1 -0
  385. package/dist/schema/precision.js +59 -0
  386. package/dist/schema/precision.js.map +1 -0
  387. package/dist/schema/validator.d.ts +21 -0
  388. package/dist/schema/validator.d.ts.map +1 -0
  389. package/dist/schema/validator.js +200 -0
  390. package/dist/schema/validator.js.map +1 -0
  391. package/dist/schema-md.d.ts +8 -0
  392. package/dist/schema-md.d.ts.map +1 -0
  393. package/dist/schema-md.js +98 -0
  394. package/dist/schema-md.js.map +1 -0
  395. package/dist/skill-files.d.ts +3 -0
  396. package/dist/skill-files.d.ts.map +1 -0
  397. package/dist/skill-files.js +362 -0
  398. package/dist/skill-files.js.map +1 -0
  399. package/dist/skills-scaffold.d.ts +10 -0
  400. package/dist/skills-scaffold.d.ts.map +1 -0
  401. package/dist/skills-scaffold.js +52 -0
  402. package/dist/skills-scaffold.js.map +1 -0
  403. package/dist/types.d.ts +309 -0
  404. package/dist/types.d.ts.map +1 -0
  405. package/dist/types.js +111 -0
  406. package/dist/types.js.map +1 -0
  407. package/dist/writer/index.d.ts +7 -0
  408. package/dist/writer/index.d.ts.map +1 -0
  409. package/dist/writer/index.js +32 -0
  410. package/dist/writer/index.js.map +1 -0
  411. package/dist/writer/serializer.d.ts +4 -0
  412. package/dist/writer/serializer.d.ts.map +1 -0
  413. package/dist/writer/serializer.js +103 -0
  414. package/dist/writer/serializer.js.map +1 -0
  415. package/dist/writer/template.d.ts +3 -0
  416. package/dist/writer/template.d.ts.map +1 -0
  417. package/dist/writer/template.js +27 -0
  418. package/dist/writer/template.js.map +1 -0
  419. package/package.json +59 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,OAAO,EACP,SAAS,EACT,QAAQ,EACR,SAAS,GACV,MAAM,aAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ // ============================================================================
2
+ // Registry Types — re-exported from core types for module-local use
3
+ // ============================================================================
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oEAAoE;AACpE,+EAA+E"}
@@ -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