@astryxdesign/cli 0.6.3-canary.ea2f048 → 0.6.3-canary.ee13359

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