@astryxdesign/cli 0.6.3-canary.98a2e4e → 0.6.3-canary.9c4d44d

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 (612) hide show
  1. package/README.md +117 -79
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +16 -9
  6. package/api/build/build.test.mjs +197 -8
  7. package/api/build/build.type.d.mts +91 -2
  8. package/api/build/build.type.mjs +52 -8
  9. package/api/build/help/help.d.mts +12 -5
  10. package/api/build/help/help.mjs +69 -6
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +13 -3
  19. package/api/component/component.mjs +91 -14
  20. package/api/component/component.test.mjs +38 -0
  21. package/api/component/component.type.d.mts +22 -11
  22. package/api/component/component.type.mjs +32 -24
  23. package/api/component/detail/blocks/blocks.d.mts +2 -1
  24. package/api/component/detail/blocks/blocks.mjs +4 -3
  25. package/api/component/list/list.d.mts +0 -5
  26. package/api/component/list/list.mjs +40 -11
  27. package/api/discover/_adapter.d.mts +114 -6
  28. package/api/discover/_adapter.mjs +372 -17
  29. package/api/discover/_adapter.test.mjs +215 -0
  30. package/api/discover/_catalog-view.d.mts +115 -0
  31. package/api/discover/_catalog-view.mjs +203 -0
  32. package/api/discover/_catalog-view.test.mjs +128 -0
  33. package/api/discover/detail/detail.d.mts +18 -6
  34. package/api/discover/detail/detail.mjs +67 -13
  35. package/api/discover/detail/detail.test.mjs +85 -0
  36. package/api/discover/detail/item/item.d.mts +26 -0
  37. package/api/discover/detail/item/item.mjs +78 -0
  38. package/api/discover/detail/item/item.test.mjs +73 -0
  39. package/api/discover/discover.d.mts +3 -9
  40. package/api/discover/discover.doc.mjs +62 -18
  41. package/api/discover/discover.mjs +220 -36
  42. package/api/discover/discover.test.mjs +11 -2
  43. package/api/discover/discover.type.d.mts +150 -11
  44. package/api/discover/discover.type.mjs +107 -17
  45. package/api/discover/list/list.d.mts +20 -6
  46. package/api/discover/list/list.mjs +45 -12
  47. package/api/discover/list/list.test.mjs +46 -0
  48. package/api/discover/search/search.d.mts +18 -16
  49. package/api/discover/search/search.mjs +102 -56
  50. package/api/discover/search/search.test.mjs +144 -10
  51. package/api/docs/_adapter.d.mts +268 -47
  52. package/api/docs/_adapter.mjs +970 -149
  53. package/api/docs/compiled-topics.test.mjs +78 -0
  54. package/api/docs/detail/detail.d.mts +0 -15
  55. package/api/docs/detail/detail.mjs +22 -78
  56. package/api/docs/detail/section/section.mjs +39 -24
  57. package/api/docs/detail/section/section.test.mjs +19 -9
  58. package/api/docs/docs.d.mts +5 -3
  59. package/api/docs/docs.doc.mjs +39 -17
  60. package/api/docs/docs.mjs +44 -8
  61. package/api/docs/docs.test.mjs +158 -4
  62. package/api/docs/docs.type.d.mts +185 -6
  63. package/api/docs/docs.type.mjs +127 -13
  64. package/api/docs/index/index.mjs +15 -6
  65. package/api/docs/index/index.test.mjs +1 -1
  66. package/api/docs/integration-tree.test.mjs +555 -0
  67. package/api/docs/integrationDocs.test.mjs +14 -14
  68. package/api/docs/list/list.mjs +28 -12
  69. package/api/docs/node/node.d.mts +43 -0
  70. package/api/docs/node/node.mjs +192 -0
  71. package/api/docs/reference-blocks.test.mjs +406 -0
  72. package/api/doctor/doctor.d.mts +54 -4
  73. package/api/doctor/doctor.doc.mjs +1 -0
  74. package/api/doctor/doctor.mjs +332 -21
  75. package/api/doctor/doctor.test.mjs +420 -7
  76. package/api/gap-report/gap-report.doc.mjs +8 -4
  77. package/api/hook/_adapter.mjs +19 -5
  78. package/api/hook/hook.doc.mjs +1 -0
  79. package/api/hook/hook.type.d.mts +3 -3
  80. package/api/hook/hook.type.mjs +11 -11
  81. package/api/hook/list/list.d.mts +1 -1
  82. package/api/hook/list/list.mjs +69 -17
  83. package/api/index.d.mts +1 -1
  84. package/api/index.mjs +1 -0
  85. package/api/init/init.doc.mjs +6 -1
  86. package/api/init/init.test.mjs +41 -1
  87. package/api/init/remove/remove.mjs +1 -1
  88. package/api/init/run/run.mjs +20 -10
  89. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  90. package/api/integration/add-contribution.d.mts +2 -1
  91. package/api/integration/add-contribution.mjs +130 -15
  92. package/api/integration/add-contribution.test.mjs +258 -7
  93. package/api/integration/add-helpers.d.mts +5 -2
  94. package/api/integration/add-helpers.mjs +36 -9
  95. package/api/integration/add-theme.mjs +34 -64
  96. package/api/integration/add-theme.test.mjs +105 -21
  97. package/api/integration/authoring-checks.mjs +138 -28
  98. package/api/integration/authoring-checks.test.mjs +179 -7
  99. package/api/integration/authoring-checks.type.mjs +6 -1
  100. package/api/integration/integration-authoring.type.d.mts +2 -0
  101. package/api/integration/integration-authoring.type.mjs +2 -0
  102. package/api/integration/integration-block-exports.test.mjs +10 -6
  103. package/api/integration/integrationAdd.doc.mjs +14 -4
  104. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  105. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  106. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  107. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  108. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  109. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  110. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  111. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  112. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  113. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  114. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  115. package/api/integration/pack-check.mjs +83 -7
  116. package/api/integration/pack-check.test.mjs +387 -47
  117. package/api/integration/pack-check.type.d.mts +26 -2
  118. package/api/integration/pack-check.type.mjs +14 -1
  119. package/api/integration/summarizeIssues.doc.mjs +1 -0
  120. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  121. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  122. package/api/integration/validate-integration.mjs +52 -102
  123. package/api/integration/validate-integration.test.mjs +179 -26
  124. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  125. package/api/integration/validateIntegration.doc.mjs +3 -2
  126. package/api/json/assertResponse.doc.mjs +1 -0
  127. package/api/json/envelope-types.test.mjs +76 -0
  128. package/api/json/index.ts +2 -0
  129. package/api/json/isError.doc.mjs +1 -0
  130. package/api/json/parseResponse.doc.mjs +3 -2
  131. package/api/layout/_adapter.mjs +20 -5
  132. package/api/layout/expand/expand.mjs +7 -5
  133. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  134. package/api/layout/grammar/grammar.mjs +2 -1
  135. package/api/layout/layoutCheck.doc.mjs +1 -0
  136. package/api/layout/layoutExpand.doc.mjs +2 -1
  137. package/api/layout/layoutGrammar.doc.mjs +1 -0
  138. package/api/search/search-return-type.test.mjs +54 -0
  139. package/api/search/search.d.mts +61 -10
  140. package/api/search/search.doc.mjs +8 -2
  141. package/api/search/search.mjs +471 -83
  142. package/api/search/search.test.mjs +124 -1
  143. package/api/search/search.type.d.mts +14 -2
  144. package/api/search/search.type.mjs +5 -2
  145. package/api/swizzle/copy/copy.mjs +28 -11
  146. package/api/swizzle/swizzle.doc.mjs +2 -1
  147. package/api/swizzle/swizzle.type.d.mts +2 -2
  148. package/api/swizzle/swizzle.type.mjs +2 -2
  149. package/api/template/copy/copy.mjs +17 -23
  150. package/api/template/copy/copy.test.mjs +17 -0
  151. package/api/template/list/list.mjs +1 -0
  152. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  153. package/api/template/template-integration.test.mjs +1072 -3
  154. package/api/template/template-suffix.test.mjs +41 -21
  155. package/api/template/template.doc.mjs +30 -8
  156. package/api/template/template.mjs +45 -8
  157. package/api/template/template.type.d.mts +11 -13
  158. package/api/template/template.type.mjs +15 -14
  159. package/api/theme/_adapter.d.mts +2 -3
  160. package/api/theme/_adapter.mjs +4 -5
  161. package/api/theme/add/add.binary.test.mjs +84 -0
  162. package/api/theme/add/add.mjs +31 -22
  163. package/api/theme/add/add.rollback.test.mjs +158 -0
  164. package/api/theme/add/add.staging.test.mjs +83 -0
  165. package/api/theme/add/add.test.mjs +14 -1
  166. package/api/theme/build/build.family.test.mjs +7 -12
  167. package/api/theme/build/build.mjs +140 -59
  168. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  169. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  170. package/api/theme/build/build.rollback.test.mjs +148 -0
  171. package/api/theme/build/build.test.mjs +127 -0
  172. package/api/theme/build/font-warning.mjs +3 -3
  173. package/api/theme/build/font-warning.test.mjs +5 -2
  174. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  175. package/api/theme/integration-themes.test.mjs +39 -28
  176. package/api/theme/list/list.test.mjs +19 -20
  177. package/api/theme/listThemes.doc.mjs +6 -5
  178. package/api/theme/palette/generate/generate.mjs +8 -3
  179. package/api/theme/palette/generate/generate.test.mjs +96 -0
  180. package/api/theme/palette/generate/generator.d.mts +10 -13
  181. package/api/theme/palette/generate/generator.mjs +15 -4
  182. package/api/theme/palette/generate/generator.test.mjs +10 -0
  183. package/api/theme/template/template.mjs +11 -2
  184. package/api/theme/template/template.test.mjs +20 -0
  185. package/api/theme/theme.type.d.mts +170 -11
  186. package/api/theme/theme.type.mjs +94 -27
  187. package/api/theme/themeAdd.doc.mjs +4 -3
  188. package/api/theme/themeBuild.doc.mjs +8 -4
  189. package/api/theme/themeList.doc.mjs +6 -3
  190. package/api/theme/themeListAvailable.doc.mjs +5 -3
  191. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  192. package/api/theme/themeTargets.doc.mjs +1 -0
  193. package/api/theme/themeTemplate.doc.mjs +6 -2
  194. package/api/upgrade/_adapter.d.mts +32 -5
  195. package/api/upgrade/_adapter.mjs +124 -73
  196. package/api/upgrade/list/list.mjs +2 -1
  197. package/api/upgrade/list/list.test.mjs +73 -0
  198. package/api/upgrade/provider-agreement.test.mjs +152 -0
  199. package/api/upgrade/run/run.mjs +356 -59
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +8 -2
  202. package/api/upgrade/upgrade.type.d.mts +42 -4
  203. package/api/upgrade/upgrade.type.mjs +26 -10
  204. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  205. package/assets/codemods/integration-discovery.mjs +48 -4
  206. package/assets/codemods/integration-discovery.test.mjs +73 -0
  207. package/assets/codemods/integration-runner.mjs +56 -4
  208. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  209. package/assets/codemods/run-codemod.mjs +177 -34
  210. package/assets/codemods/runner.mjs +350 -102
  211. package/assets/codemods/term-log.mjs +32 -8
  212. package/assets/codemods/term-log.test.mjs +19 -1
  213. package/assets/codemods/transform-prop.mjs +109 -0
  214. package/assets/codemods/transform-prop.test.mjs +95 -0
  215. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  216. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  217. package/assets/codemods/transforms/next/index.mjs +19 -1
  218. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  219. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  220. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  221. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  222. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  223. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  224. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  225. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  226. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  227. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  228. package/assets/docs/getting-started.doc.mjs +2 -2
  229. package/assets/docs/internationalization.doc.mjs +7 -5
  230. package/assets/docs/layout.doc.dense.mjs +2 -2
  231. package/assets/docs/layout.doc.mjs +1 -1
  232. package/assets/docs/principles.doc.mjs +6 -6
  233. package/assets/docs/styling-libraries.doc.mjs +4 -4
  234. package/assets/docs/styling.doc.mjs +4 -4
  235. package/assets/docs/theme.doc.mjs +5 -5
  236. package/assets/docs/tokens.doc.mjs +1 -1
  237. package/assets/docs/tree/api.doc.mjs +30 -0
  238. package/assets/docs/tree/cli.doc.mjs +23 -0
  239. package/assets/docs/tree/commands.doc.mjs +25 -0
  240. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +95 -39
  241. package/assets/docs/tree/integrations.test.mjs +62 -0
  242. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  243. package/assets/docs/working-with-ai.doc.mjs +4 -4
  244. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  245. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  246. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  247. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  248. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  249. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  250. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  251. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  252. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  253. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  254. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  255. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  262. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  264. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  265. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  266. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  267. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  268. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  269. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  270. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  271. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  272. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  273. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  274. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  275. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  276. package/authoring/_shared/contract.ts +22 -0
  277. package/authoring/codemod/codemod.doc.mjs +7 -2
  278. package/authoring/codemod/parse.d.mts +8 -8
  279. package/authoring/codemod/parse.mjs +8 -6
  280. package/authoring/codemod/type.ts +12 -0
  281. package/authoring/config/config.doc.mjs +10 -2
  282. package/authoring/config/debug-composition.test.mjs +92 -0
  283. package/authoring/config/parse.d.mts +15 -13
  284. package/authoring/config/parse.mjs +27 -8
  285. package/authoring/config/parse.test.mjs +8 -0
  286. package/authoring/config/type.ts +29 -6
  287. package/authoring/debug/debug.doc.d.mts +11 -0
  288. package/authoring/debug/debug.doc.mjs +182 -0
  289. package/authoring/debug/parse.d.mts +7 -7
  290. package/authoring/debug/parse.mjs +3 -3
  291. package/authoring/discover/discover.doc.d.mts +13 -0
  292. package/authoring/discover/discover.doc.mjs +138 -0
  293. package/authoring/discover/parse.d.mts +24 -0
  294. package/authoring/discover/parse.mjs +128 -0
  295. package/authoring/discover/parse.test.mjs +124 -0
  296. package/authoring/discover/type.ts +87 -0
  297. package/authoring/doctypes/_schema.d.mts +240 -128
  298. package/authoring/doctypes/_schema.mjs +198 -16
  299. package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
  300. package/authoring/doctypes/base/type.ts +9 -4
  301. package/authoring/doctypes/command/command.doc.mjs +4 -3
  302. package/authoring/doctypes/command/parse.d.mts +2 -2
  303. package/authoring/doctypes/command/parse.mjs +1 -1
  304. package/authoring/doctypes/command/type.ts +4 -4
  305. package/authoring/doctypes/component/component.doc.mjs +5 -2
  306. package/authoring/doctypes/component/parse.d.mts +2 -2
  307. package/authoring/doctypes/component/parse.mjs +1 -1
  308. package/authoring/doctypes/component/type.ts +3 -3
  309. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  310. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  311. package/authoring/doctypes/enum/parse.d.mts +2 -2
  312. package/authoring/doctypes/enum/parse.mjs +1 -1
  313. package/authoring/doctypes/enum/type.ts +2 -2
  314. package/authoring/doctypes/function/function.doc.mjs +7 -2
  315. package/authoring/doctypes/function/parse.d.mts +2 -2
  316. package/authoring/doctypes/function/parse.mjs +1 -1
  317. package/authoring/doctypes/function/type.ts +4 -3
  318. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  319. package/authoring/doctypes/hook/parse.d.mts +2 -2
  320. package/authoring/doctypes/hook/parse.mjs +1 -1
  321. package/authoring/doctypes/hook/type.ts +3 -3
  322. package/authoring/doctypes/legacy.d.mts +6 -6
  323. package/authoring/doctypes/legacy.mjs +3 -3
  324. package/authoring/doctypes/load-contract.test.mjs +233 -0
  325. package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
  326. package/authoring/doctypes/namespace/parse.d.mts +2 -2
  327. package/authoring/doctypes/namespace/parse.mjs +1 -1
  328. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  329. package/authoring/doctypes/namespace/type.ts +6 -3
  330. package/authoring/doctypes/parse.d.mts +22 -20
  331. package/authoring/doctypes/parse.mjs +19 -14
  332. package/authoring/doctypes/reference/parse.d.mts +2 -2
  333. package/authoring/doctypes/reference/parse.mjs +1 -1
  334. package/authoring/doctypes/reference/reference.doc.mjs +39 -6
  335. package/authoring/doctypes/reference/type.ts +31 -14
  336. package/authoring/doctypes/schema/parse.d.mts +2 -2
  337. package/authoring/doctypes/schema/parse.mjs +1 -1
  338. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  339. package/authoring/doctypes/schema/type.ts +3 -4
  340. package/authoring/doctypes/template/parse.d.mts +94 -1
  341. package/authoring/doctypes/template/parse.mjs +37 -1
  342. package/authoring/doctypes/template/parse.test.mjs +18 -0
  343. package/authoring/doctypes/template/template.doc.mjs +13 -3
  344. package/authoring/doctypes/template/type.ts +12 -1
  345. package/authoring/doctypes/theme/parse.d.mts +35 -0
  346. package/authoring/doctypes/theme/parse.mjs +76 -0
  347. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  348. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  349. package/authoring/doctypes/theme/type.ts +42 -0
  350. package/authoring/doctypes/types.ts +12 -11
  351. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  352. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  353. package/authoring/gap-report/parse.d.mts +9 -9
  354. package/authoring/gap-report/parse.mjs +6 -6
  355. package/authoring/gap-report/type.ts +1 -1
  356. package/authoring/identity/identity.doc.mjs +3 -2
  357. package/authoring/identity/type.ts +10 -10
  358. package/authoring/index.d.mts +2 -0
  359. package/authoring/index.d.ts +32 -19
  360. package/authoring/index.mjs +3 -1
  361. package/authoring/integration/integration.doc.mjs +2 -2
  362. package/authoring/integration/parse.d.mts +2 -2
  363. package/authoring/integration/parse.mjs +1 -1
  364. package/authoring/integration/schema.d.mts +4 -4
  365. package/authoring/integration/schema.mjs +3 -3
  366. package/authoring/integration/type.ts +5 -11
  367. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  368. package/clients/cli/command-load-failure.test.mjs +83 -0
  369. package/clients/cli/commands/blog.doc.mjs +1 -1
  370. package/clients/cli/commands/blog.mjs +23 -8
  371. package/clients/cli/commands/blog.test.mjs +42 -1
  372. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  373. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  374. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  375. package/clients/cli/commands/build-theme.mjs +16 -50
  376. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  377. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  378. package/clients/cli/commands/build.doc.mjs +16 -8
  379. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  380. package/clients/cli/commands/build.mjs +137 -114
  381. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  382. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  383. package/clients/cli/commands/component/index.mjs +3 -8
  384. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  385. package/clients/cli/commands/component-package.test.mjs +46 -0
  386. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  387. package/clients/cli/commands/component.doc.mjs +1 -1
  388. package/clients/cli/commands/component.test.mjs +19 -0
  389. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  390. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  391. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  392. package/clients/cli/commands/discover.doc.mjs +55 -9
  393. package/clients/cli/commands/discover.mjs +393 -118
  394. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  395. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  396. package/clients/cli/commands/docs.doc.mjs +21 -9
  397. package/clients/cli/commands/docs.mjs +184 -70
  398. package/clients/cli/commands/docs.test.mjs +120 -16
  399. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  400. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  401. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  402. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  403. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  404. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  405. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  406. package/clients/cli/commands/doctor.doc.mjs +1 -1
  407. package/clients/cli/commands/doctor.mjs +59 -32
  408. package/clients/cli/commands/doctor.test.mjs +42 -0
  409. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  410. package/clients/cli/commands/gap-report.test.mjs +72 -0
  411. package/clients/cli/commands/hook/index.mjs +7 -17
  412. package/clients/cli/commands/hook.doc.mjs +1 -1
  413. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  414. package/clients/cli/commands/init.doc.mjs +20 -9
  415. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  416. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  417. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  418. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  419. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  420. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  421. package/clients/cli/commands/integration.doc.mjs +1 -1
  422. package/clients/cli/commands/integration.mjs +1 -0
  423. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  424. package/clients/cli/commands/json-contract.test.mjs +33 -0
  425. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  426. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  427. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  428. package/clients/cli/commands/layout.doc.mjs +3 -3
  429. package/clients/cli/commands/layout.mjs +21 -9
  430. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  431. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  432. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  433. package/clients/cli/commands/manifest.doc.mjs +1 -1
  434. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  435. package/clients/cli/commands/search.doc.mjs +7 -4
  436. package/clients/cli/commands/search.mjs +28 -9
  437. package/clients/cli/commands/search.test.mjs +75 -0
  438. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  439. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  440. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  441. package/clients/cli/commands/template.doc.mjs +52 -13
  442. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  443. package/clients/cli/commands/template.mjs +4 -91
  444. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  445. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  446. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  447. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  448. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  449. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  450. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  451. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  452. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  453. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  454. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  455. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  456. package/clients/cli/commands/theme.doc.mjs +1 -1
  457. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  458. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  459. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  460. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  461. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  462. package/clients/cli/commands/upgrade.mjs +29 -7
  463. package/clients/cli/formatters/index.mjs +2 -0
  464. package/clients/cli/formatters/index.test.mjs +6 -0
  465. package/clients/cli/index.mjs +21 -30
  466. package/clients/cli/latest-version-env.test.mjs +50 -0
  467. package/clients/cli/lib/cli-error.test.mjs +7 -0
  468. package/clients/cli/lib/component-format.mjs +9 -9
  469. package/clients/cli/lib/component-format.test.mjs +1 -1
  470. package/clients/cli/lib/define-command.mjs +32 -6
  471. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  472. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  473. package/clients/cli/lib/hook-format.mjs +19 -10
  474. package/clients/cli/lib/json-shim.mjs +38 -2
  475. package/clients/cli/lib/json-shim.test.mjs +83 -0
  476. package/clients/cli/lib/manifest.d.ts +2 -0
  477. package/clients/cli/lib/manifest.mjs +32 -2
  478. package/clients/cli/lib/manifest.test.mjs +17 -0
  479. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  480. package/foundation/agent-docs/agent-docs.mjs +82 -12
  481. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  482. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  483. package/foundation/config/integration-debug.test.mjs +28 -3
  484. package/foundation/config/project-themes.test.mjs +11 -19
  485. package/foundation/config/project.d.mts +20 -11
  486. package/foundation/config/project.mjs +246 -89
  487. package/foundation/config/project.test.mjs +270 -21
  488. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  489. package/foundation/discovery/authoring-self-docs.mjs +38 -15
  490. package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
  491. package/foundation/discovery/authoring-surface.d.mts +74 -0
  492. package/foundation/discovery/authoring-surface.mjs +525 -0
  493. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  494. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  495. package/foundation/discovery/cli-self-docs.mjs +490 -0
  496. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  497. package/foundation/discovery/component-discovery.d.mts +38 -0
  498. package/foundation/discovery/component-discovery.mjs +48 -0
  499. package/foundation/discovery/component-loader.d.mts +35 -38
  500. package/foundation/discovery/component-loader.mjs +53 -222
  501. package/foundation/discovery/docs-discovery.d.mts +114 -9
  502. package/foundation/discovery/docs-discovery.mjs +239 -30
  503. package/foundation/discovery/docs-discovery.test.mjs +150 -35
  504. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  505. package/foundation/discovery/docs-output-budget.mjs +1 -1
  506. package/foundation/discovery/docs-section-key.d.mts +28 -10
  507. package/foundation/discovery/docs-section-key.mjs +134 -33
  508. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  509. package/foundation/discovery/template-adapter.d.mts +113 -11
  510. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  511. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  512. package/foundation/discovery/template-adapter.mjs +772 -82
  513. package/foundation/discovery/template-adapter.test.mjs +57 -0
  514. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  515. package/foundation/discovery/template-conflict-release.mjs +40 -0
  516. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  517. package/foundation/discovery/theme-discovery.d.mts +67 -7
  518. package/foundation/discovery/theme-discovery.mjs +916 -186
  519. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  520. package/foundation/discovery/theming-targets.test.mjs +4 -0
  521. package/foundation/doc-compiler/bundle.d.mts +47 -0
  522. package/foundation/doc-compiler/bundle.mjs +278 -0
  523. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  524. package/foundation/doc-compiler/compile.d.mts +343 -0
  525. package/foundation/doc-compiler/compile.mjs +558 -0
  526. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  527. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  528. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  529. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  530. package/foundation/doc-compiler/import.d.mts +24 -0
  531. package/foundation/doc-compiler/import.mjs +59 -0
  532. package/foundation/doc-compiler/inputs.d.mts +102 -0
  533. package/foundation/doc-compiler/inputs.mjs +291 -0
  534. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  535. package/foundation/doc-compiler/ir.d.mts +22 -0
  536. package/foundation/doc-compiler/ir.mjs +471 -0
  537. package/foundation/doc-compiler/lenses.d.mts +36 -0
  538. package/foundation/doc-compiler/lenses.mjs +173 -0
  539. package/foundation/doc-compiler/links.d.mts +162 -0
  540. package/foundation/doc-compiler/links.mjs +294 -0
  541. package/foundation/doc-compiler/links.test.mjs +192 -0
  542. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  543. package/foundation/doc-compiler/overlays.d.mts +37 -0
  544. package/foundation/doc-compiler/overlays.mjs +206 -0
  545. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  546. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  547. package/foundation/doc-compiler/read.d.mts +127 -0
  548. package/foundation/doc-compiler/read.mjs +325 -0
  549. package/foundation/doc-compiler/read.test.mjs +313 -0
  550. package/foundation/doc-compiler/source.d.mts +33 -0
  551. package/foundation/doc-compiler/source.mjs +128 -0
  552. package/foundation/doc-compiler/tree.d.mts +288 -0
  553. package/foundation/doc-compiler/tree.mjs +876 -0
  554. package/foundation/doc-compiler/tree.test.mjs +598 -0
  555. package/foundation/fs/file-protection.d.mts +33 -0
  556. package/foundation/fs/file-protection.mjs +825 -0
  557. package/foundation/fs/file-protection.test.mjs +250 -0
  558. package/foundation/fs/module-loader.d.mts +1 -0
  559. package/foundation/fs/module-loader.mjs +50 -1
  560. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  561. package/foundation/fs/path-safety.d.mts +3 -2
  562. package/foundation/fs/path-safety.mjs +49 -19
  563. package/foundation/fs/path-safety.test.mjs +50 -0
  564. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  565. package/foundation/integrations/autolink.d.mts +58 -1
  566. package/foundation/integrations/autolink.mjs +143 -52
  567. package/foundation/integrations/autolink.test.mjs +1 -1
  568. package/foundation/integrations/cli-requirement.d.mts +45 -0
  569. package/foundation/integrations/cli-requirement.mjs +154 -0
  570. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  571. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  572. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  573. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  574. package/foundation/integrations/contribution-inventory.mjs +27 -24
  575. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  576. package/foundation/integrations/integration-warnings.d.mts +9 -2
  577. package/foundation/integrations/integration-warnings.mjs +51 -26
  578. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  579. package/foundation/integrations/integrations.d.mts +17 -1
  580. package/foundation/integrations/integrations.mjs +52 -98
  581. package/foundation/integrations/integrations.test.mjs +31 -0
  582. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  583. package/foundation/integrations/provider-resolution.d.mts +152 -0
  584. package/foundation/integrations/provider-resolution.mjs +576 -0
  585. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  586. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  587. package/foundation/integrations/theme-descriptor.mjs +44 -0
  588. package/foundation/integrations/validate-contributions.mjs +121 -29
  589. package/foundation/response/base.d.ts +8 -4
  590. package/foundation/response/error-codes.d.mts +3 -1
  591. package/foundation/response/error-codes.d.ts +2 -0
  592. package/foundation/response/error-codes.doc.mjs +13 -4
  593. package/foundation/response/error-codes.mjs +8 -2
  594. package/foundation/response/error-codes.test.mjs +137 -10
  595. package/foundation/response/json-contract.test.mjs +11 -0
  596. package/foundation/response/json.d.mts +4 -2
  597. package/foundation/response/json.mjs +8 -10
  598. package/foundation/response/response-types.doc.d.mts +5 -1
  599. package/foundation/response/response-types.doc.mjs +37 -22
  600. package/foundation/response/response-types.doc.test.mjs +158 -0
  601. package/foundation/response/response.doc.mjs +1 -1
  602. package/foundation/text/string-utils.d.mts +8 -0
  603. package/foundation/text/string-utils.mjs +40 -10
  604. package/foundation/xle/expand.d.mts +2 -0
  605. package/foundation/xle/expand.mjs +4 -3
  606. package/foundation/xle/expand.test.mjs +54 -0
  607. package/foundation/xle/xle.test.mjs +13 -0
  608. package/package.json +10 -11
  609. package/assets/templates/themes/manifest.json +0 -95
  610. package/clients/cli/lib/update-check.mjs +0 -83
  611. package/clients/cli/lib/update-check.test.mjs +0 -137
  612. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -11,10 +11,20 @@
11
11
 
12
12
  import {z} from 'zod';
13
13
 
14
- /** @typedef {import('./base/type').AuthoredDocGraphFields} AuthoredDocGraphFieldsType */
15
- /** @typedef {import('./base/type').AuthoredDocKind} AuthoredDocKind */
16
- /** @typedef {import('./namespace/type').NamespaceDoc} NamespaceDoc */
17
- /** @typedef {import('./reference/type').ReferenceContentBlock} ReferenceContentBlock */
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 */
18
28
 
19
29
  const nonEmptyString = z.string().min(1);
20
30
 
@@ -31,6 +41,12 @@ export const AuthoredDocKindSchema = z.enum([
31
41
  'namespace',
32
42
  ]);
33
43
 
44
+ /**
45
+ * @typedef {import('../_shared/contract.js').Expect<
46
+ * import('../_shared/contract.js').Equal<z.infer<typeof AuthoredDocKindSchema>, AuthoredDocKind>
47
+ * >} _AuthoredDocKindDriftLock
48
+ */
49
+
34
50
  /** Shared optional graph fields for every authored doc kind. */
35
51
  export const AuthoredDocGraphFields = {
36
52
  placement: z
@@ -48,8 +64,8 @@ export const AuthoredDocGraphFields = {
48
64
  const _AuthoredDocGraphSchema = z.object(AuthoredDocGraphFields).strict();
49
65
 
50
66
  /**
51
- * @typedef {import('../_shared/contract').Expect<
52
- * import('../_shared/contract').MutuallyAssignable<
67
+ * @typedef {import('../_shared/contract.js').Expect<
68
+ * import('../_shared/contract.js').MutuallyAssignable<
53
69
  * z.infer<typeof _AuthoredDocGraphSchema>,
54
70
  * AuthoredDocGraphFieldsType
55
71
  * >
@@ -147,7 +163,7 @@ const ReferenceBlockSchema = z
147
163
  })
148
164
  .strict();
149
165
 
150
- /** Runtime schema for every existing and V1 semantic content block. */
166
+ /** Runtime schema for the stable content-block union published in 0.6.x. */
151
167
  export const ReferenceContentBlockSchema = z.discriminatedUnion('type', [
152
168
  ProseBlockSchema,
153
169
  HeadingBlockSchema,
@@ -155,26 +171,75 @@ export const ReferenceContentBlockSchema = z.discriminatedUnion('type', [
155
171
  TableBlockSchema,
156
172
  ListBlockSchema,
157
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,
158
205
  WorkflowBlockSchema,
159
206
  CollectionBlockSchema,
160
207
  ReferenceBlockSchema,
161
208
  ]);
162
209
 
163
210
  /**
164
- * @typedef {import('../_shared/contract').Expect<
165
- * import('../_shared/contract').Equal<
211
+ * @typedef {import('../_shared/contract.js').Expect<
212
+ * import('../_shared/contract.js').Equal<
166
213
  * z.infer<typeof ReferenceContentBlockSchema>,
167
214
  * ReferenceContentBlock
168
215
  * >
169
216
  * >} _ReferenceContentBlockDriftLock
170
217
  */
171
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
+
172
237
  const ReferenceSectionSchema = z
173
238
  .object({
174
239
  id: nonEmptyString.optional(),
175
240
  title: nonEmptyString,
176
241
  category: z.string().optional(),
177
- content: z.array(ReferenceContentBlockSchema),
242
+ content: z.array(SectionContentBlockSchema),
178
243
  previewType: z
179
244
  .enum([
180
245
  'swatch',
@@ -245,11 +310,58 @@ const ComponentBaseSchema = z
245
310
  })
246
311
  .passthrough();
247
312
 
248
- /** New-format stamped component doc (`type: 'component'`). */
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
+ */
249
328
  export const ComponentDocKindSchema = ComponentBaseSchema.extend({
250
- props: z.array(PropSchema),
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
+ }
251
340
  });
252
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
+
253
365
  /** Return entry for generalized function docs. */
254
366
  const FunctionReturnSchema = z
255
367
  .object({
@@ -269,6 +381,28 @@ export const FunctionDocKindSchema = z
269
381
  })
270
382
  .passthrough();
271
383
 
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
+
272
406
  /**
273
407
  * Stamped generic reference/topic doc (`type: 'generic'`). `title` and
274
408
  * `sections` stay optional at this parser boundary for docs produced by the
@@ -308,9 +442,30 @@ export const GenericDocKindSchema = z
308
442
  });
309
443
  });
310
444
 
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
+
311
466
  /** Recursive field descriptor for a SchemaDoc. */
312
467
  const SchemaFieldSchema =
313
- /** @type {import('zod').ZodType<import('./schema/type').SchemaFieldDoc>} */ (
468
+ /** @type {import('zod').ZodType<import('./schema/type.js').SchemaFieldDoc>} */ (
314
469
  z.lazy(() =>
315
470
  z
316
471
  .object({
@@ -351,6 +506,15 @@ export const SchemaDocKindSchema = z
351
506
  })
352
507
  .passthrough();
353
508
 
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
+
354
518
  /** New stamped command doc (`type: 'command'`). */
355
519
  export const CommandDocKindSchema = z
356
520
  .object({
@@ -411,6 +575,15 @@ export const CommandDocKindSchema = z
411
575
  })
412
576
  .passthrough();
413
577
 
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
+
414
587
  /** New stamped enum doc (`type: 'enum'`). */
415
588
  export const EnumDocKindSchema = z
416
589
  .object({
@@ -432,6 +605,15 @@ export const EnumDocKindSchema = z
432
605
  })
433
606
  .passthrough();
434
607
 
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
+
435
617
  const NamespaceSlotSchema = z
436
618
  .object({
437
619
  title: nonEmptyString,
@@ -474,7 +656,7 @@ export const NamespaceDocKindSchema = z
474
656
  .strict(),
475
657
  )
476
658
  .optional(),
477
- blocks: z.array(ReferenceContentBlockSchema).optional(),
659
+ blocks: z.array(NamespaceContentBlockSchema).optional(),
478
660
  })
479
661
  .strict()
480
662
  .superRefine((doc, context) => {
@@ -514,8 +696,8 @@ export const NamespaceDocKindSchema = z
514
696
  });
515
697
 
516
698
  /**
517
- * @typedef {import('../_shared/contract').Expect<
518
- * import('../_shared/contract').Equal<
699
+ * @typedef {import('../_shared/contract.js').Expect<
700
+ * import('../_shared/contract.js').Equal<
519
701
  * z.infer<typeof NamespaceDocKindSchema>,
520
702
  * NamespaceDoc
521
703
  * >
@@ -12,25 +12,27 @@ export const doc = {
12
12
  displayName: 'Authored doc graph fields',
13
13
  namespace: 'authoring',
14
14
  description:
15
- 'Optional placement, compatibility aliases, and audience fields shared by every authored documentation kind.',
15
+ "Placement, compatibility aliases, and audience: fields every authored doc kind declares for the docs tree. The docs tree reads `placement` for every guide, the CLI's and each integration's; aliases and audience are not built yet. A reference topic outside the docs tree that sets one fails to load, and other doc kinds accept them and ignore them.",
16
16
  appliesTo: 'Every supported .doc.mjs object',
17
17
  fields: [
18
18
  {
19
19
  name: 'placement',
20
20
  type: 'DocPlacement',
21
21
  description:
22
- 'Requests one canonical parent. The compiler fails invalid explicit placement instead of silently using Unorganized.',
22
+ "Names the doc's one parent in the docs tree: a namespace of the same package, one of its slots, and an order. Read for every guide, the CLI's and each integration's: a guide with `placement` gets a route in the tree instead of a flat topic name, and cannot also `replaces` or `extends` a topic. In the CLI's own topic directory a topic that sets it fails to load: the CLI keeps its guides in its docs tree directory. Commands, API functions, schemas, and enums do not set it: the tree adopts each by its `namespace`.",
23
23
  fields: [
24
24
  {
25
25
  name: 'placement.parent',
26
26
  type: 'string',
27
- description: 'Stable reference to the requested parent namespace.',
27
+ description:
28
+ 'The parent namespace: `namespace:<name>` in the same package.',
28
29
  required: true,
29
30
  },
30
31
  {
31
32
  name: 'placement.slot',
32
33
  type: 'string',
33
- description: 'Named slot owned by the parent namespace.',
34
+ description:
35
+ "A slot the parent namespace declares; it must accept this doc's kind. Optional when the parent has one slot.",
34
36
  },
35
37
  {
36
38
  name: 'placement.order',
@@ -43,13 +45,20 @@ export const doc = {
43
45
  name: 'aliases',
44
46
  type: 'string[]',
45
47
  description:
46
- 'Prior names or routes retained for compatibility. Aliases do not create another identity.',
48
+ 'Prior names or routes the docs tree will keep resolving to this doc, without creating another identity. Not read yet: a topic that sets it fails to load.',
47
49
  },
48
50
  {
49
51
  name: 'audience',
50
52
  type: "'public' | 'internal'",
51
- description: 'Bundle audience. Omit for public documentation.',
53
+ description:
54
+ "Which docs bundle includes this doc ('public' when omitted). Not read yet: a topic that sets it fails to load.",
52
55
  default: "'public'",
53
56
  },
54
57
  ],
58
+ notes: [
59
+ {
60
+ type: 'prose',
61
+ text: 'Unknown fields: `component`, `function`, `generic`, `schema`, `command` and `enum` docs accept a field they do not know, and nothing reads it, so a doc written for a newer CLI still loads here. `page`, `block` and `namespace` docs refuse one, as do `theme` descriptors. Sections and content blocks refuse one in every doc.',
62
+ },
63
+ ],
55
64
  };
@@ -30,13 +30,18 @@ export interface DocPlacement {
30
30
  order?: number;
31
31
  }
32
32
 
33
- /** Graph metadata shared by every authored doc kind. */
33
+ /**
34
+ * Tree metadata shared by every authored doc kind. The docs tree reads
35
+ * `placement` for every guide, the CLI's and each integration's
36
+ * (spec:AST-046); nothing reads `aliases` or `audience` yet. A reference topic
37
+ * outside the docs tree that sets one fails to load.
38
+ */
34
39
  export interface AuthoredDocGraphFields {
35
- /** Requested canonical parent. Omit to use source adoption or Unorganized. */
40
+ /** The doc's one parent in the docs tree: a namespace of its own package. */
36
41
  placement?: DocPlacement;
37
- /** Prior routes or names that must continue to resolve to this stable doc. */
42
+ /** Prior routes or names the docs tree will keep resolving. Not read yet. */
38
43
  aliases?: string[];
39
- /** Bundle audience. Omit for public docs. */
44
+ /** Docs bundle audience; omit for public docs. Not read yet. */
40
45
  audience?: DocAudience;
41
46
  }
42
47
 
@@ -54,7 +54,7 @@ export const doc = {
54
54
  name: 'namespace',
55
55
  type: 'string',
56
56
  description:
57
- "Docs namespace path. Defaults to 'cli' when applied by the docs index.",
57
+ "Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's commands use 'cli/commands', which the docs tree adopts: each is the leaf `cli/commands/<name>`. Every command doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
58
58
  },
59
59
  {
60
60
  name: 'aliases',
@@ -135,8 +135,9 @@ export const doc = {
135
135
  },
136
136
  {
137
137
  name: 'options[].default',
138
- type: 'string',
139
- description: 'Default value as a string.',
138
+ type: 'string | boolean | string[]',
139
+ description:
140
+ 'Default value: a string, a boolean, or a list of strings.',
140
141
  },
141
142
  {
142
143
  name: 'options[].cliOnly',
@@ -1,7 +1,7 @@
1
1
  // @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
- /** @typedef {import('../types').CommandDoc} CommandDoc */
4
+ /** @typedef {import('../types.js').CommandDoc} CommandDoc */
5
5
  /**
6
6
  * Validate an unknown value as a stamped command doc, or throw.
7
7
  *
@@ -10,4 +10,4 @@
10
10
  * @returns {CommandDoc}
11
11
  */
12
12
  export function parseCommand(input: unknown, label?: string): CommandDoc;
13
- export type CommandDoc = import("../types").CommandDoc;
13
+ export type CommandDoc = import("../types.js").CommandDoc;
@@ -8,7 +8,7 @@
8
8
  import {CommandDocKindSchema} from '../_schema.mjs';
9
9
  import {formatZodError} from '../../_shared/errors.mjs';
10
10
 
11
- /** @typedef {import('../types').CommandDoc} CommandDoc */
11
+ /** @typedef {import('../types.js').CommandDoc} CommandDoc */
12
12
 
13
13
  /**
14
14
  * Validate an unknown value as a stamped command doc, or throw.
@@ -9,8 +9,8 @@
9
9
  * `--help`. Colocated at `clients/cli/commands/<name>.doc.mjs`.
10
10
  */
11
11
 
12
- import type {AuthoredDocGraphFields} from '../base/type';
13
- import type {ReferenceContentBlock} from '../reference/type';
12
+ import type {AuthoredDocGraphFields} from '../base/type.js';
13
+ import type {ReferenceContentBlock} from '../reference/type.js';
14
14
 
15
15
  /** A positional argument. `param` links it to a FunctionDoc param for its description. */
16
16
  export interface CommandArgDoc {
@@ -65,7 +65,7 @@ export interface CommandDoc extends AuthoredDocGraphFields {
65
65
  summary: string;
66
66
  /** Longer help body / when-to-use. */
67
67
  description?: string;
68
- /** Docs namespace path. Defaults to 'cli' when applied by the docs index. */
68
+ /** The group that reads this doc. The CLI's commands use 'cli/commands', which the docs tree adopts: each is the leaf `cli/commands/<name>`. Every command doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads. */
69
69
  namespace?: string;
70
70
  /** Alternate slugs that also resolve to this doc. */
71
71
  aliases?: string[];
@@ -81,7 +81,7 @@ export interface CommandDoc extends AuthoredDocGraphFields {
81
81
  examples?: CommandExampleDoc[];
82
82
  /** Documented exit codes. */
83
83
  exitCodes?: {code: number; when: string}[];
84
- /** Related command names. */
84
+ /** Related command names; the CLI links each to its doc. */
85
85
  related?: string[];
86
86
  /** Freeform prose/notes. */
87
87
  notes?: ReferenceContentBlock[];
@@ -124,8 +124,7 @@ export const doc = {
124
124
  name: 'usage',
125
125
  type: 'UsageDoc',
126
126
  description:
127
- 'Component usage documentation: concise summary, best practices, component-specific accessibility requirements, and optional visual anatomy. (Optional on SubComponentDoc, where the sub-component description is used instead.)',
128
- required: true,
127
+ 'Component usage documentation: concise summary, best practices, component-specific accessibility requirements, and optional visual anatomy. Required on a component doc; optional on a sub-component doc (`subComponentOf`), which uses its description instead.',
129
128
  fields: [
130
129
  {
131
130
  name: 'usage.description',
@@ -242,6 +241,10 @@ export const docs = {
242
241
  },
243
242
  ],
244
243
  notes: [
244
+ {
245
+ type: 'prose',
246
+ text: "When it loads, a stamped component doc is checked as loosely as an unstamped one, so adding `type: 'component'` to an existing doc never breaks it: `displayName` may be missing, `category` may be any string, and `usage`, `theming`, `playground` and `examples` are not checked. Each entry in a group doc's `components` must have a `name`. Write to the type anyway; it is the contract.",
247
+ },
245
248
  {
246
249
  type: 'prose',
247
250
  text: 'ComponentDoc is a discriminated union of three shapes that all extend ComponentBaseDoc. Pick the variant by which key you set: `props` (single), `components` (multi), or `subComponentOf` (sub).',
@@ -1,7 +1,7 @@
1
1
  // @generated by scripts/sync-api-types.mjs from the JSDoc in authoring/**/*.mjs.
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
- /** @typedef {import('../types').ComponentDoc} ComponentDoc */
4
+ /** @typedef {import('../types.js').ComponentDoc} ComponentDoc */
5
5
  /**
6
6
  * Validate an unknown value as a stamped component doc, or throw.
7
7
  *
@@ -10,4 +10,4 @@
10
10
  * @returns {ComponentDoc}
11
11
  */
12
12
  export function parseComponent(input: unknown, label?: string): ComponentDoc;
13
- export type ComponentDoc = import("../types").ComponentDoc;
13
+ export type ComponentDoc = import("../types.js").ComponentDoc;
@@ -8,7 +8,7 @@
8
8
  import {ComponentDocKindSchema} from '../_schema.mjs';
9
9
  import {formatZodError} from '../../_shared/errors.mjs';
10
10
 
11
- /** @typedef {import('../types').ComponentDoc} ComponentDoc */
11
+ /** @typedef {import('../types.js').ComponentDoc} ComponentDoc */
12
12
 
13
13
  /**
14
14
  * Validate an unknown value as a stamped component doc, or throw.
@@ -19,7 +19,7 @@ import type {
19
19
  HookReturnDoc,
20
20
  RegistryDocIdentity,
21
21
  UsageDoc,
22
- } from '../base/type';
22
+ } from '../base/type.js';
23
23
 
24
24
  /**
25
25
  * Shared fields between single-component and multi-component docs.
@@ -146,10 +146,10 @@ export interface ComponentBaseDoc extends AuthoredDocGraphFields {
146
146
  /**
147
147
  * The documentation type for a component directory's {Name}.doc.mjs file.
148
148
  *
149
- * Every .doc.mjs must export a single `docs` constant of this type:
149
+ * Every new .doc.mjs default-exports a stamped object of this type:
150
150
  *
151
151
  * /\*\* \@type \{import('@astryxdesign/cli/authoring').ComponentDoc\} *\/
152
- * export const docs = \{ ... \};
152
+ * export default \{ type: 'component', ... \};
153
153
  *
154
154
  * Use SingleComponentDoc (with `props`) for single-component directories.
155
155
  * Use MultiComponentDoc (with `components`) for multi-component directories.
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file Tests for the new authoring doc-types (schema/command/enum) and the
4
+ * @file Tests for the new authoring doc-types (schema/command/enum/theme) and the
5
5
  * generalized `function` doc (hooks + CLI/API functions sharing the schema).
6
6
  */
7
7
 
@@ -12,6 +12,7 @@ import {
12
12
  parseCommand,
13
13
  parseEnum,
14
14
  parseFunction,
15
+ parseTheme,
15
16
  } from '../index.mjs';
16
17
 
17
18
  describe('SchemaDoc', () => {
@@ -22,13 +23,21 @@ describe('SchemaDoc', () => {
22
23
  description: 'Project config.',
23
24
  appliesTo: 'astryx.config.{ts,mjs,js}',
24
25
  fields: [
25
- {name: 'integrations', type: 'string[]', description: 'Packages to load.'},
26
+ {
27
+ name: 'integrations',
28
+ type: 'string[]',
29
+ description: 'Packages to load.',
30
+ },
26
31
  {
27
32
  name: 'hooks',
28
33
  type: 'object',
29
34
  description: 'Lifecycle hooks.',
30
35
  fields: [
31
- {name: 'hooks.postCodemod', type: 'PostCodemodHook[]', description: 'Runs after codemods.'},
36
+ {
37
+ name: 'hooks.postCodemod',
38
+ type: 'PostCodemodHook[]',
39
+ description: 'Runs after codemods.',
40
+ },
32
41
  ],
33
42
  },
34
43
  ],
@@ -63,8 +72,16 @@ describe('CommandDoc', () => {
63
72
  fn: 'search',
64
73
  args: [{name: 'query', param: 'query', required: true}],
65
74
  options: [
66
- {flag: '--type <domain>', param: 'options.type', choices: ['component', 'hook']},
67
- {flag: '--json', cliOnly: true, description: 'Emit the typed JSON envelope.'},
75
+ {
76
+ flag: '--type <domain>',
77
+ param: 'options.type',
78
+ choices: ['component', 'hook'],
79
+ },
80
+ {
81
+ flag: '--json',
82
+ cliOnly: true,
83
+ description: 'Emit the typed JSON envelope.',
84
+ },
68
85
  ],
69
86
  examples: [{label: 'Terminal', cli: 'astryx search button --json'}],
70
87
  exitCodes: [{code: 1, when: 'invalid --type'}],
@@ -90,6 +107,29 @@ describe('EnumDoc', () => {
90
107
  });
91
108
  });
92
109
 
110
+ describe('ThemeDoc', () => {
111
+ const doc = {
112
+ type: 'theme',
113
+ name: 'ocean',
114
+ displayName: 'Ocean',
115
+ description: 'Cool blue surfaces with crisp contrast.',
116
+ maintained: true,
117
+ };
118
+
119
+ it('accepts a complete theme descriptor and dispatches through parseDoc', () => {
120
+ expect(parseTheme(doc)).toEqual(doc);
121
+ expect(parseDoc(doc)).toEqual(doc);
122
+ });
123
+
124
+ it('rejects non-kebab identity and missing required metadata', () => {
125
+ expect(() => parseTheme({...doc, name: 'OceanTheme'})).toThrow(
126
+ /lowercase kebab-case/,
127
+ );
128
+ const {maintained: _maintained, ...missingMaintained} = doc;
129
+ expect(() => parseTheme(missingMaintained)).toThrow(/maintained/);
130
+ });
131
+ });
132
+
93
133
  describe('generalized FunctionDoc', () => {
94
134
  it('accepts an API function whose returns are envelope entries (no field name)', () => {
95
135
  const apiFn = {
@@ -98,7 +138,9 @@ describe('generalized FunctionDoc', () => {
98
138
  name: 'search',
99
139
  displayName: 'search()',
100
140
  importPath: '@astryxdesign/cli/api',
101
- params: [{name: 'query', type: 'string', description: 'Term.', required: true}],
141
+ params: [
142
+ {name: 'query', type: 'string', description: 'Term.', required: true},
143
+ ],
102
144
  returns: [{type: 'search', description: 'query + ranked results[]'}],
103
145
  throws: [{code: 'ERR_INVALID_ARGUMENT', when: 'empty query'}],
104
146
  };
@@ -49,7 +49,7 @@ export const doc = {
49
49
  name: 'namespace',
50
50
  type: 'string',
51
51
  description:
52
- "Docs namespace path. Defaults to 'cli' when applied by the docs index.",
52
+ "Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's enums use 'cli/api', which the docs tree adopts by kind: each is the leaf `cli/api/enums/<name>`. Every enum doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
53
53
  },
54
54
  {
55
55
  name: 'aliases',