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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. package/README.md +117 -79
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +16 -9
  6. package/api/build/build.test.mjs +197 -8
  7. package/api/build/build.type.d.mts +91 -2
  8. package/api/build/build.type.mjs +52 -8
  9. package/api/build/help/help.d.mts +12 -5
  10. package/api/build/help/help.mjs +69 -6
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +13 -3
  19. package/api/component/component.mjs +91 -14
  20. package/api/component/component.test.mjs +38 -0
  21. package/api/component/component.type.d.mts +22 -11
  22. package/api/component/component.type.mjs +32 -24
  23. package/api/component/detail/blocks/blocks.d.mts +2 -1
  24. package/api/component/detail/blocks/blocks.mjs +4 -3
  25. package/api/component/list/list.d.mts +0 -5
  26. package/api/component/list/list.mjs +40 -11
  27. package/api/discover/_adapter.d.mts +114 -6
  28. package/api/discover/_adapter.mjs +372 -17
  29. package/api/discover/_adapter.test.mjs +215 -0
  30. package/api/discover/_catalog-view.d.mts +115 -0
  31. package/api/discover/_catalog-view.mjs +203 -0
  32. package/api/discover/_catalog-view.test.mjs +128 -0
  33. package/api/discover/detail/detail.d.mts +18 -6
  34. package/api/discover/detail/detail.mjs +67 -13
  35. package/api/discover/detail/detail.test.mjs +85 -0
  36. package/api/discover/detail/item/item.d.mts +26 -0
  37. package/api/discover/detail/item/item.mjs +78 -0
  38. package/api/discover/detail/item/item.test.mjs +73 -0
  39. package/api/discover/discover.d.mts +3 -9
  40. package/api/discover/discover.doc.mjs +62 -18
  41. package/api/discover/discover.mjs +220 -36
  42. package/api/discover/discover.test.mjs +11 -2
  43. package/api/discover/discover.type.d.mts +150 -11
  44. package/api/discover/discover.type.mjs +107 -17
  45. package/api/discover/list/list.d.mts +20 -6
  46. package/api/discover/list/list.mjs +45 -12
  47. package/api/discover/list/list.test.mjs +46 -0
  48. package/api/discover/search/search.d.mts +18 -16
  49. package/api/discover/search/search.mjs +102 -56
  50. package/api/discover/search/search.test.mjs +144 -10
  51. package/api/docs/_adapter.d.mts +268 -47
  52. package/api/docs/_adapter.mjs +970 -149
  53. package/api/docs/compiled-topics.test.mjs +78 -0
  54. package/api/docs/detail/detail.d.mts +0 -15
  55. package/api/docs/detail/detail.mjs +22 -78
  56. package/api/docs/detail/section/section.mjs +39 -24
  57. package/api/docs/detail/section/section.test.mjs +19 -9
  58. package/api/docs/docs.d.mts +5 -3
  59. package/api/docs/docs.doc.mjs +39 -17
  60. package/api/docs/docs.mjs +44 -8
  61. package/api/docs/docs.test.mjs +158 -4
  62. package/api/docs/docs.type.d.mts +185 -6
  63. package/api/docs/docs.type.mjs +127 -13
  64. package/api/docs/index/index.mjs +15 -6
  65. package/api/docs/index/index.test.mjs +1 -1
  66. package/api/docs/integration-tree.test.mjs +555 -0
  67. package/api/docs/integrationDocs.test.mjs +14 -14
  68. package/api/docs/list/list.mjs +28 -12
  69. package/api/docs/node/node.d.mts +43 -0
  70. package/api/docs/node/node.mjs +192 -0
  71. package/api/docs/reference-blocks.test.mjs +406 -0
  72. package/api/doctor/doctor.d.mts +54 -4
  73. package/api/doctor/doctor.doc.mjs +1 -0
  74. package/api/doctor/doctor.mjs +332 -21
  75. package/api/doctor/doctor.test.mjs +420 -7
  76. package/api/gap-report/gap-report.doc.mjs +8 -4
  77. package/api/hook/_adapter.mjs +19 -5
  78. package/api/hook/hook.doc.mjs +1 -0
  79. package/api/hook/hook.type.d.mts +3 -3
  80. package/api/hook/hook.type.mjs +11 -11
  81. package/api/hook/list/list.d.mts +1 -1
  82. package/api/hook/list/list.mjs +69 -17
  83. package/api/index.d.mts +1 -1
  84. package/api/index.mjs +1 -0
  85. package/api/init/init.doc.mjs +6 -1
  86. package/api/init/init.test.mjs +41 -1
  87. package/api/init/remove/remove.mjs +1 -1
  88. package/api/init/run/run.mjs +20 -10
  89. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  90. package/api/integration/add-contribution.d.mts +2 -1
  91. package/api/integration/add-contribution.mjs +130 -15
  92. package/api/integration/add-contribution.test.mjs +258 -7
  93. package/api/integration/add-helpers.d.mts +5 -2
  94. package/api/integration/add-helpers.mjs +36 -9
  95. package/api/integration/add-theme.mjs +34 -64
  96. package/api/integration/add-theme.test.mjs +105 -21
  97. package/api/integration/authoring-checks.mjs +138 -28
  98. package/api/integration/authoring-checks.test.mjs +179 -7
  99. package/api/integration/authoring-checks.type.mjs +6 -1
  100. package/api/integration/integration-authoring.type.d.mts +2 -0
  101. package/api/integration/integration-authoring.type.mjs +2 -0
  102. package/api/integration/integration-block-exports.test.mjs +10 -6
  103. package/api/integration/integrationAdd.doc.mjs +14 -4
  104. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  105. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  106. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  107. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  108. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  109. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  110. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  111. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  112. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  113. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  114. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  115. package/api/integration/pack-check.mjs +83 -7
  116. package/api/integration/pack-check.test.mjs +387 -47
  117. package/api/integration/pack-check.type.d.mts +26 -2
  118. package/api/integration/pack-check.type.mjs +14 -1
  119. package/api/integration/summarizeIssues.doc.mjs +1 -0
  120. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  121. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  122. package/api/integration/validate-integration.mjs +52 -102
  123. package/api/integration/validate-integration.test.mjs +179 -26
  124. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  125. package/api/integration/validateIntegration.doc.mjs +3 -2
  126. package/api/json/assertResponse.doc.mjs +1 -0
  127. package/api/json/envelope-types.test.mjs +76 -0
  128. package/api/json/index.ts +2 -0
  129. package/api/json/isError.doc.mjs +1 -0
  130. package/api/json/parseResponse.doc.mjs +3 -2
  131. package/api/layout/_adapter.mjs +20 -5
  132. package/api/layout/expand/expand.mjs +7 -5
  133. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  134. package/api/layout/grammar/grammar.mjs +2 -1
  135. package/api/layout/layoutCheck.doc.mjs +1 -0
  136. package/api/layout/layoutExpand.doc.mjs +2 -1
  137. package/api/layout/layoutGrammar.doc.mjs +1 -0
  138. package/api/search/search-return-type.test.mjs +54 -0
  139. package/api/search/search.d.mts +61 -10
  140. package/api/search/search.doc.mjs +8 -2
  141. package/api/search/search.mjs +471 -83
  142. package/api/search/search.test.mjs +124 -1
  143. package/api/search/search.type.d.mts +14 -2
  144. package/api/search/search.type.mjs +5 -2
  145. package/api/swizzle/copy/copy.mjs +28 -11
  146. package/api/swizzle/swizzle.doc.mjs +2 -1
  147. package/api/swizzle/swizzle.type.d.mts +2 -2
  148. package/api/swizzle/swizzle.type.mjs +2 -2
  149. package/api/template/copy/copy.mjs +17 -23
  150. package/api/template/copy/copy.test.mjs +17 -0
  151. package/api/template/list/list.mjs +1 -0
  152. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  153. package/api/template/template-integration.test.mjs +1072 -3
  154. package/api/template/template-suffix.test.mjs +41 -21
  155. package/api/template/template.doc.mjs +30 -8
  156. package/api/template/template.mjs +45 -8
  157. package/api/template/template.type.d.mts +11 -13
  158. package/api/template/template.type.mjs +15 -14
  159. package/api/theme/_adapter.d.mts +2 -3
  160. package/api/theme/_adapter.mjs +4 -5
  161. package/api/theme/add/add.binary.test.mjs +84 -0
  162. package/api/theme/add/add.mjs +31 -22
  163. package/api/theme/add/add.rollback.test.mjs +158 -0
  164. package/api/theme/add/add.staging.test.mjs +83 -0
  165. package/api/theme/add/add.test.mjs +14 -1
  166. package/api/theme/build/build.family.test.mjs +7 -12
  167. package/api/theme/build/build.mjs +140 -59
  168. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  169. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  170. package/api/theme/build/build.rollback.test.mjs +148 -0
  171. package/api/theme/build/build.test.mjs +127 -0
  172. package/api/theme/build/font-warning.mjs +3 -3
  173. package/api/theme/build/font-warning.test.mjs +5 -2
  174. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  175. package/api/theme/integration-themes.test.mjs +39 -28
  176. package/api/theme/list/list.test.mjs +19 -20
  177. package/api/theme/listThemes.doc.mjs +6 -5
  178. package/api/theme/palette/generate/generate.mjs +8 -3
  179. package/api/theme/palette/generate/generate.test.mjs +96 -0
  180. package/api/theme/palette/generate/generator.d.mts +10 -13
  181. package/api/theme/palette/generate/generator.mjs +15 -4
  182. package/api/theme/palette/generate/generator.test.mjs +10 -0
  183. package/api/theme/template/template.mjs +11 -2
  184. package/api/theme/template/template.test.mjs +20 -0
  185. package/api/theme/theme.type.d.mts +170 -11
  186. package/api/theme/theme.type.mjs +94 -27
  187. package/api/theme/themeAdd.doc.mjs +4 -3
  188. package/api/theme/themeBuild.doc.mjs +8 -4
  189. package/api/theme/themeList.doc.mjs +6 -3
  190. package/api/theme/themeListAvailable.doc.mjs +5 -3
  191. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  192. package/api/theme/themeTargets.doc.mjs +1 -0
  193. package/api/theme/themeTemplate.doc.mjs +6 -2
  194. package/api/upgrade/_adapter.d.mts +32 -5
  195. package/api/upgrade/_adapter.mjs +124 -73
  196. package/api/upgrade/list/list.mjs +2 -1
  197. package/api/upgrade/list/list.test.mjs +73 -0
  198. package/api/upgrade/provider-agreement.test.mjs +152 -0
  199. package/api/upgrade/run/run.mjs +356 -59
  200. package/api/upgrade/status/status.mjs +2 -2
  201. package/api/upgrade/upgrade.doc.mjs +8 -2
  202. package/api/upgrade/upgrade.type.d.mts +42 -4
  203. package/api/upgrade/upgrade.type.mjs +26 -10
  204. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  205. package/assets/codemods/integration-discovery.mjs +48 -4
  206. package/assets/codemods/integration-discovery.test.mjs +73 -0
  207. package/assets/codemods/integration-runner.mjs +56 -4
  208. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  209. package/assets/codemods/run-codemod.mjs +177 -34
  210. package/assets/codemods/runner.mjs +350 -102
  211. package/assets/codemods/term-log.mjs +32 -8
  212. package/assets/codemods/term-log.test.mjs +19 -1
  213. package/assets/codemods/transform-prop.mjs +109 -0
  214. package/assets/codemods/transform-prop.test.mjs +95 -0
  215. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  216. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  217. package/assets/codemods/transforms/next/index.mjs +19 -1
  218. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  219. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  220. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  221. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  222. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  223. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  224. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  225. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  226. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  227. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  228. package/assets/docs/getting-started.doc.mjs +2 -2
  229. package/assets/docs/internationalization.doc.mjs +7 -5
  230. package/assets/docs/layout.doc.dense.mjs +2 -2
  231. package/assets/docs/layout.doc.mjs +1 -1
  232. package/assets/docs/principles.doc.mjs +6 -6
  233. package/assets/docs/styling-libraries.doc.mjs +4 -4
  234. package/assets/docs/styling.doc.mjs +4 -4
  235. package/assets/docs/theme.doc.mjs +5 -5
  236. package/assets/docs/tokens.doc.mjs +1 -1
  237. package/assets/docs/tree/api.doc.mjs +30 -0
  238. package/assets/docs/tree/cli.doc.mjs +23 -0
  239. package/assets/docs/tree/commands.doc.mjs +25 -0
  240. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +95 -39
  241. package/assets/docs/tree/integrations.test.mjs +62 -0
  242. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  243. package/assets/docs/working-with-ai.doc.mjs +4 -4
  244. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  245. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  246. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  247. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  248. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  249. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  250. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  251. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  252. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  253. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  254. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  255. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  256. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  262. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  263. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  264. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  265. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  266. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  267. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  268. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  269. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  270. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  271. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  272. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  273. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  274. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  275. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  276. package/authoring/_shared/contract.ts +22 -0
  277. package/authoring/codemod/codemod.doc.mjs +7 -2
  278. package/authoring/codemod/parse.d.mts +8 -8
  279. package/authoring/codemod/parse.mjs +8 -6
  280. package/authoring/codemod/type.ts +12 -0
  281. package/authoring/config/config.doc.mjs +10 -2
  282. package/authoring/config/debug-composition.test.mjs +92 -0
  283. package/authoring/config/parse.d.mts +15 -13
  284. package/authoring/config/parse.mjs +27 -8
  285. package/authoring/config/parse.test.mjs +8 -0
  286. package/authoring/config/type.ts +29 -6
  287. package/authoring/debug/debug.doc.d.mts +11 -0
  288. package/authoring/debug/debug.doc.mjs +182 -0
  289. package/authoring/debug/parse.d.mts +7 -7
  290. package/authoring/debug/parse.mjs +3 -3
  291. package/authoring/discover/discover.doc.d.mts +13 -0
  292. package/authoring/discover/discover.doc.mjs +138 -0
  293. package/authoring/discover/parse.d.mts +24 -0
  294. package/authoring/discover/parse.mjs +128 -0
  295. package/authoring/discover/parse.test.mjs +124 -0
  296. package/authoring/discover/type.ts +87 -0
  297. package/authoring/doctypes/_schema.d.mts +240 -128
  298. package/authoring/doctypes/_schema.mjs +198 -16
  299. package/authoring/doctypes/base/graph-fields.doc.mjs +15 -6
  300. package/authoring/doctypes/base/type.ts +9 -4
  301. package/authoring/doctypes/command/command.doc.mjs +4 -3
  302. package/authoring/doctypes/command/parse.d.mts +2 -2
  303. package/authoring/doctypes/command/parse.mjs +1 -1
  304. package/authoring/doctypes/command/type.ts +4 -4
  305. package/authoring/doctypes/component/component.doc.mjs +5 -2
  306. package/authoring/doctypes/component/parse.d.mts +2 -2
  307. package/authoring/doctypes/component/parse.mjs +1 -1
  308. package/authoring/doctypes/component/type.ts +3 -3
  309. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  310. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  311. package/authoring/doctypes/enum/parse.d.mts +2 -2
  312. package/authoring/doctypes/enum/parse.mjs +1 -1
  313. package/authoring/doctypes/enum/type.ts +2 -2
  314. package/authoring/doctypes/function/function.doc.mjs +7 -2
  315. package/authoring/doctypes/function/parse.d.mts +2 -2
  316. package/authoring/doctypes/function/parse.mjs +1 -1
  317. package/authoring/doctypes/function/type.ts +4 -3
  318. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  319. package/authoring/doctypes/hook/parse.d.mts +2 -2
  320. package/authoring/doctypes/hook/parse.mjs +1 -1
  321. package/authoring/doctypes/hook/type.ts +3 -3
  322. package/authoring/doctypes/legacy.d.mts +6 -6
  323. package/authoring/doctypes/legacy.mjs +3 -3
  324. package/authoring/doctypes/load-contract.test.mjs +233 -0
  325. package/authoring/doctypes/namespace/namespace.doc.mjs +9 -9
  326. package/authoring/doctypes/namespace/parse.d.mts +2 -2
  327. package/authoring/doctypes/namespace/parse.mjs +1 -1
  328. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  329. package/authoring/doctypes/namespace/type.ts +6 -3
  330. package/authoring/doctypes/parse.d.mts +22 -20
  331. package/authoring/doctypes/parse.mjs +19 -14
  332. package/authoring/doctypes/reference/parse.d.mts +2 -2
  333. package/authoring/doctypes/reference/parse.mjs +1 -1
  334. package/authoring/doctypes/reference/reference.doc.mjs +39 -6
  335. package/authoring/doctypes/reference/type.ts +31 -14
  336. package/authoring/doctypes/schema/parse.d.mts +2 -2
  337. package/authoring/doctypes/schema/parse.mjs +1 -1
  338. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  339. package/authoring/doctypes/schema/type.ts +3 -4
  340. package/authoring/doctypes/template/parse.d.mts +94 -1
  341. package/authoring/doctypes/template/parse.mjs +37 -1
  342. package/authoring/doctypes/template/parse.test.mjs +18 -0
  343. package/authoring/doctypes/template/template.doc.mjs +13 -3
  344. package/authoring/doctypes/template/type.ts +12 -1
  345. package/authoring/doctypes/theme/parse.d.mts +35 -0
  346. package/authoring/doctypes/theme/parse.mjs +76 -0
  347. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  348. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  349. package/authoring/doctypes/theme/type.ts +42 -0
  350. package/authoring/doctypes/types.ts +12 -11
  351. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  352. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  353. package/authoring/gap-report/parse.d.mts +9 -9
  354. package/authoring/gap-report/parse.mjs +6 -6
  355. package/authoring/gap-report/type.ts +1 -1
  356. package/authoring/identity/identity.doc.mjs +3 -2
  357. package/authoring/identity/type.ts +10 -10
  358. package/authoring/index.d.mts +2 -0
  359. package/authoring/index.d.ts +32 -19
  360. package/authoring/index.mjs +3 -1
  361. package/authoring/integration/integration.doc.mjs +2 -2
  362. package/authoring/integration/parse.d.mts +2 -2
  363. package/authoring/integration/parse.mjs +1 -1
  364. package/authoring/integration/schema.d.mts +4 -4
  365. package/authoring/integration/schema.mjs +3 -3
  366. package/authoring/integration/type.ts +5 -11
  367. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  368. package/clients/cli/command-load-failure.test.mjs +83 -0
  369. package/clients/cli/commands/blog.doc.mjs +1 -1
  370. package/clients/cli/commands/blog.mjs +23 -8
  371. package/clients/cli/commands/blog.test.mjs +42 -1
  372. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  373. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  374. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  375. package/clients/cli/commands/build-theme.mjs +16 -50
  376. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  377. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  378. package/clients/cli/commands/build.doc.mjs +16 -8
  379. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  380. package/clients/cli/commands/build.mjs +137 -114
  381. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  382. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  383. package/clients/cli/commands/component/index.mjs +3 -8
  384. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  385. package/clients/cli/commands/component-package.test.mjs +46 -0
  386. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  387. package/clients/cli/commands/component.doc.mjs +1 -1
  388. package/clients/cli/commands/component.test.mjs +19 -0
  389. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  390. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  391. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  392. package/clients/cli/commands/discover.doc.mjs +55 -9
  393. package/clients/cli/commands/discover.mjs +393 -118
  394. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  395. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  396. package/clients/cli/commands/docs.doc.mjs +21 -9
  397. package/clients/cli/commands/docs.mjs +184 -70
  398. package/clients/cli/commands/docs.test.mjs +120 -16
  399. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  400. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  401. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  402. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  403. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  404. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  405. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  406. package/clients/cli/commands/doctor.doc.mjs +1 -1
  407. package/clients/cli/commands/doctor.mjs +59 -32
  408. package/clients/cli/commands/doctor.test.mjs +42 -0
  409. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  410. package/clients/cli/commands/gap-report.test.mjs +72 -0
  411. package/clients/cli/commands/hook/index.mjs +7 -17
  412. package/clients/cli/commands/hook.doc.mjs +1 -1
  413. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  414. package/clients/cli/commands/init.doc.mjs +20 -9
  415. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  416. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  417. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  418. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  419. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  420. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  421. package/clients/cli/commands/integration.doc.mjs +1 -1
  422. package/clients/cli/commands/integration.mjs +1 -0
  423. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  424. package/clients/cli/commands/json-contract.test.mjs +33 -0
  425. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  426. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  427. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  428. package/clients/cli/commands/layout.doc.mjs +3 -3
  429. package/clients/cli/commands/layout.mjs +21 -9
  430. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  431. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  432. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  433. package/clients/cli/commands/manifest.doc.mjs +1 -1
  434. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  435. package/clients/cli/commands/search.doc.mjs +7 -4
  436. package/clients/cli/commands/search.mjs +28 -9
  437. package/clients/cli/commands/search.test.mjs +75 -0
  438. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  439. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  440. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  441. package/clients/cli/commands/template.doc.mjs +52 -13
  442. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  443. package/clients/cli/commands/template.mjs +4 -91
  444. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  445. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  446. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  447. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  448. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  449. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  450. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  451. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  452. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  453. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  454. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  455. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  456. package/clients/cli/commands/theme.doc.mjs +1 -1
  457. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  458. package/clients/cli/commands/upgrade.doc.mjs +20 -8
  459. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  460. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  461. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  462. package/clients/cli/commands/upgrade.mjs +29 -7
  463. package/clients/cli/formatters/index.mjs +2 -0
  464. package/clients/cli/formatters/index.test.mjs +6 -0
  465. package/clients/cli/index.mjs +21 -30
  466. package/clients/cli/latest-version-env.test.mjs +50 -0
  467. package/clients/cli/lib/cli-error.test.mjs +7 -0
  468. package/clients/cli/lib/component-format.mjs +9 -9
  469. package/clients/cli/lib/component-format.test.mjs +1 -1
  470. package/clients/cli/lib/define-command.mjs +32 -6
  471. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  472. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  473. package/clients/cli/lib/hook-format.mjs +19 -10
  474. package/clients/cli/lib/json-shim.mjs +38 -2
  475. package/clients/cli/lib/json-shim.test.mjs +83 -0
  476. package/clients/cli/lib/manifest.d.ts +2 -0
  477. package/clients/cli/lib/manifest.mjs +32 -2
  478. package/clients/cli/lib/manifest.test.mjs +17 -0
  479. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  480. package/foundation/agent-docs/agent-docs.mjs +82 -12
  481. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  482. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  483. package/foundation/config/integration-debug.test.mjs +28 -3
  484. package/foundation/config/project-themes.test.mjs +11 -19
  485. package/foundation/config/project.d.mts +20 -11
  486. package/foundation/config/project.mjs +246 -89
  487. package/foundation/config/project.test.mjs +270 -21
  488. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  489. package/foundation/discovery/authoring-self-docs.mjs +38 -15
  490. package/foundation/discovery/authoring-self-docs.test.mjs +87 -12
  491. package/foundation/discovery/authoring-surface.d.mts +74 -0
  492. package/foundation/discovery/authoring-surface.mjs +525 -0
  493. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  494. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  495. package/foundation/discovery/cli-self-docs.mjs +490 -0
  496. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  497. package/foundation/discovery/component-discovery.d.mts +38 -0
  498. package/foundation/discovery/component-discovery.mjs +48 -0
  499. package/foundation/discovery/component-loader.d.mts +35 -38
  500. package/foundation/discovery/component-loader.mjs +53 -222
  501. package/foundation/discovery/docs-discovery.d.mts +114 -9
  502. package/foundation/discovery/docs-discovery.mjs +239 -30
  503. package/foundation/discovery/docs-discovery.test.mjs +150 -35
  504. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  505. package/foundation/discovery/docs-output-budget.mjs +1 -1
  506. package/foundation/discovery/docs-section-key.d.mts +28 -10
  507. package/foundation/discovery/docs-section-key.mjs +134 -33
  508. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  509. package/foundation/discovery/template-adapter.d.mts +113 -11
  510. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  511. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  512. package/foundation/discovery/template-adapter.mjs +772 -82
  513. package/foundation/discovery/template-adapter.test.mjs +57 -0
  514. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  515. package/foundation/discovery/template-conflict-release.mjs +40 -0
  516. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  517. package/foundation/discovery/theme-discovery.d.mts +67 -7
  518. package/foundation/discovery/theme-discovery.mjs +916 -186
  519. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  520. package/foundation/discovery/theming-targets.test.mjs +4 -0
  521. package/foundation/doc-compiler/bundle.d.mts +47 -0
  522. package/foundation/doc-compiler/bundle.mjs +278 -0
  523. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  524. package/foundation/doc-compiler/compile.d.mts +343 -0
  525. package/foundation/doc-compiler/compile.mjs +558 -0
  526. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  527. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  528. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  529. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  530. package/foundation/doc-compiler/import.d.mts +24 -0
  531. package/foundation/doc-compiler/import.mjs +59 -0
  532. package/foundation/doc-compiler/inputs.d.mts +102 -0
  533. package/foundation/doc-compiler/inputs.mjs +291 -0
  534. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  535. package/foundation/doc-compiler/ir.d.mts +22 -0
  536. package/foundation/doc-compiler/ir.mjs +471 -0
  537. package/foundation/doc-compiler/lenses.d.mts +36 -0
  538. package/foundation/doc-compiler/lenses.mjs +173 -0
  539. package/foundation/doc-compiler/links.d.mts +162 -0
  540. package/foundation/doc-compiler/links.mjs +294 -0
  541. package/foundation/doc-compiler/links.test.mjs +192 -0
  542. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  543. package/foundation/doc-compiler/overlays.d.mts +37 -0
  544. package/foundation/doc-compiler/overlays.mjs +206 -0
  545. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  546. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  547. package/foundation/doc-compiler/read.d.mts +127 -0
  548. package/foundation/doc-compiler/read.mjs +325 -0
  549. package/foundation/doc-compiler/read.test.mjs +313 -0
  550. package/foundation/doc-compiler/source.d.mts +33 -0
  551. package/foundation/doc-compiler/source.mjs +128 -0
  552. package/foundation/doc-compiler/tree.d.mts +288 -0
  553. package/foundation/doc-compiler/tree.mjs +876 -0
  554. package/foundation/doc-compiler/tree.test.mjs +598 -0
  555. package/foundation/fs/file-protection.d.mts +33 -0
  556. package/foundation/fs/file-protection.mjs +825 -0
  557. package/foundation/fs/file-protection.test.mjs +250 -0
  558. package/foundation/fs/module-loader.d.mts +1 -0
  559. package/foundation/fs/module-loader.mjs +50 -1
  560. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  561. package/foundation/fs/path-safety.d.mts +3 -2
  562. package/foundation/fs/path-safety.mjs +49 -19
  563. package/foundation/fs/path-safety.test.mjs +50 -0
  564. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  565. package/foundation/integrations/autolink.d.mts +58 -1
  566. package/foundation/integrations/autolink.mjs +143 -52
  567. package/foundation/integrations/autolink.test.mjs +1 -1
  568. package/foundation/integrations/cli-requirement.d.mts +45 -0
  569. package/foundation/integrations/cli-requirement.mjs +154 -0
  570. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  571. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  572. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  573. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  574. package/foundation/integrations/contribution-inventory.mjs +27 -24
  575. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  576. package/foundation/integrations/integration-warnings.d.mts +9 -2
  577. package/foundation/integrations/integration-warnings.mjs +51 -26
  578. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  579. package/foundation/integrations/integrations.d.mts +17 -1
  580. package/foundation/integrations/integrations.mjs +52 -98
  581. package/foundation/integrations/integrations.test.mjs +31 -0
  582. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  583. package/foundation/integrations/provider-resolution.d.mts +152 -0
  584. package/foundation/integrations/provider-resolution.mjs +576 -0
  585. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  586. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  587. package/foundation/integrations/theme-descriptor.mjs +44 -0
  588. package/foundation/integrations/validate-contributions.mjs +121 -29
  589. package/foundation/response/base.d.ts +8 -4
  590. package/foundation/response/error-codes.d.mts +3 -1
  591. package/foundation/response/error-codes.d.ts +2 -0
  592. package/foundation/response/error-codes.doc.mjs +13 -4
  593. package/foundation/response/error-codes.mjs +8 -2
  594. package/foundation/response/error-codes.test.mjs +137 -10
  595. package/foundation/response/json-contract.test.mjs +11 -0
  596. package/foundation/response/json.d.mts +4 -2
  597. package/foundation/response/json.mjs +8 -10
  598. package/foundation/response/response-types.doc.d.mts +5 -1
  599. package/foundation/response/response-types.doc.mjs +37 -22
  600. package/foundation/response/response-types.doc.test.mjs +158 -0
  601. package/foundation/response/response.doc.mjs +1 -1
  602. package/foundation/text/string-utils.d.mts +8 -0
  603. package/foundation/text/string-utils.mjs +40 -10
  604. package/foundation/xle/expand.d.mts +2 -0
  605. package/foundation/xle/expand.mjs +4 -3
  606. package/foundation/xle/expand.test.mjs +54 -0
  607. package/foundation/xle/xle.test.mjs +13 -0
  608. package/package.json +10 -11
  609. package/assets/templates/themes/manifest.json +0 -95
  610. package/clients/cli/lib/update-check.mjs +0 -83
  611. package/clients/cli/lib/update-check.test.mjs +0 -137
  612. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -26,11 +26,9 @@ describe('docs() dispatcher routing', () => {
26
26
  expect((await docs('')).type).toBe('docs.list');
27
27
  }, SLOW);
28
28
 
29
- it('topic only -> docs.detail', async () => {
29
+ it('topic only -> docs.detail, the whole doc', async () => {
30
30
  const {data} = await docs();
31
- const topic = data[0].topic;
32
- const r = await docs(topic);
33
- expect(r.type).toBe('docs.detail');
31
+ expect((await docs(data[0].topic)).type).toBe('docs.detail');
34
32
  }, SLOW);
35
33
 
36
34
  it('topic + index -> docs.index', async () => {
@@ -69,6 +67,162 @@ describe('docs() dispatcher routing', () => {
69
67
  });
70
68
  }, SLOW);
71
69
 
70
+ it("lists the docs tree's namespaces in meta, so every data entry reads as a topic", async () => {
71
+ const res = await docs();
72
+ expect(res.meta.namespaces.map(entry => entry.topic)).toEqual(['cli', 'unorganized']);
73
+ for (const entry of res.data) {
74
+ expect((await docs(entry.topic)).type).toBe('docs.detail');
75
+ }
76
+ }, SLOW);
77
+
78
+ it('opens a route typed in another case', async () => {
79
+ const r = await docs('CLI/API');
80
+ expect(r.type).toBe('docs.node');
81
+ expect(r.data).toMatchObject({route: 'cli/api', links: {up: 'astryx docs cli'}});
82
+ }, SLOW);
83
+
84
+ it('a section of a typed doc -> ERR_UNKNOWN_SECTION, suggesting the doc itself', async () => {
85
+ const err = await docs('cli/api/functions/search', 'x').catch(e => e);
86
+ expect(err.code).toBe('ERR_UNKNOWN_SECTION');
87
+ expect(err.message).toContain('astryx docs cli/api/functions/search');
88
+ expect(err.suggestions.map(s => s.name)).toEqual(['cli/api/functions/search']);
89
+ }, SLOW);
90
+
91
+ it('a namespace route -> docs.node, one level of children', async () => {
92
+ const r = await docs('cli/api');
93
+ expect(r.type).toBe('docs.node');
94
+ expect(r.data).toMatchObject({
95
+ id: 'astryx:artifact:v1/%40astryxdesign%2Fcli/namespace/api',
96
+ route: 'cli/api',
97
+ kind: 'namespace',
98
+ package: '@astryxdesign/cli',
99
+ breadcrumb: [{route: 'cli', title: 'Astryx CLI'}],
100
+ content: [],
101
+ });
102
+ expect(r.data.slots.flatMap(slot => slot.children.map(c => c.route))).toEqual([
103
+ 'cli/api/functions',
104
+ 'cli/api/schemas',
105
+ 'cli/api/enums',
106
+ ]);
107
+ }, SLOW);
108
+
109
+ it('a typed doc route -> docs.node with its content', async () => {
110
+ const r = await docs('cli/api/functions/search');
111
+ expect(r.type).toBe('docs.node');
112
+ expect(r.data).toMatchObject({
113
+ id: 'astryx:artifact:v1/%40astryxdesign%2Fcli/function/search',
114
+ kind: 'function',
115
+ title: 'search()',
116
+ slots: [],
117
+ });
118
+ expect(r.data.breadcrumb.map(link => link.route)).toEqual([
119
+ 'cli',
120
+ 'cli/api',
121
+ 'cli/api/functions',
122
+ ]);
123
+ expect(JSON.stringify(r.data.content)).toContain(
124
+ '`astryx search` runs it. Read it with `astryx docs cli/commands/search`.',
125
+ );
126
+ }, SLOW);
127
+
128
+ it('a guide the tree places reads like a topic: the whole doc, its index, a section', async () => {
129
+ expect((await docs('cli/integrations')).type).toBe('docs.detail');
130
+ const index = await docs('cli/integrations', undefined, {index: true});
131
+ expect(index).toMatchObject({type: 'docs.index', data: {name: 'cli/integrations'}});
132
+ expect(index.data.sections.length).toBeGreaterThan(1);
133
+ expect((await docs('cli/integrations', 'components')).type).toBe(
134
+ 'docs.detail.section',
135
+ );
136
+ }, SLOW);
137
+
138
+ it('every read carries its moves (spec:AST-047)', async () => {
139
+ const root = (await docs('cli')).data;
140
+ expect(root.links).toEqual({up: 'astryx docs'});
141
+ const leaf = (await docs('cli/api/functions/search')).data;
142
+ expect(leaf.links.up).toBe('astryx docs cli/api/functions');
143
+ expect(leaf.links.previous).toMatch(/^astryx docs cli\/api\/functions\/[a-z-]+$/);
144
+ expect(leaf.links.next).toMatch(/^astryx docs cli\/api\/functions\/[a-z-]+$/);
145
+ const index = await docs('cli/integrations', undefined, {index: true});
146
+ // A guide moves across its namespace's slot, as any tree node does.
147
+ expect(index.data.links).toEqual({
148
+ up: 'astryx docs cli',
149
+ next: 'astryx docs cli/writing-docs',
150
+ });
151
+ const first = (await docs('cli/integrations', index.data.sections[0].id)).data;
152
+ expect(first.links).toEqual({
153
+ up: 'astryx docs cli/integrations --index',
154
+ next: `astryx docs cli/integrations ${index.data.sections[1].id}`,
155
+ });
156
+ const last = index.data.sections.at(-1).id;
157
+ const end = (await docs('cli/integrations', last)).data;
158
+ expect(end.links.next).toBeUndefined();
159
+ expect(end.links.previous).toBe(
160
+ `astryx docs cli/integrations ${index.data.sections.at(-2).id}`,
161
+ );
162
+ // A flat topic's home is the Unorganized level, and it moves across it.
163
+ const flat = (await docs('principles')).data.links;
164
+ expect(flat.up).toBe('astryx docs unorganized');
165
+ expect(flat.previous).toMatch(/^astryx docs [a-z-]+$/);
166
+ expect(flat.next).toMatch(/^astryx docs [a-z-]+$/);
167
+ const home = (await docs('unorganized')).data;
168
+ expect(home).toMatchObject({id: null, kind: 'namespace', links: {up: 'astryx docs'}});
169
+ expect(home.slots[0].children.map(child => child.route)).toEqual(
170
+ (await docs()).data.map(entry => entry.topic),
171
+ );
172
+ }, SLOW);
173
+
174
+ it('names a node by its doc identity; a generated level has id null', async () => {
175
+ const level = (await docs('cli/api/functions')).data;
176
+ expect(level).toHaveProperty('id', null);
177
+ expect(level.route).toBe('cli/api/functions');
178
+ }, SLOW);
179
+
180
+ it("offers a typed doc's related docs as moves", async () => {
181
+ const fn = (await docs('cli/api/functions/search')).data;
182
+ expect(fn.links.related).toContain('astryx docs cli/commands/search');
183
+ const cmd = (await docs('cli/commands/search')).data;
184
+ expect(cmd.links.related).toContain('astryx docs cli/api/functions/search');
185
+ }, SLOW);
186
+
187
+ it('a topic read returns the whole doc; index returns its sections', async () => {
188
+ expect((await docs('principles')).type).toBe('docs.detail');
189
+ const index = await docs('principles', undefined, {index: true});
190
+ expect(index.type).toBe('docs.index');
191
+ expect(index.data.sections.length).toBeGreaterThan(1);
192
+ expect((await docs('principles', undefined, {dense: true})).type).toBe(
193
+ 'docs.detail',
194
+ );
195
+ }, SLOW);
196
+
197
+ it("the guide's old flat name is gone, and its error names the new route", async () => {
198
+ await expect(docs('cli-integrations')).rejects.toMatchObject({
199
+ code: 'ERR_UNKNOWN_TOPIC',
200
+ suggestions: [expect.objectContaining({name: 'cli/integrations'})],
201
+ });
202
+ expect((await docs()).data.map(entry => entry.topic)).not.toContain(
203
+ 'cli-integrations',
204
+ );
205
+ }, SLOW);
206
+
207
+ it('a section of a namespace -> ERR_UNKNOWN_SECTION, naming its children', async () => {
208
+ const err = await docs('cli', 'commands').catch(e => e);
209
+ expect(err).toBeInstanceOf(AstryxError);
210
+ expect(err.code).toBe('ERR_UNKNOWN_SECTION');
211
+ expect(err.suggestions.map(s => s.name)).toEqual([
212
+ 'cli/integrations',
213
+ 'cli/writing-docs',
214
+ 'cli/commands',
215
+ 'cli/api',
216
+ ]);
217
+ }, SLOW);
218
+
219
+ it('an unknown route suggests the children of the deepest namespace it reaches', async () => {
220
+ const err = await docs('cli/api/functions/serch').catch(e => e);
221
+ expect(err.code).toBe('ERR_UNKNOWN_TOPIC');
222
+ expect(err.suggestions.map(s => s.name)).toContain('cli/api/functions/search');
223
+ expect(err.suggestions.every(s => s.name.startsWith('cli/api/functions/'))).toBe(true);
224
+ }, SLOW);
225
+
72
226
  it('non-string topic -> ERR_UNKNOWN_TOPIC (not a raw TypeError)', async () => {
73
227
  for (const bad of [123, {}, ['tokens'], true]) {
74
228
  const err = await docs(/** @type {any} */ (bad)).catch(e => e);
@@ -2,11 +2,26 @@
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
4
  /**
5
- * xds --json docs
5
+ * astryx --json docs
6
6
  */
7
7
  export type DocsListResponse = {
8
8
  type: "docs.list";
9
+ /**
10
+ * every topic, each readable as a topic
11
+ */
9
12
  data: DocsListEntry[];
13
+ /**
14
+ * `namespaces`: the docs tree's top-level namespaces, each opened by its
15
+ * `topic` as a docs.node; `notLoaded`: each package whose doc files did not
16
+ * load, and why (its docs are withdrawn)
17
+ */
18
+ meta?: {
19
+ namespaces?: DocsListNamespace[];
20
+ notLoaded?: Array<{
21
+ package: string;
22
+ message: string;
23
+ }>;
24
+ } | undefined;
10
25
  };
11
26
  export type DocsListEntry = {
12
27
  topic: string;
@@ -23,18 +38,91 @@ export type DocsListEntry = {
23
38
  replaces?: string | undefined;
24
39
  };
25
40
  /**
26
- * xds --json docs <topic> --index
41
+ * A top-level namespace of the docs tree, as `astryx docs --json` lists it in
42
+ * `meta.namespaces`.
43
+ */
44
+ export type DocsListNamespace = {
45
+ /**
46
+ * its route, the argument that opens it
47
+ */
48
+ topic: string;
49
+ description: string;
50
+ /**
51
+ * the package that owns it
52
+ */
53
+ package: string;
54
+ };
55
+ /**
56
+ * astryx --json docs <topic> --index
27
57
  */
28
58
  export type DocsIndexResponse = {
29
59
  type: "docs.index";
30
60
  data: DocsIndex;
31
61
  };
32
62
  /**
33
- * xds --json docs <topic>
63
+ * astryx --json docs <topic>
34
64
  */
35
65
  export type DocsDetailResponse = {
36
66
  type: "docs.detail";
37
- data: import("@astryxdesign/cli/authoring").ReferenceDoc;
67
+ /**
68
+ * the whole doc, and the moves from it
69
+ */
70
+ data: DocsReadDoc & {
71
+ links: DocsLinks;
72
+ };
73
+ };
74
+ /**
75
+ * A topic section as a read returns it. A read inlines each token reference
76
+ * and each `reference` block the author wrote, so its content holds only the
77
+ * stable ReferenceContentBlock kinds.
78
+ */
79
+ export type DocsReadSection = Omit<import("@astryxdesign/cli/authoring").ReferenceSection, "content"> & {
80
+ content: import("@astryxdesign/cli/authoring").ReferenceContentBlock[];
81
+ };
82
+ /**
83
+ * A topic as a read returns it: every section a {@link DocsReadSection}.
84
+ */
85
+ export type DocsReadDoc = Omit<import("@astryxdesign/cli/authoring").ReferenceDoc, "sections"> & {
86
+ sections: DocsReadSection[];
87
+ };
88
+ /**
89
+ * The doc a link opens (spec:AST-047 FR9). A docs read resolves every link:
90
+ * an inline `{@link <target>}` reads as `link.command`, a `reference` block in
91
+ * a namespace doc carries `link` (null when the target names no doc), and each
92
+ * `workflow` step carries `links`, one per reference. A topic read inlines a
93
+ * section's `reference` block as the doc it includes, then a line naming where
94
+ * that comes from and the command that opens it.
95
+ */
96
+ export type DocLink = import("../../foundation/doc-compiler/links.mjs").DocLink;
97
+ /**
98
+ * One move: a whole `astryx docs` command a reader can run as is.
99
+ */
100
+ export type DocsCommand = "astryx docs" | `astryx docs ${string}`;
101
+ /**
102
+ * The moves a docs read offers (spec:AST-047). Every read but the topic list
103
+ * carries them.
104
+ */
105
+ export type DocsLinks = {
106
+ /**
107
+ * opens the level the read sits in: a section's
108
+ * topic index, a node's parent namespace, or the topic list
109
+ */
110
+ up: DocsCommand;
111
+ /**
112
+ * opens the item before it at its level: the
113
+ * previous section of its topic, or the previous node in its parent's slot
114
+ */
115
+ previous?: DocsCommand | undefined;
116
+ /**
117
+ * opens the item after it at its level
118
+ */
119
+ next?: DocsCommand | undefined;
120
+ /**
121
+ * opens each doc a typed doc names: a
122
+ * function's command, a command's function, and the docs it lists as
123
+ * related
124
+ */
125
+ related?: DocsCommand[] | undefined;
38
126
  };
39
127
  /**
40
128
  * The section index of one topic: what the topic is, and the key each section
@@ -48,6 +136,10 @@ export type DocsIndex = {
48
136
  title: string;
49
137
  description: string;
50
138
  sections: DocsIndexSection[];
139
+ /**
140
+ * the moves from the index
141
+ */
142
+ links: DocsLinks;
51
143
  };
52
144
  export type DocsIndexSection = {
53
145
  /**
@@ -62,11 +154,98 @@ export type DocsIndexSection = {
62
154
  summary: string;
63
155
  };
64
156
  /**
65
- * xds --json docs <topic> <section>
157
+ * astryx --json docs <topic> <section>
66
158
  */
67
159
  export type DocsDetailSectionResponse = {
68
160
  type: "docs.detail.section";
69
- data: import("@astryxdesign/cli/authoring").ReferenceSection;
161
+ /**
162
+ * the section, and the moves from it: up to its topic's index, and across to
163
+ * the sections before and after it
164
+ */
165
+ data: DocsReadSection & {
166
+ links: DocsLinks;
167
+ };
168
+ };
169
+ /**
170
+ * astryx --json docs <route>, for a namespace or a typed doc in the docs tree
171
+ */
172
+ export type DocsNodeResponse = {
173
+ type: "docs.node";
174
+ data: DocsNode;
175
+ };
176
+ /**
177
+ * One node of the docs tree.
178
+ */
179
+ export type DocsNode = {
180
+ /**
181
+ * the doc's DocId, built from its provider's
182
+ * ProviderId, kind, and name (see the provider-identity authoring doc);
183
+ * unchanged when the node moves. Always present; null on a generated level,
184
+ * such as `cli/api/functions`, which has no authored doc
185
+ */
186
+ id: string | null;
187
+ /**
188
+ * pass it to `astryx docs`
189
+ */
190
+ route: string;
191
+ /**
192
+ * `namespace`, or the typed doc's kind: `command`,
193
+ * `function`, `schema`, or `enum`
194
+ */
195
+ kind: string;
196
+ /**
197
+ * the package that owns the node
198
+ */
199
+ package: string;
200
+ title: string;
201
+ summary: string;
202
+ /**
203
+ * the namespaces above it, top first
204
+ */
205
+ breadcrumb: DocsNodeLink[];
206
+ /**
207
+ * a namespace's slots that hold children, in
208
+ * order; empty for a typed doc
209
+ */
210
+ slots: DocsNodeSlot[];
211
+ /**
212
+ * a typed doc's content; empty for a namespace
213
+ */
214
+ content: import("@astryxdesign/cli/authoring").ReferenceContentBlock[];
215
+ /**
216
+ * the moves from the node: up to its parent (the
217
+ * topic list, for a top-level namespace), and across to its neighbors in its
218
+ * parent's slot
219
+ */
220
+ links: DocsLinks;
221
+ };
222
+ export type DocsNodeLink = {
223
+ route: string;
224
+ title: string;
225
+ };
226
+ export type DocsNodeSlot = {
227
+ /**
228
+ * the slot's key in its namespace
229
+ */
230
+ name: string;
231
+ title: string;
232
+ /**
233
+ * in reading order
234
+ */
235
+ children: DocsNodeChild[];
236
+ };
237
+ export type DocsNodeChild = {
238
+ /**
239
+ * pass it to `astryx docs` to go one level down
240
+ */
241
+ route: string;
242
+ /**
243
+ * the last segment of its route
244
+ */
245
+ name: string;
246
+ kind: string;
247
+ title: string;
248
+ summary: string;
70
249
  };
71
250
  /**
72
251
  * Options for `docs()`.
@@ -4,20 +4,26 @@
4
4
  * @file Colocated types for the `docs` command — source of truth for the docs
5
5
  * command JSON responses. `types/docs.d.ts` re-exports these.
6
6
  *
7
- * Invocation -> type discriminator
7
+ * Invocation -> type discriminator
8
8
  * ------------------------------------------------------------
9
- * xds --json docs -> docs.list
10
- * xds --json docs <topic> -> docs.detail
11
- * xds --json docs <topic> --index -> docs.index
12
- * xds --json docs <topic> <section> -> docs.detail.section
13
- * (unknown topic/section) -> CLIError
9
+ * astryx --json docs -> docs.list
10
+ * astryx --json docs <topic> -> docs.detail
11
+ * astryx --json docs <topic> --index -> docs.index
12
+ * astryx --json docs <topic> <section> -> docs.detail.section
13
+ * astryx --json docs <route> -> docs.node (a namespace or a
14
+ * typed doc in the docs tree)
15
+ * (unknown topic/section) -> CLIError
14
16
  */
15
17
 
16
18
  /**
17
- * xds --json docs
19
+ * astryx --json docs
18
20
  * @typedef {object} DocsListResponse
19
21
  * @property {'docs.list'} type
20
- * @property {DocsListEntry[]} data
22
+ * @property {DocsListEntry[]} data every topic, each readable as a topic
23
+ * @property {{namespaces?: DocsListNamespace[], notLoaded?: Array<{package: string, message: string}>}} [meta]
24
+ * `namespaces`: the docs tree's top-level namespaces, each opened by its
25
+ * `topic` as a docs.node; `notLoaded`: each package whose doc files did not
26
+ * load, and why (its docs are withdrawn)
21
27
  */
22
28
 
23
29
  /**
@@ -31,17 +37,70 @@
31
37
  */
32
38
 
33
39
  /**
34
- * xds --json docs <topic> --index
40
+ * A top-level namespace of the docs tree, as `astryx docs --json` lists it in
41
+ * `meta.namespaces`.
42
+ * @typedef {object} DocsListNamespace
43
+ * @property {string} topic its route, the argument that opens it
44
+ * @property {string} description
45
+ * @property {string} package the package that owns it
46
+ */
47
+
48
+ /**
49
+ * astryx --json docs <topic> --index
35
50
  * @typedef {object} DocsIndexResponse
36
51
  * @property {'docs.index'} type
37
52
  * @property {DocsIndex} data
38
53
  */
39
54
 
40
55
  /**
41
- * xds --json docs <topic>
56
+ * astryx --json docs <topic>
42
57
  * @typedef {object} DocsDetailResponse
43
58
  * @property {'docs.detail'} type
44
- * @property {import('@astryxdesign/cli/authoring').ReferenceDoc} data
59
+ * @property {DocsReadDoc & {links: DocsLinks}} data
60
+ * the whole doc, and the moves from it
61
+ */
62
+
63
+ /**
64
+ * A topic section as a read returns it. A read inlines each token reference
65
+ * and each `reference` block the author wrote, so its content holds only the
66
+ * stable ReferenceContentBlock kinds.
67
+ * @typedef {Omit<import('@astryxdesign/cli/authoring').ReferenceSection, 'content'>
68
+ * & {content: import('@astryxdesign/cli/authoring').ReferenceContentBlock[]}} DocsReadSection
69
+ */
70
+
71
+ /**
72
+ * A topic as a read returns it: every section a {@link DocsReadSection}.
73
+ * @typedef {Omit<import('@astryxdesign/cli/authoring').ReferenceDoc, 'sections'>
74
+ * & {sections: DocsReadSection[]}} DocsReadDoc
75
+ */
76
+
77
+ /**
78
+ * The doc a link opens (spec:AST-047 FR9). A docs read resolves every link:
79
+ * an inline `{@link <target>}` reads as `link.command`, a `reference` block in
80
+ * a namespace doc carries `link` (null when the target names no doc), and each
81
+ * `workflow` step carries `links`, one per reference. A topic read inlines a
82
+ * section's `reference` block as the doc it includes, then a line naming where
83
+ * that comes from and the command that opens it.
84
+ * @typedef {import('../../foundation/doc-compiler/links.mjs').DocLink} DocLink
85
+ */
86
+
87
+ /**
88
+ * One move: a whole `astryx docs` command a reader can run as is.
89
+ * @typedef {'astryx docs' | `astryx docs ${string}`} DocsCommand
90
+ */
91
+
92
+ /**
93
+ * The moves a docs read offers (spec:AST-047). Every read but the topic list
94
+ * carries them.
95
+ * @typedef {object} DocsLinks
96
+ * @property {DocsCommand} up opens the level the read sits in: a section's
97
+ * topic index, a node's parent namespace, or the topic list
98
+ * @property {DocsCommand} [previous] opens the item before it at its level: the
99
+ * previous section of its topic, or the previous node in its parent's slot
100
+ * @property {DocsCommand} [next] opens the item after it at its level
101
+ * @property {DocsCommand[]} [related] opens each doc a typed doc names: a
102
+ * function's command, a command's function, and the docs it lists as
103
+ * related
45
104
  */
46
105
 
47
106
  /**
@@ -52,6 +111,7 @@
52
111
  * @property {string} title
53
112
  * @property {string} description
54
113
  * @property {DocsIndexSection[]} sections
114
+ * @property {DocsLinks} links the moves from the index
55
115
  */
56
116
 
57
117
  /**
@@ -63,10 +123,64 @@
63
123
  */
64
124
 
65
125
  /**
66
- * xds --json docs <topic> <section>
126
+ * astryx --json docs <topic> <section>
67
127
  * @typedef {object} DocsDetailSectionResponse
68
128
  * @property {'docs.detail.section'} type
69
- * @property {import('@astryxdesign/cli/authoring').ReferenceSection} data
129
+ * @property {DocsReadSection & {links: DocsLinks}} data
130
+ * the section, and the moves from it: up to its topic's index, and across to
131
+ * the sections before and after it
132
+ */
133
+
134
+ /**
135
+ * astryx --json docs <route>, for a namespace or a typed doc in the docs tree
136
+ * @typedef {object} DocsNodeResponse
137
+ * @property {'docs.node'} type
138
+ * @property {DocsNode} data
139
+ */
140
+
141
+ /**
142
+ * One node of the docs tree.
143
+ * @typedef {object} DocsNode
144
+ * @property {string | null} id the doc's DocId, built from its provider's
145
+ * ProviderId, kind, and name (see the provider-identity authoring doc);
146
+ * unchanged when the node moves. Always present; null on a generated level,
147
+ * such as `cli/api/functions`, which has no authored doc
148
+ * @property {string} route pass it to `astryx docs`
149
+ * @property {string} kind `namespace`, or the typed doc's kind: `command`,
150
+ * `function`, `schema`, or `enum`
151
+ * @property {string} package the package that owns the node
152
+ * @property {string} title
153
+ * @property {string} summary
154
+ * @property {DocsNodeLink[]} breadcrumb the namespaces above it, top first
155
+ * @property {DocsNodeSlot[]} slots a namespace's slots that hold children, in
156
+ * order; empty for a typed doc
157
+ * @property {import('@astryxdesign/cli/authoring').ReferenceContentBlock[]} content
158
+ * a typed doc's content; empty for a namespace
159
+ * @property {DocsLinks} links the moves from the node: up to its parent (the
160
+ * topic list, for a top-level namespace), and across to its neighbors in its
161
+ * parent's slot
162
+ */
163
+
164
+ /**
165
+ * @typedef {object} DocsNodeLink
166
+ * @property {string} route
167
+ * @property {string} title
168
+ */
169
+
170
+ /**
171
+ * @typedef {object} DocsNodeSlot
172
+ * @property {string} name the slot's key in its namespace
173
+ * @property {string} title
174
+ * @property {DocsNodeChild[]} children in reading order
175
+ */
176
+
177
+ /**
178
+ * @typedef {object} DocsNodeChild
179
+ * @property {string} route pass it to `astryx docs` to go one level down
180
+ * @property {string} name the last segment of its route
181
+ * @property {string} kind
182
+ * @property {string} title
183
+ * @property {string} summary
70
184
  */
71
185
 
72
186
  /**
@@ -3,8 +3,9 @@
3
3
  /**
4
4
  * @file docs.index leaf — the section index of one topic.
5
5
  *
6
- * @input A topic name plus optional {lang, zh, dense, cwd}. Resolves and loads
7
- * the topic via the shared adapter.
6
+ * @input A topic name plus optional {lang, zh, dense, cwd}. Resolves the topic
7
+ * via the shared adapter and reads its lowered compiled node; nothing is
8
+ * linked, since the index never inlines a token reference.
8
9
  * @output { type: 'docs.index', data: DocsIndex } — the topic's name, title and
9
10
  * description and, for each section, the key it is read by, its title, and a
10
11
  * one-line summary. Matches `astryx --json docs <topic> --index`.
@@ -13,8 +14,8 @@
13
14
  * read, is the detail leaf.
14
15
  */
15
16
 
16
- import {buildDocsIndexData} from '../../../foundation/discovery/docs-section-key.mjs';
17
- import {resolveTopicDocs} from '../_adapter.mjs';
17
+ import {indexView} from '../../../foundation/doc-compiler/lenses.mjs';
18
+ import {resolveTopicDocs, topicLinks} from '../_adapter.mjs';
18
19
 
19
20
  /**
20
21
  * @param {string} topic
@@ -26,6 +27,14 @@ import {resolveTopicDocs} from '../_adapter.mjs';
26
27
  * @returns {Promise<import('../docs.type.mjs').DocsIndexResponse>}
27
28
  */
28
29
  export async function index(topic, options = {}) {
29
- const {docsData} = await resolveTopicDocs(topic, options);
30
- return {type: 'docs.index', data: buildDocsIndexData(docsData)};
30
+ const {node, entry, catalog} = await resolveTopicDocs(topic, options);
31
+ const view = indexView(node);
32
+ /** @type {import('../docs.type.mjs').DocsIndex} */
33
+ const data = {
34
+ ...view,
35
+ // A guide the docs tree places is read by its route, not its doc name.
36
+ name: entry.tree ? entry.name : view.name,
37
+ links: await topicLinks(catalog, entry),
38
+ };
39
+ return {type: 'docs.index', data};
31
40
  }
@@ -49,7 +49,7 @@ describe('docs.index leaf', () => {
49
49
  });
50
50
 
51
51
  describe('docs() topic reads', () => {
52
- it('returns the whole topic by default, as before', async () => {
52
+ it('returns the whole topic by default', async () => {
53
53
  const res = await docs('theme');
54
54
  expect(res.type).toBe('docs.detail');
55
55
  expect(res.data.sections[0].content.length).toBeGreaterThan(0);