@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683

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 (643) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +117 -78
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +16 -9
  7. package/api/build/build.test.mjs +197 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +165 -49
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +6 -12
  18. package/api/component/_adapter.mjs +20 -10
  19. package/api/component/component.doc.mjs +13 -3
  20. package/api/component/component.mjs +91 -14
  21. package/api/component/component.test.mjs +38 -0
  22. package/api/component/component.type.d.mts +22 -11
  23. package/api/component/component.type.mjs +32 -24
  24. package/api/component/detail/blocks/blocks.d.mts +2 -1
  25. package/api/component/detail/blocks/blocks.mjs +4 -3
  26. package/api/component/list/list.d.mts +0 -5
  27. package/api/component/list/list.mjs +40 -11
  28. package/api/discover/_adapter.d.mts +114 -6
  29. package/api/discover/_adapter.mjs +372 -17
  30. package/api/discover/_adapter.test.mjs +215 -0
  31. package/api/discover/_catalog-view.d.mts +115 -0
  32. package/api/discover/_catalog-view.mjs +203 -0
  33. package/api/discover/_catalog-view.test.mjs +128 -0
  34. package/api/discover/detail/detail.d.mts +18 -6
  35. package/api/discover/detail/detail.mjs +67 -13
  36. package/api/discover/detail/detail.test.mjs +85 -0
  37. package/api/discover/detail/item/item.d.mts +26 -0
  38. package/api/discover/detail/item/item.mjs +78 -0
  39. package/api/discover/detail/item/item.test.mjs +73 -0
  40. package/api/discover/discover.d.mts +3 -9
  41. package/api/discover/discover.doc.mjs +62 -18
  42. package/api/discover/discover.mjs +220 -36
  43. package/api/discover/discover.test.mjs +11 -2
  44. package/api/discover/discover.type.d.mts +150 -11
  45. package/api/discover/discover.type.mjs +107 -17
  46. package/api/discover/list/list.d.mts +20 -6
  47. package/api/discover/list/list.mjs +45 -12
  48. package/api/discover/list/list.test.mjs +46 -0
  49. package/api/discover/search/search.d.mts +18 -16
  50. package/api/discover/search/search.mjs +102 -56
  51. package/api/discover/search/search.test.mjs +144 -10
  52. package/api/docs/_adapter.d.mts +272 -41
  53. package/api/docs/_adapter.mjs +985 -108
  54. package/api/docs/compiled-topics.test.mjs +78 -0
  55. package/api/docs/detail/detail.mjs +22 -63
  56. package/api/docs/detail/section/section.d.mts +1 -1
  57. package/api/docs/detail/section/section.mjs +54 -19
  58. package/api/docs/detail/section/section.test.mjs +50 -0
  59. package/api/docs/docs.d.mts +10 -3
  60. package/api/docs/docs.doc.mjs +55 -16
  61. package/api/docs/docs.mjs +53 -10
  62. package/api/docs/docs.test.mjs +164 -4
  63. package/api/docs/docs.type.d.mts +221 -5
  64. package/api/docs/docs.type.mjs +153 -11
  65. package/api/docs/index/index.d.mts +18 -0
  66. package/api/docs/index/index.mjs +40 -0
  67. package/api/docs/index/index.test.mjs +62 -0
  68. package/api/docs/integration-tree.test.mjs +555 -0
  69. package/api/docs/integrationDocs.test.mjs +114 -8
  70. package/api/docs/list/list.mjs +28 -12
  71. package/api/docs/node/node.d.mts +43 -0
  72. package/api/docs/node/node.mjs +192 -0
  73. package/api/docs/reference-blocks.test.mjs +406 -0
  74. package/api/doctor/doctor.d.mts +99 -1
  75. package/api/doctor/doctor.doc.mjs +1 -0
  76. package/api/doctor/doctor.mjs +548 -1
  77. package/api/doctor/doctor.test.mjs +610 -1
  78. package/api/gap-report/gap-report.doc.mjs +8 -4
  79. package/api/hook/_adapter.mjs +19 -5
  80. package/api/hook/hook.doc.mjs +1 -0
  81. package/api/hook/hook.type.d.mts +3 -3
  82. package/api/hook/hook.type.mjs +11 -11
  83. package/api/hook/list/list.d.mts +2 -2
  84. package/api/hook/list/list.mjs +69 -17
  85. package/api/index.d.mts +1 -1
  86. package/api/index.mjs +1 -0
  87. package/api/init/init.doc.mjs +6 -1
  88. package/api/init/init.test.mjs +41 -1
  89. package/api/init/remove/remove.mjs +1 -1
  90. package/api/init/run/run.mjs +20 -10
  91. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  92. package/api/integration/add-contribution.d.mts +2 -1
  93. package/api/integration/add-contribution.mjs +130 -15
  94. package/api/integration/add-contribution.test.mjs +258 -7
  95. package/api/integration/add-helpers.d.mts +5 -2
  96. package/api/integration/add-helpers.mjs +36 -9
  97. package/api/integration/add-theme.mjs +34 -64
  98. package/api/integration/add-theme.test.mjs +105 -21
  99. package/api/integration/authoring-checks.mjs +138 -28
  100. package/api/integration/authoring-checks.test.mjs +179 -7
  101. package/api/integration/authoring-checks.type.mjs +6 -1
  102. package/api/integration/integration-authoring.type.d.mts +3 -1
  103. package/api/integration/integration-authoring.type.mjs +2 -0
  104. package/api/integration/integration-block-exports.test.mjs +10 -6
  105. package/api/integration/integrationAdd.doc.mjs +14 -4
  106. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  107. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  108. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  109. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  110. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  111. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  112. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  113. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  114. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  115. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  116. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  117. package/api/integration/pack-check.mjs +83 -7
  118. package/api/integration/pack-check.test.mjs +387 -47
  119. package/api/integration/pack-check.type.d.mts +26 -2
  120. package/api/integration/pack-check.type.mjs +14 -1
  121. package/api/integration/summarizeIssues.doc.mjs +1 -0
  122. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  123. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  124. package/api/integration/validate-integration.mjs +52 -102
  125. package/api/integration/validate-integration.test.mjs +179 -26
  126. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  127. package/api/integration/validateIntegration.doc.mjs +3 -2
  128. package/api/json/assertResponse.doc.mjs +1 -0
  129. package/api/json/envelope-types.test.mjs +76 -0
  130. package/api/json/index.ts +2 -0
  131. package/api/json/isError.doc.mjs +1 -0
  132. package/api/json/parseResponse.doc.mjs +3 -2
  133. package/api/layout/_adapter.mjs +20 -5
  134. package/api/layout/expand/expand.mjs +7 -5
  135. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  136. package/api/layout/grammar/grammar.mjs +2 -1
  137. package/api/layout/layoutCheck.doc.mjs +1 -0
  138. package/api/layout/layoutExpand.doc.mjs +2 -1
  139. package/api/layout/layoutGrammar.doc.mjs +1 -0
  140. package/api/search/search-return-type.test.mjs +54 -0
  141. package/api/search/search.d.mts +62 -11
  142. package/api/search/search.doc.mjs +8 -2
  143. package/api/search/search.mjs +471 -83
  144. package/api/search/search.test.mjs +124 -1
  145. package/api/search/search.type.d.mts +15 -3
  146. package/api/search/search.type.mjs +5 -2
  147. package/api/swizzle/copy/copy.mjs +28 -11
  148. package/api/swizzle/swizzle.doc.mjs +2 -1
  149. package/api/swizzle/swizzle.type.d.mts +2 -2
  150. package/api/swizzle/swizzle.type.mjs +2 -2
  151. package/api/template/copy/copy.mjs +17 -23
  152. package/api/template/copy/copy.test.mjs +17 -0
  153. package/api/template/list/list.mjs +1 -0
  154. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  155. package/api/template/template-integration.test.mjs +1072 -3
  156. package/api/template/template-suffix.test.mjs +41 -21
  157. package/api/template/template.d.mts +1 -1
  158. package/api/template/template.doc.mjs +30 -8
  159. package/api/template/template.mjs +45 -8
  160. package/api/template/template.type.d.mts +12 -14
  161. package/api/template/template.type.mjs +15 -14
  162. package/api/theme/_adapter.d.mts +2 -3
  163. package/api/theme/_adapter.mjs +4 -5
  164. package/api/theme/add/add.binary.test.mjs +84 -0
  165. package/api/theme/add/add.mjs +31 -22
  166. package/api/theme/add/add.rollback.test.mjs +158 -0
  167. package/api/theme/add/add.staging.test.mjs +83 -0
  168. package/api/theme/add/add.test.mjs +14 -1
  169. package/api/theme/build/build.family.test.mjs +7 -12
  170. package/api/theme/build/build.mjs +140 -59
  171. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  172. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  173. package/api/theme/build/build.rollback.test.mjs +148 -0
  174. package/api/theme/build/build.test.mjs +127 -0
  175. package/api/theme/build/font-warning.mjs +3 -3
  176. package/api/theme/build/font-warning.test.mjs +5 -2
  177. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  178. package/api/theme/integration-themes.test.mjs +39 -28
  179. package/api/theme/list/list.test.mjs +19 -20
  180. package/api/theme/listThemes.doc.mjs +6 -5
  181. package/api/theme/palette/generate/generate.mjs +8 -3
  182. package/api/theme/palette/generate/generate.test.mjs +96 -0
  183. package/api/theme/palette/generate/generator.d.mts +10 -13
  184. package/api/theme/palette/generate/generator.mjs +15 -4
  185. package/api/theme/palette/generate/generator.test.mjs +10 -0
  186. package/api/theme/template/template.mjs +11 -2
  187. package/api/theme/template/template.test.mjs +20 -0
  188. package/api/theme/theme.type.d.mts +170 -11
  189. package/api/theme/theme.type.mjs +94 -27
  190. package/api/theme/themeAdd.doc.mjs +4 -3
  191. package/api/theme/themeBuild.doc.mjs +8 -4
  192. package/api/theme/themeList.doc.mjs +6 -3
  193. package/api/theme/themeListAvailable.doc.mjs +5 -3
  194. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  195. package/api/theme/themeTargets.doc.mjs +1 -0
  196. package/api/theme/themeTemplate.doc.mjs +6 -2
  197. package/api/upgrade/_adapter.d.mts +32 -5
  198. package/api/upgrade/_adapter.mjs +139 -22
  199. package/api/upgrade/list/list.mjs +2 -1
  200. package/api/upgrade/list/list.test.mjs +73 -0
  201. package/api/upgrade/project-context.test.mjs +272 -0
  202. package/api/upgrade/provider-agreement.test.mjs +152 -0
  203. package/api/upgrade/run/run.mjs +356 -59
  204. package/api/upgrade/status/status.mjs +2 -2
  205. package/api/upgrade/upgrade.doc.mjs +12 -5
  206. package/api/upgrade/upgrade.type.d.mts +43 -5
  207. package/api/upgrade/upgrade.type.mjs +27 -11
  208. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  209. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  210. package/assets/codemods/integration-discovery.mjs +48 -4
  211. package/assets/codemods/integration-discovery.test.mjs +73 -0
  212. package/assets/codemods/integration-runner.mjs +56 -4
  213. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  214. package/assets/codemods/registry.mjs +1 -0
  215. package/assets/codemods/run-codemod.mjs +177 -34
  216. package/assets/codemods/runner.mjs +350 -102
  217. package/assets/codemods/term-log.mjs +32 -8
  218. package/assets/codemods/term-log.test.mjs +19 -1
  219. package/assets/codemods/transform-prop.mjs +109 -0
  220. package/assets/codemods/transform-prop.test.mjs +95 -0
  221. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  222. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  223. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  224. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  225. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  226. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  227. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  228. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  229. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  230. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  231. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  232. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  233. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  234. package/assets/docs/README.md +9 -0
  235. package/assets/docs/authoring.doc.mjs +14 -0
  236. package/assets/docs/getting-started.doc.mjs +2 -2
  237. package/assets/docs/internationalization.doc.mjs +7 -5
  238. package/assets/docs/layout.doc.dense.mjs +2 -2
  239. package/assets/docs/layout.doc.mjs +1 -1
  240. package/assets/docs/principles.doc.mjs +6 -6
  241. package/assets/docs/styling-libraries.doc.mjs +4 -4
  242. package/assets/docs/styling.doc.mjs +4 -4
  243. package/assets/docs/theme.doc.mjs +5 -5
  244. package/assets/docs/tokens.doc.mjs +1 -1
  245. package/assets/docs/tree/api.doc.mjs +30 -0
  246. package/assets/docs/tree/cli.doc.mjs +23 -0
  247. package/assets/docs/tree/commands.doc.mjs +25 -0
  248. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  249. package/assets/docs/tree/integrations.test.mjs +62 -0
  250. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  251. package/assets/docs/working-with-ai.doc.mjs +4 -4
  252. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  253. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  254. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  255. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  256. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  268. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  270. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  271. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  272. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  273. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  274. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  275. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  277. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  278. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  279. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  280. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  281. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  282. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  283. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  284. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  285. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  286. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  287. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  292. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  293. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  294. package/authoring/_shared/contract.ts +22 -0
  295. package/authoring/codemod/codemod.doc.mjs +7 -2
  296. package/authoring/codemod/parse.d.mts +8 -8
  297. package/authoring/codemod/parse.mjs +8 -6
  298. package/authoring/codemod/type.ts +12 -0
  299. package/authoring/config/config.doc.mjs +10 -2
  300. package/authoring/config/debug-composition.test.mjs +92 -0
  301. package/authoring/config/parse.d.mts +15 -13
  302. package/authoring/config/parse.mjs +27 -8
  303. package/authoring/config/parse.test.mjs +8 -0
  304. package/authoring/config/type.ts +29 -6
  305. package/authoring/debug/debug.doc.d.mts +11 -0
  306. package/authoring/debug/debug.doc.mjs +182 -0
  307. package/authoring/debug/parse.d.mts +8 -8
  308. package/authoring/debug/parse.mjs +3 -3
  309. package/authoring/discover/discover.doc.d.mts +13 -0
  310. package/authoring/discover/discover.doc.mjs +138 -0
  311. package/authoring/discover/parse.d.mts +24 -0
  312. package/authoring/discover/parse.mjs +128 -0
  313. package/authoring/discover/parse.test.mjs +124 -0
  314. package/authoring/discover/type.ts +87 -0
  315. package/authoring/doctypes/_schema.d.mts +790 -23
  316. package/authoring/doctypes/_schema.mjs +543 -39
  317. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  318. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  319. package/authoring/doctypes/base/type.ts +41 -0
  320. package/authoring/doctypes/command/command.doc.mjs +4 -3
  321. package/authoring/doctypes/command/parse.d.mts +2 -2
  322. package/authoring/doctypes/command/parse.mjs +1 -1
  323. package/authoring/doctypes/command/type.ts +5 -4
  324. package/authoring/doctypes/component/component.doc.mjs +6 -3
  325. package/authoring/doctypes/component/parse.d.mts +2 -2
  326. package/authoring/doctypes/component/parse.mjs +1 -1
  327. package/authoring/doctypes/component/type.ts +6 -5
  328. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  329. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  330. package/authoring/doctypes/enum/parse.d.mts +2 -2
  331. package/authoring/doctypes/enum/parse.mjs +1 -1
  332. package/authoring/doctypes/enum/type.ts +4 -2
  333. package/authoring/doctypes/function/function.doc.mjs +7 -2
  334. package/authoring/doctypes/function/parse.d.mts +2 -2
  335. package/authoring/doctypes/function/parse.mjs +1 -1
  336. package/authoring/doctypes/function/type.ts +9 -4
  337. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  338. package/authoring/doctypes/hook/parse.d.mts +2 -2
  339. package/authoring/doctypes/hook/parse.mjs +1 -1
  340. package/authoring/doctypes/hook/type.ts +5 -4
  341. package/authoring/doctypes/legacy.d.mts +8 -6
  342. package/authoring/doctypes/legacy.mjs +5 -4
  343. package/authoring/doctypes/load-contract.test.mjs +233 -0
  344. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  345. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  346. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  347. package/authoring/doctypes/namespace/parse.mjs +25 -0
  348. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  349. package/authoring/doctypes/namespace/type.ts +74 -0
  350. package/authoring/doctypes/parse.d.mts +22 -18
  351. package/authoring/doctypes/parse.mjs +22 -11
  352. package/authoring/doctypes/parse.test.mjs +77 -3
  353. package/authoring/doctypes/reference/parse.d.mts +2 -2
  354. package/authoring/doctypes/reference/parse.mjs +8 -5
  355. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  356. package/authoring/doctypes/reference/type.ts +70 -7
  357. package/authoring/doctypes/schema/parse.d.mts +2 -2
  358. package/authoring/doctypes/schema/parse.mjs +1 -1
  359. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  360. package/authoring/doctypes/schema/type.ts +4 -4
  361. package/authoring/doctypes/template/parse.d.mts +94 -1
  362. package/authoring/doctypes/template/parse.mjs +40 -2
  363. package/authoring/doctypes/template/parse.test.mjs +26 -2
  364. package/authoring/doctypes/template/template.doc.mjs +13 -3
  365. package/authoring/doctypes/template/type.ts +13 -2
  366. package/authoring/doctypes/theme/parse.d.mts +35 -0
  367. package/authoring/doctypes/theme/parse.mjs +76 -0
  368. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  369. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  370. package/authoring/doctypes/theme/type.ts +42 -0
  371. package/authoring/doctypes/types.ts +12 -10
  372. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  373. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  374. package/authoring/gap-report/parse.d.mts +10 -10
  375. package/authoring/gap-report/parse.mjs +6 -6
  376. package/authoring/gap-report/type.ts +1 -1
  377. package/authoring/identity/identity.doc.d.mts +9 -0
  378. package/authoring/identity/identity.doc.mjs +61 -0
  379. package/authoring/identity/type.ts +132 -0
  380. package/authoring/index.d.mts +3 -0
  381. package/authoring/index.d.ts +62 -17
  382. package/authoring/index.mjs +4 -1
  383. package/authoring/integration/integration.doc.mjs +15 -8
  384. package/authoring/integration/parse.d.mts +2 -2
  385. package/authoring/integration/parse.mjs +1 -1
  386. package/authoring/integration/parse.test.mjs +10 -1
  387. package/authoring/integration/schema.d.mts +6 -4
  388. package/authoring/integration/schema.mjs +9 -3
  389. package/authoring/integration/type.ts +19 -8
  390. package/authoring/shadcn/receipt.d.mts +6 -6
  391. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  392. package/clients/cli/command-load-failure.test.mjs +83 -0
  393. package/clients/cli/commands/blog.doc.mjs +1 -1
  394. package/clients/cli/commands/blog.mjs +23 -8
  395. package/clients/cli/commands/blog.test.mjs +42 -1
  396. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  397. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  398. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  399. package/clients/cli/commands/build-theme.mjs +16 -50
  400. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  401. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  402. package/clients/cli/commands/build.doc.mjs +16 -8
  403. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  404. package/clients/cli/commands/build.mjs +137 -114
  405. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  406. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  407. package/clients/cli/commands/component/index.mjs +3 -8
  408. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  409. package/clients/cli/commands/component-package.test.mjs +46 -0
  410. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  411. package/clients/cli/commands/component.doc.mjs +1 -1
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  414. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  415. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  416. package/clients/cli/commands/discover.doc.mjs +55 -9
  417. package/clients/cli/commands/discover.mjs +393 -118
  418. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  419. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  420. package/clients/cli/commands/docs.doc.mjs +28 -6
  421. package/clients/cli/commands/docs.mjs +240 -26
  422. package/clients/cli/commands/docs.test.mjs +193 -1
  423. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  424. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  425. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  426. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  427. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  429. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  430. package/clients/cli/commands/doctor.doc.mjs +1 -1
  431. package/clients/cli/commands/doctor.mjs +59 -32
  432. package/clients/cli/commands/doctor.test.mjs +42 -0
  433. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  434. package/clients/cli/commands/gap-report.test.mjs +72 -0
  435. package/clients/cli/commands/hook/index.mjs +7 -17
  436. package/clients/cli/commands/hook.doc.mjs +1 -1
  437. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  438. package/clients/cli/commands/init.doc.mjs +20 -9
  439. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  440. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  441. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  442. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  443. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  444. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  445. package/clients/cli/commands/integration.doc.mjs +1 -1
  446. package/clients/cli/commands/integration.mjs +1 -0
  447. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  448. package/clients/cli/commands/json-contract.test.mjs +33 -0
  449. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  450. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  451. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  452. package/clients/cli/commands/layout.doc.mjs +3 -3
  453. package/clients/cli/commands/layout.mjs +21 -9
  454. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  455. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  456. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  457. package/clients/cli/commands/manifest.doc.mjs +1 -1
  458. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  459. package/clients/cli/commands/search.doc.mjs +7 -4
  460. package/clients/cli/commands/search.mjs +28 -9
  461. package/clients/cli/commands/search.test.mjs +75 -0
  462. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  463. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  464. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  465. package/clients/cli/commands/template.doc.mjs +52 -13
  466. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  467. package/clients/cli/commands/template.mjs +4 -91
  468. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  469. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  470. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  471. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  472. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  473. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  474. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  475. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  476. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  477. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  478. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  479. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  480. package/clients/cli/commands/theme.doc.mjs +1 -1
  481. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  482. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  483. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  484. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  485. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  486. package/clients/cli/commands/upgrade.mjs +29 -7
  487. package/clients/cli/formatters/index.mjs +164 -1
  488. package/clients/cli/formatters/index.test.mjs +97 -0
  489. package/clients/cli/index.mjs +21 -30
  490. package/clients/cli/latest-version-env.test.mjs +50 -0
  491. package/clients/cli/lib/cli-error.test.mjs +7 -0
  492. package/clients/cli/lib/component-format.mjs +9 -9
  493. package/clients/cli/lib/component-format.test.mjs +1 -1
  494. package/clients/cli/lib/define-command.mjs +32 -6
  495. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  496. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  497. package/clients/cli/lib/hook-format.mjs +19 -10
  498. package/clients/cli/lib/json-shim.mjs +38 -2
  499. package/clients/cli/lib/json-shim.test.mjs +83 -0
  500. package/clients/cli/lib/manifest.d.ts +2 -0
  501. package/clients/cli/lib/manifest.mjs +37 -2
  502. package/clients/cli/lib/manifest.test.mjs +17 -0
  503. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  504. package/foundation/agent-docs/agent-docs.mjs +82 -12
  505. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  506. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  507. package/foundation/config/integration-debug.test.mjs +28 -3
  508. package/foundation/config/project-themes.test.mjs +11 -19
  509. package/foundation/config/project.d.mts +20 -11
  510. package/foundation/config/project.mjs +263 -91
  511. package/foundation/config/project.test.mjs +270 -21
  512. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  513. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  514. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  515. package/foundation/discovery/authoring-surface.d.mts +74 -0
  516. package/foundation/discovery/authoring-surface.mjs +525 -0
  517. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  518. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  519. package/foundation/discovery/cli-self-docs.mjs +490 -0
  520. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  521. package/foundation/discovery/component-discovery.d.mts +39 -1
  522. package/foundation/discovery/component-discovery.mjs +50 -1
  523. package/foundation/discovery/component-loader.d.mts +35 -38
  524. package/foundation/discovery/component-loader.mjs +53 -222
  525. package/foundation/discovery/docs-discovery.d.mts +119 -11
  526. package/foundation/discovery/docs-discovery.mjs +423 -108
  527. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  528. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  529. package/foundation/discovery/docs-output-budget.mjs +50 -0
  530. package/foundation/discovery/docs-section-key.d.mts +116 -0
  531. package/foundation/discovery/docs-section-key.mjs +322 -0
  532. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  533. package/foundation/discovery/template-adapter.d.mts +113 -11
  534. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  535. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  536. package/foundation/discovery/template-adapter.mjs +774 -83
  537. package/foundation/discovery/template-adapter.test.mjs +57 -0
  538. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  539. package/foundation/discovery/template-conflict-release.mjs +40 -0
  540. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  541. package/foundation/discovery/theme-discovery.d.mts +67 -7
  542. package/foundation/discovery/theme-discovery.mjs +916 -186
  543. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  544. package/foundation/discovery/theming-targets.test.mjs +4 -0
  545. package/foundation/doc-compiler/bundle.d.mts +47 -0
  546. package/foundation/doc-compiler/bundle.mjs +278 -0
  547. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  548. package/foundation/doc-compiler/compile.d.mts +343 -0
  549. package/foundation/doc-compiler/compile.mjs +558 -0
  550. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  551. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  552. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  553. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  554. package/foundation/doc-compiler/import.d.mts +24 -0
  555. package/foundation/doc-compiler/import.mjs +59 -0
  556. package/foundation/doc-compiler/inputs.d.mts +102 -0
  557. package/foundation/doc-compiler/inputs.mjs +291 -0
  558. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  559. package/foundation/doc-compiler/ir.d.mts +22 -0
  560. package/foundation/doc-compiler/ir.mjs +471 -0
  561. package/foundation/doc-compiler/lenses.d.mts +36 -0
  562. package/foundation/doc-compiler/lenses.mjs +173 -0
  563. package/foundation/doc-compiler/links.d.mts +162 -0
  564. package/foundation/doc-compiler/links.mjs +294 -0
  565. package/foundation/doc-compiler/links.test.mjs +192 -0
  566. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  567. package/foundation/doc-compiler/overlays.d.mts +37 -0
  568. package/foundation/doc-compiler/overlays.mjs +206 -0
  569. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  570. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  571. package/foundation/doc-compiler/read.d.mts +127 -0
  572. package/foundation/doc-compiler/read.mjs +325 -0
  573. package/foundation/doc-compiler/read.test.mjs +313 -0
  574. package/foundation/doc-compiler/source.d.mts +33 -0
  575. package/foundation/doc-compiler/source.mjs +128 -0
  576. package/foundation/doc-compiler/tree.d.mts +288 -0
  577. package/foundation/doc-compiler/tree.mjs +876 -0
  578. package/foundation/doc-compiler/tree.test.mjs +598 -0
  579. package/foundation/fs/file-protection.d.mts +33 -0
  580. package/foundation/fs/file-protection.mjs +825 -0
  581. package/foundation/fs/file-protection.test.mjs +250 -0
  582. package/foundation/fs/module-loader.d.mts +1 -0
  583. package/foundation/fs/module-loader.mjs +50 -1
  584. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  585. package/foundation/fs/path-safety.d.mts +3 -2
  586. package/foundation/fs/path-safety.mjs +49 -19
  587. package/foundation/fs/path-safety.test.mjs +50 -0
  588. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  589. package/foundation/identity/provider-identity.d.mts +90 -0
  590. package/foundation/identity/provider-identity.mjs +320 -0
  591. package/foundation/identity/provider-identity.test.mjs +254 -0
  592. package/foundation/identity/providers.d.mts +7 -0
  593. package/foundation/identity/providers.mjs +16 -0
  594. package/foundation/integrations/autolink.d.mts +58 -1
  595. package/foundation/integrations/autolink.mjs +143 -45
  596. package/foundation/integrations/autolink.test.mjs +1 -1
  597. package/foundation/integrations/cli-requirement.d.mts +45 -0
  598. package/foundation/integrations/cli-requirement.mjs +154 -0
  599. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  600. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  601. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  602. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  603. package/foundation/integrations/contribution-inventory.mjs +27 -24
  604. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  605. package/foundation/integrations/integration-warnings.d.mts +9 -2
  606. package/foundation/integrations/integration-warnings.mjs +52 -21
  607. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  608. package/foundation/integrations/integrations.d.mts +63 -3
  609. package/foundation/integrations/integrations.mjs +122 -9
  610. package/foundation/integrations/integrations.test.mjs +415 -1
  611. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  612. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  613. package/foundation/integrations/provider-resolution.d.mts +152 -0
  614. package/foundation/integrations/provider-resolution.mjs +576 -0
  615. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  616. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  617. package/foundation/integrations/theme-descriptor.mjs +44 -0
  618. package/foundation/integrations/validate-contributions.d.mts +2 -0
  619. package/foundation/integrations/validate-contributions.mjs +131 -29
  620. package/foundation/response/base.d.ts +8 -4
  621. package/foundation/response/error-codes.d.mts +3 -1
  622. package/foundation/response/error-codes.d.ts +2 -0
  623. package/foundation/response/error-codes.doc.mjs +13 -4
  624. package/foundation/response/error-codes.mjs +8 -2
  625. package/foundation/response/error-codes.test.mjs +137 -10
  626. package/foundation/response/json-contract.test.mjs +57 -17
  627. package/foundation/response/json.d.mts +4 -2
  628. package/foundation/response/json.mjs +8 -10
  629. package/foundation/response/response-types.doc.d.mts +5 -1
  630. package/foundation/response/response-types.doc.mjs +41 -21
  631. package/foundation/response/response-types.doc.test.mjs +158 -0
  632. package/foundation/response/response.doc.mjs +1 -1
  633. package/foundation/text/string-utils.d.mts +8 -0
  634. package/foundation/text/string-utils.mjs +40 -10
  635. package/foundation/xle/expand.d.mts +2 -0
  636. package/foundation/xle/expand.mjs +4 -3
  637. package/foundation/xle/expand.test.mjs +54 -0
  638. package/foundation/xle/xle.test.mjs +13 -0
  639. package/package.json +10 -11
  640. package/assets/templates/themes/manifest.json +0 -95
  641. package/clients/cli/lib/update-check.mjs +0 -83
  642. package/clients/cli/lib/update-check.test.mjs +0 -137
  643. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -3,16 +3,259 @@
3
3
  /**
4
4
  * @file Sealed doc load-boundary schemas (doctypes-internal).
5
5
  *
6
- * These zod schemas are the implementation detail behind the doctypes parsers.
7
- * They are NOT part of the public authoring surface: nothing outside
8
- * `authoring/doctypes/**` imports them, and they never appear in a public type.
9
- * They accept BOTH the stamped formats (`type: 'component' | 'function' |
10
- * 'generic'`) and the legacy loose `export const docs = {...}` shape, so the
11
- * ~600+ existing docs keep validating unchanged.
6
+ * Existing doctypes keep their historical top-level passthrough policy so
7
+ * already-published docs continue to load. NamespaceDoc and every semantic
8
+ * content block are strict: a misspelled field cannot reach a renderer as
9
+ * missing data.
12
10
  */
13
11
 
14
12
  import {z} from 'zod';
15
13
 
14
+ /** @typedef {import('./base/type.js').AuthoredDocGraphFields} AuthoredDocGraphFieldsType */
15
+ /** @typedef {import('./base/type.js').AuthoredDocKind} AuthoredDocKind */
16
+ /** @typedef {import('./namespace/type.js').NamespaceDoc} NamespaceDoc */
17
+ /** @typedef {import('./reference/type.js').ReferenceContentBlock} ReferenceContentBlock */
18
+ /** @typedef {import('./reference/type.js').GraphContentBlock} GraphContentBlock */
19
+ /** @typedef {import('./reference/type.js').ReferenceSection} ReferenceSection */
20
+ /** @typedef {import('./reference/type.js').ReferenceDoc} ReferenceDoc */
21
+ /** @typedef {import('./component/type.js').SingleComponentDoc} SingleComponentDoc */
22
+ /** @typedef {import('./base/type.js').ComponentPropDoc} ComponentPropDoc */
23
+ /** @typedef {import('./hook/type.js').HookDoc} HookDoc */
24
+ /** @typedef {import('./function/type.js').FunctionDoc} FunctionDoc */
25
+ /** @typedef {import('./schema/type.js').SchemaDoc} SchemaDoc */
26
+ /** @typedef {import('./command/type.js').CommandDoc} CommandDoc */
27
+ /** @typedef {import('./enum/type.js').EnumDoc} EnumDoc */
28
+
29
+ const nonEmptyString = z.string().min(1);
30
+
31
+ /** Every authored doc-kind discriminant accepted by parseDoc. */
32
+ export const AuthoredDocKindSchema = z.enum([
33
+ 'component',
34
+ 'function',
35
+ 'generic',
36
+ 'page',
37
+ 'block',
38
+ 'schema',
39
+ 'command',
40
+ 'enum',
41
+ 'namespace',
42
+ ]);
43
+
44
+ /**
45
+ * @typedef {import('../_shared/contract.js').Expect<
46
+ * import('../_shared/contract.js').Equal<z.infer<typeof AuthoredDocKindSchema>, AuthoredDocKind>
47
+ * >} _AuthoredDocKindDriftLock
48
+ */
49
+
50
+ /** Shared optional graph fields for every authored doc kind. */
51
+ export const AuthoredDocGraphFields = {
52
+ placement: z
53
+ .object({
54
+ parent: nonEmptyString,
55
+ slot: nonEmptyString.optional(),
56
+ order: z.number().int().safe().optional(),
57
+ })
58
+ .strict()
59
+ .optional(),
60
+ aliases: z.array(nonEmptyString).optional(),
61
+ audience: z.enum(['public', 'internal']).optional(),
62
+ };
63
+
64
+ const _AuthoredDocGraphSchema = z.object(AuthoredDocGraphFields).strict();
65
+
66
+ /**
67
+ * @typedef {import('../_shared/contract.js').Expect<
68
+ * import('../_shared/contract.js').MutuallyAssignable<
69
+ * z.infer<typeof _AuthoredDocGraphSchema>,
70
+ * AuthoredDocGraphFieldsType
71
+ * >
72
+ * >} _AuthoredDocGraphDriftLock
73
+ */
74
+
75
+ const ProseBlockSchema = z
76
+ .object({type: z.literal('prose'), text: nonEmptyString})
77
+ .strict();
78
+ const HeadingBlockSchema = z
79
+ .object({
80
+ type: z.literal('heading'),
81
+ level: z.union([z.literal(3), z.literal(4), z.literal(5), z.literal(6)]),
82
+ text: nonEmptyString,
83
+ })
84
+ .strict();
85
+ const CodeBlockSchema = z
86
+ .object({
87
+ type: z.literal('code'),
88
+ lang: nonEmptyString,
89
+ code: z.string(),
90
+ label: nonEmptyString.optional(),
91
+ })
92
+ .strict();
93
+ const TableBlockSchema = z
94
+ .object({
95
+ type: z.literal('table'),
96
+ headers: z.array(z.string()).min(1),
97
+ rows: z.array(z.array(z.string())),
98
+ })
99
+ .strict()
100
+ .superRefine((table, context) => {
101
+ table.rows.forEach((row, index) => {
102
+ if (row.length !== table.headers.length) {
103
+ context.addIssue({
104
+ code: 'custom',
105
+ path: ['rows', index],
106
+ message: `expected ${table.headers.length} cells`,
107
+ });
108
+ }
109
+ });
110
+ });
111
+ const ListBlockSchema = z
112
+ .object({
113
+ type: z.literal('list'),
114
+ style: z.enum(['ordered', 'unordered', 'do', 'dont']),
115
+ items: z.array(nonEmptyString).min(1),
116
+ })
117
+ .strict();
118
+ const TokenReferenceBlockSchema = z
119
+ .object({
120
+ type: z.literal('token-ref'),
121
+ topic: nonEmptyString,
122
+ section: nonEmptyString,
123
+ })
124
+ .strict();
125
+ const WorkflowBlockSchema = z
126
+ .object({
127
+ type: z.literal('workflow'),
128
+ title: nonEmptyString.optional(),
129
+ steps: z
130
+ .array(
131
+ z
132
+ .object({
133
+ title: nonEmptyString,
134
+ description: nonEmptyString.optional(),
135
+ references: z.array(nonEmptyString).min(1).optional(),
136
+ })
137
+ .strict(),
138
+ )
139
+ .min(1),
140
+ })
141
+ .strict();
142
+ const CollectionBlockSchema = z
143
+ .object({
144
+ type: z.literal('collection'),
145
+ title: nonEmptyString.optional(),
146
+ source: z.object({slot: nonEmptyString}).strict(),
147
+ presentation: z.enum(['list', 'cards', 'compact']).optional(),
148
+ whenEmpty: z.enum(['show', 'omit']).optional(),
149
+ })
150
+ .strict();
151
+ const ReferenceBlockSchema = z
152
+ .object({
153
+ type: z.literal('reference'),
154
+ target: nonEmptyString,
155
+ projection: z
156
+ .object({
157
+ fields: z.array(nonEmptyString).min(1).optional(),
158
+ sections: z.array(nonEmptyString).min(1).optional(),
159
+ })
160
+ .strict()
161
+ .optional(),
162
+ presentation: z.enum(['summary', 'compact', 'full']).optional(),
163
+ })
164
+ .strict();
165
+
166
+ /** Runtime schema for the stable content-block union published in 0.6.x. */
167
+ export const ReferenceContentBlockSchema = z.discriminatedUnion('type', [
168
+ ProseBlockSchema,
169
+ HeadingBlockSchema,
170
+ CodeBlockSchema,
171
+ TableBlockSchema,
172
+ ListBlockSchema,
173
+ TokenReferenceBlockSchema,
174
+ ]);
175
+
176
+ /** Runtime schema for graph-only blocks used by NamespaceDoc. */
177
+ export const GraphContentBlockSchema = z.discriminatedUnion('type', [
178
+ WorkflowBlockSchema,
179
+ CollectionBlockSchema,
180
+ ReferenceBlockSchema,
181
+ ]);
182
+
183
+ /**
184
+ * A topic section's blocks: the stable union, plus a reference block, which a
185
+ * read inlines as the doc it includes.
186
+ */
187
+ export const SectionContentBlockSchema = z.discriminatedUnion('type', [
188
+ ProseBlockSchema,
189
+ HeadingBlockSchema,
190
+ CodeBlockSchema,
191
+ TableBlockSchema,
192
+ ListBlockSchema,
193
+ TokenReferenceBlockSchema,
194
+ ReferenceBlockSchema,
195
+ ]);
196
+
197
+ /** Namespace content accepts both stable reference blocks and graph-only blocks. */
198
+ export const NamespaceContentBlockSchema = z.discriminatedUnion('type', [
199
+ ProseBlockSchema,
200
+ HeadingBlockSchema,
201
+ CodeBlockSchema,
202
+ TableBlockSchema,
203
+ ListBlockSchema,
204
+ TokenReferenceBlockSchema,
205
+ WorkflowBlockSchema,
206
+ CollectionBlockSchema,
207
+ ReferenceBlockSchema,
208
+ ]);
209
+
210
+ /**
211
+ * @typedef {import('../_shared/contract.js').Expect<
212
+ * import('../_shared/contract.js').Equal<
213
+ * z.infer<typeof ReferenceContentBlockSchema>,
214
+ * ReferenceContentBlock
215
+ * >
216
+ * >} _ReferenceContentBlockDriftLock
217
+ */
218
+
219
+ /**
220
+ * @typedef {import('../_shared/contract.js').Expect<
221
+ * import('../_shared/contract.js').Equal<
222
+ * z.infer<typeof GraphContentBlockSchema>,
223
+ * GraphContentBlock
224
+ * >
225
+ * >} _GraphContentBlockDriftLock
226
+ */
227
+
228
+ /**
229
+ * @typedef {import('../_shared/contract.js').Expect<
230
+ * import('../_shared/contract.js').Equal<
231
+ * z.infer<typeof SectionContentBlockSchema>,
232
+ * ReferenceSection['content'][number]
233
+ * >
234
+ * >} _SectionContentBlockDriftLock
235
+ */
236
+
237
+ const ReferenceSectionSchema = z
238
+ .object({
239
+ id: nonEmptyString.optional(),
240
+ title: nonEmptyString,
241
+ category: z.string().optional(),
242
+ content: z.array(SectionContentBlockSchema),
243
+ previewType: z
244
+ .enum([
245
+ 'swatch',
246
+ 'shadow-box',
247
+ 'radius-box',
248
+ 'spacing-bar',
249
+ 'size-bar',
250
+ 'border-line',
251
+ 'duration-bar',
252
+ 'easing-curve',
253
+ 'font-sample',
254
+ ])
255
+ .optional(),
256
+ })
257
+ .strict();
258
+
16
259
  const PropSchema = z
17
260
  .object({
18
261
  name: z.string().min(1, 'prop name is required'),
@@ -42,6 +285,7 @@ const ReturnSchema = z
42
285
  .passthrough();
43
286
 
44
287
  const BaseDocFields = {
288
+ ...AuthoredDocGraphFields,
45
289
  name: z.string().min(1, 'name is required'),
46
290
  displayName: z.string().optional(),
47
291
  description: z.string().optional(),
@@ -56,21 +300,69 @@ const BaseDocFields = {
56
300
  isHiddenFromOverview: z.boolean().optional(),
57
301
  };
58
302
 
59
- /** New-format stamped component doc (`type: 'component'`). */
60
- export const ComponentDocKindSchema = z
303
+ const ComponentBaseSchema = z
61
304
  .object({
62
305
  ...BaseDocFields,
63
306
  type: z.literal('component'),
64
- props: z.array(PropSchema),
65
307
  theming: z.unknown().optional(),
66
308
  playground: z.unknown().optional(),
67
309
  examples: z.array(z.unknown()).optional(),
68
310
  })
69
311
  .passthrough();
70
312
 
71
- /** Return entry for the generalized function doc: `name` is optional so CLI/API
72
- * functions can document their `{type, data}` envelope entries (which have no
73
- * field name), while hooks keep listing named return fields. */
313
+ /**
314
+ * One entry in a group doc's `components`: a full ComponentEntry or a
315
+ * name-only ComponentRef. Readers look every entry up by `name`, so that much
316
+ * is checked here; the rest passes through, as on an unstamped doc.
317
+ */
318
+ const ComponentGroupEntrySchema = z
319
+ .object({name: z.string().min(1, 'component name is required')})
320
+ .passthrough();
321
+
322
+ /**
323
+ * New-format stamped component doc (`type: 'component'`): one component's
324
+ * `props`, or the `components` a group doc documents together. These are the
325
+ * shapes the published ComponentDoc type allows, and the ones an unstamped doc
326
+ * may already take.
327
+ */
328
+ export const ComponentDocKindSchema = ComponentBaseSchema.extend({
329
+ props: z.array(PropSchema).optional(),
330
+ components: z.array(ComponentGroupEntrySchema).optional(),
331
+ }).superRefine((doc, context) => {
332
+ if (doc.props == null && doc.components == null) {
333
+ context.addIssue({
334
+ code: 'custom',
335
+ path: ['props'],
336
+ message:
337
+ 'expected the props array, or `components` for a doc that groups several components',
338
+ });
339
+ }
340
+ });
341
+
342
+ /**
343
+ * A stamped component doc as it loads. The loader accepts what the unstamped
344
+ * format always accepted, so stamping an existing doc never breaks it:
345
+ * `displayName` may be missing, `category` is any string, `usage`, `theming`,
346
+ * `playground` and `examples` pass through unchecked, and a doc has `props`,
347
+ * `components`, or both; each `components` entry needs only a `name`. Every
348
+ * other field matches the published type.
349
+ *
350
+ * @typedef {Omit<SingleComponentDoc,
351
+ * 'type' | 'displayName' | 'category' | 'usage' | 'theming' | 'examples' | 'playground' | 'props'>
352
+ * & {type: 'component', displayName?: string, category?: string, usage?: unknown,
353
+ * theming?: unknown, examples?: unknown[], playground?: unknown,
354
+ * props?: ComponentPropDoc[], components?: Array<{name: string}>}} LoadedComponentDoc
355
+ */
356
+ /**
357
+ * @typedef {import('../_shared/contract.js').Expect<
358
+ * import('../_shared/contract.js').MutuallyAssignable<
359
+ * import('../_shared/contract.js').NamedFields<z.infer<typeof ComponentDocKindSchema>>,
360
+ * import('../_shared/contract.js').NamedFields<LoadedComponentDoc>
361
+ * >
362
+ * >} _ComponentDocDriftLock
363
+ */
364
+
365
+ /** Return entry for generalized function docs. */
74
366
  const FunctionReturnSchema = z
75
367
  .object({
76
368
  name: z.string().min(1).optional(),
@@ -79,8 +371,7 @@ const FunctionReturnSchema = z
79
371
  })
80
372
  .passthrough();
81
373
 
82
- /** New-format stamped function doc (`type: 'function'`) — hooks and CLI/API
83
- * functions alike (the discriminant and schema are shared). */
374
+ /** New-format stamped function doc (`type: 'function'`). */
84
375
  export const FunctionDocKindSchema = z
85
376
  .object({
86
377
  ...BaseDocFields,
@@ -90,30 +381,95 @@ export const FunctionDocKindSchema = z
90
381
  })
91
382
  .passthrough();
92
383
 
93
- /** New-format stamped generic reference/topic doc (`type: 'generic'`). */
384
+ /**
385
+ * A stamped function doc as it loads: as with components, `displayName` may be
386
+ * missing and `usage` passes through unchecked.
387
+ *
388
+ * @typedef {Omit<FunctionDoc, 'type' | 'displayName' | 'usage'>
389
+ * & {type: 'function', displayName?: string, usage?: unknown}} LoadedFunctionDoc
390
+ */
391
+ /**
392
+ * @typedef {import('../_shared/contract.js').Expect<
393
+ * import('../_shared/contract.js').MutuallyAssignable<
394
+ * import('../_shared/contract.js').NamedFields<z.infer<typeof FunctionDocKindSchema>>,
395
+ * import('../_shared/contract.js').NamedFields<LoadedFunctionDoc>
396
+ * >
397
+ * >} _FunctionDocDriftLock
398
+ */
399
+
400
+ /**
401
+ * Every HookDoc is a FunctionDoc, so the one function schema covers both.
402
+ *
403
+ * @typedef {import('../_shared/contract.js').Expect<[HookDoc] extends [FunctionDoc] ? true : false>} _HookDocIsFunctionDocLock
404
+ */
405
+
406
+ /**
407
+ * Stamped generic reference/topic doc (`type: 'generic'`). `title` and
408
+ * `sections` stay optional at this parser boundary for docs produced by the
409
+ * shipped v0.3.0 factory-removal codemod. When present, all rich fields and
410
+ * semantic blocks are validated.
411
+ */
94
412
  export const GenericDocKindSchema = z
95
413
  .object({
96
414
  ...BaseDocFields,
97
415
  type: z.literal('generic'),
98
- // Declared rather than left to the passthrough: these two are read by
99
- // docs discovery to resolve one topic against another, so a non-string
100
- // should fail at the load boundary, not halfway through resolution.
101
- replaces: z.string().optional(),
102
- extends: z.string().optional(),
416
+ title: nonEmptyString.optional(),
417
+ sections: z.array(ReferenceSectionSchema).min(1).optional(),
418
+ replaces: nonEmptyString.optional(),
419
+ extends: nonEmptyString.optional(),
420
+ tokenCategory: z.string().optional(),
103
421
  })
104
- .passthrough();
422
+ .passthrough()
423
+ .superRefine((doc, context) => {
424
+ if (doc.replaces != null && doc.extends != null) {
425
+ context.addIssue({
426
+ code: 'custom',
427
+ path: ['extends'],
428
+ message: 'declares both `replaces` and `extends`; choose one',
429
+ });
430
+ }
431
+ const sectionIds = new Set();
432
+ doc.sections?.forEach((section, index) => {
433
+ if (section.id == null) return;
434
+ if (sectionIds.has(section.id)) {
435
+ context.addIssue({
436
+ code: 'custom',
437
+ path: ['sections', index, 'id'],
438
+ message: `duplicate section id "${section.id}"`,
439
+ });
440
+ }
441
+ sectionIds.add(section.id);
442
+ });
443
+ });
105
444
 
106
- /** Recursive field descriptor for a SchemaDoc (objects nest via `fields`). The
107
- * explicit cast breaks the self-referential type inference (TS7022) that the
108
- * authoring-contract `checkJs` pass would otherwise flag. */
445
+ /**
446
+ * A stamped generic doc as the load check accepts it. `title`, `description`
447
+ * and `sections` may be missing, as in docs the v0.3.0 factory-removal codemod
448
+ * produced; `parseReference` then fills them (title from `displayName` or
449
+ * `name`, an empty description, no sections), so its result is a full
450
+ * ReferenceDoc. Only a doc with a description and sections is a usable topic
451
+ * (see `problemsInTopic`).
452
+ *
453
+ * @typedef {Omit<ReferenceDoc, 'type' | 'title' | 'description' | 'sections'>
454
+ * & {type: 'generic'}
455
+ * & Partial<Pick<ReferenceDoc, 'title' | 'description' | 'sections'>>} LoadedReferenceDoc
456
+ */
457
+ /**
458
+ * @typedef {import('../_shared/contract.js').Expect<
459
+ * import('../_shared/contract.js').MutuallyAssignable<
460
+ * import('../_shared/contract.js').NamedFields<z.infer<typeof GenericDocKindSchema>>,
461
+ * import('../_shared/contract.js').NamedFields<LoadedReferenceDoc>
462
+ * >
463
+ * >} _ReferenceDocDriftLock
464
+ */
465
+
466
+ /** Recursive field descriptor for a SchemaDoc. */
109
467
  const SchemaFieldSchema =
110
- /** @type {import('zod').ZodType<import('./schema/type').SchemaFieldDoc>} */ (
468
+ /** @type {import('zod').ZodType<import('./schema/type.js').SchemaFieldDoc>} */ (
111
469
  z.lazy(() =>
112
470
  z
113
471
  .object({
114
472
  name: z.string().min(1, 'field name is required'),
115
- // `{error}` covers a missing (undefined) type; `.min(1)` covers an
116
- // empty string — both give the same author-friendly message.
117
473
  type: z
118
474
  .string({error: 'field type is required'})
119
475
  .min(1, 'field type is required'),
@@ -128,15 +484,15 @@ const SchemaFieldSchema =
128
484
  )
129
485
  );
130
486
 
131
- /** New stamped schema doc (`type: 'schema'`) — documents an authored object. */
487
+ /** New stamped schema doc (`type: 'schema'`). */
132
488
  export const SchemaDocKindSchema = z
133
489
  .object({
490
+ ...AuthoredDocGraphFields,
134
491
  type: z.literal('schema'),
135
492
  name: z.string().min(1, 'name is required'),
136
493
  displayName: z.string().min(1, 'displayName is required'),
137
494
  description: z.string(),
138
495
  namespace: z.string().optional(),
139
- aliases: z.array(z.string()).optional(),
140
496
  appliesTo: z.string().optional(),
141
497
  fields: z.array(SchemaFieldSchema),
142
498
  examples: z
@@ -146,21 +502,29 @@ export const SchemaDocKindSchema = z
146
502
  .passthrough(),
147
503
  )
148
504
  .optional(),
149
- notes: z.array(z.unknown()).optional(),
505
+ notes: z.array(ReferenceContentBlockSchema).optional(),
150
506
  })
151
507
  .passthrough();
152
508
 
153
- /** New stamped command doc (`type: 'command'`) — a function's terminal binding;
154
- * references a FunctionDoc via `fn`. */
509
+ /**
510
+ * @typedef {import('../_shared/contract.js').Expect<
511
+ * import('../_shared/contract.js').MutuallyAssignable<
512
+ * import('../_shared/contract.js').NamedFields<z.infer<typeof SchemaDocKindSchema>>,
513
+ * import('../_shared/contract.js').NamedFields<SchemaDoc & {type: 'schema'}>
514
+ * >
515
+ * >} _SchemaDocDriftLock
516
+ */
517
+
518
+ /** New stamped command doc (`type: 'command'`). */
155
519
  export const CommandDocKindSchema = z
156
520
  .object({
521
+ ...AuthoredDocGraphFields,
157
522
  type: z.literal('command'),
158
523
  name: z.string().min(1, 'name is required'),
159
524
  displayName: z.string().min(1, 'displayName is required'),
160
525
  summary: z.string(),
161
526
  description: z.string().optional(),
162
527
  namespace: z.string().optional(),
163
- aliases: z.array(z.string()).optional(),
164
528
  fn: z.string().optional(),
165
529
  args: z
166
530
  .array(
@@ -207,20 +571,28 @@ export const CommandDocKindSchema = z
207
571
  .array(z.object({code: z.number(), when: z.string()}).passthrough())
208
572
  .optional(),
209
573
  related: z.array(z.string()).optional(),
210
- notes: z.array(z.unknown()).optional(),
574
+ notes: z.array(ReferenceContentBlockSchema).optional(),
211
575
  })
212
576
  .passthrough();
213
577
 
214
- /** New stamped enum doc (`type: 'enum'`) — a closed vocabulary (error codes,
215
- * response-type discriminants). */
578
+ /**
579
+ * @typedef {import('../_shared/contract.js').Expect<
580
+ * import('../_shared/contract.js').MutuallyAssignable<
581
+ * import('../_shared/contract.js').NamedFields<z.infer<typeof CommandDocKindSchema>>,
582
+ * import('../_shared/contract.js').NamedFields<CommandDoc & {type: 'command'}>
583
+ * >
584
+ * >} _CommandDocDriftLock
585
+ */
586
+
587
+ /** New stamped enum doc (`type: 'enum'`). */
216
588
  export const EnumDocKindSchema = z
217
589
  .object({
590
+ ...AuthoredDocGraphFields,
218
591
  type: z.literal('enum'),
219
592
  name: z.string().min(1, 'name is required'),
220
593
  displayName: z.string().min(1, 'displayName is required'),
221
594
  description: z.string(),
222
595
  namespace: z.string().optional(),
223
- aliases: z.array(z.string()).optional(),
224
596
  members: z.array(
225
597
  z
226
598
  .object({
@@ -233,8 +605,108 @@ export const EnumDocKindSchema = z
233
605
  })
234
606
  .passthrough();
235
607
 
236
- // ── Legacy loose format (unchanged, kept for back-compat) ─────────────
608
+ /**
609
+ * @typedef {import('../_shared/contract.js').Expect<
610
+ * import('../_shared/contract.js').MutuallyAssignable<
611
+ * import('../_shared/contract.js').NamedFields<z.infer<typeof EnumDocKindSchema>>,
612
+ * import('../_shared/contract.js').NamedFields<EnumDoc & {type: 'enum'}>
613
+ * >
614
+ * >} _EnumDocDriftLock
615
+ */
616
+
617
+ const NamespaceSlotSchema = z
618
+ .object({
619
+ title: nonEmptyString,
620
+ accepts: z
621
+ .object({
622
+ kinds: z.array(AuthoredDocKindSchema).min(1),
623
+ providers: z.enum(['same', 'configured']).optional(),
624
+ })
625
+ .strict(),
626
+ })
627
+ .strict();
628
+
629
+ /** The one new authored doctype: a hierarchy and layout owner. */
630
+ export const NamespaceDocKindSchema = z
631
+ .object({
632
+ ...AuthoredDocGraphFields,
633
+ type: z.literal('namespace'),
634
+ name: nonEmptyString,
635
+ title: nonEmptyString,
636
+ summary: nonEmptyString,
637
+ keywords: z.array(nonEmptyString).optional(),
638
+ slots: z
639
+ .record(nonEmptyString, NamespaceSlotSchema)
640
+ .refine(slots => Object.keys(slots).length > 0, {
641
+ message: 'at least one slot is required',
642
+ }),
643
+ adopts: z
644
+ .array(
645
+ z
646
+ .object({
647
+ source: z
648
+ .object({
649
+ group: nonEmptyString,
650
+ kinds: z.array(AuthoredDocKindSchema).min(1).optional(),
651
+ })
652
+ .strict(),
653
+ into: nonEmptyString,
654
+ groupBy: z.literal('kind').optional(),
655
+ })
656
+ .strict(),
657
+ )
658
+ .optional(),
659
+ blocks: z.array(NamespaceContentBlockSchema).optional(),
660
+ })
661
+ .strict()
662
+ .superRefine((doc, context) => {
663
+ const slots = new Set(Object.keys(doc.slots));
664
+ doc.adopts?.forEach((rule, index) => {
665
+ const slot = doc.slots[rule.into];
666
+ if (slot == null) {
667
+ context.addIssue({
668
+ code: 'custom',
669
+ path: ['adopts', index, 'into'],
670
+ message: `must name a declared slot; received "${rule.into}"`,
671
+ });
672
+ return;
673
+ }
674
+ /** @type {AuthoredDocKind[]} */
675
+ const adoptedKinds =
676
+ rule.groupBy === 'kind' ? ['namespace'] : (rule.source.kinds ?? []);
677
+ adoptedKinds.forEach(kind => {
678
+ if (!slot.accepts.kinds.includes(kind)) {
679
+ context.addIssue({
680
+ code: 'custom',
681
+ path: ['adopts', index, 'into'],
682
+ message: `slot "${rule.into}" does not accept adopted kind "${kind}"`,
683
+ });
684
+ }
685
+ });
686
+ });
687
+ doc.blocks?.forEach((block, index) => {
688
+ if (block.type === 'collection' && !slots.has(block.source.slot)) {
689
+ context.addIssue({
690
+ code: 'custom',
691
+ path: ['blocks', index, 'source', 'slot'],
692
+ message: `must name a declared slot; received "${block.source.slot}"`,
693
+ });
694
+ }
695
+ });
696
+ });
697
+
698
+ /**
699
+ * @typedef {import('../_shared/contract.js').Expect<
700
+ * import('../_shared/contract.js').Equal<
701
+ * z.infer<typeof NamespaceDocKindSchema>,
702
+ * NamespaceDoc
703
+ * >
704
+ * >} _NamespaceDocDriftLock
705
+ */
706
+
707
+ // Legacy loose format stays permissive for backward compatibility.
237
708
  const LegacyBaseDocSchema = z.object({
709
+ ...AuthoredDocGraphFields,
238
710
  name: z.string().min(1, 'name is required'),
239
711
  displayName: z.string().optional(),
240
712
  description: z.string().optional(),
@@ -255,6 +727,37 @@ const LegacyBaseDocSchema = z.object({
255
727
  relatedHooks: z.array(z.string()).optional(),
256
728
  });
257
729
 
730
+ const LegacyReferenceDocSchema = LegacyBaseDocSchema.extend({
731
+ title: nonEmptyString,
732
+ description: z.string(),
733
+ sections: z.array(ReferenceSectionSchema).min(1),
734
+ replaces: nonEmptyString.optional(),
735
+ extends: nonEmptyString.optional(),
736
+ tokenCategory: z.string().optional(),
737
+ })
738
+ .passthrough()
739
+ .superRefine((doc, context) => {
740
+ if (doc.replaces != null && doc.extends != null) {
741
+ context.addIssue({
742
+ code: 'custom',
743
+ path: ['extends'],
744
+ message: 'declares both `replaces` and `extends`; choose one',
745
+ });
746
+ }
747
+ const sectionIds = new Set();
748
+ doc.sections.forEach((section, index) => {
749
+ if (section.id == null) return;
750
+ if (sectionIds.has(section.id)) {
751
+ context.addIssue({
752
+ code: 'custom',
753
+ path: ['sections', index, 'id'],
754
+ message: `duplicate section id "${section.id}"`,
755
+ });
756
+ }
757
+ sectionIds.add(section.id);
758
+ });
759
+ });
760
+
258
761
  const LegacySingleComponentDocSchema = LegacyBaseDocSchema.extend({
259
762
  props: z.array(PropSchema),
260
763
  }).passthrough();
@@ -274,10 +777,11 @@ const LegacySubComponentDocSchema = LegacyBaseDocSchema.extend({
274
777
  props: z.array(PropSchema),
275
778
  }).passthrough();
276
779
 
277
- /** The permissive legacy union (sub-component first, then hook, multi, single). */
780
+ /** The permissive legacy union (sub-component, hook, multi, single, then reference). */
278
781
  export const LegacyDocSchema = z.union([
279
782
  LegacySubComponentDocSchema,
280
783
  LegacyHookDocSchema,
281
784
  LegacyMultiComponentDocSchema,
282
785
  LegacySingleComponentDocSchema,
786
+ LegacyReferenceDocSchema,
283
787
  ]);