@astryxdesign/cli 0.7.2-canary.fdd384f → 0.7.2

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 (450) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +169 -149
  3. package/api/build/_adapter.d.mts +8 -0
  4. package/api/build/_adapter.mjs +12 -1
  5. package/api/build/build.doc.mjs +4 -0
  6. package/api/build/kit/kit.mjs +3 -11
  7. package/api/component/_adapter.d.mts +31 -0
  8. package/api/component/_adapter.mjs +119 -11
  9. package/api/component/component.doc.mjs +6 -1
  10. package/api/component/component.mjs +60 -10
  11. package/api/component/doc-links.test.mjs +386 -0
  12. package/api/discover/_adapter.d.mts +132 -12
  13. package/api/discover/_adapter.mjs +488 -27
  14. package/api/discover/_adapter.test.mjs +599 -17
  15. package/api/discover/_catalog-view.d.mts +16 -5
  16. package/api/discover/_catalog-view.mjs +32 -8
  17. package/api/discover/detail/doc/doc.mjs +9 -1
  18. package/api/discover/discover.d.mts +11 -0
  19. package/api/discover/discover.doc.mjs +9 -7
  20. package/api/discover/discover.mjs +121 -19
  21. package/api/discover/discover.type.d.mts +20 -7
  22. package/api/discover/discover.type.mjs +17 -7
  23. package/api/discover/list/list.d.mts +4 -3
  24. package/api/discover/list/list.mjs +17 -10
  25. package/api/docs/_adapter.d.mts +63 -0
  26. package/api/docs/_adapter.mjs +312 -18
  27. package/api/docs/docs.doc.mjs +2 -1
  28. package/api/docs/docs.mjs +2 -1
  29. package/api/docs/docs.test.mjs +5 -2
  30. package/api/docs/integration-tree.test.mjs +22 -0
  31. package/api/docs/list/list.mjs +12 -2
  32. package/api/docs/reference-blocks.test.mjs +1 -3
  33. package/api/doctor/_adapter.d.mts +108 -0
  34. package/api/doctor/_adapter.mjs +223 -4
  35. package/api/doctor/doctor.d.mts +199 -0
  36. package/api/doctor/doctor.doc.mjs +3 -2
  37. package/api/doctor/doctor.mjs +530 -34
  38. package/api/doctor/doctor.test.mjs +180 -14
  39. package/api/doctor/release-checks.test.mjs +156 -0
  40. package/api/doctor/theme-checks.mjs +16 -3
  41. package/api/doctor/theme-checks.test.mjs +223 -7
  42. package/api/error.d.mts +10 -0
  43. package/api/error.mjs +25 -0
  44. package/api/gap-report/gap-report.d.mts +3 -0
  45. package/api/gap-report/gap-report.doc.mjs +11 -3
  46. package/api/gap-report/gap-report.mjs +152 -48
  47. package/api/gap-report/gap-report.test.mjs +233 -0
  48. package/api/gap-report/gap-report.type.d.mts +41 -0
  49. package/api/gap-report/gap-report.type.mjs +18 -0
  50. package/api/hook/_adapter.mjs +3 -11
  51. package/api/hook/hook.doc.mjs +4 -0
  52. package/api/hook/list/list.d.mts +1 -1
  53. package/api/init/_adapter.d.mts +22 -0
  54. package/api/init/_adapter.mjs +59 -0
  55. package/api/init/init.d.mts +7 -5
  56. package/api/init/init.doc.mjs +28 -7
  57. package/api/init/init.mjs +28 -4
  58. package/api/init/init.type.d.mts +48 -3
  59. package/api/init/init.type.mjs +37 -3
  60. package/api/init/run/run.d.mts +1 -1
  61. package/api/init/run/run.mjs +15 -4
  62. package/api/init/user/user.d.mts +14 -0
  63. package/api/init/user/user.mjs +87 -0
  64. package/api/init/user/user.test.mjs +232 -0
  65. package/api/integration/_adapter.d.mts +33 -0
  66. package/api/integration/_adapter.mjs +58 -0
  67. package/api/integration/authoring-checks.mjs +100 -5
  68. package/api/integration/authoring-checks.test.mjs +769 -0
  69. package/api/integration/authoring-checks.type.d.mts +134 -0
  70. package/api/integration/authoring-checks.type.mjs +60 -1
  71. package/api/integration/integrationCheck.doc.mjs +1 -1
  72. package/api/integration/integrationComponentConflicts.doc.mjs +11 -3
  73. package/api/integration/integrationDocConflicts.doc.mjs +22 -5
  74. package/api/integration/pack-check.mjs +303 -13
  75. package/api/integration/pack-check.test.mjs +371 -10
  76. package/api/integration/validate-integration-fixes.test.mjs +67 -0
  77. package/api/integration/validate-integration.d.mts +8 -0
  78. package/api/integration/validate-integration.mjs +55 -9
  79. package/api/integration/validate-integration.test.mjs +77 -8
  80. package/api/integration/validate-integration.type.d.mts +8 -0
  81. package/api/integration/validate-integration.type.mjs +3 -1
  82. package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
  83. package/api/integration/validateIntegration.doc.mjs +4 -2
  84. package/api/search/_adapter.d.mts +11 -0
  85. package/api/search/_adapter.mjs +25 -0
  86. package/api/search/search.d.mts +73 -13
  87. package/api/search/search.doc.mjs +8 -3
  88. package/api/search/search.domain-priority.test.mjs +108 -18
  89. package/api/search/search.mjs +541 -52
  90. package/api/search/search.test.mjs +143 -1
  91. package/api/search/search.type.d.mts +14 -1
  92. package/api/search/search.type.mjs +6 -1
  93. package/api/swizzle/_adapter.mjs +2 -2
  94. package/api/swizzle/copy/copy.mjs +1 -1
  95. package/api/template/template-integration.test.mjs +1 -1
  96. package/api/theme/_adapter.d.mts +16 -0
  97. package/api/theme/_adapter.mjs +32 -5
  98. package/api/theme/build/build.d.mts +2 -1
  99. package/api/theme/build/build.mjs +70 -14
  100. package/api/theme/build/build.packed-old-core.test.mjs +20 -3
  101. package/api/theme/build/font-warning.mjs +5 -3
  102. package/api/theme/build/font-warning.test.mjs +2 -1
  103. package/api/theme/remove/remove.test.mjs +2 -2
  104. package/api/theme/targets/targets.mjs +3 -10
  105. package/api/theme/themeTargets.doc.mjs +4 -0
  106. package/api/theme/use/use.test.mjs +1 -1
  107. package/api/upgrade/_adapter.d.mts +40 -2
  108. package/api/upgrade/_adapter.mjs +118 -5
  109. package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
  110. package/api/upgrade/run/run.mjs +35 -2
  111. package/api/upgrade/status/status.d.mts +21 -5
  112. package/api/upgrade/status/status.mjs +45 -8
  113. package/api/upgrade/upgrade.doc.mjs +6 -3
  114. package/api/upgrade/upgrade.mjs +5 -1
  115. package/api/upgrade/upgrade.type.d.mts +23 -0
  116. package/api/upgrade/upgrade.type.mjs +16 -1
  117. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  118. package/assets/codemods/registry.mjs +1 -0
  119. package/assets/codemods/runner.mjs +7 -1
  120. package/assets/codemods/transforms/next/index.mjs +1 -11
  121. package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
  122. package/assets/discover/official-packages.json +367 -0
  123. package/assets/docs/author-a-theme.doc.mjs +2 -2
  124. package/assets/docs/browser-support.doc.mjs +1 -1
  125. package/assets/docs/getting-started.doc.mjs +23 -3
  126. package/assets/docs/styling-overview.doc.mjs +1 -1
  127. package/assets/docs/theme.doc.mjs +1 -1
  128. package/assets/docs/tree/add-a-component.doc.mjs +12 -2
  129. package/assets/docs/tree/add-a-theme.doc.mjs +13 -3
  130. package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
  131. package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
  132. package/assets/docs/tree/block-template.doc.mjs +6 -18
  133. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  134. package/assets/docs/tree/building-blocks.doc.mjs +4 -0
  135. package/assets/docs/tree/check-the-props.doc.mjs +8 -3
  136. package/assets/docs/tree/check-your-docs.doc.mjs +30 -13
  137. package/assets/docs/tree/checks.doc.mjs +17 -17
  138. package/assets/docs/tree/ci-and-containers.doc.mjs +88 -0
  139. package/assets/docs/tree/cli-command.doc.mjs +142 -0
  140. package/assets/docs/tree/cli.doc.mjs +6 -0
  141. package/assets/docs/tree/codemods.doc.mjs +17 -7
  142. package/assets/docs/tree/commands.doc.mjs +7 -1
  143. package/assets/docs/tree/component-family.doc.mjs +3 -5
  144. package/assets/docs/tree/component-imports.doc.mjs +13 -3
  145. package/assets/docs/tree/components.doc.mjs +7 -1
  146. package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
  147. package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
  148. package/assets/docs/tree/configuration.doc.mjs +7 -3
  149. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
  150. package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
  151. package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
  152. package/assets/docs/tree/docs.doc.mjs +9 -3
  153. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  154. package/assets/docs/tree/document-the-theme.doc.mjs +3 -3
  155. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  156. package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
  157. package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
  158. package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
  159. package/assets/docs/tree/global-integrations.doc.mjs +124 -0
  160. package/assets/docs/tree/global.doc.mjs +131 -0
  161. package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
  162. package/assets/docs/tree/install-once.doc.mjs +105 -0
  163. package/assets/docs/tree/integrations.doc.mjs +13 -1
  164. package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
  165. package/assets/docs/tree/layout.doc.mjs +6 -6
  166. package/assets/docs/tree/links.doc.mjs +6 -5
  167. package/assets/docs/tree/migration-setup.doc.mjs +3 -2
  168. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  169. package/assets/docs/tree/migration.doc.mjs +0 -1
  170. package/assets/docs/tree/monorepos.doc.mjs +84 -0
  171. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  172. package/assets/docs/tree/page-template.doc.mjs +3 -7
  173. package/assets/docs/tree/problems.doc.mjs +205 -0
  174. package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
  175. package/assets/docs/tree/publishing.doc.mjs +6 -6
  176. package/assets/docs/tree/quick-start.doc.mjs +52 -26
  177. package/assets/docs/tree/reference.doc.mjs +192 -0
  178. package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
  179. package/assets/docs/tree/replace-a-core-template.doc.mjs +9 -11
  180. package/assets/docs/tree/scaffold.doc.mjs +1 -1
  181. package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
  182. package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
  183. package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
  184. package/assets/docs/tree/single-component.doc.mjs +14 -6
  185. package/assets/docs/tree/start-a-template.doc.mjs +18 -8
  186. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  187. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  188. package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
  189. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  190. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  191. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  192. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  193. package/assets/docs/tree/templates.doc.mjs +7 -1
  194. package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
  195. package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
  196. package/assets/docs/tree/themes.doc.mjs +4 -0
  197. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  198. package/assets/docs/tree/troubleshooting.doc.mjs +22 -14
  199. package/assets/docs/tree/uninstall.doc.mjs +109 -0
  200. package/assets/docs/tree/updates.doc.mjs +92 -0
  201. package/assets/docs/tree/upgrading.doc.mjs +6 -6
  202. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +14 -2
  203. package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
  204. package/assets/docs/tree/versioning.doc.mjs +9 -9
  205. package/assets/docs/tree/who-answers.doc.mjs +119 -0
  206. package/assets/docs/tree/write-the-template-file.doc.mjs +5 -5
  207. package/assets/docs/working-with-ai.doc.mjs +23 -9
  208. package/authoring/codemod/codemod.doc.mjs +7 -3
  209. package/authoring/config/config.doc.mjs +9 -6
  210. package/authoring/config/type.ts +4 -2
  211. package/authoring/debug/parse.d.mts +5 -5
  212. package/authoring/discover/discover.doc.mjs +7 -1
  213. package/authoring/doctypes/_schema.d.mts +8 -3
  214. package/authoring/doctypes/_schema.mjs +1 -0
  215. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  216. package/authoring/doctypes/command/command.doc.mjs +20 -12
  217. package/authoring/doctypes/command/type.ts +14 -0
  218. package/authoring/doctypes/component/component.doc.mjs +29 -26
  219. package/authoring/doctypes/component/type.ts +15 -5
  220. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  221. package/authoring/doctypes/function/function.doc.mjs +9 -8
  222. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  223. package/authoring/doctypes/hook/type.ts +4 -0
  224. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  225. package/authoring/doctypes/reference/reference.doc.mjs +12 -11
  226. package/authoring/doctypes/schema/schema.doc.mjs +9 -9
  227. package/authoring/doctypes/template/template.doc.mjs +2 -2
  228. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  229. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  230. package/authoring/identity/identity.doc.mjs +3 -3
  231. package/authoring/index.d.ts +1 -0
  232. package/authoring/integration/integration.doc.mjs +22 -5
  233. package/authoring/integration/parse.test.mjs +11 -0
  234. package/authoring/integration/schema.d.mts +14 -3
  235. package/authoring/integration/schema.mjs +33 -2
  236. package/authoring/integration/type.ts +8 -0
  237. package/clients/cli/bin/astryx.mjs +20 -3
  238. package/clients/cli/cli-command.test.mjs +166 -0
  239. package/clients/cli/commands/blog.doc.mjs +1 -0
  240. package/clients/cli/commands/build-theme.batch-report.test.mjs +14 -2
  241. package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
  242. package/clients/cli/commands/build-theme.mjs +25 -12
  243. package/clients/cli/commands/build.doc.mjs +1 -0
  244. package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
  245. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  246. package/clients/cli/commands/component.doc.mjs +1 -0
  247. package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
  248. package/clients/cli/commands/discover.doc.mjs +9 -1
  249. package/clients/cli/commands/discover.mjs +144 -93
  250. package/clients/cli/commands/discover.no-source.test.mjs +448 -33
  251. package/clients/cli/commands/discover.sources.test.mjs +20 -1
  252. package/clients/cli/commands/docs.doc.mjs +1 -0
  253. package/clients/cli/commands/docs.mjs +49 -19
  254. package/clients/cli/commands/docs.test.mjs +2 -2
  255. package/clients/cli/commands/doctor-integration-components.doc.mjs +7 -3
  256. package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
  257. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
  258. package/clients/cli/commands/doctor-integration-validate.doc.mjs +13 -2
  259. package/clients/cli/commands/doctor-integration.test.mjs +52 -4
  260. package/clients/cli/commands/doctor.doc.mjs +12 -2
  261. package/clients/cli/commands/doctor.mjs +102 -7
  262. package/clients/cli/commands/doctor.test.mjs +10 -4
  263. package/clients/cli/commands/gap-report.doc.mjs +15 -2
  264. package/clients/cli/commands/gap-report.mjs +24 -2
  265. package/clients/cli/commands/gap-report.test.mjs +79 -0
  266. package/clients/cli/commands/hook.doc.mjs +1 -0
  267. package/clients/cli/commands/init.behavior.test.mjs +5 -0
  268. package/clients/cli/commands/init.doc.mjs +29 -3
  269. package/clients/cli/commands/integration-add.doc.mjs +7 -0
  270. package/clients/cli/commands/integration-authoring.test.mjs +49 -3
  271. package/clients/cli/commands/integration-check.doc.mjs +10 -2
  272. package/clients/cli/commands/integration-check.test.mjs +175 -1
  273. package/clients/cli/commands/integration-pack.doc.mjs +8 -1
  274. package/clients/cli/commands/integration-verify.doc.mjs +8 -1
  275. package/clients/cli/commands/integration.mjs +15 -9
  276. package/clients/cli/commands/json-contract.test.mjs +11 -2
  277. package/clients/cli/commands/manifest.doc.mjs +1 -0
  278. package/clients/cli/commands/outside-project.test.mjs +774 -0
  279. package/clients/cli/commands/search.doc.mjs +1 -0
  280. package/clients/cli/commands/search.mjs +16 -11
  281. package/clients/cli/commands/search.test.mjs +429 -296
  282. package/clients/cli/commands/setup-nudge.test.mjs +102 -2
  283. package/clients/cli/commands/swizzle.doc.mjs +7 -0
  284. package/clients/cli/commands/swizzle.mjs +5 -3
  285. package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
  286. package/clients/cli/commands/template.doc.mjs +1 -0
  287. package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
  288. package/clients/cli/commands/theme-add.doc.mjs +8 -1
  289. package/clients/cli/commands/theme-build.doc.mjs +1 -0
  290. package/clients/cli/commands/theme-eject.doc.mjs +1 -0
  291. package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
  292. package/clients/cli/commands/theme-list.doc.mjs +1 -0
  293. package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
  294. package/clients/cli/commands/theme-remove.doc.mjs +7 -0
  295. package/clients/cli/commands/theme-targets.doc.mjs +1 -0
  296. package/clients/cli/commands/theme-template.doc.mjs +1 -0
  297. package/clients/cli/commands/theme-use.doc.mjs +7 -0
  298. package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
  299. package/clients/cli/commands/upgrade.doc.mjs +22 -1
  300. package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
  301. package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
  302. package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
  303. package/clients/cli/index.mjs +111 -16
  304. package/clients/cli/lib/cli-error.mjs +4 -1
  305. package/clients/cli/lib/component-format.test.mjs +1 -1
  306. package/clients/cli/lib/define-command.mjs +2 -2
  307. package/clients/cli/lib/json-shim.mjs +3 -1
  308. package/clients/cli/lib/manifest.d.ts +9 -0
  309. package/clients/cli/lib/manifest.mjs +17 -1
  310. package/clients/cli/lib/manifest.test.mjs +25 -0
  311. package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
  312. package/foundation/agent-docs/agent-doc-state.mjs +66 -6
  313. package/foundation/agent-docs/agent-docs.d.mts +4 -3
  314. package/foundation/agent-docs/agent-docs.mjs +11 -9
  315. package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
  316. package/foundation/agent-docs/computer-agent-text.mjs +623 -0
  317. package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
  318. package/foundation/config/project.d.mts +35 -3
  319. package/foundation/config/project.mjs +145 -8
  320. package/foundation/config/project.test.mjs +66 -0
  321. package/foundation/config/theme-state.mjs +5 -4
  322. package/foundation/discovery/authoring-self-docs.mjs +1 -1
  323. package/foundation/discovery/cli-self-docs.mjs +20 -3
  324. package/foundation/discovery/cli-self-docs.test.mjs +3 -2
  325. package/foundation/discovery/component-replacement.mjs +2 -1
  326. package/foundation/discovery/copied-passages.d.mts +216 -0
  327. package/foundation/discovery/copied-passages.mjs +720 -0
  328. package/foundation/discovery/copied-passages.test.mjs +124 -0
  329. package/foundation/discovery/doc-consistency.d.mts +34 -0
  330. package/foundation/discovery/doc-consistency.mjs +513 -0
  331. package/foundation/discovery/doc-consistency.test.mjs +347 -0
  332. package/foundation/discovery/doc-fluff.d.mts +112 -0
  333. package/foundation/discovery/doc-fluff.mjs +328 -0
  334. package/foundation/discovery/doc-fluff.test.mjs +142 -0
  335. package/foundation/discovery/doc-types.d.mts +1 -1
  336. package/foundation/discovery/doc-types.mjs +15 -8
  337. package/foundation/discovery/doc-types.test.mjs +94 -2
  338. package/foundation/discovery/docs-discovery.d.mts +7 -0
  339. package/foundation/discovery/docs-discovery.mjs +26 -2
  340. package/foundation/discovery/project-typescript.d.mts +11 -2
  341. package/foundation/discovery/project-typescript.mjs +32 -4
  342. package/foundation/discovery/prop-drift.d.mts +26 -7
  343. package/foundation/discovery/prop-drift.mjs +173 -8
  344. package/foundation/discovery/prop-drift.test.mjs +120 -2
  345. package/foundation/discovery/runner-allowlist.d.mts +40 -0
  346. package/foundation/discovery/runner-allowlist.mjs +53 -0
  347. package/foundation/discovery/stray-pointers.d.mts +52 -0
  348. package/foundation/discovery/stray-pointers.mjs +293 -0
  349. package/foundation/discovery/stray-pointers.test.mjs +86 -0
  350. package/foundation/discovery/template-needs.mjs +5 -2
  351. package/foundation/discovery/theme-imports.mjs +8 -4
  352. package/foundation/discovery/theme-imports.test.mjs +1 -1
  353. package/foundation/discovery/type-text.mjs +1 -1
  354. package/foundation/discovery/type-text.test.mjs +1 -1
  355. package/foundation/doc-compiler/doc-loads.test.mjs +42 -2
  356. package/foundation/doc-compiler/inputs.mjs +4 -1
  357. package/foundation/doc-compiler/links.d.mts +32 -0
  358. package/foundation/doc-compiler/links.mjs +163 -26
  359. package/foundation/doc-compiler/links.test.mjs +97 -4
  360. package/foundation/doc-compiler/read.d.mts +1 -1
  361. package/foundation/doc-compiler/tree.mjs +30 -1
  362. package/foundation/doc-compiler/tree.test.mjs +8 -1
  363. package/foundation/env/cli-command.d.mts +83 -0
  364. package/foundation/env/cli-command.mjs +152 -0
  365. package/foundation/env/cli-command.test.mjs +129 -0
  366. package/foundation/env/node-version.test.mjs +15 -3
  367. package/foundation/env/package-manager.d.mts +93 -9
  368. package/foundation/env/package-manager.global.test.mjs +66 -0
  369. package/foundation/env/package-manager.mjs +184 -13
  370. package/foundation/env/package-manager.test.mjs +341 -15
  371. package/foundation/env/project-scope.d.mts +9 -0
  372. package/foundation/env/project-scope.mjs +33 -0
  373. package/foundation/env/search-path.d.mts +42 -0
  374. package/foundation/env/search-path.mjs +205 -0
  375. package/foundation/env/search-path.test.mjs +122 -0
  376. package/foundation/env/user-dirs.d.mts +39 -0
  377. package/foundation/env/user-dirs.mjs +93 -0
  378. package/foundation/env/user-dirs.test.mjs +72 -0
  379. package/foundation/env/user-settings.d.mts +46 -0
  380. package/foundation/env/user-settings.mjs +106 -0
  381. package/foundation/env/user-settings.test.mjs +64 -0
  382. package/foundation/fs/file-protection.mjs +15 -1
  383. package/foundation/fs/module-loader.d.mts +2 -1
  384. package/foundation/fs/module-loader.mjs +60 -4
  385. package/foundation/fs/module-loader.stdout.test.mjs +3 -2
  386. package/foundation/fs/module-loader.test.mjs +194 -0
  387. package/foundation/fs/path-compare.d.mts +33 -0
  388. package/foundation/fs/path-compare.mjs +73 -0
  389. package/foundation/fs/paths.d.mts +57 -1
  390. package/foundation/fs/paths.mjs +131 -3
  391. package/foundation/fs/paths.test.mjs +10 -1
  392. package/foundation/integrations/computer-integrations.d.mts +78 -0
  393. package/foundation/integrations/computer-integrations.mjs +316 -0
  394. package/foundation/integrations/computer-integrations.test.mjs +292 -0
  395. package/foundation/integrations/contribution-inventory.d.mts +11 -0
  396. package/foundation/integrations/contribution-inventory.mjs +50 -2
  397. package/foundation/integrations/integration-warnings.mjs +3 -2
  398. package/foundation/integrations/integration-warnings.test.mjs +8 -9
  399. package/foundation/integrations/integrations.d.mts +25 -1
  400. package/foundation/integrations/integrations.mjs +46 -3
  401. package/foundation/integrations/issue.ts +6 -0
  402. package/foundation/integrations/validate-contributions.d.mts +2 -0
  403. package/foundation/integrations/validate-contributions.mjs +41 -1
  404. package/foundation/release/agent-text-worker.d.mts +4 -0
  405. package/foundation/release/agent-text-worker.mjs +52 -0
  406. package/foundation/release/cache.d.mts +310 -0
  407. package/foundation/release/cache.mjs +1216 -0
  408. package/foundation/release/cache.test.mjs +920 -0
  409. package/foundation/release/choose.d.mts +207 -0
  410. package/foundation/release/choose.mjs +677 -0
  411. package/foundation/release/choose.test.mjs +427 -0
  412. package/foundation/release/core-worker.d.mts +4 -0
  413. package/foundation/release/core-worker.mjs +38 -0
  414. package/foundation/release/global-state.d.mts +259 -0
  415. package/foundation/release/global-state.mjs +472 -0
  416. package/foundation/release/global-state.test.mjs +381 -0
  417. package/foundation/release/handoff.d.mts +60 -0
  418. package/foundation/release/handoff.e2e.test.mjs +278 -0
  419. package/foundation/release/handoff.mjs +357 -0
  420. package/foundation/release/lock-lease.d.mts +23 -0
  421. package/foundation/release/lock-lease.mjs +80 -0
  422. package/foundation/release/notices.d.mts +253 -0
  423. package/foundation/release/notices.mjs +596 -0
  424. package/foundation/release/notices.test.mjs +565 -0
  425. package/foundation/release/npm-guard.d.mts +4 -0
  426. package/foundation/release/npm-guard.mjs +126 -0
  427. package/foundation/release/project.d.mts +141 -0
  428. package/foundation/release/project.mjs +466 -0
  429. package/foundation/release/project.test.mjs +288 -0
  430. package/foundation/release/refresh-worker.d.mts +4 -0
  431. package/foundation/release/refresh-worker.mjs +27 -0
  432. package/foundation/release/run-context.d.mts +47 -0
  433. package/foundation/release/run-context.mjs +149 -0
  434. package/foundation/release/update-notice-env.d.mts +28 -0
  435. package/foundation/release/update-notice-env.mjs +39 -0
  436. package/foundation/response/base.d.ts +26 -3
  437. package/foundation/response/error-codes.d.mts +3 -1
  438. package/foundation/response/error-codes.doc.mjs +12 -0
  439. package/foundation/response/error-codes.mjs +17 -0
  440. package/foundation/response/error-codes.test.mjs +2 -0
  441. package/foundation/response/json-contract.test.mjs +7 -2
  442. package/foundation/response/json.mjs +4 -1
  443. package/foundation/response/response-types.doc.mjs +17 -11
  444. package/foundation/response/response-types.doc.test.mjs +46 -0
  445. package/foundation/response/response.doc.mjs +3 -3
  446. package/foundation/xle/browser-imports.test.mjs +74 -0
  447. package/package.json +11 -11
  448. package/scripts/postinstall.mjs +24 -5
  449. /package/assets/codemods/transforms/{next → v0.7.2}/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +0 -0
  450. /package/assets/codemods/transforms/{next → v0.7.2}/migrate-list-edge-compensation-to-edge.mjs +0 -0
@@ -40,6 +40,7 @@ import {
40
40
  } from '../../foundation/discovery/docs-discovery.mjs';
41
41
  import {discoverIntegrationThemes} from '../../foundation/discovery/theme-discovery.mjs';
42
42
  import {inspectPackageExport} from '../../foundation/discovery/package-exports.mjs';
43
+ import {parse as parseModule} from '@babel/parser';
43
44
  import {moduleExportsName} from '../../foundation/discovery/module-exports.mjs';
44
45
  import {
45
46
  ThemeImportError,
@@ -68,6 +69,7 @@ import {
68
69
  collectIdentities,
69
70
  compareIdentities,
70
71
  } from '../../foundation/integrations/contribution-inventory.mjs';
72
+ import {formatCliCommand} from '../../foundation/env/package-manager.mjs';
71
73
 
72
74
  /**
73
75
  * @typedef {import('../../foundation/integrations/issue').AstryxIntegrationIssue} Issue
@@ -574,6 +576,7 @@ async function validateIncompleteThemeExports(
574
576
  path.join(os.tmpdir(), `astryx-theme-${localTheme.slug}-`),
575
577
  );
576
578
  const expectedCss = path.join(expectedDir, `${localTheme.slug}.css`);
579
+ let expectedModule = path.join(expectedDir, `${localTheme.slug}.js`);
577
580
  try {
578
581
  if (outputs.some(output => output.kind !== 'font stylesheet')) {
579
582
  // The scratch directory is the write root; the package stays the cwd,
@@ -583,6 +586,12 @@ async function validateIncompleteThemeExports(
583
586
  if (receipt == null || receipt.type !== 'theme.build') {
584
587
  throw new Error('the theme build produced no complete receipt');
585
588
  }
589
+ expectedModule = builtModuleFile(
590
+ receipt,
591
+ packageDir,
592
+ expectedDir,
593
+ localTheme.slug,
594
+ );
586
595
  }
587
596
  for (const output of outputs) {
588
597
  const localFile = /** @type {string} */ (output.inspected.target);
@@ -599,9 +608,7 @@ async function validateIncompleteThemeExports(
599
608
  continue;
600
609
  }
601
610
  const expectedFile =
602
- output.kind === 'module'
603
- ? path.join(expectedDir, `${localTheme.slug}.js`)
604
- : expectedCss;
611
+ output.kind === 'module' ? expectedModule : expectedCss;
605
612
  const expected = normalizeThemeVerifyForCompare(
606
613
  fs.readFileSync(expectedFile, 'utf-8'),
607
614
  );
@@ -617,7 +624,7 @@ async function validateIncompleteThemeExports(
617
624
  output.kind === 'module'
618
625
  ? 'theme_module_stale'
619
626
  : 'theme_stylesheet_stale',
620
- `Theme "${localTheme.slug}" ${output.kind} does not match ${sourceRelative}. This incomplete export remains packable, but run \`astryx theme build ${sourceRelative}\` before adding its matching export.`,
627
+ `Theme "${localTheme.slug}" ${output.kind} does not match ${sourceRelative}. This incomplete export remains packable, but run \`${formatCliCommand(`theme build ${sourceRelative}`, packageDir)}\` before adding its matching export.`,
621
628
  ),
622
629
  );
623
630
  }
@@ -636,7 +643,7 @@ async function validateIncompleteThemeExports(
636
643
  issues.push(
637
644
  error(
638
645
  'theme_build_failed',
639
- `Theme "${localTheme.slug}" could not be rebuilt from ${sourceRelative}: ${err instanceof Error ? err.message : String(err)} Run \`astryx theme build ${sourceRelative}\` before packing.`,
646
+ `Theme "${localTheme.slug}" could not be rebuilt from ${sourceRelative}: ${err instanceof Error ? err.message : String(err)} Run \`${formatCliCommand(`theme build ${sourceRelative}`, packageDir)}\` before packing.`,
640
647
  ),
641
648
  );
642
649
  } finally {
@@ -645,6 +652,250 @@ async function validateIncompleteThemeExports(
645
652
  return issues;
646
653
  }
647
654
 
655
+ /**
656
+ * The module a scratch `theme build` wrote. Its file is named by the theme's
657
+ * own name, which can differ from the slug the package exports it under. A
658
+ * receipt that names no file inside the scratch directory falls back to the
659
+ * slug.
660
+ * @param {any} receipt
661
+ * @param {string} cwd the directory the build ran in
662
+ * @param {string} expectedDir
663
+ * @param {string} slug
664
+ * @returns {string}
665
+ */
666
+ function builtModuleFile(receipt, cwd, expectedDir, slug) {
667
+ const written = receipt?.data?.outputs?.js;
668
+ if (typeof written === 'string') {
669
+ const file = path.resolve(cwd, written);
670
+ const relative = path.relative(expectedDir, file);
671
+ if (relative && !relative.startsWith('..') && !path.isAbsolute(relative)) {
672
+ return file;
673
+ }
674
+ }
675
+ return path.join(expectedDir, `${slug}.js`);
676
+ }
677
+
678
+ /**
679
+ * The `.js` file a relative module specifier names from `fromFile`, the
680
+ * extension `theme build` gives the built module: the exact path, the path
681
+ * with `.js`, or its `index.js`.
682
+ * @param {string} specifier
683
+ * @param {string} fromFile
684
+ * @returns {string | null}
685
+ */
686
+ function resolveRelativeJsModule(specifier, fromFile) {
687
+ if (!specifier.startsWith('./') && !specifier.startsWith('../')) return null;
688
+ const base = path.resolve(path.dirname(fromFile), specifier);
689
+ const candidates = [base, `${base}.js`, path.join(base, 'index.js')];
690
+ return (
691
+ candidates.find(candidate => {
692
+ try {
693
+ return candidate.endsWith('.js') && fs.statSync(candidate).isFile();
694
+ } catch {
695
+ return false;
696
+ }
697
+ }) ?? null
698
+ );
699
+ }
700
+
701
+ /** @param {string} file */
702
+ function realFile(file) {
703
+ try {
704
+ return fs.realpathSync(file);
705
+ } catch {
706
+ return null;
707
+ }
708
+ }
709
+
710
+ /**
711
+ * The file a stylesheet import names: a relative path from the module, or a
712
+ * subpath of the package itself, resolved through its own exports.
713
+ * @param {string} specifier
714
+ * @param {string} moduleFile
715
+ * @param {{name?: string}} pkg
716
+ * @param {string} packageDir
717
+ * @returns {string | null}
718
+ */
719
+ function resolveStylesheetImport(specifier, moduleFile, pkg, packageDir) {
720
+ if (specifier.startsWith('./') || specifier.startsWith('../')) {
721
+ const file = path.resolve(path.dirname(moduleFile), specifier);
722
+ try {
723
+ return fs.statSync(file).isFile() ? realFile(file) : null;
724
+ } catch {
725
+ return null;
726
+ }
727
+ }
728
+ if (typeof pkg.name !== 'string' || !specifier.startsWith(`${pkg.name}/`)) {
729
+ return null;
730
+ }
731
+ const exported = inspectPackageExport(
732
+ pkg,
733
+ packageDir,
734
+ `.${specifier.slice(pkg.name.length)}`,
735
+ );
736
+ return exported.exported && exported.target
737
+ ? realFile(exported.target)
738
+ : null;
739
+ }
740
+
741
+ /**
742
+ * The theme binding of a built module: the name of its `export const`.
743
+ * @param {string} file
744
+ * @returns {string | null}
745
+ */
746
+ function builtThemeBinding(file) {
747
+ try {
748
+ const ast = parseModule(fs.readFileSync(file, 'utf-8'), {
749
+ sourceType: 'module',
750
+ plugins: ['importAttributes'],
751
+ });
752
+ for (const node of ast.program.body) {
753
+ if (
754
+ node.type === 'ExportNamedDeclaration' &&
755
+ node.declaration?.type === 'VariableDeclaration'
756
+ ) {
757
+ const id = node.declaration.declarations[0]?.id;
758
+ return id?.type === 'Identifier' ? id.name : null;
759
+ }
760
+ }
761
+ } catch {
762
+ // An unreadable module has no binding to match.
763
+ }
764
+ return null;
765
+ }
766
+
767
+ /** @param {any} node */
768
+ function exportedName(node) {
769
+ return node?.name ?? node?.value;
770
+ }
771
+
772
+ /**
773
+ * Check a `.js` or `.mjs` theme module that is not the built module itself.
774
+ * It is accepted when it only loads the theme's own styles and re-exports the
775
+ * built module: each statement imports the theme's exported stylesheet or font
776
+ * stylesheet for its side effects, except one, which re-exports from a `.js`
777
+ * file that matches the built module either everything or only its theme,
778
+ * under the theme's export name. Returns null for any other file and for a module that
779
+ * re-exports nothing, and otherwise whether it is accepted. A
780
+ * rejection gives the reason, or, when only the re-exported module is stale,
781
+ * that module's specifier with `rebuild` set.
782
+ *
783
+ * @param {string} moduleFile
784
+ * @param {string} expected the built module, normalized for comparison
785
+ * @param {{exportName: string, stylesheetFile: string, fontStylesheetFile?: string, pkg: {name?: string}, packageDir: string}} theme
786
+ * @returns {{ok: true} | {ok: false, reason: string, rebuild: boolean} | null}
787
+ */
788
+ function ownStylesEntry(moduleFile, expected, theme) {
789
+ if (!/\.m?js$/u.test(moduleFile)) return null;
790
+ let ast;
791
+ try {
792
+ ast = parseModule(fs.readFileSync(moduleFile, 'utf-8'), {
793
+ sourceType: 'module',
794
+ plugins: ['importAttributes'],
795
+ });
796
+ } catch {
797
+ return null;
798
+ }
799
+ const body = ast.program.body;
800
+ const reexports = body.filter(
801
+ (/** @type {any} */ node) =>
802
+ node.type === 'ExportAllDeclaration' ||
803
+ (node.type === 'ExportNamedDeclaration' && node.source != null),
804
+ );
805
+ if (reexports.length === 0) return null;
806
+ /** @param {string} reason @param {boolean} [rebuild] */
807
+ const reject = (reason, rebuild = false) => ({
808
+ ok: /** @type {const} */ (false),
809
+ reason,
810
+ rebuild,
811
+ });
812
+ if (reexports.length > 1) return reject('it has more than one re-export');
813
+ if ((ast.program.directives ?? []).length > 0) {
814
+ return reject('it has a directive');
815
+ }
816
+ const ownStylesheets = new Set(
817
+ [theme.stylesheetFile, theme.fontStylesheetFile]
818
+ .filter(file => file != null)
819
+ .map(file => realFile(/** @type {string} */ (file))),
820
+ );
821
+ const imported = new Set();
822
+ for (const node of body) {
823
+ if (node === reexports[0]) continue;
824
+ const line = node.loc?.start.line;
825
+ if (node.type !== 'ImportDeclaration') {
826
+ return reject(
827
+ `line ${line} is neither a stylesheet import nor the re-export`,
828
+ );
829
+ }
830
+ const specifier = node.source.value;
831
+ if (
832
+ node.importKind === 'type' ||
833
+ node.specifiers.length > 0 ||
834
+ (node.attributes ?? []).length > 0 ||
835
+ node.phase != null
836
+ ) {
837
+ return reject(`its import of ${specifier} is not a side-effect import`);
838
+ }
839
+ const file = resolveStylesheetImport(
840
+ specifier,
841
+ moduleFile,
842
+ theme.pkg,
843
+ theme.packageDir,
844
+ );
845
+ if (!file || !ownStylesheets.has(file)) {
846
+ return reject(
847
+ `${specifier} is not the theme's own stylesheet or font stylesheet`,
848
+ );
849
+ }
850
+ if (imported.has(file)) return reject(`it imports ${specifier} twice`);
851
+ imported.add(file);
852
+ }
853
+ const reexport = /** @type {any} */ (reexports[0]);
854
+ const from = reexport.source.value;
855
+ /** @type {string | null} */
856
+ let reexported = null;
857
+ if (
858
+ reexport.exportKind === 'type' ||
859
+ (reexport.attributes ?? []).length > 0
860
+ ) {
861
+ return reject(`its re-export from ${from} is not a plain re-export`);
862
+ }
863
+ if (reexport.type === 'ExportAllDeclaration') {
864
+ if (reexport.exported != null) {
865
+ return reject(`it re-exports ${from} as a namespace`);
866
+ }
867
+ } else {
868
+ const specifiers = reexport.specifiers ?? [];
869
+ if (
870
+ specifiers.length !== 1 ||
871
+ specifiers[0].type !== 'ExportSpecifier' ||
872
+ specifiers[0].exportKind === 'type' ||
873
+ exportedName(specifiers[0].exported) !== theme.exportName
874
+ ) {
875
+ return reject(`it re-exports names other than ${theme.exportName}`);
876
+ }
877
+ reexported = exportedName(specifiers[0].local);
878
+ }
879
+ const target = resolveRelativeJsModule(from, moduleFile);
880
+ if (!target) {
881
+ return reject(`its re-export from ${from} does not name a .js module`);
882
+ }
883
+ if (
884
+ normalizeThemeVerifyForCompare(fs.readFileSync(target, 'utf-8')) !==
885
+ expected
886
+ ) {
887
+ return reject(from, true);
888
+ }
889
+ // `theme build` names the theme's export after the theme's own name, which
890
+ // can differ from its slug, so a named re-export may give that export the
891
+ // slug's export name. It must be the theme, not another export of the built
892
+ // module, such as its icon registry.
893
+ if (reexported != null && reexported !== builtThemeBinding(target)) {
894
+ return reject(`it re-exports ${reexported}, which is not the built theme`);
895
+ }
896
+ return {ok: /** @type {const} */ (true)};
897
+ }
898
+
648
899
  /**
649
900
  * Prove local theme exports are fresh, prove the same exports resolve from the
650
901
  * tarball, and reject lifecycle changes to source or built output bytes.
@@ -711,7 +962,7 @@ async function validatePackedThemeExports(
711
962
  issues.push(
712
963
  warning(
713
964
  'theme_exports_missing',
714
- `Theme "${localTheme.slug}" has no declared built exports. The package remains source-compatible. To make it importable, run \`astryx theme build ${sourceRelative}\` and export "./themes/${localTheme.slug}" plus "./themes/${localTheme.slug}.css" from package.json; \`astryx integration add theme ${localTheme.slug}\` creates those exports for a new theme.`,
965
+ `Theme "${localTheme.slug}" has no declared built exports. The package remains source-compatible. To make it importable, run \`${formatCliCommand(`theme build ${sourceRelative}`, localIntegration.__packageDir)}\` and export "./themes/${localTheme.slug}" plus "./themes/${localTheme.slug}.css" from package.json; \`${formatCliCommand(`integration add theme ${localTheme.slug}`, localIntegration.__packageDir)}\` creates those exports for a new theme.`,
715
966
  ),
716
967
  );
717
968
  continue;
@@ -751,7 +1002,7 @@ async function validatePackedThemeExports(
751
1002
  err instanceof ThemeImportError
752
1003
  ? 'theme_import_unresolvable'
753
1004
  : 'theme_import_invalid',
754
- `${message} Run \`astryx theme build ${sourceRelative}\` before packing.`,
1005
+ `${message} Run \`${formatCliCommand(`theme build ${sourceRelative}`, localIntegration.__packageDir)}\` before packing.`,
755
1006
  ),
756
1007
  );
757
1008
  continue;
@@ -772,12 +1023,17 @@ async function validatePackedThemeExports(
772
1023
  issues.push(
773
1024
  error(
774
1025
  'theme_build_failed',
775
- `Theme "${localTheme.slug}" did not produce a complete build. Run \`astryx theme build ${sourceRelative}\` before packing.`,
1026
+ `Theme "${localTheme.slug}" did not produce a complete build. Run \`${formatCliCommand(`theme build ${sourceRelative}`, localIntegration.__packageDir)}\` before packing.`,
776
1027
  ),
777
1028
  );
778
1029
  continue;
779
1030
  }
780
- const expectedModule = path.join(expectedDir, `${localTheme.slug}.js`);
1031
+ const expectedModule = builtModuleFile(
1032
+ receipt,
1033
+ localIntegration.__packageDir,
1034
+ expectedDir,
1035
+ localTheme.slug,
1036
+ );
781
1037
  /** @type {Array<{kind: string, expected: string, local: string, packed: string, staleCode: string, packedCode: string}>} */
782
1038
  const buildOutputs = [
783
1039
  {
@@ -797,6 +1053,20 @@ async function validatePackedThemeExports(
797
1053
  packedCode: 'packed_theme_stylesheet_changed',
798
1054
  },
799
1055
  ];
1056
+ const localEntry = {
1057
+ exportName: localTheme.exportName,
1058
+ stylesheetFile: localImports.stylesheetFile,
1059
+ fontStylesheetFile: localImports.fontStylesheetFile,
1060
+ pkg: integrationPackageMetadata(localIntegration),
1061
+ packageDir: localIntegration.__packageDir,
1062
+ };
1063
+ const packedEntry = {
1064
+ exportName: packedTheme.exportName,
1065
+ stylesheetFile: packedImports.stylesheetFile,
1066
+ fontStylesheetFile: packedImports.fontStylesheetFile,
1067
+ pkg: integrationPackageMetadata(packedIntegration),
1068
+ packageDir: packedIntegration.__packageDir,
1069
+ };
800
1070
  for (const output of buildOutputs) {
801
1071
  const expected = normalizeThemeVerifyForCompare(
802
1072
  fs.readFileSync(output.expected, 'utf-8'),
@@ -807,15 +1077,31 @@ async function validatePackedThemeExports(
807
1077
  const packed = normalizeThemeVerifyForCompare(
808
1078
  fs.readFileSync(output.packed, 'utf-8'),
809
1079
  );
810
- if (expected !== local) {
1080
+ // A module that is not the built module may still be an entry that
1081
+ // loads the theme's own styles and re-exports the built module.
1082
+ const localWrapper =
1083
+ output.kind === 'module' && expected !== local
1084
+ ? ownStylesEntry(output.local, expected, localEntry)
1085
+ : null;
1086
+ const packedWrapper =
1087
+ output.kind === 'module' && expected !== packed
1088
+ ? ownStylesEntry(output.packed, expected, packedEntry)
1089
+ : null;
1090
+ const localMatches = expected === local || localWrapper?.ok === true;
1091
+ const packedMatches = expected === packed || packedWrapper?.ok === true;
1092
+ if (!localMatches) {
811
1093
  issues.push(
812
1094
  error(
813
1095
  output.staleCode,
814
- `Theme "${localTheme.slug}" ${output.kind} does not match ${sourceRelative}. Run \`astryx theme build ${sourceRelative}\` before packing.`,
1096
+ localWrapper && !localWrapper.ok && !localWrapper.rebuild
1097
+ ? `Theme "${localTheme.slug}" module is not the module \`${formatCliCommand(`theme build ${sourceRelative}`, localIntegration.__packageDir)}\` writes and does not only wrap it: ${localWrapper.reason}. A module that wraps the built module may only import the theme's own stylesheet and font stylesheet for their side effects and re-export from the built module either everything or only its theme, as ${localTheme.exportName}.`
1098
+ : localWrapper && !localWrapper.ok
1099
+ ? `Theme "${localTheme.slug}" module re-exports ${localWrapper.reason}, which does not match ${sourceRelative}. Run \`${formatCliCommand(`theme build ${sourceRelative}`, localIntegration.__packageDir)}\` before packing.`
1100
+ : `Theme "${localTheme.slug}" ${output.kind} does not match ${sourceRelative}. Run \`${formatCliCommand(`theme build ${sourceRelative}`, localIntegration.__packageDir)}\` before packing.`,
815
1101
  ),
816
1102
  );
817
1103
  }
818
- if (local !== packed) {
1104
+ if (local !== packed || (localMatches && !packedMatches)) {
819
1105
  issues.push(
820
1106
  error(
821
1107
  output.packedCode,
@@ -843,7 +1129,7 @@ async function validatePackedThemeExports(
843
1129
  issues.push(
844
1130
  error(
845
1131
  'theme_build_failed',
846
- `Theme "${localTheme.slug}" could not be rebuilt from ${sourceRelative}: ${err instanceof Error ? err.message : String(err)} Run \`astryx theme build ${sourceRelative}\` before packing.`,
1132
+ `Theme "${localTheme.slug}" could not be rebuilt from ${sourceRelative}: ${err instanceof Error ? err.message : String(err)} Run \`${formatCliCommand(`theme build ${sourceRelative}`, localIntegration.__packageDir)}\` before packing.`,
847
1133
  ),
848
1134
  );
849
1135
  } finally {
@@ -1254,6 +1540,10 @@ export async function integrationPackCheck(options = {}) {
1254
1540
  code: `packed_${issue.code}`,
1255
1541
  severity: issue.severity,
1256
1542
  message: `Packed: ${issue.message}`,
1543
+ // The packed tree keeps the package's own paths.
1544
+ ...(issue.fix != null ? {fix: issue.fix} : {}),
1545
+ ...(issue.file != null ? {file: issue.file} : {}),
1546
+ ...(issue.line != null ? {line: issue.line} : {}),
1257
1547
  });
1258
1548
  }
1259
1549