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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/README.md +114 -77
  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 +35 -1
  6. package/api/build/build.type.mjs +24 -3
  7. package/api/build/help/help.d.mts +8 -5
  8. package/api/build/help/help.mjs +56 -6
  9. package/api/component/_adapter.d.mts +6 -12
  10. package/api/component/_adapter.mjs +20 -10
  11. package/api/component/component.doc.mjs +13 -3
  12. package/api/component/component.mjs +91 -14
  13. package/api/component/component.test.mjs +38 -0
  14. package/api/component/component.type.d.mts +16 -5
  15. package/api/component/component.type.mjs +13 -5
  16. package/api/component/detail/blocks/blocks.d.mts +2 -1
  17. package/api/component/detail/blocks/blocks.mjs +4 -3
  18. package/api/component/list/list.d.mts +0 -5
  19. package/api/component/list/list.mjs +40 -11
  20. package/api/discover/discover.doc.mjs +2 -1
  21. package/api/docs/_adapter.d.mts +210 -34
  22. package/api/docs/_adapter.mjs +674 -134
  23. package/api/docs/detail/detail.mjs +11 -3
  24. package/api/docs/detail/section/section.mjs +24 -13
  25. package/api/docs/detail/section/section.test.mjs +15 -6
  26. package/api/docs/docs.d.mts +5 -3
  27. package/api/docs/docs.doc.mjs +36 -15
  28. package/api/docs/docs.mjs +44 -8
  29. package/api/docs/docs.test.mjs +158 -4
  30. package/api/docs/docs.type.d.mts +165 -2
  31. package/api/docs/docs.type.mjs +101 -3
  32. package/api/docs/index/index.mjs +11 -3
  33. package/api/docs/index/index.test.mjs +1 -1
  34. package/api/docs/integration-tree.test.mjs +547 -0
  35. package/api/docs/integrationDocs.test.mjs +14 -14
  36. package/api/docs/list/list.mjs +28 -12
  37. package/api/docs/node/node.d.mts +43 -0
  38. package/api/docs/node/node.mjs +192 -0
  39. package/api/doctor/doctor.d.mts +54 -4
  40. package/api/doctor/doctor.doc.mjs +1 -0
  41. package/api/doctor/doctor.mjs +327 -16
  42. package/api/doctor/doctor.test.mjs +420 -7
  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/list/list.d.mts +1 -1
  47. package/api/hook/list/list.mjs +69 -17
  48. package/api/index.d.mts +1 -1
  49. package/api/index.mjs +1 -0
  50. package/api/init/init.doc.mjs +6 -1
  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.d.mts +2 -1
  56. package/api/integration/add-contribution.mjs +125 -12
  57. package/api/integration/add-contribution.test.mjs +254 -3
  58. package/api/integration/add-theme.mjs +34 -64
  59. package/api/integration/add-theme.test.mjs +105 -21
  60. package/api/integration/authoring-checks.mjs +108 -31
  61. package/api/integration/authoring-checks.test.mjs +171 -6
  62. package/api/integration/authoring-checks.type.d.mts +3 -1
  63. package/api/integration/authoring-checks.type.mjs +3 -1
  64. package/api/integration/integration-authoring.type.d.mts +2 -0
  65. package/api/integration/integration-authoring.type.mjs +2 -0
  66. package/api/integration/integration-block-exports.test.mjs +10 -6
  67. package/api/integration/integrationAdd.doc.mjs +14 -4
  68. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  69. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  70. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  71. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  72. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  73. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  74. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  75. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  76. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  77. package/api/integration/integrationTemplateConflicts.doc.mjs +7 -5
  78. package/api/integration/pack-check.mjs +34 -0
  79. package/api/integration/pack-check.test.mjs +138 -47
  80. package/api/integration/pack-check.type.d.mts +26 -2
  81. package/api/integration/pack-check.type.mjs +14 -1
  82. package/api/integration/summarizeIssues.doc.mjs +1 -0
  83. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  84. package/api/integration/validate-integration.mjs +52 -102
  85. package/api/integration/validate-integration.test.mjs +179 -26
  86. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  87. package/api/integration/validateIntegration.doc.mjs +3 -2
  88. package/api/json/assertResponse.doc.mjs +1 -0
  89. package/api/json/envelope-types.test.mjs +76 -0
  90. package/api/json/index.ts +2 -0
  91. package/api/json/isError.doc.mjs +1 -0
  92. package/api/json/parseResponse.doc.mjs +3 -2
  93. package/api/layout/_adapter.mjs +20 -5
  94. package/api/layout/expand/expand.mjs +7 -5
  95. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  96. package/api/layout/grammar/grammar.mjs +2 -1
  97. package/api/layout/layoutCheck.doc.mjs +1 -0
  98. package/api/layout/layoutExpand.doc.mjs +2 -1
  99. package/api/layout/layoutGrammar.doc.mjs +1 -0
  100. package/api/search/search-return-type.test.mjs +54 -0
  101. package/api/search/search.d.mts +28 -10
  102. package/api/search/search.doc.mjs +8 -2
  103. package/api/search/search.mjs +334 -38
  104. package/api/search/search.test.mjs +124 -1
  105. package/api/search/search.type.d.mts +13 -1
  106. package/api/search/search.type.mjs +4 -1
  107. package/api/swizzle/copy/copy.mjs +28 -11
  108. package/api/swizzle/swizzle.doc.mjs +2 -1
  109. package/api/template/copy/copy.mjs +17 -23
  110. package/api/template/copy/copy.test.mjs +17 -0
  111. package/api/template/list/list.mjs +1 -0
  112. package/api/template/template-integration.test.mjs +1022 -3
  113. package/api/template/template-suffix.test.mjs +41 -21
  114. package/api/template/template.doc.mjs +30 -8
  115. package/api/template/template.mjs +45 -8
  116. package/api/template/template.type.d.mts +6 -8
  117. package/api/template/template.type.mjs +3 -2
  118. package/api/theme/_adapter.d.mts +2 -3
  119. package/api/theme/_adapter.mjs +4 -5
  120. package/api/theme/add/add.binary.test.mjs +84 -0
  121. package/api/theme/add/add.mjs +20 -3
  122. package/api/theme/add/add.staging.test.mjs +66 -0
  123. package/api/theme/add/add.test.mjs +14 -1
  124. package/api/theme/build/build.mjs +114 -37
  125. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  126. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  127. package/api/theme/build/font-warning.mjs +3 -3
  128. package/api/theme/build/font-warning.test.mjs +5 -2
  129. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  130. package/api/theme/integration-themes.test.mjs +39 -28
  131. package/api/theme/list/list.test.mjs +19 -20
  132. package/api/theme/listThemes.doc.mjs +6 -5
  133. package/api/theme/palette/generate/generate.mjs +7 -2
  134. package/api/theme/palette/generate/generate.test.mjs +96 -0
  135. package/api/theme/palette/generate/generator.mjs +8 -1
  136. package/api/theme/palette/generate/generator.test.mjs +10 -0
  137. package/api/theme/template/template.mjs +11 -2
  138. package/api/theme/template/template.test.mjs +20 -0
  139. package/api/theme/themeAdd.doc.mjs +4 -3
  140. package/api/theme/themeBuild.doc.mjs +8 -4
  141. package/api/theme/themeList.doc.mjs +6 -3
  142. package/api/theme/themeListAvailable.doc.mjs +5 -3
  143. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  144. package/api/theme/themeTargets.doc.mjs +1 -0
  145. package/api/theme/themeTemplate.doc.mjs +6 -2
  146. package/api/upgrade/_adapter.d.mts +32 -5
  147. package/api/upgrade/_adapter.mjs +124 -73
  148. package/api/upgrade/list/list.mjs +2 -1
  149. package/api/upgrade/list/list.test.mjs +73 -0
  150. package/api/upgrade/provider-agreement.test.mjs +152 -0
  151. package/api/upgrade/run/run.mjs +356 -59
  152. package/api/upgrade/status/status.mjs +2 -2
  153. package/api/upgrade/upgrade.doc.mjs +8 -2
  154. package/api/upgrade/upgrade.type.d.mts +38 -0
  155. package/api/upgrade/upgrade.type.mjs +16 -0
  156. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  157. package/assets/codemods/integration-discovery.mjs +8 -2
  158. package/assets/codemods/integration-discovery.test.mjs +15 -0
  159. package/assets/codemods/integration-runner.mjs +56 -4
  160. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  161. package/assets/codemods/run-codemod.mjs +177 -34
  162. package/assets/codemods/runner.mjs +350 -102
  163. package/assets/codemods/term-log.mjs +32 -8
  164. package/assets/codemods/term-log.test.mjs +19 -1
  165. package/assets/codemods/transform-prop.mjs +109 -0
  166. package/assets/codemods/transform-prop.test.mjs +95 -0
  167. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  168. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  169. package/assets/codemods/transforms/next/index.mjs +19 -1
  170. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  171. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  172. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  173. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  174. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  175. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  176. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  177. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  178. package/assets/docs/getting-started.doc.mjs +2 -2
  179. package/assets/docs/principles.doc.mjs +6 -6
  180. package/assets/docs/styling-libraries.doc.mjs +2 -2
  181. package/assets/docs/styling.doc.mjs +4 -4
  182. package/assets/docs/theme.doc.mjs +4 -4
  183. package/assets/docs/tokens.doc.mjs +1 -1
  184. package/assets/docs/tree/api.doc.mjs +30 -0
  185. package/assets/docs/tree/cli.doc.mjs +23 -0
  186. package/assets/docs/tree/commands.doc.mjs +25 -0
  187. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +66 -38
  188. package/assets/docs/tree/integrations.test.mjs +62 -0
  189. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  190. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  191. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  192. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  193. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  194. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  195. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  196. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  197. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  198. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  199. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  200. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  201. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  202. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  203. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  204. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  205. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  206. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  207. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  208. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  209. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  210. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  211. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  212. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  213. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  214. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  215. package/authoring/codemod/codemod.doc.mjs +1 -1
  216. package/authoring/codemod/type.ts +12 -0
  217. package/authoring/config/config.doc.mjs +2 -2
  218. package/authoring/config/debug-composition.test.mjs +92 -0
  219. package/authoring/config/type.ts +15 -3
  220. package/authoring/debug/debug.doc.d.mts +11 -0
  221. package/authoring/debug/debug.doc.mjs +182 -0
  222. package/authoring/debug/parse.d.mts +3 -3
  223. package/authoring/doctypes/_schema.d.mts +71 -141
  224. package/authoring/doctypes/_schema.mjs +29 -2
  225. package/authoring/doctypes/base/graph-fields.doc.mjs +8 -6
  226. package/authoring/doctypes/base/type.ts +6 -5
  227. package/authoring/doctypes/command/command.doc.mjs +1 -1
  228. package/authoring/doctypes/command/type.ts +2 -2
  229. package/authoring/doctypes/component/type.ts +2 -2
  230. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  231. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  232. package/authoring/doctypes/enum/type.ts +1 -1
  233. package/authoring/doctypes/function/function.doc.mjs +3 -2
  234. package/authoring/doctypes/function/type.ts +3 -2
  235. package/authoring/doctypes/hook/type.ts +2 -2
  236. package/authoring/doctypes/load-contract.test.mjs +3 -2
  237. package/authoring/doctypes/namespace/namespace.doc.mjs +6 -10
  238. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  239. package/authoring/doctypes/namespace/type.ts +5 -2
  240. package/authoring/doctypes/parse.d.mts +4 -2
  241. package/authoring/doctypes/parse.mjs +10 -5
  242. package/authoring/doctypes/reference/reference.doc.mjs +7 -5
  243. package/authoring/doctypes/reference/type.ts +12 -10
  244. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  245. package/authoring/doctypes/schema/type.ts +1 -2
  246. package/authoring/doctypes/template/parse.d.mts +2 -0
  247. package/authoring/doctypes/template/parse.mjs +4 -0
  248. package/authoring/doctypes/template/parse.test.mjs +18 -0
  249. package/authoring/doctypes/template/template.doc.mjs +9 -3
  250. package/authoring/doctypes/template/type.ts +8 -0
  251. package/authoring/doctypes/theme/parse.d.mts +35 -0
  252. package/authoring/doctypes/theme/parse.mjs +76 -0
  253. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  254. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  255. package/authoring/doctypes/theme/type.ts +42 -0
  256. package/authoring/doctypes/types.ts +2 -1
  257. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  258. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  259. package/authoring/identity/identity.doc.mjs +2 -2
  260. package/authoring/index.d.mts +1 -0
  261. package/authoring/index.d.ts +7 -4
  262. package/authoring/index.mjs +2 -1
  263. package/authoring/integration/integration.doc.mjs +2 -2
  264. package/authoring/integration/type.ts +4 -10
  265. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  266. package/clients/cli/command-load-failure.test.mjs +83 -0
  267. package/clients/cli/commands/blog.doc.mjs +1 -1
  268. package/clients/cli/commands/blog.mjs +23 -8
  269. package/clients/cli/commands/blog.test.mjs +42 -1
  270. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  271. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  272. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  273. package/clients/cli/commands/build-theme.mjs +16 -50
  274. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  275. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  276. package/clients/cli/commands/build.doc.mjs +5 -2
  277. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  278. package/clients/cli/commands/build.mjs +37 -49
  279. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  280. package/clients/cli/commands/build.text-fields.test.mjs +40 -0
  281. package/clients/cli/commands/component/index.mjs +3 -8
  282. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  283. package/clients/cli/commands/component-package.test.mjs +46 -0
  284. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  285. package/clients/cli/commands/component.doc.mjs +1 -1
  286. package/clients/cli/commands/component.test.mjs +19 -0
  287. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  288. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  289. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  290. package/clients/cli/commands/discover.doc.mjs +5 -3
  291. package/clients/cli/commands/discover.mjs +4 -4
  292. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  293. package/clients/cli/commands/docs.doc.mjs +21 -9
  294. package/clients/cli/commands/docs.mjs +182 -68
  295. package/clients/cli/commands/docs.test.mjs +120 -16
  296. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  297. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  298. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  299. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  300. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  301. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  302. package/clients/cli/commands/doctor-integration.test.mjs +83 -8
  303. package/clients/cli/commands/doctor.doc.mjs +1 -1
  304. package/clients/cli/commands/doctor.mjs +30 -25
  305. package/clients/cli/commands/doctor.test.mjs +42 -0
  306. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  307. package/clients/cli/commands/gap-report.test.mjs +72 -0
  308. package/clients/cli/commands/hook/index.mjs +7 -17
  309. package/clients/cli/commands/hook.doc.mjs +1 -1
  310. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  311. package/clients/cli/commands/init.doc.mjs +20 -9
  312. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  313. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  314. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  315. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  316. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  317. package/clients/cli/commands/integration.doc.mjs +1 -1
  318. package/clients/cli/commands/integration.mjs +1 -0
  319. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  320. package/clients/cli/commands/json-contract.test.mjs +33 -0
  321. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  322. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  323. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  324. package/clients/cli/commands/layout.doc.mjs +3 -3
  325. package/clients/cli/commands/layout.mjs +21 -9
  326. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  327. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  328. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  329. package/clients/cli/commands/manifest.doc.mjs +1 -1
  330. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  331. package/clients/cli/commands/search.doc.mjs +7 -4
  332. package/clients/cli/commands/search.mjs +28 -9
  333. package/clients/cli/commands/search.test.mjs +75 -0
  334. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  335. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  336. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  337. package/clients/cli/commands/template.doc.mjs +52 -13
  338. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  339. package/clients/cli/commands/template.mjs +4 -91
  340. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  341. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  342. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  343. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  344. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  345. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  346. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  347. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  348. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  349. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  350. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  351. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  352. package/clients/cli/commands/theme.doc.mjs +1 -1
  353. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  354. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  355. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  356. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  357. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  358. package/clients/cli/commands/upgrade.mjs +29 -7
  359. package/clients/cli/formatters/index.mjs +2 -0
  360. package/clients/cli/formatters/index.test.mjs +6 -0
  361. package/clients/cli/index.mjs +21 -30
  362. package/clients/cli/latest-version-env.test.mjs +50 -0
  363. package/clients/cli/lib/cli-error.test.mjs +7 -0
  364. package/clients/cli/lib/component-format.mjs +9 -9
  365. package/clients/cli/lib/component-format.test.mjs +1 -1
  366. package/clients/cli/lib/define-command.mjs +32 -6
  367. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  368. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  369. package/clients/cli/lib/hook-format.mjs +19 -10
  370. package/clients/cli/lib/json-shim.mjs +38 -2
  371. package/clients/cli/lib/json-shim.test.mjs +83 -0
  372. package/clients/cli/lib/manifest.d.ts +2 -0
  373. package/clients/cli/lib/manifest.mjs +31 -2
  374. package/clients/cli/lib/manifest.test.mjs +17 -0
  375. package/foundation/agent-docs/agent-docs.d.mts +4 -0
  376. package/foundation/agent-docs/agent-docs.mjs +70 -3
  377. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  378. package/foundation/agent-docs/agent-docs.test.mjs +10 -1
  379. package/foundation/config/integration-debug.test.mjs +28 -3
  380. package/foundation/config/project-themes.test.mjs +11 -19
  381. package/foundation/config/project.d.mts +20 -11
  382. package/foundation/config/project.mjs +246 -89
  383. package/foundation/config/project.test.mjs +270 -21
  384. package/foundation/discovery/authoring-self-docs.d.mts +6 -0
  385. package/foundation/discovery/authoring-self-docs.mjs +17 -7
  386. package/foundation/discovery/authoring-self-docs.test.mjs +20 -9
  387. package/foundation/discovery/authoring-surface.d.mts +74 -0
  388. package/foundation/discovery/authoring-surface.mjs +525 -0
  389. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  390. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  391. package/foundation/discovery/cli-self-docs.mjs +490 -0
  392. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  393. package/foundation/discovery/component-discovery.d.mts +38 -0
  394. package/foundation/discovery/component-discovery.mjs +48 -0
  395. package/foundation/discovery/component-loader.d.mts +35 -38
  396. package/foundation/discovery/component-loader.mjs +53 -222
  397. package/foundation/discovery/docs-discovery.d.mts +108 -10
  398. package/foundation/discovery/docs-discovery.mjs +191 -30
  399. package/foundation/discovery/docs-discovery.test.mjs +71 -32
  400. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  401. package/foundation/discovery/docs-output-budget.mjs +1 -1
  402. package/foundation/discovery/docs-section-key.d.mts +28 -10
  403. package/foundation/discovery/docs-section-key.mjs +134 -33
  404. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  405. package/foundation/discovery/template-adapter.d.mts +113 -11
  406. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  407. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  408. package/foundation/discovery/template-adapter.mjs +772 -82
  409. package/foundation/discovery/template-adapter.test.mjs +57 -0
  410. package/foundation/discovery/theme-discovery.d.mts +67 -7
  411. package/foundation/discovery/theme-discovery.mjs +916 -186
  412. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  413. package/foundation/doc-compiler/bundle.d.mts +47 -0
  414. package/foundation/doc-compiler/bundle.mjs +278 -0
  415. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  416. package/foundation/doc-compiler/compile.d.mts +220 -39
  417. package/foundation/doc-compiler/compile.mjs +311 -15
  418. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  419. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  420. package/foundation/doc-compiler/doc-compiler.test.mjs +28 -1
  421. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  422. package/foundation/doc-compiler/import.d.mts +24 -0
  423. package/foundation/doc-compiler/import.mjs +59 -0
  424. package/foundation/doc-compiler/inputs.d.mts +102 -0
  425. package/foundation/doc-compiler/inputs.mjs +291 -0
  426. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  427. package/foundation/doc-compiler/ir.d.mts +13 -0
  428. package/foundation/doc-compiler/ir.mjs +196 -12
  429. package/foundation/doc-compiler/lenses.d.mts +3 -2
  430. package/foundation/doc-compiler/lenses.mjs +2 -1
  431. package/foundation/doc-compiler/links.d.mts +135 -0
  432. package/foundation/doc-compiler/links.mjs +253 -0
  433. package/foundation/doc-compiler/links.test.mjs +139 -0
  434. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  435. package/foundation/doc-compiler/overlays.d.mts +37 -0
  436. package/foundation/doc-compiler/overlays.mjs +206 -0
  437. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  438. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  439. package/foundation/doc-compiler/read.d.mts +127 -0
  440. package/foundation/doc-compiler/read.mjs +325 -0
  441. package/foundation/doc-compiler/read.test.mjs +313 -0
  442. package/foundation/doc-compiler/source.d.mts +33 -0
  443. package/foundation/doc-compiler/source.mjs +128 -0
  444. package/foundation/doc-compiler/tree.d.mts +288 -0
  445. package/foundation/doc-compiler/tree.mjs +876 -0
  446. package/foundation/doc-compiler/tree.test.mjs +598 -0
  447. package/foundation/fs/file-protection.d.mts +33 -0
  448. package/foundation/fs/file-protection.mjs +825 -0
  449. package/foundation/fs/file-protection.test.mjs +250 -0
  450. package/foundation/fs/module-loader.d.mts +1 -0
  451. package/foundation/fs/module-loader.mjs +50 -1
  452. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  453. package/foundation/fs/path-safety.d.mts +3 -2
  454. package/foundation/fs/path-safety.mjs +49 -19
  455. package/foundation/fs/path-safety.test.mjs +50 -0
  456. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  457. package/foundation/integrations/autolink.d.mts +58 -1
  458. package/foundation/integrations/autolink.mjs +143 -52
  459. package/foundation/integrations/autolink.test.mjs +1 -1
  460. package/foundation/integrations/cli-requirement.d.mts +45 -0
  461. package/foundation/integrations/cli-requirement.mjs +154 -0
  462. package/foundation/integrations/cli-requirement.test.mjs +109 -0
  463. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  464. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  465. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  466. package/foundation/integrations/contribution-inventory.mjs +27 -24
  467. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  468. package/foundation/integrations/integration-warnings.d.mts +9 -2
  469. package/foundation/integrations/integration-warnings.mjs +51 -26
  470. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  471. package/foundation/integrations/integrations.d.mts +3 -0
  472. package/foundation/integrations/integrations.mjs +11 -97
  473. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  474. package/foundation/integrations/provider-resolution.d.mts +152 -0
  475. package/foundation/integrations/provider-resolution.mjs +576 -0
  476. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  477. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  478. package/foundation/integrations/theme-descriptor.mjs +44 -0
  479. package/foundation/integrations/validate-contributions.mjs +121 -29
  480. package/foundation/response/base.d.ts +8 -4
  481. package/foundation/response/error-codes.d.mts +3 -1
  482. package/foundation/response/error-codes.d.ts +2 -0
  483. package/foundation/response/error-codes.doc.mjs +13 -4
  484. package/foundation/response/error-codes.mjs +8 -2
  485. package/foundation/response/error-codes.test.mjs +137 -10
  486. package/foundation/response/json-contract.test.mjs +11 -0
  487. package/foundation/response/json.d.mts +4 -2
  488. package/foundation/response/json.mjs +8 -10
  489. package/foundation/response/response-types.doc.mjs +22 -17
  490. package/foundation/response/response-types.doc.test.mjs +158 -0
  491. package/foundation/response/response.doc.mjs +1 -1
  492. package/foundation/text/string-utils.mjs +22 -10
  493. package/foundation/xle/expand.d.mts +2 -0
  494. package/foundation/xle/expand.mjs +4 -3
  495. package/foundation/xle/expand.test.mjs +54 -0
  496. package/foundation/xle/xle.test.mjs +13 -0
  497. package/package.json +10 -9
  498. package/assets/templates/themes/manifest.json +0 -95
  499. package/clients/cli/lib/update-check.mjs +0 -83
  500. package/clients/cli/lib/update-check.test.mjs +0 -137
  501. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -34,8 +34,17 @@ import {
34
34
  docsIndexBytes,
35
35
  oversizedDocSections,
36
36
  } from '../../foundation/discovery/docs-output-budget.mjs';
37
- import {compileTopic, overlayLanguages} from '../docs/_adapter.mjs';
38
- import {detailView} from '../../foundation/doc-compiler/lenses.mjs';
37
+ import {
38
+ builtinCatalog,
39
+ compileTopic,
40
+ docsLinkProblems,
41
+ guideEntry,
42
+ lowerTopic,
43
+ overlayLanguages,
44
+ projectTree,
45
+ } from '../docs/_adapter.mjs';
46
+ import {typedEdges} from '../docs/node/node.mjs';
47
+ import {detailView, indexView} from '../../foundation/doc-compiler/lenses.mjs';
39
48
  import {semverCompare, isValidSemver, satisfiesRange} from '../../foundation/env/semver.mjs';
40
49
 
41
50
  /**
@@ -66,6 +75,8 @@ import {semverCompare, isValidSemver, satisfiesRange} from '../../foundation/env
66
75
  * `invalid_doc` issues from the project's contributed docs.
67
76
  * @property {string|null} [docsCatalogError] - Why the project's docs catalog
68
77
  * could not be built, when it could not.
78
+ * @property {Array<{package: string, code: string, severity: 'warning'|'error', message: string}>|null} [integrationIssues]
79
+ * Combined project-level integration issues, including cross-package template replacement warnings.
69
80
  * @property {Error|null} [configError] - Error thrown while resolving the config
70
81
  * path (e.g. multiple config files present), surfaced by checkConfig as a FAIL.
71
82
  */
@@ -585,7 +596,45 @@ export function checkPeerDeps(ctx) {
585
596
  }
586
597
 
587
598
  /**
588
- * Check 9 — report the detected package manager, and say so when the project's
599
+ * Summarize the combined integration graph, including cross-package warnings.
600
+ * @param {DoctorContext} ctx
601
+ * @returns {DoctorCheck}
602
+ */
603
+ export function checkIntegrationIssues(ctx) {
604
+ const issues = ctx.integrationIssues;
605
+ if (issues == null) {
606
+ return {
607
+ id: 'integration-issues',
608
+ label: 'Integration contributions',
609
+ status: 'info',
610
+ message: 'Skipped — the project integration graph could not be loaded.',
611
+ };
612
+ }
613
+ if (issues.length === 0) {
614
+ return {
615
+ id: 'integration-issues',
616
+ label: 'Integration contributions',
617
+ status: 'pass',
618
+ message: 'Integration contributions and cross-package relationships are valid.',
619
+ };
620
+ }
621
+ const errors = issues.filter(issue => issue.severity === 'error').length;
622
+ const details = issues
623
+ .map(issue => `${issue.package}: ${issue.message}`)
624
+ .join(' | ');
625
+ // This check is new, so it warns: a project that passed before keeps
626
+ // passing (spec:AST-046 FR8). `astryx doctor integration` fails on errors.
627
+ return {
628
+ id: 'integration-issues',
629
+ label: 'Integration contributions',
630
+ status: 'warn',
631
+ message: `${issues.length} integration issue(s)${errors > 0 ? `, ${errors} of them errors` : ''}: ${details}`,
632
+ fix: 'Run `astryx doctor integration` for package-specific diagnostics and resolve cross-package precedence in astryx.config.',
633
+ };
634
+ }
635
+
636
+ /**
637
+ * Check 10 — report the detected package manager, and say so when the project's
589
638
  * own declaration disagrees with what is on disk.
590
639
  *
591
640
  * Two states are worth surfacing rather than guessing past, because in both the
@@ -721,38 +770,144 @@ function joinProblems(problems) {
721
770
  : `${problems.length} problems: ${problems.join('; ')}`;
722
771
  }
723
772
 
773
+ /** How the self-doc audit's problems are fixed. */
774
+ const AUTHORING_DOCS_FIX =
775
+ 'List every authoring self-doc in AUTHORING_SELF_DOCS, fix the one that fails to load, and split a section that is too large.';
776
+
777
+ /** How the public-surface audit's problems are fixed. */
778
+ const AUTHORING_SURFACE_FIX =
779
+ '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.';
780
+
781
+ /** Types one problem names before it counts the rest. */
782
+ const NAMED_TYPES = 40;
783
+
784
+ /**
785
+ * @param {string[]} names
786
+ * @returns {string}
787
+ */
788
+ function nameTypes(names) {
789
+ return names.length <= NAMED_TYPES
790
+ ? names.join(', ')
791
+ : `${names.slice(0, NAMED_TYPES).join(', ')} and ${names.length - NAMED_TYPES} more`;
792
+ }
793
+
794
+ /**
795
+ * The section keys `astryx docs authoring --index` lists, read the way that
796
+ * command reads them.
797
+ * @returns {Promise<{keys: Set<string>} | {keys: null, error: string}>}
798
+ */
799
+ async function authoringTopicKeys() {
800
+ try {
801
+ const catalog = DocsCatalog.fromBuiltins();
802
+ const entry = catalog.resolve('authoring');
803
+ if (!entry) return {keys: null, error: 'it is not a built-in topic'};
804
+ const index = indexView(await lowerTopic(catalog, entry));
805
+ return {keys: new Set(index.sections.map(section => section.id))};
806
+ } catch (err) {
807
+ return {
808
+ keys: null,
809
+ error: err instanceof Error ? err.message : String(err),
810
+ };
811
+ }
812
+ }
813
+
814
+ /**
815
+ * @param {Awaited<ReturnType<typeof import('../../foundation/discovery/authoring-surface.mjs').auditAuthoringSurface>>} surface
816
+ * @returns {string[]}
817
+ */
818
+ function surfaceProblems(surface) {
819
+ /** @type {string[]} */
820
+ const problems = [];
821
+ if (surface.types === 0 && surface.untraced.length === 0) {
822
+ problems.push(
823
+ '@astryxdesign/cli/authoring exports no types, so nothing was compared with `astryx docs authoring`',
824
+ );
825
+ }
826
+ for (const {module, names, reason, source, key} of surface.unreadable) {
827
+ const why =
828
+ reason === 'no-self-doc'
829
+ ? `no self-doc sits beside ${module}`
830
+ : reason === 'unregistered'
831
+ ? `${source} is not listed in AUTHORING_SELF_DOCS`
832
+ : reason === 'failed'
833
+ ? `${source} does not load`
834
+ : `${source} renders section "${key}", which the topic's index does not list`;
835
+ problems.push(
836
+ `${nameTypes(names)} from ${module} ${names.length === 1 ? 'has' : 'have'} no doc in \`astryx docs authoring\`: ${why}`,
837
+ );
838
+ }
839
+ for (const {name, reason} of surface.untraced) {
840
+ problems.push(
841
+ `${name} cannot be traced to the module that declares it: ${reason}`,
842
+ );
843
+ }
844
+ for (const {source, subject} of surface.unmatched) {
845
+ problems.push(
846
+ subject
847
+ ? `${source} documents ${subject}, which @astryxdesign/cli/authoring does not export`
848
+ : `${source} documents no type @astryxdesign/cli/authoring exports`,
849
+ );
850
+ }
851
+ return problems;
852
+ }
853
+
724
854
  /**
725
855
  * Every authoring self-doc is reachable from `astryx docs authoring`, loads,
726
- * and fits in one read. The audit is imported here, inside the try, so a
727
- * malformed self-doc is reported rather than taking Doctor down.
856
+ * and fits in one read, and every type `@astryxdesign/cli/authoring` exports
857
+ * has its doc there: the self-doc beside the module that declares it. The
858
+ * audits are imported here, inside the try, so a malformed self-doc is
859
+ * reported rather than taking Doctor down.
728
860
  * @param {DoctorContext} [_ctx]
861
+ * @param {{root?: string, sources?: string[], topicKeys?: Set<string> | null}} [options]
862
+ * Another authoring tree, list, or topic index to audit (for tests).
729
863
  * @returns {Promise<DoctorCheck>}
730
864
  */
731
- export async function checkAuthoringDocs(_ctx) {
865
+ export async function checkAuthoringDocs(_ctx, options = {}) {
732
866
  const id = 'authoring-docs';
733
867
  const label = 'Authoring docs';
734
868
  try {
735
- const {auditAuthoringSelfDocs} = await import(
736
- '../../foundation/discovery/authoring-self-docs.mjs'
737
- );
738
- const audit = await auditAuthoringSelfDocs();
869
+ const {auditAuthoringSelfDocs} =
870
+ await import('../../foundation/discovery/authoring-self-docs.mjs');
871
+ const {auditAuthoringSurface} =
872
+ await import('../../foundation/discovery/authoring-surface.mjs');
873
+ const {root, sources} = options;
874
+ const audit = await auditAuthoringSelfDocs({root, sources});
739
875
  const problems = [
740
876
  ...audit.unreachable.map(
741
877
  source => `${source} is not in \`astryx docs authoring\``,
742
878
  ),
743
- ...audit.failed.map(({source, error}) => `${source} failed to load: ${error}`),
879
+ ...audit.failed.map(
880
+ ({source, error}) => `${source} failed to load: ${error}`,
881
+ ),
744
882
  ...audit.oversized.map(
745
883
  ({key, bytes}) =>
746
884
  `authoring section "${key}" is ${kilobytes(bytes)}, over the ${kilobytes(DOC_OUTPUT_BUDGET_BYTES)} one read may return`,
747
885
  ),
748
886
  ];
749
- if (problems.length > 0) {
887
+ const topic =
888
+ options.topicKeys === undefined
889
+ ? await authoringTopicKeys()
890
+ : {keys: options.topicKeys};
891
+ const surface = [
892
+ ...('error' in topic
893
+ ? [`\`astryx docs authoring\` could not be read: ${topic.error}`]
894
+ : []),
895
+ ...surfaceProblems(
896
+ await auditAuthoringSurface({root, sources, topicKeys: topic.keys}),
897
+ ),
898
+ ];
899
+ if (problems.length + surface.length > 0) {
750
900
  return {
751
901
  id,
752
902
  label,
753
903
  status: 'fail',
754
- message: joinProblems(problems),
755
- fix: 'List every authoring self-doc in AUTHORING_SELF_DOCS, fix the one that fails to load, and split a section that is too large.',
904
+ message: joinProblems([...problems, ...surface]),
905
+ fix: [
906
+ problems.length > 0 ? AUTHORING_DOCS_FIX : null,
907
+ surface.length > 0 ? AUTHORING_SURFACE_FIX : null,
908
+ ]
909
+ .filter(Boolean)
910
+ .join(' '),
756
911
  };
757
912
  }
758
913
  return {
@@ -772,6 +927,149 @@ export async function checkAuthoringDocs(_ctx) {
772
927
  }
773
928
  }
774
929
 
930
+ /** How the CLI-docs audit's problems are fixed. */
931
+ const CLI_DOCS_FIX =
932
+ "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).";
933
+
934
+ /** How the docs-tree check's problems are fixed. */
935
+ const DOCS_TREE_FIX =
936
+ 'Fix each placement, adoption rule, or link the message names: a placement names a namespace of its own package, one of its slots, and a slot that accepts its kind; exactly one namespace adopts each doc; every route belongs to one doc; every link names a doc that exists, as `[<provider>:]<kind>:<name>`.';
937
+
938
+ /**
939
+ * Every command, API function, schema, and enum doc the CLI ships declares a
940
+ * namespace, and something reads it: the docs tree under `astryx docs cli`
941
+ * for `cli/commands` and `cli/api`, `astryx docs authoring` for `authoring`.
942
+ * @param {DoctorContext | Partial<DoctorContext>} _ctx
943
+ * @param {{root?: string, sources?: string[], authoringSources?: string[]}} [options]
944
+ * test seams: the CLI root, the docs to audit, and the authoring topic's list
945
+ * @returns {Promise<DoctorCheck>}
946
+ */
947
+ export async function checkCliDocs(_ctx, options = {}) {
948
+ const id = 'cli-docs';
949
+ const label = 'CLI docs';
950
+ try {
951
+ const {auditCliSelfDocs} =
952
+ await import('../../foundation/discovery/cli-self-docs.mjs');
953
+ const audit = await auditCliSelfDocs(options);
954
+ const problems = [
955
+ ...audit.missing.map(
956
+ source =>
957
+ `${source} has no namespace, so no \`astryx docs\` topic reads it`,
958
+ ),
959
+ ...audit.unknown.map(
960
+ ({source, namespace}) =>
961
+ `${source} has namespace "${namespace}", which no \`astryx docs\` topic reads`,
962
+ ),
963
+ ...audit.misfiled.map(({message}) => message),
964
+ ...audit.failed.map(
965
+ ({source, error}) => `${source} failed to load: ${error}`,
966
+ ),
967
+ ...audit.oversized.map(
968
+ ({key, bytes}) =>
969
+ `CLI doc "${key}" is ${kilobytes(bytes)}, over the ${kilobytes(DOC_OUTPUT_BUDGET_BYTES)} one read may return`,
970
+ ),
971
+ ];
972
+ if (problems.length > 0) {
973
+ return {
974
+ id,
975
+ label,
976
+ status: 'fail',
977
+ message: joinProblems(problems),
978
+ fix: CLI_DOCS_FIX,
979
+ };
980
+ }
981
+ return {
982
+ id,
983
+ label,
984
+ status: 'pass',
985
+ message: `All ${audit.docs} CLI docs are readable: ${audit.tree} in the \`astryx docs cli\` tree and ${audit.authoring} in \`astryx docs authoring\`.`,
986
+ };
987
+ } catch (err) {
988
+ return {
989
+ id,
990
+ label,
991
+ status: 'fail',
992
+ message: `The CLI docs could not be audited: ${err instanceof Error ? err.message : String(err)}`,
993
+ fix: 'Reinstall @astryxdesign/cli.',
994
+ };
995
+ }
996
+ }
997
+
998
+ /**
999
+ * The docs tree builds with no error, and every CLI typed doc in a `cli/...`
1000
+ * group has a route in it (spec:AST-046): each placement names a namespace of
1001
+ * its own package and a slot that accepts it, exactly one namespace adopts
1002
+ * each doc, and each route belongs to one doc.
1003
+ * @param {DoctorContext | Partial<DoctorContext>} _ctx
1004
+ * @param {{tree?: import('../../foundation/doc-compiler/tree.mjs').DocsTree}} [options]
1005
+ * test seam: a tree to check instead of the CLI's own
1006
+ * @returns {Promise<DoctorCheck>}
1007
+ */
1008
+ export async function checkDocsTree(_ctx, options = {}) {
1009
+ const id = 'docs-tree';
1010
+ const label = 'Docs tree';
1011
+ try {
1012
+ const catalog =
1013
+ /** @type {any} */ (_ctx)?.docsCatalog ?? builtinCatalog();
1014
+ const tree = options.tree ?? (await projectTree(catalog, {fresh: true}));
1015
+ const problems = tree.diagnostics
1016
+ .filter(d => d.severity === 'error')
1017
+ .map(d => `${d.source ?? d.provider ?? 'docs tree'}: ${d.message}`);
1018
+ if (options.tree === undefined) {
1019
+ const {loadCliSelfDocs, CLI_DOC_NAMESPACES} =
1020
+ await import('../../foundation/discovery/cli-self-docs.mjs');
1021
+ const placed = new Set(
1022
+ [...tree.nodes.values()].map(
1023
+ node => `${node.provider}\u0000${node.kind}\u0000${node.name}`,
1024
+ ),
1025
+ );
1026
+ for (const {source, doc} of (await loadCliSelfDocs()).loaded) {
1027
+ if (CLI_DOC_NAMESPACES[doc.namespace]?.reader !== 'tree') continue;
1028
+ if (!placed.has(`@astryxdesign/cli\u0000${doc.type}\u0000${doc.name}`)) {
1029
+ problems.push(
1030
+ `${source} has namespace "${doc.namespace}", but no docs-tree namespace adopts it`,
1031
+ );
1032
+ }
1033
+ }
1034
+ // Every link between docs names a doc that exists (spec:AST-047 FR9):
1035
+ // typed fields, reference and workflow blocks, and inline links.
1036
+ for (const node of tree.nodes.values()) {
1037
+ for (const edge of typedEdges(tree, node).unresolved) {
1038
+ problems.push(`${node.route}: ${edge}`);
1039
+ }
1040
+ }
1041
+ problems.push(...(await docsLinkProblems(catalog, tree)));
1042
+ }
1043
+ // New findings warn: a project that passed before keeps passing
1044
+ // (0.6 compatibility), and the warning names what to fix.
1045
+ if (problems.length > 0) {
1046
+ return {
1047
+ id,
1048
+ label,
1049
+ status: 'warn',
1050
+ message: joinProblems(problems),
1051
+ fix: DOCS_TREE_FIX,
1052
+ };
1053
+ }
1054
+ const nodes = [...tree.nodes.values()];
1055
+ const namespaces = nodes.filter(node => node.kind === 'namespace').length;
1056
+ return {
1057
+ id,
1058
+ label,
1059
+ status: 'pass',
1060
+ message: `The docs tree has ${nodes.length - namespaces} docs in ${namespaces} sections (${tree.roots().length} at the top), each at one route.`,
1061
+ };
1062
+ } catch (err) {
1063
+ return {
1064
+ id,
1065
+ label,
1066
+ status: 'warn',
1067
+ message: `The docs tree could not be built: ${err instanceof Error ? err.message : String(err)}`,
1068
+ fix: 'Reinstall @astryxdesign/cli.',
1069
+ };
1070
+ }
1071
+ }
1072
+
775
1073
  /**
776
1074
  * Every topic reads progressively, in every language it ships: it loads, its
777
1075
  * section index and each of its sections fit in one read, and no contributed
@@ -794,7 +1092,13 @@ export async function checkDocsProgressiveDisclosure(ctx) {
794
1092
  let topics = 0;
795
1093
  const catalog = ctx.docsCatalog;
796
1094
  if (catalog) {
797
- for (const entry of catalog.entries()) {
1095
+ // A guide the docs tree places is a topic read by its route; it is held
1096
+ // to the same budget as every flat topic.
1097
+ const guides = [...(await projectTree(catalog)).nodes.values()]
1098
+ // A flat topic in the Unorganized level is checked above, as a topic.
1099
+ .filter(node => node.kind === 'generic' && !node.ref?.flatTopic)
1100
+ .map(guideEntry);
1101
+ for (const entry of [...catalog.entries(), ...guides]) {
798
1102
  for (const lang of [null, ...overlayLanguages(entry)]) {
799
1103
  const where = lang ? `${entry.name} [${lang}]` : entry.name;
800
1104
  try {
@@ -823,7 +1127,7 @@ export async function checkDocsProgressiveDisclosure(ctx) {
823
1127
  return {
824
1128
  id,
825
1129
  label,
826
- status: 'fail',
1130
+ status: 'warn',
827
1131
  message: joinProblems(problems),
828
1132
  fix: 'Fix the doc each problem names; split a section that is too large into smaller ones, each with its own key.',
829
1133
  };
@@ -848,6 +1152,7 @@ export const SYNC_CHECKS = [
848
1152
  checkThemes,
849
1153
  checkImplicitIntegrations,
850
1154
  checkProviderIdentity,
1155
+ checkIntegrationIssues,
851
1156
  checkAgentDocs,
852
1157
  checkPeerDeps,
853
1158
  checkPackageManager,
@@ -887,6 +1192,8 @@ export async function runChecks(options = {}) {
887
1192
  let docsCatalogIssues = [];
888
1193
  /** @type {string|null} */
889
1194
  let docsCatalogError = null;
1195
+ /** @type {Array<{package: string, code: string, severity: 'warning'|'error', message: string}>|null} */
1196
+ let integrationIssues = null;
890
1197
  try {
891
1198
  const project = await Project.load(cwd);
892
1199
  configTheme =
@@ -901,6 +1208,7 @@ export async function runChecks(options = {}) {
901
1208
  docsCatalog = null;
902
1209
  docsCatalogError = err instanceof Error ? err.message : String(err);
903
1210
  }
1211
+ integrationIssues = await project.issues();
904
1212
  } catch {
905
1213
  // Best-effort: a missing/invalid config leaves configTheme null.
906
1214
  }
@@ -916,6 +1224,7 @@ export async function runChecks(options = {}) {
916
1224
  docsCatalog,
917
1225
  docsCatalogIssues,
918
1226
  docsCatalogError,
1227
+ integrationIssues,
919
1228
  configError,
920
1229
  };
921
1230
 
@@ -929,6 +1238,8 @@ export async function runChecks(options = {}) {
929
1238
  }
930
1239
  }
931
1240
  checks.push(await checkAuthoringDocs(ctx));
1241
+ checks.push(await checkCliDocs(ctx));
1242
+ checks.push(await checkDocsTree(ctx));
932
1243
  checks.push(await checkDocsProgressiveDisclosure(ctx));
933
1244
 
934
1245
  const summary = {pass: 0, warn: 0, fail: 0, info: 0};