@astryxdesign/cli 0.6.3 → 0.6.4-canary.078fd25

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 (728) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +152 -107
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +22 -10
  7. package/api/build/build.test.mjs +219 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +208 -53
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +31 -12
  18. package/api/component/_adapter.mjs +79 -15
  19. package/api/component/component.d.mts +6 -3
  20. package/api/component/component.doc.mjs +49 -19
  21. package/api/component/component.mjs +339 -22
  22. package/api/component/component.test.mjs +38 -0
  23. package/api/component/component.type.d.mts +47 -11
  24. package/api/component/component.type.mjs +76 -24
  25. package/api/component/detail/blocks/blocks.d.mts +2 -1
  26. package/api/component/detail/blocks/blocks.mjs +4 -3
  27. package/api/component/list/list.d.mts +0 -5
  28. package/api/component/list/list.mjs +40 -11
  29. package/api/discover/_adapter.d.mts +114 -6
  30. package/api/discover/_adapter.mjs +372 -17
  31. package/api/discover/_adapter.test.mjs +215 -0
  32. package/api/discover/_catalog-view.d.mts +115 -0
  33. package/api/discover/_catalog-view.mjs +203 -0
  34. package/api/discover/_catalog-view.test.mjs +128 -0
  35. package/api/discover/detail/detail.d.mts +18 -6
  36. package/api/discover/detail/detail.mjs +67 -13
  37. package/api/discover/detail/detail.test.mjs +85 -0
  38. package/api/discover/detail/item/item.d.mts +26 -0
  39. package/api/discover/detail/item/item.mjs +78 -0
  40. package/api/discover/detail/item/item.test.mjs +73 -0
  41. package/api/discover/discover.d.mts +3 -9
  42. package/api/discover/discover.doc.mjs +62 -18
  43. package/api/discover/discover.mjs +220 -36
  44. package/api/discover/discover.test.mjs +11 -2
  45. package/api/discover/discover.type.d.mts +150 -11
  46. package/api/discover/discover.type.mjs +107 -17
  47. package/api/discover/list/list.d.mts +20 -6
  48. package/api/discover/list/list.mjs +45 -12
  49. package/api/discover/list/list.test.mjs +46 -0
  50. package/api/discover/search/search.d.mts +18 -16
  51. package/api/discover/search/search.mjs +102 -56
  52. package/api/discover/search/search.test.mjs +144 -10
  53. package/api/docs/_adapter.d.mts +277 -41
  54. package/api/docs/_adapter.mjs +993 -108
  55. package/api/docs/compiled-topics.test.mjs +78 -0
  56. package/api/docs/detail/detail.mjs +22 -63
  57. package/api/docs/detail/section/section.d.mts +1 -1
  58. package/api/docs/detail/section/section.mjs +54 -19
  59. package/api/docs/detail/section/section.test.mjs +50 -0
  60. package/api/docs/docOverlays.test.mjs +27 -1
  61. package/api/docs/docs.d.mts +10 -3
  62. package/api/docs/docs.doc.mjs +55 -16
  63. package/api/docs/docs.mjs +53 -10
  64. package/api/docs/docs.type.d.mts +221 -5
  65. package/api/docs/docs.type.mjs +153 -11
  66. package/api/docs/index/index.d.mts +18 -0
  67. package/api/docs/index/index.mjs +40 -0
  68. package/api/docs/index/index.test.mjs +62 -0
  69. package/api/docs/list/list.mjs +28 -12
  70. package/api/docs/node/node.d.mts +43 -0
  71. package/api/docs/node/node.mjs +192 -0
  72. package/api/docs/reference-blocks.test.mjs +406 -0
  73. package/api/doctor/doctor.d.mts +104 -1
  74. package/api/doctor/doctor.doc.mjs +18 -8
  75. package/api/doctor/doctor.mjs +635 -7
  76. package/api/doctor/doctor.test.mjs +732 -11
  77. package/api/doctor/doctor.type.d.mts +1 -1
  78. package/api/doctor/doctor.type.mjs +1 -1
  79. package/api/gap-report/gap-report.doc.mjs +27 -14
  80. package/api/hook/_adapter.mjs +19 -5
  81. package/api/hook/hook.doc.mjs +7 -3
  82. package/api/hook/hook.type.d.mts +3 -3
  83. package/api/hook/hook.type.mjs +11 -11
  84. package/api/hook/list/list.d.mts +2 -2
  85. package/api/hook/list/list.mjs +69 -17
  86. package/api/index.d.mts +2 -1
  87. package/api/index.mjs +6 -3
  88. package/api/init/init.doc.mjs +22 -12
  89. package/api/init/init.test.mjs +41 -1
  90. package/api/init/remove/remove.mjs +1 -1
  91. package/api/init/run/run.mjs +20 -10
  92. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  93. package/api/integration/add-contribution.d.mts +2 -1
  94. package/api/integration/add-contribution.mjs +130 -15
  95. package/api/integration/add-contribution.test.mjs +258 -7
  96. package/api/integration/add-helpers.d.mts +5 -2
  97. package/api/integration/add-helpers.mjs +36 -9
  98. package/api/integration/add-theme.mjs +56 -65
  99. package/api/integration/add-theme.test.mjs +139 -21
  100. package/api/integration/authoring-checks.mjs +138 -28
  101. package/api/integration/authoring-checks.test.mjs +179 -7
  102. package/api/integration/authoring-checks.type.mjs +6 -1
  103. package/api/integration/integration-authoring.type.d.mts +3 -1
  104. package/api/integration/integration-authoring.type.mjs +2 -0
  105. package/api/integration/integration-block-exports.test.mjs +10 -6
  106. package/api/integration/integrationAdd.doc.mjs +14 -4
  107. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  108. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  109. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  110. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  111. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  112. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  113. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  114. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  115. package/api/integration/integrationPackCheck.doc.mjs +5 -4
  116. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  117. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  118. package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
  119. package/api/integration/pack-check.mjs +160 -11
  120. package/api/integration/pack-check.test.mjs +477 -47
  121. package/api/integration/pack-check.type.d.mts +26 -2
  122. package/api/integration/pack-check.type.mjs +15 -2
  123. package/api/integration/summarizeIssues.doc.mjs +1 -0
  124. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  125. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  126. package/api/integration/validate-integration.mjs +52 -102
  127. package/api/integration/validate-integration.test.mjs +179 -26
  128. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  129. package/api/integration/validateIntegration.doc.mjs +3 -2
  130. package/api/json/assertResponse.doc.mjs +2 -1
  131. package/api/json/envelope-types.test.mjs +76 -0
  132. package/api/json/index.ts +2 -0
  133. package/api/json/isError.doc.mjs +2 -1
  134. package/api/json/parseResponse.doc.mjs +3 -2
  135. package/api/layout/_adapter.mjs +20 -5
  136. package/api/layout/expand/expand.mjs +7 -5
  137. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  138. package/api/layout/grammar/grammar.mjs +2 -1
  139. package/api/layout/layoutCheck.doc.mjs +1 -0
  140. package/api/layout/layoutExpand.doc.mjs +2 -1
  141. package/api/layout/layoutGrammar.doc.mjs +1 -0
  142. package/api/search/search-return-type.test.mjs +54 -0
  143. package/api/search/search.d.mts +89 -12
  144. package/api/search/search.doc.mjs +8 -2
  145. package/api/search/search.mjs +697 -97
  146. package/api/search/search.type.d.mts +15 -3
  147. package/api/search/search.type.mjs +5 -2
  148. package/api/swizzle/copy/copy.mjs +28 -11
  149. package/api/swizzle/swizzle.doc.mjs +8 -5
  150. package/api/swizzle/swizzle.type.d.mts +2 -2
  151. package/api/swizzle/swizzle.type.mjs +2 -2
  152. package/api/template/copy/copy.mjs +18 -24
  153. package/api/template/copy/copy.test.mjs +26 -0
  154. package/api/template/list/list.mjs +1 -0
  155. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  156. package/api/template/template-integration.test.mjs +1072 -3
  157. package/api/template/template-suffix.test.mjs +41 -21
  158. package/api/template/template.d.mts +1 -1
  159. package/api/template/template.doc.mjs +32 -9
  160. package/api/template/template.mjs +45 -8
  161. package/api/template/template.type.d.mts +12 -14
  162. package/api/template/template.type.mjs +15 -14
  163. package/api/theme/_adapter.d.mts +2 -3
  164. package/api/theme/_adapter.mjs +4 -5
  165. package/api/theme/add/add.binary.test.mjs +84 -0
  166. package/api/theme/add/add.mjs +31 -22
  167. package/api/theme/add/add.rollback.test.mjs +158 -0
  168. package/api/theme/add/add.staging.test.mjs +83 -0
  169. package/api/theme/add/add.test.mjs +14 -1
  170. package/api/theme/build/build.family.test.mjs +7 -12
  171. package/api/theme/build/build.mjs +140 -59
  172. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  173. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  174. package/api/theme/build/build.rollback.test.mjs +148 -0
  175. package/api/theme/build/build.test.mjs +127 -0
  176. package/api/theme/build/font-warning.mjs +3 -3
  177. package/api/theme/build/font-warning.test.mjs +5 -2
  178. package/api/theme/generateTonalPalette.doc.mjs +2 -2
  179. package/api/theme/integration-themes.test.mjs +39 -28
  180. package/api/theme/list/list.test.mjs +19 -20
  181. package/api/theme/listThemes.doc.mjs +6 -5
  182. package/api/theme/palette/generate/generate.mjs +8 -3
  183. package/api/theme/palette/generate/generate.test.mjs +96 -0
  184. package/api/theme/palette/generate/generator.d.mts +10 -13
  185. package/api/theme/palette/generate/generator.mjs +15 -4
  186. package/api/theme/palette/generate/generator.test.mjs +10 -0
  187. package/api/theme/template/template.mjs +11 -2
  188. package/api/theme/template/template.test.mjs +20 -0
  189. package/api/theme/theme.type.d.mts +170 -11
  190. package/api/theme/theme.type.mjs +94 -27
  191. package/api/theme/themeAdd.doc.mjs +12 -12
  192. package/api/theme/themeBuild.doc.mjs +21 -17
  193. package/api/theme/themeList.doc.mjs +6 -3
  194. package/api/theme/themeListAvailable.doc.mjs +6 -3
  195. package/api/theme/themePaletteGenerate.doc.mjs +16 -8
  196. package/api/theme/themeTargets.doc.mjs +4 -2
  197. package/api/theme/themeTemplate.doc.mjs +8 -3
  198. package/api/upgrade/_adapter.d.mts +32 -5
  199. package/api/upgrade/_adapter.mjs +139 -22
  200. package/api/upgrade/list/list.mjs +2 -1
  201. package/api/upgrade/list/list.test.mjs +73 -0
  202. package/api/upgrade/project-context.test.mjs +272 -0
  203. package/api/upgrade/provider-agreement.test.mjs +152 -0
  204. package/api/upgrade/run/files-changed.test.mjs +111 -0
  205. package/api/upgrade/run/run.mjs +358 -59
  206. package/api/upgrade/status/status.mjs +2 -2
  207. package/api/upgrade/upgrade.doc.mjs +32 -23
  208. package/api/upgrade/upgrade.type.d.mts +43 -5
  209. package/api/upgrade/upgrade.type.mjs +29 -13
  210. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  211. package/assets/codemods/__tests__/runner.test.mjs +332 -8
  212. package/assets/codemods/file-count.test.mjs +163 -0
  213. package/assets/codemods/integration-discovery.mjs +48 -4
  214. package/assets/codemods/integration-discovery.test.mjs +73 -0
  215. package/assets/codemods/integration-runner.mjs +59 -7
  216. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  217. package/assets/codemods/registry.mjs +1 -0
  218. package/assets/codemods/run-codemod.mjs +177 -34
  219. package/assets/codemods/runner.mjs +353 -104
  220. package/assets/codemods/term-log.mjs +32 -8
  221. package/assets/codemods/term-log.test.mjs +19 -1
  222. package/assets/codemods/transform-prop.mjs +109 -0
  223. package/assets/codemods/transform-prop.test.mjs +95 -0
  224. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  225. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  226. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  227. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  228. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  229. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  230. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  231. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  232. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  233. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  234. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  235. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  236. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  237. package/assets/docs/README.md +12 -1
  238. package/assets/docs/authoring.doc.mjs +14 -0
  239. package/assets/docs/browser-support.doc.mjs +11 -11
  240. package/assets/docs/color.doc.mjs +8 -2
  241. package/assets/docs/elevation.doc.mjs +6 -4
  242. package/assets/docs/getting-started.doc.mjs +6 -17
  243. package/assets/docs/icons.doc.mjs +2 -21
  244. package/assets/docs/illustrations.doc.mjs +7 -15
  245. package/assets/docs/internationalization.doc.mjs +7 -5
  246. package/assets/docs/layout.doc.dense.mjs +132 -84
  247. package/assets/docs/layout.doc.mjs +134 -78
  248. package/assets/docs/migration.doc.mjs +19 -21
  249. package/assets/docs/motion.doc.mjs +16 -3
  250. package/assets/docs/principles.doc.dense.mjs +5 -5
  251. package/assets/docs/principles.doc.mjs +14 -6
  252. package/assets/docs/principles.doc.zh.mjs +6 -6
  253. package/assets/docs/shape.doc.mjs +8 -3
  254. package/assets/docs/spacing.doc.mjs +7 -2
  255. package/assets/docs/styling-libraries.doc.mjs +10 -6
  256. package/assets/docs/styling.doc.mjs +22 -26
  257. package/assets/docs/theme.doc.dense.mjs +58 -18
  258. package/assets/docs/theme.doc.mjs +60 -50
  259. package/assets/docs/theme.doc.zh.mjs +9 -8
  260. package/assets/docs/tokens.doc.dense.mjs +2 -2
  261. package/assets/docs/tokens.doc.mjs +390 -9
  262. package/assets/docs/tokens.doc.zh.mjs +2 -2
  263. package/assets/docs/tree/add-a-component.doc.mjs +75 -0
  264. package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
  265. package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
  266. package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
  267. package/assets/docs/tree/api.doc.mjs +30 -0
  268. package/assets/docs/tree/block-template.doc.mjs +130 -0
  269. package/assets/docs/tree/build-the-template.doc.mjs +28 -0
  270. package/assets/docs/tree/building-blocks.doc.mjs +46 -0
  271. package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
  272. package/assets/docs/tree/checks.doc.mjs +119 -0
  273. package/assets/docs/tree/cli.doc.mjs +23 -0
  274. package/assets/docs/tree/codemods.doc.mjs +147 -0
  275. package/assets/docs/tree/commands.doc.mjs +25 -0
  276. package/assets/docs/tree/component-family.doc.mjs +113 -0
  277. package/assets/docs/tree/component-imports.doc.mjs +69 -0
  278. package/assets/docs/tree/component-lookups.doc.mjs +149 -0
  279. package/assets/docs/tree/components.doc.mjs +23 -0
  280. package/assets/docs/tree/configuration.doc.mjs +23 -0
  281. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
  282. package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
  283. package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
  284. package/assets/docs/tree/docs.doc.mjs +21 -0
  285. package/assets/docs/tree/document-the-template.doc.mjs +28 -0
  286. package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
  287. package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
  288. package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
  289. package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
  290. package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
  291. package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
  292. package/assets/docs/tree/help.doc.mjs +16 -0
  293. package/assets/docs/tree/integrations.doc.mjs +40 -0
  294. package/assets/docs/tree/links.doc.mjs +98 -0
  295. package/assets/docs/tree/package-and-test.doc.mjs +32 -0
  296. package/assets/docs/tree/page-template.doc.mjs +71 -0
  297. package/assets/docs/tree/publishing.doc.mjs +111 -0
  298. package/assets/docs/tree/quick-start.doc.mjs +272 -0
  299. package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
  300. package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
  301. package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
  302. package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
  303. package/assets/docs/tree/ship.doc.mjs +16 -0
  304. package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
  305. package/assets/docs/tree/single-component.doc.mjs +165 -0
  306. package/assets/docs/tree/start-a-template.doc.mjs +143 -0
  307. package/assets/docs/tree/subcomponent.doc.mjs +115 -0
  308. package/assets/docs/tree/template-assets.doc.mjs +64 -0
  309. package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
  310. package/assets/docs/tree/template-fonts.doc.mjs +102 -0
  311. package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
  312. package/assets/docs/tree/template-icons.doc.mjs +97 -0
  313. package/assets/docs/tree/template-images-media.doc.mjs +127 -0
  314. package/assets/docs/tree/template-styles.doc.mjs +93 -0
  315. package/assets/docs/tree/templates.doc.mjs +34 -0
  316. package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
  317. package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
  318. package/assets/docs/tree/themes.doc.mjs +39 -0
  319. package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
  320. package/assets/docs/tree/upgrading.doc.mjs +103 -0
  321. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
  322. package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
  323. package/assets/docs/tree/versioning.doc.mjs +161 -0
  324. package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
  325. package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
  326. package/assets/docs/typography.doc.mjs +24 -4
  327. package/assets/docs/working-with-ai.doc.mjs +34 -26
  328. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  329. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  330. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  331. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  332. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  333. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  334. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  335. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  336. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  337. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  338. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  339. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  340. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  341. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  342. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  343. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  344. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  345. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  346. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  347. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  348. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  349. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  350. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  351. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  352. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  353. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  354. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  355. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  356. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  357. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  358. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  359. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  360. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  361. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  362. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  363. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  364. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  365. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  366. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  367. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  368. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  369. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  370. package/authoring/_shared/contract.ts +22 -0
  371. package/authoring/codemod/codemod.doc.mjs +7 -2
  372. package/authoring/codemod/parse.d.mts +8 -8
  373. package/authoring/codemod/parse.mjs +8 -6
  374. package/authoring/codemod/type.ts +12 -0
  375. package/authoring/config/config.doc.mjs +11 -3
  376. package/authoring/config/debug-composition.test.mjs +92 -0
  377. package/authoring/config/parse.d.mts +15 -13
  378. package/authoring/config/parse.mjs +27 -8
  379. package/authoring/config/parse.test.mjs +8 -0
  380. package/authoring/config/type.ts +29 -6
  381. package/authoring/debug/debug.doc.d.mts +11 -0
  382. package/authoring/debug/debug.doc.mjs +182 -0
  383. package/authoring/debug/parse.d.mts +8 -8
  384. package/authoring/debug/parse.mjs +3 -3
  385. package/authoring/discover/discover.doc.d.mts +13 -0
  386. package/authoring/discover/discover.doc.mjs +138 -0
  387. package/authoring/discover/parse.d.mts +24 -0
  388. package/authoring/discover/parse.mjs +128 -0
  389. package/authoring/discover/parse.test.mjs +124 -0
  390. package/authoring/discover/type.ts +87 -0
  391. package/authoring/doctypes/_schema.d.mts +792 -24
  392. package/authoring/doctypes/_schema.mjs +549 -39
  393. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  394. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  395. package/authoring/doctypes/base/type.ts +43 -0
  396. package/authoring/doctypes/command/command.doc.mjs +4 -3
  397. package/authoring/doctypes/command/parse.d.mts +2 -2
  398. package/authoring/doctypes/command/parse.mjs +1 -1
  399. package/authoring/doctypes/command/type.ts +5 -4
  400. package/authoring/doctypes/component/component.doc.mjs +12 -3
  401. package/authoring/doctypes/component/parse.d.mts +2 -2
  402. package/authoring/doctypes/component/parse.mjs +1 -1
  403. package/authoring/doctypes/component/type.ts +14 -5
  404. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  405. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  406. package/authoring/doctypes/enum/parse.d.mts +2 -2
  407. package/authoring/doctypes/enum/parse.mjs +1 -1
  408. package/authoring/doctypes/enum/type.ts +4 -2
  409. package/authoring/doctypes/function/function.doc.mjs +7 -2
  410. package/authoring/doctypes/function/parse.d.mts +2 -2
  411. package/authoring/doctypes/function/parse.mjs +1 -1
  412. package/authoring/doctypes/function/type.ts +9 -4
  413. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  414. package/authoring/doctypes/hook/parse.d.mts +2 -2
  415. package/authoring/doctypes/hook/parse.mjs +1 -1
  416. package/authoring/doctypes/hook/type.ts +5 -4
  417. package/authoring/doctypes/legacy.d.mts +8 -6
  418. package/authoring/doctypes/legacy.mjs +5 -4
  419. package/authoring/doctypes/load-contract.test.mjs +233 -0
  420. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  421. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  422. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  423. package/authoring/doctypes/namespace/parse.mjs +25 -0
  424. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  425. package/authoring/doctypes/namespace/type.ts +74 -0
  426. package/authoring/doctypes/parse.d.mts +22 -18
  427. package/authoring/doctypes/parse.mjs +22 -11
  428. package/authoring/doctypes/parse.test.mjs +77 -3
  429. package/authoring/doctypes/reference/parse.d.mts +2 -2
  430. package/authoring/doctypes/reference/parse.mjs +8 -5
  431. package/authoring/doctypes/reference/reference.doc.mjs +55 -6
  432. package/authoring/doctypes/reference/type.ts +75 -7
  433. package/authoring/doctypes/schema/parse.d.mts +2 -2
  434. package/authoring/doctypes/schema/parse.mjs +1 -1
  435. package/authoring/doctypes/schema/schema.doc.mjs +2 -2
  436. package/authoring/doctypes/schema/type.ts +4 -4
  437. package/authoring/doctypes/template/parse.d.mts +94 -1
  438. package/authoring/doctypes/template/parse.mjs +40 -2
  439. package/authoring/doctypes/template/parse.test.mjs +26 -2
  440. package/authoring/doctypes/template/template.doc.mjs +13 -3
  441. package/authoring/doctypes/template/type.ts +13 -2
  442. package/authoring/doctypes/theme/parse.d.mts +35 -0
  443. package/authoring/doctypes/theme/parse.mjs +76 -0
  444. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  445. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  446. package/authoring/doctypes/theme/type.ts +42 -0
  447. package/authoring/doctypes/types.ts +12 -10
  448. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  449. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  450. package/authoring/gap-report/parse.d.mts +10 -10
  451. package/authoring/gap-report/parse.mjs +6 -6
  452. package/authoring/gap-report/type.ts +1 -1
  453. package/authoring/identity/identity.doc.d.mts +9 -0
  454. package/authoring/identity/identity.doc.mjs +61 -0
  455. package/authoring/identity/type.ts +132 -0
  456. package/authoring/index.d.mts +3 -0
  457. package/authoring/index.d.ts +62 -17
  458. package/authoring/index.mjs +4 -1
  459. package/authoring/integration/integration.doc.mjs +22 -13
  460. package/authoring/integration/parse.d.mts +2 -2
  461. package/authoring/integration/parse.mjs +1 -1
  462. package/authoring/integration/parse.test.mjs +10 -1
  463. package/authoring/integration/schema.d.mts +6 -4
  464. package/authoring/integration/schema.mjs +9 -3
  465. package/authoring/integration/type.ts +19 -8
  466. package/authoring/shadcn/receipt.d.mts +6 -6
  467. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  468. package/clients/cli/command-load-failure.test.mjs +83 -0
  469. package/clients/cli/commands/blog.doc.mjs +1 -1
  470. package/clients/cli/commands/blog.mjs +23 -8
  471. package/clients/cli/commands/blog.test.mjs +42 -1
  472. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  473. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  474. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  475. package/clients/cli/commands/build-theme.mjs +16 -50
  476. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  477. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  478. package/clients/cli/commands/build.doc.mjs +16 -8
  479. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  480. package/clients/cli/commands/build.mjs +137 -114
  481. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  482. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  483. package/clients/cli/commands/component/index.mjs +153 -61
  484. package/clients/cli/commands/component-batch.test.mjs +341 -0
  485. package/clients/cli/commands/component-ownership.test.mjs +92 -3
  486. package/clients/cli/commands/component-package.test.mjs +46 -0
  487. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  488. package/clients/cli/commands/component.doc.mjs +28 -10
  489. package/clients/cli/commands/component.test.mjs +19 -0
  490. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  491. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  492. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  493. package/clients/cli/commands/discover.doc.mjs +55 -9
  494. package/clients/cli/commands/discover.mjs +393 -118
  495. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  496. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  497. package/clients/cli/commands/docs.doc.mjs +28 -6
  498. package/clients/cli/commands/docs.mjs +295 -38
  499. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  500. package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
  501. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  502. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  503. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  504. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  505. package/clients/cli/commands/doctor-integration.test.mjs +143 -8
  506. package/clients/cli/commands/doctor.doc.mjs +4 -2
  507. package/clients/cli/commands/doctor.mjs +108 -37
  508. package/clients/cli/commands/doctor.test.mjs +42 -0
  509. package/clients/cli/commands/gap-report.doc.mjs +27 -15
  510. package/clients/cli/commands/gap-report.test.mjs +72 -0
  511. package/clients/cli/commands/hook/index.mjs +7 -17
  512. package/clients/cli/commands/hook.doc.mjs +1 -1
  513. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  514. package/clients/cli/commands/init.doc.mjs +24 -10
  515. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  516. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  517. package/clients/cli/commands/integration-add.doc.mjs +39 -13
  518. package/clients/cli/commands/integration-authoring.test.mjs +74 -19
  519. package/clients/cli/commands/integration-pack.doc.mjs +6 -10
  520. package/clients/cli/commands/integration-real-world.test.mjs +4 -10
  521. package/clients/cli/commands/integration-verify.doc.mjs +22 -0
  522. package/clients/cli/commands/integration.doc.mjs +5 -5
  523. package/clients/cli/commands/integration.mjs +75 -43
  524. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  525. package/clients/cli/commands/json-contract.test.mjs +33 -0
  526. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  527. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  528. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  529. package/clients/cli/commands/layout.doc.mjs +3 -3
  530. package/clients/cli/commands/layout.mjs +21 -9
  531. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  532. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  533. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  534. package/clients/cli/commands/manifest.doc.mjs +2 -2
  535. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  536. package/clients/cli/commands/search.doc.mjs +16 -6
  537. package/clients/cli/commands/search.mjs +49 -11
  538. package/clients/cli/commands/search.test.mjs +92 -0
  539. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  540. package/clients/cli/commands/swizzle.doc.mjs +4 -3
  541. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  542. package/clients/cli/commands/template.doc.mjs +53 -14
  543. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  544. package/clients/cli/commands/template.mjs +4 -91
  545. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  546. package/clients/cli/commands/text-json-parity.test.mjs +725 -0
  547. package/clients/cli/commands/theme-add.doc.mjs +5 -4
  548. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  549. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  550. package/clients/cli/commands/theme-palette-generate.doc.mjs +12 -7
  551. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  552. package/clients/cli/commands/theme-palette.doc.mjs +2 -3
  553. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  554. package/clients/cli/commands/theme-targets.doc.mjs +3 -3
  555. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  556. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  557. package/clients/cli/commands/theme.doc.mjs +3 -2
  558. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  559. package/clients/cli/commands/upgrade.doc.mjs +83 -12
  560. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  561. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  562. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  563. package/clients/cli/commands/upgrade.mjs +29 -7
  564. package/clients/cli/formatters/index.mjs +164 -1
  565. package/clients/cli/formatters/index.test.mjs +97 -0
  566. package/clients/cli/index.mjs +47 -34
  567. package/clients/cli/latest-version-env.test.mjs +50 -0
  568. package/clients/cli/lib/cli-error.test.mjs +7 -0
  569. package/clients/cli/lib/component-format.mjs +9 -9
  570. package/clients/cli/lib/component-format.test.mjs +1 -1
  571. package/clients/cli/lib/define-command.mjs +56 -6
  572. package/clients/cli/lib/define-command.test.mjs +54 -0
  573. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  574. package/clients/cli/lib/exit-codes.test.mjs +113 -0
  575. package/clients/cli/lib/hook-format.mjs +19 -10
  576. package/clients/cli/lib/json-shim.mjs +62 -16
  577. package/clients/cli/lib/json-shim.test.mjs +83 -0
  578. package/clients/cli/lib/manifest.d.ts +2 -0
  579. package/clients/cli/lib/manifest.mjs +53 -6
  580. package/clients/cli/lib/manifest.test.mjs +22 -2
  581. package/clients/cli/lib/parse-error-format.test.mjs +81 -0
  582. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  583. package/foundation/agent-docs/agent-docs.mjs +83 -13
  584. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  585. package/foundation/config/integration-debug.test.mjs +28 -3
  586. package/foundation/config/project-themes.test.mjs +11 -19
  587. package/foundation/config/project.d.mts +20 -11
  588. package/foundation/config/project.mjs +263 -91
  589. package/foundation/config/project.test.mjs +270 -21
  590. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  591. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  592. package/foundation/discovery/authoring-self-docs.test.mjs +174 -0
  593. package/foundation/discovery/authoring-surface.d.mts +74 -0
  594. package/foundation/discovery/authoring-surface.mjs +525 -0
  595. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  596. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  597. package/foundation/discovery/cli-self-docs.mjs +504 -0
  598. package/foundation/discovery/cli-self-docs.test.mjs +395 -0
  599. package/foundation/discovery/component-discovery.d.mts +39 -1
  600. package/foundation/discovery/component-discovery.mjs +50 -1
  601. package/foundation/discovery/component-loader.d.mts +35 -38
  602. package/foundation/discovery/component-loader.mjs +53 -222
  603. package/foundation/discovery/docs-discovery.d.mts +119 -11
  604. package/foundation/discovery/docs-discovery.mjs +427 -108
  605. package/foundation/discovery/docs-discovery.test.mjs +386 -20
  606. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  607. package/foundation/discovery/docs-output-budget.mjs +50 -0
  608. package/foundation/discovery/docs-section-key.d.mts +116 -0
  609. package/foundation/discovery/docs-section-key.mjs +322 -0
  610. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  611. package/foundation/discovery/template-adapter.d.mts +113 -11
  612. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  613. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  614. package/foundation/discovery/template-adapter.mjs +774 -83
  615. package/foundation/discovery/template-adapter.test.mjs +57 -0
  616. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  617. package/foundation/discovery/template-conflict-release.mjs +40 -0
  618. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  619. package/foundation/discovery/theme-discovery.d.mts +67 -7
  620. package/foundation/discovery/theme-discovery.mjs +916 -186
  621. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  622. package/foundation/discovery/theming-targets.test.mjs +4 -0
  623. package/foundation/doc-compiler/bundle.d.mts +47 -0
  624. package/foundation/doc-compiler/bundle.mjs +278 -0
  625. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  626. package/foundation/doc-compiler/compile.d.mts +343 -0
  627. package/foundation/doc-compiler/compile.mjs +558 -0
  628. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  629. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  630. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  631. package/foundation/doc-compiler/doc-loads.test.mjs +1643 -0
  632. package/foundation/doc-compiler/import.d.mts +24 -0
  633. package/foundation/doc-compiler/import.mjs +59 -0
  634. package/foundation/doc-compiler/inputs.d.mts +102 -0
  635. package/foundation/doc-compiler/inputs.mjs +291 -0
  636. package/foundation/doc-compiler/inputs.test.mjs +298 -0
  637. package/foundation/doc-compiler/ir.d.mts +22 -0
  638. package/foundation/doc-compiler/ir.mjs +471 -0
  639. package/foundation/doc-compiler/lenses.d.mts +36 -0
  640. package/foundation/doc-compiler/lenses.mjs +173 -0
  641. package/foundation/doc-compiler/links.d.mts +162 -0
  642. package/foundation/doc-compiler/links.mjs +294 -0
  643. package/foundation/doc-compiler/links.test.mjs +192 -0
  644. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  645. package/foundation/doc-compiler/overlays.d.mts +37 -0
  646. package/foundation/doc-compiler/overlays.mjs +206 -0
  647. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  648. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  649. package/foundation/doc-compiler/read.d.mts +127 -0
  650. package/foundation/doc-compiler/read.mjs +325 -0
  651. package/foundation/doc-compiler/read.test.mjs +313 -0
  652. package/foundation/doc-compiler/source.d.mts +33 -0
  653. package/foundation/doc-compiler/source.mjs +128 -0
  654. package/foundation/doc-compiler/tree.d.mts +292 -0
  655. package/foundation/doc-compiler/tree.mjs +881 -0
  656. package/foundation/fs/file-protection.d.mts +33 -0
  657. package/foundation/fs/file-protection.mjs +825 -0
  658. package/foundation/fs/file-protection.test.mjs +250 -0
  659. package/foundation/fs/module-loader.d.mts +1 -0
  660. package/foundation/fs/module-loader.mjs +50 -1
  661. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  662. package/foundation/fs/path-safety.d.mts +3 -2
  663. package/foundation/fs/path-safety.mjs +49 -19
  664. package/foundation/fs/path-safety.test.mjs +50 -0
  665. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  666. package/foundation/identity/provider-identity.d.mts +90 -0
  667. package/foundation/identity/provider-identity.mjs +320 -0
  668. package/foundation/identity/provider-identity.test.mjs +254 -0
  669. package/foundation/identity/providers.d.mts +7 -0
  670. package/foundation/identity/providers.mjs +16 -0
  671. package/foundation/integrations/autolink.d.mts +58 -1
  672. package/foundation/integrations/autolink.mjs +143 -45
  673. package/foundation/integrations/autolink.test.mjs +1 -1
  674. package/foundation/integrations/cli-requirement.d.mts +65 -0
  675. package/foundation/integrations/cli-requirement.mjs +189 -0
  676. package/foundation/integrations/cli-requirement.test.mjs +89 -0
  677. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  678. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  679. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  680. package/foundation/integrations/contribution-inventory.mjs +28 -25
  681. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  682. package/foundation/integrations/integration-warnings.d.mts +9 -2
  683. package/foundation/integrations/integration-warnings.mjs +52 -21
  684. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  685. package/foundation/integrations/integrations.d.mts +63 -3
  686. package/foundation/integrations/integrations.mjs +122 -9
  687. package/foundation/integrations/integrations.test.mjs +415 -1
  688. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  689. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  690. package/foundation/integrations/provider-resolution.d.mts +152 -0
  691. package/foundation/integrations/provider-resolution.mjs +576 -0
  692. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  693. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  694. package/foundation/integrations/theme-descriptor.mjs +44 -0
  695. package/foundation/integrations/validate-contributions.d.mts +2 -0
  696. package/foundation/integrations/validate-contributions.mjs +131 -29
  697. package/foundation/response/base.d.ts +8 -4
  698. package/foundation/response/batch.type.d.mts +33 -0
  699. package/foundation/response/batch.type.mjs +34 -0
  700. package/foundation/response/error-codes.d.mts +3 -1
  701. package/foundation/response/error-codes.d.ts +2 -0
  702. package/foundation/response/error-codes.doc.mjs +19 -12
  703. package/foundation/response/error-codes.mjs +8 -2
  704. package/foundation/response/error-codes.test.mjs +166 -14
  705. package/foundation/response/json-contract.test.mjs +57 -17
  706. package/foundation/response/json.d.mts +4 -2
  707. package/foundation/response/json.mjs +8 -10
  708. package/foundation/response/response-types.doc.d.mts +7 -2
  709. package/foundation/response/response-types.doc.mjs +69 -25
  710. package/foundation/response/response-types.doc.test.mjs +181 -0
  711. package/foundation/response/response.doc.mjs +12 -11
  712. package/foundation/text/string-utils.d.mts +8 -0
  713. package/foundation/text/string-utils.mjs +40 -10
  714. package/foundation/xle/expand.d.mts +2 -0
  715. package/foundation/xle/expand.mjs +4 -3
  716. package/foundation/xle/expand.test.mjs +54 -0
  717. package/foundation/xle/xle.test.mjs +13 -0
  718. package/package.json +10 -11
  719. package/api/docs/docs.test.mjs +0 -83
  720. package/api/docs/integrationDocs.test.mjs +0 -208
  721. package/api/search/search.test.mjs +0 -389
  722. package/assets/docs/cli-integrations.doc.mjs +0 -367
  723. package/assets/templates/themes/manifest.json +0 -95
  724. package/clients/cli/commands/docs.test.mjs +0 -102
  725. package/clients/cli/lib/update-check.mjs +0 -83
  726. package/clients/cli/lib/update-check.test.mjs +0 -137
  727. package/clients/cli/update-hint-commands.test.mjs +0 -54
  728. package/foundation/agent-docs/agent-docs.test.mjs +0 -1141
@@ -11,7 +11,8 @@
11
11
  * which fields to show and in what order.
12
12
  *
13
13
  * Constraints (deliberately narrow):
14
- * - Plain ASCII only. No color, no TTY detection, no width wrapping. Output is
14
+ * - Plain ASCII only. No color and no TTY detection. Long lines wrap at a
15
+ * fixed {@link WRAP_WIDTH}, never at the terminal's width, so output is
15
16
  * byte-for-byte deterministic whether printed or piped to an agent.
16
17
  * - Renderers return an opaque {@link Block}; `emit` accepts ONLY Blocks, so a
17
18
  * stray string can't leak onto stdout (the compiler rejects `emit('x')`).
@@ -33,6 +34,50 @@ export const BULLET = '-';
33
34
  export const ERR = '!!';
34
35
  export const WARN = '!';
35
36
 
37
+ /** The column long human-output lines wrap at. */
38
+ export const WRAP_WIDTH = 120;
39
+
40
+ /** The widest first column an inline record pads to; a longer value overhangs. */
41
+ const INLINE_LEAD_MAX = 32;
42
+
43
+ /**
44
+ * Characters a terminal draws two columns wide: CJK ideographs and
45
+ * punctuation, kana, hangul, and fullwidth forms. A line may break between
46
+ * any two of them.
47
+ */
48
+ const WIDE_CHAR =
49
+ /[\u1100-\u115f\u2e80-\u303e\u3041-\u33ff\u3400-\u4dbf\u4e00-\u9fff\ua000-\ua4cf\uac00-\ud7a3\uf900-\ufaff\ufe30-\ufe4f\uff00-\uff60\uffe0-\uffe6]/u;
50
+
51
+ /**
52
+ * How many terminal columns a string takes.
53
+ * @param {string} s
54
+ * @returns {number}
55
+ */
56
+ export function displayWidth(s) {
57
+ let width = 0;
58
+ for (const ch of String(s)) width += WIDE_CHAR.test(ch) ? 2 : 1;
59
+ return width;
60
+ }
61
+
62
+ /**
63
+ * Cut a line to `width` columns, ending it with `...` when anything was cut.
64
+ * @param {string} line
65
+ * @param {number} width
66
+ * @returns {string}
67
+ */
68
+ function truncateToWidth(line, width) {
69
+ if (displayWidth(line) <= width) return line;
70
+ let out = '';
71
+ let used = 0;
72
+ for (const ch of line) {
73
+ const w = WIDE_CHAR.test(ch) ? 2 : 1;
74
+ if (used + w > width - 3) break;
75
+ out += ch;
76
+ used += w;
77
+ }
78
+ return `${out.trimEnd()}...`;
79
+ }
80
+
36
81
  /**
37
82
  * An opaque, renderer-produced block of output. Nominal via a private field:
38
83
  * nothing outside this file can construct one, so `emit` can trust that whatever
@@ -67,6 +112,13 @@ export class Block {
67
112
  * @property {Record<string, string>} [labels] - Rename a key for display.
68
113
  * @property {Record<string, (value: any) => string>} [format] - Transform a
69
114
  * value before rendering (e.g. prefix a command with the package manager).
115
+ * @property {'stacked' | 'inline'} [layout] - `stacked` (the default): one
116
+ * `key: value` line per field, a blank line between records. `inline`: one
117
+ * record per line, the first field in a padded column and the rest joined by
118
+ * ` - `, for a list a reader scans.
119
+ * @property {'wrap' | 'truncate'} [overflow] - What an inline record longer
120
+ * than {@link WRAP_WIDTH} does: `wrap` (the default) continues under the
121
+ * first column; `truncate` cuts it to one line.
70
122
  */
71
123
 
72
124
  /** @param {unknown} v @returns {boolean} */
@@ -100,9 +152,77 @@ function toAscii(s) {
100
152
  .replace(/[\u2018\u2019]/g, "'")
101
153
  .replace(/[\u201C\u201D]/g, '"')
102
154
  .replace(/\u2026/g, '...')
155
+ .replace(/\u2192/g, '->')
156
+ .replace(/\u2190/g, '<-')
103
157
  .replace(/\u00a0/g, ' ');
104
158
  }
105
159
 
160
+ /**
161
+ * Word-wrap text at `width`, keeping its own line breaks. A word longer than
162
+ * the width stays whole on a line of its own. Continuation lines start with
163
+ * `indent`.
164
+ * @param {string} input
165
+ * @param {{width?: number, indent?: string}} [options]
166
+ * @returns {string}
167
+ */
168
+ export function wrapText(input, {width = WRAP_WIDTH, indent = ''} = {}) {
169
+ return String(input)
170
+ .split('\n')
171
+ .map(line => wrapLine(line, width, indent))
172
+ .join('\n');
173
+ }
174
+
175
+ /**
176
+ * @param {string} line
177
+ * @param {number} width
178
+ * @param {string} indent
179
+ * @returns {string}
180
+ */
181
+ function wrapLine(line, width, indent) {
182
+ if (displayWidth(line) <= width) return line;
183
+ const lead = /^\s*/.exec(line)?.[0] ?? '';
184
+ // Tokens a line may break between: words, and each wide character on its
185
+ // own, since CJK text has no spaces to break at. `gap` is what joined a
186
+ // token to the one before it.
187
+ /** @type {{text: string, gap: string}[]} */
188
+ const tokens = [];
189
+ let gap = '';
190
+ let word = '';
191
+ const flush = () => {
192
+ if (word === '') return;
193
+ tokens.push({text: word, gap});
194
+ gap = '';
195
+ word = '';
196
+ };
197
+ for (const ch of line.slice(lead.length)) {
198
+ if (ch === ' ') {
199
+ flush();
200
+ gap = ' ';
201
+ } else if (WIDE_CHAR.test(ch)) {
202
+ flush();
203
+ tokens.push({text: ch, gap});
204
+ gap = '';
205
+ } else {
206
+ word += ch;
207
+ }
208
+ }
209
+ flush();
210
+ /** @type {string[]} */
211
+ const out = [];
212
+ let current = lead;
213
+ tokens.forEach(({text: token, gap: before}, i) => {
214
+ const joined = i === 0 ? current + token : current + before + token;
215
+ if (i > 0 && displayWidth(joined) > width && current.trim() !== '') {
216
+ out.push(current);
217
+ current = indent + token;
218
+ } else {
219
+ current = joined;
220
+ }
221
+ });
222
+ out.push(current);
223
+ return out.join('\n');
224
+ }
225
+
106
226
  /**
107
227
  * A group label, optionally with an explanatory subtitle rendered on the line(s)
108
228
  * directly beneath the heading (no blank line between). Whatever list/records
@@ -177,10 +297,53 @@ export function record(obj, options = {}) {
177
297
  * @returns {Block}
178
298
  */
179
299
  export function records(items, options = {}) {
300
+ if (options.layout === 'inline') return inlineRecords(items, options);
180
301
  const blocks = items.map(o => record(o, options).toString()).filter(Boolean);
181
302
  return new Block(blocks.join('\n\n'));
182
303
  }
183
304
 
305
+ /**
306
+ * @param {any[]} items
307
+ * @param {RecordOptions} options
308
+ * @returns {Block}
309
+ */
310
+ function inlineRecords(items, options) {
311
+ const [lead, ...rest] = (options.fields ?? Object.keys(items[0] ?? {})).filter(
312
+ k => !options.omit?.includes(k),
313
+ );
314
+ if (lead == null) return new Block('');
315
+ /** @param {any} o @param {string} k */
316
+ const value = (o, k) => {
317
+ const fmt = options.format?.[k];
318
+ return fmt ? fmt(o[k]) : renderValue(o[k]);
319
+ };
320
+ const leads = items.map(o => (isEmpty(o[lead]) ? '' : value(o, lead)));
321
+ const column = Math.min(
322
+ Math.max(0, ...leads.map(l => displayWidth(l))),
323
+ INLINE_LEAD_MAX,
324
+ );
325
+ const indent = ' '.repeat(column + 2);
326
+ const lines = items.map((o, i) => {
327
+ const tail = toAscii(
328
+ rest
329
+ .filter(k => !isEmpty(o[k]))
330
+ .map(k => value(o, k))
331
+ .join(' - '),
332
+ );
333
+ if (tail === '') return toAscii(leads[i]);
334
+ const head = toAscii(`${leads[i].padEnd(column)} `);
335
+ if (options.overflow === 'truncate') {
336
+ return truncateToWidth(head + tail, WRAP_WIDTH);
337
+ }
338
+ // Wrap only the tail, so the padded first column survives the wrap.
339
+ const [first, ...more] = wrapText(tail, {
340
+ width: Math.max(20, WRAP_WIDTH - displayWidth(head)),
341
+ }).split('\n');
342
+ return [head + first, ...more.map(line => indent + line)].join('\n');
343
+ });
344
+ return new Block(lines.join('\n'));
345
+ }
346
+
184
347
  /**
185
348
  * A verbatim block — source dumps, layout skeletons, or a markdown doc. Output
186
349
  * is byte-for-byte (NOT ASCII-normalized), so it survives piping
@@ -8,6 +8,9 @@ import {
8
8
  list,
9
9
  record,
10
10
  records,
11
+ wrapText,
12
+ displayWidth,
13
+ WRAP_WIDTH,
11
14
  code,
12
15
  Block,
13
16
  BULLET,
@@ -114,6 +117,12 @@ describe('ASCII normalization', () => {
114
117
  expect(list(['Avatar \u2014 Group']).toString()).toBe('- Avatar - Group');
115
118
  });
116
119
 
120
+ it('converts Unicode arrows to ASCII arrows', () => {
121
+ expect(text('Rename items \u2192 options').toString()).toBe('Rename items -> options');
122
+ expect(text('options \u2190 items').toString()).toBe('options <- items');
123
+ expect(record({title: 'a \u2192 b'}).toString()).toBe('title: a -> b');
124
+ });
125
+
117
126
  it('leaves code verbatim (no normalization)', () => {
118
127
  expect(code('a \u2014 b').toString()).toBe('a \u2014 b');
119
128
  });
@@ -148,3 +157,91 @@ describe('emit', () => {
148
157
  expect(spy).not.toHaveBeenCalled();
149
158
  });
150
159
  });
160
+
161
+ describe('wrapText', () => {
162
+ it('leaves short lines and its own line breaks alone', () => {
163
+ expect(wrapText('a b\nc')).toBe('a b\nc');
164
+ });
165
+
166
+ it('wraps at the width with a hanging indent', () => {
167
+ expect(wrapText('aaa bbb ccc', {width: 7, indent: ' '})).toBe('aaa bbb\n ccc');
168
+ });
169
+
170
+ it('keeps a word longer than the width whole', () => {
171
+ expect(wrapText('x '.concat('y'.repeat(20)), {width: 10})).toBe(
172
+ `x\n${'y'.repeat(20)}`,
173
+ );
174
+ });
175
+ });
176
+
177
+ describe('records inline layout', () => {
178
+ const items = [
179
+ {id: 'a', title: 'Alpha', summary: 'First.'},
180
+ {id: 'bbb', title: 'Beta', summary: ''},
181
+ ];
182
+
183
+ it('puts one record on each line under a padded first column', () => {
184
+ expect(
185
+ records(items, {fields: ['id', 'title', 'summary'], layout: 'inline'}).toString(),
186
+ ).toBe('a Alpha - First.\nbbb Beta');
187
+ });
188
+
189
+ it('wraps a long record under the first column', () => {
190
+ const out = records([{id: 'a', text: 'word '.repeat(40).trim()}], {
191
+ layout: 'inline',
192
+ }).toString();
193
+ expect(out.split('\n').length).toBeGreaterThan(1);
194
+ expect(out.split('\n').every(line => line.length <= WRAP_WIDTH)).toBe(true);
195
+ expect(out.split('\n')[1].startsWith(' word')).toBe(true);
196
+ });
197
+
198
+ it('keeps the first column padded on a record that wraps', () => {
199
+ const out = records(
200
+ [
201
+ {id: 'a', text: 'word '.repeat(40).trim()},
202
+ {id: 'longer', text: 'x'},
203
+ ],
204
+ {layout: 'inline'},
205
+ ).toString();
206
+ const lines = out.split('\n');
207
+ expect(lines[0].startsWith(`a${' '.repeat(7)}word`)).toBe(true);
208
+ expect(lines[1].startsWith(' '.repeat(8) + 'word')).toBe(true);
209
+ expect(lines.at(-1)).toBe('longer x');
210
+ expect(lines.every(line => line.length <= WRAP_WIDTH)).toBe(true);
211
+ });
212
+
213
+ it('cuts a long record to one line when asked', () => {
214
+ const out = records([{id: 'a', text: 'word '.repeat(40).trim()}], {
215
+ layout: 'inline',
216
+ overflow: 'truncate',
217
+ }).toString();
218
+ expect(out.includes('\n')).toBe(false);
219
+ expect(out.length).toBeLessThanOrEqual(WRAP_WIDTH);
220
+ expect(out.endsWith('...')).toBe(true);
221
+ });
222
+ });
223
+
224
+ describe('wide characters', () => {
225
+ it('counts CJK characters as two columns', () => {
226
+ expect(displayWidth('亮/暗模式')).toBe(9);
227
+ });
228
+
229
+ it('wraps CJK text, which has no spaces, by columns', () => {
230
+ const out = wrapText('中'.repeat(100), {width: 20});
231
+ expect(out.split('\n').every(line => displayWidth(line) <= 20)).toBe(true);
232
+ expect(out.split('\n')).toHaveLength(10);
233
+ });
234
+
235
+ it('keeps spaces between Latin words next to CJK', () => {
236
+ expect(wrapText('运行 astryx docs 查看', {width: 200})).toBe('运行 astryx docs 查看');
237
+ });
238
+
239
+ it('cuts an inline record to columns, not characters', () => {
240
+ const out = records([{id: 'a', text: '中'.repeat(100)}], {
241
+ layout: 'inline',
242
+ overflow: 'truncate',
243
+ }).toString();
244
+ expect(displayWidth(out)).toBeLessThanOrEqual(WRAP_WIDTH);
245
+ expect(out.endsWith('...')).toBe(true);
246
+ });
247
+ });
@@ -16,7 +16,6 @@ import {Command, Option} from 'commander';
16
16
  import {fileURLToPath} from 'node:url';
17
17
  import * as fs from 'node:fs';
18
18
  import * as path from 'node:path';
19
- import {checkForUpdate} from './lib/update-check.mjs';
20
19
  import {getCliInvocation} from '../../foundation/env/package-manager.mjs';
21
20
  import {API_VERSION, setJsonMode} from '../../foundation/response/json.mjs';
22
21
  import {buildManifest} from './lib/manifest.mjs';
@@ -25,7 +24,8 @@ import {emit, section, text, records} from './formatters/index.mjs';
25
24
  import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
26
25
  import {levenshteinDistance} from '../../foundation/text/string-utils.mjs';
27
26
  import {installJsonShim} from './lib/json-shim.mjs';
28
- import {markReportsResult} from './lib/define-command.mjs';
27
+ import {addDocHelp, markReportsResult} from './lib/define-command.mjs';
28
+ import {doc as manifestDoc} from './commands/manifest.doc.mjs';
29
29
  import {isAstryxInitialized} from '../../foundation/agent-docs/agent-docs.mjs';
30
30
  import * as debug from '../../foundation/debug/index.mjs';
31
31
 
@@ -95,6 +95,7 @@ export const JSON_SUPPORTED = new Set([
95
95
  'theme targets',
96
96
  'theme palette generate',
97
97
  'integration add',
98
+ 'integration verify',
98
99
  'integration pack',
99
100
  'upgrade',
100
101
  'manifest',
@@ -275,8 +276,13 @@ const commands = [
275
276
  {name: 'doctor', path: './commands/doctor.mjs', register: 'registerDoctor'},
276
277
  ];
277
278
 
278
- const UPDATE_HINT_COMMANDS = new Set(['component', 'docs']);
279
279
  const SETUP_NUDGE_EXEMPT = new Set(['init', 'agent-docs']);
280
+ /** An integration package's manifest: the package is not an app to set up. */
281
+ const INTEGRATION_MANIFEST_FILES = [
282
+ 'astryx.integration.ts',
283
+ 'astryx.integration.mjs',
284
+ 'astryx.integration.js',
285
+ ];
280
286
 
281
287
  /**
282
288
  * Build a fresh, fully-wired Astryx CLI program (root options, hooks, all
@@ -337,22 +343,30 @@ export async function createProgram() {
337
343
  .name('astryx')
338
344
  .description('Design system CLI — components, themes, and tooling')
339
345
  .version(pkg.version)
340
- .option('--zh', 'Output docs in Chinese Simplified')
341
- .option('--dense', 'Output docs in compressed dense format (token-efficient)')
346
+ // These four change only the reads named in their text; every other
347
+ // command ignores them.
348
+ .option(
349
+ '--zh',
350
+ 'Simplified Chinese for component reads and for docs topics that have a translation (English otherwise)',
351
+ )
352
+ .option('--dense', 'Token-efficient dense text for component <Name> and docs <topic> reads')
342
353
  .addOption(
343
354
  new Option(
344
355
  '--lang <locale>',
345
- 'Output docs in specified language/format (en, zh, dense)',
356
+ 'Language or format for component and docs reads: en (default), zh (as --zh), or dense (as --dense)',
346
357
  ).choices(['en', 'zh', 'dense']),
347
358
  )
348
359
  .addOption(
349
- new Option('--detail <level>', 'Output detail level (full, compact, brief)')
360
+ new Option(
361
+ '--detail <level>',
362
+ 'Detail level for component, hook, and docs tree reads (e.g. docs cli/commands/build). Lists default to brief',
363
+ )
350
364
  .choices(['full', 'compact', 'brief'])
351
365
  .default('full'),
352
366
  )
353
367
  .option(
354
368
  '--json',
355
- 'Output as typed JSON. Success envelope: { type, data }. Error envelope: { error, suggestions? }.',
369
+ 'Output as typed JSON. Success envelope: { apiVersion, type, data, meta? }. Error envelope: { apiVersion, error, code, suggestions? }.',
356
370
  )
357
371
  .addHelpCommand('help', 'Show all commands')
358
372
  .action((options, cmd) => {
@@ -466,6 +480,19 @@ export async function createProgram() {
466
480
  const fullName = fullCommandName(actionCommand, program);
467
481
  if (JSON_SUPPORTED.has(fullName)) return;
468
482
  process.__xdsJsonHandled = true;
483
+ // A group given a word it does not have reports an unknown subcommand and
484
+ // lists the ones it has, in JSON as in text, even when a flag follows it.
485
+ const extras = actionCommand.commands.length > 0 ? actionCommand.args : [];
486
+ const unknown = extras.find(arg => !String(arg).startsWith('-'));
487
+ if (unknown != null) {
488
+ cliError(`unknown subcommand '${fullName} ${unknown}'`, {
489
+ code: ERROR_CODES.ERR_UNKNOWN_SUBCOMMAND,
490
+ suggestions: actionCommand.commands.map(child => ({
491
+ name: child.name(),
492
+ reason: 'available subcommand',
493
+ })),
494
+ });
495
+ }
469
496
  debug.setOutcome('rejected', {
470
497
  exitCode: 1,
471
498
  code: ERROR_CODES.ERR_INVALID_OPTION,
@@ -499,25 +526,6 @@ export async function createProgram() {
499
526
  process.exit(1);
500
527
  });
501
528
 
502
- /**
503
- * Post-action hook: print update hint after any command output.
504
- * Only fires for commands that produce output agents read (component, docs, etc.).
505
- * Suppressed when --json is active to avoid contaminating stdout.
506
- */
507
- program.hook('postAction', (thisCommand, actionCommand) => {
508
- if (program.opts().json) return;
509
- try {
510
- if (UPDATE_HINT_COMMANDS.has(actionCommand.name())) {
511
- const hint = checkForUpdate();
512
- if (hint) {
513
- console.error(`\n${hint}`);
514
- }
515
- }
516
- } catch {
517
- // Never let update check break the CLI
518
- }
519
- });
520
-
521
529
  /**
522
530
  * Enforcement layer 3 — setup nudge. If this project hasn't run `astryx init`
523
531
  * yet (no Astryx marker in any agent-doc file — see isAstryxInitialized), remind
@@ -539,6 +547,8 @@ export async function createProgram() {
539
547
  if (SETUP_NUDGE_EXEMPT.has(actionCommand.name())) return;
540
548
  const cwd = process.cwd();
541
549
  if (!fs.existsSync(path.join(cwd, 'package.json'))) return; // not a project
550
+ // An integration package is not an app: `init` is not its next step.
551
+ if (INTEGRATION_MANIFEST_FILES.some(file => fs.existsSync(path.join(cwd, file)))) return;
542
552
  if (isAstryxInitialized(cwd)) return; // already set up — stay quiet
543
553
  // Same wording as the core/cli postinstall nudges. #4151's getCliInvocation()
544
554
  // renders the correct form for THIS project — scoped `npx @astryxdesign/cli`
@@ -557,16 +567,18 @@ export async function createProgram() {
557
567
  mod[cmd.register](program);
558
568
  } catch (e) {
559
569
  // Command fails to load but CLI still works
570
+ const reason = /** @type {any} */ (e).message;
560
571
  const stub = program
561
572
  .command(cmd.name)
562
- .description(`(failed to load: ${/** @type {any} */ (e).message})`)
573
+ .description(`(failed to load: ${reason})`)
563
574
  .action(() => {
564
575
  // Nothing loaded, so nothing was answered — say that rather than
565
576
  // leaving the run's result unreported.
566
577
  debug.recordCommandResult(debug.NO_RESULT_SET);
567
- console.error(`Command "${cmd.name}" failed to load:`);
568
- console.error(/** @type {any} */ (e).message);
569
- process.exit(1);
578
+ // cliError, so --json still gets its one envelope.
579
+ cliError(`Command "${cmd.name}" failed to load: ${reason}`, {
580
+ code: ERROR_CODES.ERR_UNKNOWN,
581
+ });
570
582
  });
571
583
  markReportsResult(stub);
572
584
  }
@@ -601,20 +613,21 @@ export async function createProgram() {
601
613
  }
602
614
  // Human-readable summary as greppable records (agents should use --json).
603
615
  // One record per command: name, whether it supports --json, and the
604
- // description.
616
+ // description. Field names are the manifest entry's own keys.
605
617
  emit(
606
618
  section(`${manifest.name} v${manifest.version} (${manifest.commands.length} commands)`),
607
619
  records(
608
620
  manifest.commands.map(c => ({
609
- command: c.name,
621
+ name: c.name,
610
622
  json: c.json ? 'yes' : '',
611
623
  description: c.description || '',
612
624
  })),
613
- {fields: ['command', 'json', 'description']},
625
+ {fields: ['name', 'json', 'description']},
614
626
  ),
615
627
  text(`Run \`${getCliInvocation()} manifest --json\` for the full structured manifest.`),
616
628
  );
617
629
  });
630
+ addDocHelp(manifestCommand, manifestDoc);
618
631
  markReportsResult(manifestCommand);
619
632
 
620
633
  // Hidden command used by package.json postinstall scripts
@@ -0,0 +1,50 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file ASTRYX_LATEST_VERSION is not a CLI control: setting it changes nothing
5
+ * a command prints. It used to append an update hint to `component` and
6
+ * `docs`.
7
+ */
8
+
9
+ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
10
+ import * as fs from 'node:fs';
11
+ import * as os from 'node:os';
12
+ import * as path from 'node:path';
13
+ import {runCli} from '../../test-utils/run-cli.mjs';
14
+
15
+ const VARIABLE = 'ASTRYX_LATEST_VERSION';
16
+
17
+ /** @type {string} */
18
+ let dir;
19
+ /** @type {string | undefined} */
20
+ let saved;
21
+
22
+ beforeEach(() => {
23
+ saved = process.env[VARIABLE];
24
+ dir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-latest-version-'));
25
+ // A project on an old core, so a "newer version" hint would have a reason to fire.
26
+ fs.writeFileSync(
27
+ path.join(dir, 'package.json'),
28
+ JSON.stringify({name: 'app', private: true, dependencies: {'@astryxdesign/core': '^0.0.1'}}),
29
+ );
30
+ });
31
+
32
+ afterEach(() => {
33
+ if (saved === undefined) delete process.env[VARIABLE];
34
+ else process.env[VARIABLE] = saved;
35
+ fs.rmSync(dir, {recursive: true, force: true});
36
+ });
37
+
38
+ describe('ASTRYX_LATEST_VERSION', () => {
39
+ it('does not change what astryx docs prints', async () => {
40
+ delete process.env[VARIABLE];
41
+ const without = await runCli(['docs'], {cwd: dir});
42
+ process.env[VARIABLE] = '999.0.0';
43
+ const withVariable = await runCli(['docs'], {cwd: dir});
44
+
45
+ expect(withVariable.status).toBe(without.status);
46
+ expect(withVariable.stdout).toBe(without.stdout);
47
+ expect(withVariable.stderr).toBe(without.stderr);
48
+ expect(withVariable.stderr).not.toMatch(/newer version/i);
49
+ });
50
+ });
@@ -133,6 +133,13 @@ describe('cliError — JSON mode', () => {
133
133
  expect(env.suggestions).toEqual([{name: 'Button', reason: 'closest match'}]);
134
134
  });
135
135
 
136
+ it('replaces an unregistered code with ERR_UNKNOWN', () => {
137
+ expect(() =>
138
+ cliError('EACCES: permission denied', {code: 'EACCES'}),
139
+ ).toThrow('__exit_1__');
140
+ expect(JSON.parse(stdout[0]).code).toBe('ERR_UNKNOWN');
141
+ });
142
+
136
143
  it('always exits 1 in JSON mode (custom exitCode is ignored — contract)', () => {
137
144
  expect(() => cliError('msg', {exitCode: 2})).toThrow('__exit_1__');
138
145
  expect(exitCode).toBe(1);
@@ -71,7 +71,7 @@ function formatPropsTable(props) {
71
71
  lines.push('| Prop | Type | Default | Description |');
72
72
  lines.push('|------|------|---------|-------------|');
73
73
  for (const p of props) {
74
- const def = p.default ? `\`${mdCell(p.default)}\`` : '—';
74
+ const def = p.default ? `\`${mdCell(p.default)}\`` : '-';
75
75
  const req = p.required ? ' **(required)**' : '';
76
76
  lines.push(
77
77
  `| \`${mdCell(p.name)}\` | \`${mdCell(p.type)}\` | ${def} | ${mdCell(p.description)}${req} |`,
@@ -190,11 +190,11 @@ function formatTargetsTable(docs, themeData) {
190
190
  ...themeVariants.map((/** @type {string} */ v) => `${v}*`),
191
191
  ];
192
192
 
193
- const variantsStr = variantParts.length > 0 ? variantParts.join(', ') : '—';
194
- const statesStr = states.length > 0 ? states.join(', ') : '—';
193
+ const variantsStr = variantParts.length > 0 ? variantParts.join(', ') : '-';
194
+ const statesStr = states.length > 0 ? states.join(', ') : '-';
195
195
  const dataAttrs = getTargetDataAttributes(target);
196
196
  const dataAttrsStr =
197
- dataAttrs.length > 0 ? dataAttrs.map(attr => `\`${attr}\``).join(', ') : '—';
197
+ dataAttrs.length > 0 ? dataAttrs.map(attr => `\`${attr}\``).join(', ') : '-';
198
198
 
199
199
  const className = target.deprecatedFor
200
200
  ? `\`${target.className}\` _(deprecated; use \`${target.deprecatedFor}\`)_`
@@ -342,7 +342,7 @@ export function formatFull(docs, options = {}) {
342
342
  const publicVars = docs.theming.vars.filter((/** @type {any} */ v) => !v.private && !v.derived);
343
343
 
344
344
  if (publicVars.length > 0) {
345
- sections.push('**Themeable CSS variables** — additional properties that can be overridden in `defineTheme` component overrides.\n');
345
+ sections.push('**Themeable CSS variables** - additional properties that can be overridden in `defineTheme` component overrides.\n');
346
346
  const varLines = [];
347
347
  varLines.push('| CSS Variable | Default | Description |');
348
348
  varLines.push('|-------------|---------|-------------|');
@@ -544,7 +544,7 @@ export function formatBrief(docs, componentName, importHint, options = {}) {
544
544
  signatureProps.length > 0
545
545
  ? `${displayName}(${signatureProps.join(', ')})`
546
546
  : displayName;
547
- output.push(importHint ? `${sigStr} ← from '${importHint}'` : sigStr);
547
+ output.push(importHint ? `${sigStr} <- from '${importHint}'` : sigStr);
548
548
 
549
549
  // Description (shortened)
550
550
  if (description) {
@@ -569,7 +569,7 @@ export function formatBrief(docs, componentName, importHint, options = {}) {
569
569
  // Derived properties (if any)
570
570
  if (docs.theming?.derived?.length) {
571
571
  const derivedNames = docs.theming.derived
572
- .map((/** @type {any} */ d) => d.expand === 'container' ? `${d.property} → container tokens` : `${d.property} → ${(d.vars || []).join(', ')}`)
572
+ .map((/** @type {any} */ d) => d.expand === 'container' ? `${d.property} -> container tokens` : `${d.property} -> ${(d.vars || []).join(', ')}`)
573
573
  .join('; ');
574
574
  output.push(` Derived: ${derivedNames}`);
575
575
  }
@@ -579,7 +579,7 @@ export function formatBrief(docs, componentName, importHint, options = {}) {
579
579
  const { themeData = null } = options;
580
580
  const targetParts = docs.theming.targets.map((/** @type {any} */ t) => {
581
581
  const parts = [t.className];
582
- if (t.deprecatedFor) parts.push(`deprecated→${t.deprecatedFor}`);
582
+ if (t.deprecatedFor) parts.push(`deprecated->${t.deprecatedFor}`);
583
583
  const dataAttrs = getTargetDataAttributes(t);
584
584
  if (dataAttrs.length) parts.push(`preferred attrs: ${dataAttrs.join(', ')}`);
585
585
  if (t.visualProps?.length) parts.push(`variants: ${t.visualProps.join(', ')}`);
@@ -595,7 +595,7 @@ export function formatBrief(docs, componentName, importHint, options = {}) {
595
595
 
596
596
  // Other props
597
597
  if (otherProps.length > 0) {
598
- output.push(` ${otherProps.join(' · ')}`);
598
+ output.push(` ${otherProps.join(', ')}`);
599
599
  }
600
600
 
601
601
  // First code example
@@ -157,7 +157,7 @@ describe('deprecated theming target guidance', () => {
157
157
 
158
158
  it('keeps the replacement in brief agent guidance', () => {
159
159
  expect(formatBrief(docs, 'Example')).toContain(
160
- 'astryx-old-target deprecated→new-target',
160
+ 'astryx-old-target deprecated->new-target',
161
161
  );
162
162
  });
163
163
  });