open-agreements 0.7.5 → 0.7.6

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 (333) hide show
  1. package/README.de.md +300 -255
  2. package/README.es.md +301 -254
  3. package/README.md +389 -95
  4. package/README.pt-br.md +301 -254
  5. package/README.template.md +333 -0
  6. package/README.zh.md +300 -253
  7. package/SECURITY.md +34 -0
  8. package/content/recipes/nvca-stock-purchase-agreement/README.md +39 -0
  9. package/content/recipes/nvca-voting-agreement/README.md +43 -0
  10. package/content/templates/bonterms-mutual-nda/README.md +2 -2
  11. package/content/templates/bonterms-mutual-nda/metadata.yaml +5 -11
  12. package/content/templates/bonterms-professional-services-agreement/README.md +2 -2
  13. package/content/templates/bonterms-professional-services-agreement/metadata.yaml +2 -2
  14. package/content/templates/closing-checklist/template.docx +0 -0
  15. package/content/templates/closing-checklist/template.md +30 -0
  16. package/content/templates/common-paper-ai-addendum/template.docx +0 -0
  17. package/content/templates/common-paper-ai-addendum-in-app/template.docx +0 -0
  18. package/content/templates/common-paper-csa-with-ai/template.docx +0 -0
  19. package/content/templates/common-paper-independent-contractor-agreement/template.docx +0 -0
  20. package/content/templates/common-paper-mutual-nda/README.md +28 -0
  21. package/content/templates/common-paper-one-way-nda/metadata.yaml +1 -1
  22. package/content/templates/common-paper-term-sheet/template.docx +0 -0
  23. package/content/templates/openagreements-board-consent-safe/.template.generated.json +74 -0
  24. package/content/templates/openagreements-board-consent-safe/README.md +61 -0
  25. package/content/templates/openagreements-board-consent-safe/metadata.yaml +53 -0
  26. package/content/templates/openagreements-board-consent-safe/reference-source.docx +0 -0
  27. package/content/templates/openagreements-board-consent-safe/template.docx +0 -0
  28. package/content/templates/openagreements-board-consent-safe/template.md +66 -0
  29. package/content/templates/openagreements-due-diligence-request-list/README.md +68 -0
  30. package/content/templates/openagreements-due-diligence-request-list/metadata.yaml +300 -0
  31. package/content/templates/openagreements-due-diligence-request-list/template.docx +0 -0
  32. package/content/templates/openagreements-due-diligence-request-list/template.md +318 -0
  33. package/content/templates/openagreements-employee-ip-inventions-assignment/.template.generated.json +230 -0
  34. package/content/templates/openagreements-employee-ip-inventions-assignment/metadata.yaml +1 -1
  35. package/content/templates/openagreements-employee-ip-inventions-assignment/template.docx +0 -0
  36. package/content/templates/openagreements-employee-ip-inventions-assignment/template.md +96 -35
  37. package/content/templates/openagreements-employment-confidentiality-acknowledgement/README.md +1 -1
  38. package/content/templates/openagreements-employment-confidentiality-acknowledgement/metadata.yaml +2 -2
  39. package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.docx +0 -0
  40. package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.json +75 -0
  41. package/content/templates/openagreements-employment-confidentiality-acknowledgement/template.md +8 -4
  42. package/content/templates/openagreements-employment-offer-letter/.template.generated.json +224 -0
  43. package/content/templates/openagreements-employment-offer-letter/README.md +65 -1
  44. package/content/templates/openagreements-employment-offer-letter/metadata.yaml +1 -1
  45. package/content/templates/openagreements-employment-offer-letter/template.docx +0 -0
  46. package/content/templates/openagreements-employment-offer-letter/template.md +70 -30
  47. package/content/templates/openagreements-restrictive-covenant-florida/.template.generated.json +456 -0
  48. package/content/templates/openagreements-restrictive-covenant-florida/README.md +141 -0
  49. package/content/templates/openagreements-restrictive-covenant-florida/metadata.yaml +419 -0
  50. package/content/templates/openagreements-restrictive-covenant-florida/template.docx +0 -0
  51. package/content/templates/openagreements-restrictive-covenant-florida/template.md +233 -0
  52. package/content/templates/openagreements-restrictive-covenant-wyoming/.template.generated.json +399 -0
  53. package/content/templates/openagreements-restrictive-covenant-wyoming/metadata.yaml +69 -12
  54. package/content/templates/openagreements-restrictive-covenant-wyoming/template.docx +0 -0
  55. package/content/templates/openagreements-restrictive-covenant-wyoming/template.md +110 -59
  56. package/content/templates/openagreements-stockholder-consent-safe/.template.generated.json +74 -0
  57. package/content/templates/openagreements-stockholder-consent-safe/README.md +62 -0
  58. package/content/templates/openagreements-stockholder-consent-safe/metadata.yaml +53 -0
  59. package/content/templates/openagreements-stockholder-consent-safe/reference-source.docx +0 -0
  60. package/content/templates/openagreements-stockholder-consent-safe/template.docx +0 -0
  61. package/content/templates/openagreements-stockholder-consent-safe/template.md +62 -0
  62. package/content/templates/working-group-list/template.docx +0 -0
  63. package/content/templates/working-group-list/template.md +18 -0
  64. package/dist/cli/index.js.map +1 -1
  65. package/dist/commands/fill.d.ts +1 -1
  66. package/dist/commands/fill.d.ts.map +1 -1
  67. package/dist/commands/fill.js +4 -1
  68. package/dist/commands/fill.js.map +1 -1
  69. package/dist/commands/list.js +10 -0
  70. package/dist/commands/list.js.map +1 -1
  71. package/dist/commands/recipe.js.map +1 -1
  72. package/dist/core/employment/jurisdiction-rules.js +2 -2
  73. package/dist/core/employment/jurisdiction-rules.js.map +1 -1
  74. package/dist/core/employment/memo.d.ts +1 -1
  75. package/dist/core/employment/memo.d.ts.map +1 -1
  76. package/dist/core/employment/memo.js +14 -6
  77. package/dist/core/employment/memo.js.map +1 -1
  78. package/dist/core/engine.d.ts.map +1 -1
  79. package/dist/core/engine.js +28 -0
  80. package/dist/core/engine.js.map +1 -1
  81. package/dist/core/fill-pipeline.d.ts +30 -5
  82. package/dist/core/fill-pipeline.d.ts.map +1 -1
  83. package/dist/core/fill-pipeline.js +173 -9
  84. package/dist/core/fill-pipeline.js.map +1 -1
  85. package/dist/core/humanize-docx.d.ts +21 -0
  86. package/dist/core/humanize-docx.d.ts.map +1 -0
  87. package/dist/core/humanize-docx.js +492 -0
  88. package/dist/core/humanize-docx.js.map +1 -0
  89. package/dist/core/metadata.d.ts +118 -65
  90. package/dist/core/metadata.d.ts.map +1 -1
  91. package/dist/core/metadata.js +268 -13
  92. package/dist/core/metadata.js.map +1 -1
  93. package/dist/core/recipe/bracket-normalizer.d.ts +1 -1
  94. package/dist/core/recipe/bracket-normalizer.d.ts.map +1 -1
  95. package/dist/core/recipe/bracket-normalizer.js +3 -0
  96. package/dist/core/recipe/bracket-normalizer.js.map +1 -1
  97. package/dist/core/recipe/computed.d.ts +1 -1
  98. package/dist/core/recipe/computed.d.ts.map +1 -1
  99. package/dist/core/recipe/index.d.ts.map +1 -1
  100. package/dist/core/recipe/index.js +22 -4
  101. package/dist/core/recipe/index.js.map +1 -1
  102. package/dist/core/recipe/types.d.ts +1 -1
  103. package/dist/core/recipe/types.d.ts.map +1 -1
  104. package/dist/core/template-listing.d.ts +6 -8
  105. package/dist/core/template-listing.d.ts.map +1 -1
  106. package/dist/core/template-listing.js +24 -0
  107. package/dist/core/template-listing.js.map +1 -1
  108. package/dist/core/unified-pipeline.d.ts +2 -0
  109. package/dist/core/unified-pipeline.d.ts.map +1 -1
  110. package/dist/core/unified-pipeline.js +19 -1
  111. package/dist/core/unified-pipeline.js.map +1 -1
  112. package/dist/core/validation/template.d.ts +32 -0
  113. package/dist/core/validation/template.d.ts.map +1 -1
  114. package/dist/core/validation/template.js +163 -3
  115. package/dist/core/validation/template.js.map +1 -1
  116. package/dist/index.d.ts +1 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +2 -0
  119. package/dist/index.js.map +1 -1
  120. package/package.json +26 -12
  121. package/skills/canonical-markdown-authoring/CONNECTORS.md +67 -0
  122. package/skills/canonical-markdown-authoring/SKILL.md +565 -0
  123. package/skills/client-email/SKILL.md +2 -0
  124. package/skills/cloud-service-agreement/CONNECTORS.md +2 -2
  125. package/skills/cloud-service-agreement/SKILL.md +38 -1
  126. package/skills/cloud-service-agreement/template-filling-execution.md +2 -2
  127. package/skills/data-privacy-agreement/CONNECTORS.md +2 -2
  128. package/skills/data-privacy-agreement/SKILL.md +2 -0
  129. package/skills/delaware-franchise-tax/SKILL.md +2 -0
  130. package/skills/edit-docx-agreement/SKILL.md +2 -0
  131. package/skills/employment-contract/CONNECTORS.md +2 -2
  132. package/skills/employment-contract/SKILL.md +2 -0
  133. package/skills/iso-27001-evidence-collection/SKILL.md +2 -0
  134. package/skills/iso-27001-internal-audit/SKILL.md +2 -0
  135. package/skills/nda/CONNECTORS.md +2 -2
  136. package/skills/nda/SKILL.md +45 -1
  137. package/skills/nda/template-filling-execution.md +12 -6
  138. package/skills/non-compete-contract-explainer/SKILL.md +107 -0
  139. package/skills/non-compete-contract-explainer/content/wyoming.md +286 -0
  140. package/skills/non-compete-contract-explainer/manifest.json +18 -0
  141. package/skills/open-agreements/CONNECTORS.md +2 -2
  142. package/skills/open-agreements/SKILL.md +165 -67
  143. package/skills/open-agreements/template-filling-execution.md +2 -2
  144. package/skills/recipe-quality-audit/SKILL.md +2 -0
  145. package/skills/safe/CONNECTORS.md +2 -2
  146. package/skills/safe/SKILL.md +38 -1
  147. package/skills/safe/template-filling-execution.md +2 -2
  148. package/skills/services-agreement/CONNECTORS.md +2 -2
  149. package/skills/services-agreement/SKILL.md +40 -1
  150. package/skills/services-agreement/template-filling-execution.md +81 -0
  151. package/skills/shared/template-filling-execution.md +2 -2
  152. package/skills/soc2-readiness/SKILL.md +2 -0
  153. package/skills/unit-test-philosophy/SKILL.md +3 -0
  154. package/skills/venture-financing/CONNECTORS.md +2 -2
  155. package/skills/venture-financing/SKILL.md +2 -0
  156. package/content/templates/openagreements-restrictive-covenant-wyoming/practice-note.md +0 -103
  157. package/node_modules/@xmldom/xmldom/CHANGELOG.md +0 -939
  158. package/node_modules/@xmldom/xmldom/LICENSE +0 -8
  159. package/node_modules/@xmldom/xmldom/SECURITY.md +0 -50
  160. package/node_modules/@xmldom/xmldom/index.d.ts +0 -1664
  161. package/node_modules/@xmldom/xmldom/lib/.eslintrc.yml +0 -3
  162. package/node_modules/@xmldom/xmldom/lib/conventions.js +0 -429
  163. package/node_modules/@xmldom/xmldom/lib/dom-parser.js +0 -586
  164. package/node_modules/@xmldom/xmldom/lib/dom.js +0 -3192
  165. package/node_modules/@xmldom/xmldom/lib/entities.js +0 -2171
  166. package/node_modules/@xmldom/xmldom/lib/errors.js +0 -202
  167. package/node_modules/@xmldom/xmldom/lib/grammar.js +0 -533
  168. package/node_modules/@xmldom/xmldom/lib/index.js +0 -41
  169. package/node_modules/@xmldom/xmldom/lib/sax.js +0 -929
  170. package/node_modules/@xmldom/xmldom/package.json +0 -74
  171. package/node_modules/@xmldom/xmldom/readme.md +0 -364
  172. package/node_modules/core-util-is/LICENSE +0 -19
  173. package/node_modules/core-util-is/README.md +0 -3
  174. package/node_modules/core-util-is/lib/util.js +0 -107
  175. package/node_modules/core-util-is/package.json +0 -38
  176. package/node_modules/immediate/LICENSE.txt +0 -20
  177. package/node_modules/immediate/README.md +0 -93
  178. package/node_modules/immediate/dist/immediate.js +0 -75
  179. package/node_modules/immediate/dist/immediate.min.js +0 -1
  180. package/node_modules/immediate/lib/browser.js +0 -69
  181. package/node_modules/immediate/lib/index.js +0 -73
  182. package/node_modules/immediate/package.json +0 -42
  183. package/node_modules/inherits/LICENSE +0 -16
  184. package/node_modules/inherits/README.md +0 -42
  185. package/node_modules/inherits/inherits.js +0 -9
  186. package/node_modules/inherits/inherits_browser.js +0 -27
  187. package/node_modules/inherits/package.json +0 -29
  188. package/node_modules/isarray/.npmignore +0 -1
  189. package/node_modules/isarray/.travis.yml +0 -4
  190. package/node_modules/isarray/Makefile +0 -6
  191. package/node_modules/isarray/README.md +0 -60
  192. package/node_modules/isarray/component.json +0 -19
  193. package/node_modules/isarray/index.js +0 -5
  194. package/node_modules/isarray/package.json +0 -45
  195. package/node_modules/isarray/test.js +0 -20
  196. package/node_modules/jszip/.codeclimate.yml +0 -16
  197. package/node_modules/jszip/.editorconfig +0 -8
  198. package/node_modules/jszip/.eslintrc.js +0 -43
  199. package/node_modules/jszip/.github/workflows/pr.yaml +0 -58
  200. package/node_modules/jszip/.jekyll-metadata +0 -0
  201. package/node_modules/jszip/.travis.yml +0 -17
  202. package/node_modules/jszip/CHANGES.md +0 -204
  203. package/node_modules/jszip/LICENSE.markdown +0 -651
  204. package/node_modules/jszip/README.markdown +0 -33
  205. package/node_modules/jszip/deps.js +0 -37
  206. package/node_modules/jszip/dist/jszip.js +0 -11577
  207. package/node_modules/jszip/dist/jszip.min.js +0 -13
  208. package/node_modules/jszip/graph.svg +0 -601
  209. package/node_modules/jszip/index.d.ts +0 -330
  210. package/node_modules/jszip/lib/base64.js +0 -106
  211. package/node_modules/jszip/lib/compressedObject.js +0 -74
  212. package/node_modules/jszip/lib/compressions.js +0 -14
  213. package/node_modules/jszip/lib/crc32.js +0 -77
  214. package/node_modules/jszip/lib/defaults.js +0 -11
  215. package/node_modules/jszip/lib/external.js +0 -18
  216. package/node_modules/jszip/lib/flate.js +0 -85
  217. package/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -539
  218. package/node_modules/jszip/lib/generate/index.js +0 -57
  219. package/node_modules/jszip/lib/index.js +0 -55
  220. package/node_modules/jszip/lib/license_header.js +0 -11
  221. package/node_modules/jszip/lib/load.js +0 -88
  222. package/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
  223. package/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
  224. package/node_modules/jszip/lib/nodejsUtils.js +0 -57
  225. package/node_modules/jszip/lib/object.js +0 -384
  226. package/node_modules/jszip/lib/readable-stream-browser.js +0 -10
  227. package/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
  228. package/node_modules/jszip/lib/reader/DataReader.js +0 -116
  229. package/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
  230. package/node_modules/jszip/lib/reader/StringReader.js +0 -38
  231. package/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
  232. package/node_modules/jszip/lib/reader/readerFor.js +0 -28
  233. package/node_modules/jszip/lib/signature.js +0 -7
  234. package/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
  235. package/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
  236. package/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
  237. package/node_modules/jszip/lib/stream/DataWorker.js +0 -116
  238. package/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
  239. package/node_modules/jszip/lib/stream/StreamHelper.js +0 -214
  240. package/node_modules/jszip/lib/support.js +0 -38
  241. package/node_modules/jszip/lib/utf8.js +0 -275
  242. package/node_modules/jszip/lib/utils.js +0 -501
  243. package/node_modules/jszip/lib/zipEntries.js +0 -261
  244. package/node_modules/jszip/lib/zipEntry.js +0 -293
  245. package/node_modules/jszip/lib/zipObject.js +0 -133
  246. package/node_modules/jszip/package.json +0 -67
  247. package/node_modules/jszip/sponsors.md +0 -21
  248. package/node_modules/jszip/tsconfig.json +0 -101
  249. package/node_modules/jszip/vendor/FileSaver.js +0 -247
  250. package/node_modules/lie/README.md +0 -62
  251. package/node_modules/lie/dist/lie.js +0 -350
  252. package/node_modules/lie/dist/lie.min.js +0 -1
  253. package/node_modules/lie/dist/lie.polyfill.js +0 -358
  254. package/node_modules/lie/dist/lie.polyfill.min.js +0 -1
  255. package/node_modules/lie/lib/browser.js +0 -273
  256. package/node_modules/lie/lib/index.js +0 -298
  257. package/node_modules/lie/license.md +0 -7
  258. package/node_modules/lie/lie.d.ts +0 -244
  259. package/node_modules/lie/package.json +0 -69
  260. package/node_modules/lie/polyfill.js +0 -4
  261. package/node_modules/pako/LICENSE +0 -21
  262. package/node_modules/pako/README.md +0 -191
  263. package/node_modules/pako/dist/pako.js +0 -6818
  264. package/node_modules/pako/dist/pako.min.js +0 -1
  265. package/node_modules/pako/dist/pako_deflate.js +0 -3997
  266. package/node_modules/pako/dist/pako_deflate.min.js +0 -1
  267. package/node_modules/pako/dist/pako_inflate.js +0 -3300
  268. package/node_modules/pako/dist/pako_inflate.min.js +0 -1
  269. package/node_modules/pako/index.js +0 -14
  270. package/node_modules/pako/lib/deflate.js +0 -400
  271. package/node_modules/pako/lib/inflate.js +0 -423
  272. package/node_modules/pako/lib/utils/common.js +0 -105
  273. package/node_modules/pako/lib/utils/strings.js +0 -187
  274. package/node_modules/pako/lib/zlib/README +0 -59
  275. package/node_modules/pako/lib/zlib/adler32.js +0 -51
  276. package/node_modules/pako/lib/zlib/constants.js +0 -68
  277. package/node_modules/pako/lib/zlib/crc32.js +0 -59
  278. package/node_modules/pako/lib/zlib/deflate.js +0 -1874
  279. package/node_modules/pako/lib/zlib/gzheader.js +0 -58
  280. package/node_modules/pako/lib/zlib/inffast.js +0 -345
  281. package/node_modules/pako/lib/zlib/inflate.js +0 -1556
  282. package/node_modules/pako/lib/zlib/inftrees.js +0 -343
  283. package/node_modules/pako/lib/zlib/messages.js +0 -32
  284. package/node_modules/pako/lib/zlib/trees.js +0 -1222
  285. package/node_modules/pako/lib/zlib/zstream.js +0 -47
  286. package/node_modules/pako/package.json +0 -44
  287. package/node_modules/process-nextick-args/index.js +0 -45
  288. package/node_modules/process-nextick-args/license.md +0 -19
  289. package/node_modules/process-nextick-args/package.json +0 -25
  290. package/node_modules/process-nextick-args/readme.md +0 -18
  291. package/node_modules/readable-stream/.travis.yml +0 -34
  292. package/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  293. package/node_modules/readable-stream/GOVERNANCE.md +0 -136
  294. package/node_modules/readable-stream/LICENSE +0 -47
  295. package/node_modules/readable-stream/README.md +0 -58
  296. package/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
  297. package/node_modules/readable-stream/duplex-browser.js +0 -1
  298. package/node_modules/readable-stream/duplex.js +0 -1
  299. package/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
  300. package/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
  301. package/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
  302. package/node_modules/readable-stream/lib/_stream_transform.js +0 -214
  303. package/node_modules/readable-stream/lib/_stream_writable.js +0 -685
  304. package/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -78
  305. package/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -84
  306. package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  307. package/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  308. package/node_modules/readable-stream/package.json +0 -52
  309. package/node_modules/readable-stream/passthrough.js +0 -1
  310. package/node_modules/readable-stream/readable-browser.js +0 -7
  311. package/node_modules/readable-stream/readable.js +0 -19
  312. package/node_modules/readable-stream/transform.js +0 -1
  313. package/node_modules/readable-stream/writable-browser.js +0 -1
  314. package/node_modules/readable-stream/writable.js +0 -8
  315. package/node_modules/safe-buffer/LICENSE +0 -21
  316. package/node_modules/safe-buffer/README.md +0 -584
  317. package/node_modules/safe-buffer/index.d.ts +0 -187
  318. package/node_modules/safe-buffer/index.js +0 -62
  319. package/node_modules/safe-buffer/package.json +0 -37
  320. package/node_modules/setimmediate/LICENSE.txt +0 -20
  321. package/node_modules/setimmediate/package.json +0 -30
  322. package/node_modules/setimmediate/setImmediate.js +0 -186
  323. package/node_modules/string_decoder/.travis.yml +0 -50
  324. package/node_modules/string_decoder/LICENSE +0 -48
  325. package/node_modules/string_decoder/README.md +0 -47
  326. package/node_modules/string_decoder/lib/string_decoder.js +0 -296
  327. package/node_modules/string_decoder/package.json +0 -31
  328. package/node_modules/util-deprecate/History.md +0 -16
  329. package/node_modules/util-deprecate/LICENSE +0 -24
  330. package/node_modules/util-deprecate/README.md +0 -53
  331. package/node_modules/util-deprecate/browser.js +0 -67
  332. package/node_modules/util-deprecate/node.js +0 -6
  333. package/node_modules/util-deprecate/package.json +0 -27
@@ -1,27 +1,82 @@
1
1
  import { z } from 'zod';
2
+ /**
3
+ * License values accepted by template metadata.
4
+ *
5
+ * CC-BY-4.0 and CC0-1.0 templates may be redistributed as OpenAgreements
6
+ * content. CC-BY-ND-4.0 templates are vendored only when unmodified and must
7
+ * declare `allow_derivatives: false`.
8
+ */
2
9
  export declare const LicenseEnum: z.ZodEnum<{
3
10
  "CC-BY-4.0": "CC-BY-4.0";
4
11
  "CC0-1.0": "CC0-1.0";
5
12
  "CC-BY-ND-4.0": "CC-BY-ND-4.0";
6
13
  }>;
7
14
  export type License = z.infer<typeof LicenseEnum>;
8
- export declare const FieldDefinitionSchema: z.ZodObject<{
9
- name: z.ZodString;
10
- type: z.ZodEnum<{
11
- string: "string";
12
- number: "number";
13
- boolean: "boolean";
14
- date: "date";
15
- enum: "enum";
16
- array: "array";
17
- }>;
18
- description: z.ZodString;
19
- default: z.ZodOptional<z.ZodString>;
20
- default_value_rationale: z.ZodOptional<z.ZodString>;
21
- options: z.ZodOptional<z.ZodArray<z.ZodString>>;
22
- section: z.ZodOptional<z.ZodString>;
23
- }, z.core.$strip>;
24
- export type FieldDefinition = z.infer<typeof FieldDefinitionSchema>;
15
+ /** Field kinds supported by template, external-template, and recipe metadata. */
16
+ declare const FieldTypeEnum: z.ZodEnum<{
17
+ string: "string";
18
+ number: "number";
19
+ boolean: "boolean";
20
+ date: "date";
21
+ enum: "enum";
22
+ array: "array";
23
+ multiselect: "multiselect";
24
+ }>;
25
+ export type FieldType = z.infer<typeof FieldTypeEnum>;
26
+ /**
27
+ * Metadata definition for a fillable field.
28
+ *
29
+ * `name`, `type`, and `description` are required. `enum` and `multiselect`
30
+ * fields must declare non-empty `options`; `array` fields may declare nested
31
+ * `items`; `display_label` is a presentation hint and never replaces `name`.
32
+ */
33
+ export interface FieldDefinition {
34
+ name: string;
35
+ type: FieldType;
36
+ description: string;
37
+ display_label?: string;
38
+ default?: string;
39
+ default_value_rationale?: string;
40
+ options?: string[];
41
+ derive_booleans?: boolean;
42
+ section?: string;
43
+ items?: FieldDefinition[];
44
+ /**
45
+ * Marks this boolean field as a *statutory compliance representation*: its
46
+ * `true` value asserts a past real-world fact that is a statutory precondition
47
+ * to the agreement's enforceability/validity (e.g. a required advance notice
48
+ * or written advisal that must actually have been given before signing).
49
+ *
50
+ * Deliberately NARROW — opt-in per field and reserved for the few reps that
51
+ * gate enforceability, NOT general representations (a purchase agreement may
52
+ * carry dozens of ordinary reps that should not all demand per-rep
53
+ * confirmation). When set, the field MUST be boolean with `default: 'false'`
54
+ * and MUST declare `authority_url`. A template clause references it via the
55
+ * renderer's `confirm=` directive, which renders the recital clean when the
56
+ * field is true and as a highlighted `[CONFIRM …]` bracket when it is false
57
+ * (never silently dropped). The broad confirmation warning rides in
58
+ * `description`; the short reason shown inside the rendered bracket rides in
59
+ * `confirm_note`.
60
+ */
61
+ statutory_compliance_representation?: boolean;
62
+ /**
63
+ * Statute / practice-note link used as the learn-more reference for a
64
+ * `statutory_compliance_representation` field (surfaced in the field
65
+ * description and the rendered `[CONFIRM …; see <authority_url>]` bracket).
66
+ * Only valid on a `statutory_compliance_representation` field.
67
+ */
68
+ authority_url?: string;
69
+ /**
70
+ * Short, human-readable reason rendered inside the
71
+ * `[CONFIRM before signing: <confirm_note>; see <authority_url>]` bracket of a
72
+ * `statutory_compliance_representation` field. This is the single source of
73
+ * truth for the bracket note — a `confirm=<field>` clause directive resolves
74
+ * it from here rather than restating it. Only valid on (and required for) a
75
+ * `statutory_compliance_representation` field.
76
+ */
77
+ confirm_note?: string;
78
+ }
79
+ export declare const FieldDefinitionSchema: z.ZodType<FieldDefinition>;
25
80
  export declare const TemplateMetadataSchema: z.ZodObject<{
26
81
  name: z.ZodString;
27
82
  description: z.ZodOptional<z.ZodString>;
@@ -35,25 +90,28 @@ export declare const TemplateMetadataSchema: z.ZodObject<{
35
90
  }>;
36
91
  allow_derivatives: z.ZodBoolean;
37
92
  attribution_text: z.ZodString;
38
- fields: z.ZodArray<z.ZodObject<{
93
+ fields: z.ZodArray<z.ZodType<FieldDefinition, unknown, z.core.$ZodTypeInternals<FieldDefinition, unknown>>>;
94
+ priority_fields: z.ZodDefault<z.ZodArray<z.ZodString>>;
95
+ credits: z.ZodDefault<z.ZodArray<z.ZodObject<{
39
96
  name: z.ZodString;
40
- type: z.ZodEnum<{
41
- string: "string";
42
- number: "number";
43
- boolean: "boolean";
44
- date: "date";
45
- enum: "enum";
46
- array: "array";
97
+ role: z.ZodEnum<{
98
+ drafter: "drafter";
99
+ drafting_editor: "drafting_editor";
100
+ reviewer: "reviewer";
101
+ maintainer: "maintainer";
47
102
  }>;
48
- description: z.ZodString;
49
- default: z.ZodOptional<z.ZodString>;
50
- default_value_rationale: z.ZodOptional<z.ZodString>;
51
- options: z.ZodOptional<z.ZodArray<z.ZodString>>;
52
- section: z.ZodOptional<z.ZodString>;
53
- }, z.core.$strip>>;
54
- priority_fields: z.ZodDefault<z.ZodArray<z.ZodString>>;
103
+ profile_url: z.ZodOptional<z.ZodString>;
104
+ }, z.core.$strip>>>;
105
+ derived_from: z.ZodOptional<z.ZodString>;
55
106
  }, z.core.$strip>;
56
107
  export type TemplateMetadata = z.infer<typeof TemplateMetadataSchema>;
108
+ /**
109
+ * Metadata for vendored external templates.
110
+ *
111
+ * `source_sha256` records the checksum of the unmodified upstream document so
112
+ * validation can verify provenance for no-derivatives templates before local
113
+ * transient fills or CI license checks rely on that source.
114
+ */
57
115
  export declare const ExternalMetadataSchema: z.ZodObject<{
58
116
  name: z.ZodString;
59
117
  description: z.ZodOptional<z.ZodString>;
@@ -67,26 +125,23 @@ export declare const ExternalMetadataSchema: z.ZodObject<{
67
125
  }>;
68
126
  allow_derivatives: z.ZodBoolean;
69
127
  attribution_text: z.ZodString;
70
- fields: z.ZodArray<z.ZodObject<{
128
+ fields: z.ZodArray<z.ZodType<FieldDefinition, unknown, z.core.$ZodTypeInternals<FieldDefinition, unknown>>>;
129
+ priority_fields: z.ZodDefault<z.ZodArray<z.ZodString>>;
130
+ credits: z.ZodDefault<z.ZodArray<z.ZodObject<{
71
131
  name: z.ZodString;
72
- type: z.ZodEnum<{
73
- string: "string";
74
- number: "number";
75
- boolean: "boolean";
76
- date: "date";
77
- enum: "enum";
78
- array: "array";
132
+ role: z.ZodEnum<{
133
+ drafter: "drafter";
134
+ drafting_editor: "drafting_editor";
135
+ reviewer: "reviewer";
136
+ maintainer: "maintainer";
79
137
  }>;
80
- description: z.ZodString;
81
- default: z.ZodOptional<z.ZodString>;
82
- default_value_rationale: z.ZodOptional<z.ZodString>;
83
- options: z.ZodOptional<z.ZodArray<z.ZodString>>;
84
- section: z.ZodOptional<z.ZodString>;
85
- }, z.core.$strip>>;
86
- priority_fields: z.ZodDefault<z.ZodArray<z.ZodString>>;
138
+ profile_url: z.ZodOptional<z.ZodString>;
139
+ }, z.core.$strip>>>;
140
+ derived_from: z.ZodOptional<z.ZodString>;
87
141
  source_sha256: z.ZodString;
88
142
  }, z.core.$strip>;
89
143
  export type ExternalMetadata = z.infer<typeof ExternalMetadataSchema>;
144
+ /** Declarative cleaner configuration for recipe DOCX preprocessing. */
90
145
  export declare const CleanConfigSchema: z.ZodObject<{
91
146
  removeFootnotes: z.ZodDefault<z.ZodBoolean>;
92
147
  removeBeforePattern: z.ZodOptional<z.ZodString>;
@@ -126,8 +181,8 @@ export declare const NormalizeConfigSchema: z.ZodObject<{
126
181
  export type NormalizeConfig = z.infer<typeof NormalizeConfigSchema>;
127
182
  export declare const GuidanceEntrySchema: z.ZodObject<{
128
183
  source: z.ZodEnum<{
129
- footnote: "footnote";
130
184
  pattern: "pattern";
185
+ footnote: "footnote";
131
186
  range: "range";
132
187
  }>;
133
188
  part: z.ZodString;
@@ -136,6 +191,7 @@ export declare const GuidanceEntrySchema: z.ZodObject<{
136
191
  groupId: z.ZodOptional<z.ZodString>;
137
192
  }, z.core.$strip>;
138
193
  export type GuidanceEntry = z.infer<typeof GuidanceEntrySchema>;
194
+ /** Machine-readable guidance artifact produced from recipe cleaning inputs. */
139
195
  export declare const GuidanceOutputSchema: z.ZodObject<{
140
196
  extractedFrom: z.ZodObject<{
141
197
  sourceHash: z.ZodString;
@@ -143,8 +199,8 @@ export declare const GuidanceOutputSchema: z.ZodObject<{
143
199
  }, z.core.$strip>;
144
200
  entries: z.ZodArray<z.ZodObject<{
145
201
  source: z.ZodEnum<{
146
- footnote: "footnote";
147
202
  pattern: "pattern";
203
+ footnote: "footnote";
148
204
  range: "range";
149
205
  }>;
150
206
  part: z.ZodString;
@@ -154,6 +210,17 @@ export declare const GuidanceOutputSchema: z.ZodObject<{
154
210
  }, z.core.$strip>>;
155
211
  }, z.core.$strip>;
156
212
  export type GuidanceOutput = z.infer<typeof GuidanceOutputSchema>;
213
+ /**
214
+ * Metadata required for recipe-based templates.
215
+ *
216
+ * Recipes point at non-redistributable upstream source DOCX files and ship only
217
+ * transformation instructions. Required fields are `name`, `source_url`,
218
+ * `source_version`, and `license_note`; `fields` and `priority_fields` reuse
219
+ * the same field-definition semantics as template metadata and default to
220
+ * empty arrays. `optional` defaults to `false`. `source_sha256` verifies
221
+ * provenance for upstream sources when present. `market_data_citations`
222
+ * records optional external citation metadata used by recipe guidance.
223
+ */
157
224
  export declare const RecipeMetadataSchema: z.ZodObject<{
158
225
  name: z.ZodString;
159
226
  category: z.ZodOptional<z.ZodString>;
@@ -163,22 +230,7 @@ export declare const RecipeMetadataSchema: z.ZodObject<{
163
230
  license_note: z.ZodString;
164
231
  optional: z.ZodDefault<z.ZodBoolean>;
165
232
  source_sha256: z.ZodOptional<z.ZodString>;
166
- fields: z.ZodDefault<z.ZodArray<z.ZodObject<{
167
- name: z.ZodString;
168
- type: z.ZodEnum<{
169
- string: "string";
170
- number: "number";
171
- boolean: "boolean";
172
- date: "date";
173
- enum: "enum";
174
- array: "array";
175
- }>;
176
- description: z.ZodString;
177
- default: z.ZodOptional<z.ZodString>;
178
- default_value_rationale: z.ZodOptional<z.ZodString>;
179
- options: z.ZodOptional<z.ZodArray<z.ZodString>>;
180
- section: z.ZodOptional<z.ZodString>;
181
- }, z.core.$strip>>>;
233
+ fields: z.ZodDefault<z.ZodArray<z.ZodType<FieldDefinition, unknown, z.core.$ZodTypeInternals<FieldDefinition, unknown>>>>;
182
234
  priority_fields: z.ZodDefault<z.ZodArray<z.ZodString>>;
183
235
  market_data_citations: z.ZodOptional<z.ZodArray<z.ZodObject<{
184
236
  id: z.ZodString;
@@ -204,4 +256,5 @@ export declare function validateRecipeMetadata(recipeDir: string): {
204
256
  valid: boolean;
205
257
  errors: string[];
206
258
  };
259
+ export {};
207
260
  //# sourceMappingURL=metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/core/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,WAAW;;;;EAAmD,CAAC;AAC5E,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAElD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;iBAmBjC,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AA2CpE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAEjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAIjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAItE,eAAO,MAAM,iBAAiB;;;;;;;;;iBAS5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,uCAAuC;;;;;;;;;;iBAUlD,CAAC;AACH,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uCAAuC,CAAC,CAAC;AAExG,eAAO,MAAM,qBAAqB;;;;;;;;;;;;iBAEhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,mBAAmB;;;;;;;;;;iBAM9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;iBAM/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAQlE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAc/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAKlE;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAe1F;AAID,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAK1E;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAelG;AAID,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAKpE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAO9D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,CAOtE;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAe9F"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/core/metadata.ts"],"names":[],"mappings":"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"}
@@ -2,24 +2,215 @@ import { z } from 'zod';
2
2
  import { readFileSync, existsSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import yaml from 'js-yaml';
5
+ /**
6
+ * License values accepted by template metadata.
7
+ *
8
+ * CC-BY-4.0 and CC0-1.0 templates may be redistributed as OpenAgreements
9
+ * content. CC-BY-ND-4.0 templates are vendored only when unmodified and must
10
+ * declare `allow_derivatives: false`.
11
+ */
5
12
  export const LicenseEnum = z.enum(['CC-BY-4.0', 'CC0-1.0', 'CC-BY-ND-4.0']);
6
- export const FieldDefinitionSchema = z.object({
13
+ /** Field kinds supported by template, external-template, and recipe metadata. */
14
+ const FieldTypeEnum = z.enum(['string', 'date', 'number', 'boolean', 'enum', 'array', 'multiselect']);
15
+ const MULTISELECT_OPTION_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
16
+ export const FieldDefinitionSchema = z.lazy(() => z.object({
7
17
  name: z.string(),
8
- type: z.enum(['string', 'date', 'number', 'boolean', 'enum', 'array']),
18
+ type: FieldTypeEnum,
9
19
  description: z.string(),
20
+ display_label: z.string().optional(),
10
21
  default: z.string().optional(),
11
22
  default_value_rationale: z.string().optional(),
12
23
  options: z.array(z.string()).optional(),
24
+ derive_booleans: z.boolean().optional(),
13
25
  section: z.string().optional(),
14
- }).refine((f) => f.type !== 'enum' || (f.options !== undefined && f.options.length > 0), { message: 'Fields with type "enum" must have a non-empty options array' }).refine((f) => {
15
- if (f.default === undefined)
16
- return true;
17
- if (f.type === 'number')
18
- return !isNaN(Number(f.default));
19
- if (f.type === 'boolean')
20
- return f.default === 'true' || f.default === 'false';
21
- return true;
22
- }, { message: 'Default value must be valid for the declared field type' });
26
+ items: z.array(FieldDefinitionSchema).nonempty().optional(),
27
+ statutory_compliance_representation: z.boolean().optional(),
28
+ authority_url: z.string().optional(),
29
+ confirm_note: z.string().optional(),
30
+ }).superRefine((field, ctx) => {
31
+ if ((field.type === 'enum' || field.type === 'multiselect') &&
32
+ (field.options === undefined || field.options.length === 0)) {
33
+ ctx.addIssue({
34
+ code: z.ZodIssueCode.custom,
35
+ path: ['options'],
36
+ message: `Fields with type "${field.type}" must have a non-empty options array`,
37
+ });
38
+ }
39
+ if (field.type === 'multiselect' && field.options) {
40
+ const seenOptions = new Set();
41
+ field.options.forEach((option, index) => {
42
+ if (!MULTISELECT_OPTION_RE.test(option)) {
43
+ ctx.addIssue({
44
+ code: z.ZodIssueCode.custom,
45
+ path: ['options', index],
46
+ message: 'Multiselect options must be valid identifiers matching /^[A-Za-z_][A-Za-z0-9_]*$/',
47
+ });
48
+ }
49
+ if (seenOptions.has(option)) {
50
+ ctx.addIssue({
51
+ code: z.ZodIssueCode.custom,
52
+ path: ['options', index],
53
+ message: `Duplicate multiselect option "${option}"`,
54
+ });
55
+ return;
56
+ }
57
+ seenOptions.add(option);
58
+ });
59
+ }
60
+ if (field.derive_booleans !== undefined && field.type !== 'multiselect') {
61
+ ctx.addIssue({
62
+ code: z.ZodIssueCode.custom,
63
+ path: ['derive_booleans'],
64
+ message: 'derive_booleans is only valid for fields with type "multiselect"',
65
+ });
66
+ }
67
+ if (field.items !== undefined && field.type !== 'array') {
68
+ ctx.addIssue({
69
+ code: z.ZodIssueCode.custom,
70
+ path: ['items'],
71
+ message: 'Only fields with type "array" may define nested items',
72
+ });
73
+ }
74
+ // `statutory_compliance_representation` is a NARROW opt-in category for the
75
+ // few boolean reps whose truth is a statutory precondition to
76
+ // enforceability. Enforce its shape so the renderer's `confirm=` mechanism
77
+ // and the get_template confirmation surface stay sound.
78
+ if (field.statutory_compliance_representation === true) {
79
+ if (field.type !== 'boolean') {
80
+ ctx.addIssue({
81
+ code: z.ZodIssueCode.custom,
82
+ path: ['statutory_compliance_representation'],
83
+ message: 'statutory_compliance_representation is only valid on a boolean field',
84
+ });
85
+ }
86
+ if (field.default !== 'false') {
87
+ ctx.addIssue({
88
+ code: z.ZodIssueCode.custom,
89
+ path: ['default'],
90
+ message: "statutory_compliance_representation fields must declare default: 'false' (a compliance fact is unconfirmed until a human confirms it)",
91
+ });
92
+ }
93
+ if (field.authority_url === undefined) {
94
+ ctx.addIssue({
95
+ code: z.ZodIssueCode.custom,
96
+ path: ['authority_url'],
97
+ message: 'statutory_compliance_representation fields must declare an authority_url (statute / practice-note link)',
98
+ });
99
+ }
100
+ else if (!/^https?:\/\/\S+$/.test(field.authority_url)) {
101
+ ctx.addIssue({
102
+ code: z.ZodIssueCode.custom,
103
+ path: ['authority_url'],
104
+ message: 'authority_url must be an http(s) URL',
105
+ });
106
+ }
107
+ // confirm_note is the SSOT for the rendered `[CONFIRM …]` bracket note, so
108
+ // it must be present and non-empty (after trimming) on these fields.
109
+ if (field.confirm_note === undefined || field.confirm_note.trim().length === 0) {
110
+ ctx.addIssue({
111
+ code: z.ZodIssueCode.custom,
112
+ path: ['confirm_note'],
113
+ message: 'statutory_compliance_representation fields must declare a non-empty confirm_note (the short reason shown in the rendered [CONFIRM …] bracket)',
114
+ });
115
+ }
116
+ }
117
+ else {
118
+ // Keep these properties scoped: they have no meaning outside the
119
+ // statutory_compliance_representation category.
120
+ if (field.authority_url !== undefined) {
121
+ ctx.addIssue({
122
+ code: z.ZodIssueCode.custom,
123
+ path: ['authority_url'],
124
+ message: 'authority_url is only valid on a statutory_compliance_representation field',
125
+ });
126
+ }
127
+ if (field.confirm_note !== undefined) {
128
+ ctx.addIssue({
129
+ code: z.ZodIssueCode.custom,
130
+ path: ['confirm_note'],
131
+ message: 'confirm_note is only valid on a statutory_compliance_representation field',
132
+ });
133
+ }
134
+ }
135
+ if (field.default !== undefined) {
136
+ if (field.type === 'number' && isNaN(Number(field.default))) {
137
+ ctx.addIssue({
138
+ code: z.ZodIssueCode.custom,
139
+ path: ['default'],
140
+ message: 'Default value must be valid for the declared field type',
141
+ });
142
+ }
143
+ if (field.type === 'boolean' && field.default !== 'true' && field.default !== 'false') {
144
+ ctx.addIssue({
145
+ code: z.ZodIssueCode.custom,
146
+ path: ['default'],
147
+ message: 'Default value must be valid for the declared field type',
148
+ });
149
+ }
150
+ if (field.type === 'multiselect') {
151
+ let parsedDefault;
152
+ try {
153
+ parsedDefault = JSON.parse(field.default);
154
+ }
155
+ catch {
156
+ ctx.addIssue({
157
+ code: z.ZodIssueCode.custom,
158
+ path: ['default'],
159
+ message: 'Default value must be a JSON-encoded array of strings for multiselect fields',
160
+ });
161
+ return;
162
+ }
163
+ if (!Array.isArray(parsedDefault)) {
164
+ ctx.addIssue({
165
+ code: z.ZodIssueCode.custom,
166
+ path: ['default'],
167
+ message: 'Default value must be a JSON-encoded array of strings for multiselect fields',
168
+ });
169
+ return;
170
+ }
171
+ const seenDefaults = new Set();
172
+ parsedDefault.forEach((entry) => {
173
+ if (typeof entry !== 'string') {
174
+ ctx.addIssue({
175
+ code: z.ZodIssueCode.custom,
176
+ path: ['default'],
177
+ message: 'Default value must be a JSON-encoded array of strings for multiselect fields',
178
+ });
179
+ return;
180
+ }
181
+ if (seenDefaults.has(entry)) {
182
+ ctx.addIssue({
183
+ code: z.ZodIssueCode.custom,
184
+ path: ['default'],
185
+ message: `Default value contains duplicate multiselect option "${entry}"`,
186
+ });
187
+ return;
188
+ }
189
+ seenDefaults.add(entry);
190
+ if (field.options && !field.options.includes(entry)) {
191
+ ctx.addIssue({
192
+ code: z.ZodIssueCode.custom,
193
+ path: ['default'],
194
+ message: `Default value references option "${entry}" which is not declared in options`,
195
+ });
196
+ }
197
+ });
198
+ }
199
+ }
200
+ }));
201
+ /** Closed set of provenance roles accepted in template `credits` entries. */
202
+ const TemplateCreditRoleEnum = z.enum([
203
+ 'drafter',
204
+ 'drafting_editor',
205
+ 'reviewer',
206
+ 'maintainer',
207
+ ]);
208
+ /** Optional template provenance entry surfaced by CLI discovery output. */
209
+ const TemplateCreditSchema = z.object({
210
+ name: z.string(),
211
+ role: TemplateCreditRoleEnum,
212
+ profile_url: z.string().url().optional(),
213
+ });
23
214
  function validatePriorityFields(fields, priorityFields, ctx) {
24
215
  const fieldNames = new Set(fields.map((field) => field.name));
25
216
  const seen = new Set();
@@ -42,8 +233,47 @@ function validatePriorityFields(fields, priorityFields, ctx) {
42
233
  }
43
234
  });
44
235
  }
236
+ function validateDerivedBooleanCollisions(fields, ctx) {
237
+ const topLevelFieldNames = new Set(fields.map((field) => field.name));
238
+ const derivedKeyOwners = new Map();
239
+ fields.forEach((field, fieldIndex) => {
240
+ if (field.type !== 'multiselect' || field.derive_booleans !== true || !field.options) {
241
+ return;
242
+ }
243
+ field.options.forEach((option, optionIndex) => {
244
+ const derivedKey = `${option}_enabled`;
245
+ if (topLevelFieldNames.has(derivedKey)) {
246
+ ctx.addIssue({
247
+ code: z.ZodIssueCode.custom,
248
+ path: ['fields', fieldIndex, 'options', optionIndex],
249
+ message: `Derived boolean key "${derivedKey}" from multiselect "${field.name}" collides with another top-level field name`,
250
+ });
251
+ }
252
+ const existingOwner = derivedKeyOwners.get(derivedKey);
253
+ if (existingOwner) {
254
+ ctx.addIssue({
255
+ code: z.ZodIssueCode.custom,
256
+ path: ['fields', fieldIndex, 'options', optionIndex],
257
+ message: `Derived boolean key "${derivedKey}" from multiselect "${field.name}" collides with derived key from multiselect "${existingOwner}"`,
258
+ });
259
+ return;
260
+ }
261
+ derivedKeyOwners.set(derivedKey, field.name);
262
+ });
263
+ });
264
+ }
265
+ /**
266
+ * Base metadata required for first-party and external templates.
267
+ *
268
+ * Template directories must provide `metadata.yaml` with a non-empty display
269
+ * name, source URL, version, license, derivative flag, attribution text, and
270
+ * field definitions. `category` is optional discovery grouping metadata.
271
+ * `priority_fields` reference required fill fields. `credits` records
272
+ * contributor provenance and defaults to an empty array; `derived_from` is
273
+ * expository provenance text and does not affect licensing.
274
+ */
45
275
  const TemplateMetadataBaseSchema = z.object({
46
- name: z.string(),
276
+ name: z.string().trim().min(1, 'name must be a non-empty string (used as display_name on list_templates)'),
47
277
  description: z.string().optional(),
48
278
  category: z.string().optional(),
49
279
  source_url: z.string().url(),
@@ -53,17 +283,29 @@ const TemplateMetadataBaseSchema = z.object({
53
283
  attribution_text: z.string(),
54
284
  fields: z.array(FieldDefinitionSchema),
55
285
  priority_fields: z.array(z.string()).default([]),
286
+ credits: z.array(TemplateCreditSchema).default([]),
287
+ derived_from: z.string().optional(),
56
288
  });
57
289
  export const TemplateMetadataSchema = TemplateMetadataBaseSchema.superRefine((meta, ctx) => {
58
290
  validatePriorityFields(meta.fields, meta.priority_fields, ctx);
291
+ validateDerivedBooleanCollisions(meta.fields, ctx);
59
292
  });
60
293
  // --- External template schemas ---
294
+ /**
295
+ * Metadata for vendored external templates.
296
+ *
297
+ * `source_sha256` records the checksum of the unmodified upstream document so
298
+ * validation can verify provenance for no-derivatives templates before local
299
+ * transient fills or CI license checks rely on that source.
300
+ */
61
301
  export const ExternalMetadataSchema = TemplateMetadataBaseSchema.extend({
62
302
  source_sha256: z.string(),
63
303
  }).superRefine((meta, ctx) => {
64
304
  validatePriorityFields(meta.fields, meta.priority_fields, ctx);
305
+ validateDerivedBooleanCollisions(meta.fields, ctx);
65
306
  });
66
307
  // --- Recipe schemas ---
308
+ /** Declarative cleaner configuration for recipe DOCX preprocessing. */
67
309
  export const CleanConfigSchema = z.object({
68
310
  removeFootnotes: z.boolean().default(false),
69
311
  removeBeforePattern: z.string().optional(),
@@ -95,6 +337,7 @@ export const GuidanceEntrySchema = z.object({
95
337
  text: z.string(),
96
338
  groupId: z.string().optional(),
97
339
  });
340
+ /** Machine-readable guidance artifact produced from recipe cleaning inputs. */
98
341
  export const GuidanceOutputSchema = z.object({
99
342
  extractedFrom: z.object({
100
343
  sourceHash: z.string(),
@@ -107,8 +350,19 @@ const MarketDataCitationSchema = z.object({
107
350
  label: z.string(),
108
351
  url: z.string().optional(),
109
352
  });
353
+ /**
354
+ * Metadata required for recipe-based templates.
355
+ *
356
+ * Recipes point at non-redistributable upstream source DOCX files and ship only
357
+ * transformation instructions. Required fields are `name`, `source_url`,
358
+ * `source_version`, and `license_note`; `fields` and `priority_fields` reuse
359
+ * the same field-definition semantics as template metadata and default to
360
+ * empty arrays. `optional` defaults to `false`. `source_sha256` verifies
361
+ * provenance for upstream sources when present. `market_data_citations`
362
+ * records optional external citation metadata used by recipe guidance.
363
+ */
110
364
  export const RecipeMetadataSchema = z.object({
111
- name: z.string(),
365
+ name: z.string().trim().min(1, 'name must be a non-empty string (used as display_name on list_templates)'),
112
366
  category: z.string().optional(),
113
367
  description: z.string().optional(),
114
368
  source_url: z.string().url(),
@@ -121,6 +375,7 @@ export const RecipeMetadataSchema = z.object({
121
375
  market_data_citations: z.array(MarketDataCitationSchema).optional(),
122
376
  }).superRefine((meta, ctx) => {
123
377
  validatePriorityFields(meta.fields, meta.priority_fields, ctx);
378
+ validateDerivedBooleanCollisions(meta.fields, ctx);
124
379
  });
125
380
  // --- Template loaders ---
126
381
  export function loadMetadata(templateDir) {