@astryxdesign/cli 0.6.4 → 0.6.5-canary.00f1ed9

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 (405) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +103 -95
  3. package/api/build/_adapter.d.mts +36 -2
  4. package/api/build/_adapter.mjs +41 -10
  5. package/api/build/build.doc.mjs +8 -3
  6. package/api/build/build.test.mjs +60 -2
  7. package/api/build/kit/kit.mjs +109 -26
  8. package/api/build/kit/rank.d.mts +24 -8
  9. package/api/build/kit/rank.mjs +277 -97
  10. package/api/build/kit/rank.test.mjs +231 -48
  11. package/api/component/_adapter.d.mts +25 -0
  12. package/api/component/_adapter.mjs +59 -5
  13. package/api/component/component.d.mts +6 -3
  14. package/api/component/component.doc.mjs +37 -17
  15. package/api/component/component.mjs +249 -9
  16. package/api/component/component.type.d.mts +25 -0
  17. package/api/component/component.type.mjs +44 -0
  18. package/api/discover/_adapter.d.mts +114 -6
  19. package/api/discover/_adapter.mjs +372 -17
  20. package/api/discover/_adapter.test.mjs +215 -0
  21. package/api/discover/_catalog-view.d.mts +115 -0
  22. package/api/discover/_catalog-view.mjs +203 -0
  23. package/api/discover/_catalog-view.test.mjs +128 -0
  24. package/api/discover/detail/detail.d.mts +18 -6
  25. package/api/discover/detail/detail.mjs +67 -13
  26. package/api/discover/detail/detail.test.mjs +85 -0
  27. package/api/discover/detail/item/item.d.mts +26 -0
  28. package/api/discover/detail/item/item.mjs +78 -0
  29. package/api/discover/detail/item/item.test.mjs +73 -0
  30. package/api/discover/discover.d.mts +3 -9
  31. package/api/discover/discover.doc.mjs +61 -18
  32. package/api/discover/discover.mjs +220 -36
  33. package/api/discover/discover.test.mjs +11 -2
  34. package/api/discover/discover.type.d.mts +147 -8
  35. package/api/discover/discover.type.mjs +102 -12
  36. package/api/discover/list/list.d.mts +20 -6
  37. package/api/discover/list/list.mjs +45 -12
  38. package/api/discover/list/list.test.mjs +46 -0
  39. package/api/discover/search/search.d.mts +18 -16
  40. package/api/discover/search/search.mjs +102 -56
  41. package/api/discover/search/search.test.mjs +144 -10
  42. package/api/docs/_adapter.d.mts +8 -3
  43. package/api/docs/_adapter.mjs +14 -6
  44. package/api/docs/docOverlays.test.mjs +27 -1
  45. package/api/docs/docs.doc.mjs +2 -2
  46. package/api/docs/docs.test.mjs +54 -18
  47. package/api/docs/integration-tree.test.mjs +17 -0
  48. package/api/docs/integrationDocs.test.mjs +27 -5
  49. package/api/doctor/doctor.d.mts +8 -3
  50. package/api/doctor/doctor.doc.mjs +17 -8
  51. package/api/doctor/doctor.mjs +90 -9
  52. package/api/doctor/doctor.test.mjs +122 -10
  53. package/api/doctor/doctor.type.d.mts +1 -1
  54. package/api/doctor/doctor.type.mjs +1 -1
  55. package/api/error.d.mts +22 -0
  56. package/api/error.mjs +42 -0
  57. package/api/gap-report/gap-report.doc.mjs +19 -10
  58. package/api/hook/hook.doc.mjs +6 -3
  59. package/api/index.d.mts +1 -0
  60. package/api/index.mjs +5 -3
  61. package/api/init/init.doc.mjs +17 -12
  62. package/api/integration/add-contribution.d.mts +2 -1
  63. package/api/integration/add-contribution.mjs +7 -3
  64. package/api/integration/add-contribution.test.mjs +3 -3
  65. package/api/integration/add-helpers.d.mts +5 -2
  66. package/api/integration/add-helpers.mjs +36 -9
  67. package/api/integration/add-theme.mjs +266 -23
  68. package/api/integration/add-theme.test.mjs +247 -0
  69. package/api/integration/authoring-checks.mjs +12 -9
  70. package/api/integration/authoring-checks.type.d.mts +8 -0
  71. package/api/integration/authoring-checks.type.mjs +7 -3
  72. package/api/integration/integration-authoring.type.d.mts +4 -1
  73. package/api/integration/integration-authoring.type.mjs +6 -1
  74. package/api/integration/integrationAdd.doc.mjs +6 -0
  75. package/api/integration/integrationAddTheme.doc.mjs +10 -0
  76. package/api/integration/integrationComponentConflicts.doc.mjs +1 -1
  77. package/api/integration/integrationDocConflicts.doc.mjs +1 -1
  78. package/api/integration/integrationPackCheck.doc.mjs +3 -3
  79. package/api/integration/integrationTemplateConflicts.doc.mjs +1 -1
  80. package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
  81. package/api/integration/pack-check.mjs +92 -10
  82. package/api/integration/pack-check.test.mjs +140 -1
  83. package/api/integration/pack-check.type.mjs +1 -1
  84. package/api/integration/validate-integration.d.mts +4 -2
  85. package/api/integration/validate-integration.mjs +7 -2
  86. package/api/integration/validate-integration.test.mjs +55 -0
  87. package/api/integration/validate-integration.type.d.mts +5 -0
  88. package/api/integration/validate-integration.type.mjs +5 -1
  89. package/api/integration/validateIntegration.doc.mjs +1 -1
  90. package/api/json/assertResponse.doc.mjs +1 -1
  91. package/api/json/isError.doc.mjs +1 -1
  92. package/api/layout/expand/expand.mjs +12 -7
  93. package/api/layout/expand/expand.receipt.test.mjs +74 -0
  94. package/api/layout/layout.type.d.mts +1 -0
  95. package/api/layout/layout.type.mjs +1 -0
  96. package/api/layout/layoutExpand.doc.mjs +1 -1
  97. package/api/search/search.d.mts +51 -1
  98. package/api/search/search.doc.mjs +2 -2
  99. package/api/search/search.mjs +299 -17
  100. package/api/search/search.test.mjs +216 -18
  101. package/api/swizzle/copy/copy.mjs +66 -3
  102. package/api/swizzle/swizzle.doc.mjs +11 -5
  103. package/api/template/copy/copy.mjs +15 -9
  104. package/api/template/copy/copy.receipt.test.mjs +77 -0
  105. package/api/template/copy/copy.test.mjs +9 -0
  106. package/api/template/show/show.mjs +15 -4
  107. package/api/template/show/show.test.mjs +76 -0
  108. package/api/template/template-integration.test.mjs +14 -0
  109. package/api/template/template.d.mts +1 -1
  110. package/api/template/template.doc.mjs +8 -3
  111. package/api/template/template.mjs +1 -0
  112. package/api/template/template.type.d.mts +2 -0
  113. package/api/template/template.type.mjs +2 -0
  114. package/api/theme/add/add.mjs +17 -25
  115. package/api/theme/add/add.rollback.test.mjs +158 -0
  116. package/api/theme/add/add.staging.test.mjs +40 -23
  117. package/api/theme/build/build.d.mts +24 -0
  118. package/api/theme/build/build.family.test.mjs +7 -12
  119. package/api/theme/build/build.mjs +243 -26
  120. package/api/theme/build/build.project-core.test.mjs +165 -0
  121. package/api/theme/build/build.rollback.test.mjs +148 -0
  122. package/api/theme/generateTonalPalette.doc.mjs +1 -2
  123. package/api/theme/listThemes.doc.mjs +1 -1
  124. package/api/theme/themeAdd.doc.mjs +9 -10
  125. package/api/theme/themeBuild.doc.mjs +13 -13
  126. package/api/theme/themeList.doc.mjs +1 -1
  127. package/api/theme/themeListAvailable.doc.mjs +2 -1
  128. package/api/theme/themePaletteGenerate.doc.mjs +15 -8
  129. package/api/theme/themeTargets.doc.mjs +3 -2
  130. package/api/theme/themeTemplate.doc.mjs +2 -1
  131. package/api/upgrade/run/files-changed.test.mjs +111 -0
  132. package/api/upgrade/run/run.mjs +25 -6
  133. package/api/upgrade/run/run.test.mjs +45 -1
  134. package/api/upgrade/upgrade.doc.mjs +24 -22
  135. package/api/upgrade/upgrade.type.d.mts +1 -0
  136. package/api/upgrade/upgrade.type.mjs +3 -2
  137. package/assets/codemods/__tests__/runner.test.mjs +3 -1
  138. package/assets/codemods/file-count.test.mjs +163 -0
  139. package/assets/codemods/integration-runner.mjs +3 -3
  140. package/assets/codemods/runner.mjs +5 -4
  141. package/assets/docs/README.md +4 -2
  142. package/assets/docs/browser-support.doc.mjs +11 -11
  143. package/assets/docs/color.doc.mjs +8 -2
  144. package/assets/docs/elevation.doc.mjs +6 -4
  145. package/assets/docs/getting-started.doc.mjs +5 -16
  146. package/assets/docs/icons.doc.mjs +3 -21
  147. package/assets/docs/illustrations.doc.mjs +7 -15
  148. package/assets/docs/internationalization.doc.mjs +7 -5
  149. package/assets/docs/layout.doc.dense.mjs +130 -82
  150. package/assets/docs/layout.doc.mjs +133 -77
  151. package/assets/docs/migration.doc.mjs +19 -21
  152. package/assets/docs/motion.doc.mjs +16 -3
  153. package/assets/docs/principles.doc.dense.mjs +5 -5
  154. package/assets/docs/principles.doc.mjs +8 -0
  155. package/assets/docs/principles.doc.zh.mjs +6 -6
  156. package/assets/docs/shape.doc.mjs +8 -3
  157. package/assets/docs/spacing.doc.mjs +7 -2
  158. package/assets/docs/styling-libraries.doc.mjs +6 -2
  159. package/assets/docs/styling.doc.mjs +19 -23
  160. package/assets/docs/theme.doc.dense.mjs +58 -18
  161. package/assets/docs/theme.doc.mjs +57 -47
  162. package/assets/docs/theme.doc.zh.mjs +9 -8
  163. package/assets/docs/tokens.doc.dense.mjs +2 -2
  164. package/assets/docs/tokens.doc.mjs +389 -8
  165. package/assets/docs/tokens.doc.zh.mjs +2 -2
  166. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  167. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  168. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  169. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  170. package/assets/docs/tree/block-template.doc.mjs +130 -0
  171. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  172. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  173. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  174. package/assets/docs/tree/checks.doc.mjs +119 -0
  175. package/assets/docs/tree/codemods.doc.mjs +147 -0
  176. package/assets/docs/tree/component-family.doc.mjs +113 -0
  177. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  178. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  179. package/assets/docs/tree/components.doc.mjs +23 -0
  180. package/assets/docs/tree/configuration.doc.mjs +23 -0
  181. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  182. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  183. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  184. package/assets/docs/tree/docs.doc.mjs +21 -0
  185. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  186. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  187. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  188. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  189. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  190. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  191. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  192. package/assets/docs/tree/help.doc.mjs +16 -0
  193. package/assets/docs/tree/integrations.doc.mjs +25 -451
  194. package/assets/docs/tree/links.doc.mjs +98 -0
  195. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  196. package/assets/docs/tree/page-template.doc.mjs +71 -0
  197. package/assets/docs/tree/publishing.doc.mjs +111 -0
  198. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  199. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  200. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  201. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  202. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  203. package/assets/docs/tree/ship.doc.mjs +16 -0
  204. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  205. package/assets/docs/tree/single-component.doc.mjs +165 -0
  206. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  207. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  208. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  209. package/assets/docs/tree/template-doc-overview.doc.mjs +121 -0
  210. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  211. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  212. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  213. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  214. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  215. package/assets/docs/tree/templates.doc.mjs +34 -0
  216. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  217. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  218. package/assets/docs/tree/themes.doc.mjs +39 -0
  219. package/assets/docs/tree/troubleshooting.doc.mjs +153 -0
  220. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  221. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  222. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  223. package/assets/docs/tree/versioning.doc.mjs +162 -0
  224. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  225. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  226. package/assets/docs/typography.doc.mjs +24 -4
  227. package/assets/docs/working-with-ai.doc.mjs +30 -22
  228. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  229. package/assets/templates/pages/ai-chat/template.doc.mjs +16 -1
  230. package/assets/templates/pages/ai-chat-landing/template.doc.mjs +9 -1
  231. package/assets/templates/pages/blank/template.doc.mjs +3 -1
  232. package/assets/templates/pages/canvas-editor/template.doc.mjs +9 -1
  233. package/assets/templates/pages/centered-hero/template.doc.mjs +3 -1
  234. package/assets/templates/pages/checkout-wizard/template.doc.mjs +1 -0
  235. package/assets/templates/pages/classic-gallery/template.doc.mjs +3 -1
  236. package/assets/templates/pages/contact-form/template.doc.mjs +16 -1
  237. package/assets/templates/pages/dashboard/template.doc.mjs +15 -1
  238. package/assets/templates/pages/dashboard-alert-rail/template.doc.mjs +23 -1
  239. package/assets/templates/pages/dashboard-cohort-funnel/template.doc.mjs +10 -1
  240. package/assets/templates/pages/dashboard-comparison/template.doc.mjs +9 -1
  241. package/assets/templates/pages/dashboard-composition/template.doc.mjs +10 -1
  242. package/assets/templates/pages/dashboard-progress/template.doc.mjs +17 -1
  243. package/assets/templates/pages/dashboard-scorecard/template.doc.mjs +2 -1
  244. package/assets/templates/pages/detail-page/template.doc.mjs +8 -0
  245. package/assets/templates/pages/documentation/template.doc.mjs +10 -1
  246. package/assets/templates/pages/documentation-design/template.doc.mjs +10 -1
  247. package/assets/templates/pages/documentation-technical/template.doc.mjs +10 -1
  248. package/assets/templates/pages/editor/template.doc.mjs +9 -1
  249. package/assets/templates/pages/file-explorer/template.doc.mjs +3 -1
  250. package/assets/templates/pages/form-two-column/template.doc.mjs +17 -1
  251. package/assets/templates/pages/form-wizard/template.doc.mjs +14 -1
  252. package/assets/templates/pages/form-wizard-dialog/template.doc.mjs +1 -0
  253. package/assets/templates/pages/gallery-hero/template.doc.mjs +10 -1
  254. package/assets/templates/pages/ide/template.doc.mjs +9 -1
  255. package/assets/templates/pages/incident-console/template.doc.mjs +10 -1
  256. package/assets/templates/pages/kanban-board/template.doc.mjs +11 -1
  257. package/assets/templates/pages/library/template.doc.mjs +15 -1
  258. package/assets/templates/pages/login/template.doc.mjs +10 -1
  259. package/assets/templates/pages/login-card/template.doc.mjs +11 -1
  260. package/assets/templates/pages/login-split/template.doc.mjs +10 -1
  261. package/assets/templates/pages/login-sso/template.doc.mjs +10 -1
  262. package/assets/templates/pages/messaging-shell/template.doc.mjs +11 -1
  263. package/assets/templates/pages/mixed-gallery/template.doc.mjs +10 -1
  264. package/assets/templates/pages/payment-form/template.doc.mjs +3 -1
  265. package/assets/templates/pages/product-detail/template.doc.mjs +9 -1
  266. package/assets/templates/pages/product-gallery/template.doc.mjs +10 -1
  267. package/assets/templates/pages/settings/template.doc.mjs +3 -1
  268. package/assets/templates/pages/settings-dialog/template.doc.mjs +9 -1
  269. package/assets/templates/pages/settings-sidebar/template.doc.mjs +9 -1
  270. package/assets/templates/pages/shell-nav/template.doc.mjs +10 -1
  271. package/assets/templates/pages/shell-side-nav/template.doc.mjs +14 -1
  272. package/assets/templates/pages/shell-top-nav/template.doc.mjs +11 -1
  273. package/assets/templates/pages/side-gallery/template.doc.mjs +3 -1
  274. package/assets/templates/pages/table/template.doc.mjs +11 -1
  275. package/assets/templates/pages/table-filter/template.doc.mjs +21 -1
  276. package/assets/templates/pages/table-grouped/template.doc.mjs +15 -1
  277. package/assets/templates/pages/table-inbox/template.doc.mjs +18 -6
  278. package/assets/templates/pages/table-page/template.doc.mjs +20 -1
  279. package/assets/templates/pages/table-tree/template.doc.mjs +14 -1
  280. package/assets/templates/pages/theme-showcase/template.doc.mjs +10 -1
  281. package/assets/templates/pages/work-item-detail/template.doc.mjs +10 -0
  282. package/assets/templates/themes/butter/icons.tsx +2 -0
  283. package/assets/templates/themes/chocolate/icons.tsx +2 -0
  284. package/assets/templates/themes/gothic/icons.tsx +2 -0
  285. package/assets/templates/themes/matcha/icons.tsx +2 -0
  286. package/assets/templates/themes/neutral/icons.tsx +2 -0
  287. package/assets/templates/themes/stone/icons.tsx +2 -0
  288. package/assets/templates/themes/y2k/icons.tsx +2 -0
  289. package/authoring/config/config.doc.mjs +9 -1
  290. package/authoring/config/parse.d.mts +2 -0
  291. package/authoring/config/parse.mjs +19 -0
  292. package/authoring/config/parse.test.mjs +8 -0
  293. package/authoring/config/type.ts +11 -0
  294. package/authoring/discover/discover.doc.d.mts +13 -0
  295. package/authoring/discover/discover.doc.mjs +138 -0
  296. package/authoring/discover/parse.d.mts +24 -0
  297. package/authoring/discover/parse.mjs +128 -0
  298. package/authoring/discover/parse.test.mjs +124 -0
  299. package/authoring/discover/type.ts +87 -0
  300. package/authoring/doctypes/_schema.d.mts +3 -2
  301. package/authoring/doctypes/_schema.mjs +6 -0
  302. package/authoring/doctypes/base/graph-fields.doc.mjs +3 -3
  303. package/authoring/doctypes/base/type.ts +4 -2
  304. package/authoring/doctypes/component/component.doc.mjs +6 -0
  305. package/authoring/doctypes/component/type.ts +8 -0
  306. package/authoring/doctypes/reference/reference.doc.mjs +7 -0
  307. package/authoring/doctypes/reference/type.ts +5 -0
  308. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  309. package/authoring/doctypes/template/parse.d.mts +2 -0
  310. package/authoring/doctypes/template/parse.mjs +1 -0
  311. package/authoring/doctypes/template/parse.test.mjs +21 -0
  312. package/authoring/doctypes/template/template.doc.mjs +7 -1
  313. package/authoring/doctypes/template/type.ts +12 -2
  314. package/authoring/index.d.mts +1 -0
  315. package/authoring/index.d.ts +10 -0
  316. package/authoring/index.mjs +1 -0
  317. package/authoring/integration/integration.doc.mjs +12 -10
  318. package/clients/cli/commands/component/index.mjs +152 -55
  319. package/clients/cli/commands/component-batch.test.mjs +341 -0
  320. package/clients/cli/commands/component-ownership.test.mjs +89 -0
  321. package/clients/cli/commands/component.doc.mjs +27 -9
  322. package/clients/cli/commands/discover.doc.mjs +53 -9
  323. package/clients/cli/commands/discover.mjs +393 -118
  324. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  325. package/clients/cli/commands/docs.doc.mjs +1 -1
  326. package/clients/cli/commands/docs.mjs +60 -17
  327. package/clients/cli/commands/docs.test.mjs +113 -24
  328. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -2
  329. package/clients/cli/commands/doctor-integration.test.mjs +53 -0
  330. package/clients/cli/commands/doctor.doc.mjs +3 -1
  331. package/clients/cli/commands/doctor.mjs +53 -9
  332. package/clients/cli/commands/gap-report.doc.mjs +10 -9
  333. package/clients/cli/commands/init.doc.mjs +9 -6
  334. package/clients/cli/commands/integration-add.doc.mjs +17 -7
  335. package/clients/cli/commands/integration-authoring.test.mjs +70 -9
  336. package/clients/cli/commands/integration-pack.doc.mjs +5 -9
  337. package/clients/cli/commands/integration-real-world.test.mjs +1 -1
  338. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  339. package/clients/cli/commands/integration.doc.mjs +4 -4
  340. package/clients/cli/commands/integration.mjs +76 -43
  341. package/clients/cli/commands/layout-expand.doc.mjs +3 -1
  342. package/clients/cli/commands/layout.expand-receipt.test.mjs +94 -0
  343. package/clients/cli/commands/layout.mjs +16 -0
  344. package/clients/cli/commands/manifest.doc.mjs +1 -1
  345. package/clients/cli/commands/search.doc.mjs +10 -3
  346. package/clients/cli/commands/search.mjs +21 -2
  347. package/clients/cli/commands/search.test.mjs +21 -4
  348. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  349. package/clients/cli/commands/template.copy-receipt.test.mjs +60 -0
  350. package/clients/cli/commands/template.doc.mjs +1 -1
  351. package/clients/cli/commands/template.mjs +19 -5
  352. package/clients/cli/commands/template.show-media.test.mjs +62 -0
  353. package/clients/cli/commands/text-json-parity.test.mjs +7 -1
  354. package/clients/cli/commands/theme-add.doc.mjs +1 -1
  355. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -2
  356. package/clients/cli/commands/theme-palette.doc.mjs +1 -2
  357. package/clients/cli/commands/theme-targets.doc.mjs +2 -2
  358. package/clients/cli/commands/theme.doc.mjs +2 -1
  359. package/clients/cli/commands/upgrade.ascii-output.test.mjs +14 -0
  360. package/clients/cli/commands/upgrade.doc.mjs +62 -3
  361. package/clients/cli/commands/write-failure.test.mjs +175 -0
  362. package/clients/cli/index.mjs +28 -6
  363. package/clients/cli/lib/define-command.mjs +28 -4
  364. package/clients/cli/lib/define-command.test.mjs +54 -0
  365. package/clients/cli/lib/exit-codes.test.mjs +17 -1
  366. package/clients/cli/lib/json-shim.mjs +24 -14
  367. package/clients/cli/lib/manifest.mjs +48 -156
  368. package/clients/cli/lib/manifest.test.mjs +103 -9
  369. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  370. package/foundation/agent-docs/agent-docs.mjs +1 -1
  371. package/foundation/agent-docs/agent-docs.test.mjs +3 -2
  372. package/foundation/discovery/authoring-self-docs.mjs +1 -0
  373. package/foundation/discovery/authoring-self-docs.test.mjs +6 -2
  374. package/foundation/discovery/cli-self-docs.mjs +16 -2
  375. package/foundation/discovery/cli-self-docs.test.mjs +20 -0
  376. package/foundation/discovery/docs-discovery.mjs +5 -1
  377. package/foundation/discovery/docs-discovery.test.mjs +21 -0
  378. package/foundation/discovery/docs-section-key.d.mts +1 -1
  379. package/foundation/discovery/docs-section-key.mjs +1 -1
  380. package/foundation/discovery/template-adapter.d.mts +14 -0
  381. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +37 -1
  382. package/foundation/discovery/template-adapter.mjs +21 -1
  383. package/foundation/doc-compiler/doc-loads.test.mjs +5 -4
  384. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  385. package/foundation/doc-compiler/tree.d.mts +4 -0
  386. package/foundation/doc-compiler/tree.mjs +6 -1
  387. package/foundation/doc-compiler/tree.test.mjs +65 -14
  388. package/foundation/integrations/cli-requirement.d.mts +75 -11
  389. package/foundation/integrations/cli-requirement.mjs +120 -23
  390. package/foundation/integrations/cli-requirement.test.mjs +141 -9
  391. package/foundation/integrations/contribution-inventory.mjs +1 -1
  392. package/foundation/integrations/integrations.d.mts +14 -1
  393. package/foundation/integrations/integrations.mjs +41 -1
  394. package/foundation/integrations/integrations.test.mjs +31 -0
  395. package/foundation/response/batch.type.d.mts +33 -0
  396. package/foundation/response/batch.type.mjs +34 -0
  397. package/foundation/response/error-codes.doc.mjs +6 -8
  398. package/foundation/response/error-codes.test.mjs +30 -5
  399. package/foundation/response/response-types.doc.d.mts +5 -4
  400. package/foundation/response/response-types.doc.mjs +49 -19
  401. package/foundation/response/response-types.doc.test.mjs +23 -0
  402. package/foundation/response/response.doc.mjs +11 -10
  403. package/package.json +9 -9
  404. package/assets/docs/tree/integrations.test.mjs +0 -62
  405. package/assets/docs/tree/writing-docs.doc.mjs +0 -286
@@ -0,0 +1,341 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Multi-selector component lookup contract: one ordered batch envelope,
5
+ * complete per-selector states, unchanged single-selector responses, and matching
6
+ * text/JSON exit behavior.
7
+ */
8
+
9
+ import {describe, it, expect} from 'vitest';
10
+ import * as path from 'node:path';
11
+ import {
12
+ component,
13
+ COMPONENT_BATCH_SELECTOR_LIMIT,
14
+ } from '../../../api/component/component.mjs';
15
+ import {runCli} from '../../../test-utils/run-cli.mjs';
16
+
17
+ const REPO_ROOT = path.resolve(import.meta.dirname, '../../../../..');
18
+ const SLOW = 60_000;
19
+
20
+ describe('component() batch lookup', () => {
21
+ it(
22
+ 'keeps one found row per selector, in order, including duplicates',
23
+ async () => {
24
+ const result = await component(['Button', 'Badge', 'Button'], {
25
+ cwd: REPO_ROOT,
26
+ detail: 'brief',
27
+ });
28
+
29
+ expect(result.type).toBe('component.batch');
30
+ expect(result.data.count).toBe(3);
31
+ expect(result.data.results.map(row => row.selector)).toEqual([
32
+ 'Button',
33
+ 'Badge',
34
+ 'Button',
35
+ ]);
36
+ expect(result.data.results.map(row => row.status)).toEqual([
37
+ 'found',
38
+ 'found',
39
+ 'found',
40
+ ]);
41
+ expect(
42
+ result.data.results.map(row =>
43
+ row.status === 'found' ? row.result.type : null,
44
+ ),
45
+ ).toEqual(['component.detail', 'component.detail', 'component.detail']);
46
+ },
47
+ SLOW,
48
+ );
49
+
50
+ it(
51
+ 'applies every focused projection to each found row',
52
+ async () => {
53
+ const projections = [
54
+ {options: {props: true}, expectedType: 'component.detail.props'},
55
+ {options: {source: true}, expectedType: 'component.detail.source'},
56
+ {options: {showcase: true}, expectedType: 'component.detail.showcase'},
57
+ {options: {blocks: true}, expectedType: 'component.detail.blocks'},
58
+ ];
59
+ for (const projection of projections) {
60
+ const result = await component(['Button', 'Card'], {
61
+ cwd: REPO_ROOT,
62
+ ...projection.options,
63
+ });
64
+ expect(result.type).toBe('component.batch');
65
+ expect(
66
+ result.data.results.map(row =>
67
+ row.status === 'found' ? row.result.type : null,
68
+ ),
69
+ ).toEqual([projection.expectedType, projection.expectedType]);
70
+ }
71
+ },
72
+ SLOW,
73
+ );
74
+
75
+ it(
76
+ 'uses input shape to distinguish catalog, single, and batch calls',
77
+ async () => {
78
+ expect((await component(undefined, {cwd: REPO_ROOT})).type).toBe(
79
+ 'component.list',
80
+ );
81
+ expect((await component('Button', {cwd: REPO_ROOT})).type).toBe(
82
+ 'component.detail',
83
+ );
84
+
85
+ const emptyBatch = await component([], {cwd: REPO_ROOT});
86
+ expect(emptyBatch).toEqual({
87
+ type: 'component.batch',
88
+ data: {count: 0, results: []},
89
+ });
90
+ expect(
91
+ await component([], {
92
+ cwd: REPO_ROOT,
93
+ list: true,
94
+ category: 'Form',
95
+ }),
96
+ ).toEqual(emptyBatch);
97
+
98
+ const oneRowBatch = await component(['Button'], {
99
+ cwd: REPO_ROOT,
100
+ detail: 'brief',
101
+ });
102
+ expect(oneRowBatch).toMatchObject({
103
+ type: 'component.batch',
104
+ data: {
105
+ count: 1,
106
+ results: [
107
+ {
108
+ selector: 'Button',
109
+ status: 'found',
110
+ result: {type: 'component.detail'},
111
+ },
112
+ ],
113
+ },
114
+ });
115
+ },
116
+ SLOW,
117
+ );
118
+
119
+ it('rejects an oversized array before component resolution starts', async () => {
120
+ const selectors = Array.from(
121
+ {length: COMPONENT_BATCH_SELECTOR_LIMIT + 1},
122
+ () => 'Button',
123
+ );
124
+ await expect(
125
+ component(selectors, {
126
+ cwd: path.join(REPO_ROOT, 'missing-batch-cwd'),
127
+ }),
128
+ ).rejects.toMatchObject({
129
+ code: 'ERR_INVALID_ARGUMENT',
130
+ message: `Component batch accepts at most ${COMPONENT_BATCH_SELECTOR_LIMIT} selectors; received ${selectors.length}`,
131
+ });
132
+ });
133
+
134
+ it(
135
+ 'keeps receipt invariants across a deterministic selector chaos matrix',
136
+ async () => {
137
+ const found = new Set(['Button', 'Card']);
138
+ const selectorCases = [
139
+ [],
140
+ ['Button'],
141
+ ['ZzzNope99'],
142
+ ['Button', 'Button'],
143
+ ['ZzzNope98', 'ZzzNope99'],
144
+ ['Button', 'ZzzNope99', 'Card'],
145
+ ['ZzzNope99', 'Button', 'ZzzNope99', 'Button'],
146
+ ['Card', 'Button', 'Card', 'ZzzNope98', 'Button'],
147
+ ];
148
+
149
+ for (const selectors of selectorCases) {
150
+ const result = await component(selectors, {
151
+ cwd: REPO_ROOT,
152
+ detail: 'brief',
153
+ });
154
+ expect(result.type).toBe('component.batch');
155
+ expect(result.data.count).toBe(selectors.length);
156
+ expect(result.data.results.map(row => row.selector)).toEqual(selectors);
157
+ expect(result.data.results.map(row => row.status)).toEqual(
158
+ selectors.map(selector =>
159
+ found.has(selector) ? 'found' : 'not_found',
160
+ ),
161
+ );
162
+ for (const row of result.data.results) {
163
+ if (row.status === 'found') {
164
+ expect(row.result.type).toBe('component.detail');
165
+ } else {
166
+ expect(row.code).toBe('ERR_UNKNOWN_COMPONENT');
167
+ }
168
+ }
169
+ }
170
+ },
171
+ SLOW,
172
+ );
173
+
174
+ it(
175
+ 'composes every detail and language control over a batch',
176
+ async () => {
177
+ /** @type {Array<{detail?: 'full'|'compact'|'brief'; lang?: string; zh?: boolean; dense?: boolean}>} */
178
+ const controls = [
179
+ {detail: 'brief'},
180
+ {detail: 'compact'},
181
+ {detail: 'full'},
182
+ {lang: 'en'},
183
+ {lang: 'dense'},
184
+ {zh: true},
185
+ {dense: true},
186
+ ];
187
+ for (const control of controls) {
188
+ const result = await component(['Button', 'Card'], {
189
+ cwd: REPO_ROOT,
190
+ ...control,
191
+ });
192
+ expect(result.type).toBe('component.batch');
193
+ expect(result.data.results).toHaveLength(2);
194
+ expect(
195
+ result.data.results.every(
196
+ row =>
197
+ row.status === 'found' && row.result.type === 'component.detail',
198
+ ),
199
+ ).toBe(true);
200
+ }
201
+ },
202
+ SLOW,
203
+ );
204
+ });
205
+
206
+ describe('astryx component batch lookup', () => {
207
+ it('documents variadic selector grammar in --help', async () => {
208
+ const run = await runCli(['component', '--help'], REPO_ROOT);
209
+ expect(run.code).toBe(0);
210
+ expect(run.stdout).toContain(
211
+ 'Usage: astryx component [options] [names...]',
212
+ );
213
+ expect(run.stdout).toContain('@scope/package@version/Name');
214
+ expect(run.stdout).toContain('Two or more return one ordered batch');
215
+ expect(run.stdout).toContain('At most 100 selectors');
216
+ });
217
+
218
+ it(
219
+ 'keeps catalog and single-result CLI envelopes at zero and one selectors',
220
+ async () => {
221
+ const catalog = await runCli(['--json', 'component'], REPO_ROOT);
222
+ expect(catalog.code).toBe(0);
223
+ expect(JSON.parse(catalog.stdout).type).toBe('component.list');
224
+
225
+ const single = await runCli(
226
+ ['--json', '--detail', 'brief', 'component', 'Button'],
227
+ REPO_ROOT,
228
+ );
229
+ expect(single.code).toBe(0);
230
+ expect(JSON.parse(single.stdout).type).toBe('component.detail');
231
+ },
232
+ SLOW,
233
+ );
234
+
235
+ it(
236
+ 'emits one component.batch JSON envelope for several found selectors',
237
+ async () => {
238
+ const run = await runCli(
239
+ ['--json', '--detail', 'brief', 'component', 'Button', 'Badge'],
240
+ REPO_ROOT,
241
+ );
242
+ expect(run.code).toBe(0);
243
+ const envelope = JSON.parse(run.stdout);
244
+ expect(envelope.type).toBe('component.batch');
245
+ expect(envelope.data.count).toBe(2);
246
+ expect(envelope.data.results.map(row => row.selector)).toEqual([
247
+ 'Button',
248
+ 'Badge',
249
+ ]);
250
+ expect(envelope.data.results.every(row => row.status === 'found')).toBe(
251
+ true,
252
+ );
253
+ },
254
+ SLOW,
255
+ );
256
+
257
+ it(
258
+ 'rejects an oversized batch before emitting JSON or text results',
259
+ async () => {
260
+ const selectors = Array.from(
261
+ {length: COMPONENT_BATCH_SELECTOR_LIMIT + 1},
262
+ () => 'Button',
263
+ );
264
+ const json = await runCli(
265
+ ['--json', 'component', ...selectors],
266
+ REPO_ROOT,
267
+ );
268
+ expect(json.code).toBe(1);
269
+ expect(JSON.parse(json.stdout)).toMatchObject({
270
+ code: 'ERR_INVALID_ARGUMENT',
271
+ error: `Component batch accepts at most ${COMPONENT_BATCH_SELECTOR_LIMIT} selectors; received ${selectors.length}`,
272
+ });
273
+ expect(JSON.parse(json.stdout).type).toBeUndefined();
274
+
275
+ const text = await runCli(['component', ...selectors], REPO_ROOT);
276
+ expect(text.code).toBe(1);
277
+ expect(text.stdout + text.stderr).toContain(
278
+ `accepts at most ${COMPONENT_BATCH_SELECTOR_LIMIT} selectors`,
279
+ );
280
+ },
281
+ SLOW,
282
+ );
283
+
284
+ it(
285
+ 'emits every row and exits 1 when one selector is not found',
286
+ async () => {
287
+ const run = await runCli(
288
+ ['--json', '--detail', 'brief', 'component', 'Button', 'ZzzNope99'],
289
+ REPO_ROOT,
290
+ );
291
+ expect(run.code).toBe(1);
292
+ const envelope = JSON.parse(run.stdout);
293
+ expect(envelope.type).toBe('component.batch');
294
+ expect(envelope.data.results).toMatchObject([
295
+ {selector: 'Button', status: 'found'},
296
+ {
297
+ selector: 'ZzzNope99',
298
+ status: 'not_found',
299
+ code: 'ERR_UNKNOWN_COMPONENT',
300
+ },
301
+ ]);
302
+ },
303
+ SLOW,
304
+ );
305
+
306
+ it(
307
+ 'emits every failed row and exits 1 when no selector resolves',
308
+ async () => {
309
+ const run = await runCli(
310
+ ['--json', 'component', 'ZzzNope98', 'ZzzNope99'],
311
+ REPO_ROOT,
312
+ );
313
+ expect(run.code).toBe(1);
314
+ const envelope = JSON.parse(run.stdout);
315
+ expect(envelope.type).toBe('component.batch');
316
+ expect(envelope.data.count).toBe(2);
317
+ expect(envelope.data.results).toMatchObject([
318
+ {selector: 'ZzzNope98', status: 'not_found'},
319
+ {selector: 'ZzzNope99', status: 'not_found'},
320
+ ]);
321
+ },
322
+ SLOW,
323
+ );
324
+
325
+ it(
326
+ 'projects every row in text and keeps the same failing exit status',
327
+ async () => {
328
+ const run = await runCli(
329
+ ['--detail', 'brief', 'component', 'Button', 'ZzzNope99'],
330
+ REPO_ROOT,
331
+ );
332
+ expect(run.code).toBe(1);
333
+ expect(run.stdout).toContain('count: 2');
334
+ expect(run.stdout).toMatch(/selector: Button\nstatus:\s+found/);
335
+ expect(run.stdout).toMatch(
336
+ /selector: ZzzNope99\nstatus:\s+not_found\ncode:\s+ERR_UNKNOWN_COMPONENT/,
337
+ );
338
+ },
339
+ SLOW,
340
+ );
341
+ });
@@ -277,6 +277,95 @@ describe('component() — integration ownership via config', () => {
277
277
  expect(result.data.import).toBe(`${INTEGRATION_NAME}/Toolbar/Search`);
278
278
  });
279
279
 
280
+ it('reports every installed candidate for an ambiguous batch selector', async () => {
281
+ createFixture({extraComponent: 'AppShell'});
282
+ const result = await component(['MetaAppShell', 'AppShell'], {cwd: tmpDir});
283
+ expect(result.type).toBe('component.batch');
284
+ expect(result.data.results[0]).toMatchObject({
285
+ selector: 'MetaAppShell',
286
+ status: 'found',
287
+ });
288
+ expect(result.data.results[1]).toMatchObject({
289
+ selector: 'AppShell',
290
+ status: 'ambiguous',
291
+ code: 'ERR_UNKNOWN_COMPONENT',
292
+ });
293
+ expect(result.data.results[1].candidates).toEqual(
294
+ expect.arrayContaining([
295
+ {
296
+ package: CORE_PACKAGE,
297
+ component: 'AppShell',
298
+ kind: 'component',
299
+ installed: true,
300
+ },
301
+ {
302
+ package: INTEGRATION_NAME,
303
+ component: 'AppShell',
304
+ kind: 'component',
305
+ installed: true,
306
+ },
307
+ ]),
308
+ );
309
+ });
310
+
311
+ it('keeps the single-result envelope for one package-qualified selector', async () => {
312
+ createFixture();
313
+ const result = await component('@test/meta@1.2.3/MetaAppShell', {
314
+ cwd: tmpDir,
315
+ });
316
+ expect(result.type).toBe('component.detail');
317
+ expect(result.data).toMatchObject({
318
+ name: 'MetaAppShell',
319
+ package: INTEGRATION_NAME,
320
+ });
321
+ });
322
+
323
+ it('resolves an exact installed package version and refuses another version', async () => {
324
+ createFixture();
325
+ const result = await component(
326
+ [
327
+ '@test/meta@1.2.3/MetaAppShell',
328
+ '@test/meta@9.9.9/MetaAppShell',
329
+ ],
330
+ {cwd: tmpDir},
331
+ );
332
+ expect(result.type).toBe('component.batch');
333
+ expect(result.data.results[0]).toMatchObject({
334
+ selector: '@test/meta@1.2.3/MetaAppShell',
335
+ status: 'found',
336
+ result: {type: 'component.detail'},
337
+ });
338
+ expect(result.data.results[1]).toMatchObject({
339
+ selector: '@test/meta@9.9.9/MetaAppShell',
340
+ status: 'not_found',
341
+ code: 'ERR_UNKNOWN_PACKAGE',
342
+ suggestions: [
343
+ {
344
+ name: 'astryx discover @test/meta@9.9.9',
345
+ reason: 'look up this package version',
346
+ },
347
+ ],
348
+ });
349
+ });
350
+
351
+ it('reports a package-qualified selector that conflicts with --package', async () => {
352
+ createFixture();
353
+ const result = await component(
354
+ ['@test/meta/MetaAppShell', 'Button'],
355
+ {cwd: tmpDir, package: CORE_PACKAGE},
356
+ );
357
+ expect(result.type).toBe('component.batch');
358
+ expect(result.data.results[0]).toMatchObject({
359
+ selector: '@test/meta/MetaAppShell',
360
+ status: 'error',
361
+ code: 'ERR_INVALID_ARGUMENT',
362
+ });
363
+ expect(result.data.results[1]).toMatchObject({
364
+ selector: 'Button',
365
+ status: 'found',
366
+ });
367
+ });
368
+
280
369
  it('JSON list includes integration components as {name, package} objects', async () => {
281
370
  createFixture();
282
371
  const result = await component(undefined, {cwd: tmpDir, list: true});
@@ -16,21 +16,34 @@ export const doc = {
16
16
  namespace: 'cli/commands',
17
17
  summary: 'List components or print component docs',
18
18
  description:
19
- 'Resolves a component by name across core and integration packages and prints ' +
20
- 'its authored doc, or lists the catalog grouped by category. Boolean flags narrow ' +
21
- 'a single component to just its props, source, showcase, or example blocks.',
19
+ 'Resolves one or several components by exact selector across core and integration ' +
20
+ 'packages and prints each authored doc, or lists the catalog grouped by category. ' +
21
+ "Use 'Button', 'widgets/Button', '@acme/widgets/Button', or " +
22
+ "'@acme/widgets@1.2.3/Button'. A version applies to the package and must match the " +
23
+ 'installed version. Boolean flags narrow every resolved component to just its props, ' +
24
+ 'source, showcase, or example blocks.',
22
25
  fn: 'component',
23
- args: [{name: 'name', param: 'name', required: false}],
26
+ args: [
27
+ {
28
+ name: 'names',
29
+ param: 'name',
30
+ description:
31
+ 'One or more exact selectors. Use Name, package/Name, @scope/package/Name, or @scope/package@version/Name. Two or more return one ordered batch. At most 100 selectors are accepted.',
32
+ required: false,
33
+ variadic: true,
34
+ },
35
+ ],
24
36
  options: [
25
37
  {
26
38
  flag: '--list',
27
39
  param: 'options.list',
28
- description: 'List all components grouped by category',
40
+ description: 'List every component (the same as giving no name)',
29
41
  },
30
42
  {
31
43
  flag: '--category <category>',
32
44
  param: 'options.category',
33
- description: 'List components in a specific category',
45
+ description:
46
+ 'List one component group, e.g. --category Layout or --category Avatar (an unknown group lists the valid ones)',
34
47
  },
35
48
  {
36
49
  flag: '--props',
@@ -55,21 +68,26 @@ export const doc = {
55
68
  {
56
69
  flag: '--package <name>',
57
70
  param: 'options.package',
58
- description: 'Scope lookup to an external package (e.g. @acme/xds-widgets)',
71
+ description:
72
+ 'Scope lookup to an external package (e.g. @acme/xds-widgets)',
59
73
  },
60
74
  ],
61
75
  examples: [
62
76
  {label: 'Browse the catalog', cli: 'astryx component --list'},
77
+ {
78
+ label: 'Look up several components',
79
+ cli: 'astryx component Button Badge Text',
80
+ },
63
81
  {
64
82
  label: 'Props table as JSON',
65
- cli: 'astryx component XDSButton --props --json',
83
+ cli: 'astryx component Button --props --json',
66
84
  },
67
85
  ],
68
86
  exitCodes: [
69
87
  {code: 0, when: 'success'},
70
88
  {
71
89
  code: 1,
72
- when: 'unknown component, category, or package, or @astryxdesign/core cannot be resolved',
90
+ when: 'unknown component, category, or package; more than 100 selectors; any batch row is unresolved; or @astryxdesign/core cannot be resolved',
73
91
  },
74
92
  ],
75
93
  related: ['search', 'hook', 'docs', 'template', 'swizzle'],
@@ -14,11 +14,13 @@ export const doc = {
14
14
  name: 'discover',
15
15
  displayName: 'astryx discover',
16
16
  namespace: 'cli/commands',
17
- summary: 'Discover external packages and components',
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: [
@@ -26,19 +28,61 @@ export const doc = {
26
28
  flag: '--components',
27
29
  param: 'options.components',
28
30
  description:
29
- 'In the package list, print every component 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.',
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).',
30
56
  },
31
57
  ],
32
58
  examples: [
33
- {label: 'List packages', cli: 'astryx discover --json'},
34
- {label: 'List every component of each package', cli: 'astryx discover --components'},
35
- {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
+ },
36
80
  ],
37
81
  exitCodes: [
38
82
  {code: 0, when: 'success'},
39
83
  {
40
84
  code: 1,
41
- when: 'unknown package or component, a malformed doc, or a blank query when packages are discovered',
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',
42
86
  },
43
87
  ],
44
88
  related: ['component', 'search', 'template'],