@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
@@ -13,7 +13,7 @@ export const doc = {
13
13
  type: 'command',
14
14
  name: 'theme add',
15
15
  displayName: 'astryx theme add',
16
- namespace: 'cli',
16
+ namespace: 'cli/commands',
17
17
  summary: 'Scaffold a theme into your project as editable source',
18
18
  description:
19
19
  "Copies a bundled or installed integration theme's source into your project so you own it. " +
@@ -28,7 +28,8 @@ export const doc = {
28
28
  {
29
29
  flag: '-f, --overwrite',
30
30
  param: 'options.overwrite',
31
- description: 'Overwrite existing files without prompting',
31
+ description:
32
+ 'Replace existing files. Without it, existing files fail the command with ERR_FILE_EXISTS and nothing is written',
32
33
  },
33
34
  {flag: '--list', description: 'List available themes'},
34
35
  {
@@ -48,7 +49,7 @@ export const doc = {
48
49
  {code: 0, when: 'success'},
49
50
  {
50
51
  code: 1,
51
- when: 'unknown or ambiguous theme, a path escape, a missing catalog file, or an existing file without --overwrite',
52
+ when: 'unknown or ambiguous theme, a path escape, a missing descriptor or source, or an existing file without --overwrite',
52
53
  },
53
54
  ],
54
55
  related: ['theme list', 'theme build'],
@@ -13,7 +13,7 @@ export const doc = {
13
13
  type: 'command',
14
14
  name: 'theme build',
15
15
  displayName: 'astryx theme build',
16
- namespace: 'cli',
16
+ namespace: 'cli/commands',
17
17
  summary: 'Compile standalone themes or one keyed theme family',
18
18
  description:
19
19
  'Compiles defineTheme() sources through the same theme pipeline into scoped CSS, ' +
@@ -28,34 +28,35 @@ export const doc = {
28
28
  {
29
29
  flag: '--family',
30
30
  description:
31
- 'Build the selected extension family into one keyed CSS, JS, and declaration set',
31
+ 'Build the selected extension family into one keyed CSS, JS, and declaration set. Requires --family-key; refused with --out or --watch (ERR_THEME_INVALID)',
32
32
  },
33
33
  {
34
34
  flag: '--family-key <key>',
35
35
  description:
36
- 'Lower-kebab filename stem required with --family; must differ from every member name',
36
+ 'Lower-kebab filename stem required with --family and refused without it; must differ from every member name (ERR_THEME_INVALID)',
37
37
  },
38
38
  {
39
39
  flag: '-o, --out <path>',
40
40
  param: 'options.out',
41
- description: 'Output CSS file path (single theme only)',
41
+ description:
42
+ 'Output CSS file path; the .js and .d.ts are written beside it (default: <theme name>.css next to the source). A relative path must stay inside the working directory. Single theme only: refused with more than one file or with --family (ERR_THEME_INVALID)',
42
43
  },
43
44
  {
44
45
  flag: '--icons-specifier <specifier>',
45
46
  param: 'options.iconsSpecifier',
46
47
  description:
47
- 'Override the icon-registry import in the generated JS module (for example, ./icons.mjs)',
48
+ "Override the icon-registry import in the generated JS module, for example ./icons.mjs (default: the specifier in the theme source's own import). With --family it applies to every member's icon import",
48
49
  },
49
50
  {
50
51
  flag: '-w, --watch',
51
52
  description:
52
- 'Rebuild automatically when a theme file changes (Ctrl-C to stop)',
53
+ 'Rebuild automatically when a theme file changes (Ctrl-C to stop). Refused with --check, --family, or --json (ERR_THEME_INVALID)',
53
54
  },
54
55
  {
55
56
  flag: '-c, --check',
56
57
  param: 'options.check',
57
58
  description:
58
- 'Verify the committed outputs match the source without writing; exit non-zero if stale',
59
+ 'Verify the committed outputs match the source without writing; exit non-zero if stale. Composes with --family and several files; refused with --watch (ERR_THEME_INVALID)',
59
60
  },
60
61
  ],
61
62
  examples: [
@@ -13,7 +13,7 @@ export const doc = {
13
13
  type: 'command',
14
14
  name: 'theme list',
15
15
  displayName: 'astryx theme list',
16
- namespace: 'cli',
16
+ namespace: 'cli/commands',
17
17
  summary: 'List themes available to add',
18
18
  description:
19
19
  'Lists themes bundled with this CLI and source themes contributed by installed integrations, ' +
@@ -37,7 +37,7 @@ export const doc = {
37
37
  {code: 0, when: 'success'},
38
38
  {
39
39
  code: 1,
40
- when: 'the bundled-theme manifest or an installed theme catalog cannot be read',
40
+ when: 'a bundled or installed theme descriptor cannot be read',
41
41
  },
42
42
  ],
43
43
  related: ['theme add', 'theme build'],
@@ -5,7 +5,7 @@ export const doc = {
5
5
  type: 'command',
6
6
  name: 'theme palette generate',
7
7
  displayName: 'astryx theme palette generate',
8
- namespace: 'cli',
8
+ namespace: 'cli/commands',
9
9
  summary: 'Generate an OKLCH palette candidate for human review',
10
10
  description:
11
11
  'Reads an explicit JSON request and runs the versioned astryx-oklch-v1 recipe. ' +
@@ -18,7 +18,11 @@ export const doc = {
18
18
  'Without --out it prints a preview. With --out it writes a candidate file and detached ' +
19
19
  'receipt. --preview writes a standardized, self-contained HTML review artifact. ' +
20
20
  'TypeScript output is directly importable and contains no generator dependency. ' +
21
- 'JSON is also supported. Existing author-owned files are left untouched unless --overwrite is explicit.',
21
+ 'JSON is also supported. Existing author-owned files are left untouched unless --overwrite is explicit. ' +
22
+ 'When used in a theme integration, keep the palette request under the theme slug, ' +
23
+ 'write the candidate and receipt under that same slug, import the candidate from the theme source, ' +
24
+ 'and keep all three inside the theme directory: `astryx theme add` copies that whole ' +
25
+ 'directory into the consumer project, so nothing else has to list them.',
22
26
  fn: 'themePaletteGenerate',
23
27
  args: [{name: 'config', param: 'configPath', required: true}],
24
28
  options: [
@@ -42,15 +46,15 @@ export const doc = {
42
46
  examples: [
43
47
  {
44
48
  label: 'Preview candidate JSON',
45
- cli: 'astryx theme palette generate palette.config.json',
49
+ cli: 'astryx theme palette generate themes/ocean/palette.config.json',
46
50
  },
47
51
  {
48
52
  label: 'Write candidate and receipt',
49
- cli: 'astryx theme palette generate palette.config.json --out ocean.palette.ts',
53
+ cli: 'astryx theme palette generate themes/ocean/palette.config.json --out themes/ocean/tokens/ocean.palette.ts',
50
54
  },
51
55
  {
52
56
  label: 'Write candidate, receipt, and review preview',
53
- cli: 'astryx theme palette generate palette.config.json --out ocean.palette.ts --preview ocean.palette.html',
57
+ cli: 'astryx theme palette generate themes/ocean/palette.config.json --out themes/ocean/tokens/ocean.palette.ts --preview themes/ocean/tokens/ocean.palette.html',
54
58
  },
55
59
  ],
56
60
  exitCodes: [
@@ -132,4 +132,23 @@ describe('astryx theme palette generate', () => {
132
132
  code: 'ERR_PALETTE_GENERATION',
133
133
  });
134
134
  });
135
+
136
+ it('returns ERR_WRITE_FAILED for an output path it cannot use', async () => {
137
+ fs.writeFileSync(path.join(temporaryDirectory, 'blocker'), '');
138
+ const {status, stdout} = await runCli(
139
+ [
140
+ '--json',
141
+ 'theme',
142
+ 'palette',
143
+ 'generate',
144
+ 'palette.config.json',
145
+ '--out',
146
+ 'blocker/ocean.palette.ts',
147
+ ],
148
+ {cwd: temporaryDirectory},
149
+ );
150
+
151
+ expect(status).toBe(1);
152
+ expect(JSON.parse(stdout)).toMatchObject({code: 'ERR_WRITE_FAILED'});
153
+ });
135
154
  });
@@ -5,7 +5,7 @@ export const doc = {
5
5
  type: 'command',
6
6
  name: 'theme palette',
7
7
  displayName: 'astryx theme palette',
8
- namespace: 'cli',
8
+ namespace: 'cli/commands',
9
9
  summary: 'Create and work with theme-owned color palettes',
10
10
  description:
11
11
  'Palette authoring tools. The initial generate command creates reviewable candidates. ' +
@@ -17,8 +17,9 @@ describe('astryx theme targets', () => {
17
17
  const {status, stdout} = await runCli(['theme', 'targets', 'Switch']);
18
18
 
19
19
  expect(status).toBe(0);
20
- expect(stdout).toMatch(/^switch\s+Switch\s+size\s+checked, disabled$/m);
21
- expect(stdout).toMatch(/^switch-thumb\s+Switch\s+size\s+checked$/m);
20
+ // Inline layout: key component - props - states - className
21
+ expect(stdout).toMatch(/^switch\s+Switch - size - checked, disabled - astryx-switch$/m);
22
+ expect(stdout).toMatch(/^switch-thumb\s+Switch - size - checked - astryx-switch-thumb$/m);
22
23
  expect(stdout).toMatch(/4 across 1 component/);
23
24
  });
24
25
 
@@ -28,7 +29,7 @@ describe('astryx theme targets', () => {
28
29
  expect(status).toBe(0);
29
30
  expect(stdout).toMatch(/^popover\s{2,}Popover/m);
30
31
  expect(stdout).toMatch(
31
- /^popover-surface \[deprecated; use popover\]\s{2,}Popover/m,
32
+ /^popover-surface\s{2,}Popover - astryx-popover-surface - deprecated; use popover$/m,
32
33
  );
33
34
  });
34
35
 
@@ -13,7 +13,7 @@ export const doc = {
13
13
  type: 'command',
14
14
  name: 'theme targets',
15
15
  displayName: 'astryx theme targets',
16
- namespace: 'cli',
16
+ namespace: 'cli/commands',
17
17
  summary: 'List the component theming targets a theme can override',
18
18
  description:
19
19
  'Prints every `defineTheme` components key across the system: the stable class it paints, ' +
@@ -82,4 +82,16 @@ describe('astryx theme template', () => {
82
82
  expect(stderr).toMatch(/outside the project root/);
83
83
  expect(fs.existsSync(path.join(path.dirname(tmpDir), 'escaped.ts'))).toBe(false);
84
84
  });
85
+
86
+ it('fails a write with ERR_WRITE_FAILED under --json', async () => {
87
+ fs.writeFileSync(path.join(tmpDir, 'blocker'), '');
88
+
89
+ const {status, stdout} = await runCli(
90
+ ['--json', 'theme', 'template', 'blocker/theme.ts'],
91
+ {cwd: tmpDir},
92
+ );
93
+
94
+ expect(status).toBe(1);
95
+ expect(JSON.parse(stdout).code).toBe('ERR_WRITE_FAILED');
96
+ });
85
97
  });
@@ -13,7 +13,7 @@ export const doc = {
13
13
  type: 'command',
14
14
  name: 'theme template',
15
15
  displayName: 'astryx theme template',
16
- namespace: 'cli',
16
+ namespace: 'cli/commands',
17
17
  summary: 'Write the annotated theme template into your project',
18
18
  description:
19
19
  'Writes theme.template.ts: the annotated reference for the whole theme surface, covering every ' +
@@ -36,7 +36,7 @@ export const doc = {
36
36
  ],
37
37
  exitCodes: [
38
38
  {code: 0, when: 'success, including when an existing file was left untouched'},
39
- {code: 1, when: 'the target path escapes the project'},
39
+ {code: 1, when: 'the target path escapes the project, or the file cannot be written'},
40
40
  ],
41
41
  related: ['theme add', 'theme list', 'theme build'],
42
42
  };
@@ -12,7 +12,7 @@ export const doc = {
12
12
  type: 'command',
13
13
  name: 'theme',
14
14
  displayName: 'astryx theme',
15
- namespace: 'cli',
15
+ namespace: 'cli/commands',
16
16
  summary: 'Theme tools: build, export, and manage themes',
17
17
  description:
18
18
  'The theme command group. Running astryx theme with no subcommand prints the ' +
@@ -0,0 +1,87 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file `astryx upgrade` human output is plain ASCII on every path: the codemod
5
+ * list, up to date, an empty range, a dry run, and an apply that runs a
6
+ * post-codemod hook and refreshes the agent docs.
7
+ */
8
+
9
+ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
10
+ import * as fs from 'node:fs';
11
+ import * as path from 'node:path';
12
+ import {runCli} from '../../../test-utils/run-cli.mjs';
13
+ import {generateCompressedIndex} from '../../../foundation/agent-docs/agent-docs.mjs';
14
+
15
+ const NON_ASCII = /[\u0080-\uFFFF]/;
16
+
17
+ let tmpDir;
18
+
19
+ /** @param {string} rel @param {string} body */
20
+ function write(rel, body) {
21
+ const file = path.join(tmpDir, rel);
22
+ fs.mkdirSync(path.dirname(file), {recursive: true});
23
+ fs.writeFileSync(file, body);
24
+ }
25
+
26
+ /**
27
+ * Output lines (stdout and stderr) that contain a non-ASCII character.
28
+ * @param {string[]} args
29
+ */
30
+ async function nonAsciiLines(args) {
31
+ const r = await runCli(args, {cwd: tmpDir});
32
+ expect(r.status).toBe(0);
33
+ return `${r.stdout}\n${r.stderr}`
34
+ .split('\n')
35
+ .filter(line => NON_ASCII.test(line));
36
+ }
37
+
38
+ beforeEach(() => {
39
+ // Repo-local so the config module can be imported under Vitest.
40
+ tmpDir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-upgrade-ascii-'));
41
+ write('package.json', JSON.stringify({name: 'consumer', private: true}));
42
+ write(
43
+ 'node_modules/@astryxdesign/core/package.json',
44
+ JSON.stringify({name: '@astryxdesign/core', version: '0.6.0'}),
45
+ );
46
+ write(
47
+ 'src/panel.tsx',
48
+ "import {useResizable} from '@astryxdesign/core';\n" +
49
+ 'export const usePanel = () => useResizable({defaultSize: 250, minSizePx: 200});\n',
50
+ );
51
+ });
52
+
53
+ afterEach(() => {
54
+ fs.rmSync(tmpDir, {recursive: true, force: true});
55
+ });
56
+
57
+ describe('upgrade human output is ASCII', () => {
58
+ it('lists codemods', async () => {
59
+ expect(await nonAsciiLines(['upgrade', '--list'])).toEqual([]);
60
+ });
61
+
62
+ it('reports up to date and a missing agent-docs block', async () => {
63
+ expect(await nonAsciiLines(['upgrade', '--from', '0.6.0'])).toEqual([]);
64
+ });
65
+
66
+ it('reports a range with no codemods', async () => {
67
+ expect(
68
+ await nonAsciiLines(['upgrade', '--from', '0.6.0', '--force']),
69
+ ).toEqual([]);
70
+ });
71
+
72
+ it('previews and applies codemods, runs a hook, and refreshes agent docs', async () => {
73
+ write(
74
+ 'astryx.config.mjs',
75
+ `export default {hooks: {postCodemod: [{name: 'noop', buildCommand: () => ({command: ${JSON.stringify(process.execPath)}, args: ['-e', '0']})}]}};\n`,
76
+ );
77
+ write('AGENTS.md', `# Agents\n\n${generateCompressedIndex('0.5.0')}\n`);
78
+
79
+ expect(await nonAsciiLines(['upgrade', '--from', '0.5.0'])).toEqual([]);
80
+ expect(
81
+ await nonAsciiLines(['upgrade', '--from', '0.5.0', '--apply']),
82
+ ).toEqual([]);
83
+ expect(fs.readFileSync(path.join(tmpDir, 'src/panel.tsx'), 'utf8')).toContain(
84
+ 'minSize: 200',
85
+ );
86
+ });
87
+ });
@@ -12,13 +12,14 @@ export const doc = {
12
12
  type: 'command',
13
13
  name: 'upgrade',
14
14
  displayName: 'astryx upgrade',
15
- namespace: 'cli',
15
+ namespace: 'cli/commands',
16
16
  summary: 'Migrate versions and update ShadCN-copied compositions',
17
17
  description:
18
18
  'Migrates project source from a previous Astryx version to the installed one by ' +
19
19
  'running the registered codemods, and refreshes the fully rendered managed ' +
20
20
  'agent-docs block when Core or configured integration guidance changes. ' +
21
21
  'Dry-run by default. --apply writes codemod and receipt changes, runs hooks, then refreshes agent docs. ' +
22
+ 'Anything a post-codemod hook prints goes to stderr, so stdout carries only the result. ' +
22
23
  'ShadCN-copied compositions are checked automatically during a normal upgrade, or alone with --registry.',
23
24
  fn: 'upgrade',
24
25
  options: [
@@ -26,7 +27,8 @@ export const doc = {
26
27
  flag: '--from <version>',
27
28
  param: 'options.from',
28
29
  description:
29
- 'Previous version before the dependency upgrade; required unless --list or --registry is set',
30
+ 'Previous version before the dependency upgrade; required unless --list or --registry is set. ' +
31
+ 'The target is the installed @astryxdesign/core version, or legacy @xds/core when @astryxdesign/core is not installed',
30
32
  },
31
33
  {
32
34
  flag: '--apply',
@@ -44,7 +46,9 @@ export const doc = {
44
46
  {
45
47
  flag: '--codemod <name>',
46
48
  param: 'options.codemod',
47
- description: 'Run a specific transform only',
49
+ description:
50
+ 'Run only the named codemod. Optional codemods run only when named here; a normal run skips them. ' +
51
+ 'Also skips the check of ShadCN-copied compositions. An unknown name exits 1 with ERR_UNKNOWN_CODEMOD when the version range has codemods',
48
52
  },
49
53
  {
50
54
  flag: '--skip-codemod <name...>',
@@ -53,10 +57,10 @@ export const doc = {
53
57
  'Exclude named codemods (repeatable). Re-run past a failed codemod by skipping it.',
54
58
  },
55
59
  {
56
- flag: '--integration <package-or-file>',
60
+ flag: '--integration <package>',
57
61
  param: 'options.integration',
58
62
  description:
59
- 'Explicit integration package name or integration file path (repeatable)',
63
+ 'Explicit integration specifier (repeatable). Resolved beneath node_modules; absolute paths and `.` or `..` segments are rejected.',
60
64
  default: [],
61
65
  },
62
66
  {
@@ -68,20 +72,23 @@ export const doc = {
68
72
  {
69
73
  flag: '--install-deps',
70
74
  param: 'options.installDeps',
71
- description: 'Auto-install jscodeshift without prompting',
75
+ description:
76
+ 'Install jscodeshift when it is missing. Without it, a missing jscodeshift fails the command with ERR_DEP_MISSING',
72
77
  default: false,
73
78
  },
74
79
  {
75
80
  flag: '--registry',
76
81
  param: 'options.registry',
77
82
  description:
78
- 'Only reconcile ShadCN-copied compositions; --from is not required',
83
+ 'Only reconcile ShadCN-copied compositions; --from is not required. ' +
84
+ 'Combining it with --list, --from, --force, --codemod, --skip-codemod, --integration or --install-deps exits 1 with ERR_INVALID_ARGUMENT',
79
85
  default: false,
80
86
  },
81
87
  {
82
88
  flag: '--list',
83
89
  param: 'options.list',
84
- description: 'List available codemods',
90
+ description:
91
+ 'List available codemods and do nothing else. Every other flag is ignored, except --registry, which is refused (exit 1)',
85
92
  default: false,
86
93
  },
87
94
  ],
@@ -94,10 +101,15 @@ export const doc = {
94
101
  {label: 'Apply a migration', cli: 'astryx upgrade --from 0.1.0 --apply'},
95
102
  ],
96
103
  exitCodes: [
97
- {code: 0, when: 'success (including dry-run previews)'},
104
+ {code: 0, when: 'success, including complete dry-run previews'},
98
105
  {
99
106
  code: 1,
100
- when: 'missing or invalid --from, a --path escape, an unknown codemod, a codemod failure, or unresolved registry items',
107
+ when:
108
+ 'missing or invalid --from, --registry with --list or a migration flag, a --path escape, ' +
109
+ 'no installed @astryxdesign/core (or legacy @xds/core), jscodeshift missing and not installed by --install-deps, ' +
110
+ 'an astryx.config that fails validation and that no pending config codemod repairs, ' +
111
+ 'an unreadable or invalid protection declaration, a protected file that still requires a codemod change, ' +
112
+ 'an unknown codemod, a codemod or post-codemod hook failure, or unresolved registry items',
101
113
  },
102
114
  ],
103
115
  related: ['init', 'doctor'],
@@ -0,0 +1,228 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file End-to-end protection and regeneration behavior for `astryx upgrade`.
5
+ */
6
+
7
+ import {afterEach, beforeEach, describe, expect, it} from 'vitest';
8
+ import {spawnSync} from 'node:child_process';
9
+ import * as fs from 'node:fs';
10
+ import * as os from 'node:os';
11
+ import * as path from 'node:path';
12
+ import {fileURLToPath} from 'node:url';
13
+
14
+ const CLI = path.resolve(
15
+ path.dirname(fileURLToPath(import.meta.url)),
16
+ '..',
17
+ 'bin',
18
+ 'astryx.mjs',
19
+ );
20
+ let root;
21
+
22
+ function write(relative, contents) {
23
+ const file = path.join(root, relative);
24
+ fs.mkdirSync(path.dirname(file), {recursive: true});
25
+ fs.writeFileSync(file, contents);
26
+ return file;
27
+ }
28
+
29
+ function run(args) {
30
+ const result = spawnSync(
31
+ process.execPath,
32
+ [CLI, '--json', 'upgrade', ...args],
33
+ {
34
+ cwd: root,
35
+ encoding: 'utf8',
36
+ timeout: 60_000,
37
+ env: {...process.env, FORCE_COLOR: '0', CI: ''},
38
+ },
39
+ );
40
+ return {...result, envelope: JSON.parse(result.stdout)};
41
+ }
42
+
43
+ function seed({hook = false} = {}) {
44
+ write('package.json', JSON.stringify({name: 'consumer', private: true}));
45
+ write(
46
+ 'node_modules/@astryxdesign/core/package.json',
47
+ JSON.stringify({name: '@astryxdesign/core', version: '0.6.0'}),
48
+ );
49
+ write('.gitattributes', 'generated/** linguist-generated=true\n');
50
+ const source =
51
+ "import {useResizable} from '@astryxdesign/core';\n" +
52
+ 'export const usePanel = () => useResizable({minSizePx: 200});\n';
53
+ write('src/owned.tsx', source);
54
+ write('generated/panel.tsx', `// @generated\n${source}`);
55
+ write(
56
+ 'astryx.config.mjs',
57
+ hook
58
+ ? `export default {hooks: {postCodemod: [{name: 'regenerate', buildCommand: () => ({command: process.execPath, args: ['-e', ${JSON.stringify("const fs=require('node:fs');const p='generated/panel.tsx';const s=fs.readFileSync(p,'utf8');fs.writeFileSync(p,s.replaceAll('minSizePx','minSize')); ")} ]})}]}};\n`
59
+ : 'export default {};\n',
60
+ );
61
+ }
62
+
63
+ beforeEach(() => {
64
+ root = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-protected-upgrade-'));
65
+ });
66
+
67
+ afterEach(() => {
68
+ fs.rmSync(root, {recursive: true, force: true});
69
+ });
70
+
71
+ const ARGS = [
72
+ '--from',
73
+ '0.5.0',
74
+ '--codemod',
75
+ 'rename-resizable-pixel-bounds',
76
+ '--path',
77
+ '.',
78
+ ];
79
+
80
+ describe('upgrade protected-file contract', () => {
81
+ it('reports the same protected candidate in dry-run and apply while retaining owned edits', () => {
82
+ seed();
83
+
84
+ const dry = run(ARGS);
85
+ expect(dry.status).toBe(1);
86
+ expect(dry.envelope).toMatchObject({
87
+ type: 'upgrade.run',
88
+ data: {
89
+ complete: false,
90
+ errorCode: 'ERR_CODEMOD_PROTECTED',
91
+ modifiedFiles: ['src/owned.tsx'],
92
+ protectedFiles: [
93
+ {
94
+ file: 'generated/panel.tsx',
95
+ reasons: ['generated'],
96
+ declarations: expect.arrayContaining([
97
+ 'linguist-generated in .gitattributes:1',
98
+ '@generated in the leading comment block',
99
+ ]),
100
+ },
101
+ ],
102
+ },
103
+ });
104
+ expect(fs.readFileSync(path.join(root, 'src/owned.tsx'), 'utf8')).toContain(
105
+ 'minSizePx',
106
+ );
107
+
108
+ const applied = run([...ARGS, '--apply']);
109
+ expect(applied.status).toBe(1);
110
+ expect(applied.envelope.data.protectedFiles).toEqual(
111
+ dry.envelope.data.protectedFiles,
112
+ );
113
+ expect(fs.readFileSync(path.join(root, 'src/owned.tsx'), 'utf8')).toContain(
114
+ 'minSize: 200',
115
+ );
116
+ expect(
117
+ fs.readFileSync(path.join(root, 'generated/panel.tsx'), 'utf8'),
118
+ ).toContain('minSizePx');
119
+ });
120
+
121
+ it('preserves a protected config migration when strict config loading fails', () => {
122
+ write('package.json', JSON.stringify({name: 'consumer', private: true}));
123
+ write(
124
+ 'node_modules/@astryxdesign/core/package.json',
125
+ JSON.stringify({name: '@astryxdesign/core', version: '0.1.3'}),
126
+ );
127
+ write(
128
+ 'astryx.config.mjs',
129
+ `// @generated\nexport default {layout: {components: {KpiCard: '@/KpiCard'}}};\n`,
130
+ );
131
+ write('src/index.ts', 'export {};\n');
132
+
133
+ const result = run([
134
+ '--from',
135
+ '0.1.2',
136
+ '--codemod',
137
+ 'migrate-layout-components-to-experimental',
138
+ '--path',
139
+ 'src',
140
+ '--apply',
141
+ ]);
142
+
143
+ expect(result.status).toBe(1);
144
+ expect(result.envelope).toMatchObject({
145
+ type: 'upgrade.run',
146
+ data: {
147
+ complete: false,
148
+ errorCode: 'ERR_CODEMOD_PROTECTED',
149
+ protectedFiles: [expect.objectContaining({file: 'astryx.config.mjs'})],
150
+ },
151
+ });
152
+ expect(
153
+ fs.readFileSync(path.join(root, 'astryx.config.mjs'), 'utf8'),
154
+ ).toContain('layout');
155
+ });
156
+
157
+ it('fails before writes when a protection declaration cannot be parsed', () => {
158
+ seed();
159
+ write('.hgignore', 'syntax: regexp\n[bad\n');
160
+
161
+ const result = run([...ARGS, '--apply']);
162
+
163
+ expect(result.status).toBe(1);
164
+ expect(result.envelope).toMatchObject({
165
+ code: 'ERR_CODEMOD_PROTECTION_SOURCE',
166
+ });
167
+ expect(result.envelope.error).toContain('.hgignore');
168
+ expect(fs.readFileSync(path.join(root, 'src/owned.tsx'), 'utf8')).toContain(
169
+ 'minSizePx',
170
+ );
171
+ });
172
+
173
+ it('preserves protected-file facts when regeneration fails', () => {
174
+ seed();
175
+ write(
176
+ 'astryx.config.mjs',
177
+ `export default {hooks: {postCodemod: [{name: 'regenerate', buildCommand: () => ({command: process.execPath, args: ['-e', 'process.exit(7)']})}]}};\n`,
178
+ );
179
+
180
+ const applied = run([...ARGS, '--apply']);
181
+
182
+ expect(applied.status).toBe(1);
183
+ expect(applied.envelope).toMatchObject({
184
+ type: 'upgrade.run',
185
+ data: {
186
+ complete: false,
187
+ errorCode: 'ERR_CODEMOD_PROTECTED',
188
+ protectedFiles: [
189
+ expect.objectContaining({file: 'generated/panel.tsx'}),
190
+ ],
191
+ errors: [
192
+ expect.objectContaining({
193
+ codemod: 'post-codemod-hook',
194
+ error: expect.stringContaining('Post-codemod hook failed'),
195
+ }),
196
+ ],
197
+ },
198
+ });
199
+ });
200
+
201
+ it('runs declared regeneration and clears a generated-file block after reevaluation', () => {
202
+ seed({hook: true});
203
+
204
+ const applied = run([...ARGS, '--apply']);
205
+
206
+ expect(applied.status, applied.stderr).toBe(0);
207
+ expect(applied.envelope).toMatchObject({
208
+ type: 'upgrade.run',
209
+ data: {
210
+ complete: true,
211
+ modifiedFiles: ['src/owned.tsx', 'generated/panel.tsx'],
212
+ protectedFiles: [],
213
+ declinedCandidates: [],
214
+ },
215
+ });
216
+ expect(fs.readFileSync(path.join(root, 'src/owned.tsx'), 'utf8')).toContain(
217
+ 'minSize: 200',
218
+ );
219
+ expect(
220
+ fs.readFileSync(path.join(root, 'generated/panel.tsx'), 'utf8'),
221
+ ).toContain('minSize: 200');
222
+
223
+ const second = run([...ARGS, '--apply']);
224
+ expect(second.status, second.stderr).toBe(0);
225
+ expect(second.envelope.data.complete).toBe(true);
226
+ expect(second.envelope.data.filesChanged).toBe(0);
227
+ });
228
+ });