@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,34 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Shared published types for complete multi-selector lookup receipts.
5
+ * Adopting API subjects specialize these types with their single-result and
6
+ * ambiguity-candidate types instead of defining command-specific row shapes.
7
+ *
8
+ * @input One exact selector, its single-result response, and its candidate shape.
9
+ * @output BatchRow and BatchResponse for every AST-053 lookup adopter.
10
+ * @position packages/cli/foundation/response — shared JSON response types
11
+ */
12
+
13
+ /**
14
+ * One complete row for an accepted selector.
15
+ * @template TResult
16
+ * @template TCandidate
17
+ * @typedef {(
18
+ * | {selector: string; status: 'found'; result: TResult}
19
+ * | {selector: string; status: 'ambiguous'; code: string; error: string; candidates: TCandidate[]}
20
+ * | {selector: string; status: 'not_found' | 'error'; code: string; error: string; suggestions?: import('./base').Suggestion[]}
21
+ * )} BatchRow
22
+ */
23
+
24
+ /**
25
+ * One ordered batch receipt inside the shared `{type, data}` success envelope.
26
+ * @template {string} TType
27
+ * @template TResult
28
+ * @template TCandidate
29
+ * @typedef {object} BatchResponse
30
+ * @property {TType} type
31
+ * @property {{count: number; results: BatchRow<TResult, TCandidate>[]}} data
32
+ */
33
+
34
+ export {};
@@ -36,17 +36,16 @@ export const doc = {
36
36
  {
37
37
  value: 'ERR_INVALID_OPTION',
38
38
  description:
39
- 'An unknown flag/option was passed (Commander `unknownOption`).',
39
+ 'An unknown option was passed, --json was given to a command without JSON output, or layout --form got a value other than compact, outline, or auto.',
40
40
  },
41
41
  {
42
42
  value: 'ERR_INVALID_ARGUMENT',
43
43
  description:
44
- "An option/argument had a value Commander's parser rejected.",
44
+ 'An argument or option value is invalid: wrong type, out of range, an unknown choice, an extra argument, or a conflicting combination.',
45
45
  },
46
46
  {
47
47
  value: 'ERR_MISSING_ARGUMENT',
48
- description:
49
- 'A required positional argument was omitted (Commander `missingArgument`).',
48
+ description: 'A required argument or option value was omitted.',
50
49
  },
51
50
  {
52
51
  value: 'ERR_INVALID_LANG',
@@ -134,12 +133,11 @@ export const doc = {
134
133
  },
135
134
  {
136
135
  value: 'ERR_UNKNOWN_PACKAGE',
137
- description: 'No package matched the requested name (discover).',
136
+ description: 'No package matched the requested name.',
138
137
  },
139
138
  {
140
139
  value: 'ERR_UNKNOWN_AGENT',
141
- description:
142
- 'An unrecognized `--agent` value was passed to agent-docs/init.',
140
+ description: 'An unrecognized `--agent` value was passed to init.',
143
141
  },
144
142
  {
145
143
  value: 'ERR_UNKNOWN_FEATURE',
@@ -272,7 +270,7 @@ export const doc = {
272
270
  {
273
271
  value: 'ERR_UNCLASSIFIED_EXIT',
274
272
  description:
275
- 'Recorded in the debug log, never printed: a command exited non-zero without going through cliError/jsonError, so no stable code was available.',
273
+ 'Recorded in the debug log, never printed: a command exited non-zero without reporting an error code.',
276
274
  },
277
275
  {
278
276
  value: 'ERR_SIGNAL_TERMINATED',
@@ -195,9 +195,16 @@ describe('error codes: end-to-end JSON envelopes', () => {
195
195
  // is rejected at the preAction gate with a stable invalid-option code.
196
196
  {
197
197
  name: 'json not supported',
198
- args: ['theme', 'bogus-sub', '--json'],
198
+ args: ['theme', '--json'],
199
199
  code: 'ERR_INVALID_OPTION',
200
200
  },
201
+ // A group given a word it does not have names the unknown subcommand,
202
+ // in JSON as in text.
203
+ {
204
+ name: 'unknown subcommand of a group',
205
+ args: ['theme', 'bogus-sub', '--json'],
206
+ code: 'ERR_UNKNOWN_SUBCOMMAND',
207
+ },
201
208
  ];
202
209
 
203
210
  for (const {name, args, code} of cases) {
@@ -249,13 +256,31 @@ describe('error codes: human mode stays clean', () => {
249
256
  expect(stdout).not.toContain('ERR_UNKNOWN_COMPONENT');
250
257
  });
251
258
 
252
- it('unknown subcommand exits 1 in human mode (code carried internally)', async () => {
253
- // `theme` is not JSON-capable, so this path is human-only; we assert the
254
- // failure surfaces with exit 1 and a helpful message. The stable
255
- // ERR_UNKNOWN_SUBCOMMAND code rides along on the cliError call.
259
+ it('unknown subcommand exits 1, with the code in JSON and not in text', async () => {
260
+ // A group that is not JSON-capable itself still answers an unknown
261
+ // subcommand in JSON, so a JSON caller learns the subcommands it has.
256
262
  const {status, stderr} = await runCli(['theme', 'bogus-sub']);
257
263
  expect(status).toBe(1);
258
264
  expect(stderr).toContain("unknown subcommand 'theme bogus-sub'");
259
265
  expect(stderr).not.toContain('ERR_UNKNOWN_SUBCOMMAND');
266
+ for (const args of [
267
+ ['--json', 'theme', 'bogus-sub'],
268
+ ['theme', 'bogus-sub', '--json'],
269
+ ['--json', 'doctor', 'integration', 'bogus-sub'],
270
+ ]) {
271
+ const json = await runCli(args);
272
+ expect(json.status, args.join(' ')).toBe(1);
273
+ expect(JSON.parse(json.stdout), args.join(' ')).toMatchObject({
274
+ code: 'ERR_UNKNOWN_SUBCOMMAND',
275
+ suggestions: expect.arrayContaining([expect.objectContaining({reason: 'available subcommand'})]),
276
+ });
277
+ }
278
+ // Text and JSON agree for a group that shows help when run bare.
279
+ const text = await runCli(['doctor', 'integration', 'bogus-sub']);
280
+ expect(text.status).toBe(1);
281
+ expect(text.stderr).toContain("unknown subcommand 'doctor integration bogus-sub'");
282
+ const doctor = await runCli(['doctor', 'integrations']);
283
+ expect(doctor.status).toBe(1);
284
+ expect(doctor.stderr).toContain("unknown subcommand 'doctor integrations'");
260
285
  });
261
286
  });
@@ -3,10 +3,11 @@
3
3
 
4
4
  /**
5
5
  * @file EnumDoc for the `type` discriminant carried on every --json success
6
- * envelope. The vocabulary mirrors the RESPONSE_TYPES map (each command's
7
- * `jsonOut(...)` call sites) in `clients/cli/lib/manifest.mjs`; a consumer
8
- * switches on `type` to narrow the `data` payload. Descriptions follow the
9
- * currently published response projection, not a future package-version boundary.
6
+ * envelope. The vocabulary equals the manifest's response types (each
7
+ * command's FunctionDoc returns; see `clients/cli/lib/manifest.mjs`) plus
8
+ * ROOT_RESPONSE_TYPES (help, version) there; a consumer switches on `type` to
9
+ * narrow the `data` payload. Descriptions follow the currently published
10
+ * response projection, not a future package-version boundary.
10
11
  *
11
12
  * @input Public response discriminants and their currently released payloads.
12
13
  * @output Generated consumer reference for every typed JSON success response.
@@ -2,10 +2,11 @@
2
2
 
3
3
  /**
4
4
  * @file EnumDoc for the `type` discriminant carried on every --json success
5
- * envelope. The vocabulary mirrors the RESPONSE_TYPES map (each command's
6
- * `jsonOut(...)` call sites) in `clients/cli/lib/manifest.mjs`; a consumer
7
- * switches on `type` to narrow the `data` payload. Descriptions follow the
8
- * currently published response projection, not a future package-version boundary.
5
+ * envelope. The vocabulary equals the manifest's response types (each
6
+ * command's FunctionDoc returns; see `clients/cli/lib/manifest.mjs`) plus
7
+ * ROOT_RESPONSE_TYPES (help, version) there; a consumer switches on `type` to
8
+ * narrow the `data` payload. Descriptions follow the currently published
9
+ * response projection, not a future package-version boundary.
9
10
  *
10
11
  * @input Public response discriminants and their currently released payloads.
11
12
  * @output Generated consumer reference for every typed JSON success response.
@@ -35,7 +36,12 @@ export const doc = {
35
36
  {
36
37
  value: 'component.list',
37
38
  description:
38
- 'The component catalog grouped by category: `detail` (the level: names | compact | full) and `components`, the grouped map of names entries ({name, package, and optional canonical import for integrations}), brief entries, or a full ComponentDoc per entry.',
39
+ "The component catalog grouped by component group (each component's group field): `detail` (the level: names | compact | full) and `components`, the grouped map of names entries ({name, package, and optional canonical import for integrations}), brief entries, or a full ComponentDoc per entry.",
40
+ },
41
+ {
42
+ value: 'component.batch',
43
+ description:
44
+ 'The component specialization of the shared `BatchResponse` and `BatchRow` types. An explicit programmatic selector array, or two or more CLI selectors, returns one ordered receipt: `count` plus `results`, one row per selector including duplicates. Every row carries `selector` and `status` (found | not_found | ambiguous | error). A found row carries `result`, the same {type, data} response as one selector. An ambiguous row carries `code`, `error`, and `candidates` ({package, component, kind, installed}). Other failed rows carry `code`, `error`, and optional `suggestions` ({name, reason}).',
39
45
  },
40
46
  {
41
47
  value: 'component.detail',
@@ -104,21 +110,27 @@ export const doc = {
104
110
  {
105
111
  value: 'discover.list',
106
112
  description:
107
- 'The configured external packages (name, category, components, version, description); when empty it carries meta.configured to tell "nothing configured" from "nothing discovered".',
113
+ 'The integrations the project loads (name, category, components, version, a list per other kind they add, and latest when a source knows it); with a discover source, meta.available lists what the project could add and meta.sources reports each source; when empty it carries meta.configured to tell "nothing configured" from "nothing discovered".',
108
114
  },
109
115
  {
110
116
  value: 'discover.detail',
111
- description: 'A single external package entry, for an @scope/name query.',
117
+ description:
118
+ 'One package, for an @scope/name or @scope/name@version query: what the shown version adds, whether the project has it, and, when a source knows the package, its versions, latest release, and the command that adds it.',
112
119
  },
113
120
  {
114
121
  value: 'discover.detail.doc',
115
122
  description:
116
- 'The validated ComponentDoc for one external component: an @scope/name/Component query, or a free-text term resolving to exactly one component.',
123
+ 'The validated ComponentDoc for one installed component, for an @scope/name/Component query.',
124
+ },
125
+ {
126
+ value: 'discover.item',
127
+ description:
128
+ 'One item that is not an installed component, for an @scope/name/<item> query: its kind, name, package, version, and whether the project has the package.',
117
129
  },
118
130
  {
119
131
  value: 'discover.search',
120
132
  description:
121
- 'The echoed query plus the matching {package, component} pairs, when a free-text term matches several components.',
133
+ 'The echoed query plus every matching item and package across all packages, each with its kind and whether the project has it, even when only one matches; total is set when --limit cut the list.',
122
134
  },
123
135
 
124
136
  // search
@@ -149,7 +161,7 @@ export const doc = {
149
161
  {
150
162
  value: 'swizzle.copy',
151
163
  description:
152
- 'An eject receipt: component name, owning package, output directory, files-copied count, the written file names, whether any file uses StyleX, and an optional maintainer note.',
164
+ 'An eject receipt: component name, owning package, output directory, files-copied count, the written file names, whether any file uses StyleX, and, when the owner has an issues URL, feedback ({issuesUrl, ghCommand?}): where to report the gap that led to swizzling.',
153
165
  },
154
166
 
155
167
  // gap reports
@@ -172,7 +184,7 @@ export const doc = {
172
184
  {
173
185
  value: 'template.show',
174
186
  description:
175
- "The resolved template's raw source plus its description, kind, and the component names it composes.",
187
+ "The resolved template's source, exactly as a copy writes it, plus its description, kind, the component names it composes, and demoMediaReplaced (how many Astryx demo media references were replaced with placeholders for you to swap for your own media).",
176
188
  },
177
189
  {
178
190
  value: 'template.skeleton',
@@ -182,7 +194,7 @@ export const doc = {
182
194
  {
183
195
  value: 'template.copy',
184
196
  description:
185
- 'A scaffold receipt: template id, output directory, written file name, and file count.',
197
+ 'A scaffold receipt: template id, output directory, written file name, file count, and demoMediaReplaced (how many Astryx demo media references were replaced with placeholders for you to swap for your own media).',
186
198
  },
187
199
 
188
200
  {
@@ -251,6 +263,11 @@ export const doc = {
251
263
  description:
252
264
  'Every available codemod, oldest→newest, as {name, title, version, optional}; returned for --list without running anything.',
253
265
  },
266
+ {
267
+ value: 'upgrade.registry',
268
+ description:
269
+ 'The copied-composition receipt for --registry: applied, ok, the counts (found, current, wouldUpdate, updated, wouldMerge, merged, wouldRefreshReceipt, receiptsRefreshed, conflicts, missing, invalid, failed), and items.',
270
+ },
254
271
  {
255
272
  value: 'upgrade.status',
256
273
  description:
@@ -259,7 +276,7 @@ export const doc = {
259
276
  {
260
277
  value: 'upgrade.run',
261
278
  description:
262
- 'The run receipt: from/to versions, codemod count, integrations processed, the agent-docs summary, and (apply mode) filesChanged, transformsApplied, and per-codemod errors.',
279
+ 'The run receipt: from/to versions, codemod count, integrations processed, the agent-docs summary, sourcePathFound (false when the resolved source directory does not exist, so no source file was read), and (apply mode) filesChanged, transformsApplied, and per-codemod errors.',
263
280
  },
264
281
 
265
282
  // manifest
@@ -269,11 +286,24 @@ export const doc = {
269
286
  'The CLI capability manifest: name, version, apiVersion, description, globalOptions, commands (each name, description, arguments, options, json, aliases?, responseTypes?, examples?, exitCodes? as [{code, when}], subcommands?), jsonSupported, and the flat responseTypes index.',
270
287
  },
271
288
 
289
+ // help and version, which no single command owns
290
+ {
291
+ value: 'help',
292
+ description:
293
+ 'Help, in one of two shapes. A bare `astryx --json` returns the root manifest: name, version, commands (the command names), jsonSupported, and manifest (the full payload `astryx manifest --json` returns). ' +
294
+ "`--help --json` on any command, or `astryx help [command] --json`, returns that command's help: command, description, usage, options (each flags, description, and defaultValue and choices when set), and subcommands (each name and description). " +
295
+ 'data.manifest marks the first shape; data.usage marks the second.',
296
+ },
297
+ {
298
+ value: 'version',
299
+ description: 'The CLI version, for `astryx --version --json`: {version}.',
300
+ },
301
+
272
302
  // doctor
273
303
  {
274
304
  value: 'doctor',
275
305
  description:
276
- 'The health-check report: `checks` (each with id, label, status: pass | warn | fail | info, a message, and a fix when not passing) plus a `summary` of counts per status.',
306
+ 'The health-check report: `checks` (each with id, label, status: pass | warn | fail | info, a message, and an optional fix, always present on warn and fail) plus a `summary` of counts per status.',
277
307
  },
278
308
 
279
309
  // integration authoring
@@ -290,29 +320,29 @@ export const doc = {
290
320
  {
291
321
  value: 'integration.validate',
292
322
  description:
293
- 'The validation result: the package name and version (both null when no local manifest is found) plus issues, an AstryxIntegrationIssue[] of {code, severity: warning | error, message}.',
323
+ 'The validation result: validated (false when no integration manifest was found, so nothing was checked and the empty issues list proves nothing), the package name and version (both null when validated is false) plus issues, an AstryxIntegrationIssue[] of {code, severity: warning | error, message}.',
294
324
  },
295
325
  {
296
326
  value: 'integration.template-conflicts',
297
327
  description:
298
- 'The integration identity, structural issues, and non-blocking Core template-id conflicts as {id, severity: warning, integrationPackage, integrationType, integrationName, coreMatches, message, command}.',
328
+ 'validated (false when no integration manifest was found, so nothing was inspected), the integration identity, structural issues, and non-blocking Core template-id conflicts as {id, severity: warning, integrationPackage, integrationType, integrationName, coreMatches, message, command}.',
299
329
  },
300
330
  {
301
331
  value: 'integration.component-conflicts',
302
332
  description:
303
- 'The integration identity, structural issues, and non-blocking conflicts where an integration component name is also owned by Core; each conflict includes the exact package-qualified command.',
333
+ 'validated (false when no integration manifest was found, so nothing was inspected), the integration identity, structural issues, and non-blocking conflicts where an integration component name is also owned by Core; each conflict includes the exact package-qualified command.',
304
334
  },
305
335
  {
306
336
  value: 'integration.doc-conflicts',
307
337
  description:
308
- 'The integration identity, structural issues, and Core doc overlaps. Each finding includes `severity` (`info` | `error`) and `relationship` (`replaces` | `extends` | `accidental`).',
338
+ 'validated (false when no integration manifest was found, so nothing was inspected), the integration identity, structural issues, and Core doc overlaps. Each finding includes `severity` (`info` | `error`) and `relationship` (`replaces` | `extends` | `accidental`).',
309
339
  },
310
340
 
311
341
  // layout (XLE/XLO)
312
342
  {
313
343
  value: 'layout.expand',
314
344
  description:
315
- 'The expansion: parsed form, generated TSX code, componentsUsed, states (count of useState hooks scaffolded), todos, blocksReferenced (each {name, mode}), warnings, and written (the output path, or null when nothing was written).',
345
+ 'The expansion: parsed form, generated TSX code, componentsUsed, states (count of useState hooks scaffolded), todos, blocksReferenced (each {name, mode}), warnings, written (the output path, or null when nothing was written), and demoMediaReplaced (count of demo media placeholders).',
316
346
  },
317
347
  {
318
348
  value: 'layout.check',
@@ -53,6 +53,29 @@ function expectNamed(type, fields) {
53
53
  }
54
54
 
55
55
  describe('response-types EnumDoc names every field', () => {
56
+ it('component.batch names every row field and state', async () => {
57
+ const res = await data(['component', 'Button', 'Badge']);
58
+ expect(res.type).toBe('component.batch');
59
+ expect(describedAs('component.batch')).toMatch(/BatchResponse.*BatchRow/);
60
+ expectNamed('component.batch', [
61
+ 'count',
62
+ 'results',
63
+ 'selector',
64
+ 'status',
65
+ 'result',
66
+ 'code',
67
+ 'error',
68
+ 'candidates',
69
+ 'package',
70
+ 'component',
71
+ 'kind',
72
+ 'installed',
73
+ 'suggestions',
74
+ 'name',
75
+ 'reason',
76
+ ]);
77
+ });
78
+
56
79
  it('component.detail: the ownership fields and parentDoc', async () => {
57
80
  const res = await data(['component', 'HStack']);
58
81
  expect(res.type).toBe('component.detail');
@@ -39,16 +39,13 @@ export const doc = {
39
39
  name: 'type',
40
40
  type: 'string',
41
41
  description:
42
- 'Discriminator naming the payload shape. Each command guarantees ' +
43
- 'its own `type` at its return; there is no central union.',
42
+ 'Names the payload shape. Every value is listed in the response-types enum.',
44
43
  required: true,
45
44
  },
46
45
  {
47
46
  name: 'data',
48
47
  type: 'unknown',
49
- description:
50
- "The command's payload. Structural by design, narrowed by the " +
51
- 'per-command return type, not by a map in the serializer.',
48
+ description: "The command's payload; its shape depends on `type`.",
52
49
  required: true,
53
50
  },
54
51
  {
@@ -64,7 +61,7 @@ export const doc = {
64
61
  type: '{ apiVersion: number; error: string; code: ErrorCode; suggestions?: Suggestion[] }',
65
62
  description:
66
63
  'Emitted for every failure in --json mode, including uncaught throws ' +
67
- 'and Commander parse errors, which are converted to this shape.',
64
+ 'and command-line parse errors, which are converted to this shape.',
68
65
  fields: [
69
66
  {
70
67
  name: 'apiVersion',
@@ -121,7 +118,7 @@ export const doc = {
121
118
  label: 'Success',
122
119
  code: `{
123
120
  "apiVersion": 1,
124
- "type": "component",
121
+ "type": "component.detail",
125
122
  "data": { "name": "Button" }
126
123
  }`,
127
124
  },
@@ -153,9 +150,13 @@ export const doc = {
153
150
  {
154
151
  type: 'prose',
155
152
  text:
156
- 'The process exit code is part of the contract too: successful commands ' +
157
- 'exit 0, and a JSON error envelope is accompanied by a non-zero exit ' +
158
- '(jsonError exits 1).',
153
+ 'The process exit code is part of the contract too. Exit 0 means success, ' +
154
+ 'and every error envelope exits 1. Some commands also exit 1 with a success ' +
155
+ 'envelope when what they report failed: a failed check (layout check, doctor ' +
156
+ 'and its integration subcommands, integration verify, theme build ' +
157
+ '--check), a gap report that was not delivered, an upgrade left incomplete, ' +
158
+ 'or init agent docs refused for a path outside the project. Read the ' +
159
+ 'envelope, not the exit code, to tell them apart.',
159
160
  },
160
161
  ],
161
162
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/cli",
3
- "version": "0.6.4",
3
+ "version": "0.6.5-canary.00f1ed9",
4
4
  "displayName": "CLI",
5
5
  "description": "Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.",
6
6
  "author": "Meta Open Source",
@@ -101,10 +101,10 @@
101
101
  "zod": "^4.4.3"
102
102
  },
103
103
  "peerDependencies": {
104
- "@astryxdesign/charts": "*",
105
- "@astryxdesign/core": "*",
106
- "@astryxdesign/lab": "*",
107
- "@astryxdesign/theme-neutral": "*"
104
+ "@astryxdesign/charts": "0.6.5-canary.00f1ed9",
105
+ "@astryxdesign/core": "0.6.5-canary.00f1ed9",
106
+ "@astryxdesign/lab": "0.6.5-canary.00f1ed9",
107
+ "@astryxdesign/theme-neutral": "0.6.5-canary.00f1ed9"
108
108
  },
109
109
  "peerDependenciesMeta": {
110
110
  "@astryxdesign/charts": {
@@ -121,10 +121,10 @@
121
121
  }
122
122
  },
123
123
  "devDependencies": {
124
- "@astryxdesign/charts": "*",
125
- "@astryxdesign/core": "*",
126
- "@astryxdesign/lab": "*",
127
- "@astryxdesign/theme-neutral": "*",
124
+ "@astryxdesign/charts": "0.6.5-canary.00f1ed9",
125
+ "@astryxdesign/core": "0.6.5-canary.00f1ed9",
126
+ "@astryxdesign/lab": "0.6.5-canary.00f1ed9",
127
+ "@astryxdesign/theme-neutral": "0.6.5-canary.00f1ed9",
128
128
  "@heroicons/react": "^2.2.0",
129
129
  "@stylexjs/stylex": "^0.19.0",
130
130
  "@types/babel__core": "^7.20.5",
@@ -1,62 +0,0 @@
1
- // Copyright (c) Meta Platforms, Inc. and affiliates.
2
-
3
- import {describe, expect, it} from 'vitest';
4
- import {docs as integrationGuide} from './integrations.doc.mjs';
5
- import {doc as integrationSchema} from '../../../authoring/integration/integration.doc.mjs';
6
- import {doc as templateSchema} from '../../../authoring/doctypes/template/template.doc.mjs';
7
-
8
- function guideText() {
9
- return integrationGuide.sections
10
- .flatMap(section => section.content)
11
- .flatMap(block => {
12
- if (block.type === 'prose') return [block.text];
13
- if (block.type === 'code') return [block.label ?? '', block.code];
14
- if (block.type === 'list') return block.items;
15
- return [];
16
- })
17
- .join('\n');
18
- }
19
-
20
- describe('integration template replacement docs', () => {
21
- it('documents the complete author and consumer contract', () => {
22
- const text = guideText();
23
-
24
- for (const required of [
25
- "replaces: 'shell-side-nav'",
26
- 'acme-app-shell',
27
- 'astryx --json template --list --package @astryxdesign/core',
28
- 'astryx template shell-side-nav --package @astryxdesign/core',
29
- 'astryx template acme-app-shell --package @acme/navigation',
30
- 'templates/acme-app-shell.doc.mjs',
31
- 'AcmeSideNav',
32
- 'AcmeTopNav',
33
- '<Card>Product content</Card>',
34
- 'fail closed',
35
- 'configured later wins',
36
- 'wins over an autolinked one',
37
- 'listed later in package.json dependencies',
38
- 'valid siblings',
39
- 'Without `replaces`',
40
- '@astryxdesign/cli >=0.7.0',
41
- 'templates and doc topics are withheld',
42
- '`template.list` JSON response',
43
- ]) {
44
- expect(text, required).toContain(required);
45
- }
46
- });
47
-
48
- it('declares a replacement on the template, never in the manifest', () => {
49
- expect(guideText()).not.toContain('templateReplacements');
50
- expect(
51
- integrationSchema.fields.some(field => /replac/i.test(field.name)),
52
- ).toBe(false);
53
-
54
- const field = templateSchema.fields.find(
55
- candidate => candidate.name === 'replaces',
56
- );
57
- expect(field).toMatchObject({type: 'string'});
58
- expect(field.description).toContain('Integration templates only');
59
- expect(field.description).toContain('--package @astryxdesign/core');
60
- expect(field.description).toContain('0.7.0');
61
- });
62
- });