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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (643) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +117 -78
  3. package/api/blog/blog.doc.mjs +1 -0
  4. package/api/build/_adapter.d.mts +50 -0
  5. package/api/build/_adapter.mjs +60 -0
  6. package/api/build/build.doc.mjs +16 -9
  7. package/api/build/build.test.mjs +197 -8
  8. package/api/build/build.type.d.mts +91 -2
  9. package/api/build/build.type.mjs +52 -8
  10. package/api/build/help/help.d.mts +12 -5
  11. package/api/build/help/help.mjs +69 -6
  12. package/api/build/kit/kit.d.mts +4 -1
  13. package/api/build/kit/kit.mjs +165 -49
  14. package/api/build/kit/rank.d.mts +44 -0
  15. package/api/build/kit/rank.mjs +432 -0
  16. package/api/build/kit/rank.test.mjs +196 -0
  17. package/api/component/_adapter.d.mts +6 -12
  18. package/api/component/_adapter.mjs +20 -10
  19. package/api/component/component.doc.mjs +13 -3
  20. package/api/component/component.mjs +91 -14
  21. package/api/component/component.test.mjs +38 -0
  22. package/api/component/component.type.d.mts +22 -11
  23. package/api/component/component.type.mjs +32 -24
  24. package/api/component/detail/blocks/blocks.d.mts +2 -1
  25. package/api/component/detail/blocks/blocks.mjs +4 -3
  26. package/api/component/list/list.d.mts +0 -5
  27. package/api/component/list/list.mjs +40 -11
  28. package/api/discover/_adapter.d.mts +114 -6
  29. package/api/discover/_adapter.mjs +372 -17
  30. package/api/discover/_adapter.test.mjs +215 -0
  31. package/api/discover/_catalog-view.d.mts +115 -0
  32. package/api/discover/_catalog-view.mjs +203 -0
  33. package/api/discover/_catalog-view.test.mjs +128 -0
  34. package/api/discover/detail/detail.d.mts +18 -6
  35. package/api/discover/detail/detail.mjs +67 -13
  36. package/api/discover/detail/detail.test.mjs +85 -0
  37. package/api/discover/detail/item/item.d.mts +26 -0
  38. package/api/discover/detail/item/item.mjs +78 -0
  39. package/api/discover/detail/item/item.test.mjs +73 -0
  40. package/api/discover/discover.d.mts +3 -9
  41. package/api/discover/discover.doc.mjs +62 -18
  42. package/api/discover/discover.mjs +220 -36
  43. package/api/discover/discover.test.mjs +11 -2
  44. package/api/discover/discover.type.d.mts +150 -11
  45. package/api/discover/discover.type.mjs +107 -17
  46. package/api/discover/list/list.d.mts +20 -6
  47. package/api/discover/list/list.mjs +45 -12
  48. package/api/discover/list/list.test.mjs +46 -0
  49. package/api/discover/search/search.d.mts +18 -16
  50. package/api/discover/search/search.mjs +102 -56
  51. package/api/discover/search/search.test.mjs +144 -10
  52. package/api/docs/_adapter.d.mts +272 -41
  53. package/api/docs/_adapter.mjs +985 -108
  54. package/api/docs/compiled-topics.test.mjs +78 -0
  55. package/api/docs/detail/detail.mjs +22 -63
  56. package/api/docs/detail/section/section.d.mts +1 -1
  57. package/api/docs/detail/section/section.mjs +54 -19
  58. package/api/docs/detail/section/section.test.mjs +50 -0
  59. package/api/docs/docs.d.mts +10 -3
  60. package/api/docs/docs.doc.mjs +55 -16
  61. package/api/docs/docs.mjs +53 -10
  62. package/api/docs/docs.test.mjs +164 -4
  63. package/api/docs/docs.type.d.mts +221 -5
  64. package/api/docs/docs.type.mjs +153 -11
  65. package/api/docs/index/index.d.mts +18 -0
  66. package/api/docs/index/index.mjs +40 -0
  67. package/api/docs/index/index.test.mjs +62 -0
  68. package/api/docs/integration-tree.test.mjs +555 -0
  69. package/api/docs/integrationDocs.test.mjs +114 -8
  70. package/api/docs/list/list.mjs +28 -12
  71. package/api/docs/node/node.d.mts +43 -0
  72. package/api/docs/node/node.mjs +192 -0
  73. package/api/docs/reference-blocks.test.mjs +406 -0
  74. package/api/doctor/doctor.d.mts +99 -1
  75. package/api/doctor/doctor.doc.mjs +1 -0
  76. package/api/doctor/doctor.mjs +548 -1
  77. package/api/doctor/doctor.test.mjs +610 -1
  78. package/api/gap-report/gap-report.doc.mjs +8 -4
  79. package/api/hook/_adapter.mjs +19 -5
  80. package/api/hook/hook.doc.mjs +1 -0
  81. package/api/hook/hook.type.d.mts +3 -3
  82. package/api/hook/hook.type.mjs +11 -11
  83. package/api/hook/list/list.d.mts +2 -2
  84. package/api/hook/list/list.mjs +69 -17
  85. package/api/index.d.mts +1 -1
  86. package/api/index.mjs +1 -0
  87. package/api/init/init.doc.mjs +6 -1
  88. package/api/init/init.test.mjs +41 -1
  89. package/api/init/remove/remove.mjs +1 -1
  90. package/api/init/run/run.mjs +20 -10
  91. package/api/integration/add-contribution.component-names.test.mjs +120 -0
  92. package/api/integration/add-contribution.d.mts +2 -1
  93. package/api/integration/add-contribution.mjs +130 -15
  94. package/api/integration/add-contribution.test.mjs +258 -7
  95. package/api/integration/add-helpers.d.mts +5 -2
  96. package/api/integration/add-helpers.mjs +36 -9
  97. package/api/integration/add-theme.mjs +34 -64
  98. package/api/integration/add-theme.test.mjs +105 -21
  99. package/api/integration/authoring-checks.mjs +138 -28
  100. package/api/integration/authoring-checks.test.mjs +179 -7
  101. package/api/integration/authoring-checks.type.mjs +6 -1
  102. package/api/integration/integration-authoring.type.d.mts +3 -1
  103. package/api/integration/integration-authoring.type.mjs +2 -0
  104. package/api/integration/integration-block-exports.test.mjs +10 -6
  105. package/api/integration/integrationAdd.doc.mjs +14 -4
  106. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  107. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  108. package/api/integration/integrationAddComponent.doc.mjs +2 -1
  109. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  110. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  111. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  112. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  113. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  114. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  115. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  116. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  117. package/api/integration/pack-check.mjs +83 -7
  118. package/api/integration/pack-check.test.mjs +387 -47
  119. package/api/integration/pack-check.type.d.mts +26 -2
  120. package/api/integration/pack-check.type.mjs +14 -1
  121. package/api/integration/summarizeIssues.doc.mjs +1 -0
  122. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  123. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  124. package/api/integration/validate-integration.mjs +52 -102
  125. package/api/integration/validate-integration.test.mjs +179 -26
  126. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  127. package/api/integration/validateIntegration.doc.mjs +3 -2
  128. package/api/json/assertResponse.doc.mjs +1 -0
  129. package/api/json/envelope-types.test.mjs +76 -0
  130. package/api/json/index.ts +2 -0
  131. package/api/json/isError.doc.mjs +1 -0
  132. package/api/json/parseResponse.doc.mjs +3 -2
  133. package/api/layout/_adapter.mjs +20 -5
  134. package/api/layout/expand/expand.mjs +7 -5
  135. package/api/layout/expand/expand.path-safety.test.mjs +53 -0
  136. package/api/layout/grammar/grammar.mjs +2 -1
  137. package/api/layout/layoutCheck.doc.mjs +1 -0
  138. package/api/layout/layoutExpand.doc.mjs +2 -1
  139. package/api/layout/layoutGrammar.doc.mjs +1 -0
  140. package/api/search/search-return-type.test.mjs +54 -0
  141. package/api/search/search.d.mts +62 -11
  142. package/api/search/search.doc.mjs +8 -2
  143. package/api/search/search.mjs +471 -83
  144. package/api/search/search.test.mjs +124 -1
  145. package/api/search/search.type.d.mts +15 -3
  146. package/api/search/search.type.mjs +5 -2
  147. package/api/swizzle/copy/copy.mjs +28 -11
  148. package/api/swizzle/swizzle.doc.mjs +2 -1
  149. package/api/swizzle/swizzle.type.d.mts +2 -2
  150. package/api/swizzle/swizzle.type.mjs +2 -2
  151. package/api/template/copy/copy.mjs +17 -23
  152. package/api/template/copy/copy.test.mjs +17 -0
  153. package/api/template/list/list.mjs +1 -0
  154. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  155. package/api/template/template-integration.test.mjs +1072 -3
  156. package/api/template/template-suffix.test.mjs +41 -21
  157. package/api/template/template.d.mts +1 -1
  158. package/api/template/template.doc.mjs +30 -8
  159. package/api/template/template.mjs +45 -8
  160. package/api/template/template.type.d.mts +12 -14
  161. package/api/template/template.type.mjs +15 -14
  162. package/api/theme/_adapter.d.mts +2 -3
  163. package/api/theme/_adapter.mjs +4 -5
  164. package/api/theme/add/add.binary.test.mjs +84 -0
  165. package/api/theme/add/add.mjs +31 -22
  166. package/api/theme/add/add.rollback.test.mjs +158 -0
  167. package/api/theme/add/add.staging.test.mjs +83 -0
  168. package/api/theme/add/add.test.mjs +14 -1
  169. package/api/theme/build/build.family.test.mjs +7 -12
  170. package/api/theme/build/build.mjs +140 -59
  171. package/api/theme/build/build.public-component-vars.test.mjs +1 -1
  172. package/api/theme/build/build.receipt-doc.test.mjs +111 -0
  173. package/api/theme/build/build.rollback.test.mjs +148 -0
  174. package/api/theme/build/build.test.mjs +127 -0
  175. package/api/theme/build/font-warning.mjs +3 -3
  176. package/api/theme/build/font-warning.test.mjs +5 -2
  177. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  178. package/api/theme/integration-themes.test.mjs +39 -28
  179. package/api/theme/list/list.test.mjs +19 -20
  180. package/api/theme/listThemes.doc.mjs +6 -5
  181. package/api/theme/palette/generate/generate.mjs +8 -3
  182. package/api/theme/palette/generate/generate.test.mjs +96 -0
  183. package/api/theme/palette/generate/generator.d.mts +10 -13
  184. package/api/theme/palette/generate/generator.mjs +15 -4
  185. package/api/theme/palette/generate/generator.test.mjs +10 -0
  186. package/api/theme/template/template.mjs +11 -2
  187. package/api/theme/template/template.test.mjs +20 -0
  188. package/api/theme/theme.type.d.mts +170 -11
  189. package/api/theme/theme.type.mjs +94 -27
  190. package/api/theme/themeAdd.doc.mjs +4 -3
  191. package/api/theme/themeBuild.doc.mjs +8 -4
  192. package/api/theme/themeList.doc.mjs +6 -3
  193. package/api/theme/themeListAvailable.doc.mjs +5 -3
  194. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  195. package/api/theme/themeTargets.doc.mjs +1 -0
  196. package/api/theme/themeTemplate.doc.mjs +6 -2
  197. package/api/upgrade/_adapter.d.mts +32 -5
  198. package/api/upgrade/_adapter.mjs +139 -22
  199. package/api/upgrade/list/list.mjs +2 -1
  200. package/api/upgrade/list/list.test.mjs +73 -0
  201. package/api/upgrade/project-context.test.mjs +272 -0
  202. package/api/upgrade/provider-agreement.test.mjs +152 -0
  203. package/api/upgrade/run/run.mjs +356 -59
  204. package/api/upgrade/status/status.mjs +2 -2
  205. package/api/upgrade/upgrade.doc.mjs +12 -5
  206. package/api/upgrade/upgrade.type.d.mts +43 -5
  207. package/api/upgrade/upgrade.type.mjs +27 -11
  208. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  209. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  210. package/assets/codemods/integration-discovery.mjs +48 -4
  211. package/assets/codemods/integration-discovery.test.mjs +73 -0
  212. package/assets/codemods/integration-runner.mjs +56 -4
  213. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  214. package/assets/codemods/registry.mjs +1 -0
  215. package/assets/codemods/run-codemod.mjs +177 -34
  216. package/assets/codemods/runner.mjs +350 -102
  217. package/assets/codemods/term-log.mjs +32 -8
  218. package/assets/codemods/term-log.test.mjs +19 -1
  219. package/assets/codemods/transform-prop.mjs +109 -0
  220. package/assets/codemods/transform-prop.test.mjs +95 -0
  221. package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
  222. package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
  223. package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
  224. package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
  225. package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
  226. package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
  227. package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
  228. package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
  229. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  230. package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  231. package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
  232. package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
  233. package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
  234. package/assets/docs/README.md +9 -0
  235. package/assets/docs/authoring.doc.mjs +14 -0
  236. package/assets/docs/getting-started.doc.mjs +2 -2
  237. package/assets/docs/internationalization.doc.mjs +7 -5
  238. package/assets/docs/layout.doc.dense.mjs +2 -2
  239. package/assets/docs/layout.doc.mjs +1 -1
  240. package/assets/docs/principles.doc.mjs +6 -6
  241. package/assets/docs/styling-libraries.doc.mjs +4 -4
  242. package/assets/docs/styling.doc.mjs +4 -4
  243. package/assets/docs/theme.doc.mjs +5 -5
  244. package/assets/docs/tokens.doc.mjs +1 -1
  245. package/assets/docs/tree/api.doc.mjs +30 -0
  246. package/assets/docs/tree/cli.doc.mjs +23 -0
  247. package/assets/docs/tree/commands.doc.mjs +25 -0
  248. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
  249. package/assets/docs/tree/integrations.test.mjs +62 -0
  250. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  251. package/assets/docs/working-with-ai.doc.mjs +4 -4
  252. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  253. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  254. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  255. package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
  256. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  257. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  258. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
  259. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
  260. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
  261. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
  262. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
  263. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
  264. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
  265. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
  266. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
  267. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
  268. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
  269. package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
  270. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  271. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  272. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  273. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  274. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  275. package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
  276. package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
  277. package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
  278. package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
  279. package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
  280. package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
  281. package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
  282. package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
  283. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
  284. package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
  285. package/assets/templates/pages/table-tree/page.tsx +1704 -0
  286. package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
  287. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  288. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  289. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  290. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  291. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  292. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  293. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  294. package/authoring/_shared/contract.ts +22 -0
  295. package/authoring/codemod/codemod.doc.mjs +7 -2
  296. package/authoring/codemod/parse.d.mts +8 -8
  297. package/authoring/codemod/parse.mjs +8 -6
  298. package/authoring/codemod/type.ts +12 -0
  299. package/authoring/config/config.doc.mjs +10 -2
  300. package/authoring/config/debug-composition.test.mjs +92 -0
  301. package/authoring/config/parse.d.mts +15 -13
  302. package/authoring/config/parse.mjs +27 -8
  303. package/authoring/config/parse.test.mjs +8 -0
  304. package/authoring/config/type.ts +29 -6
  305. package/authoring/debug/debug.doc.d.mts +11 -0
  306. package/authoring/debug/debug.doc.mjs +182 -0
  307. package/authoring/debug/parse.d.mts +8 -8
  308. package/authoring/debug/parse.mjs +3 -3
  309. package/authoring/discover/discover.doc.d.mts +13 -0
  310. package/authoring/discover/discover.doc.mjs +138 -0
  311. package/authoring/discover/parse.d.mts +24 -0
  312. package/authoring/discover/parse.mjs +128 -0
  313. package/authoring/discover/parse.test.mjs +124 -0
  314. package/authoring/discover/type.ts +87 -0
  315. package/authoring/doctypes/_schema.d.mts +790 -23
  316. package/authoring/doctypes/_schema.mjs +543 -39
  317. package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
  318. package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
  319. package/authoring/doctypes/base/type.ts +41 -0
  320. package/authoring/doctypes/command/command.doc.mjs +4 -3
  321. package/authoring/doctypes/command/parse.d.mts +2 -2
  322. package/authoring/doctypes/command/parse.mjs +1 -1
  323. package/authoring/doctypes/command/type.ts +5 -4
  324. package/authoring/doctypes/component/component.doc.mjs +6 -3
  325. package/authoring/doctypes/component/parse.d.mts +2 -2
  326. package/authoring/doctypes/component/parse.mjs +1 -1
  327. package/authoring/doctypes/component/type.ts +6 -5
  328. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  329. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  330. package/authoring/doctypes/enum/parse.d.mts +2 -2
  331. package/authoring/doctypes/enum/parse.mjs +1 -1
  332. package/authoring/doctypes/enum/type.ts +4 -2
  333. package/authoring/doctypes/function/function.doc.mjs +7 -2
  334. package/authoring/doctypes/function/parse.d.mts +2 -2
  335. package/authoring/doctypes/function/parse.mjs +1 -1
  336. package/authoring/doctypes/function/type.ts +9 -4
  337. package/authoring/doctypes/hook/hook.doc.mjs +4 -0
  338. package/authoring/doctypes/hook/parse.d.mts +2 -2
  339. package/authoring/doctypes/hook/parse.mjs +1 -1
  340. package/authoring/doctypes/hook/type.ts +5 -4
  341. package/authoring/doctypes/legacy.d.mts +8 -6
  342. package/authoring/doctypes/legacy.mjs +5 -4
  343. package/authoring/doctypes/load-contract.test.mjs +233 -0
  344. package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
  345. package/authoring/doctypes/namespace/namespace.doc.mjs +128 -0
  346. package/authoring/doctypes/namespace/parse.d.mts +12 -0
  347. package/authoring/doctypes/namespace/parse.mjs +25 -0
  348. package/authoring/doctypes/namespace/parse.test.mjs +163 -0
  349. package/authoring/doctypes/namespace/type.ts +74 -0
  350. package/authoring/doctypes/parse.d.mts +22 -18
  351. package/authoring/doctypes/parse.mjs +22 -11
  352. package/authoring/doctypes/parse.test.mjs +77 -3
  353. package/authoring/doctypes/reference/parse.d.mts +2 -2
  354. package/authoring/doctypes/reference/parse.mjs +8 -5
  355. package/authoring/doctypes/reference/reference.doc.mjs +48 -6
  356. package/authoring/doctypes/reference/type.ts +70 -7
  357. package/authoring/doctypes/schema/parse.d.mts +2 -2
  358. package/authoring/doctypes/schema/parse.mjs +1 -1
  359. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  360. package/authoring/doctypes/schema/type.ts +4 -4
  361. package/authoring/doctypes/template/parse.d.mts +94 -1
  362. package/authoring/doctypes/template/parse.mjs +40 -2
  363. package/authoring/doctypes/template/parse.test.mjs +26 -2
  364. package/authoring/doctypes/template/template.doc.mjs +13 -3
  365. package/authoring/doctypes/template/type.ts +13 -2
  366. package/authoring/doctypes/theme/parse.d.mts +35 -0
  367. package/authoring/doctypes/theme/parse.mjs +76 -0
  368. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  369. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  370. package/authoring/doctypes/theme/type.ts +42 -0
  371. package/authoring/doctypes/types.ts +12 -10
  372. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  373. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  374. package/authoring/gap-report/parse.d.mts +10 -10
  375. package/authoring/gap-report/parse.mjs +6 -6
  376. package/authoring/gap-report/type.ts +1 -1
  377. package/authoring/identity/identity.doc.d.mts +9 -0
  378. package/authoring/identity/identity.doc.mjs +61 -0
  379. package/authoring/identity/type.ts +132 -0
  380. package/authoring/index.d.mts +3 -0
  381. package/authoring/index.d.ts +62 -17
  382. package/authoring/index.mjs +4 -1
  383. package/authoring/integration/integration.doc.mjs +15 -8
  384. package/authoring/integration/parse.d.mts +2 -2
  385. package/authoring/integration/parse.mjs +1 -1
  386. package/authoring/integration/parse.test.mjs +10 -1
  387. package/authoring/integration/schema.d.mts +6 -4
  388. package/authoring/integration/schema.mjs +9 -3
  389. package/authoring/integration/type.ts +19 -8
  390. package/authoring/shadcn/receipt.d.mts +6 -6
  391. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  392. package/clients/cli/command-load-failure.test.mjs +83 -0
  393. package/clients/cli/commands/blog.doc.mjs +1 -1
  394. package/clients/cli/commands/blog.mjs +23 -8
  395. package/clients/cli/commands/blog.test.mjs +42 -1
  396. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  397. package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
  398. package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
  399. package/clients/cli/commands/build-theme.mjs +16 -50
  400. package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
  401. package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
  402. package/clients/cli/commands/build.doc.mjs +16 -8
  403. package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
  404. package/clients/cli/commands/build.mjs +137 -114
  405. package/clients/cli/commands/build.playbook.test.mjs +75 -0
  406. package/clients/cli/commands/build.text-fields.test.mjs +81 -0
  407. package/clients/cli/commands/component/index.mjs +3 -8
  408. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  409. package/clients/cli/commands/component-package.test.mjs +46 -0
  410. package/clients/cli/commands/component-resolution.test.mjs +21 -0
  411. package/clients/cli/commands/component.doc.mjs +1 -1
  412. package/clients/cli/commands/component.test.mjs +19 -0
  413. package/clients/cli/commands/detail-levels.test.mjs +2 -2
  414. package/clients/cli/commands/discover.broken-integration.test.mjs +52 -5
  415. package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
  416. package/clients/cli/commands/discover.doc.mjs +55 -9
  417. package/clients/cli/commands/discover.mjs +393 -118
  418. package/clients/cli/commands/discover.sources.test.mjs +267 -0
  419. package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
  420. package/clients/cli/commands/docs.doc.mjs +28 -6
  421. package/clients/cli/commands/docs.mjs +240 -26
  422. package/clients/cli/commands/docs.test.mjs +193 -1
  423. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  424. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  425. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  426. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  427. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  428. package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
  429. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  430. package/clients/cli/commands/doctor.doc.mjs +1 -1
  431. package/clients/cli/commands/doctor.mjs +59 -32
  432. package/clients/cli/commands/doctor.test.mjs +42 -0
  433. package/clients/cli/commands/gap-report.doc.mjs +17 -6
  434. package/clients/cli/commands/gap-report.test.mjs +72 -0
  435. package/clients/cli/commands/hook/index.mjs +7 -17
  436. package/clients/cli/commands/hook.doc.mjs +1 -1
  437. package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
  438. package/clients/cli/commands/init.doc.mjs +20 -9
  439. package/clients/cli/commands/init.flag-help.test.mjs +153 -0
  440. package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
  441. package/clients/cli/commands/integration-add.doc.mjs +32 -6
  442. package/clients/cli/commands/integration-authoring.test.mjs +13 -9
  443. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  444. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  445. package/clients/cli/commands/integration.doc.mjs +1 -1
  446. package/clients/cli/commands/integration.mjs +1 -0
  447. package/clients/cli/commands/interactive-guard.test.mjs +101 -24
  448. package/clients/cli/commands/json-contract.test.mjs +33 -0
  449. package/clients/cli/commands/layout-check.doc.mjs +15 -4
  450. package/clients/cli/commands/layout-expand.doc.mjs +22 -5
  451. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  452. package/clients/cli/commands/layout.doc.mjs +3 -3
  453. package/clients/cli/commands/layout.mjs +21 -9
  454. package/clients/cli/commands/layout.path-help.test.mjs +33 -0
  455. package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
  456. package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
  457. package/clients/cli/commands/manifest.doc.mjs +1 -1
  458. package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
  459. package/clients/cli/commands/search.doc.mjs +7 -4
  460. package/clients/cli/commands/search.mjs +28 -9
  461. package/clients/cli/commands/search.test.mjs +75 -0
  462. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  463. package/clients/cli/commands/swizzle.doc.mjs +3 -2
  464. package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
  465. package/clients/cli/commands/template.doc.mjs +52 -13
  466. package/clients/cli/commands/template.flag-help.test.mjs +117 -0
  467. package/clients/cli/commands/template.mjs +4 -91
  468. package/clients/cli/commands/template.path-help.test.mjs +40 -0
  469. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  470. package/clients/cli/commands/theme-add.doc.mjs +4 -3
  471. package/clients/cli/commands/theme-build.doc.mjs +8 -7
  472. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  473. package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
  474. package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
  475. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  476. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  477. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  478. package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
  479. package/clients/cli/commands/theme-template.doc.mjs +2 -2
  480. package/clients/cli/commands/theme.doc.mjs +1 -1
  481. package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
  482. package/clients/cli/commands/upgrade.doc.mjs +22 -10
  483. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  484. package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
  485. package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
  486. package/clients/cli/commands/upgrade.mjs +29 -7
  487. package/clients/cli/formatters/index.mjs +164 -1
  488. package/clients/cli/formatters/index.test.mjs +97 -0
  489. package/clients/cli/index.mjs +21 -30
  490. package/clients/cli/latest-version-env.test.mjs +50 -0
  491. package/clients/cli/lib/cli-error.test.mjs +7 -0
  492. package/clients/cli/lib/component-format.mjs +9 -9
  493. package/clients/cli/lib/component-format.test.mjs +1 -1
  494. package/clients/cli/lib/define-command.mjs +32 -6
  495. package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
  496. package/clients/cli/lib/exit-codes.test.mjs +97 -0
  497. package/clients/cli/lib/hook-format.mjs +19 -10
  498. package/clients/cli/lib/json-shim.mjs +38 -2
  499. package/clients/cli/lib/json-shim.test.mjs +83 -0
  500. package/clients/cli/lib/manifest.d.ts +2 -0
  501. package/clients/cli/lib/manifest.mjs +37 -2
  502. package/clients/cli/lib/manifest.test.mjs +17 -0
  503. package/foundation/agent-docs/agent-docs.d.mts +7 -2
  504. package/foundation/agent-docs/agent-docs.mjs +82 -12
  505. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
  506. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  507. package/foundation/config/integration-debug.test.mjs +28 -3
  508. package/foundation/config/project-themes.test.mjs +11 -19
  509. package/foundation/config/project.d.mts +20 -11
  510. package/foundation/config/project.mjs +263 -91
  511. package/foundation/config/project.test.mjs +270 -21
  512. package/foundation/discovery/authoring-self-docs.d.mts +87 -0
  513. package/foundation/discovery/authoring-self-docs.mjs +237 -0
  514. package/foundation/discovery/authoring-self-docs.test.mjs +170 -0
  515. package/foundation/discovery/authoring-surface.d.mts +74 -0
  516. package/foundation/discovery/authoring-surface.mjs +525 -0
  517. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  518. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  519. package/foundation/discovery/cli-self-docs.mjs +490 -0
  520. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  521. package/foundation/discovery/component-discovery.d.mts +39 -1
  522. package/foundation/discovery/component-discovery.mjs +50 -1
  523. package/foundation/discovery/component-loader.d.mts +35 -38
  524. package/foundation/discovery/component-loader.mjs +53 -222
  525. package/foundation/discovery/docs-discovery.d.mts +119 -11
  526. package/foundation/discovery/docs-discovery.mjs +423 -108
  527. package/foundation/discovery/docs-discovery.test.mjs +365 -20
  528. package/foundation/discovery/docs-output-budget.d.mts +28 -0
  529. package/foundation/discovery/docs-output-budget.mjs +50 -0
  530. package/foundation/discovery/docs-section-key.d.mts +116 -0
  531. package/foundation/discovery/docs-section-key.mjs +322 -0
  532. package/foundation/discovery/docs-section-key.test.mjs +246 -0
  533. package/foundation/discovery/template-adapter.d.mts +113 -11
  534. package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
  535. package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
  536. package/foundation/discovery/template-adapter.mjs +774 -83
  537. package/foundation/discovery/template-adapter.test.mjs +57 -0
  538. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  539. package/foundation/discovery/template-conflict-release.mjs +40 -0
  540. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  541. package/foundation/discovery/theme-discovery.d.mts +67 -7
  542. package/foundation/discovery/theme-discovery.mjs +916 -186
  543. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  544. package/foundation/discovery/theming-targets.test.mjs +4 -0
  545. package/foundation/doc-compiler/bundle.d.mts +47 -0
  546. package/foundation/doc-compiler/bundle.mjs +278 -0
  547. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  548. package/foundation/doc-compiler/compile.d.mts +343 -0
  549. package/foundation/doc-compiler/compile.mjs +558 -0
  550. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  551. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  552. package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
  553. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  554. package/foundation/doc-compiler/import.d.mts +24 -0
  555. package/foundation/doc-compiler/import.mjs +59 -0
  556. package/foundation/doc-compiler/inputs.d.mts +102 -0
  557. package/foundation/doc-compiler/inputs.mjs +291 -0
  558. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  559. package/foundation/doc-compiler/ir.d.mts +22 -0
  560. package/foundation/doc-compiler/ir.mjs +471 -0
  561. package/foundation/doc-compiler/lenses.d.mts +36 -0
  562. package/foundation/doc-compiler/lenses.mjs +173 -0
  563. package/foundation/doc-compiler/links.d.mts +162 -0
  564. package/foundation/doc-compiler/links.mjs +294 -0
  565. package/foundation/doc-compiler/links.test.mjs +192 -0
  566. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  567. package/foundation/doc-compiler/overlays.d.mts +37 -0
  568. package/foundation/doc-compiler/overlays.mjs +206 -0
  569. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  570. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  571. package/foundation/doc-compiler/read.d.mts +127 -0
  572. package/foundation/doc-compiler/read.mjs +325 -0
  573. package/foundation/doc-compiler/read.test.mjs +313 -0
  574. package/foundation/doc-compiler/source.d.mts +33 -0
  575. package/foundation/doc-compiler/source.mjs +128 -0
  576. package/foundation/doc-compiler/tree.d.mts +288 -0
  577. package/foundation/doc-compiler/tree.mjs +876 -0
  578. package/foundation/doc-compiler/tree.test.mjs +598 -0
  579. package/foundation/fs/file-protection.d.mts +33 -0
  580. package/foundation/fs/file-protection.mjs +825 -0
  581. package/foundation/fs/file-protection.test.mjs +250 -0
  582. package/foundation/fs/module-loader.d.mts +1 -0
  583. package/foundation/fs/module-loader.mjs +50 -1
  584. package/foundation/fs/module-loader.stdout.test.mjs +332 -0
  585. package/foundation/fs/path-safety.d.mts +3 -2
  586. package/foundation/fs/path-safety.mjs +49 -19
  587. package/foundation/fs/path-safety.test.mjs +50 -0
  588. package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
  589. package/foundation/identity/provider-identity.d.mts +90 -0
  590. package/foundation/identity/provider-identity.mjs +320 -0
  591. package/foundation/identity/provider-identity.test.mjs +254 -0
  592. package/foundation/identity/providers.d.mts +7 -0
  593. package/foundation/identity/providers.mjs +16 -0
  594. package/foundation/integrations/autolink.d.mts +58 -1
  595. package/foundation/integrations/autolink.mjs +143 -45
  596. package/foundation/integrations/autolink.test.mjs +1 -1
  597. package/foundation/integrations/cli-requirement.d.mts +45 -0
  598. package/foundation/integrations/cli-requirement.mjs +154 -0
  599. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  600. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  601. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  602. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  603. package/foundation/integrations/contribution-inventory.mjs +27 -24
  604. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  605. package/foundation/integrations/integration-warnings.d.mts +9 -2
  606. package/foundation/integrations/integration-warnings.mjs +52 -21
  607. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  608. package/foundation/integrations/integrations.d.mts +63 -3
  609. package/foundation/integrations/integrations.mjs +122 -9
  610. package/foundation/integrations/integrations.test.mjs +415 -1
  611. package/foundation/integrations/provider-conflicts.test.mjs +125 -0
  612. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  613. package/foundation/integrations/provider-resolution.d.mts +152 -0
  614. package/foundation/integrations/provider-resolution.mjs +576 -0
  615. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  616. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  617. package/foundation/integrations/theme-descriptor.mjs +44 -0
  618. package/foundation/integrations/validate-contributions.d.mts +2 -0
  619. package/foundation/integrations/validate-contributions.mjs +131 -29
  620. package/foundation/response/base.d.ts +8 -4
  621. package/foundation/response/error-codes.d.mts +3 -1
  622. package/foundation/response/error-codes.d.ts +2 -0
  623. package/foundation/response/error-codes.doc.mjs +13 -4
  624. package/foundation/response/error-codes.mjs +8 -2
  625. package/foundation/response/error-codes.test.mjs +137 -10
  626. package/foundation/response/json-contract.test.mjs +57 -17
  627. package/foundation/response/json.d.mts +4 -2
  628. package/foundation/response/json.mjs +8 -10
  629. package/foundation/response/response-types.doc.d.mts +5 -1
  630. package/foundation/response/response-types.doc.mjs +41 -21
  631. package/foundation/response/response-types.doc.test.mjs +158 -0
  632. package/foundation/response/response.doc.mjs +1 -1
  633. package/foundation/text/string-utils.d.mts +8 -0
  634. package/foundation/text/string-utils.mjs +40 -10
  635. package/foundation/xle/expand.d.mts +2 -0
  636. package/foundation/xle/expand.mjs +4 -3
  637. package/foundation/xle/expand.test.mjs +54 -0
  638. package/foundation/xle/xle.test.mjs +13 -0
  639. package/package.json +10 -11
  640. package/assets/templates/themes/manifest.json +0 -95
  641. package/clients/cli/lib/update-check.mjs +0 -83
  642. package/clients/cli/lib/update-check.test.mjs +0 -137
  643. package/clients/cli/update-hint-commands.test.mjs +0 -54
@@ -0,0 +1,53 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {afterEach, beforeEach, describe, expect, it} from 'vitest';
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ import {runCli} from '../../../test-utils/run-cli.mjs';
7
+ import {validateIntegration} from '../../../api/integration/validate-integration.mjs';
8
+
9
+ const NO_MANIFEST = 'No astryx.integration.* found next to package.json.';
10
+
11
+ let tmpDir;
12
+
13
+ beforeEach(() => {
14
+ tmpDir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-doctor-pkgjson-'));
15
+ fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name": "@acme/widgets",}\n');
16
+ fs.writeFileSync(
17
+ path.join(tmpDir, 'astryx.integration.mjs'),
18
+ "export default {\n templates: './templates',\n};\n",
19
+ );
20
+ });
21
+
22
+ afterEach(() => {
23
+ fs.rmSync(tmpDir, {recursive: true, force: true});
24
+ });
25
+
26
+ describe('doctor integration with a malformed package.json', () => {
27
+ it('keeps a null name for the no-manifest case only', async () => {
28
+ const result = await validateIntegration(undefined, {cwd: tmpDir});
29
+
30
+ expect(result.data.name).toBe('(local package)');
31
+ expect(result.data.issues.map(issue => issue.code)).toEqual([
32
+ 'invalid_package_json',
33
+ ]);
34
+ });
35
+
36
+ for (const leaf of ['validate', 'templates', 'components', 'docs']) {
37
+ it(`${leaf} prints the package.json error instead of "no manifest"`, async () => {
38
+ const text = await runCli(['doctor', 'integration', leaf], tmpDir);
39
+ const json = await runCli(
40
+ ['doctor', 'integration', leaf, '--json'],
41
+ tmpDir,
42
+ );
43
+
44
+ expect(text.status).toBe(1);
45
+ expect(json.status).toBe(1);
46
+ expect(text.stdout).not.toContain(NO_MANIFEST);
47
+ expect(text.stdout).toContain('invalid_package_json');
48
+ expect(JSON.parse(json.stdout).data.issues).toContainEqual(
49
+ expect.objectContaining({code: 'invalid_package_json'}),
50
+ );
51
+ });
52
+ }
53
+ });
@@ -2,9 +2,16 @@
2
2
 
3
3
  /**
4
4
  * @file Command-level coverage for `astryx doctor integration` authoring checks.
5
+ * @input Integration fixtures and the post-0.7 conflict projection.
6
+ * @output Assertions for human and typed command responses.
7
+ * @position CLI adapter coverage; 0.6.x API shape is verified separately.
5
8
  */
6
9
 
7
10
  import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
11
+
12
+ vi.mock('../../../foundation/discovery/template-conflict-release.mjs', () => ({
13
+ expandedTemplateConflictSchemaActive: () => true,
14
+ }));
8
15
  import * as fs from 'node:fs';
9
16
  import * as path from 'node:path';
10
17
  import {Command} from 'commander';
@@ -31,6 +38,8 @@ function writeIntegration({
31
38
  id,
32
39
  name = 'Integration template',
33
40
  missingRoot = false,
41
+ replacements,
42
+ type = 'page',
34
43
  }) {
35
44
  fs.writeFileSync(
36
45
  path.join(tmpDir, 'package.json'),
@@ -44,8 +53,8 @@ function writeIntegration({
44
53
  const stem = path.join(tmpDir, 'templates', id);
45
54
  fs.mkdirSync(path.dirname(stem), {recursive: true});
46
55
  fs.writeFileSync(
47
- `${stem}.template.mjs`,
48
- `export default {type: 'page', name: ${JSON.stringify(name)}, description: 'fixture'};\n`,
56
+ `${stem}.doc.mjs`,
57
+ `export default {type: '${type}', name: ${JSON.stringify(name)}, description: 'fixture'${replacements?.[id] == null ? '' : `, replaces: ${JSON.stringify(replacements[id])}`}};\n`,
49
58
  );
50
59
  fs.writeFileSync(
51
60
  `${stem}.tsx`,
@@ -124,7 +133,12 @@ describe('doctor integration — command', () => {
124
133
  return true;
125
134
  });
126
135
 
127
- await createProgram().parseAsync(['node', 'astryx', 'doctor', 'integration']);
136
+ await createProgram().parseAsync([
137
+ 'node',
138
+ 'astryx',
139
+ 'doctor',
140
+ 'integration',
141
+ ]);
128
142
 
129
143
  const output = writes.join('');
130
144
  expect(output).toContain('validate [package]');
@@ -136,7 +150,9 @@ describe('doctor integration — command', () => {
136
150
 
137
151
  it('explains the optional package argument in every leaf help', () => {
138
152
  const program = createProgram();
139
- const doctor = program.commands.find(command => command.name() === 'doctor');
153
+ const doctor = program.commands.find(
154
+ command => command.name() === 'doctor',
155
+ );
140
156
  const integration = doctor?.commands.find(
141
157
  command => command.name() === 'integration',
142
158
  );
@@ -152,7 +168,10 @@ describe('doctor integration — command', () => {
152
168
  });
153
169
 
154
170
  it('templates explains how to check an installed package when no local manifest exists', async () => {
155
- fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({name: 'plain'}));
171
+ fs.writeFileSync(
172
+ path.join(tmpDir, 'package.json'),
173
+ JSON.stringify({name: 'plain'}),
174
+ );
156
175
  process.chdir(tmpDir);
157
176
 
158
177
  await createProgram().parseAsync([
@@ -239,6 +258,71 @@ describe('doctor integration — command', () => {
239
258
  expect(process.exitCode).toBeUndefined();
240
259
  });
241
260
 
261
+ it('templates reports an intentional replacement and the Core-original command', async () => {
262
+ const core = (await discoverCoreTemplates()).find(
263
+ template => template.type === 'page',
264
+ );
265
+ expect(core).toBeDefined();
266
+ writeIntegration({
267
+ id: 'acme-app-shell',
268
+ type: core.type,
269
+ replacements: {'acme-app-shell': core.dirName},
270
+ });
271
+ process.chdir(tmpDir);
272
+
273
+ await createProgram().parseAsync([
274
+ 'node',
275
+ 'astryx',
276
+ '--json',
277
+ 'doctor',
278
+ 'integration',
279
+ 'templates',
280
+ ]);
281
+
282
+ const parsed = JSON.parse(logCalls.join('\n'));
283
+ expect(parsed.data.issues).toEqual([]);
284
+ expect(parsed.data.conflicts).toEqual([
285
+ expect.objectContaining({
286
+ id: 'acme-app-shell',
287
+ relationship: 'replaces',
288
+ replaces: core.dirName,
289
+ severity: 'info',
290
+ }),
291
+ ]);
292
+ expect(parsed.data.conflicts[0].command).toContain(
293
+ `--package @astryxdesign/core`,
294
+ );
295
+ expect(process.exitCode).toBeUndefined();
296
+ });
297
+
298
+ it('templates exits 1 for a missing replacement target', async () => {
299
+ writeIntegration({
300
+ id: 'acme-app-shell',
301
+ replacements: {'acme-app-shell': 'missing-core-shell'},
302
+ });
303
+ process.chdir(tmpDir);
304
+
305
+ await createProgram().parseAsync([
306
+ 'node',
307
+ 'astryx',
308
+ '--json',
309
+ 'doctor',
310
+ 'integration',
311
+ 'templates',
312
+ ]);
313
+
314
+ const parsed = JSON.parse(logCalls.join('\n'));
315
+ expect(parsed.data.issues).toEqual(
316
+ expect.arrayContaining([
317
+ expect.objectContaining({
318
+ code: 'missing_template_replacement_target',
319
+ severity: 'error',
320
+ }),
321
+ ]),
322
+ );
323
+ expect(process.exitCode).toBe(1);
324
+ });
325
+
242
326
  it('templates exits 1 when structural errors prevent a trustworthy check', async () => {
243
327
  writeIntegration({missingRoot: true});
244
328
  process.chdir(tmpDir);
@@ -278,9 +362,7 @@ describe('doctor integration — command', () => {
278
362
  const output = logCalls.join('\n');
279
363
  expect(output).toContain('[warn]');
280
364
  expect(output).toContain(core.name);
281
- expect(output).toContain(
282
- `component ${core.name} --package @acme/widgets`,
283
- );
365
+ expect(output).toContain(`component ${core.name} --package @acme/widgets`);
284
366
  expect(process.exitCode).toBeUndefined();
285
367
  });
286
368
 
@@ -12,7 +12,7 @@ export const doc = {
12
12
  type: 'command',
13
13
  name: 'doctor',
14
14
  displayName: 'astryx doctor',
15
- namespace: 'cli',
15
+ namespace: 'cli/commands',
16
16
  summary: 'Diagnose Astryx projects and integration packages',
17
17
  description:
18
18
  'Runs read-only project health diagnostics by default: Node version, @astryxdesign/core ' +
@@ -3,7 +3,12 @@
3
3
  /**
4
4
  * @file `astryx doctor` project health and integration-authoring diagnostics.
5
5
  * Human output uses plain stable tokens; every leaf also has a typed JSON
6
- * response. Exit 1 means a check found an error, while warnings remain exit 0.
6
+ * response. Template-conflict fields follow the package release boundary.
7
+ * Exit 1 means a check found an error, while warnings remain exit 0.
8
+ *
9
+ * @input Typed Doctor and integration-authoring API responses.
10
+ * @output Human-readable records or pass-through typed JSON.
11
+ * @position CLI presentation adapter for project and integration health.
7
12
  */
8
13
 
9
14
  import {runChecks} from '../../../api/doctor/doctor.mjs';
@@ -17,7 +22,7 @@ import {
17
22
  validateIntegration,
18
23
  } from '../../../api/integration/validate-integration.mjs';
19
24
  import {jsonOut} from '../../../foundation/response/json.mjs';
20
- import {emit, section, records, text} from '../formatters/index.mjs';
25
+ import {emit, section, record, records, text} from '../formatters/index.mjs';
21
26
  import {defineCommand} from '../lib/define-command.mjs';
22
27
  import {doc as doctorCommand} from './doctor.doc.mjs';
23
28
  import {doc as doctorIntegrationGroup} from './doctor-integration.doc.mjs';
@@ -55,7 +60,7 @@ function integrationLabel(data) {
55
60
  * @param {import('../../../api/doctor/doctor.mjs').DoctorReport} report
56
61
  */
57
62
  function printHuman(report) {
58
- const {pass, warn, fail, info} = report.summary;
63
+ const {warn, fail} = report.summary;
59
64
  const closing =
60
65
  fail > 0
61
66
  ? 'Some checks failed. Address the items marked [fail] above.'
@@ -63,18 +68,15 @@ function printHuman(report) {
63
68
  ? 'No failures — but review the [warn] warnings above when you can.'
64
69
  : 'All checks passed. Your Astryx setup looks healthy.';
65
70
 
71
+ // Field names are the JSON keys, so text and --json map one to one.
66
72
  emit(
67
73
  section('astryx doctor — diagnosing your setup'),
68
74
  records(report.checks, {
69
- fields: ['status', 'label', 'message', 'fix'],
70
- labels: {label: 'check'},
75
+ fields: ['id', 'status', 'label', 'message', 'fix'],
71
76
  format: {status: statusToken},
72
77
  }),
73
- text(
74
- `Summary: ${pass} passed, ${warn} warning${warn === 1 ? '' : 's'}, ` +
75
- `${fail} failure${fail === 1 ? '' : 's'}` +
76
- (info ? `, ${info} info` : ''),
77
- ),
78
+ section('summary'),
79
+ record(report.summary, {fields: ['pass', 'warn', 'fail', 'info']}),
78
80
  text(closing),
79
81
  );
80
82
  }
@@ -128,25 +130,41 @@ function printTemplateConflicts(data) {
128
130
  ),
129
131
  ...issueBlocks(data.issues),
130
132
  ];
131
- if (data.conflicts.length === 0) {
133
+ if (data.conflicts.length === 0 && data.issues.length === 0) {
132
134
  output.push(text('[ok] No template ids conflict with Core.'));
133
- } else {
135
+ } else if (data.conflicts.length > 0) {
136
+ const expanded = data.conflicts.some(
137
+ conflict => 'relationship' in conflict,
138
+ );
134
139
  output.push(
135
140
  records(data.conflicts, {
136
- fields: [
137
- 'severity',
138
- 'id',
139
- 'integrationPackage',
140
- 'integrationType',
141
- 'integrationName',
142
- 'message',
143
- 'command',
144
- ],
141
+ fields: expanded
142
+ ? [
143
+ 'severity',
144
+ 'relationship',
145
+ 'id',
146
+ 'replaces',
147
+ 'integrationPackage',
148
+ 'integrationType',
149
+ 'integrationName',
150
+ 'message',
151
+ 'command',
152
+ ]
153
+ : [
154
+ 'severity',
155
+ 'id',
156
+ 'integrationPackage',
157
+ 'integrationType',
158
+ 'integrationName',
159
+ 'message',
160
+ 'command',
161
+ ],
145
162
  format: {severity: statusToken},
146
163
  }),
147
164
  text(
148
- `${data.conflicts.length} Core template conflict(s). ` +
149
- 'Renaming is recommended but optional; keep the package-qualified command if the overlap is intentional.',
165
+ expanded
166
+ ? `${data.conflicts.length} Core template relationship(s).`
167
+ : `${data.conflicts.length} Core template conflict(s). Renaming is recommended but optional; keep the package-qualified command if the overlap is intentional.`,
150
168
  ),
151
169
  );
152
170
  }
@@ -168,7 +186,13 @@ function printComponentConflicts(data) {
168
186
  } else {
169
187
  output.push(
170
188
  records(data.conflicts, {
171
- fields: ['severity', 'name', 'integrationPackage', 'message', 'command'],
189
+ fields: [
190
+ 'severity',
191
+ 'name',
192
+ 'integrationPackage',
193
+ 'message',
194
+ 'command',
195
+ ],
172
196
  format: {severity: statusToken},
173
197
  }),
174
198
  text(
@@ -190,6 +214,15 @@ function printDocConflicts(data) {
190
214
  ),
191
215
  ...issueBlocks(data.issues),
192
216
  ];
217
+ if (
218
+ !data.issues.some(
219
+ issue => issue.severity === 'error' || issue.code === 'invalid_doc_graph',
220
+ )
221
+ ) {
222
+ output.push(
223
+ text('[ok] The docs tree and every link in these docs check out.'),
224
+ );
225
+ }
193
226
  if (data.findings.length === 0) {
194
227
  output.push(text('[ok] No doc topics overlap with Core.'));
195
228
  } else {
@@ -275,7 +308,8 @@ async function runAuthoringCheck(program, pkg, kind) {
275
308
  const structuralErrors = summarizeIssues(result.data.issues).errors;
276
309
  const docErrors =
277
310
  result.type === 'integration.doc-conflicts'
278
- ? result.data.findings.filter(finding => finding.severity === 'error').length
311
+ ? result.data.findings.filter(finding => finding.severity === 'error')
312
+ .length
279
313
  : 0;
280
314
  if (structuralErrors > 0 || docErrors > 0) process.exitCode = 1;
281
315
  return NO_RESULT_SET;
@@ -290,13 +324,6 @@ export function registerDoctor(program) {
290
324
  fn: doctorFn,
291
325
  action: async () => runProjectDoctor(program),
292
326
  });
293
- doctorCmd.addHelpText(
294
- 'after',
295
- '\nExit code:\n' +
296
- ' 0 no failures (warnings are allowed) — safe as a CI gate\n' +
297
- ' 1 one or more checks failed\n',
298
- );
299
-
300
327
  /** @type {import('commander').Command} */
301
328
  let integrationCmd;
302
329
  integrationCmd = defineCommand(doctorCmd, doctorIntegrationGroup, {
@@ -354,3 +354,45 @@ describe('doctor — command', () => {
354
354
  }
355
355
  });
356
356
  });
357
+
358
+ describe('doctor — text output mirrors the JSON', () => {
359
+ /** @param {string} line */
360
+ const field = line => /^(\w+):\s+(.*)$/.exec(line)?.slice(1) ?? [line, ''];
361
+
362
+ it('prints every check and summary field under its JSON key', async () => {
363
+ const prevCwd = process.cwd();
364
+ const prevExit = process.exitCode;
365
+ process.chdir(tmpDir);
366
+ try {
367
+ await createProgram().parseAsync(['node', 'astryx', '--json', 'doctor']);
368
+ const {checks, summary} = JSON.parse(logCalls.join('\n')).data;
369
+ logCalls = [];
370
+ await createProgram().parseAsync(['node', 'astryx', 'doctor']);
371
+ const blocks = logCalls
372
+ .join('\n')
373
+ .split(/\n{2,}/)
374
+ .map(block => block.split('\n').map(field));
375
+
376
+ for (const check of checks) {
377
+ const block = blocks.find(fields =>
378
+ fields.some(([key, value]) => key === 'id' && value === check.id),
379
+ );
380
+ expect(block, `no text record for check ${check.id}`).toBeDefined();
381
+ expect(
382
+ /** @type {string[][]} */ (block).map(([key]) => key).sort(),
383
+ ).toEqual(Object.keys(check).sort());
384
+ }
385
+
386
+ const heading = blocks.findIndex(
387
+ fields => fields.length === 1 && fields[0][0] === 'summary',
388
+ );
389
+ expect(heading, 'no summary section').toBeGreaterThan(-1);
390
+ expect(blocks[heading + 1]).toEqual(
391
+ Object.entries(summary).map(([key, count]) => [key, String(count)]),
392
+ );
393
+ } finally {
394
+ process.chdir(prevCwd);
395
+ process.exitCode = prevExit;
396
+ }
397
+ }, 60_000);
398
+ });
@@ -10,27 +10,37 @@ export const doc = {
10
10
  type: 'command',
11
11
  name: 'gap-report',
12
12
  displayName: 'astryx gap-report',
13
- namespace: 'cli',
13
+ namespace: 'cli/commands',
14
14
  summary: 'Route a design-system gap to its owning package',
15
15
  description:
16
16
  'Reports a missing component, variant, layout, styling, accessibility, API, or documentation capability. The command selects an explicit package first, then a unique component owner, then Core. The report fans out to every effective handler: project config first, then each loaded integration in config order. Public handlers require --confirm-public per handler; internal handlers always run. A handler failure is isolated and does not prevent later handlers.',
17
17
  fn: 'gapReport',
18
- args: [{name: 'component', param: 'component', required: false}],
18
+ args: [
19
+ {
20
+ name: 'component',
21
+ param: 'component',
22
+ required: false,
23
+ description:
24
+ 'Component or design-system area the gap is about, up to 120 characters. Required unless --list-categories is set.',
25
+ },
26
+ ],
19
27
  options: [
20
28
  {
21
29
  flag: '--category <category>',
22
30
  param: 'options.category',
23
- description: 'Gap category (run --list-categories for values)',
31
+ description:
32
+ 'Gap category (run --list-categories for values). Required unless --list-categories is set.',
24
33
  },
25
34
  {
26
35
  flag: '--reason <reason>',
27
36
  param: 'options.reason',
28
- description: 'What capability was missing or difficult',
37
+ description:
38
+ 'What capability was missing or difficult, up to 2000 characters. Required unless --list-categories is set.',
29
39
  },
30
40
  {
31
41
  flag: '--additional-context <text>',
32
42
  param: 'options.detail',
33
- description: 'Optional additional context',
43
+ description: 'Optional additional context, up to 8000 characters',
34
44
  },
35
45
  {
36
46
  flag: '--package <pkg>',
@@ -45,7 +55,8 @@ export const doc = {
45
55
  {
46
56
  flag: '--list-categories',
47
57
  param: 'options.listCategories',
48
- description: 'List valid report categories without filing',
58
+ description:
59
+ 'List valid report categories without filing; the component and the other gap-report options are ignored',
49
60
  },
50
61
  ],
51
62
  examples: [
@@ -196,3 +196,75 @@ export default {};\n`,
196
196
  });
197
197
  });
198
198
  });
199
+
200
+ describe('gap-report control docs', () => {
201
+ const REQUIRED = 'Required unless --list-categories is set.';
202
+
203
+ it('help and manifest say which inputs are required and how long they may be', async () => {
204
+ const help = await runCli(['gap-report', '--help']);
205
+ expect(help.status).toBe(0);
206
+ const manifest = JSON.parse((await runCli(['manifest', '--json'])).stdout);
207
+ const entry = manifest.data.commands.find(
208
+ (/** @type {{name: string}} */ command) => command.name === 'gap-report',
209
+ );
210
+ /** @param {string} flag @returns {string} */
211
+ const option = flag =>
212
+ entry.options.find(
213
+ (/** @type {{flag: string}} */ item) => item.flag.split(' ')[0] === flag,
214
+ )?.description ?? '';
215
+ const component = entry.arguments[0].description;
216
+
217
+ for (const text of [component, option('--category'), option('--reason')]) {
218
+ expect(text).toContain(REQUIRED);
219
+ expect(help.stdout).toContain(text);
220
+ }
221
+ expect(option('--list-categories')).toContain(
222
+ 'the component and the other gap-report options are ignored',
223
+ );
224
+
225
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-gap-limits-'));
226
+ try {
227
+ fs.writeFileSync(
228
+ path.join(cwd, 'package.json'),
229
+ JSON.stringify({name: 'fixture-app'}),
230
+ );
231
+ const base = {cwd, category: /** @type {const} */ ('docs_gap'), reason: 'x'};
232
+ /** @type {Array<[string, (value: string) => Promise<unknown>]>} */
233
+ const limits = [
234
+ [component, value => gapReport(value, base)],
235
+ [option('--reason'), value => gapReport('Button', {...base, reason: value})],
236
+ [
237
+ option('--additional-context'),
238
+ value => gapReport('Button', {...base, detail: value}),
239
+ ],
240
+ ];
241
+ for (const [text, call] of limits) {
242
+ const limit = Number(/up to (\d+) characters/.exec(text)?.[1]);
243
+ expect(limit, text).toBeGreaterThan(0);
244
+ await expect(call('x'.repeat(limit))).resolves.toMatchObject({
245
+ type: 'gap-report.file',
246
+ });
247
+ await expect(call('x'.repeat(limit + 1))).rejects.toMatchObject({
248
+ code: 'ERR_INVALID_ARGUMENT',
249
+ });
250
+ }
251
+ } finally {
252
+ fs.rmSync(cwd, {recursive: true, force: true});
253
+ }
254
+ });
255
+
256
+ it('enforces the documented requirement', async () => {
257
+ for (const [component, options] of [
258
+ [undefined, {category: 'docs_gap', reason: 'x'}],
259
+ ['Button', {reason: 'x'}],
260
+ ['Button', {category: 'docs_gap'}],
261
+ ]) {
262
+ await expect(gapReport(component, options)).rejects.toMatchObject({
263
+ code: 'ERR_MISSING_ARGUMENT',
264
+ });
265
+ }
266
+ await expect(
267
+ gapReport(undefined, {listCategories: true, category: 'not_real', package: 'nope'}),
268
+ ).resolves.toMatchObject({type: 'gap-report.categories'});
269
+ });
270
+ });
@@ -20,7 +20,6 @@ import {defineCommand} from '../../lib/define-command.mjs';
20
20
  import {resultSet} from '../../../../foundation/debug/index.mjs';
21
21
  import {ERROR_CODES} from '../../../../foundation/response/error-codes.mjs';
22
22
  import {hook as hookApi} from '../../../../api/hook/hook.mjs';
23
- import {findRelatedBlocks} from '../../../../api/template/template.mjs';
24
23
  import {doc as hookCommand} from '../hook.doc.mjs';
25
24
  import {doc as hookFn} from '../../../../api/hook/hook.doc.mjs';
26
25
 
@@ -169,24 +168,15 @@ export function registerHook(program) {
169
168
  )
170
169
  : formatHookFull(result.data);
171
170
 
172
- // Show related block templates from relatedComponents
173
- const relatedComps = result.data.relatedComponents || [];
174
- /** @type {import('../../../../api/template/template.mjs').DiscoveredTemplate[]} */
175
- const allBlocks = [];
176
- for (const comp of relatedComps) {
177
- const blocks = await findRelatedBlocks(comp);
178
- for (const b of blocks) {
179
- if (!allBlocks.some(existing => existing.dirName === b.dirName)) {
180
- allBlocks.push(b);
181
- }
182
- }
183
- }
184
-
171
+ // Text projects the envelope only. Block templates are JSON-backed
172
+ // under `component <name> --blocks`.
173
+ const related = result.data.relatedComponents ?? [];
185
174
  emit(
186
175
  code(doc),
187
- allBlocks.length > 0 && section('Related block templates'),
188
- allBlocks.length > 0 &&
189
- records(allBlocks, {fields: ['dirName', 'description']}),
176
+ related.length > 0 &&
177
+ text(
178
+ `Block templates: ${run} component <name> --blocks for ${related.join(', ')}`,
179
+ ),
190
180
  );
191
181
  break;
192
182
  }
@@ -12,7 +12,7 @@ export const doc = {
12
12
  type: 'command',
13
13
  name: 'hook',
14
14
  displayName: 'astryx hook',
15
- namespace: 'cli',
15
+ namespace: 'cli/commands',
16
16
  summary: 'List hooks or print hook docs',
17
17
  description:
18
18
  'Resolves a hook by name and prints its authored doc, or lists the catalog grouped ' +
@@ -0,0 +1,45 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file `astryx hook <name>` text is a projection of `hook.detail`: it shows
5
+ * nothing the JSON envelope does not carry.
6
+ */
7
+
8
+ import {describe, it, expect} from 'vitest';
9
+ import {runCli} from '../../../test-utils/run-cli.mjs';
10
+ import {findRelatedBlocks} from '../../../api/template/template.mjs';
11
+
12
+ const HOOK = 'useAnnounce';
13
+
14
+ describe('hook detail text projection', () => {
15
+ it('prints no block templates that the JSON envelope lacks', async () => {
16
+ const json = await runCli(['--json', 'hook', HOOK]);
17
+ expect(json.status).toBe(0);
18
+ const envelope = JSON.parse(json.stdout);
19
+ expect(envelope.type).toBe('hook.detail');
20
+ const related = envelope.data.relatedComponents;
21
+ expect(related.length).toBeGreaterThan(0);
22
+
23
+ const blockNames = [];
24
+ for (const component of related) {
25
+ for (const block of await findRelatedBlocks(component)) {
26
+ blockNames.push(block.dirName);
27
+ }
28
+ }
29
+ expect(blockNames.length).toBeGreaterThan(0);
30
+
31
+ const text = await runCli(['hook', HOOK]);
32
+ expect(text.status).toBe(0);
33
+ const shownButNotInJson = blockNames.filter(
34
+ name => text.stdout.includes(name) && !json.stdout.includes(name),
35
+ );
36
+ expect(shownButNotInJson).toEqual([]);
37
+ });
38
+
39
+ it('points at the JSON-backed block lookup for each related component', async () => {
40
+ const text = await runCli(['hook', HOOK]);
41
+ expect(text.stdout).toMatch(/component <name> --blocks/);
42
+ expect(text.stdout).toContain('VisuallyHidden');
43
+ expect(text.stdout).toContain('Toast');
44
+ });
45
+ });