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

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 (505) hide show
  1. package/README.md +106 -72
  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/component.doc.mjs +13 -3
  10. package/api/component/component.mjs +31 -2
  11. package/api/component/component.test.mjs +38 -0
  12. package/api/component/component.type.d.mts +22 -11
  13. package/api/component/component.type.mjs +32 -24
  14. package/api/component/detail/blocks/blocks.d.mts +2 -1
  15. package/api/component/detail/blocks/blocks.mjs +4 -3
  16. package/api/component/list/list.d.mts +0 -5
  17. package/api/component/list/list.mjs +37 -9
  18. package/api/discover/discover.doc.mjs +2 -1
  19. package/api/discover/discover.type.d.mts +4 -4
  20. package/api/discover/discover.type.mjs +10 -10
  21. package/api/docs/_adapter.d.mts +32 -24
  22. package/api/docs/_adapter.mjs +81 -87
  23. package/api/docs/compiled-topics.test.mjs +78 -0
  24. package/api/docs/detail/detail.mjs +14 -63
  25. package/api/docs/detail/section/section.d.mts +1 -1
  26. package/api/docs/detail/section/section.mjs +44 -20
  27. package/api/docs/detail/section/section.test.mjs +41 -0
  28. package/api/docs/docs.d.mts +7 -2
  29. package/api/docs/docs.doc.mjs +28 -10
  30. package/api/docs/docs.mjs +16 -9
  31. package/api/docs/docs.test.mjs +6 -0
  32. package/api/docs/docs.type.d.mts +40 -3
  33. package/api/docs/docs.type.mjs +36 -8
  34. package/api/docs/index/index.d.mts +18 -0
  35. package/api/docs/index/index.mjs +32 -0
  36. package/api/docs/index/index.test.mjs +62 -0
  37. package/api/docs/integrationDocs.test.mjs +106 -0
  38. package/api/docs/list/list.mjs +3 -7
  39. package/api/doctor/doctor.d.mts +70 -0
  40. package/api/doctor/doctor.doc.mjs +1 -0
  41. package/api/doctor/doctor.mjs +404 -0
  42. package/api/doctor/doctor.test.mjs +522 -1
  43. package/api/gap-report/gap-report.doc.mjs +8 -4
  44. package/api/hook/_adapter.mjs +19 -5
  45. package/api/hook/hook.doc.mjs +1 -0
  46. package/api/hook/hook.type.d.mts +3 -3
  47. package/api/hook/hook.type.mjs +11 -11
  48. package/api/hook/list/list.d.mts +2 -2
  49. package/api/hook/list/list.mjs +69 -17
  50. package/api/init/init.doc.mjs +5 -0
  51. package/api/init/init.test.mjs +41 -1
  52. package/api/init/remove/remove.mjs +1 -1
  53. package/api/init/run/run.mjs +20 -10
  54. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  55. package/api/integration/add-contribution.mjs +23 -10
  56. package/api/integration/add-contribution.test.mjs +121 -7
  57. package/api/integration/add-theme.mjs +34 -64
  58. package/api/integration/add-theme.test.mjs +105 -21
  59. package/api/integration/authoring-checks.test.mjs +8 -4
  60. package/api/integration/integration-authoring.type.d.mts +1 -1
  61. package/api/integration/integration-block-exports.test.mjs +10 -6
  62. package/api/integration/integrationAdd.doc.mjs +8 -4
  63. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  64. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  65. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  66. package/api/integration/integrationAddDoc.doc.mjs +1 -0
  67. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  68. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  69. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  70. package/api/integration/integrationDocConflicts.doc.mjs +1 -0
  71. package/api/integration/integrationPackCheck.doc.mjs +1 -0
  72. package/api/integration/integrationTemplateConflicts.doc.mjs +1 -0
  73. package/api/integration/pack-check.mjs +49 -7
  74. package/api/integration/pack-check.test.mjs +266 -47
  75. package/api/integration/summarizeIssues.doc.mjs +1 -0
  76. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  77. package/api/integration/validate-integration.mjs +52 -102
  78. package/api/integration/validate-integration.test.mjs +176 -23
  79. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  80. package/api/integration/validateIntegration.doc.mjs +2 -1
  81. package/api/json/assertResponse.doc.mjs +1 -0
  82. package/api/json/envelope-types.test.mjs +76 -0
  83. package/api/json/isError.doc.mjs +1 -0
  84. package/api/json/parseResponse.doc.mjs +3 -2
  85. package/api/layout/expand/expand.mjs +7 -5
  86. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  87. package/api/layout/grammar/grammar.mjs +2 -1
  88. package/api/layout/layoutCheck.doc.mjs +1 -0
  89. package/api/layout/layoutExpand.doc.mjs +2 -1
  90. package/api/layout/layoutGrammar.doc.mjs +1 -0
  91. package/api/search/search-return-type.test.mjs +54 -0
  92. package/api/search/search.d.mts +3 -10
  93. package/api/search/search.doc.mjs +6 -1
  94. package/api/search/search.mjs +31 -14
  95. package/api/search/search.test.mjs +34 -0
  96. package/api/search/search.type.d.mts +2 -2
  97. package/api/search/search.type.mjs +1 -1
  98. package/api/swizzle/copy/copy.mjs +28 -11
  99. package/api/swizzle/swizzle.doc.mjs +2 -1
  100. package/api/swizzle/swizzle.type.d.mts +2 -2
  101. package/api/swizzle/swizzle.type.mjs +2 -2
  102. package/api/template/copy/copy.mjs +17 -23
  103. package/api/template/copy/copy.test.mjs +17 -0
  104. package/api/template/template-suffix.test.mjs +41 -21
  105. package/api/template/template.d.mts +1 -1
  106. package/api/template/template.doc.mjs +3 -1
  107. package/api/template/template.type.d.mts +6 -6
  108. package/api/template/template.type.mjs +12 -12
  109. package/api/theme/_adapter.d.mts +2 -3
  110. package/api/theme/_adapter.mjs +4 -5
  111. package/api/theme/add/add.binary.test.mjs +84 -0
  112. package/api/theme/add/add.mjs +20 -3
  113. package/api/theme/add/add.staging.test.mjs +66 -0
  114. package/api/theme/add/add.test.mjs +14 -1
  115. package/api/theme/build/build.mjs +133 -42
  116. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  117. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  118. package/api/theme/build/build.test.mjs +127 -0
  119. package/api/theme/build/font-warning.mjs +3 -3
  120. package/api/theme/build/font-warning.test.mjs +5 -2
  121. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  122. package/api/theme/integration-themes.test.mjs +39 -28
  123. package/api/theme/list/list.test.mjs +19 -20
  124. package/api/theme/listThemes.doc.mjs +6 -5
  125. package/api/theme/palette/generate/generate.mjs +8 -3
  126. package/api/theme/palette/generate/generate.test.mjs +96 -0
  127. package/api/theme/palette/generate/generator.d.mts +10 -13
  128. package/api/theme/palette/generate/generator.mjs +15 -4
  129. package/api/theme/palette/generate/generator.test.mjs +10 -0
  130. package/api/theme/template/template.mjs +11 -2
  131. package/api/theme/template/template.test.mjs +15 -0
  132. package/api/theme/theme.type.d.mts +170 -11
  133. package/api/theme/theme.type.mjs +94 -27
  134. package/api/theme/themeAdd.doc.mjs +4 -3
  135. package/api/theme/themeBuild.doc.mjs +8 -4
  136. package/api/theme/themeList.doc.mjs +6 -3
  137. package/api/theme/themeListAvailable.doc.mjs +5 -3
  138. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  139. package/api/theme/themeTargets.doc.mjs +1 -0
  140. package/api/theme/themeTemplate.doc.mjs +5 -1
  141. package/api/upgrade/_adapter.d.mts +12 -3
  142. package/api/upgrade/_adapter.mjs +123 -19
  143. package/api/upgrade/list/list.mjs +2 -1
  144. package/api/upgrade/list/list.test.mjs +73 -0
  145. package/api/upgrade/project-context.test.mjs +272 -0
  146. package/api/upgrade/provider-agreement.test.mjs +152 -0
  147. package/api/upgrade/run/run.mjs +1 -0
  148. package/api/upgrade/status/status.mjs +2 -2
  149. package/api/upgrade/upgrade.doc.mjs +7 -4
  150. package/api/upgrade/upgrade.type.d.mts +9 -5
  151. package/api/upgrade/upgrade.type.mjs +12 -11
  152. package/assets/codemods/integration-discovery.mjs +48 -4
  153. package/assets/codemods/integration-discovery.test.mjs +73 -0
  154. package/assets/codemods/runner.mjs +115 -5
  155. package/assets/codemods/term-log.mjs +32 -8
  156. package/assets/codemods/term-log.test.mjs +19 -1
  157. package/assets/codemods/transform-prop.mjs +109 -0
  158. package/assets/codemods/transform-prop.test.mjs +95 -0
  159. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +216 -0
  160. package/assets/codemods/transforms/next/index.mjs +11 -1
  161. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  162. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  163. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  164. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  165. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  166. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  167. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  168. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  169. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  170. package/assets/docs/README.md +9 -0
  171. package/assets/docs/authoring.doc.mjs +14 -0
  172. package/assets/docs/cli-integrations.doc.mjs +78 -20
  173. package/assets/docs/cli.doc.mjs +15 -0
  174. package/assets/docs/styling-libraries.doc.mjs +1 -1
  175. package/assets/docs/theme.doc.mjs +1 -1
  176. package/assets/docs/working-with-ai.doc.mjs +1 -1
  177. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  178. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  179. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  180. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  181. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  182. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  183. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  184. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  185. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  186. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  187. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  188. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  189. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  190. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  191. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  192. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  193. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  194. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  195. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  196. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  197. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  198. package/authoring/_shared/contract.ts +22 -0
  199. package/authoring/codemod/codemod.doc.mjs +7 -2
  200. package/authoring/codemod/parse.d.mts +8 -8
  201. package/authoring/codemod/parse.mjs +8 -6
  202. package/authoring/config/config.doc.mjs +2 -2
  203. package/authoring/config/debug-composition.test.mjs +92 -0
  204. package/authoring/config/parse.d.mts +13 -13
  205. package/authoring/config/parse.mjs +8 -8
  206. package/authoring/config/type.ts +18 -6
  207. package/authoring/debug/debug.doc.d.mts +11 -0
  208. package/authoring/debug/debug.doc.mjs +182 -0
  209. package/authoring/debug/parse.d.mts +5 -5
  210. package/authoring/debug/parse.mjs +3 -3
  211. package/authoring/doctypes/_schema.d.mts +788 -23
  212. package/authoring/doctypes/_schema.mjs +492 -39
  213. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  214. package/authoring/doctypes/base/graph-fields.doc.mjs +62 -0
  215. package/authoring/doctypes/base/type.ts +40 -0
  216. package/authoring/doctypes/command/command.doc.mjs +4 -3
  217. package/authoring/doctypes/command/parse.d.mts +2 -2
  218. package/authoring/doctypes/command/parse.mjs +1 -1
  219. package/authoring/doctypes/command/type.ts +4 -3
  220. package/authoring/doctypes/component/component.doc.mjs +6 -3
  221. package/authoring/doctypes/component/parse.d.mts +2 -2
  222. package/authoring/doctypes/component/parse.mjs +1 -1
  223. package/authoring/doctypes/component/type.ts +6 -5
  224. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  225. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  226. package/authoring/doctypes/enum/parse.d.mts +2 -2
  227. package/authoring/doctypes/enum/parse.mjs +1 -1
  228. package/authoring/doctypes/enum/type.ts +4 -2
  229. package/authoring/doctypes/function/function.doc.mjs +5 -1
  230. package/authoring/doctypes/function/parse.d.mts +2 -2
  231. package/authoring/doctypes/function/parse.mjs +1 -1
  232. package/authoring/doctypes/function/type.ts +7 -3
  233. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  234. package/authoring/doctypes/hook/parse.d.mts +2 -2
  235. package/authoring/doctypes/hook/parse.mjs +1 -1
  236. package/authoring/doctypes/hook/type.ts +5 -4
  237. package/authoring/doctypes/legacy.d.mts +8 -6
  238. package/authoring/doctypes/legacy.mjs +5 -4
  239. package/authoring/doctypes/load-contract.test.mjs +208 -0
  240. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  241. package/authoring/doctypes/namespace/namespace.doc.mjs +132 -0
  242. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  243. package/authoring/doctypes/namespace/parse.mjs +25 -0
  244. package/authoring/doctypes/namespace/parse.test.mjs +165 -0
  245. package/authoring/doctypes/namespace/type.ts +71 -0
  246. package/authoring/doctypes/parse.d.mts +22 -18
  247. package/authoring/doctypes/parse.mjs +22 -12
  248. package/authoring/doctypes/parse.test.mjs +77 -3
  249. package/authoring/doctypes/reference/parse.d.mts +2 -2
  250. package/authoring/doctypes/reference/parse.mjs +8 -5
  251. package/authoring/doctypes/reference/reference.doc.mjs +18 -5
  252. package/authoring/doctypes/reference/type.ts +53 -7
  253. package/authoring/doctypes/schema/parse.d.mts +2 -2
  254. package/authoring/doctypes/schema/parse.mjs +1 -1
  255. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  256. package/authoring/doctypes/schema/type.ts +4 -4
  257. package/authoring/doctypes/template/parse.d.mts +92 -1
  258. package/authoring/doctypes/template/parse.mjs +36 -2
  259. package/authoring/doctypes/template/parse.test.mjs +8 -2
  260. package/authoring/doctypes/template/template.doc.mjs +7 -3
  261. package/authoring/doctypes/template/type.ts +5 -2
  262. package/authoring/doctypes/theme/parse.d.mts +35 -0
  263. package/authoring/doctypes/theme/parse.mjs +76 -0
  264. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  265. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  266. package/authoring/doctypes/theme/type.ts +42 -0
  267. package/authoring/doctypes/types.ts +12 -10
  268. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  269. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  270. package/authoring/gap-report/parse.d.mts +10 -10
  271. package/authoring/gap-report/parse.mjs +6 -6
  272. package/authoring/gap-report/type.ts +1 -1
  273. package/authoring/identity/identity.doc.d.mts +9 -0
  274. package/authoring/identity/identity.doc.mjs +61 -0
  275. package/authoring/identity/type.ts +132 -0
  276. package/authoring/index.d.mts +2 -0
  277. package/authoring/index.d.ts +51 -17
  278. package/authoring/index.mjs +3 -1
  279. package/authoring/integration/integration.doc.mjs +15 -8
  280. package/authoring/integration/parse.d.mts +2 -2
  281. package/authoring/integration/parse.mjs +1 -1
  282. package/authoring/integration/parse.test.mjs +10 -1
  283. package/authoring/integration/schema.d.mts +6 -4
  284. package/authoring/integration/schema.mjs +9 -3
  285. package/authoring/integration/type.ts +18 -7
  286. package/authoring/shadcn/receipt.d.mts +6 -6
  287. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  288. package/clients/cli/command-load-failure.test.mjs +83 -0
  289. package/clients/cli/commands/blog.doc.mjs +1 -1
  290. package/clients/cli/commands/blog.mjs +23 -8
  291. package/clients/cli/commands/blog.test.mjs +42 -1
  292. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  293. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  294. package/clients/cli/commands/build-theme.mjs +5 -5
  295. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  296. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  297. package/clients/cli/commands/build.doc.mjs +5 -2
  298. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  299. package/clients/cli/commands/build.mjs +32 -47
  300. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  301. package/clients/cli/commands/build.text-fields.test.mjs +40 -0
  302. package/clients/cli/commands/component/index.mjs +2 -7
  303. package/clients/cli/commands/component-package.test.mjs +46 -0
  304. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  305. package/clients/cli/commands/component.doc.mjs +1 -1
  306. package/clients/cli/commands/component.test.mjs +19 -0
  307. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  308. package/clients/cli/commands/discover.broken-integration.test.mjs +48 -0
  309. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  310. package/clients/cli/commands/discover.doc.mjs +5 -3
  311. package/clients/cli/commands/discover.mjs +3 -3
  312. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  313. package/clients/cli/commands/docs.doc.mjs +14 -4
  314. package/clients/cli/commands/docs.mjs +121 -21
  315. package/clients/cli/commands/docs.test.mjs +88 -0
  316. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  317. package/clients/cli/commands/doctor-integration-docs.doc.mjs +1 -1
  318. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -1
  319. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  320. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  321. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  322. package/clients/cli/commands/doctor-integration.test.mjs +15 -7
  323. package/clients/cli/commands/doctor.doc.mjs +1 -1
  324. package/clients/cli/commands/doctor.mjs +6 -16
  325. package/clients/cli/commands/doctor.test.mjs +42 -0
  326. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  327. package/clients/cli/commands/gap-report.test.mjs +72 -0
  328. package/clients/cli/commands/hook/index.mjs +7 -17
  329. package/clients/cli/commands/hook.doc.mjs +1 -1
  330. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  331. package/clients/cli/commands/init.doc.mjs +20 -9
  332. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  333. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  334. package/clients/cli/commands/integration-add.doc.mjs +22 -6
  335. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  336. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  337. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  338. package/clients/cli/commands/integration.doc.mjs +1 -1
  339. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  340. package/clients/cli/commands/json-contract.test.mjs +33 -0
  341. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  342. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  343. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  344. package/clients/cli/commands/layout.doc.mjs +3 -3
  345. package/clients/cli/commands/layout.mjs +21 -9
  346. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  347. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  348. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  349. package/clients/cli/commands/manifest.doc.mjs +1 -1
  350. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  351. package/clients/cli/commands/search.doc.mjs +7 -4
  352. package/clients/cli/commands/search.mjs +17 -7
  353. package/clients/cli/commands/search.test.mjs +75 -0
  354. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  355. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  356. package/clients/cli/commands/template.doc.mjs +29 -7
  357. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  358. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  359. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  360. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  361. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  362. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  363. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  364. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  365. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  366. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  367. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  368. package/clients/cli/commands/theme.doc.mjs +1 -1
  369. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  370. package/clients/cli/commands/upgrade.doc.mjs +20 -9
  371. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  372. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  373. package/clients/cli/formatters/index.mjs +162 -1
  374. package/clients/cli/formatters/index.test.mjs +91 -0
  375. package/clients/cli/index.mjs +13 -30
  376. package/clients/cli/latest-version-env.test.mjs +50 -0
  377. package/clients/cli/lib/cli-error.test.mjs +7 -0
  378. package/clients/cli/lib/component-format.mjs +9 -9
  379. package/clients/cli/lib/component-format.test.mjs +1 -1
  380. package/clients/cli/lib/define-command.mjs +32 -6
  381. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  382. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  383. package/clients/cli/lib/hook-format.mjs +19 -10
  384. package/clients/cli/lib/json-shim.mjs +38 -2
  385. package/clients/cli/lib/json-shim.test.mjs +83 -0
  386. package/clients/cli/lib/manifest.d.ts +2 -0
  387. package/clients/cli/lib/manifest.mjs +29 -2
  388. package/clients/cli/lib/manifest.test.mjs +17 -0
  389. package/foundation/agent-docs/agent-docs.d.mts +4 -0
  390. package/foundation/agent-docs/agent-docs.mjs +69 -3
  391. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  392. package/foundation/config/integration-debug.test.mjs +28 -3
  393. package/foundation/config/project-themes.test.mjs +11 -19
  394. package/foundation/config/project.d.mts +8 -0
  395. package/foundation/config/project.mjs +190 -32
  396. package/foundation/config/project.test.mjs +129 -16
  397. package/foundation/discovery/authoring-self-docs.d.mts +75 -0
  398. package/foundation/discovery/authoring-self-docs.mjs +224 -0
  399. package/foundation/discovery/authoring-self-docs.test.mjs +154 -0
  400. package/foundation/discovery/authoring-surface.d.mts +74 -0
  401. package/foundation/discovery/authoring-surface.mjs +525 -0
  402. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  403. package/foundation/discovery/cli-self-docs.d.mts +113 -0
  404. package/foundation/discovery/cli-self-docs.mjs +514 -0
  405. package/foundation/discovery/cli-self-docs.test.mjs +437 -0
  406. package/foundation/discovery/component-discovery.d.mts +1 -1
  407. package/foundation/discovery/component-discovery.mjs +2 -1
  408. package/foundation/discovery/component-loader.d.mts +35 -38
  409. package/foundation/discovery/component-loader.mjs +53 -222
  410. package/foundation/discovery/docs-discovery.d.mts +12 -4
  411. package/foundation/discovery/docs-discovery.mjs +214 -98
  412. package/foundation/discovery/docs-discovery.test.mjs +284 -15
  413. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  414. package/foundation/discovery/docs-output-budget.mjs +50 -0
  415. package/foundation/discovery/docs-section-key.d.mts +98 -0
  416. package/foundation/discovery/docs-section-key.mjs +221 -0
  417. package/foundation/discovery/docs-section-key.test.mjs +224 -0
  418. package/foundation/discovery/template-adapter.d.mts +21 -5
  419. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  420. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  421. package/foundation/discovery/template-adapter.mjs +321 -66
  422. package/foundation/discovery/template-adapter.test.mjs +15 -0
  423. package/foundation/discovery/theme-discovery.d.mts +67 -7
  424. package/foundation/discovery/theme-discovery.mjs +916 -186
  425. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  426. package/foundation/discovery/theming-targets.test.mjs +4 -0
  427. package/foundation/doc-compiler/bundle.d.mts +47 -0
  428. package/foundation/doc-compiler/bundle.mjs +218 -0
  429. package/foundation/doc-compiler/bundle.test.mjs +255 -0
  430. package/foundation/doc-compiler/compile.d.mts +362 -0
  431. package/foundation/doc-compiler/compile.mjs +511 -0
  432. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  433. package/foundation/doc-compiler/diagnostics.mjs +277 -0
  434. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  435. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  436. package/foundation/doc-compiler/import.d.mts +24 -0
  437. package/foundation/doc-compiler/import.mjs +59 -0
  438. package/foundation/doc-compiler/inputs.d.mts +102 -0
  439. package/foundation/doc-compiler/inputs.mjs +286 -0
  440. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  441. package/foundation/doc-compiler/ir.d.mts +22 -0
  442. package/foundation/doc-compiler/ir.mjs +464 -0
  443. package/foundation/doc-compiler/lenses.d.mts +33 -0
  444. package/foundation/doc-compiler/lenses.mjs +127 -0
  445. package/foundation/doc-compiler/lower-doc.test.mjs +492 -0
  446. package/foundation/doc-compiler/overlays.d.mts +37 -0
  447. package/foundation/doc-compiler/overlays.mjs +206 -0
  448. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  449. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  450. package/foundation/doc-compiler/read.d.mts +126 -0
  451. package/foundation/doc-compiler/read.mjs +320 -0
  452. package/foundation/doc-compiler/read.test.mjs +313 -0
  453. package/foundation/doc-compiler/source.d.mts +33 -0
  454. package/foundation/doc-compiler/source.mjs +128 -0
  455. package/foundation/fs/module-loader.d.mts +1 -0
  456. package/foundation/fs/module-loader.mjs +50 -1
  457. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  458. package/foundation/fs/path-safety.d.mts +3 -2
  459. package/foundation/fs/path-safety.mjs +49 -19
  460. package/foundation/fs/path-safety.test.mjs +50 -0
  461. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  462. package/foundation/identity/provider-identity.d.mts +90 -0
  463. package/foundation/identity/provider-identity.mjs +320 -0
  464. package/foundation/identity/provider-identity.test.mjs +254 -0
  465. package/foundation/identity/providers.d.mts +7 -0
  466. package/foundation/identity/providers.mjs +16 -0
  467. package/foundation/integrations/autolink.d.mts +58 -1
  468. package/foundation/integrations/autolink.mjs +143 -45
  469. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  470. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  471. package/foundation/integrations/contribution-inventory.d.mts +1 -1
  472. package/foundation/integrations/contribution-inventory.mjs +17 -20
  473. package/foundation/integrations/contribution-inventory.test.mjs +67 -27
  474. package/foundation/integrations/integration-warnings.mjs +6 -0
  475. package/foundation/integrations/integrations.d.mts +49 -2
  476. package/foundation/integrations/integrations.mjs +81 -8
  477. package/foundation/integrations/integrations.test.mjs +384 -1
  478. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  479. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  480. package/foundation/integrations/provider-resolution.d.mts +152 -0
  481. package/foundation/integrations/provider-resolution.mjs +576 -0
  482. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  483. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  484. package/foundation/integrations/theme-descriptor.mjs +44 -0
  485. package/foundation/integrations/validate-contributions.d.mts +2 -0
  486. package/foundation/integrations/validate-contributions.mjs +114 -10
  487. package/foundation/response/base.d.ts +8 -4
  488. package/foundation/response/error-codes.doc.mjs +3 -4
  489. package/foundation/response/error-codes.mjs +2 -2
  490. package/foundation/response/error-codes.test.mjs +83 -0
  491. package/foundation/response/json-contract.test.mjs +57 -17
  492. package/foundation/response/json.d.mts +4 -2
  493. package/foundation/response/json.mjs +8 -10
  494. package/foundation/response/response-types.doc.mjs +16 -11
  495. package/foundation/response/response-types.doc.test.mjs +158 -0
  496. package/foundation/response/response.doc.mjs +1 -1
  497. package/foundation/text/string-utils.mjs +22 -10
  498. package/foundation/xle/expand.d.mts +2 -0
  499. package/foundation/xle/expand.mjs +3 -2
  500. package/foundation/xle/expand.test.mjs +54 -0
  501. package/package.json +9 -11
  502. package/assets/templates/themes/manifest.json +0 -95
  503. package/clients/cli/lib/update-check.mjs +0 -83
  504. package/clients/cli/lib/update-check.test.mjs +0 -137
  505. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -84,6 +84,58 @@ export function checkPeerDeps(ctx: DoctorContext): DoctorCheck;
84
84
  * @returns {DoctorCheck}
85
85
  */
86
86
  export function checkPackageManager(ctx: DoctorContext): DoctorCheck;
87
+ /**
88
+ * Check 6b — every contributing integration owns its provider identity.
89
+ *
90
+ * Artifact and document IDs are provider-scoped, so a package that claims a
91
+ * provider ID an earlier-loaded package already holds is loaded inert: its
92
+ * components, templates, themes, docs, and codemods are withdrawn while the
93
+ * earlier package keeps contributing. That can be a deliberate transition
94
+ * (a renamed package installed beside its predecessor), so it warns rather
95
+ * than fails, but it is never allowed to happen quietly.
96
+ *
97
+ * @param {DoctorContext} ctx
98
+ * @returns {DoctorCheck}
99
+ */
100
+ export function checkProviderIdentity(ctx: DoctorContext): DoctorCheck;
101
+ /**
102
+ * Every authoring self-doc is reachable from `astryx docs authoring`, loads,
103
+ * and fits in one read, and every type `@astryxdesign/cli/authoring` exports
104
+ * has its doc there: the self-doc beside the module that declares it. The
105
+ * audits are imported here, inside the try, so a malformed self-doc is
106
+ * reported rather than taking Doctor down.
107
+ * @param {DoctorContext} [_ctx]
108
+ * @param {{root?: string, sources?: string[], topicKeys?: Set<string> | null}} [options]
109
+ * Another authoring tree, list, or topic index to audit (for tests).
110
+ * @returns {Promise<DoctorCheck>}
111
+ */
112
+ export function checkAuthoringDocs(_ctx?: DoctorContext, options?: {
113
+ root?: string;
114
+ sources?: string[];
115
+ topicKeys?: Set<string> | null;
116
+ }): Promise<DoctorCheck>;
117
+ /**
118
+ * Every command, API function, schema, and enum doc the CLI ships declares a
119
+ * namespace, and the topic that namespace names reads it: `astryx docs cli`
120
+ * for `cli/commands` and `cli/api`, `astryx docs authoring` for `authoring`.
121
+ * @param {DoctorContext | Partial<DoctorContext>} _ctx
122
+ * @param {{root?: string, sources?: string[], authoringSources?: string[]}} [options]
123
+ * test seams: the CLI root, the docs to audit, and the authoring topic's list
124
+ * @returns {Promise<DoctorCheck>}
125
+ */
126
+ export function checkCliDocs(_ctx: DoctorContext | Partial<DoctorContext>, options?: {
127
+ root?: string;
128
+ sources?: string[];
129
+ authoringSources?: string[];
130
+ }): Promise<DoctorCheck>;
131
+ /**
132
+ * Every topic reads progressively, in every language it ships: it loads, its
133
+ * section index and each of its sections fit in one read, and no contributed
134
+ * doc is invalid.
135
+ * @param {DoctorContext | Partial<DoctorContext>} ctx
136
+ * @returns {Promise<DoctorCheck>}
137
+ */
138
+ export function checkDocsProgressiveDisclosure(ctx: DoctorContext | Partial<DoctorContext>): Promise<DoctorCheck>;
87
139
  /**
88
140
  * Run all diagnostic checks and return a structured report.
89
141
  *
@@ -169,9 +221,27 @@ export type DoctorContext = {
169
221
  * read at all.
170
222
  */
171
223
  integrations?: import("../../foundation/integrations/integrations.mjs").LoadedIntegration[] | null | undefined;
224
+ /**
225
+ * - The topics a docs read sees.
226
+ */
227
+ docsCatalog?: DocsCatalog | null | undefined;
228
+ /**
229
+ * `invalid_doc` issues from the project's contributed docs.
230
+ */
231
+ docsCatalogIssues?: {
232
+ package?: string;
233
+ code: string;
234
+ message: string;
235
+ }[] | undefined;
236
+ /**
237
+ * - Why the project's docs catalog
238
+ * could not be built, when it could not.
239
+ */
240
+ docsCatalogError?: string | null | undefined;
172
241
  /**
173
242
  * - Error thrown while resolving the config
174
243
  * path (e.g. multiple config files present), surfaced by checkConfig as a FAIL.
175
244
  */
176
245
  configError?: Error | null | undefined;
177
246
  };
247
+ import { DocsCatalog } from '../../foundation/discovery/docs-discovery.mjs';
@@ -11,6 +11,7 @@ export const doc = {
11
11
  type: 'function',
12
12
  kind: 'api',
13
13
  name: 'doctor',
14
+ namespace: 'cli/api',
14
15
  displayName: 'doctor()',
15
16
  summary: 'Read-only project + environment health check.',
16
17
  description:
@@ -27,6 +27,15 @@ import {MIN_NODE_VERSION, isNodeVersionSupported} from '../../foundation/env/nod
27
27
  import {CLI_ROOT, findCoreDir, findInstalledPackage} from '../../foundation/fs/paths.mjs';
28
28
  import {explainPackageManager, getCliInvocation} from '../../foundation/env/package-manager.mjs';
29
29
  import {findConfigPath, Project} from '../../foundation/config/project.mjs';
30
+ import {DocsCatalog} from '../../foundation/discovery/docs-discovery.mjs';
31
+ import {buildDocsIndexData} from '../../foundation/discovery/docs-section-key.mjs';
32
+ import {
33
+ DOC_OUTPUT_BUDGET_BYTES,
34
+ docsIndexBytes,
35
+ oversizedDocSections,
36
+ } from '../../foundation/discovery/docs-output-budget.mjs';
37
+ import {compileTopic, lowerTopic, overlayLanguages} from '../docs/_adapter.mjs';
38
+ import {detailView, indexView} from '../../foundation/doc-compiler/lenses.mjs';
30
39
  import {semverCompare, isValidSemver, satisfiesRange} from '../../foundation/env/semver.mjs';
31
40
 
32
41
  /**
@@ -52,6 +61,11 @@ import {semverCompare, isValidSemver, satisfiesRange} from '../../foundation/env
52
61
  * @property {import('../../foundation/integrations/integrations.mjs').LoadedIntegration[]|null} [integrations]
53
62
  * Every integration the project loaded, or null when the project could not be
54
63
  * read at all.
64
+ * @property {DocsCatalog|null} [docsCatalog] - The topics a docs read sees.
65
+ * @property {Array<{package?: string, code: string, message: string}>} [docsCatalogIssues]
66
+ * `invalid_doc` issues from the project's contributed docs.
67
+ * @property {string|null} [docsCatalogError] - Why the project's docs catalog
68
+ * could not be built, when it could not.
55
69
  * @property {Error|null} [configError] - Error thrown while resolving the config
56
70
  * path (e.g. multiple config files present), surfaced by checkConfig as a FAIL.
57
71
  */
@@ -627,6 +641,372 @@ export function checkPackageManager(ctx) {
627
641
  };
628
642
  }
629
643
 
644
+ /**
645
+ * Check 6b — every contributing integration owns its provider identity.
646
+ *
647
+ * Artifact and document IDs are provider-scoped, so a package that claims a
648
+ * provider ID an earlier-loaded package already holds is loaded inert: its
649
+ * components, templates, themes, docs, and codemods are withdrawn while the
650
+ * earlier package keeps contributing. That can be a deliberate transition
651
+ * (a renamed package installed beside its predecessor), so it warns rather
652
+ * than fails, but it is never allowed to happen quietly.
653
+ *
654
+ * @param {DoctorContext} ctx
655
+ * @returns {DoctorCheck}
656
+ */
657
+ export function checkProviderIdentity(ctx) {
658
+ const id = 'provider-identity';
659
+ const label = 'Integration provider identity';
660
+
661
+ if (ctx.integrations == null) {
662
+ return {
663
+ id,
664
+ label,
665
+ status: 'info',
666
+ message: 'Skipped — the project configuration could not be read.',
667
+ };
668
+ }
669
+
670
+ const conflicts = ctx.integrations.filter(
671
+ integration => integration.__providerConflict,
672
+ );
673
+ if (conflicts.length > 0) {
674
+ return {
675
+ id,
676
+ label,
677
+ status: 'warn',
678
+ message: conflicts
679
+ .map(integration => integration.__providerConflict?.message)
680
+ .join(' '),
681
+ fix:
682
+ 'Give each integration its own `providerId` in astryx.integration.*. ' +
683
+ "A renamed package may keep its predecessor's ID only when the " +
684
+ 'predecessor is no longer installed.',
685
+ };
686
+ }
687
+
688
+ const count = ctx.integrations.filter(
689
+ integration =>
690
+ integration.providerId != null && integration.__loadError == null,
691
+ ).length;
692
+ if (count === 0) {
693
+ return {
694
+ id,
695
+ label,
696
+ status: 'info',
697
+ message: 'None — no loaded integration has a provider identity.',
698
+ };
699
+ }
700
+ return {
701
+ id,
702
+ label,
703
+ status: 'pass',
704
+ message:
705
+ count === 1
706
+ ? '1 loaded integration has its own provider ID.'
707
+ : `${count} loaded integrations each have their own provider ID.`,
708
+ };
709
+ }
710
+
711
+ /** @param {number} bytes */
712
+ const kilobytes = bytes => `${Math.ceil(bytes / 1024)} KB`;
713
+
714
+ /**
715
+ * @param {string[]} problems
716
+ * @returns {string}
717
+ */
718
+ function joinProblems(problems) {
719
+ return problems.length === 1
720
+ ? problems[0]
721
+ : `${problems.length} problems: ${problems.join('; ')}`;
722
+ }
723
+
724
+ /** How the self-doc audit's problems are fixed. */
725
+ const AUTHORING_DOCS_FIX =
726
+ 'List every authoring self-doc in AUTHORING_SELF_DOCS, fix the one that fails to load, and split a section that is too large.';
727
+
728
+ /** How the public-surface audit's problems are fixed. */
729
+ const AUTHORING_SURFACE_FIX =
730
+ 'Put a self-doc beside each module whose types @astryxdesign/cli/authoring exports and list it in AUTHORING_SELF_DOCS; export what each listed self-doc documents, or remove that self-doc.';
731
+
732
+ /** Types one problem names before it counts the rest. */
733
+ const NAMED_TYPES = 40;
734
+
735
+ /**
736
+ * @param {string[]} names
737
+ * @returns {string}
738
+ */
739
+ function nameTypes(names) {
740
+ return names.length <= NAMED_TYPES
741
+ ? names.join(', ')
742
+ : `${names.slice(0, NAMED_TYPES).join(', ')} and ${names.length - NAMED_TYPES} more`;
743
+ }
744
+
745
+ /**
746
+ * The section keys `astryx docs authoring --index` lists, read the way that
747
+ * command reads them.
748
+ * @returns {Promise<{keys: Set<string>} | {keys: null, error: string}>}
749
+ */
750
+ async function authoringTopicKeys() {
751
+ try {
752
+ const catalog = DocsCatalog.fromBuiltins();
753
+ const entry = catalog.resolve('authoring');
754
+ if (!entry) return {keys: null, error: 'it is not a built-in topic'};
755
+ const index = indexView(await lowerTopic(catalog, entry));
756
+ return {keys: new Set(index.sections.map(section => section.id))};
757
+ } catch (err) {
758
+ return {
759
+ keys: null,
760
+ error: err instanceof Error ? err.message : String(err),
761
+ };
762
+ }
763
+ }
764
+
765
+ /**
766
+ * @param {Awaited<ReturnType<typeof import('../../foundation/discovery/authoring-surface.mjs').auditAuthoringSurface>>} surface
767
+ * @returns {string[]}
768
+ */
769
+ function surfaceProblems(surface) {
770
+ /** @type {string[]} */
771
+ const problems = [];
772
+ if (surface.types === 0 && surface.untraced.length === 0) {
773
+ problems.push(
774
+ '@astryxdesign/cli/authoring exports no types, so nothing was compared with `astryx docs authoring`',
775
+ );
776
+ }
777
+ for (const {module, names, reason, source, key} of surface.unreadable) {
778
+ const why =
779
+ reason === 'no-self-doc'
780
+ ? `no self-doc sits beside ${module}`
781
+ : reason === 'unregistered'
782
+ ? `${source} is not listed in AUTHORING_SELF_DOCS`
783
+ : reason === 'failed'
784
+ ? `${source} does not load`
785
+ : `${source} renders section "${key}", which the topic's index does not list`;
786
+ problems.push(
787
+ `${nameTypes(names)} from ${module} ${names.length === 1 ? 'has' : 'have'} no doc in \`astryx docs authoring\`: ${why}`,
788
+ );
789
+ }
790
+ for (const {name, reason} of surface.untraced) {
791
+ problems.push(
792
+ `${name} cannot be traced to the module that declares it: ${reason}`,
793
+ );
794
+ }
795
+ for (const {source, subject} of surface.unmatched) {
796
+ problems.push(
797
+ subject
798
+ ? `${source} documents ${subject}, which @astryxdesign/cli/authoring does not export`
799
+ : `${source} documents no type @astryxdesign/cli/authoring exports`,
800
+ );
801
+ }
802
+ return problems;
803
+ }
804
+
805
+ /**
806
+ * Every authoring self-doc is reachable from `astryx docs authoring`, loads,
807
+ * and fits in one read, and every type `@astryxdesign/cli/authoring` exports
808
+ * has its doc there: the self-doc beside the module that declares it. The
809
+ * audits are imported here, inside the try, so a malformed self-doc is
810
+ * reported rather than taking Doctor down.
811
+ * @param {DoctorContext} [_ctx]
812
+ * @param {{root?: string, sources?: string[], topicKeys?: Set<string> | null}} [options]
813
+ * Another authoring tree, list, or topic index to audit (for tests).
814
+ * @returns {Promise<DoctorCheck>}
815
+ */
816
+ export async function checkAuthoringDocs(_ctx, options = {}) {
817
+ const id = 'authoring-docs';
818
+ const label = 'Authoring docs';
819
+ try {
820
+ const {auditAuthoringSelfDocs} =
821
+ await import('../../foundation/discovery/authoring-self-docs.mjs');
822
+ const {auditAuthoringSurface} =
823
+ await import('../../foundation/discovery/authoring-surface.mjs');
824
+ const {root, sources} = options;
825
+ const audit = await auditAuthoringSelfDocs({root, sources});
826
+ const problems = [
827
+ ...audit.unreachable.map(
828
+ source => `${source} is not in \`astryx docs authoring\``,
829
+ ),
830
+ ...audit.failed.map(
831
+ ({source, error}) => `${source} failed to load: ${error}`,
832
+ ),
833
+ ...audit.oversized.map(
834
+ ({key, bytes}) =>
835
+ `authoring section "${key}" is ${kilobytes(bytes)}, over the ${kilobytes(DOC_OUTPUT_BUDGET_BYTES)} one read may return`,
836
+ ),
837
+ ];
838
+ const topic =
839
+ options.topicKeys === undefined
840
+ ? await authoringTopicKeys()
841
+ : {keys: options.topicKeys};
842
+ const surface = [
843
+ ...('error' in topic
844
+ ? [`\`astryx docs authoring\` could not be read: ${topic.error}`]
845
+ : []),
846
+ ...surfaceProblems(
847
+ await auditAuthoringSurface({root, sources, topicKeys: topic.keys}),
848
+ ),
849
+ ];
850
+ if (problems.length + surface.length > 0) {
851
+ return {
852
+ id,
853
+ label,
854
+ status: 'fail',
855
+ message: joinProblems([...problems, ...surface]),
856
+ fix: [
857
+ problems.length > 0 ? AUTHORING_DOCS_FIX : null,
858
+ surface.length > 0 ? AUTHORING_SURFACE_FIX : null,
859
+ ]
860
+ .filter(Boolean)
861
+ .join(' '),
862
+ };
863
+ }
864
+ return {
865
+ id,
866
+ label,
867
+ status: 'pass',
868
+ message: `All ${audit.sections} authoring schemas are readable in \`astryx docs authoring\`.`,
869
+ };
870
+ } catch (err) {
871
+ return {
872
+ id,
873
+ label,
874
+ status: 'fail',
875
+ message: `The authoring docs could not be audited: ${err instanceof Error ? err.message : String(err)}`,
876
+ fix: 'Reinstall @astryxdesign/cli.',
877
+ };
878
+ }
879
+ }
880
+
881
+ /** How the CLI-docs audit's problems are fixed. */
882
+ const CLI_DOCS_FIX =
883
+ "Set `namespace` on each CLI doc to the one that reads it: cli/commands for a command, cli/api for an API function or the output schema, error codes, and response types, and authoring for a file an author writes (and list it in AUTHORING_SELF_DOCS).";
884
+
885
+ /**
886
+ * Every command, API function, schema, and enum doc the CLI ships declares a
887
+ * namespace, and the topic that namespace names reads it: `astryx docs cli`
888
+ * for `cli/commands` and `cli/api`, `astryx docs authoring` for `authoring`.
889
+ * @param {DoctorContext | Partial<DoctorContext>} _ctx
890
+ * @param {{root?: string, sources?: string[], authoringSources?: string[]}} [options]
891
+ * test seams: the CLI root, the docs to audit, and the authoring topic's list
892
+ * @returns {Promise<DoctorCheck>}
893
+ */
894
+ export async function checkCliDocs(_ctx, options = {}) {
895
+ const id = 'cli-docs';
896
+ const label = 'CLI docs';
897
+ try {
898
+ const {auditCliSelfDocs} =
899
+ await import('../../foundation/discovery/cli-self-docs.mjs');
900
+ const audit = await auditCliSelfDocs(options);
901
+ const problems = [
902
+ ...audit.missing.map(
903
+ source =>
904
+ `${source} has no namespace, so no \`astryx docs\` topic reads it`,
905
+ ),
906
+ ...audit.unknown.map(
907
+ ({source, namespace}) =>
908
+ `${source} has namespace "${namespace}", which no \`astryx docs\` topic reads`,
909
+ ),
910
+ ...audit.misfiled.map(({message}) => message),
911
+ ...audit.failed.map(
912
+ ({source, error}) => `${source} failed to load: ${error}`,
913
+ ),
914
+ ...audit.keyProblems.map(problem => `\`astryx docs cli\`: ${problem}`),
915
+ ...audit.oversized.map(
916
+ ({key, bytes}) =>
917
+ `cli section "${key}" is ${kilobytes(bytes)}, over the ${kilobytes(DOC_OUTPUT_BUDGET_BYTES)} one read may return`,
918
+ ),
919
+ ];
920
+ if (problems.length > 0) {
921
+ return {
922
+ id,
923
+ label,
924
+ status: 'fail',
925
+ message: joinProblems(problems),
926
+ fix: CLI_DOCS_FIX,
927
+ };
928
+ }
929
+ return {
930
+ id,
931
+ label,
932
+ status: 'pass',
933
+ message: `All ${audit.docs} CLI docs are readable: ${audit.sections} in \`astryx docs cli\` and ${audit.authoring} in \`astryx docs authoring\`.`,
934
+ };
935
+ } catch (err) {
936
+ return {
937
+ id,
938
+ label,
939
+ status: 'fail',
940
+ message: `The CLI docs could not be audited: ${err instanceof Error ? err.message : String(err)}`,
941
+ fix: 'Reinstall @astryxdesign/cli.',
942
+ };
943
+ }
944
+ }
945
+
946
+ /**
947
+ * Every topic reads progressively, in every language it ships: it loads, its
948
+ * section index and each of its sections fit in one read, and no contributed
949
+ * doc is invalid.
950
+ * @param {DoctorContext | Partial<DoctorContext>} ctx
951
+ * @returns {Promise<DoctorCheck>}
952
+ */
953
+ export async function checkDocsProgressiveDisclosure(ctx) {
954
+ const id = 'docs-progressive-disclosure';
955
+ const label = 'Documentation navigation and size';
956
+ const budget = kilobytes(DOC_OUTPUT_BUDGET_BYTES);
957
+ /** @type {string[]} */
958
+ const problems = [];
959
+ if (ctx.docsCatalogError) {
960
+ problems.push(`The docs catalog could not be built: ${ctx.docsCatalogError}`);
961
+ }
962
+ for (const issue of ctx.docsCatalogIssues ?? []) {
963
+ problems.push(`${issue.package ?? 'a contributed doc'}: ${issue.message}`);
964
+ }
965
+ let topics = 0;
966
+ const catalog = ctx.docsCatalog;
967
+ if (catalog) {
968
+ for (const entry of catalog.entries()) {
969
+ for (const lang of [null, ...overlayLanguages(entry)]) {
970
+ const where = lang ? `${entry.name} [${lang}]` : entry.name;
971
+ try {
972
+ const doc = detailView(await compileTopic(catalog, entry, lang));
973
+ if (lang == null) topics += 1;
974
+ const indexBytes = docsIndexBytes(buildDocsIndexData(doc));
975
+ if (indexBytes > DOC_OUTPUT_BUDGET_BYTES) {
976
+ problems.push(
977
+ `${where}: its section index is ${kilobytes(indexBytes)}, over the ${budget} one read may return`,
978
+ );
979
+ }
980
+ for (const over of oversizedDocSections(doc.sections)) {
981
+ problems.push(
982
+ `${where} ${over.key}: ${kilobytes(over.bytes)}, over the ${budget} one read may return`,
983
+ );
984
+ }
985
+ } catch (err) {
986
+ problems.push(
987
+ `${where}: ${err instanceof Error ? err.message : String(err)}`,
988
+ );
989
+ }
990
+ }
991
+ }
992
+ }
993
+ if (problems.length > 0) {
994
+ return {
995
+ id,
996
+ label,
997
+ status: 'fail',
998
+ message: joinProblems(problems),
999
+ fix: 'Fix the doc each problem names; split a section that is too large into smaller ones, each with its own key.',
1000
+ };
1001
+ }
1002
+ return {
1003
+ id,
1004
+ label,
1005
+ status: 'pass',
1006
+ message: `${topics} topics: every section index and section fits in one ${budget} read.`,
1007
+ };
1008
+ }
1009
+
630
1010
  /**
631
1011
  * Ordered list of synchronous check functions. Append here to add a check.
632
1012
  * (checkConfig is async and is awaited separately by {@link runChecks}.)
@@ -638,6 +1018,7 @@ export const SYNC_CHECKS = [
638
1018
  checkVersionAlignment,
639
1019
  checkThemes,
640
1020
  checkImplicitIntegrations,
1021
+ checkProviderIdentity,
641
1022
  checkAgentDocs,
642
1023
  checkPeerDeps,
643
1024
  checkPackageManager,
@@ -669,11 +1050,28 @@ export async function runChecks(options = {}) {
669
1050
  let configTheme = null;
670
1051
  /** @type {import('../../foundation/integrations/integrations.mjs').LoadedIntegration[]|null} */
671
1052
  let integrations = null;
1053
+ // A docs read falls back to the built-in topics when the project cannot be
1054
+ // read, so the docs checks do too; the config check reports the config.
1055
+ /** @type {DocsCatalog|null} */
1056
+ let docsCatalog = DocsCatalog.fromBuiltins();
1057
+ /** @type {Array<{package?: string, code: string, message: string}>} */
1058
+ let docsCatalogIssues = [];
1059
+ /** @type {string|null} */
1060
+ let docsCatalogError = null;
672
1061
  try {
673
1062
  const project = await Project.load(cwd);
674
1063
  configTheme =
675
1064
  /** @type {{theme?: string}} */ (project.config ?? {}).theme ?? null;
676
1065
  integrations = project.loadedIntegrations;
1066
+ try {
1067
+ docsCatalog = await project.docs();
1068
+ docsCatalogIssues = (await project.issues()).filter(
1069
+ issue => issue.code === 'invalid_doc',
1070
+ );
1071
+ } catch (err) {
1072
+ docsCatalog = null;
1073
+ docsCatalogError = err instanceof Error ? err.message : String(err);
1074
+ }
677
1075
  } catch {
678
1076
  // Best-effort: a missing/invalid config leaves configTheme null.
679
1077
  }
@@ -686,6 +1084,9 @@ export async function runChecks(options = {}) {
686
1084
  configPath,
687
1085
  configTheme,
688
1086
  integrations,
1087
+ docsCatalog,
1088
+ docsCatalogIssues,
1089
+ docsCatalogError,
689
1090
  configError,
690
1091
  };
691
1092
 
@@ -698,6 +1099,9 @@ export async function runChecks(options = {}) {
698
1099
  checks.push(await checkConfig(ctx));
699
1100
  }
700
1101
  }
1102
+ checks.push(await checkAuthoringDocs(ctx));
1103
+ checks.push(await checkCliDocs(ctx));
1104
+ checks.push(await checkDocsProgressiveDisclosure(ctx));
701
1105
 
702
1106
  const summary = {pass: 0, warn: 0, fail: 0, info: 0};
703
1107
  for (const c of checks) summary[c.status] += 1;