@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
@@ -1,18 +1,31 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file discover command — find external Astryx packages and components
4
+ * @file discover command — browse the integrations you have and could add
5
5
  *
6
6
  * Usage:
7
- * astryx discover List all packages
8
- * astryx discover @scope/name List components in a package
9
- * astryx discover @scope/name/Component Show docs for a component
10
- * astryx discover searchterm Search across all packages
7
+ * astryx discover List installed and available packages
8
+ * astryx discover @scope/name[@version] One package, with its versions
9
+ * astryx discover @scope/name/Component Show docs for an installed component
10
+ * astryx discover @scope/name/<item> One item a package adds
11
+ * astryx discover searchterm Search every item and package
11
12
  */
12
13
 
13
- import {formatFull, formatBrief, formatCompact} from '../lib/component-format.mjs';
14
+ import {
15
+ formatFull,
16
+ formatBrief,
17
+ formatCompact,
18
+ } from '../lib/component-format.mjs';
14
19
  import {jsonOut} from '../../../foundation/response/json.mjs';
15
- import {emit, section, text, record, records, list, code} from '../formatters/index.mjs';
20
+ import {
21
+ emit,
22
+ section,
23
+ text,
24
+ record,
25
+ records,
26
+ list,
27
+ code,
28
+ } from '../formatters/index.mjs';
16
29
  import {cliError} from '../lib/cli-error.mjs';
17
30
  import {discover as discoverApi} from '../../../api/discover/discover.mjs';
18
31
  import {Project} from '../../../foundation/config/project.mjs';
@@ -23,25 +36,70 @@ import {resultSet} from '../../../foundation/debug/index.mjs';
23
36
  import {doc as discoverCommand} from './discover.doc.mjs';
24
37
  import {doc as discoverFn} from '../../../api/discover/discover.doc.mjs';
25
38
 
26
- // Max components to list inline per package before summarizing with "+N more".
27
- const MAX_COMPONENTS_SHOWN = 10;
39
+ // Max items to list inline per package before summarizing with "+N more".
40
+ const MAX_ITEMS_SHOWN = 10;
41
+
42
+ /** @type {Record<string, string>} */
43
+ const KIND_PLURALS = {
44
+ component: 'components',
45
+ template: 'templates',
46
+ doc: 'docs',
47
+ theme: 'themes',
48
+ codemod: 'codemods',
49
+ 'agent-doc': 'agent docs',
50
+ };
51
+
52
+ // The list fields that hold item names, summarized in the package list.
53
+ const ITEM_FIELDS = [
54
+ 'components',
55
+ 'templates',
56
+ 'docs',
57
+ 'themes',
58
+ 'codemods',
59
+ 'agentDocs',
60
+ ];
28
61
 
29
62
  /**
30
- * What the run answered with. `discover` browses the integration packages a
31
- * project has configured, so the top two views count PACKAGES; naming a
32
- * component inside one answers with that component instead.
33
- *
34
- * @param {import('../../../api/discover/discover.type.mjs').DiscoverListResponse
63
+ * @typedef {import('../../../api/discover/discover.type.mjs').DiscoverListResponse
35
64
  * | import('../../../api/discover/discover.type.mjs').DiscoverDetailResponse
36
65
  * | import('../../../api/discover/discover.type.mjs').DiscoverDetailDocResponse
37
- * | import('../../../api/discover/discover.type.mjs').DiscoverSearchResponse} result
66
+ * | import('../../../api/discover/discover.type.mjs').DiscoverItemResponse
67
+ * | import('../../../api/discover/discover.type.mjs').DiscoverSearchResponse} DiscoverResult
68
+ */
69
+
70
+ /** @type {Record<string, import('../../../foundation/debug/command-result.mjs').ResultSetKind>} */
71
+ const RESULT_KINDS = {
72
+ package: 'integration',
73
+ component: 'component',
74
+ template: 'template',
75
+ doc: 'doc',
76
+ theme: 'theme',
77
+ codemod: 'migration',
78
+ 'agent-doc': 'doc',
79
+ };
80
+
81
+ /**
82
+ * The run-log kind for a set of item kinds: the one kind, or `mixed`.
83
+ * @param {string[]} kinds
84
+ * @returns {import('../../../foundation/debug/command-result.mjs').ResultSetKind}
85
+ */
86
+ function resultKindOf(kinds) {
87
+ const mapped = new Set(kinds.map(kind => RESULT_KINDS[kind] ?? 'mixed'));
88
+ return mapped.size === 1 ? [...mapped][0] : 'mixed';
89
+ }
90
+
91
+ /**
92
+ * What the run answered with. The list and package views count PACKAGES;
93
+ * naming a component or item answers with that item instead.
94
+ *
95
+ * @param {DiscoverResult} result
38
96
  * @returns {import('../../../foundation/debug/command-result.mjs').CommandResult}
39
97
  */
40
98
  function summarize(result) {
41
99
  switch (result.type) {
42
100
  case 'discover.list':
43
101
  return resultSet({
44
- count: result.data.length,
102
+ count: result.data.length + (result.meta?.available?.length ?? 0),
45
103
  resultKind: 'integration',
46
104
  });
47
105
  case 'discover.detail':
@@ -52,14 +110,96 @@ function summarize(result) {
52
110
  });
53
111
  case 'discover.detail.doc':
54
112
  return resultSet({count: 1, resultKind: 'component', directMatch: true});
113
+ case 'discover.item':
114
+ return resultSet({
115
+ count: 1,
116
+ resultKind: resultKindOf([result.data.kind]),
117
+ directMatch: true,
118
+ });
55
119
  case 'discover.search':
56
120
  return resultSet({
57
- count: result.data.matches.length,
58
- resultKind: 'component',
121
+ count: result.data.total ?? result.data.matches.length,
122
+ resultKind: resultKindOf(result.data.matches.map(m => m.kind)),
59
123
  });
60
124
  }
61
125
  }
62
126
 
127
+ /**
128
+ * Record options that summarize each item list to its first names.
129
+ * @param {boolean} full print every name instead
130
+ * @returns {import('../formatters/index.mjs').RecordOptions}
131
+ */
132
+ function itemListOptions(full) {
133
+ if (full) return {};
134
+ /** @param {string[]} names */
135
+ const summary = names => {
136
+ const shown = names.slice(0, MAX_ITEMS_SHOWN);
137
+ const remaining = names.length - MAX_ITEMS_SHOWN;
138
+ return remaining > 0
139
+ ? `${shown.join(', ')}, +${remaining} more`
140
+ : shown.join(', ');
141
+ };
142
+ return {
143
+ format: Object.fromEntries(ITEM_FIELDS.map(field => [field, summary])),
144
+ };
145
+ }
146
+
147
+ /**
148
+ * One line per source that did not answer live.
149
+ * @param {import('../../../api/discover/discover.type.mjs').DiscoverSourceState[]} sources
150
+ */
151
+ function sourceNotes(sources) {
152
+ return sources
153
+ .filter(s => s.status !== 'fresh')
154
+ .map(s =>
155
+ s.status === 'saved'
156
+ ? text(
157
+ `The discover source from ${s.from} did not answer (${s.error}), so this uses the copy saved ${s.savedAt}.`,
158
+ )
159
+ : text(`The discover source from ${s.from} is unavailable: ${s.error}`),
160
+ );
161
+ }
162
+
163
+ /**
164
+ * @param {import('../../../api/discover/discover.type.mjs').DiscoverSourceState[]} sources
165
+ */
166
+ function sourceSubtitle(sources) {
167
+ const answered = sources.filter(s => s.status !== 'failed');
168
+ if (answered.length === 0) return undefined;
169
+ return (
170
+ 'from ' +
171
+ answered
172
+ .map(
173
+ s =>
174
+ `${s.name}${s.generatedAt ? ` (${s.generatedAt.slice(0, 10)})` : ''}`,
175
+ )
176
+ .join(', ')
177
+ );
178
+ }
179
+
180
+ /**
181
+ * @param {import('../../../authoring/discover/type').DiscoverVersion[]} versions
182
+ * @param {{shown?: string, installed?: string, latest?: string}} marks
183
+ */
184
+ function versionLines(versions, marks) {
185
+ return versions
186
+ .filter(v => !v.prerelease || v.version === marks.shown)
187
+ .map(v => {
188
+ const tags = [
189
+ v.version === marks.latest ? 'latest' : '',
190
+ v.version === marks.installed ? 'installed' : '',
191
+ v.version === marks.shown &&
192
+ v.version !== marks.installed &&
193
+ v.version !== marks.latest
194
+ ? 'shown'
195
+ : '',
196
+ v.status !== 'ok' ? v.status : '',
197
+ ].filter(Boolean);
198
+ const date = v.publishedAt ? v.publishedAt.slice(0, 10) : 'date unknown';
199
+ return `${v.version} ${date}${tags.length ? ` ${tags.join(', ')}` : ''}`;
200
+ });
201
+ }
202
+
63
203
  /**
64
204
  * @param {import('commander').Command} program
65
205
  */
@@ -69,120 +209,255 @@ export function registerDiscover(program) {
69
209
  action:
70
210
  /**
71
211
  * @param {string | undefined} query
72
- * @param {{components?: boolean}} options
212
+ * @param {{components?: boolean, type?: string, installed?: boolean, available?: boolean, limit?: string}} options
73
213
  */
74
214
  async (query, options) => {
75
- const detail = program.opts().detail || 'full';
76
- const json = program.opts().json || false;
77
- const lang = program.opts().lang || null;
78
- const zh = program.opts().zh || false;
79
- const run = getCliInvocation();
80
-
81
- // Non-blocking nudge: if any configured integration has validation
82
- // issues, print one compact line to stderr pointing at
83
- // doctor integration validate. Best-effort; suppressed in --json mode.
84
- try {
85
- const project = await Project.load(process.cwd());
86
- await warnOnIntegrationIssues(project, {json});
87
- } catch {
88
- // Never let the nudge break the command.
89
- }
90
-
91
- let result;
92
- try {
93
- result = await discoverApi(query, {components: options.components, lang, zh});
94
- } catch (e) {
95
- const err = /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
96
- return cliError(err.message, {suggestions: err.suggestions, code: err.code});
97
- }
98
-
99
- const answered = summarize(result);
100
- if (json) {
101
- // Forward optional meta (e.g. configured flag for discover.list) as a
102
- // sibling of data via jsonOut, so the envelope still carries
103
- // apiVersion and goes through the single sanctioned emit path.
104
- jsonOut(result);
105
- return answered;
106
- }
215
+ const detail = program.opts().detail || 'full';
216
+ const json = program.opts().json || false;
217
+ const lang = program.opts().lang || null;
218
+ const zh = program.opts().zh || false;
219
+ const run = getCliInvocation();
220
+
221
+ // Non-blocking nudge: if any configured integration has validation
222
+ // issues, print one compact line to stderr pointing at
223
+ // doctor integration validate. Best-effort; suppressed in --json mode.
224
+ try {
225
+ const project = await Project.load(process.cwd());
226
+ await warnOnIntegrationIssues(project, {json});
227
+ } catch {
228
+ // Never let the nudge break the command.
229
+ }
230
+
231
+ /** @type {DiscoverResult} */
232
+ let result;
233
+ try {
234
+ result = await discoverApi(query, {
235
+ components: options.components,
236
+ lang,
237
+ zh,
238
+ type: /** @type {any} */ (options.type),
239
+ installed: options.installed,
240
+ available: options.available,
241
+ // Number(), not parseInt(): the API refuses `1.5` and `5abc` itself.
242
+ limit: options.limit != null ? Number(options.limit) : undefined,
243
+ });
244
+ } catch (e) {
245
+ const err =
246
+ /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
247
+ return cliError(err.message, {
248
+ suggestions: err.suggestions,
249
+ code: err.code,
250
+ });
251
+ }
252
+
253
+ const answered = summarize(result);
254
+ if (json) {
255
+ // Forward optional meta (e.g. configured flag for discover.list) as a
256
+ // sibling of data via jsonOut, so the envelope still carries
257
+ // apiVersion and goes through the single sanctioned emit path.
258
+ jsonOut(result);
259
+ return answered;
260
+ }
261
+
262
+ switch (result.type) {
263
+ case 'discover.list': {
264
+ const listOpts = itemListOptions(Boolean(options.components));
265
+ const available = result.meta?.available;
266
+ const sources = result.meta?.sources ?? [];
107
267
 
108
- switch (result.type) {
109
- case 'discover.list': {
110
- if (result.data.length === 0) {
111
- if (result.meta && result.meta.configured === false) {
268
+ // No discover source: the list of what this project has, as always.
269
+ if (available === undefined) {
270
+ if (result.data.length === 0) {
271
+ if (result.meta && result.meta.configured === false) {
272
+ emit(
273
+ text('No integrations configured.'),
274
+ text('Add integration package names to astryx.config.mjs:'),
275
+ code(
276
+ "export default {\n integrations: ['@scope/your-integration'],\n};",
277
+ ),
278
+ );
279
+ } else {
280
+ emit(
281
+ text(
282
+ 'No external components found in configured integrations.',
283
+ ),
284
+ );
285
+ }
286
+ break;
287
+ }
112
288
  emit(
113
- text('No integrations configured.'),
114
- text('Add integration package names to astryx.config.mjs:'),
115
- code(
116
- "export default {\n integrations: ['@scope/your-integration'],\n};",
289
+ records(result.data, listOpts),
290
+ text(
291
+ [
292
+ 'Usage:',
293
+ ` ${run} discover <package> Browse a package`,
294
+ ` ${run} discover <package>/Component View component docs`,
295
+ ` ${run} discover <search> Search all packages`,
296
+ ].join('\n'),
117
297
  ),
118
298
  );
119
- } else {
120
- emit(text('No external components found in configured integrations.'));
299
+ break;
121
300
  }
301
+
302
+ const kind = options.type
303
+ ? (KIND_PLURALS[options.type] ?? options.type)
304
+ : null;
305
+ /** @type {import('../formatters/index.mjs').Block[]} */
306
+ const blocks = [];
307
+ if (!options.available) {
308
+ blocks.push(section('Installed'));
309
+ blocks.push(
310
+ result.data.length > 0
311
+ ? records(result.data, listOpts)
312
+ : text(
313
+ kind
314
+ ? `None of this project's integrations add ${kind}.`
315
+ : 'None yet.',
316
+ ),
317
+ );
318
+ }
319
+ if (!options.installed) {
320
+ blocks.push(section('Available', sourceSubtitle(sources)));
321
+ blocks.push(
322
+ available.length > 0
323
+ ? records(available, listOpts)
324
+ : text(
325
+ !sources.some(s => s.status !== 'failed')
326
+ ? 'No source answered, so there is nothing to list.'
327
+ : kind
328
+ ? `No package you could add adds ${kind}.`
329
+ : 'Nothing new to add: this project has every integration its sources list.',
330
+ ),
331
+ );
332
+ }
333
+ blocks.push(...sourceNotes(sources));
334
+ blocks.push(
335
+ text(
336
+ [
337
+ 'Usage:',
338
+ ` ${run} discover <package> Browse a package and its versions`,
339
+ ` ${run} discover <package>/<item> View one item`,
340
+ ` ${run} discover <search> Search every item and package`,
341
+ ].join('\n'),
342
+ ),
343
+ );
344
+ emit(...blocks);
122
345
  break;
123
346
  }
124
347
 
125
- // One record per package, every field of the JSON entry. The default
126
- // view summarizes each package's components (first N + "+N more");
127
- // --components lists them all (record comma-joins the full array).
128
- /** @type {import('../formatters/index.mjs').RecordOptions} */
129
- const listOpts = {};
130
- if (!options.components) {
131
- listOpts.format = {
132
- components: (/** @type {string[]} */ comps) => {
133
- const shown = comps.slice(0, MAX_COMPONENTS_SHOWN);
134
- const remaining = comps.length - MAX_COMPONENTS_SHOWN;
135
- return remaining > 0
136
- ? `${shown.join(', ')}, +${remaining} more`
137
- : shown.join(', ');
138
- },
139
- };
348
+ case 'discover.detail': {
349
+ const d = result.data;
350
+ /** @type {import('../formatters/index.mjs').Block[]} */
351
+ const blocks = [record(d, {omit: ['versions', 'install']})];
352
+ if (d.versions) {
353
+ const shown = d.version;
354
+ const lines = versionLines(d.versions, {
355
+ shown,
356
+ installed: d.installed
357
+ ? (d.installedVersion ?? d.version)
358
+ : undefined,
359
+ latest: d.latest,
360
+ });
361
+ const prereleases = d.versions.filter(v => v.prerelease).length;
362
+ blocks.push(
363
+ section(
364
+ 'Versions',
365
+ `${d.versions.length} published, newest first`,
366
+ ),
367
+ );
368
+ if (lines.length > 0) blocks.push(list(lines));
369
+ if (prereleases > 0) {
370
+ blocks.push(
371
+ text(
372
+ `${prereleases === 1 ? '1 prerelease is' : `${prereleases} prereleases are`} not listed. See any version: ${run} discover ${d.name}@<version>`,
373
+ ),
374
+ );
375
+ }
376
+ }
377
+ if (d.install) {
378
+ blocks.push(
379
+ section('Add it'),
380
+ code(d.install),
381
+ text(
382
+ 'Astryx loads an integration on the next command once it is a dependency.',
383
+ ),
384
+ );
385
+ } else if (d.installedAs) {
386
+ blocks.push(
387
+ text(
388
+ `This project already has this integration as ${d.installedAs}.`,
389
+ ),
390
+ );
391
+ }
392
+ blocks.push(
393
+ text(
394
+ d.installed
395
+ ? `Usage: ${run} discover ${d.name}/<ComponentName>`
396
+ : `See one item: ${run} discover ${d.name}/<item>`,
397
+ ),
398
+ );
399
+ emit(...blocks);
400
+ break;
140
401
  }
141
- emit(
142
- records(result.data, listOpts),
143
- text(
144
- [
145
- 'Usage:',
146
- ` ${run} discover <package> Browse a package`,
147
- ` ${run} discover <package>/Component View component docs`,
148
- ` ${run} discover <search> Search all packages`,
149
- ].join('\n'),
150
- ),
151
- );
152
- break;
153
- }
154
402
 
155
- case 'discover.detail': {
156
- const d = result.data;
157
- emit(
158
- record(d),
159
- text(`Usage: ${run} discover ${d.name}/<ComponentName>`),
160
- );
161
- break;
162
- }
403
+ case 'discover.detail.doc': {
404
+ const docs = result.data;
405
+ const md =
406
+ detail === 'brief'
407
+ ? formatBrief(docs, docs.name, '')
408
+ : detail === 'compact'
409
+ ? formatCompact(docs, docs.name, '')
410
+ : formatFull(docs);
411
+ emit(code(md));
412
+ break;
413
+ }
163
414
 
164
- case 'discover.detail.doc': {
165
- const docs = result.data;
166
- const md =
167
- detail === 'brief'
168
- ? formatBrief(docs, docs.name, '')
169
- : detail === 'compact'
170
- ? formatCompact(docs, docs.name, '')
171
- : formatFull(docs);
172
- emit(code(md));
173
- break;
174
- }
415
+ case 'discover.item': {
416
+ const d = result.data;
417
+ emit(
418
+ record(d, {omit: ['install']}),
419
+ ...(d.install
420
+ ? [
421
+ section('Add it'),
422
+ code(d.install),
423
+ text(
424
+ 'Astryx loads an integration on the next command once it is a dependency.',
425
+ ),
426
+ ]
427
+ : []),
428
+ text(`Its package: ${run} discover ${d.package}`),
429
+ );
430
+ break;
431
+ }
175
432
 
176
- case 'discover.search': {
177
- const {query: q, matches} = result.data;
178
- emit(
179
- section(`Found ${matches.length} matches for "${q}"`),
180
- list(matches.map(m => `${run} discover ${m.package}/${m.component}`)),
181
- );
182
- break;
433
+ case 'discover.search': {
434
+ const {query: q, matches, total} = result.data;
435
+ const count = total ?? matches.length;
436
+ emit(
437
+ section(
438
+ `Found ${count} ${count === 1 ? 'match' : 'matches'} for "${q}"`,
439
+ total != null
440
+ ? `showing the first ${matches.length}`
441
+ : undefined,
442
+ ),
443
+ list(
444
+ matches.map(m => {
445
+ const target =
446
+ m.kind === 'package'
447
+ ? m.package
448
+ : `${m.package}/${m.component}`;
449
+ const tags = [
450
+ m.kind && m.kind !== 'component' ? m.kind : '',
451
+ m.installed === false ? 'not installed' : '',
452
+ ].filter(Boolean);
453
+ return `${run} discover ${target}${tags.length ? ` (${tags.join(', ')})` : ''}`;
454
+ }),
455
+ ),
456
+ );
457
+ break;
458
+ }
183
459
  }
184
- }
185
- return answered;
186
- },
460
+ return answered;
461
+ },
187
462
  });
188
463
  }