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

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