@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683

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 (643) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +117 -78
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +16 -9
  7. package/api/build/build.test.mjs +197 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +165 -49
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +6 -12
  18. package/api/component/_adapter.mjs +20 -10
  19. package/api/component/component.doc.mjs +13 -3
  20. package/api/component/component.mjs +91 -14
  21. package/api/component/component.test.mjs +38 -0
  22. package/api/component/component.type.d.mts +22 -11
  23. package/api/component/component.type.mjs +32 -24
  24. package/api/component/detail/blocks/blocks.d.mts +2 -1
  25. package/api/component/detail/blocks/blocks.mjs +4 -3
  26. package/api/component/list/list.d.mts +0 -5
  27. package/api/component/list/list.mjs +40 -11
  28. package/api/discover/_adapter.d.mts +114 -6
  29. package/api/discover/_adapter.mjs +372 -17
  30. package/api/discover/_adapter.test.mjs +215 -0
  31. package/api/discover/_catalog-view.d.mts +115 -0
  32. package/api/discover/_catalog-view.mjs +203 -0
  33. package/api/discover/_catalog-view.test.mjs +128 -0
  34. package/api/discover/detail/detail.d.mts +18 -6
  35. package/api/discover/detail/detail.mjs +67 -13
  36. package/api/discover/detail/detail.test.mjs +85 -0
  37. package/api/discover/detail/item/item.d.mts +26 -0
  38. package/api/discover/detail/item/item.mjs +78 -0
  39. package/api/discover/detail/item/item.test.mjs +73 -0
  40. package/api/discover/discover.d.mts +3 -9
  41. package/api/discover/discover.doc.mjs +62 -18
  42. package/api/discover/discover.mjs +220 -36
  43. package/api/discover/discover.test.mjs +11 -2
  44. package/api/discover/discover.type.d.mts +150 -11
  45. package/api/discover/discover.type.mjs +107 -17
  46. package/api/discover/list/list.d.mts +20 -6
  47. package/api/discover/list/list.mjs +45 -12
  48. package/api/discover/list/list.test.mjs +46 -0
  49. package/api/discover/search/search.d.mts +18 -16
  50. package/api/discover/search/search.mjs +102 -56
  51. package/api/discover/search/search.test.mjs +144 -10
  52. package/api/docs/_adapter.d.mts +272 -41
  53. package/api/docs/_adapter.mjs +985 -108
  54. package/api/docs/compiled-topics.test.mjs +78 -0
  55. package/api/docs/detail/detail.mjs +22 -63
  56. package/api/docs/detail/section/section.d.mts +1 -1
  57. package/api/docs/detail/section/section.mjs +54 -19
  58. package/api/docs/detail/section/section.test.mjs +50 -0
  59. package/api/docs/docs.d.mts +10 -3
  60. package/api/docs/docs.doc.mjs +55 -16
  61. package/api/docs/docs.mjs +53 -10
  62. package/api/docs/docs.test.mjs +164 -4
  63. package/api/docs/docs.type.d.mts +221 -5
  64. package/api/docs/docs.type.mjs +153 -11
  65. package/api/docs/index/index.d.mts +18 -0
  66. package/api/docs/index/index.mjs +40 -0
  67. package/api/docs/index/index.test.mjs +62 -0
  68. package/api/docs/integration-tree.test.mjs +555 -0
  69. package/api/docs/integrationDocs.test.mjs +114 -8
  70. package/api/docs/list/list.mjs +28 -12
  71. package/api/docs/node/node.d.mts +43 -0
  72. package/api/docs/node/node.mjs +192 -0
  73. package/api/docs/reference-blocks.test.mjs +406 -0
  74. package/api/doctor/doctor.d.mts +99 -1
  75. package/api/doctor/doctor.doc.mjs +1 -0
  76. package/api/doctor/doctor.mjs +548 -1
  77. package/api/doctor/doctor.test.mjs +610 -1
  78. package/api/gap-report/gap-report.doc.mjs +8 -4
  79. package/api/hook/_adapter.mjs +19 -5
  80. package/api/hook/hook.doc.mjs +1 -0
  81. package/api/hook/hook.type.d.mts +3 -3
  82. package/api/hook/hook.type.mjs +11 -11
  83. package/api/hook/list/list.d.mts +2 -2
  84. package/api/hook/list/list.mjs +69 -17
  85. package/api/index.d.mts +1 -1
  86. package/api/index.mjs +1 -0
  87. package/api/init/init.doc.mjs +6 -1
  88. package/api/init/init.test.mjs +41 -1
  89. package/api/init/remove/remove.mjs +1 -1
  90. package/api/init/run/run.mjs +20 -10
  91. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  92. package/api/integration/add-contribution.d.mts +2 -1
  93. package/api/integration/add-contribution.mjs +130 -15
  94. package/api/integration/add-contribution.test.mjs +258 -7
  95. package/api/integration/add-helpers.d.mts +5 -2
  96. package/api/integration/add-helpers.mjs +36 -9
  97. package/api/integration/add-theme.mjs +34 -64
  98. package/api/integration/add-theme.test.mjs +105 -21
  99. package/api/integration/authoring-checks.mjs +138 -28
  100. package/api/integration/authoring-checks.test.mjs +179 -7
  101. package/api/integration/authoring-checks.type.mjs +6 -1
  102. package/api/integration/integration-authoring.type.d.mts +3 -1
  103. package/api/integration/integration-authoring.type.mjs +2 -0
  104. package/api/integration/integration-block-exports.test.mjs +10 -6
  105. package/api/integration/integrationAdd.doc.mjs +14 -4
  106. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  107. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  108. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  109. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  110. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  111. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  112. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  113. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  114. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  115. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  116. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  117. package/api/integration/pack-check.mjs +83 -7
  118. package/api/integration/pack-check.test.mjs +387 -47
  119. package/api/integration/pack-check.type.d.mts +26 -2
  120. package/api/integration/pack-check.type.mjs +14 -1
  121. package/api/integration/summarizeIssues.doc.mjs +1 -0
  122. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  123. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  124. package/api/integration/validate-integration.mjs +52 -102
  125. package/api/integration/validate-integration.test.mjs +179 -26
  126. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  127. package/api/integration/validateIntegration.doc.mjs +3 -2
  128. package/api/json/assertResponse.doc.mjs +1 -0
  129. package/api/json/envelope-types.test.mjs +76 -0
  130. package/api/json/index.ts +2 -0
  131. package/api/json/isError.doc.mjs +1 -0
  132. package/api/json/parseResponse.doc.mjs +3 -2
  133. package/api/layout/_adapter.mjs +20 -5
  134. package/api/layout/expand/expand.mjs +7 -5
  135. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  136. package/api/layout/grammar/grammar.mjs +2 -1
  137. package/api/layout/layoutCheck.doc.mjs +1 -0
  138. package/api/layout/layoutExpand.doc.mjs +2 -1
  139. package/api/layout/layoutGrammar.doc.mjs +1 -0
  140. package/api/search/search-return-type.test.mjs +54 -0
  141. package/api/search/search.d.mts +62 -11
  142. package/api/search/search.doc.mjs +8 -2
  143. package/api/search/search.mjs +471 -83
  144. package/api/search/search.test.mjs +124 -1
  145. package/api/search/search.type.d.mts +15 -3
  146. package/api/search/search.type.mjs +5 -2
  147. package/api/swizzle/copy/copy.mjs +28 -11
  148. package/api/swizzle/swizzle.doc.mjs +2 -1
  149. package/api/swizzle/swizzle.type.d.mts +2 -2
  150. package/api/swizzle/swizzle.type.mjs +2 -2
  151. package/api/template/copy/copy.mjs +17 -23
  152. package/api/template/copy/copy.test.mjs +17 -0
  153. package/api/template/list/list.mjs +1 -0
  154. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  155. package/api/template/template-integration.test.mjs +1072 -3
  156. package/api/template/template-suffix.test.mjs +41 -21
  157. package/api/template/template.d.mts +1 -1
  158. package/api/template/template.doc.mjs +30 -8
  159. package/api/template/template.mjs +45 -8
  160. package/api/template/template.type.d.mts +12 -14
  161. package/api/template/template.type.mjs +15 -14
  162. package/api/theme/_adapter.d.mts +2 -3
  163. package/api/theme/_adapter.mjs +4 -5
  164. package/api/theme/add/add.binary.test.mjs +84 -0
  165. package/api/theme/add/add.mjs +31 -22
  166. package/api/theme/add/add.rollback.test.mjs +158 -0
  167. package/api/theme/add/add.staging.test.mjs +83 -0
  168. package/api/theme/add/add.test.mjs +14 -1
  169. package/api/theme/build/build.family.test.mjs +7 -12
  170. package/api/theme/build/build.mjs +140 -59
  171. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  172. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  173. package/api/theme/build/build.rollback.test.mjs +148 -0
  174. package/api/theme/build/build.test.mjs +127 -0
  175. package/api/theme/build/font-warning.mjs +3 -3
  176. package/api/theme/build/font-warning.test.mjs +5 -2
  177. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  178. package/api/theme/integration-themes.test.mjs +39 -28
  179. package/api/theme/list/list.test.mjs +19 -20
  180. package/api/theme/listThemes.doc.mjs +6 -5
  181. package/api/theme/palette/generate/generate.mjs +8 -3
  182. package/api/theme/palette/generate/generate.test.mjs +96 -0
  183. package/api/theme/palette/generate/generator.d.mts +10 -13
  184. package/api/theme/palette/generate/generator.mjs +15 -4
  185. package/api/theme/palette/generate/generator.test.mjs +10 -0
  186. package/api/theme/template/template.mjs +11 -2
  187. package/api/theme/template/template.test.mjs +20 -0
  188. package/api/theme/theme.type.d.mts +170 -11
  189. package/api/theme/theme.type.mjs +94 -27
  190. package/api/theme/themeAdd.doc.mjs +4 -3
  191. package/api/theme/themeBuild.doc.mjs +8 -4
  192. package/api/theme/themeList.doc.mjs +6 -3
  193. package/api/theme/themeListAvailable.doc.mjs +5 -3
  194. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  195. package/api/theme/themeTargets.doc.mjs +1 -0
  196. package/api/theme/themeTemplate.doc.mjs +6 -2
  197. package/api/upgrade/_adapter.d.mts +32 -5
  198. package/api/upgrade/_adapter.mjs +139 -22
  199. package/api/upgrade/list/list.mjs +2 -1
  200. package/api/upgrade/list/list.test.mjs +73 -0
  201. package/api/upgrade/project-context.test.mjs +272 -0
  202. package/api/upgrade/provider-agreement.test.mjs +152 -0
  203. package/api/upgrade/run/run.mjs +356 -59
  204. package/api/upgrade/status/status.mjs +2 -2
  205. package/api/upgrade/upgrade.doc.mjs +12 -5
  206. package/api/upgrade/upgrade.type.d.mts +43 -5
  207. package/api/upgrade/upgrade.type.mjs +27 -11
  208. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  209. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  210. package/assets/codemods/integration-discovery.mjs +48 -4
  211. package/assets/codemods/integration-discovery.test.mjs +73 -0
  212. package/assets/codemods/integration-runner.mjs +56 -4
  213. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  214. package/assets/codemods/registry.mjs +1 -0
  215. package/assets/codemods/run-codemod.mjs +177 -34
  216. package/assets/codemods/runner.mjs +350 -102
  217. package/assets/codemods/term-log.mjs +32 -8
  218. package/assets/codemods/term-log.test.mjs +19 -1
  219. package/assets/codemods/transform-prop.mjs +109 -0
  220. package/assets/codemods/transform-prop.test.mjs +95 -0
  221. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  222. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  223. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  224. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  225. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  226. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  227. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  228. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  229. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  230. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  231. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  232. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  233. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  234. package/assets/docs/README.md +9 -0
  235. package/assets/docs/authoring.doc.mjs +14 -0
  236. package/assets/docs/getting-started.doc.mjs +2 -2
  237. package/assets/docs/internationalization.doc.mjs +7 -5
  238. package/assets/docs/layout.doc.dense.mjs +2 -2
  239. package/assets/docs/layout.doc.mjs +1 -1
  240. package/assets/docs/principles.doc.mjs +6 -6
  241. package/assets/docs/styling-libraries.doc.mjs +4 -4
  242. package/assets/docs/styling.doc.mjs +4 -4
  243. package/assets/docs/theme.doc.mjs +5 -5
  244. package/assets/docs/tokens.doc.mjs +1 -1
  245. package/assets/docs/tree/api.doc.mjs +30 -0
  246. package/assets/docs/tree/cli.doc.mjs +23 -0
  247. package/assets/docs/tree/commands.doc.mjs +25 -0
  248. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  249. package/assets/docs/tree/integrations.test.mjs +62 -0
  250. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  251. package/assets/docs/working-with-ai.doc.mjs +4 -4
  252. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  253. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  254. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  255. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  256. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  268. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  270. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  271. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  272. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  273. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  274. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  275. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  277. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  278. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  279. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  280. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  281. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  282. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  283. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  284. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  285. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  286. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  287. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  292. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  293. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  294. package/authoring/_shared/contract.ts +22 -0
  295. package/authoring/codemod/codemod.doc.mjs +7 -2
  296. package/authoring/codemod/parse.d.mts +8 -8
  297. package/authoring/codemod/parse.mjs +8 -6
  298. package/authoring/codemod/type.ts +12 -0
  299. package/authoring/config/config.doc.mjs +10 -2
  300. package/authoring/config/debug-composition.test.mjs +92 -0
  301. package/authoring/config/parse.d.mts +15 -13
  302. package/authoring/config/parse.mjs +27 -8
  303. package/authoring/config/parse.test.mjs +8 -0
  304. package/authoring/config/type.ts +29 -6
  305. package/authoring/debug/debug.doc.d.mts +11 -0
  306. package/authoring/debug/debug.doc.mjs +182 -0
  307. package/authoring/debug/parse.d.mts +8 -8
  308. package/authoring/debug/parse.mjs +3 -3
  309. package/authoring/discover/discover.doc.d.mts +13 -0
  310. package/authoring/discover/discover.doc.mjs +138 -0
  311. package/authoring/discover/parse.d.mts +24 -0
  312. package/authoring/discover/parse.mjs +128 -0
  313. package/authoring/discover/parse.test.mjs +124 -0
  314. package/authoring/discover/type.ts +87 -0
  315. package/authoring/doctypes/_schema.d.mts +790 -23
  316. package/authoring/doctypes/_schema.mjs +543 -39
  317. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  318. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  319. package/authoring/doctypes/base/type.ts +41 -0
  320. package/authoring/doctypes/command/command.doc.mjs +4 -3
  321. package/authoring/doctypes/command/parse.d.mts +2 -2
  322. package/authoring/doctypes/command/parse.mjs +1 -1
  323. package/authoring/doctypes/command/type.ts +5 -4
  324. package/authoring/doctypes/component/component.doc.mjs +6 -3
  325. package/authoring/doctypes/component/parse.d.mts +2 -2
  326. package/authoring/doctypes/component/parse.mjs +1 -1
  327. package/authoring/doctypes/component/type.ts +6 -5
  328. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  329. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  330. package/authoring/doctypes/enum/parse.d.mts +2 -2
  331. package/authoring/doctypes/enum/parse.mjs +1 -1
  332. package/authoring/doctypes/enum/type.ts +4 -2
  333. package/authoring/doctypes/function/function.doc.mjs +7 -2
  334. package/authoring/doctypes/function/parse.d.mts +2 -2
  335. package/authoring/doctypes/function/parse.mjs +1 -1
  336. package/authoring/doctypes/function/type.ts +9 -4
  337. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  338. package/authoring/doctypes/hook/parse.d.mts +2 -2
  339. package/authoring/doctypes/hook/parse.mjs +1 -1
  340. package/authoring/doctypes/hook/type.ts +5 -4
  341. package/authoring/doctypes/legacy.d.mts +8 -6
  342. package/authoring/doctypes/legacy.mjs +5 -4
  343. package/authoring/doctypes/load-contract.test.mjs +233 -0
  344. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  345. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  346. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  347. package/authoring/doctypes/namespace/parse.mjs +25 -0
  348. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  349. package/authoring/doctypes/namespace/type.ts +74 -0
  350. package/authoring/doctypes/parse.d.mts +22 -18
  351. package/authoring/doctypes/parse.mjs +22 -11
  352. package/authoring/doctypes/parse.test.mjs +77 -3
  353. package/authoring/doctypes/reference/parse.d.mts +2 -2
  354. package/authoring/doctypes/reference/parse.mjs +8 -5
  355. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  356. package/authoring/doctypes/reference/type.ts +70 -7
  357. package/authoring/doctypes/schema/parse.d.mts +2 -2
  358. package/authoring/doctypes/schema/parse.mjs +1 -1
  359. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  360. package/authoring/doctypes/schema/type.ts +4 -4
  361. package/authoring/doctypes/template/parse.d.mts +94 -1
  362. package/authoring/doctypes/template/parse.mjs +40 -2
  363. package/authoring/doctypes/template/parse.test.mjs +26 -2
  364. package/authoring/doctypes/template/template.doc.mjs +13 -3
  365. package/authoring/doctypes/template/type.ts +13 -2
  366. package/authoring/doctypes/theme/parse.d.mts +35 -0
  367. package/authoring/doctypes/theme/parse.mjs +76 -0
  368. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  369. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  370. package/authoring/doctypes/theme/type.ts +42 -0
  371. package/authoring/doctypes/types.ts +12 -10
  372. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  373. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  374. package/authoring/gap-report/parse.d.mts +10 -10
  375. package/authoring/gap-report/parse.mjs +6 -6
  376. package/authoring/gap-report/type.ts +1 -1
  377. package/authoring/identity/identity.doc.d.mts +9 -0
  378. package/authoring/identity/identity.doc.mjs +61 -0
  379. package/authoring/identity/type.ts +132 -0
  380. package/authoring/index.d.mts +3 -0
  381. package/authoring/index.d.ts +62 -17
  382. package/authoring/index.mjs +4 -1
  383. package/authoring/integration/integration.doc.mjs +15 -8
  384. package/authoring/integration/parse.d.mts +2 -2
  385. package/authoring/integration/parse.mjs +1 -1
  386. package/authoring/integration/parse.test.mjs +10 -1
  387. package/authoring/integration/schema.d.mts +6 -4
  388. package/authoring/integration/schema.mjs +9 -3
  389. package/authoring/integration/type.ts +19 -8
  390. package/authoring/shadcn/receipt.d.mts +6 -6
  391. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  392. package/clients/cli/command-load-failure.test.mjs +83 -0
  393. package/clients/cli/commands/blog.doc.mjs +1 -1
  394. package/clients/cli/commands/blog.mjs +23 -8
  395. package/clients/cli/commands/blog.test.mjs +42 -1
  396. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  397. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  398. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  399. package/clients/cli/commands/build-theme.mjs +16 -50
  400. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  401. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  402. package/clients/cli/commands/build.doc.mjs +16 -8
  403. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  404. package/clients/cli/commands/build.mjs +137 -114
  405. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  406. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  407. package/clients/cli/commands/component/index.mjs +3 -8
  408. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  409. package/clients/cli/commands/component-package.test.mjs +46 -0
  410. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  411. package/clients/cli/commands/component.doc.mjs +1 -1
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  414. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  415. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  416. package/clients/cli/commands/discover.doc.mjs +55 -9
  417. package/clients/cli/commands/discover.mjs +393 -118
  418. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  419. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  420. package/clients/cli/commands/docs.doc.mjs +28 -6
  421. package/clients/cli/commands/docs.mjs +240 -26
  422. package/clients/cli/commands/docs.test.mjs +193 -1
  423. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  424. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  425. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  426. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  427. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  429. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  430. package/clients/cli/commands/doctor.doc.mjs +1 -1
  431. package/clients/cli/commands/doctor.mjs +59 -32
  432. package/clients/cli/commands/doctor.test.mjs +42 -0
  433. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  434. package/clients/cli/commands/gap-report.test.mjs +72 -0
  435. package/clients/cli/commands/hook/index.mjs +7 -17
  436. package/clients/cli/commands/hook.doc.mjs +1 -1
  437. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  438. package/clients/cli/commands/init.doc.mjs +20 -9
  439. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  440. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  441. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  442. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  443. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  444. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  445. package/clients/cli/commands/integration.doc.mjs +1 -1
  446. package/clients/cli/commands/integration.mjs +1 -0
  447. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  448. package/clients/cli/commands/json-contract.test.mjs +33 -0
  449. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  450. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  451. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  452. package/clients/cli/commands/layout.doc.mjs +3 -3
  453. package/clients/cli/commands/layout.mjs +21 -9
  454. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  455. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  456. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  457. package/clients/cli/commands/manifest.doc.mjs +1 -1
  458. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  459. package/clients/cli/commands/search.doc.mjs +7 -4
  460. package/clients/cli/commands/search.mjs +28 -9
  461. package/clients/cli/commands/search.test.mjs +75 -0
  462. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  463. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  464. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  465. package/clients/cli/commands/template.doc.mjs +52 -13
  466. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  467. package/clients/cli/commands/template.mjs +4 -91
  468. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  469. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  470. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  471. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  472. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  473. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  474. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  475. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  476. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  477. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  478. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  479. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  480. package/clients/cli/commands/theme.doc.mjs +1 -1
  481. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  482. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  483. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  484. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  485. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  486. package/clients/cli/commands/upgrade.mjs +29 -7
  487. package/clients/cli/formatters/index.mjs +164 -1
  488. package/clients/cli/formatters/index.test.mjs +97 -0
  489. package/clients/cli/index.mjs +21 -30
  490. package/clients/cli/latest-version-env.test.mjs +50 -0
  491. package/clients/cli/lib/cli-error.test.mjs +7 -0
  492. package/clients/cli/lib/component-format.mjs +9 -9
  493. package/clients/cli/lib/component-format.test.mjs +1 -1
  494. package/clients/cli/lib/define-command.mjs +32 -6
  495. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  496. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  497. package/clients/cli/lib/hook-format.mjs +19 -10
  498. package/clients/cli/lib/json-shim.mjs +38 -2
  499. package/clients/cli/lib/json-shim.test.mjs +83 -0
  500. package/clients/cli/lib/manifest.d.ts +2 -0
  501. package/clients/cli/lib/manifest.mjs +37 -2
  502. package/clients/cli/lib/manifest.test.mjs +17 -0
  503. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  504. package/foundation/agent-docs/agent-docs.mjs +82 -12
  505. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  506. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  507. package/foundation/config/integration-debug.test.mjs +28 -3
  508. package/foundation/config/project-themes.test.mjs +11 -19
  509. package/foundation/config/project.d.mts +20 -11
  510. package/foundation/config/project.mjs +263 -91
  511. package/foundation/config/project.test.mjs +270 -21
  512. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  513. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  514. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  515. package/foundation/discovery/authoring-surface.d.mts +74 -0
  516. package/foundation/discovery/authoring-surface.mjs +525 -0
  517. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  518. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  519. package/foundation/discovery/cli-self-docs.mjs +490 -0
  520. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  521. package/foundation/discovery/component-discovery.d.mts +39 -1
  522. package/foundation/discovery/component-discovery.mjs +50 -1
  523. package/foundation/discovery/component-loader.d.mts +35 -38
  524. package/foundation/discovery/component-loader.mjs +53 -222
  525. package/foundation/discovery/docs-discovery.d.mts +119 -11
  526. package/foundation/discovery/docs-discovery.mjs +423 -108
  527. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  528. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  529. package/foundation/discovery/docs-output-budget.mjs +50 -0
  530. package/foundation/discovery/docs-section-key.d.mts +116 -0
  531. package/foundation/discovery/docs-section-key.mjs +322 -0
  532. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  533. package/foundation/discovery/template-adapter.d.mts +113 -11
  534. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  535. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  536. package/foundation/discovery/template-adapter.mjs +774 -83
  537. package/foundation/discovery/template-adapter.test.mjs +57 -0
  538. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  539. package/foundation/discovery/template-conflict-release.mjs +40 -0
  540. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  541. package/foundation/discovery/theme-discovery.d.mts +67 -7
  542. package/foundation/discovery/theme-discovery.mjs +916 -186
  543. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  544. package/foundation/discovery/theming-targets.test.mjs +4 -0
  545. package/foundation/doc-compiler/bundle.d.mts +47 -0
  546. package/foundation/doc-compiler/bundle.mjs +278 -0
  547. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  548. package/foundation/doc-compiler/compile.d.mts +343 -0
  549. package/foundation/doc-compiler/compile.mjs +558 -0
  550. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  551. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  552. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  553. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  554. package/foundation/doc-compiler/import.d.mts +24 -0
  555. package/foundation/doc-compiler/import.mjs +59 -0
  556. package/foundation/doc-compiler/inputs.d.mts +102 -0
  557. package/foundation/doc-compiler/inputs.mjs +291 -0
  558. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  559. package/foundation/doc-compiler/ir.d.mts +22 -0
  560. package/foundation/doc-compiler/ir.mjs +471 -0
  561. package/foundation/doc-compiler/lenses.d.mts +36 -0
  562. package/foundation/doc-compiler/lenses.mjs +173 -0
  563. package/foundation/doc-compiler/links.d.mts +162 -0
  564. package/foundation/doc-compiler/links.mjs +294 -0
  565. package/foundation/doc-compiler/links.test.mjs +192 -0
  566. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  567. package/foundation/doc-compiler/overlays.d.mts +37 -0
  568. package/foundation/doc-compiler/overlays.mjs +206 -0
  569. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  570. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  571. package/foundation/doc-compiler/read.d.mts +127 -0
  572. package/foundation/doc-compiler/read.mjs +325 -0
  573. package/foundation/doc-compiler/read.test.mjs +313 -0
  574. package/foundation/doc-compiler/source.d.mts +33 -0
  575. package/foundation/doc-compiler/source.mjs +128 -0
  576. package/foundation/doc-compiler/tree.d.mts +288 -0
  577. package/foundation/doc-compiler/tree.mjs +876 -0
  578. package/foundation/doc-compiler/tree.test.mjs +598 -0
  579. package/foundation/fs/file-protection.d.mts +33 -0
  580. package/foundation/fs/file-protection.mjs +825 -0
  581. package/foundation/fs/file-protection.test.mjs +250 -0
  582. package/foundation/fs/module-loader.d.mts +1 -0
  583. package/foundation/fs/module-loader.mjs +50 -1
  584. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  585. package/foundation/fs/path-safety.d.mts +3 -2
  586. package/foundation/fs/path-safety.mjs +49 -19
  587. package/foundation/fs/path-safety.test.mjs +50 -0
  588. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  589. package/foundation/identity/provider-identity.d.mts +90 -0
  590. package/foundation/identity/provider-identity.mjs +320 -0
  591. package/foundation/identity/provider-identity.test.mjs +254 -0
  592. package/foundation/identity/providers.d.mts +7 -0
  593. package/foundation/identity/providers.mjs +16 -0
  594. package/foundation/integrations/autolink.d.mts +58 -1
  595. package/foundation/integrations/autolink.mjs +143 -45
  596. package/foundation/integrations/autolink.test.mjs +1 -1
  597. package/foundation/integrations/cli-requirement.d.mts +45 -0
  598. package/foundation/integrations/cli-requirement.mjs +154 -0
  599. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  600. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  601. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  602. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  603. package/foundation/integrations/contribution-inventory.mjs +27 -24
  604. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  605. package/foundation/integrations/integration-warnings.d.mts +9 -2
  606. package/foundation/integrations/integration-warnings.mjs +52 -21
  607. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  608. package/foundation/integrations/integrations.d.mts +63 -3
  609. package/foundation/integrations/integrations.mjs +122 -9
  610. package/foundation/integrations/integrations.test.mjs +415 -1
  611. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  612. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  613. package/foundation/integrations/provider-resolution.d.mts +152 -0
  614. package/foundation/integrations/provider-resolution.mjs +576 -0
  615. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  616. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  617. package/foundation/integrations/theme-descriptor.mjs +44 -0
  618. package/foundation/integrations/validate-contributions.d.mts +2 -0
  619. package/foundation/integrations/validate-contributions.mjs +131 -29
  620. package/foundation/response/base.d.ts +8 -4
  621. package/foundation/response/error-codes.d.mts +3 -1
  622. package/foundation/response/error-codes.d.ts +2 -0
  623. package/foundation/response/error-codes.doc.mjs +13 -4
  624. package/foundation/response/error-codes.mjs +8 -2
  625. package/foundation/response/error-codes.test.mjs +137 -10
  626. package/foundation/response/json-contract.test.mjs +57 -17
  627. package/foundation/response/json.d.mts +4 -2
  628. package/foundation/response/json.mjs +8 -10
  629. package/foundation/response/response-types.doc.d.mts +5 -1
  630. package/foundation/response/response-types.doc.mjs +41 -21
  631. package/foundation/response/response-types.doc.test.mjs +158 -0
  632. package/foundation/response/response.doc.mjs +1 -1
  633. package/foundation/text/string-utils.d.mts +8 -0
  634. package/foundation/text/string-utils.mjs +40 -10
  635. package/foundation/xle/expand.d.mts +2 -0
  636. package/foundation/xle/expand.mjs +4 -3
  637. package/foundation/xle/expand.test.mjs +54 -0
  638. package/foundation/xle/xle.test.mjs +13 -0
  639. package/package.json +10 -11
  640. package/assets/templates/themes/manifest.json +0 -95
  641. package/clients/cli/lib/update-check.mjs +0 -83
  642. package/clients/cli/lib/update-check.test.mjs +0 -137
  643. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -0,0 +1,81 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file `build "<idea>"` text output names only fields the `build.kit`
5
+ * envelope carries — on the kit itself or on its entries.
6
+ */
7
+
8
+ import {describe, it, expect} from 'vitest';
9
+ import * as path from 'node:path';
10
+ import {fileURLToPath} from 'node:url';
11
+ import {runCli} from '../../../test-utils/run-cli.mjs';
12
+
13
+ // Run against the monorepo root so @astryxdesign/core is discoverable.
14
+ const REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../..');
15
+ const SLOW = 60_000;
16
+
17
+ describe('build kit text fields mirror the JSON keys', () => {
18
+ it('prints no field the envelope lacks', async () => {
19
+ const json = await runCli(['build', 'analytics dashboard', '--json', '--verbose'], REPO);
20
+ expect(json.status).toBe(0);
21
+ const {data} = JSON.parse(json.stdout);
22
+ const keys = new Set([
23
+ ...Object.keys(data),
24
+ ...Object.keys(data.start ?? {}),
25
+ ...(data.start?.alternatives ?? []).flatMap(a => Object.keys(a)),
26
+ ...[...data.pages, ...data.blocks, ...data.domain].flatMap(e => Object.keys(e)),
27
+ ]);
28
+
29
+ const human = await runCli(['build', 'analytics dashboard', '--verbose'], REPO);
30
+ expect(human.status).toBe(0);
31
+ const fields = [
32
+ ...new Set(
33
+ human.stdout
34
+ .split('\n')
35
+ .map(line => /^([A-Za-z]+):\s/.exec(line)?.[1])
36
+ .filter(Boolean),
37
+ ),
38
+ ];
39
+ expect(fields).toContain('frame');
40
+ // The start is printed as a record, so its fields are checked too.
41
+ expect(fields).toContain('command');
42
+ expect(fields).toContain('displayName');
43
+ for (const field of fields) expect(keys).toContain(field);
44
+ }, SLOW);
45
+
46
+ it('leads with the start, then the alternatives, blocks and components', async () => {
47
+ const human = await runCli(['build', 'analytics dashboard'], REPO);
48
+ expect(human.status).toBe(0);
49
+ const headings = human.stdout
50
+ .split('\n')
51
+ .filter(line => /^(TEMPLATE|OTHER TEMPLATES|BLOCKS|COMPONENTS)$/.test(line));
52
+ expect(headings).toEqual(['TEMPLATE', 'OTHER TEMPLATES', 'BLOCKS', 'COMPONENTS']);
53
+ // A builder changing a page they already have keeps it.
54
+ expect(human.stdout).toContain(
55
+ 'Changing a page you already have? Keep it, and use only the blocks and components.',
56
+ );
57
+ }, SLOW);
58
+
59
+ it("shortens the start's description by default and prints it whole under --verbose", async () => {
60
+ const json = await runCli(['build', 'quarterly revenue dashboard', '--json'], REPO);
61
+ const {start} = JSON.parse(json.stdout).data;
62
+ const first = start.description.slice(0, start.description.indexOf('. ') + 1);
63
+ expect(first.length).toBeGreaterThan(0);
64
+ expect(first.length).toBeLessThan(start.description.length);
65
+ const line = out => out.split('\n').find(l => l.startsWith('description:'));
66
+ const brief = await runCli(['build', 'quarterly revenue dashboard'], REPO);
67
+ expect(line(brief.stdout)).toBe(`description: ${first}`);
68
+ const whole = await runCli(['build', 'quarterly revenue dashboard', '--verbose'], REPO);
69
+ expect(whole.stdout).toContain(start.description);
70
+ }, SLOW);
71
+
72
+ it("names search's page matches in the default text", async () => {
73
+ const json = await runCli(['build', 'contact form', '--json'], REPO);
74
+ const {data} = JSON.parse(json.stdout);
75
+ expect(data.pages.length).toBeGreaterThan(0);
76
+ const human = await runCli(['build', 'contact form'], REPO);
77
+ expect(human.stdout).toContain(
78
+ `Keyword search matched these page templates: ${data.pages.map(p => p.name).join(', ')}.`,
79
+ );
80
+ }, SLOW);
81
+ });
@@ -26,7 +26,6 @@ import {defineCommand} from '../../lib/define-command.mjs';
26
26
  import {resultSet} from '../../../../foundation/debug/index.mjs';
27
27
  import {ERROR_CODES} from '../../../../foundation/response/error-codes.mjs';
28
28
  import {component as componentApi} from '../../../../api/component/component.mjs';
29
- import {findRelatedBlocks} from '../../../../api/template/template.mjs';
30
29
  import {Project} from '../../../../foundation/config/project.mjs';
31
30
  import {warnOnIntegrationIssues} from '../../../../foundation/integrations/integration-warnings.mjs';
32
31
  import {doc as componentCommand} from '../component.doc.mjs';
@@ -112,7 +111,7 @@ export function registerComponent(program) {
112
111
  // doctor integration validate. Best-effort; suppressed in --json mode.
113
112
  try {
114
113
  const project = await Project.load(process.cwd());
115
- await warnOnIntegrationIssues(project.loadedIntegrations, {json});
114
+ await warnOnIntegrationIssues(project, {json});
116
115
  } catch {
117
116
  // Never let the nudge break the command.
118
117
  }
@@ -235,18 +234,14 @@ export function registerComponent(program) {
235
234
  case 'component.detail': {
236
235
  const resolvedName = (name || '').replace(/^XDS/, '');
237
236
  const importHint = result.data.import;
237
+ if (result.data.parentDoc) emit(record(result.data, {fields: ['parentDoc']}));
238
238
  const doc =
239
239
  detail === 'brief'
240
240
  ? code(formatBrief(result.data, resolvedName, importHint, {themeData}))
241
241
  : detail === 'compact'
242
242
  ? code(formatCompact(result.data, resolvedName, importHint))
243
243
  : code(formatFull(result.data, {themeData, importHint}));
244
- const related = await findRelatedBlocks(resolvedName);
245
- emit(
246
- doc,
247
- related.length > 0 && section('Related block templates'),
248
- related.length > 0 && records(related, {fields: ['dirName', 'description']}),
249
- );
244
+ emit(doc);
250
245
  break;
251
246
  }
252
247
 
@@ -71,7 +71,7 @@ function createFixture({
71
71
  );
72
72
  fs.writeFileSync(
73
73
  path.join(compDir, 'MetaAppShell.doc.mjs'),
74
- `export const docs = {\n name: 'MetaAppShell',\n usage: { description: 'Meta-flavored app shell.' },\n props: [{ name: 'title', type: 'string', description: 'Header title' }],\n};\n`,
74
+ `export default {\n type: 'component',\n name: 'MetaAppShell',\n usage: { description: 'Meta-flavored app shell.' },\n props: [{ name: 'title', type: 'string', description: 'Header title' }],\n};\n`,
75
75
  );
76
76
  if (withSource) {
77
77
  fs.writeFileSync(
@@ -82,7 +82,7 @@ function createFixture({
82
82
  if (extraComponent) {
83
83
  fs.writeFileSync(
84
84
  path.join(compDir, `${extraComponent}.doc.mjs`),
85
- `export const docs = {\n name: '${extraComponent}',\n usage: { description: '${extraComponent} from meta.' },\n};\n`,
85
+ `export default {\n type: 'component',\n name: '${extraComponent}',\n usage: { description: '${extraComponent} from meta.' },\n props: [],\n};\n`,
86
86
  );
87
87
  fs.writeFileSync(
88
88
  path.join(compDir, `${extraComponent}.tsx`),
@@ -100,7 +100,7 @@ function createFixture({
100
100
  : '';
101
101
  fs.writeFileSync(
102
102
  path.join(entryDir, `${entryPoint.component}.doc.mjs`),
103
- `export const docs = {\n name: '${entryPoint.component}',${ownSpecifier}\n usage: { description: '${entryPoint.component} from an entry point.' },\n};\n`,
103
+ `export default {\n type: 'component',\n name: '${entryPoint.component}',${ownSpecifier}\n usage: { description: '${entryPoint.component} from an entry point.' },\n props: [],\n};\n`,
104
104
  );
105
105
  }
106
106
 
@@ -5,6 +5,7 @@ import * as fs from 'node:fs';
5
5
  import * as path from 'node:path';
6
6
  import * as os from 'node:os';
7
7
  import {component} from '../../../api/component/component.mjs';
8
+ import {runCli} from '../../../test-utils/run-cli.mjs';
8
9
 
9
10
  // These tests create a minimal monorepo fixture with:
10
11
  // - packages/core (symlinked to real @astryxdesign/core for loadDocs compatibility)
@@ -120,4 +121,49 @@ describe('component() with --package option', () => {
120
121
  expect(result.data.source).toContain('ProfileCardShowcase');
121
122
  expect(result.data.aspectRatio).toBeCloseTo(16 / 9);
122
123
  });
124
+
125
+ // A legacy package ships docs only: --source and --blocks answer the same
126
+ // way scoped as unscoped, never falling back to the plain doc.
127
+ it('--package + --source reports the missing source, like the unscoped lookup', async () => {
128
+ await expect(
129
+ component('ProfileCard', {cwd: tmpDir, source: true}),
130
+ ).rejects.toMatchObject({code: 'ERR_NO_SOURCE'});
131
+ await expect(
132
+ component('ProfileCard', {cwd: tmpDir, package: '@test/ext', source: true}),
133
+ ).rejects.toMatchObject({code: 'ERR_NO_SOURCE'});
134
+ });
135
+
136
+ it('--package + --blocks returns the blocks, like the unscoped lookup', async () => {
137
+ const unscoped = await component('ProfileCard', {cwd: tmpDir, blocks: true});
138
+ const scoped = await component('ProfileCard', {cwd: tmpDir, package: '@test/ext', blocks: true});
139
+ expect(scoped.type).toBe('component.detail.blocks');
140
+ expect(scoped.data).toEqual(unscoped.data);
141
+ });
142
+
143
+ // `cwd` is an explicit API input: --blocks must discover from it, as
144
+ // --showcase does, not from the process working directory.
145
+ it('--blocks discovers blocks from options.cwd, like --showcase', async () => {
146
+ const showcase = await component('ProfileCard', {cwd: tmpDir, showcase: true});
147
+ expect(showcase.data.source).toContain('ProfileCardShowcase');
148
+
149
+ const blocks = await component('ProfileCard', {cwd: tmpDir, blocks: true});
150
+ expect(blocks.type).toBe('component.detail.blocks');
151
+ expect(blocks.data.showcase?.name).toBe('ProfileCardShowcase');
152
+ });
153
+
154
+ // List and detail report one import for a legacy package component; the
155
+ // text list projects the JSON value instead of deriving a Core path.
156
+ it('the names list gives a legacy package component the import its detail reports', async () => {
157
+ const detail = await component('ProfileCard', {cwd: tmpDir});
158
+ const list = await component(undefined, {cwd: tmpDir, list: true});
159
+ const entry = Object.values(list.data.components)
160
+ .flat()
161
+ .find(e => e.name === 'ProfileCard' && e.package === '@test/ext');
162
+ expect(entry?.import).toBe(detail.data.import);
163
+
164
+ const text = await runCli(['component', '--list'], tmpDir);
165
+ expect(text.code).toBe(0);
166
+ expect(text.stdout).toContain(`name: ProfileCard\nimport: ${detail.data.import} [@test/ext]`);
167
+ expect(text.stdout).not.toMatch(/^import: +@astryxdesign\/core\S* +\[@test\/ext\]$/m);
168
+ });
123
169
  });
@@ -3,6 +3,7 @@
3
3
  import {describe, it, expect} from 'vitest';
4
4
  import {component} from '../../../api/component/component.mjs';
5
5
  import {findShowcase, findRelatedBlocks} from '../../../api/template/template.mjs';
6
+ import {runCli} from '../../../test-utils/run-cli.mjs';
6
7
 
7
8
  const CWD = {cwd: '.'};
8
9
 
@@ -74,6 +75,26 @@ describe('component() sub-component scoping', () => {
74
75
  const result = await component('SideNav', CWD);
75
76
  expect(result.data.name).toBe('SideNav');
76
77
  });
78
+
79
+ // `parentDoc` is part of the component.detail schema: the text view
80
+ // projects it under the same key.
81
+ it('component("HStack") names its parent doc in JSON and text', async () => {
82
+ const result = await component('HStack', CWD);
83
+ expect(result.data.parentDoc).toBe('Stack');
84
+
85
+ const text = await runCli(['component', 'HStack'], process.cwd());
86
+ expect(text.code).toBe(0);
87
+ expect(text.stdout).toMatch(/^parentDoc: +Stack$/m);
88
+ });
89
+
90
+ it('component("Stack") carries no parentDoc in JSON or text', async () => {
91
+ const result = await component('Stack', CWD);
92
+ expect(result.data).not.toHaveProperty('parentDoc');
93
+
94
+ const text = await runCli(['component', 'Stack'], process.cwd());
95
+ expect(text.code).toBe(0);
96
+ expect(text.stdout).not.toMatch(/^parentDoc:/m);
97
+ });
77
98
  }, SCAN_TIMEOUT);
78
99
 
79
100
  // ─── Bug: findShowcase priority ─────────────────────────────────
@@ -13,7 +13,7 @@ export const doc = {
13
13
  type: 'command',
14
14
  name: 'component',
15
15
  displayName: 'astryx component',
16
- namespace: 'cli',
16
+ namespace: 'cli/commands',
17
17
  summary: 'List components or print component docs',
18
18
  description:
19
19
  'Resolves a component by name across core and integration packages and prints ' +
@@ -13,6 +13,9 @@ import {
13
13
  levenshteinDistance,
14
14
  findClosestComponents,
15
15
  } from './component/index.mjs';
16
+ import {runCli} from '../../../test-utils/run-cli.mjs';
17
+
18
+ const REPO_ROOT = path.resolve(import.meta.dirname, '../../../../..');
16
19
 
17
20
  let tmpDir;
18
21
 
@@ -591,3 +594,19 @@ describe('searchComponents', () => {
591
594
  expect(results.length).toBe(0);
592
595
  });
593
596
  });
597
+
598
+ describe('component <Name> text output', () => {
599
+ // The text is a projection of the JSON envelope: it may show less, never
600
+ // data the envelope does not carry.
601
+ it('shows no related-block records that the JSON lacks', async () => {
602
+ const json = await runCli(['--json', 'component', 'Button'], REPO_ROOT);
603
+ expect(json.code).toBe(0);
604
+ expect(JSON.stringify(JSON.parse(json.stdout).data)).not.toContain('dirName');
605
+
606
+ const text = await runCli(['component', 'Button'], REPO_ROOT);
607
+ expect(text.code).toBe(0);
608
+ expect(text.stdout).toContain('# Button');
609
+ expect(text.stdout).not.toMatch(/^dirName:/m);
610
+ expect(text.stdout).not.toContain('Related block templates');
611
+ }, 30_000);
612
+ });
@@ -52,7 +52,7 @@ describe('--detail level ordering: component --list', () => {
52
52
 
53
53
  it('brief is names-only (no targets, import hints, or prose descriptions)', () => {
54
54
  expect(brief).not.toMatch(/Targets:/);
55
- expect(brief).not.toMatch(/\u2190 from/);
55
+ expect(brief).not.toMatch(/<- from/);
56
56
  // Names only — should contain XDS component names but no " — " desc separator.
57
57
  expect(brief).toMatch(/Button/);
58
58
  expect(brief).not.toMatch(/ \u2014 /);
@@ -66,7 +66,7 @@ describe('--detail level ordering: component --list', () => {
66
66
 
67
67
  it('full has dense per-entry docs (props, targets, and import hints)', () => {
68
68
  expect(full).toMatch(/Targets:/);
69
- expect(full).toMatch(/\u2190 from/);
69
+ expect(full).toMatch(/<- from/);
70
70
  // Prop name lists appear in the dense brief-all rendering.
71
71
  expect(full).toMatch(/children/);
72
72
  });
@@ -69,11 +69,12 @@ describe('astryx discover with a manifest that fails to load', () => {
69
69
 
70
70
  expect(status).toBe(0);
71
71
  expect(stderr).toContain(
72
- 'Warning: @test/broken has 1 integration issue(s). ' +
73
- 'Run: astryx doctor integration validate @test/broken',
72
+ 'Warning: @test/broken has 1 integration issue(s). Run: astryx doctor',
74
73
  );
75
74
  expect(stdout).not.toContain('No integrations configured.');
76
- expect(stdout).toContain('No external components found in configured integrations.');
75
+ expect(stdout).toContain(
76
+ 'No external components found in configured integrations.',
77
+ );
77
78
  });
78
79
 
79
80
  it('reports meta.configured=true in --json, with the nudge suppressed', async () => {
@@ -87,6 +88,53 @@ describe('astryx discover with a manifest that fails to load', () => {
87
88
  });
88
89
  });
89
90
 
91
+ describe('astryx discover with a configured package that is not installed', () => {
92
+ beforeEach(() => {
93
+ const healthy = path.join(project, 'node_modules', '@test', 'healthy');
94
+ fs.mkdirSync(path.join(healthy, 'components'), {recursive: true});
95
+ fs.writeFileSync(
96
+ path.join(healthy, 'package.json'),
97
+ JSON.stringify({name: '@test/healthy', version: '2.0.0'}),
98
+ );
99
+ fs.writeFileSync(
100
+ path.join(healthy, 'astryx.integration.mjs'),
101
+ `export default {components: './components'};\n`,
102
+ );
103
+ fs.writeFileSync(
104
+ path.join(healthy, 'components', 'Widget.doc.mjs'),
105
+ `export const docs = {name: 'Widget', usage: {description: 'A widget.'}, props: []};\n`,
106
+ );
107
+ fs.writeFileSync(
108
+ path.join(healthy, 'components', 'Widget.tsx'),
109
+ `export function Widget() { return null; }\n`,
110
+ );
111
+ fs.writeFileSync(
112
+ path.join(project, 'astryx.config.mjs'),
113
+ `export default {integrations: ['@test/missing', '@test/healthy']};\n`,
114
+ );
115
+ });
116
+
117
+ it('still lists the healthy package and exits 0', async () => {
118
+ const {status, stdout} = await runCli(['discover', '--json'], {
119
+ cwd: project,
120
+ });
121
+
122
+ expect(status).toBe(0);
123
+ expect(JSON.parse(stdout).data).toEqual([
124
+ expect.objectContaining({name: '@test/healthy', components: ['Widget']}),
125
+ ]);
126
+ });
127
+
128
+ it('names the missing package in the stderr nudge', async () => {
129
+ const {status, stderr} = await runCli(['discover'], {cwd: project});
130
+
131
+ expect(status).toBe(0);
132
+ expect(stderr).toContain(
133
+ 'Warning: @test/missing has 1 integration issue(s). Run: astryx doctor\n',
134
+ );
135
+ });
136
+ });
137
+
90
138
  describe('astryx search with a manifest that fails to load', () => {
91
139
  // search needs a resolvable @astryxdesign/core; without one it errors out
92
140
  // before it can list anything, which is not the case under test.
@@ -101,8 +149,7 @@ describe('astryx search with a manifest that fails to load', () => {
101
149
 
102
150
  expect(status).toBe(0);
103
151
  expect(stderr).toContain(
104
- 'Warning: @test/broken has 1 integration issue(s). ' +
105
- 'Run: astryx doctor integration validate @test/broken',
152
+ 'Warning: @test/broken has 1 integration issue(s). Run: astryx doctor',
106
153
  );
107
154
 
108
155
  const asJson = await runCli(['search', 'button', '--json'], {cwd: project});
@@ -0,0 +1,97 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file `astryx discover --components` does what its doc says.
5
+ *
6
+ * The flag only lifts the package list's component summary (the first 10
7
+ * names plus "+N more") so every component prints. It changes nothing in
8
+ * `--json`, whose entries always carry the full array.
9
+ */
10
+
11
+ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import * as os from 'node:os';
15
+ import {runCli} from '../../../test-utils/run-cli.mjs';
16
+ import {doc} from './discover.doc.mjs';
17
+ import {doc as discoverFn} from '../../../api/discover/discover.doc.mjs';
18
+
19
+ const NAMES = Array.from({length: 12}, (_, i) => `Part${String(i).padStart(2, '0')}`);
20
+
21
+ let tmpDir;
22
+ let project;
23
+
24
+ beforeEach(() => {
25
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-discover-components-'));
26
+ project = path.join(tmpDir, 'project');
27
+ const pkgDir = path.join(project, 'node_modules', '@test', 'kit');
28
+ fs.mkdirSync(path.join(pkgDir, 'components'), {recursive: true});
29
+ fs.writeFileSync(
30
+ path.join(project, 'package.json'),
31
+ JSON.stringify({name: 'proj', version: '1.0.0'}),
32
+ );
33
+ fs.writeFileSync(
34
+ path.join(project, 'astryx.config.mjs'),
35
+ `export default {integrations: ['@test/kit']};\n`,
36
+ );
37
+ fs.writeFileSync(
38
+ path.join(pkgDir, 'package.json'),
39
+ JSON.stringify({name: '@test/kit', version: '1.0.0'}),
40
+ );
41
+ fs.writeFileSync(
42
+ path.join(pkgDir, 'astryx.integration.mjs'),
43
+ `export default {components: './components'};\n`,
44
+ );
45
+ for (const name of NAMES) {
46
+ fs.writeFileSync(
47
+ path.join(pkgDir, 'components', `${name}.doc.mjs`),
48
+ `export const docs = {name: '${name}', usage: {description: 'A part.'}};\n`,
49
+ );
50
+ fs.writeFileSync(
51
+ path.join(pkgDir, 'components', `${name}.tsx`),
52
+ `export function ${name}() { return null; }\n`,
53
+ );
54
+ }
55
+ });
56
+
57
+ afterEach(() => {
58
+ fs.rmSync(tmpDir, {recursive: true, force: true});
59
+ });
60
+
61
+ /** @param {string} stdout */
62
+ function componentsLine(stdout) {
63
+ return stdout.split('\n').find(line => line.startsWith('components:'));
64
+ }
65
+
66
+ describe('astryx discover --components', () => {
67
+ it('lists every component where the default list shows the first 10', async () => {
68
+ const summary = await runCli(['discover'], {cwd: project});
69
+ const full = await runCli(['discover', '--components'], {cwd: project});
70
+
71
+ expect(componentsLine(summary.stdout)).toMatch(
72
+ new RegExp(`${NAMES[9]}, \\+2 more$`),
73
+ );
74
+ expect(componentsLine(full.stdout)).toMatch(new RegExp(`${NAMES.join(', ')}$`));
75
+ });
76
+
77
+ it('leaves the --json response unchanged', async () => {
78
+ const plain = await runCli(['discover', '--json'], {cwd: project});
79
+ const flagged = await runCli(['discover', '--components', '--json'], {
80
+ cwd: project,
81
+ });
82
+
83
+ expect(JSON.parse(flagged.stdout)).toEqual(JSON.parse(plain.stdout));
84
+ });
85
+
86
+ it('is documented as that behavior, with an example', () => {
87
+ const option = doc.options?.find(o => o.flag === '--components');
88
+ const param = discoverFn.params?.find(p => p.name === 'options.components');
89
+
90
+ for (const description of [option?.description, param?.description]) {
91
+ expect(description).toMatch(/every component/i);
92
+ expect(description).toMatch(/first 10/);
93
+ expect(description).not.toMatch(/components only/i);
94
+ }
95
+ expect(doc.examples?.some(e => /\s--components\b/.test(e.cli))).toBe(true);
96
+ });
97
+ });
@@ -13,30 +13,76 @@ export const doc = {
13
13
  type: 'command',
14
14
  name: 'discover',
15
15
  displayName: 'astryx discover',
16
- namespace: 'cli',
17
- summary: 'Discover external packages and components',
16
+ namespace: 'cli/commands',
17
+ summary:
18
+ 'Browse and search integrations: the ones you have and the ones you could add',
18
19
  description:
19
- 'Explores components contributed by configured external packages and integrations. ' +
20
- 'With no query it lists those packages; an @scope/name query browses one package; ' +
21
- 'an @scope/name/Component path or a free-text term resolves to a component doc.',
20
+ 'Lists the integrations this project loads and, when it has a discover source, the ones it could add, with what each one adds. ' +
21
+ 'A package query shows one package: what it adds, every version a source knows, and the command that adds it. ' +
22
+ "An @scope/name/Component path prints an installed component's doc; any other item path shows that item. " +
23
+ 'Anything else, even an exact component name, searches every item and package and lists the matches. Discover only reads: your package manager installs, updates, and removes packages.',
22
24
  fn: 'discover',
23
25
  args: [{name: 'query', param: 'query', required: false}],
24
26
  options: [
25
27
  {
26
28
  flag: '--components',
27
29
  param: 'options.components',
28
- description: 'List components only',
30
+ description:
31
+ 'In the package list, print every component, and every other item, of each package instead of the first 10 and a "+N more" count. No effect on --json output or on a package, component, or search query.',
32
+ },
33
+ {
34
+ flag: '--type <kind>',
35
+ param: 'options.type',
36
+ description:
37
+ 'Only one kind: component, template, doc, theme, codemod, or agent-doc. In the list, only packages that add it; in a search, only items of that kind.',
38
+ },
39
+ {
40
+ flag: '--installed',
41
+ param: 'options.installed',
42
+ description:
43
+ 'Only what this project has. Cannot be set with --available.',
44
+ },
45
+ {
46
+ flag: '--available',
47
+ param: 'options.available',
48
+ description:
49
+ 'Only what this project could add. Cannot be set with --installed.',
50
+ },
51
+ {
52
+ flag: '--limit <n>',
53
+ param: 'options.limit',
54
+ description:
55
+ 'Max number of search results, a positive integer (default 20).',
29
56
  },
30
57
  ],
31
58
  examples: [
32
- {label: 'List packages', cli: 'astryx discover --json'},
33
- {label: 'Browse a package', cli: 'astryx discover @acme/ui'},
59
+ {
60
+ label: 'List what you have and what you could add',
61
+ cli: 'astryx discover',
62
+ },
63
+ {
64
+ label: 'List every component of each package',
65
+ cli: 'astryx discover --components',
66
+ },
67
+ {
68
+ label: 'Only packages that add themes',
69
+ cli: 'astryx discover --type theme',
70
+ },
71
+ {
72
+ label: 'Browse a package and its versions',
73
+ cli: 'astryx discover @acme/ui',
74
+ },
75
+ {label: 'See one version', cli: 'astryx discover @acme/ui@2.1.0'},
76
+ {
77
+ label: 'Search templates you could add',
78
+ cli: 'astryx discover dashboard --type template --available',
79
+ },
34
80
  ],
35
81
  exitCodes: [
36
82
  {code: 0, when: 'success'},
37
83
  {
38
84
  code: 1,
39
- when: 'unknown package or component, a malformed doc, or an empty free-text query',
85
+ when: 'unknown package, version, component, or item; a malformed doc; an invalid --type or --limit; --installed with --available; or a blank query when packages are discovered',
40
86
  },
41
87
  ],
42
88
  related: ['component', 'search', 'template'],