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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/README.md +106 -72
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/build.doc.mjs +4 -3
  4. package/api/build/build.test.mjs +14 -3
  5. package/api/build/build.type.d.mts +36 -2
  6. package/api/build/build.type.mjs +25 -4
  7. package/api/build/help/help.d.mts +8 -5
  8. package/api/build/help/help.mjs +56 -6
  9. package/api/component/component.doc.mjs +13 -3
  10. package/api/component/component.mjs +31 -2
  11. package/api/component/component.test.mjs +38 -0
  12. package/api/component/component.type.d.mts +22 -11
  13. package/api/component/component.type.mjs +32 -24
  14. package/api/component/detail/blocks/blocks.d.mts +2 -1
  15. package/api/component/detail/blocks/blocks.mjs +4 -3
  16. package/api/component/list/list.d.mts +0 -5
  17. package/api/component/list/list.mjs +37 -9
  18. package/api/discover/discover.doc.mjs +2 -1
  19. package/api/discover/discover.type.d.mts +4 -4
  20. package/api/discover/discover.type.mjs +10 -10
  21. package/api/docs/_adapter.d.mts +32 -24
  22. package/api/docs/_adapter.mjs +81 -87
  23. package/api/docs/compiled-topics.test.mjs +78 -0
  24. package/api/docs/detail/detail.mjs +14 -63
  25. package/api/docs/detail/section/section.d.mts +1 -1
  26. package/api/docs/detail/section/section.mjs +44 -20
  27. package/api/docs/detail/section/section.test.mjs +41 -0
  28. package/api/docs/docs.d.mts +7 -2
  29. package/api/docs/docs.doc.mjs +28 -10
  30. package/api/docs/docs.mjs +16 -9
  31. package/api/docs/docs.test.mjs +6 -0
  32. package/api/docs/docs.type.d.mts +40 -3
  33. package/api/docs/docs.type.mjs +36 -8
  34. package/api/docs/index/index.d.mts +18 -0
  35. package/api/docs/index/index.mjs +32 -0
  36. package/api/docs/index/index.test.mjs +62 -0
  37. package/api/docs/integrationDocs.test.mjs +106 -0
  38. package/api/docs/list/list.mjs +3 -7
  39. package/api/doctor/doctor.d.mts +70 -0
  40. package/api/doctor/doctor.doc.mjs +1 -0
  41. package/api/doctor/doctor.mjs +404 -0
  42. package/api/doctor/doctor.test.mjs +522 -1
  43. package/api/gap-report/gap-report.doc.mjs +8 -4
  44. package/api/hook/_adapter.mjs +19 -5
  45. package/api/hook/hook.doc.mjs +1 -0
  46. package/api/hook/hook.type.d.mts +3 -3
  47. package/api/hook/hook.type.mjs +11 -11
  48. package/api/hook/list/list.d.mts +2 -2
  49. package/api/hook/list/list.mjs +69 -17
  50. package/api/init/init.doc.mjs +5 -0
  51. package/api/init/init.test.mjs +41 -1
  52. package/api/init/remove/remove.mjs +1 -1
  53. package/api/init/run/run.mjs +20 -10
  54. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  55. package/api/integration/add-contribution.mjs +23 -10
  56. package/api/integration/add-contribution.test.mjs +121 -7
  57. package/api/integration/add-theme.mjs +34 -64
  58. package/api/integration/add-theme.test.mjs +105 -21
  59. package/api/integration/authoring-checks.test.mjs +8 -4
  60. package/api/integration/integration-authoring.type.d.mts +1 -1
  61. package/api/integration/integration-block-exports.test.mjs +10 -6
  62. package/api/integration/integrationAdd.doc.mjs +8 -4
  63. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  64. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  65. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  66. package/api/integration/integrationAddDoc.doc.mjs +1 -0
  67. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  68. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  69. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  70. package/api/integration/integrationDocConflicts.doc.mjs +1 -0
  71. package/api/integration/integrationPackCheck.doc.mjs +1 -0
  72. package/api/integration/integrationTemplateConflicts.doc.mjs +1 -0
  73. package/api/integration/pack-check.mjs +49 -7
  74. package/api/integration/pack-check.test.mjs +266 -47
  75. package/api/integration/summarizeIssues.doc.mjs +1 -0
  76. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  77. package/api/integration/validate-integration.mjs +52 -102
  78. package/api/integration/validate-integration.test.mjs +176 -23
  79. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  80. package/api/integration/validateIntegration.doc.mjs +2 -1
  81. package/api/json/assertResponse.doc.mjs +1 -0
  82. package/api/json/envelope-types.test.mjs +76 -0
  83. package/api/json/isError.doc.mjs +1 -0
  84. package/api/json/parseResponse.doc.mjs +3 -2
  85. package/api/layout/expand/expand.mjs +7 -5
  86. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  87. package/api/layout/grammar/grammar.mjs +2 -1
  88. package/api/layout/layoutCheck.doc.mjs +1 -0
  89. package/api/layout/layoutExpand.doc.mjs +2 -1
  90. package/api/layout/layoutGrammar.doc.mjs +1 -0
  91. package/api/search/search-return-type.test.mjs +54 -0
  92. package/api/search/search.d.mts +3 -10
  93. package/api/search/search.doc.mjs +6 -1
  94. package/api/search/search.mjs +31 -14
  95. package/api/search/search.test.mjs +34 -0
  96. package/api/search/search.type.d.mts +2 -2
  97. package/api/search/search.type.mjs +1 -1
  98. package/api/swizzle/copy/copy.mjs +28 -11
  99. package/api/swizzle/swizzle.doc.mjs +2 -1
  100. package/api/swizzle/swizzle.type.d.mts +2 -2
  101. package/api/swizzle/swizzle.type.mjs +2 -2
  102. package/api/template/copy/copy.mjs +17 -23
  103. package/api/template/copy/copy.test.mjs +17 -0
  104. package/api/template/template-suffix.test.mjs +41 -21
  105. package/api/template/template.d.mts +1 -1
  106. package/api/template/template.doc.mjs +3 -1
  107. package/api/template/template.type.d.mts +6 -6
  108. package/api/template/template.type.mjs +12 -12
  109. package/api/theme/_adapter.d.mts +2 -3
  110. package/api/theme/_adapter.mjs +4 -5
  111. package/api/theme/add/add.binary.test.mjs +84 -0
  112. package/api/theme/add/add.mjs +20 -3
  113. package/api/theme/add/add.staging.test.mjs +66 -0
  114. package/api/theme/add/add.test.mjs +14 -1
  115. package/api/theme/build/build.mjs +133 -42
  116. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  117. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  118. package/api/theme/build/build.test.mjs +127 -0
  119. package/api/theme/build/font-warning.mjs +3 -3
  120. package/api/theme/build/font-warning.test.mjs +5 -2
  121. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  122. package/api/theme/integration-themes.test.mjs +39 -28
  123. package/api/theme/list/list.test.mjs +19 -20
  124. package/api/theme/listThemes.doc.mjs +6 -5
  125. package/api/theme/palette/generate/generate.mjs +8 -3
  126. package/api/theme/palette/generate/generate.test.mjs +96 -0
  127. package/api/theme/palette/generate/generator.d.mts +10 -13
  128. package/api/theme/palette/generate/generator.mjs +15 -4
  129. package/api/theme/palette/generate/generator.test.mjs +10 -0
  130. package/api/theme/template/template.mjs +11 -2
  131. package/api/theme/template/template.test.mjs +15 -0
  132. package/api/theme/theme.type.d.mts +170 -11
  133. package/api/theme/theme.type.mjs +94 -27
  134. package/api/theme/themeAdd.doc.mjs +4 -3
  135. package/api/theme/themeBuild.doc.mjs +8 -4
  136. package/api/theme/themeList.doc.mjs +6 -3
  137. package/api/theme/themeListAvailable.doc.mjs +5 -3
  138. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  139. package/api/theme/themeTargets.doc.mjs +1 -0
  140. package/api/theme/themeTemplate.doc.mjs +5 -1
  141. package/api/upgrade/_adapter.d.mts +12 -3
  142. package/api/upgrade/_adapter.mjs +123 -19
  143. package/api/upgrade/list/list.mjs +2 -1
  144. package/api/upgrade/list/list.test.mjs +73 -0
  145. package/api/upgrade/project-context.test.mjs +272 -0
  146. package/api/upgrade/provider-agreement.test.mjs +152 -0
  147. package/api/upgrade/run/run.mjs +1 -0
  148. package/api/upgrade/status/status.mjs +2 -2
  149. package/api/upgrade/upgrade.doc.mjs +7 -4
  150. package/api/upgrade/upgrade.type.d.mts +9 -5
  151. package/api/upgrade/upgrade.type.mjs +12 -11
  152. package/assets/codemods/integration-discovery.mjs +48 -4
  153. package/assets/codemods/integration-discovery.test.mjs +73 -0
  154. package/assets/codemods/runner.mjs +115 -5
  155. package/assets/codemods/term-log.mjs +32 -8
  156. package/assets/codemods/term-log.test.mjs +19 -1
  157. package/assets/codemods/transform-prop.mjs +109 -0
  158. package/assets/codemods/transform-prop.test.mjs +95 -0
  159. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +216 -0
  160. package/assets/codemods/transforms/next/index.mjs +11 -1
  161. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  162. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  163. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  164. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  165. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  166. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  167. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  168. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  169. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  170. package/assets/docs/README.md +9 -0
  171. package/assets/docs/authoring.doc.mjs +14 -0
  172. package/assets/docs/cli-integrations.doc.mjs +78 -20
  173. package/assets/docs/cli.doc.mjs +15 -0
  174. package/assets/docs/styling-libraries.doc.mjs +1 -1
  175. package/assets/docs/theme.doc.mjs +1 -1
  176. package/assets/docs/working-with-ai.doc.mjs +1 -1
  177. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  178. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  179. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  180. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  181. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  182. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  183. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  184. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  185. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  186. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  187. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  188. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  189. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  190. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  191. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  192. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  193. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  194. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  195. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  196. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  197. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  198. package/authoring/_shared/contract.ts +22 -0
  199. package/authoring/codemod/codemod.doc.mjs +7 -2
  200. package/authoring/codemod/parse.d.mts +8 -8
  201. package/authoring/codemod/parse.mjs +8 -6
  202. package/authoring/config/config.doc.mjs +2 -2
  203. package/authoring/config/debug-composition.test.mjs +92 -0
  204. package/authoring/config/parse.d.mts +13 -13
  205. package/authoring/config/parse.mjs +8 -8
  206. package/authoring/config/type.ts +18 -6
  207. package/authoring/debug/debug.doc.d.mts +11 -0
  208. package/authoring/debug/debug.doc.mjs +182 -0
  209. package/authoring/debug/parse.d.mts +5 -5
  210. package/authoring/debug/parse.mjs +3 -3
  211. package/authoring/doctypes/_schema.d.mts +788 -23
  212. package/authoring/doctypes/_schema.mjs +492 -39
  213. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  214. package/authoring/doctypes/base/graph-fields.doc.mjs +62 -0
  215. package/authoring/doctypes/base/type.ts +40 -0
  216. package/authoring/doctypes/command/command.doc.mjs +4 -3
  217. package/authoring/doctypes/command/parse.d.mts +2 -2
  218. package/authoring/doctypes/command/parse.mjs +1 -1
  219. package/authoring/doctypes/command/type.ts +4 -3
  220. package/authoring/doctypes/component/component.doc.mjs +6 -3
  221. package/authoring/doctypes/component/parse.d.mts +2 -2
  222. package/authoring/doctypes/component/parse.mjs +1 -1
  223. package/authoring/doctypes/component/type.ts +6 -5
  224. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  225. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  226. package/authoring/doctypes/enum/parse.d.mts +2 -2
  227. package/authoring/doctypes/enum/parse.mjs +1 -1
  228. package/authoring/doctypes/enum/type.ts +4 -2
  229. package/authoring/doctypes/function/function.doc.mjs +5 -1
  230. package/authoring/doctypes/function/parse.d.mts +2 -2
  231. package/authoring/doctypes/function/parse.mjs +1 -1
  232. package/authoring/doctypes/function/type.ts +7 -3
  233. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  234. package/authoring/doctypes/hook/parse.d.mts +2 -2
  235. package/authoring/doctypes/hook/parse.mjs +1 -1
  236. package/authoring/doctypes/hook/type.ts +5 -4
  237. package/authoring/doctypes/legacy.d.mts +8 -6
  238. package/authoring/doctypes/legacy.mjs +5 -4
  239. package/authoring/doctypes/load-contract.test.mjs +208 -0
  240. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  241. package/authoring/doctypes/namespace/namespace.doc.mjs +132 -0
  242. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  243. package/authoring/doctypes/namespace/parse.mjs +25 -0
  244. package/authoring/doctypes/namespace/parse.test.mjs +165 -0
  245. package/authoring/doctypes/namespace/type.ts +71 -0
  246. package/authoring/doctypes/parse.d.mts +22 -18
  247. package/authoring/doctypes/parse.mjs +22 -12
  248. package/authoring/doctypes/parse.test.mjs +77 -3
  249. package/authoring/doctypes/reference/parse.d.mts +2 -2
  250. package/authoring/doctypes/reference/parse.mjs +8 -5
  251. package/authoring/doctypes/reference/reference.doc.mjs +18 -5
  252. package/authoring/doctypes/reference/type.ts +53 -7
  253. package/authoring/doctypes/schema/parse.d.mts +2 -2
  254. package/authoring/doctypes/schema/parse.mjs +1 -1
  255. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  256. package/authoring/doctypes/schema/type.ts +4 -4
  257. package/authoring/doctypes/template/parse.d.mts +92 -1
  258. package/authoring/doctypes/template/parse.mjs +36 -2
  259. package/authoring/doctypes/template/parse.test.mjs +8 -2
  260. package/authoring/doctypes/template/template.doc.mjs +7 -3
  261. package/authoring/doctypes/template/type.ts +5 -2
  262. package/authoring/doctypes/theme/parse.d.mts +35 -0
  263. package/authoring/doctypes/theme/parse.mjs +76 -0
  264. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  265. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  266. package/authoring/doctypes/theme/type.ts +42 -0
  267. package/authoring/doctypes/types.ts +12 -10
  268. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  269. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  270. package/authoring/gap-report/parse.d.mts +10 -10
  271. package/authoring/gap-report/parse.mjs +6 -6
  272. package/authoring/gap-report/type.ts +1 -1
  273. package/authoring/identity/identity.doc.d.mts +9 -0
  274. package/authoring/identity/identity.doc.mjs +61 -0
  275. package/authoring/identity/type.ts +132 -0
  276. package/authoring/index.d.mts +2 -0
  277. package/authoring/index.d.ts +51 -17
  278. package/authoring/index.mjs +3 -1
  279. package/authoring/integration/integration.doc.mjs +15 -8
  280. package/authoring/integration/parse.d.mts +2 -2
  281. package/authoring/integration/parse.mjs +1 -1
  282. package/authoring/integration/parse.test.mjs +10 -1
  283. package/authoring/integration/schema.d.mts +6 -4
  284. package/authoring/integration/schema.mjs +9 -3
  285. package/authoring/integration/type.ts +18 -7
  286. package/authoring/shadcn/receipt.d.mts +6 -6
  287. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  288. package/clients/cli/command-load-failure.test.mjs +83 -0
  289. package/clients/cli/commands/blog.doc.mjs +1 -1
  290. package/clients/cli/commands/blog.mjs +23 -8
  291. package/clients/cli/commands/blog.test.mjs +42 -1
  292. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  293. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  294. package/clients/cli/commands/build-theme.mjs +5 -5
  295. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  296. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  297. package/clients/cli/commands/build.doc.mjs +5 -2
  298. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  299. package/clients/cli/commands/build.mjs +32 -47
  300. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  301. package/clients/cli/commands/build.text-fields.test.mjs +40 -0
  302. package/clients/cli/commands/component/index.mjs +2 -7
  303. package/clients/cli/commands/component-package.test.mjs +46 -0
  304. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  305. package/clients/cli/commands/component.doc.mjs +1 -1
  306. package/clients/cli/commands/component.test.mjs +19 -0
  307. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  308. package/clients/cli/commands/discover.broken-integration.test.mjs +48 -0
  309. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  310. package/clients/cli/commands/discover.doc.mjs +5 -3
  311. package/clients/cli/commands/discover.mjs +3 -3
  312. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  313. package/clients/cli/commands/docs.doc.mjs +14 -4
  314. package/clients/cli/commands/docs.mjs +121 -21
  315. package/clients/cli/commands/docs.test.mjs +88 -0
  316. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  317. package/clients/cli/commands/doctor-integration-docs.doc.mjs +1 -1
  318. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -1
  319. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  320. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  321. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  322. package/clients/cli/commands/doctor-integration.test.mjs +15 -7
  323. package/clients/cli/commands/doctor.doc.mjs +1 -1
  324. package/clients/cli/commands/doctor.mjs +6 -16
  325. package/clients/cli/commands/doctor.test.mjs +42 -0
  326. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  327. package/clients/cli/commands/gap-report.test.mjs +72 -0
  328. package/clients/cli/commands/hook/index.mjs +7 -17
  329. package/clients/cli/commands/hook.doc.mjs +1 -1
  330. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  331. package/clients/cli/commands/init.doc.mjs +20 -9
  332. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  333. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  334. package/clients/cli/commands/integration-add.doc.mjs +22 -6
  335. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  336. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  337. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  338. package/clients/cli/commands/integration.doc.mjs +1 -1
  339. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  340. package/clients/cli/commands/json-contract.test.mjs +33 -0
  341. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  342. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  343. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  344. package/clients/cli/commands/layout.doc.mjs +3 -3
  345. package/clients/cli/commands/layout.mjs +21 -9
  346. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  347. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  348. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  349. package/clients/cli/commands/manifest.doc.mjs +1 -1
  350. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  351. package/clients/cli/commands/search.doc.mjs +7 -4
  352. package/clients/cli/commands/search.mjs +17 -7
  353. package/clients/cli/commands/search.test.mjs +75 -0
  354. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  355. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  356. package/clients/cli/commands/template.doc.mjs +29 -7
  357. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  358. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  359. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  360. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  361. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  362. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  363. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  364. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  365. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  366. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  367. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  368. package/clients/cli/commands/theme.doc.mjs +1 -1
  369. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  370. package/clients/cli/commands/upgrade.doc.mjs +20 -9
  371. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  372. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  373. package/clients/cli/formatters/index.mjs +162 -1
  374. package/clients/cli/formatters/index.test.mjs +91 -0
  375. package/clients/cli/index.mjs +13 -30
  376. package/clients/cli/latest-version-env.test.mjs +50 -0
  377. package/clients/cli/lib/cli-error.test.mjs +7 -0
  378. package/clients/cli/lib/component-format.mjs +9 -9
  379. package/clients/cli/lib/component-format.test.mjs +1 -1
  380. package/clients/cli/lib/define-command.mjs +32 -6
  381. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  382. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  383. package/clients/cli/lib/hook-format.mjs +19 -10
  384. package/clients/cli/lib/json-shim.mjs +38 -2
  385. package/clients/cli/lib/json-shim.test.mjs +83 -0
  386. package/clients/cli/lib/manifest.d.ts +2 -0
  387. package/clients/cli/lib/manifest.mjs +29 -2
  388. package/clients/cli/lib/manifest.test.mjs +17 -0
  389. package/foundation/agent-docs/agent-docs.d.mts +4 -0
  390. package/foundation/agent-docs/agent-docs.mjs +69 -3
  391. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  392. package/foundation/config/integration-debug.test.mjs +28 -3
  393. package/foundation/config/project-themes.test.mjs +11 -19
  394. package/foundation/config/project.d.mts +8 -0
  395. package/foundation/config/project.mjs +190 -32
  396. package/foundation/config/project.test.mjs +129 -16
  397. package/foundation/discovery/authoring-self-docs.d.mts +75 -0
  398. package/foundation/discovery/authoring-self-docs.mjs +224 -0
  399. package/foundation/discovery/authoring-self-docs.test.mjs +154 -0
  400. package/foundation/discovery/authoring-surface.d.mts +74 -0
  401. package/foundation/discovery/authoring-surface.mjs +525 -0
  402. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  403. package/foundation/discovery/cli-self-docs.d.mts +113 -0
  404. package/foundation/discovery/cli-self-docs.mjs +514 -0
  405. package/foundation/discovery/cli-self-docs.test.mjs +437 -0
  406. package/foundation/discovery/component-discovery.d.mts +1 -1
  407. package/foundation/discovery/component-discovery.mjs +2 -1
  408. package/foundation/discovery/component-loader.d.mts +35 -38
  409. package/foundation/discovery/component-loader.mjs +53 -222
  410. package/foundation/discovery/docs-discovery.d.mts +12 -4
  411. package/foundation/discovery/docs-discovery.mjs +214 -98
  412. package/foundation/discovery/docs-discovery.test.mjs +284 -15
  413. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  414. package/foundation/discovery/docs-output-budget.mjs +50 -0
  415. package/foundation/discovery/docs-section-key.d.mts +98 -0
  416. package/foundation/discovery/docs-section-key.mjs +221 -0
  417. package/foundation/discovery/docs-section-key.test.mjs +224 -0
  418. package/foundation/discovery/template-adapter.d.mts +21 -5
  419. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  420. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  421. package/foundation/discovery/template-adapter.mjs +321 -66
  422. package/foundation/discovery/template-adapter.test.mjs +15 -0
  423. package/foundation/discovery/theme-discovery.d.mts +67 -7
  424. package/foundation/discovery/theme-discovery.mjs +916 -186
  425. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  426. package/foundation/discovery/theming-targets.test.mjs +4 -0
  427. package/foundation/doc-compiler/bundle.d.mts +47 -0
  428. package/foundation/doc-compiler/bundle.mjs +218 -0
  429. package/foundation/doc-compiler/bundle.test.mjs +255 -0
  430. package/foundation/doc-compiler/compile.d.mts +362 -0
  431. package/foundation/doc-compiler/compile.mjs +511 -0
  432. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  433. package/foundation/doc-compiler/diagnostics.mjs +277 -0
  434. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  435. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  436. package/foundation/doc-compiler/import.d.mts +24 -0
  437. package/foundation/doc-compiler/import.mjs +59 -0
  438. package/foundation/doc-compiler/inputs.d.mts +102 -0
  439. package/foundation/doc-compiler/inputs.mjs +286 -0
  440. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  441. package/foundation/doc-compiler/ir.d.mts +22 -0
  442. package/foundation/doc-compiler/ir.mjs +464 -0
  443. package/foundation/doc-compiler/lenses.d.mts +33 -0
  444. package/foundation/doc-compiler/lenses.mjs +127 -0
  445. package/foundation/doc-compiler/lower-doc.test.mjs +492 -0
  446. package/foundation/doc-compiler/overlays.d.mts +37 -0
  447. package/foundation/doc-compiler/overlays.mjs +206 -0
  448. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  449. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  450. package/foundation/doc-compiler/read.d.mts +126 -0
  451. package/foundation/doc-compiler/read.mjs +320 -0
  452. package/foundation/doc-compiler/read.test.mjs +313 -0
  453. package/foundation/doc-compiler/source.d.mts +33 -0
  454. package/foundation/doc-compiler/source.mjs +128 -0
  455. package/foundation/fs/module-loader.d.mts +1 -0
  456. package/foundation/fs/module-loader.mjs +50 -1
  457. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  458. package/foundation/fs/path-safety.d.mts +3 -2
  459. package/foundation/fs/path-safety.mjs +49 -19
  460. package/foundation/fs/path-safety.test.mjs +50 -0
  461. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  462. package/foundation/identity/provider-identity.d.mts +90 -0
  463. package/foundation/identity/provider-identity.mjs +320 -0
  464. package/foundation/identity/provider-identity.test.mjs +254 -0
  465. package/foundation/identity/providers.d.mts +7 -0
  466. package/foundation/identity/providers.mjs +16 -0
  467. package/foundation/integrations/autolink.d.mts +58 -1
  468. package/foundation/integrations/autolink.mjs +143 -45
  469. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  470. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  471. package/foundation/integrations/contribution-inventory.d.mts +1 -1
  472. package/foundation/integrations/contribution-inventory.mjs +17 -20
  473. package/foundation/integrations/contribution-inventory.test.mjs +67 -27
  474. package/foundation/integrations/integration-warnings.mjs +6 -0
  475. package/foundation/integrations/integrations.d.mts +49 -2
  476. package/foundation/integrations/integrations.mjs +81 -8
  477. package/foundation/integrations/integrations.test.mjs +384 -1
  478. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  479. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  480. package/foundation/integrations/provider-resolution.d.mts +152 -0
  481. package/foundation/integrations/provider-resolution.mjs +576 -0
  482. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  483. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  484. package/foundation/integrations/theme-descriptor.mjs +44 -0
  485. package/foundation/integrations/validate-contributions.d.mts +2 -0
  486. package/foundation/integrations/validate-contributions.mjs +114 -10
  487. package/foundation/response/base.d.ts +8 -4
  488. package/foundation/response/error-codes.doc.mjs +3 -4
  489. package/foundation/response/error-codes.mjs +2 -2
  490. package/foundation/response/error-codes.test.mjs +83 -0
  491. package/foundation/response/json-contract.test.mjs +57 -17
  492. package/foundation/response/json.d.mts +4 -2
  493. package/foundation/response/json.mjs +8 -10
  494. package/foundation/response/response-types.doc.mjs +16 -11
  495. package/foundation/response/response-types.doc.test.mjs +158 -0
  496. package/foundation/response/response.doc.mjs +1 -1
  497. package/foundation/text/string-utils.mjs +22 -10
  498. package/foundation/xle/expand.d.mts +2 -0
  499. package/foundation/xle/expand.mjs +3 -2
  500. package/foundation/xle/expand.test.mjs +54 -0
  501. package/package.json +9 -11
  502. package/assets/templates/themes/manifest.json +0 -95
  503. package/clients/cli/lib/update-check.mjs +0 -83
  504. package/clients/cli/lib/update-check.test.mjs +0 -137
  505. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -1,18 +1,68 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file build.help leaf — the "how to build a page" playbook signal.
4
+ * @file build.help leaf — the "how to build a page" playbook.
5
5
  *
6
- * `build` with no query returns this envelope: a pure marker that the command
7
- * renderer expands into the workflow playbook prose. It carries no data beyond
8
- * `playbook: true`, so the JSON shape stays environment-agnostic and stable.
6
+ * `build` with no query returns this envelope. The playbook is data — steps,
7
+ * rules, and related lookups — so a `--json` or programmatic caller gets the
8
+ * same guidance the terminal shows. Commands are bare subcommands with no
9
+ * package-manager prefix, which keeps the JSON environment-agnostic; the CLI
10
+ * renders each one with the caller's invocation, as it does build.kit's
11
+ * `hint.commands`.
9
12
  */
10
13
 
11
14
  /**
12
- * The page-building playbook signal (emitted when `build` runs with no query).
15
+ * The page-building playbook (emitted when `build` runs with no query).
13
16
  *
14
17
  * @returns {import('../build.type.mjs').BuildHelpResponse}
15
18
  */
16
19
  export function buildHelp() {
17
- return {type: 'build.help', data: {playbook: true}};
20
+ return {
21
+ type: 'build.help',
22
+ data: {
23
+ playbook: true,
24
+ title: 'How to build a page with Astryx',
25
+ steps: [
26
+ {
27
+ title: "Find a starting point for what you're building",
28
+ commands: [{command: 'build "<what you\'re building>"'}],
29
+ returns:
30
+ 'the closest [page] template, the [block]s that cover parts, and the [component]s to fill the gaps, with a recommended start',
31
+ },
32
+ {
33
+ title: 'If a [page] template matches, scaffold it and adapt',
34
+ commands: [{command: 'template <name> [path]'}],
35
+ },
36
+ {
37
+ title: 'If nothing matches exactly, compose',
38
+ commands: [
39
+ {
40
+ command: 'template <name> --skeleton',
41
+ purpose: "study a close page's layout",
42
+ },
43
+ {
44
+ command: 'template <BlockName>',
45
+ purpose: 'drop in each block from the kit',
46
+ },
47
+ {
48
+ command: 'component <Name>',
49
+ purpose: 'fill remaining gaps (read props)',
50
+ },
51
+ ],
52
+ },
53
+ ],
54
+ rules: [
55
+ 'No <div>/raw HTML for layout — use VStack/HStack/Grid/Stack/Card etc.',
56
+ 'No style={{}} — use component props, and design tokens for values.',
57
+ 'Wrap the app in <Theme theme={...}> and import core reset.css + astryx.css.',
58
+ ],
59
+ related: [
60
+ {command: 'docs tokens', purpose: 'the design tokens'},
61
+ {
62
+ command: 'search <query>',
63
+ purpose: 'a neutral lookup of any component, doc, or template',
64
+ },
65
+ ],
66
+ },
67
+ };
18
68
  }
@@ -12,6 +12,7 @@ export const doc = {
12
12
  type: 'function',
13
13
  kind: 'api',
14
14
  name: 'component',
15
+ namespace: 'cli/api',
15
16
  displayName: 'component()',
16
17
  summary:
17
18
  'Resolve a component by name, or list the catalog, with optional focused slices (props, source, showcase, blocks).',
@@ -91,7 +92,8 @@ export const doc = {
91
92
  {
92
93
  name: 'options.lang',
93
94
  type: 'string',
94
- description: 'Language code for localized doc content.',
95
+ description:
96
+ "Language code for localized doc content: 'en', 'zh', or 'dense'.",
95
97
  },
96
98
  {
97
99
  name: 'options.zh',
@@ -108,12 +110,12 @@ export const doc = {
108
110
  {
109
111
  type: 'component.list',
110
112
  description:
111
- "The catalog grouped by category. data.detail is the level ('names' | 'compact' | 'full') and data.components is the grouped map: names entries with name, package, and an optional canonical import for integrations; brief entries; or full ComponentDoc entries.",
113
+ "The catalog grouped by category. data.detail is the level ('names' | 'compact' | 'full') and data.components is the grouped map: names entries with name, package, and an optional canonical import for integration and legacy package components; brief entries; or full ComponentDoc entries.",
112
114
  },
113
115
  {
114
116
  type: 'component.detail',
115
117
  description:
116
- "One component's authored ComponentDoc plus ownership metadata (owner package, import specifier, whether source is available).",
118
+ "One component's authored ComponentDoc plus ownership metadata (owner package, import specifier, whether source is available). When the name is a sub-component documented in a parent's doc, the payload is scoped to it and parentDoc names that parent.",
117
119
  },
118
120
  {
119
121
  type: 'component.detail.props',
@@ -135,6 +137,14 @@ export const doc = {
135
137
  },
136
138
  ],
137
139
  throws: [
140
+ {
141
+ code: 'ERR_INVALID_DETAIL',
142
+ when: "options.detail is not 'full', 'compact', or 'brief'",
143
+ },
144
+ {
145
+ code: 'ERR_INVALID_LANG',
146
+ when: "options.lang is set to anything other than 'en', 'zh', or 'dense'",
147
+ },
138
148
  {
139
149
  code: 'ERR_CORE_NOT_FOUND',
140
150
  when: '@astryxdesign/core cannot be resolved from cwd',
@@ -34,6 +34,11 @@ import {componentDetailSource} from './detail/source/source.mjs';
34
34
  import {componentDetailShowcase} from './detail/showcase/showcase.mjs';
35
35
  import {componentDetailBlocks} from './detail/blocks/blocks.mjs';
36
36
 
37
+ /** @type {ReadonlyArray<string>} */
38
+ const DETAIL_LEVELS = ['full', 'compact', 'brief'];
39
+ /** @type {ReadonlyArray<string>} */
40
+ const LANGS = ['en', 'zh', 'dense'];
41
+
37
42
  /**
38
43
  * @param {string} [name]
39
44
  * @param {object} [options]
@@ -81,6 +86,23 @@ export async function component(name, options = {}) {
81
86
  const isListView = list || category != null || !name;
82
87
  const detail = detailOption ?? (isListView ? 'brief' : 'full');
83
88
 
89
+ // Same accepted values and codes as the CLI's --detail and --lang, checked
90
+ // first as the CLI parser does.
91
+ if (!DETAIL_LEVELS.includes(detail)) {
92
+ throw new AstryxError(
93
+ `Invalid detail "${String(detail)}". Valid levels: ${DETAIL_LEVELS.join(', ')}`,
94
+ undefined,
95
+ ERROR_CODES.ERR_INVALID_DETAIL,
96
+ );
97
+ }
98
+ if (lang != null && !LANGS.includes(lang)) {
99
+ throw new AstryxError(
100
+ `Invalid lang "${String(lang)}". Valid values: ${LANGS.join(', ')}`,
101
+ undefined,
102
+ ERROR_CODES.ERR_INVALID_LANG,
103
+ );
104
+ }
105
+
84
106
  const coreDir = requireCoreDir(cwd);
85
107
 
86
108
  // A public API caller could pass a non-string category; the list leaf does
@@ -143,7 +165,7 @@ export async function component(name, options = {}) {
143
165
  : componentDetailShowcase(dirName, {cwd, name, resolve: false});
144
166
  }
145
167
  if (blocks) {
146
- return componentDetailBlocks(dirName);
168
+ return componentDetailBlocks(dirName, cwd);
147
169
  }
148
170
  const docs = await loadComponentDoc(owner.docPath, docOpts);
149
171
  if (props) return componentDetailProps(docs);
@@ -156,6 +178,13 @@ export async function component(name, options = {}) {
156
178
  }
157
179
  const extDocPath = resolveLegacyExternalDoc(scoped.ext, dirName);
158
180
  if (extDocPath) {
181
+ // Legacy packages ship docs, never source.
182
+ if (source) {
183
+ return componentDetailSource(dirName, null, {name, notFoundInPackage: packageScope});
184
+ }
185
+ if (blocks) {
186
+ return componentDetailBlocks(dirName, cwd);
187
+ }
159
188
  const docs = await loadComponentDoc(extDocPath, docOpts);
160
189
  if (props) return componentDetailProps(docs);
161
190
  return componentDetail(docs, {package: scoped.ext.name, sourcePath: null}, dirName, coreDir);
@@ -195,7 +224,7 @@ export async function component(name, options = {}) {
195
224
 
196
225
  // ── Blocks mode ──────────────────────────────────────────────
197
226
  if (blocks) {
198
- return componentDetailBlocks(dirName);
227
+ return componentDetailBlocks(dirName, cwd);
199
228
  }
200
229
 
201
230
  // ── Sub-component scoping ────────────────────────────────────
@@ -14,6 +14,7 @@ import * as path from 'node:path';
14
14
  import {fileURLToPath} from 'node:url';
15
15
  import {component} from './component.mjs';
16
16
  import {AstryxError} from '../error.mjs';
17
+ import {runCli} from '../../test-utils/run-cli.mjs';
17
18
 
18
19
  // api/component/ -> up 4 = repo root (has packages/core, which findCoreDir walks to).
19
20
  const REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../..');
@@ -161,3 +162,40 @@ describe('component dispatcher — category guard', () => {
161
162
  }
162
163
  }, SLOW);
163
164
  });
165
+
166
+ describe('component dispatcher — detail and lang guards', () => {
167
+ // `detail` and `lang` are the same controls as the CLI's --detail and --lang:
168
+ // same accepted values, same error codes.
169
+ it('rejects a detail level the CLI rejects, with the same code', async () => {
170
+ const cliRun = await runCli(['--json', 'component', '--list', '--detail', 'bogus'], cwd);
171
+ expect(cliRun.code).toBe(1);
172
+ expect(JSON.parse(cliRun.stdout).code).toBe('ERR_INVALID_DETAIL');
173
+
174
+ const bogus = /** @type {any} */ ('bogus');
175
+ for (const call of [
176
+ () => component(undefined, {cwd, list: true, detail: bogus}),
177
+ () => component('Button', {cwd, detail: bogus}),
178
+ ]) {
179
+ const err = await call().catch(e => e);
180
+ expect(err).toBeInstanceOf(AstryxError);
181
+ expect(err.code).toBe('ERR_INVALID_DETAIL');
182
+ }
183
+ }, SLOW);
184
+
185
+ it('rejects a lang the CLI rejects, with the same code', async () => {
186
+ const cliRun = await runCli(['--json', 'component', 'Button', '--lang', 'fr'], cwd);
187
+ expect(cliRun.code).toBe(1);
188
+ expect(JSON.parse(cliRun.stdout).code).toBe('ERR_INVALID_LANG');
189
+
190
+ for (const call of [
191
+ () => component('Button', {cwd, lang: 'fr'}),
192
+ () => component(undefined, {cwd, list: true, detail: 'compact', lang: 'fr'}),
193
+ ]) {
194
+ const err = await call().catch(e => e);
195
+ expect(err).toBeInstanceOf(AstryxError);
196
+ expect(err.code).toBe('ERR_INVALID_LANG');
197
+ }
198
+ const zh = await component('Button', {cwd, lang: 'zh'});
199
+ expect(zh.type).toBe('component.detail');
200
+ }, SLOW);
201
+ });
@@ -2,7 +2,7 @@
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
4
  /**
5
- * xds --json component [--list] [--category X] [--detail names|compact|full]
5
+ * astryx --json component [--list] [--category X] [--detail names|compact|full]
6
6
  *
7
7
  * The list view emits ONE `component.list` type across all three detail levels;
8
8
  * the depth is carried in `data.detail` and `data.components` holds the grouped
@@ -31,9 +31,10 @@ export type ComponentListData = ({
31
31
  /**
32
32
  * A single entry in a `component.list` group at `detail: 'names'`. Pre-1.0 the
33
33
  * list moved from bare strings to package-qualified objects so consumers can
34
- * disambiguate ownership (core vs. an integration package). Integration entries
35
- * carry `import` — the package-authored specifier; core entries omit it (the
36
- * specifier is derived from the component name by the renderer).
34
+ * disambiguate ownership (core vs. an integration package). Integration and
35
+ * legacy `astryx.docs` package entries carry `import` — the same specifier their
36
+ * `component.detail` reports; core entries omit it (the specifier is derived
37
+ * from the component name by the renderer).
37
38
  */
38
39
  export type ComponentListEntry = {
39
40
  name: string;
@@ -42,7 +43,7 @@ export type ComponentListEntry = {
42
43
  */
43
44
  package: string;
44
45
  /**
45
- * - Import specifier; present for integration components, absent for core.
46
+ * - Import specifier; present for integration and legacy package components, absent for core.
46
47
  */
47
48
  import?: string | undefined;
48
49
  };
@@ -55,11 +56,21 @@ export type ComponentBriefEntry = {
55
56
  import: string;
56
57
  };
57
58
  /**
58
- * xds --json component <name>
59
+ * astryx --json component <name>
59
60
  */
60
61
  export type ComponentDetailResponse = {
61
62
  type: "component.detail";
62
- data: import("@astryxdesign/cli/authoring").ComponentDoc & ComponentOwnership;
63
+ data: import("@astryxdesign/cli/authoring").ComponentDoc & ComponentOwnership & ComponentDetailScope;
64
+ };
65
+ /**
66
+ * Present only when the requested name is a sub-component documented inside a
67
+ * parent's doc (e.g. `HStack` in the `Stack` doc); the payload is scoped to it.
68
+ */
69
+ export type ComponentDetailScope = {
70
+ /**
71
+ * - Name of the parent doc the payload was scoped from, e.g. 'Stack'.
72
+ */
73
+ parentDoc?: string | undefined;
63
74
  };
64
75
  /**
65
76
  * Ownership metadata attached to every `component.detail` payload. Exposes the
@@ -81,14 +92,14 @@ export type ComponentOwnership = {
81
92
  sourceAvailable: boolean;
82
93
  };
83
94
  /**
84
- * xds --json component <name> --props
95
+ * astryx --json component <name> --props
85
96
  */
86
97
  export type ComponentDetailPropsResponse = {
87
98
  type: "component.detail.props";
88
99
  data: import("@astryxdesign/cli/authoring").ComponentPropDoc[];
89
100
  };
90
101
  /**
91
- * xds --json component <name> --source
102
+ * astryx --json component <name> --source
92
103
  */
93
104
  export type ComponentDetailSourceResponse = {
94
105
  type: "component.detail.source";
@@ -98,7 +109,7 @@ export type ComponentDetailSourceResponse = {
98
109
  };
99
110
  };
100
111
  /**
101
- * xds --json component <name> --showcase
112
+ * astryx --json component <name> --showcase
102
113
  */
103
114
  export type ComponentDetailShowcaseResponse = {
104
115
  type: "component.detail.showcase";
@@ -109,7 +120,7 @@ export type ComponentDetailShowcaseResponse = {
109
120
  };
110
121
  };
111
122
  /**
112
- * xds --json component <name> --blocks
123
+ * astryx --json component <name> --blocks
113
124
  */
114
125
  export type ComponentDetailBlocksResponse = {
115
126
  type: "component.detail.blocks";
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * @file Colocated types for the `component` command — source of truth for the
5
5
  * component command's JSON responses. These typedefs describe the `{type, data}`
6
- * envelopes emitted by `xds --json component` and returned by the `component()`
6
+ * envelopes emitted by `astryx --json component` and returned by the `component()`
7
7
  * API; the `types/component.d.ts` barrel re-exports them for consumers.
8
8
  *
9
9
  * Detail-level contract for list views (brief < compact < full):
@@ -11,23 +11,23 @@
11
11
  * --detail compact Names + 1-line description + import path.
12
12
  * --detail full Full ComponentDoc per entry (props, theming, examples, etc.).
13
13
  *
14
- * Invocation -> type discriminator
14
+ * Invocation -> type discriminator
15
15
  * ------------------------------------------------------------------
16
- * xds --json component -> component.list (data.detail='names')
17
- * xds --json component --list -> component.list (data.detail='names')
18
- * xds --json component --category Form -> component.list (filtered)
19
- * xds --json component --list --detail compact -> component.list (data.detail='compact')
20
- * xds --json component --list --detail full -> component.list (data.detail='full')
21
- * xds --json component Button -> component.detail
22
- * xds --json component Button --props -> component.detail.props
23
- * xds --json component Button --source -> component.detail.source
24
- * xds --json component Button --showcase -> component.detail.showcase
25
- * xds --json component Button --blocks -> component.detail.blocks
26
- * (not found) -> CLIError
16
+ * astryx --json component -> component.list (data.detail='names')
17
+ * astryx --json component --list -> component.list (data.detail='names')
18
+ * astryx --json component --category Form -> component.list (filtered)
19
+ * astryx --json component --list --detail compact -> component.list (data.detail='compact')
20
+ * astryx --json component --list --detail full -> component.list (data.detail='full')
21
+ * astryx --json component Button -> component.detail
22
+ * astryx --json component Button --props -> component.detail.props
23
+ * astryx --json component Button --source -> component.detail.source
24
+ * astryx --json component Button --showcase -> component.detail.showcase
25
+ * astryx --json component Button --blocks -> component.detail.blocks
26
+ * (not found) -> CLIError
27
27
  */
28
28
 
29
29
  /**
30
- * xds --json component [--list] [--category X] [--detail names|compact|full]
30
+ * astryx --json component [--list] [--category X] [--detail names|compact|full]
31
31
  *
32
32
  * The list view emits ONE `component.list` type across all three detail levels;
33
33
  * the depth is carried in `data.detail` and `data.components` holds the grouped
@@ -52,13 +52,14 @@
52
52
  /**
53
53
  * A single entry in a `component.list` group at `detail: 'names'`. Pre-1.0 the
54
54
  * list moved from bare strings to package-qualified objects so consumers can
55
- * disambiguate ownership (core vs. an integration package). Integration entries
56
- * carry `import` — the package-authored specifier; core entries omit it (the
57
- * specifier is derived from the component name by the renderer).
55
+ * disambiguate ownership (core vs. an integration package). Integration and
56
+ * legacy `astryx.docs` package entries carry `import` — the same specifier their
57
+ * `component.detail` reports; core entries omit it (the specifier is derived
58
+ * from the component name by the renderer).
58
59
  * @typedef {object} ComponentListEntry
59
60
  * @property {string} name
60
61
  * @property {string} package - Owner package, e.g. '@astryxdesign/core' or '@acme/astryx-meta'.
61
- * @property {string} [import] - Import specifier; present for integration components, absent for core.
62
+ * @property {string} [import] - Import specifier; present for integration and legacy package components, absent for core.
62
63
  */
63
64
 
64
65
  /**
@@ -70,10 +71,17 @@
70
71
  */
71
72
 
72
73
  /**
73
- * xds --json component <name>
74
+ * astryx --json component <name>
74
75
  * @typedef {object} ComponentDetailResponse
75
76
  * @property {'component.detail'} type
76
- * @property {import('@astryxdesign/cli/authoring').ComponentDoc & ComponentOwnership} data
77
+ * @property {import('@astryxdesign/cli/authoring').ComponentDoc & ComponentOwnership & ComponentDetailScope} data
78
+ */
79
+
80
+ /**
81
+ * Present only when the requested name is a sub-component documented inside a
82
+ * parent's doc (e.g. `HStack` in the `Stack` doc); the payload is scoped to it.
83
+ * @typedef {object} ComponentDetailScope
84
+ * @property {string} [parentDoc] - Name of the parent doc the payload was scoped from, e.g. 'Stack'.
77
85
  */
78
86
 
79
87
  /**
@@ -87,28 +95,28 @@
87
95
  */
88
96
 
89
97
  /**
90
- * xds --json component <name> --props
98
+ * astryx --json component <name> --props
91
99
  * @typedef {object} ComponentDetailPropsResponse
92
100
  * @property {'component.detail.props'} type
93
101
  * @property {import('@astryxdesign/cli/authoring').ComponentPropDoc[]} data
94
102
  */
95
103
 
96
104
  /**
97
- * xds --json component <name> --source
105
+ * astryx --json component <name> --source
98
106
  * @typedef {object} ComponentDetailSourceResponse
99
107
  * @property {'component.detail.source'} type
100
108
  * @property {{component: string; source: string}} data
101
109
  */
102
110
 
103
111
  /**
104
- * xds --json component <name> --showcase
112
+ * astryx --json component <name> --showcase
105
113
  * @typedef {object} ComponentDetailShowcaseResponse
106
114
  * @property {'component.detail.showcase'} type
107
115
  * @property {{component: string; aspectRatio: number; source: string}} data
108
116
  */
109
117
 
110
118
  /**
111
- * xds --json component <name> --blocks
119
+ * astryx --json component <name> --blocks
112
120
  * @typedef {object} ComponentDetailBlocksResponse
113
121
  * @property {'component.detail.blocks'} type
114
122
  * @property {{component: string; showcase: BlockEntry | null; examples: BlockEntry[]; related: BlockEntry[]}} data
@@ -6,6 +6,7 @@
6
6
  * envelope, splitting them into the hero showcase, component-specific examples,
7
7
  * and broader related blocks.
8
8
  * @param {string} componentName
9
+ * @param {string} cwd - project to discover blocks from; never the process cwd
9
10
  * @returns {Promise<import('../../component.type.mjs').ComponentDetailBlocksResponse>}
10
11
  */
11
- export function componentDetailBlocks(componentName: string): Promise<import("../../component.type.mjs").ComponentDetailBlocksResponse>;
12
+ export function componentDetailBlocks(componentName: string, cwd: string): Promise<import("../../component.type.mjs").ComponentDetailBlocksResponse>;
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * @file `component.detail.blocks` leaf — a component's example/related blocks.
5
5
  *
6
- * @input a component name
6
+ * @input a component name + the project cwd
7
7
  * @output the `component.detail.blocks` envelope (showcase, examples, related)
8
8
  * @position api/component/detail/blocks (projection leaf; routed by component.mjs)
9
9
  */
@@ -16,10 +16,11 @@ import {findRelatedBlocks} from '../../../template/template.mjs';
16
16
  * envelope, splitting them into the hero showcase, component-specific examples,
17
17
  * and broader related blocks.
18
18
  * @param {string} componentName
19
+ * @param {string} cwd - project to discover blocks from; never the process cwd
19
20
  * @returns {Promise<import('../../component.type.mjs').ComponentDetailBlocksResponse>}
20
21
  */
21
- export async function componentDetailBlocks(componentName) {
22
- const allBlocks = await findRelatedBlocks(componentName);
22
+ export async function componentDetailBlocks(componentName, cwd) {
23
+ const allBlocks = await findRelatedBlocks(componentName, cwd);
23
24
  const toEntry = (/** @type {any} */ b) => ({
24
25
  name: b.dirName,
25
26
  displayName: b.name,
@@ -1,11 +1,6 @@
1
1
  // @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
- /**
5
- * @typedef {import('../component.type.mjs').ComponentListResponse} ComponentListResponse
6
- * @typedef {import('../component.type.mjs').ComponentListEntry} ComponentListEntry
7
- * @typedef {import('../component.type.mjs').ComponentBriefEntry} ComponentBriefEntry
8
- */
9
4
  /**
10
5
  * Build the `component.list` envelope. The list taxonomy is collapsed: all
11
6
  * three detail levels emit ONE `component.list` type; the depth rides in
@@ -17,13 +17,14 @@ import {
17
17
  discoverExternalComponentsGrouped,
18
18
  discoverIntegrationComponents,
19
19
  findComponentReadme,
20
+ findExternalComponentDoc,
20
21
  resolveImportPath,
21
22
  resolveIntegrationImportPath,
22
23
  } from '../../../foundation/discovery/component-discovery.mjs';
23
24
  import {discoverExternalPackages} from '../../../foundation/fs/paths.mjs';
24
25
  import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
25
26
  import {AstryxError} from '../../error.mjs';
26
- import {loadComponentDoc, loadIntegrationsSafely} from '../_adapter.mjs';
27
+ import {loadComponentDoc, loadIntegrationsSafely, withOwnership} from '../_adapter.mjs';
27
28
 
28
29
  /**
29
30
  * @typedef {import('../component.type.mjs').ComponentListResponse} ComponentListResponse
@@ -31,6 +32,29 @@ import {loadComponentDoc, loadIntegrationsSafely} from '../_adapter.mjs';
31
32
  * @typedef {import('../component.type.mjs').ComponentBriefEntry} ComponentBriefEntry
32
33
  */
33
34
 
35
+ /**
36
+ * The import a legacy `pkg.astryx.docs` component's detail reports, derived the
37
+ * same way (`withOwnership`) so list and detail agree.
38
+ * @param {{name: string, docsDir: string}} ext
39
+ * @param {string} name
40
+ * @param {string} coreDir
41
+ * @param {{zh: boolean, lang: string|null}} docOpts
42
+ * @returns {Promise<string>}
43
+ */
44
+ async function legacyImport(ext, name, coreDir, docOpts) {
45
+ const docPath = findExternalComponentDoc(ext.docsDir, name);
46
+ /** @type {import('../_adapter.mjs').LoadedComponentDoc} */
47
+ let docs = {};
48
+ if (docPath && docPath.endsWith('.doc.mjs')) {
49
+ try {
50
+ docs = await loadComponentDoc(docPath, docOpts);
51
+ } catch {
52
+ // Keep list resilient; validation owns malformed docs.
53
+ }
54
+ }
55
+ return withOwnership(docs, {package: ext.name, sourcePath: null}, name, coreDir).import;
56
+ }
57
+
34
58
  /**
35
59
  * Build the `component.list` envelope. The list taxonomy is collapsed: all
36
60
  * three detail levels emit ONE `component.list` type; the depth rides in
@@ -267,20 +291,24 @@ export async function componentList(
267
291
  k => grouped[k].length > 1 || grouped[k][0] !== k,
268
292
  );
269
293
 
270
- if (hasGroups) {
271
- for (const [group, members] of Object.entries(grouped)) {
272
- listData[`${group} (${ext.name})`] = members.map(n => ({
294
+ /** @param {string[]} names */
295
+ const entriesFor = names =>
296
+ Promise.all(
297
+ names.map(async n => ({
273
298
  name: n,
274
299
  package: ext.name,
275
- }));
300
+ import: await legacyImport(ext, n, coreDir, {zh, lang}),
301
+ })),
302
+ );
303
+
304
+ if (hasGroups) {
305
+ for (const [group, members] of Object.entries(grouped)) {
306
+ listData[`${group} (${ext.name})`] = await entriesFor(members);
276
307
  }
277
308
  } else {
278
309
  const allComps = Object.values(grouped).flat().sort();
279
310
  if (allComps.length > 0) {
280
- listData[`${ext.category} (${ext.name})`] = allComps.map(n => ({
281
- name: n,
282
- package: ext.name,
283
- }));
311
+ listData[`${ext.category} (${ext.name})`] = await entriesFor(allComps);
284
312
  }
285
313
  }
286
314
  }
@@ -11,6 +11,7 @@ export const doc = {
11
11
  type: 'function',
12
12
  kind: 'api',
13
13
  name: 'discover',
14
+ namespace: 'cli/api',
14
15
  displayName: 'discover()',
15
16
  summary: 'Browse and search components from configured external packages.',
16
17
  description:
@@ -41,7 +42,7 @@ export const doc = {
41
42
  name: 'options.components',
42
43
  type: 'boolean',
43
44
  description:
44
- 'List components only. A CLI display flag consumed by the renderer; the programmatic response shape is unchanged.',
45
+ 'In the CLI package list, print every component of each package instead of the first 10. A display flag for the CLI renderer; the programmatic response is unchanged.',
45
46
  },
46
47
  {
47
48
  name: 'options.lang',
@@ -2,7 +2,7 @@
2
2
  // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
3
 
4
4
  /**
5
- * xds --json discover
5
+ * astryx --json discover
6
6
  */
7
7
  export type DiscoverListResponse = {
8
8
  type: "discover.list";
@@ -25,21 +25,21 @@ export type DiscoverListEntry = {
25
25
  displayName?: string | undefined;
26
26
  };
27
27
  /**
28
- * xds --json discover
28
+ * astryx --json discover
29
29
  */
30
30
  export type DiscoverDetailResponse = {
31
31
  type: "discover.detail";
32
32
  data: DiscoverListEntry;
33
33
  };
34
34
  /**
35
- * xds --json discover
35
+ * astryx --json discover
36
36
  */
37
37
  export type DiscoverDetailDocResponse = {
38
38
  type: "discover.detail.doc";
39
39
  data: import("@astryxdesign/cli/authoring").ComponentDoc;
40
40
  };
41
41
  /**
42
- * xds --json discover <searchterm> (multiple matches)
42
+ * astryx --json discover <searchterm> (multiple matches)
43
43
  */
44
44
  export type DiscoverSearchResponse = {
45
45
  type: "discover.search";