@astryxdesign/cli 0.6.3-canary.db4e378 → 0.6.3-canary.db52d98

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 (397) hide show
  1. package/README.md +38 -15
  2. package/api/blog/blog.doc.mjs +1 -0
  3. package/api/build/_adapter.d.mts +50 -0
  4. package/api/build/_adapter.mjs +60 -0
  5. package/api/build/build.doc.mjs +14 -7
  6. package/api/build/build.test.mjs +184 -6
  7. package/api/build/build.type.d.mts +57 -2
  8. package/api/build/build.type.mjs +30 -7
  9. package/api/build/help/help.d.mts +4 -0
  10. package/api/build/help/help.mjs +24 -11
  11. package/api/build/kit/kit.d.mts +4 -1
  12. package/api/build/kit/kit.mjs +165 -49
  13. package/api/build/kit/rank.d.mts +44 -0
  14. package/api/build/kit/rank.mjs +432 -0
  15. package/api/build/kit/rank.test.mjs +196 -0
  16. package/api/component/_adapter.d.mts +6 -12
  17. package/api/component/_adapter.mjs +20 -10
  18. package/api/component/component.doc.mjs +1 -0
  19. package/api/component/component.mjs +60 -12
  20. package/api/component/list/list.mjs +3 -2
  21. package/api/discover/discover.doc.mjs +1 -0
  22. package/api/docs/_adapter.d.mts +252 -34
  23. package/api/docs/_adapter.mjs +923 -132
  24. package/api/docs/detail/detail.mjs +11 -3
  25. package/api/docs/detail/section/section.mjs +24 -13
  26. package/api/docs/detail/section/section.test.mjs +15 -6
  27. package/api/docs/docs.d.mts +5 -3
  28. package/api/docs/docs.doc.mjs +39 -17
  29. package/api/docs/docs.mjs +44 -8
  30. package/api/docs/docs.test.mjs +158 -4
  31. package/api/docs/docs.type.d.mts +181 -2
  32. package/api/docs/docs.type.mjs +117 -3
  33. package/api/docs/index/index.mjs +11 -3
  34. package/api/docs/index/index.test.mjs +1 -1
  35. package/api/docs/integration-tree.test.mjs +555 -0
  36. package/api/docs/integrationDocs.test.mjs +14 -14
  37. package/api/docs/list/list.mjs +28 -12
  38. package/api/docs/node/node.d.mts +43 -0
  39. package/api/docs/node/node.mjs +192 -0
  40. package/api/docs/reference-blocks.test.mjs +406 -0
  41. package/api/doctor/doctor.d.mts +54 -4
  42. package/api/doctor/doctor.doc.mjs +1 -0
  43. package/api/doctor/doctor.mjs +331 -16
  44. package/api/doctor/doctor.test.mjs +420 -7
  45. package/api/gap-report/gap-report.doc.mjs +1 -0
  46. package/api/hook/_adapter.mjs +19 -5
  47. package/api/hook/hook.doc.mjs +1 -0
  48. package/api/hook/list/list.d.mts +1 -1
  49. package/api/hook/list/list.mjs +69 -17
  50. package/api/index.d.mts +1 -1
  51. package/api/index.mjs +1 -0
  52. package/api/init/init.doc.mjs +2 -1
  53. package/api/integration/add-contribution.d.mts +2 -1
  54. package/api/integration/add-contribution.mjs +114 -12
  55. package/api/integration/add-contribution.test.mjs +174 -3
  56. package/api/integration/add-theme.mjs +34 -64
  57. package/api/integration/add-theme.test.mjs +105 -21
  58. package/api/integration/authoring-checks.mjs +138 -28
  59. package/api/integration/authoring-checks.test.mjs +179 -7
  60. package/api/integration/authoring-checks.type.mjs +6 -1
  61. package/api/integration/integration-authoring.type.d.mts +2 -0
  62. package/api/integration/integration-authoring.type.mjs +2 -0
  63. package/api/integration/integration-block-exports.test.mjs +10 -6
  64. package/api/integration/integrationAdd.doc.mjs +7 -0
  65. package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
  66. package/api/integration/integrationAddCodemod.doc.mjs +1 -0
  67. package/api/integration/integrationAddComponent.doc.mjs +1 -0
  68. package/api/integration/integrationAddDoc.doc.mjs +8 -1
  69. package/api/integration/integrationAddTemplate.doc.mjs +1 -0
  70. package/api/integration/integrationAddTheme.doc.mjs +6 -5
  71. package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
  72. package/api/integration/integrationDocConflicts.doc.mjs +2 -1
  73. package/api/integration/integrationPackCheck.doc.mjs +2 -1
  74. package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
  75. package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
  76. package/api/integration/pack-check.mjs +34 -0
  77. package/api/integration/pack-check.test.mjs +138 -47
  78. package/api/integration/pack-check.type.d.mts +26 -2
  79. package/api/integration/pack-check.type.mjs +14 -1
  80. package/api/integration/summarizeIssues.doc.mjs +1 -0
  81. package/api/integration/template-conflict-compatibility.test.mjs +73 -0
  82. package/api/integration/validate-integration-fixes.test.mjs +1389 -0
  83. package/api/integration/validate-integration.mjs +50 -102
  84. package/api/integration/validate-integration.test.mjs +88 -26
  85. package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
  86. package/api/integration/validateIntegration.doc.mjs +2 -1
  87. package/api/json/assertResponse.doc.mjs +1 -0
  88. package/api/json/index.ts +2 -0
  89. package/api/json/isError.doc.mjs +1 -0
  90. package/api/json/parseResponse.doc.mjs +1 -0
  91. package/api/layout/_adapter.mjs +20 -5
  92. package/api/layout/layoutCheck.doc.mjs +1 -0
  93. package/api/layout/layoutExpand.doc.mjs +1 -0
  94. package/api/layout/layoutGrammar.doc.mjs +1 -0
  95. package/api/search/search.d.mts +59 -1
  96. package/api/search/search.doc.mjs +5 -3
  97. package/api/search/search.mjs +458 -77
  98. package/api/search/search.test.mjs +91 -2
  99. package/api/search/search.type.d.mts +13 -1
  100. package/api/search/search.type.mjs +4 -1
  101. package/api/swizzle/swizzle.doc.mjs +1 -0
  102. package/api/template/list/list.mjs +1 -0
  103. package/api/template/table-floating-bulk-actions.test.mjs +66 -0
  104. package/api/template/template-integration.test.mjs +1072 -3
  105. package/api/template/template-suffix.test.mjs +41 -21
  106. package/api/template/template.doc.mjs +28 -7
  107. package/api/template/template.mjs +45 -8
  108. package/api/template/template.type.d.mts +6 -8
  109. package/api/template/template.type.mjs +3 -2
  110. package/api/theme/_adapter.d.mts +2 -3
  111. package/api/theme/_adapter.mjs +4 -5
  112. package/api/theme/add/add.binary.test.mjs +10 -17
  113. package/api/theme/add/add.test.mjs +14 -1
  114. package/api/theme/generateTonalPalette.doc.mjs +1 -0
  115. package/api/theme/integration-themes.test.mjs +39 -28
  116. package/api/theme/list/list.test.mjs +19 -20
  117. package/api/theme/listThemes.doc.mjs +6 -5
  118. package/api/theme/template/template.test.mjs +5 -0
  119. package/api/theme/themeAdd.doc.mjs +4 -3
  120. package/api/theme/themeBuild.doc.mjs +1 -0
  121. package/api/theme/themeList.doc.mjs +6 -3
  122. package/api/theme/themeListAvailable.doc.mjs +5 -3
  123. package/api/theme/themePaletteGenerate.doc.mjs +1 -0
  124. package/api/theme/themeTargets.doc.mjs +1 -0
  125. package/api/theme/themeTemplate.doc.mjs +2 -1
  126. package/api/upgrade/_adapter.d.mts +32 -5
  127. package/api/upgrade/_adapter.mjs +97 -69
  128. package/api/upgrade/provider-agreement.test.mjs +152 -0
  129. package/api/upgrade/run/run.mjs +356 -59
  130. package/api/upgrade/upgrade.doc.mjs +6 -1
  131. package/api/upgrade/upgrade.type.d.mts +34 -0
  132. package/api/upgrade/upgrade.type.mjs +15 -0
  133. package/assets/codemods/__tests__/runner.test.mjs +330 -8
  134. package/assets/codemods/integration-discovery.mjs +8 -2
  135. package/assets/codemods/integration-discovery.test.mjs +15 -0
  136. package/assets/codemods/integration-runner.mjs +56 -4
  137. package/assets/codemods/integration-runner.protection.test.mjs +153 -0
  138. package/assets/codemods/run-codemod.mjs +177 -34
  139. package/assets/codemods/runner.mjs +350 -102
  140. package/assets/codemods/transforms/next/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
  141. package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
  142. package/assets/codemods/transforms/next/index.mjs +19 -1
  143. package/assets/codemods/transforms/next/migrate-native-picker-to-presentation.mjs +148 -0
  144. package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
  145. package/assets/docs/getting-started.doc.mjs +2 -2
  146. package/assets/docs/layout.doc.dense.mjs +2 -2
  147. package/assets/docs/layout.doc.mjs +1 -1
  148. package/assets/docs/principles.doc.mjs +6 -6
  149. package/assets/docs/styling-libraries.doc.mjs +3 -3
  150. package/assets/docs/styling.doc.mjs +4 -4
  151. package/assets/docs/theme.doc.mjs +5 -5
  152. package/assets/docs/tokens.doc.mjs +1 -1
  153. package/assets/docs/tree/api.doc.mjs +30 -0
  154. package/assets/docs/tree/cli.doc.mjs +23 -0
  155. package/assets/docs/tree/commands.doc.mjs +25 -0
  156. package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +66 -38
  157. package/assets/docs/tree/integrations.test.mjs +62 -0
  158. package/assets/docs/tree/writing-docs.doc.mjs +286 -0
  159. package/assets/docs/working-with-ai.doc.mjs +3 -3
  160. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
  161. package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
  162. package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
  163. package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
  164. package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
  165. package/assets/templates/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
  166. package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
  167. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
  168. package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
  169. package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
  170. package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
  171. package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
  172. package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
  173. package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
  174. package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
  175. package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
  176. package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
  177. package/authoring/codemod/codemod.doc.mjs +1 -1
  178. package/authoring/codemod/type.ts +12 -0
  179. package/authoring/config/config.doc.mjs +1 -1
  180. package/authoring/debug/debug.doc.d.mts +11 -0
  181. package/authoring/debug/debug.doc.mjs +182 -0
  182. package/authoring/debug/parse.d.mts +3 -3
  183. package/authoring/doctypes/_schema.d.mts +119 -117
  184. package/authoring/doctypes/_schema.mjs +54 -3
  185. package/authoring/doctypes/base/graph-fields.doc.mjs +8 -6
  186. package/authoring/doctypes/base/type.ts +6 -5
  187. package/authoring/doctypes/command/command.doc.mjs +1 -1
  188. package/authoring/doctypes/command/type.ts +2 -2
  189. package/authoring/doctypes/component/type.ts +2 -2
  190. package/authoring/doctypes/doctypes-new.test.mjs +48 -6
  191. package/authoring/doctypes/enum/enum.doc.mjs +1 -1
  192. package/authoring/doctypes/enum/type.ts +1 -1
  193. package/authoring/doctypes/function/function.doc.mjs +3 -2
  194. package/authoring/doctypes/function/type.ts +3 -2
  195. package/authoring/doctypes/hook/type.ts +2 -2
  196. package/authoring/doctypes/load-contract.test.mjs +28 -2
  197. package/authoring/doctypes/namespace/namespace.doc.mjs +6 -10
  198. package/authoring/doctypes/namespace/parse.test.mjs +23 -25
  199. package/authoring/doctypes/namespace/type.ts +5 -2
  200. package/authoring/doctypes/parse.d.mts +4 -2
  201. package/authoring/doctypes/parse.mjs +10 -5
  202. package/authoring/doctypes/reference/reference.doc.mjs +35 -6
  203. package/authoring/doctypes/reference/type.ts +30 -13
  204. package/authoring/doctypes/schema/schema.doc.mjs +1 -1
  205. package/authoring/doctypes/schema/type.ts +1 -2
  206. package/authoring/doctypes/template/parse.d.mts +2 -0
  207. package/authoring/doctypes/template/parse.mjs +4 -0
  208. package/authoring/doctypes/template/parse.test.mjs +18 -0
  209. package/authoring/doctypes/template/template.doc.mjs +9 -3
  210. package/authoring/doctypes/template/type.ts +8 -0
  211. package/authoring/doctypes/theme/parse.d.mts +35 -0
  212. package/authoring/doctypes/theme/parse.mjs +76 -0
  213. package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
  214. package/authoring/doctypes/theme/theme.doc.mjs +79 -0
  215. package/authoring/doctypes/theme/type.ts +42 -0
  216. package/authoring/doctypes/types.ts +2 -1
  217. package/authoring/gap-report/gap-report.doc.d.mts +12 -0
  218. package/authoring/gap-report/gap-report.doc.mjs +183 -0
  219. package/authoring/identity/identity.doc.mjs +2 -2
  220. package/authoring/index.d.mts +1 -0
  221. package/authoring/index.d.ts +7 -4
  222. package/authoring/index.mjs +2 -1
  223. package/authoring/integration/integration.doc.mjs +2 -2
  224. package/authoring/integration/type.ts +4 -10
  225. package/clients/cli/__tests__/cliManifest.test.ts +27 -29
  226. package/clients/cli/commands/blog.doc.mjs +1 -1
  227. package/clients/cli/commands/build-theme.adaptations.test.mjs +100 -1
  228. package/clients/cli/commands/build-theme.mjs +11 -45
  229. package/clients/cli/commands/build.doc.mjs +12 -7
  230. package/clients/cli/commands/build.mjs +105 -67
  231. package/clients/cli/commands/build.text-fields.test.mjs +41 -0
  232. package/clients/cli/commands/component/index.mjs +1 -1
  233. package/clients/cli/commands/component-ownership.test.mjs +3 -3
  234. package/clients/cli/commands/component.doc.mjs +1 -1
  235. package/clients/cli/commands/discover.broken-integration.test.mjs +7 -8
  236. package/clients/cli/commands/discover.doc.mjs +1 -1
  237. package/clients/cli/commands/discover.mjs +1 -1
  238. package/clients/cli/commands/docs.doc.mjs +21 -9
  239. package/clients/cli/commands/docs.mjs +184 -70
  240. package/clients/cli/commands/docs.test.mjs +120 -16
  241. package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
  242. package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
  243. package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
  244. package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
  245. package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
  246. package/clients/cli/commands/doctor-integration.test.mjs +90 -8
  247. package/clients/cli/commands/doctor.doc.mjs +1 -1
  248. package/clients/cli/commands/doctor.mjs +53 -16
  249. package/clients/cli/commands/gap-report.doc.mjs +1 -1
  250. package/clients/cli/commands/hook.doc.mjs +1 -1
  251. package/clients/cli/commands/init.doc.mjs +1 -1
  252. package/clients/cli/commands/integration-add.controls.test.mjs +1 -1
  253. package/clients/cli/commands/integration-add.doc.mjs +11 -1
  254. package/clients/cli/commands/integration-pack.doc.mjs +1 -1
  255. package/clients/cli/commands/integration-real-world.test.mjs +3 -9
  256. package/clients/cli/commands/integration.doc.mjs +1 -1
  257. package/clients/cli/commands/integration.mjs +1 -0
  258. package/clients/cli/commands/layout-check.doc.mjs +1 -1
  259. package/clients/cli/commands/layout-expand.doc.mjs +1 -1
  260. package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
  261. package/clients/cli/commands/layout.doc.mjs +1 -1
  262. package/clients/cli/commands/manifest.doc.mjs +1 -1
  263. package/clients/cli/commands/search.doc.mjs +1 -1
  264. package/clients/cli/commands/search.mjs +11 -2
  265. package/clients/cli/commands/setup-nudge.test.mjs +6 -0
  266. package/clients/cli/commands/swizzle.doc.mjs +1 -1
  267. package/clients/cli/commands/template.doc.mjs +24 -7
  268. package/clients/cli/commands/template.mjs +4 -91
  269. package/clients/cli/commands/text-json-parity.test.mjs +719 -0
  270. package/clients/cli/commands/theme-add.doc.mjs +2 -2
  271. package/clients/cli/commands/theme-build.doc.mjs +1 -1
  272. package/clients/cli/commands/theme-list.doc.mjs +2 -2
  273. package/clients/cli/commands/theme-palette-generate.doc.mjs +3 -3
  274. package/clients/cli/commands/theme-palette.doc.mjs +1 -1
  275. package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
  276. package/clients/cli/commands/theme-targets.doc.mjs +1 -1
  277. package/clients/cli/commands/theme-template.doc.mjs +1 -1
  278. package/clients/cli/commands/theme.doc.mjs +1 -1
  279. package/clients/cli/commands/upgrade.doc.mjs +3 -2
  280. package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
  281. package/clients/cli/commands/upgrade.mjs +29 -7
  282. package/clients/cli/formatters/index.mjs +2 -0
  283. package/clients/cli/formatters/index.test.mjs +6 -0
  284. package/clients/cli/index.mjs +8 -0
  285. package/clients/cli/lib/hook-format.mjs +14 -5
  286. package/clients/cli/lib/manifest.mjs +9 -2
  287. package/foundation/agent-docs/agent-docs.d.mts +3 -2
  288. package/foundation/agent-docs/agent-docs.mjs +13 -9
  289. package/foundation/agent-docs/agent-docs.test.mjs +19 -1
  290. package/foundation/config/project-themes.test.mjs +11 -19
  291. package/foundation/config/project.d.mts +20 -11
  292. package/foundation/config/project.mjs +123 -80
  293. package/foundation/config/project.test.mjs +144 -21
  294. package/foundation/discovery/authoring-self-docs.d.mts +18 -0
  295. package/foundation/discovery/authoring-self-docs.mjs +37 -15
  296. package/foundation/discovery/authoring-self-docs.test.mjs +25 -9
  297. package/foundation/discovery/authoring-surface.d.mts +74 -0
  298. package/foundation/discovery/authoring-surface.mjs +525 -0
  299. package/foundation/discovery/authoring-surface.test.mjs +392 -0
  300. package/foundation/discovery/cli-self-docs.d.mts +119 -0
  301. package/foundation/discovery/cli-self-docs.mjs +490 -0
  302. package/foundation/discovery/cli-self-docs.test.mjs +375 -0
  303. package/foundation/discovery/component-discovery.d.mts +38 -0
  304. package/foundation/discovery/component-discovery.mjs +48 -0
  305. package/foundation/discovery/component-loader.d.mts +35 -38
  306. package/foundation/discovery/component-loader.mjs +53 -222
  307. package/foundation/discovery/docs-discovery.d.mts +112 -11
  308. package/foundation/discovery/docs-discovery.mjs +231 -36
  309. package/foundation/discovery/docs-discovery.test.mjs +111 -32
  310. package/foundation/discovery/docs-output-budget.d.mts +2 -2
  311. package/foundation/discovery/docs-output-budget.mjs +1 -1
  312. package/foundation/discovery/docs-section-key.d.mts +28 -10
  313. package/foundation/discovery/docs-section-key.mjs +134 -33
  314. package/foundation/discovery/docs-section-key.test.mjs +41 -19
  315. package/foundation/discovery/template-adapter.d.mts +99 -6
  316. package/foundation/discovery/template-adapter.mjs +480 -57
  317. package/foundation/discovery/template-adapter.test.mjs +57 -0
  318. package/foundation/discovery/template-conflict-release.d.mts +13 -0
  319. package/foundation/discovery/template-conflict-release.mjs +40 -0
  320. package/foundation/discovery/template-conflict-release.test.mjs +40 -0
  321. package/foundation/discovery/theme-discovery.d.mts +67 -7
  322. package/foundation/discovery/theme-discovery.mjs +916 -186
  323. package/foundation/discovery/theme-discovery.test.mjs +613 -219
  324. package/foundation/doc-compiler/bundle.d.mts +47 -0
  325. package/foundation/doc-compiler/bundle.mjs +278 -0
  326. package/foundation/doc-compiler/bundle.test.mjs +266 -0
  327. package/foundation/doc-compiler/compile.d.mts +220 -39
  328. package/foundation/doc-compiler/compile.mjs +311 -15
  329. package/foundation/doc-compiler/diagnostics.d.mts +126 -0
  330. package/foundation/doc-compiler/diagnostics.mjs +305 -0
  331. package/foundation/doc-compiler/doc-compiler.test.mjs +28 -1
  332. package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
  333. package/foundation/doc-compiler/import.d.mts +24 -0
  334. package/foundation/doc-compiler/import.mjs +59 -0
  335. package/foundation/doc-compiler/inputs.d.mts +102 -0
  336. package/foundation/doc-compiler/inputs.mjs +291 -0
  337. package/foundation/doc-compiler/inputs.test.mjs +299 -0
  338. package/foundation/doc-compiler/ir.d.mts +13 -0
  339. package/foundation/doc-compiler/ir.mjs +196 -12
  340. package/foundation/doc-compiler/lenses.d.mts +8 -5
  341. package/foundation/doc-compiler/lenses.mjs +50 -4
  342. package/foundation/doc-compiler/links.d.mts +162 -0
  343. package/foundation/doc-compiler/links.mjs +294 -0
  344. package/foundation/doc-compiler/links.test.mjs +192 -0
  345. package/foundation/doc-compiler/lower-doc.test.mjs +495 -0
  346. package/foundation/doc-compiler/overlays.d.mts +37 -0
  347. package/foundation/doc-compiler/overlays.mjs +206 -0
  348. package/foundation/doc-compiler/parse-readable.d.mts +9 -0
  349. package/foundation/doc-compiler/parse-readable.mjs +29 -0
  350. package/foundation/doc-compiler/read.d.mts +127 -0
  351. package/foundation/doc-compiler/read.mjs +325 -0
  352. package/foundation/doc-compiler/read.test.mjs +313 -0
  353. package/foundation/doc-compiler/source.d.mts +33 -0
  354. package/foundation/doc-compiler/source.mjs +128 -0
  355. package/foundation/doc-compiler/tree.d.mts +288 -0
  356. package/foundation/doc-compiler/tree.mjs +876 -0
  357. package/foundation/doc-compiler/tree.test.mjs +598 -0
  358. package/foundation/fs/file-protection.d.mts +33 -0
  359. package/foundation/fs/file-protection.mjs +825 -0
  360. package/foundation/fs/file-protection.test.mjs +250 -0
  361. package/foundation/integrations/autolink.d.mts +58 -1
  362. package/foundation/integrations/autolink.mjs +143 -57
  363. package/foundation/integrations/autolink.test.mjs +1 -1
  364. package/foundation/integrations/cli-requirement.d.mts +45 -0
  365. package/foundation/integrations/cli-requirement.mjs +154 -0
  366. package/foundation/integrations/cli-requirement.test.mjs +84 -0
  367. package/foundation/integrations/contribution-fixes.d.mts +145 -0
  368. package/foundation/integrations/contribution-fixes.mjs +1284 -0
  369. package/foundation/integrations/contribution-inventory.d.mts +3 -2
  370. package/foundation/integrations/contribution-inventory.mjs +27 -24
  371. package/foundation/integrations/contribution-inventory.test.mjs +86 -27
  372. package/foundation/integrations/integration-warnings.d.mts +9 -2
  373. package/foundation/integrations/integration-warnings.mjs +51 -26
  374. package/foundation/integrations/integration-warnings.test.mjs +74 -1
  375. package/foundation/integrations/integrations.d.mts +3 -0
  376. package/foundation/integrations/integrations.mjs +11 -97
  377. package/foundation/integrations/provider-ledger.test.mjs +275 -0
  378. package/foundation/integrations/provider-resolution.d.mts +152 -0
  379. package/foundation/integrations/provider-resolution.mjs +576 -0
  380. package/foundation/integrations/provider-resolution.test.mjs +369 -0
  381. package/foundation/integrations/theme-descriptor.d.mts +8 -0
  382. package/foundation/integrations/theme-descriptor.mjs +44 -0
  383. package/foundation/integrations/validate-contributions.mjs +121 -29
  384. package/foundation/response/error-codes.d.mts +3 -1
  385. package/foundation/response/error-codes.d.ts +2 -0
  386. package/foundation/response/error-codes.doc.mjs +12 -2
  387. package/foundation/response/error-codes.mjs +7 -1
  388. package/foundation/response/error-codes.test.mjs +55 -11
  389. package/foundation/response/response-types.doc.d.mts +5 -1
  390. package/foundation/response/response-types.doc.mjs +20 -11
  391. package/foundation/response/response.doc.mjs +1 -1
  392. package/foundation/text/string-utils.d.mts +8 -0
  393. package/foundation/text/string-utils.mjs +40 -10
  394. package/foundation/xle/expand.mjs +1 -1
  395. package/foundation/xle/xle.test.mjs +13 -0
  396. package/package.json +10 -9
  397. package/assets/templates/themes/manifest.json +0 -95
@@ -31,7 +31,12 @@ import * as fs from 'node:fs';
31
31
  import * as path from 'node:path';
32
32
  import * as p from './term-log.mjs';
33
33
  import {findConfigPath} from '../../foundation/config/project.mjs';
34
- import {fixDirectiveCorruption, validateOutput, IGNORED_DIRS} from './runner.mjs';
34
+ import {
35
+ fixDirectiveCorruption,
36
+ validateOutput,
37
+ isIgnoredDirectory,
38
+ } from './runner.mjs';
39
+ import {createFileProtectionResolver} from '../../foundation/fs/file-protection.mjs';
35
40
 
36
41
  export const DEFAULT_CODE_EXTENSIONS = [
37
42
  '.tsx',
@@ -43,6 +48,41 @@ export const DEFAULT_CODE_EXTENSIONS = [
43
48
  ];
44
49
  const PARSEABLE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.cjs'];
45
50
 
51
+ /**
52
+ * @typedef {{file: string, codemod: string, reason: string, declaration: string, generated: boolean, command?: string}} ProtectedFile
53
+ */
54
+
55
+ /**
56
+ * Convert every effective protection declaration into the stable codemod result
57
+ * shape. A file can carry more than one additive declaration.
58
+ * @param {string} filePath
59
+ * @param {string} name
60
+ * @param {{root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}} protection
61
+ * @returns {ProtectedFile[]}
62
+ */
63
+ function protectedResult(filePath, name, protection) {
64
+ return protection.classify(filePath).map(item => ({
65
+ file: item.file,
66
+ codemod: name,
67
+ reason: item.reason,
68
+ declaration: item.declaration,
69
+ generated: item.reason === 'generated',
70
+ ...(item.command ? {command: item.command} : {}),
71
+ }));
72
+ }
73
+
74
+ /**
75
+ * Print one blocked candidate without implying that the protected bytes changed.
76
+ * @param {import('../../authoring/codemod/type').CliLog} log
77
+ * @param {ProtectedFile[]} protections
78
+ */
79
+ function logProtected(log, protections) {
80
+ const [first] = protections;
81
+ log.warn(
82
+ ` ! ${first.file} — protected by ${protections.map(item => item.declaration).join('; ')}`,
83
+ );
84
+ }
85
+
46
86
  /**
47
87
  * Recursively find candidate source files in a directory.
48
88
  * @param {string} dir
@@ -51,8 +91,17 @@ const PARSEABLE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.cjs'];
51
91
  export function findSourceFiles(dir) {
52
92
  /** @type {string[]} */
53
93
  const results = [];
54
- /** @param {string} currentDir */
55
- function walk(currentDir) {
94
+ /** @param {string} currentDir @param {Set<string>} [ancestors] */
95
+ function walk(currentDir, ancestors = new Set()) {
96
+ let realDirectory;
97
+ try {
98
+ realDirectory = fs.realpathSync(currentDir);
99
+ } catch {
100
+ return;
101
+ }
102
+ if (ancestors.has(realDirectory)) return;
103
+ const nextAncestors = new Set(ancestors);
104
+ nextAncestors.add(realDirectory);
56
105
  let entries;
57
106
  try {
58
107
  entries = fs.readdirSync(currentDir, {withFileTypes: true});
@@ -61,12 +110,21 @@ export function findSourceFiles(dir) {
61
110
  }
62
111
  for (const entry of entries) {
63
112
  const fullPath = path.join(currentDir, entry.name);
64
- // Never follow symlinks — writing through one would rewrite its target
65
- // outside the scan tree (e.g. into node_modules or anywhere on disk).
66
- if (entry.isSymbolicLink()) continue;
113
+ // Symlinked files and descendants remain read-only candidates so a
114
+ // required change can be reported. Real-path ancestors prevent cycles.
115
+ if (entry.isSymbolicLink()) {
116
+ try {
117
+ const target = fs.statSync(fullPath);
118
+ if (target.isFile()) results.push(fullPath);
119
+ else if (target.isDirectory()) walk(fullPath, nextAncestors);
120
+ } catch {
121
+ // Broken links have no source bytes to evaluate.
122
+ }
123
+ continue;
124
+ }
67
125
  if (entry.isDirectory()) {
68
- if (IGNORED_DIRS.has(entry.name)) continue;
69
- walk(fullPath);
126
+ if (isIgnoredDirectory(dir, fullPath, entry.name)) continue;
127
+ walk(fullPath, nextAncestors);
70
128
  } else {
71
129
  results.push(fullPath);
72
130
  }
@@ -91,37 +149,45 @@ export function makeLog(silent) {
91
149
  * Apply a config codemod to the consumer's astryx.config.* file.
92
150
  *
93
151
  * @param {import('../../authoring/codemod/type').CodemodEntry} entry normalized codemod entry {id, codemod, package}
94
- * @param {{apply: boolean, log: import('../../authoring/codemod/type').CliLog, jscodeshift: import('../../authoring/codemod/type').JscodeshiftFactory}} ctx
152
+ * @param {{apply: boolean, log: import('../../authoring/codemod/type').CliLog, jscodeshift: import('../../authoring/codemod/type').JscodeshiftFactory, root?: string, protection: {root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}, contents?: Map<string, string>}} ctx
95
153
  * @returns {import('../../authoring/codemod/type').CodemodRunResult}
96
154
  */
97
- export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
155
+ export function runConfigCodemod(
156
+ entry,
157
+ {apply, log, jscodeshift, root = process.cwd(), protection, contents},
158
+ ) {
98
159
  const {codemod, id, package: pkg} = entry;
99
160
  const name = `${pkg}:${id}`;
100
- // findConfigPath throws when multiple astryx.config.* files coexist. Config
101
- // codemods run FIRST (before the strict project loader), so an uncaught throw
102
- // here aborts the entire `astryx upgrade` with an un-coded error — breaking
103
- // the per-codemod isolation every other failure path honors. Degrade it to a
104
- // structured error so the run continues and reports it.
161
+ const resolver = protection ?? createFileProtectionResolver(root);
105
162
  let configPath;
106
163
  try {
107
- configPath = findConfigPath(process.cwd());
164
+ configPath = findConfigPath(root);
108
165
  } catch (err) {
109
166
  const message = /** @type {any} */ (err).message;
110
167
  log.error(` ✗ astryx.config.* — ${message}`);
111
168
  return {
112
169
  filesChanged: 0,
170
+ changedFiles: [],
113
171
  writtenFiles: [],
172
+ protectedFiles: [],
114
173
  errors: [{file: 'astryx.config.*', codemod: name, error: message}],
115
174
  };
116
175
  }
117
176
  if (!configPath) {
118
177
  log.info(` ${codemod.title} — no astryx.config.* found; skipping.`);
119
- return {filesChanged: 0, writtenFiles: [], errors: []};
178
+ return {
179
+ filesChanged: 0,
180
+ changedFiles: [],
181
+ writtenFiles: [],
182
+ protectedFiles: [],
183
+ errors: [],
184
+ };
120
185
  }
121
186
 
122
- const relativePath = path.relative(process.cwd(), configPath);
187
+ const relativePath = path.relative(root, configPath);
123
188
  try {
124
- const source = fs.readFileSync(configPath, 'utf-8');
189
+ const source =
190
+ contents?.get(configPath) ?? fs.readFileSync(configPath, 'utf-8');
125
191
  const ext = path.extname(configPath);
126
192
  const parser = ext === '.tsx' || ext === '.ts' ? 'tsx' : 'babel';
127
193
  const j = jscodeshift.withParser(parser);
@@ -129,7 +195,13 @@ export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
129
195
  let result = codemod.transform({source, path: configPath}, api);
130
196
 
131
197
  if (result == null || result === source) {
132
- return {filesChanged: 0, writtenFiles: [], errors: []};
198
+ return {
199
+ filesChanged: 0,
200
+ changedFiles: [],
201
+ writtenFiles: [],
202
+ protectedFiles: [],
203
+ errors: [],
204
+ };
133
205
  }
134
206
 
135
207
  result = fixDirectiveCorruption(result);
@@ -140,11 +212,26 @@ export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
140
212
  log.error(` ✗ ${relativePath} — ${validation.reason}`);
141
213
  return {
142
214
  filesChanged: 0,
215
+ changedFiles: [],
143
216
  writtenFiles: [],
217
+ protectedFiles: [],
144
218
  errors: [{file: relativePath, codemod: name, error: validation.reason}],
145
219
  };
146
220
  }
147
221
 
222
+ const protectedFiles = protectedResult(configPath, name, resolver);
223
+ if (protectedFiles.length > 0) {
224
+ logProtected(log, protectedFiles);
225
+ return {
226
+ filesChanged: 0,
227
+ changedFiles: [],
228
+ writtenFiles: [],
229
+ protectedFiles,
230
+ errors: [],
231
+ };
232
+ }
233
+
234
+ contents?.set(configPath, result);
148
235
  if (apply) {
149
236
  fs.writeFileSync(configPath, result, 'utf-8');
150
237
  log.success(` ✓ ${relativePath}`);
@@ -153,7 +240,9 @@ export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
153
240
  }
154
241
  return {
155
242
  filesChanged: 1,
243
+ changedFiles: [configPath],
156
244
  writtenFiles: apply ? [configPath] : [],
245
+ protectedFiles: [],
157
246
  errors: [],
158
247
  };
159
248
  } catch (err) {
@@ -161,7 +250,9 @@ export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
161
250
  log.error(` ✗ ${relativePath} — ${message}`);
162
251
  return {
163
252
  filesChanged: 0,
253
+ changedFiles: [],
164
254
  writtenFiles: [],
255
+ protectedFiles: [],
165
256
  errors: [{file: relativePath, codemod: name, error: message}],
166
257
  };
167
258
  }
@@ -172,27 +263,41 @@ export function runConfigCodemod(entry, {apply, log, jscodeshift}) {
172
263
  *
173
264
  * @param {import('../../authoring/codemod/type').CodemodEntry} entry normalized codemod entry {id, codemod, package}
174
265
  * @param {string[]} files
175
- * @param {{apply: boolean, log: import('../../authoring/codemod/type').CliLog, jscodeshift: import('../../authoring/codemod/type').JscodeshiftFactory}} ctx
266
+ * @param {{apply: boolean, log: import('../../authoring/codemod/type').CliLog, jscodeshift: import('../../authoring/codemod/type').JscodeshiftFactory, root?: string, protection: {root: string, classify: (file: string) => import('../../foundation/fs/file-protection.mjs').FileProtection[]}, contents?: Map<string, string>}} ctx
176
267
  * @returns {import('../../authoring/codemod/type').CodemodRunResult}
177
268
  */
178
- export function runCodeCodemod(entry, files, {apply, log, jscodeshift}) {
269
+ export function runCodeCodemod(
270
+ entry,
271
+ files,
272
+ {apply, log, jscodeshift, root = process.cwd(), protection, contents},
273
+ ) {
179
274
  const {codemod, id, package: pkg} = entry;
180
275
  const name = `${pkg}:${id}`;
276
+ const resolver = protection ?? createFileProtectionResolver(root);
181
277
  const extensions = new Set(codemod.fileExtensions ?? DEFAULT_CODE_EXTENSIONS);
182
278
 
183
279
  let filesChanged = 0;
184
280
  /** @type {string[]} */
281
+ const changedFiles = [];
282
+ /** @type {string[]} */
185
283
  const writtenFiles = [];
284
+ /** @type {ProtectedFile[]} */
285
+ const protectedFiles = [];
186
286
  /** @type {Array<{file: string, codemod: string, error: string}>} */
187
287
  const errors = [];
288
+ /** @type {Array<{filePath: string, relativePath: string, result: string}>} */
289
+ const candidates = [];
188
290
 
291
+ // Transform and validate every candidate before any write. This lets a
292
+ // protection source changed by this entry govern every other staged output.
189
293
  for (const filePath of files) {
190
294
  const ext = path.extname(filePath);
191
295
  if (!extensions.has(ext)) continue;
192
296
 
193
- const relativePath = path.relative(process.cwd(), filePath);
297
+ const relativePath = path.relative(root, filePath);
194
298
  try {
195
- const source = fs.readFileSync(filePath, 'utf-8');
299
+ const source =
300
+ contents?.get(filePath) ?? fs.readFileSync(filePath, 'utf-8');
196
301
  const parser = ext === '.tsx' || ext === '.ts' ? 'tsx' : 'babel';
197
302
  const j = jscodeshift.withParser(parser);
198
303
  const api = {jscodeshift: j, stats: () => {}, report: () => {}};
@@ -213,15 +318,7 @@ export function runCodeCodemod(entry, files, {apply, log, jscodeshift}) {
213
318
  });
214
319
  continue;
215
320
  }
216
-
217
- filesChanged++;
218
- if (apply) {
219
- fs.writeFileSync(filePath, result, 'utf-8');
220
- writtenFiles.push(filePath);
221
- log.success(` ✓ ${relativePath}`);
222
- } else {
223
- log.warn(` ~ ${relativePath} (would change)`);
224
- }
321
+ candidates.push({filePath, relativePath, result});
225
322
  } catch (err) {
226
323
  const message = /** @type {any} */ (err).message;
227
324
  log.error(` ✗ ${relativePath} — ${message}`);
@@ -229,5 +326,51 @@ export function runCodeCodemod(entry, files, {apply, log, jscodeshift}) {
229
326
  }
230
327
  }
231
328
 
232
- return {filesChanged, writtenFiles, errors};
329
+ /** @type {Map<string, ProtectedFile[]>} */
330
+ const currentProtections = new Map();
331
+ /** @type {Map<string, string|null>} */
332
+ const stagedContents = new Map(contents ?? []);
333
+ for (const candidate of candidates) {
334
+ const blocked = protectedResult(candidate.filePath, name, resolver);
335
+ currentProtections.set(candidate.filePath, blocked);
336
+ if (blocked.length === 0) {
337
+ stagedContents.set(candidate.filePath, candidate.result);
338
+ }
339
+ }
340
+ const stagedResolver = createFileProtectionResolver(root, {
341
+ overrides: stagedContents,
342
+ });
343
+
344
+ for (const candidate of candidates) {
345
+ const blocked = [
346
+ ...(currentProtections.get(candidate.filePath) ?? []),
347
+ ...protectedResult(candidate.filePath, name, stagedResolver),
348
+ ].filter(
349
+ (item, index, all) =>
350
+ all.findIndex(
351
+ candidateItem =>
352
+ candidateItem.file === item.file &&
353
+ candidateItem.reason === item.reason &&
354
+ candidateItem.declaration === item.declaration,
355
+ ) === index,
356
+ );
357
+ if (blocked.length > 0) {
358
+ protectedFiles.push(...blocked);
359
+ logProtected(log, blocked);
360
+ continue;
361
+ }
362
+
363
+ filesChanged++;
364
+ changedFiles.push(candidate.filePath);
365
+ contents?.set(candidate.filePath, candidate.result);
366
+ if (apply) {
367
+ fs.writeFileSync(candidate.filePath, candidate.result, 'utf-8');
368
+ writtenFiles.push(candidate.filePath);
369
+ log.success(` ✓ ${candidate.relativePath}`);
370
+ } else {
371
+ log.warn(` ~ ${candidate.relativePath} (would change)`);
372
+ }
373
+ }
374
+
375
+ return {filesChanged, changedFiles, writtenFiles, protectedFiles, errors};
233
376
  }