@astryxdesign/cli 0.7.2-canary.fe2c655 → 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 (509) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +175 -154
  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/help/help.mjs +1 -1
  7. package/api/build/kit/kit.mjs +3 -11
  8. package/api/component/_adapter.d.mts +72 -1
  9. package/api/component/_adapter.mjs +212 -18
  10. package/api/component/component.doc.mjs +6 -1
  11. package/api/component/component.mjs +82 -15
  12. package/api/component/component.test.mjs +80 -0
  13. package/api/component/doc-links.test.mjs +386 -0
  14. package/api/component/integration-export-name.test.mjs +644 -0
  15. package/api/component/list/list.mjs +42 -4
  16. package/api/discover/_adapter.d.mts +132 -12
  17. package/api/discover/_adapter.mjs +488 -27
  18. package/api/discover/_adapter.test.mjs +599 -17
  19. package/api/discover/_catalog-view.d.mts +16 -5
  20. package/api/discover/_catalog-view.mjs +32 -8
  21. package/api/discover/detail/doc/doc.mjs +9 -1
  22. package/api/discover/discover.d.mts +11 -0
  23. package/api/discover/discover.doc.mjs +9 -7
  24. package/api/discover/discover.mjs +121 -19
  25. package/api/discover/discover.type.d.mts +20 -7
  26. package/api/discover/discover.type.mjs +17 -7
  27. package/api/discover/list/list.d.mts +4 -3
  28. package/api/discover/list/list.mjs +17 -10
  29. package/api/docs/_adapter.d.mts +74 -0
  30. package/api/docs/_adapter.mjs +553 -16
  31. package/api/docs/docs.doc.mjs +2 -1
  32. package/api/docs/docs.mjs +2 -1
  33. package/api/docs/docs.test.mjs +5 -2
  34. package/api/docs/integration-tree.test.mjs +22 -0
  35. package/api/docs/integrationDocs.test.mjs +124 -0
  36. package/api/docs/list/list.mjs +12 -2
  37. package/api/docs/reference-blocks.test.mjs +1 -3
  38. package/api/doctor/_adapter.d.mts +108 -0
  39. package/api/doctor/_adapter.mjs +223 -4
  40. package/api/doctor/doctor.d.mts +199 -0
  41. package/api/doctor/doctor.doc.mjs +3 -2
  42. package/api/doctor/doctor.mjs +530 -34
  43. package/api/doctor/doctor.test.mjs +180 -14
  44. package/api/doctor/release-checks.test.mjs +156 -0
  45. package/api/doctor/theme-checks.mjs +17 -4
  46. package/api/doctor/theme-checks.test.mjs +223 -7
  47. package/api/error.d.mts +10 -0
  48. package/api/error.mjs +25 -0
  49. package/api/gap-report/gap-report.d.mts +3 -0
  50. package/api/gap-report/gap-report.doc.mjs +11 -3
  51. package/api/gap-report/gap-report.mjs +219 -52
  52. package/api/gap-report/gap-report.test.mjs +233 -0
  53. package/api/gap-report/gap-report.type.d.mts +41 -0
  54. package/api/gap-report/gap-report.type.mjs +18 -0
  55. package/api/hook/_adapter.mjs +3 -11
  56. package/api/hook/hook.doc.mjs +4 -0
  57. package/api/hook/list/list.d.mts +1 -1
  58. package/api/index.d.mts +2 -0
  59. package/api/index.mjs +2 -0
  60. package/api/init/_adapter.d.mts +22 -0
  61. package/api/init/_adapter.mjs +59 -0
  62. package/api/init/init.d.mts +7 -5
  63. package/api/init/init.doc.mjs +28 -7
  64. package/api/init/init.mjs +28 -4
  65. package/api/init/init.type.d.mts +48 -3
  66. package/api/init/init.type.mjs +37 -3
  67. package/api/init/run/run.d.mts +1 -1
  68. package/api/init/run/run.mjs +17 -6
  69. package/api/init/user/user.d.mts +14 -0
  70. package/api/init/user/user.mjs +87 -0
  71. package/api/init/user/user.test.mjs +232 -0
  72. package/api/integration/_adapter.d.mts +45 -0
  73. package/api/integration/_adapter.mjs +112 -0
  74. package/api/integration/add-contribution.component-names.test.mjs +66 -0
  75. package/api/integration/add-contribution.mjs +8 -4
  76. package/api/integration/add-contribution.test.mjs +4 -2
  77. package/api/integration/authoring-checks.mjs +110 -6
  78. package/api/integration/authoring-checks.test.mjs +808 -0
  79. package/api/integration/authoring-checks.type.d.mts +143 -0
  80. package/api/integration/authoring-checks.type.mjs +74 -2
  81. package/api/integration/check/check.d.mts +96 -0
  82. package/api/integration/check/check.mjs +357 -0
  83. package/api/integration/check/check.test.mjs +489 -0
  84. package/api/integration/integration-check.type.d.mts +118 -0
  85. package/api/integration/integration-check.type.mjs +84 -0
  86. package/api/integration/integrationCheck.doc.d.mts +10 -0
  87. package/api/integration/integrationCheck.doc.mjs +73 -0
  88. package/api/integration/integrationComponentConflicts.doc.mjs +45 -6
  89. package/api/integration/integrationDocConflicts.doc.mjs +22 -5
  90. package/api/integration/pack-check.mjs +364 -120
  91. package/api/integration/pack-check.test.mjs +730 -10
  92. package/api/integration/validate-integration-fixes.test.mjs +67 -0
  93. package/api/integration/validate-integration.d.mts +8 -0
  94. package/api/integration/validate-integration.mjs +63 -9
  95. package/api/integration/validate-integration.test.mjs +88 -8
  96. package/api/integration/validate-integration.type.d.mts +16 -0
  97. package/api/integration/validate-integration.type.mjs +14 -1
  98. package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
  99. package/api/integration/validateIntegration.doc.mjs +19 -3
  100. package/api/search/_adapter.d.mts +11 -0
  101. package/api/search/_adapter.mjs +25 -0
  102. package/api/search/search.d.mts +82 -13
  103. package/api/search/search.doc.mjs +8 -3
  104. package/api/search/search.domain-priority.test.mjs +108 -18
  105. package/api/search/search.integration-check.test.mjs +24 -0
  106. package/api/search/search.mjs +645 -64
  107. package/api/search/search.test.mjs +179 -1
  108. package/api/search/search.type.d.mts +14 -1
  109. package/api/search/search.type.mjs +6 -1
  110. package/api/swizzle/_adapter.mjs +2 -2
  111. package/api/swizzle/copy/copy.mjs +29 -15
  112. package/api/template/template-integration.test.mjs +1 -1
  113. package/api/template/template.test.mjs +120 -3
  114. package/api/theme/_adapter.d.mts +16 -0
  115. package/api/theme/_adapter.mjs +32 -5
  116. package/api/theme/build/build.d.mts +2 -1
  117. package/api/theme/build/build.family.test.mjs +64 -0
  118. package/api/theme/build/build.mjs +250 -38
  119. package/api/theme/build/build.packed-old-core.test.mjs +20 -3
  120. package/api/theme/build/font-warning.mjs +5 -3
  121. package/api/theme/build/font-warning.test.mjs +2 -1
  122. package/api/theme/remove/remove.test.mjs +2 -2
  123. package/api/theme/targets/targets.mjs +3 -10
  124. package/api/theme/themeBuild.doc.mjs +4 -4
  125. package/api/theme/themeTargets.doc.mjs +4 -0
  126. package/api/theme/use/use.test.mjs +1 -1
  127. package/api/upgrade/_adapter.d.mts +40 -2
  128. package/api/upgrade/_adapter.mjs +118 -5
  129. package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
  130. package/api/upgrade/run/run.mjs +35 -2
  131. package/api/upgrade/status/status.d.mts +21 -5
  132. package/api/upgrade/status/status.mjs +45 -8
  133. package/api/upgrade/upgrade.doc.mjs +6 -3
  134. package/api/upgrade/upgrade.mjs +5 -1
  135. package/api/upgrade/upgrade.type.d.mts +23 -0
  136. package/api/upgrade/upgrade.type.mjs +16 -1
  137. package/assets/codemods/__tests__/registry.test.mjs +1 -0
  138. package/assets/codemods/registry.mjs +1 -0
  139. package/assets/codemods/runner.mjs +7 -1
  140. package/assets/codemods/transforms/v0.7.2/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
  141. package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
  142. package/assets/codemods/transforms/v0.7.2/migrate-list-edge-compensation-to-edge.mjs +198 -0
  143. package/assets/discover/official-packages.json +367 -0
  144. package/assets/docs/README.md +10 -0
  145. package/assets/docs/author-a-theme.doc.mjs +3 -3
  146. package/assets/docs/browser-support.doc.mjs +1 -1
  147. package/assets/docs/getting-started.doc.mjs +26 -6
  148. package/assets/docs/styling-overview.doc.mjs +1 -1
  149. package/assets/docs/theme.doc.dense.mjs +1 -1
  150. package/assets/docs/theme.doc.mjs +2 -2
  151. package/assets/docs/theme.doc.zh.mjs +1 -1
  152. package/assets/docs/tree/add-a-component.doc.mjs +22 -2
  153. package/assets/docs/tree/add-a-theme.doc.mjs +13 -3
  154. package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
  155. package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
  156. package/assets/docs/tree/block-template.doc.mjs +8 -20
  157. package/assets/docs/tree/build-the-template.doc.mjs +1 -1
  158. package/assets/docs/tree/building-blocks.doc.mjs +4 -0
  159. package/assets/docs/tree/check-the-props.doc.mjs +201 -0
  160. package/assets/docs/tree/check-your-docs.doc.mjs +69 -11
  161. package/assets/docs/tree/checks.doc.mjs +32 -24
  162. package/assets/docs/tree/ci-and-containers.doc.mjs +88 -0
  163. package/assets/docs/tree/cli-command.doc.mjs +142 -0
  164. package/assets/docs/tree/cli.doc.mjs +6 -0
  165. package/assets/docs/tree/codemods.doc.mjs +17 -7
  166. package/assets/docs/tree/commands.doc.mjs +7 -1
  167. package/assets/docs/tree/component-family.doc.mjs +8 -6
  168. package/assets/docs/tree/component-imports.doc.mjs +21 -3
  169. package/assets/docs/tree/components.doc.mjs +7 -1
  170. package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
  171. package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
  172. package/assets/docs/tree/configuration.doc.mjs +7 -3
  173. package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
  174. package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
  175. package/assets/docs/tree/describe-the-component.doc.mjs +3 -3
  176. package/assets/docs/tree/docs.doc.mjs +9 -3
  177. package/assets/docs/tree/document-the-template.doc.mjs +1 -1
  178. package/assets/docs/tree/document-the-theme.doc.mjs +3 -3
  179. package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
  180. package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
  181. package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
  182. package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
  183. package/assets/docs/tree/global-integrations.doc.mjs +124 -0
  184. package/assets/docs/tree/global.doc.mjs +131 -0
  185. package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
  186. package/assets/docs/tree/install-once.doc.mjs +105 -0
  187. package/assets/docs/tree/integrations.doc.mjs +13 -1
  188. package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
  189. package/assets/docs/tree/layout.doc.mjs +6 -6
  190. package/assets/docs/tree/links.doc.mjs +7 -6
  191. package/assets/docs/tree/migration-setup.doc.mjs +3 -2
  192. package/assets/docs/tree/migration-verification.doc.mjs +0 -1
  193. package/assets/docs/tree/migration.doc.mjs +0 -1
  194. package/assets/docs/tree/monorepos.doc.mjs +84 -0
  195. package/assets/docs/tree/package-and-test.doc.mjs +1 -1
  196. package/assets/docs/tree/page-template.doc.mjs +4 -8
  197. package/assets/docs/tree/problems.doc.mjs +205 -0
  198. package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
  199. package/assets/docs/tree/publishing.doc.mjs +6 -6
  200. package/assets/docs/tree/quick-start.doc.mjs +53 -27
  201. package/assets/docs/tree/reference.doc.mjs +192 -0
  202. package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
  203. package/assets/docs/tree/replace-a-core-template.doc.mjs +10 -12
  204. package/assets/docs/tree/scaffold.doc.mjs +1 -1
  205. package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
  206. package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
  207. package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
  208. package/assets/docs/tree/single-component.doc.mjs +15 -6
  209. package/assets/docs/tree/start-a-template.doc.mjs +18 -8
  210. package/assets/docs/tree/subcomponent.doc.mjs +6 -6
  211. package/assets/docs/tree/template-assets.doc.mjs +2 -2
  212. package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
  213. package/assets/docs/tree/template-fonts.doc.mjs +1 -1
  214. package/assets/docs/tree/template-icons.doc.mjs +1 -1
  215. package/assets/docs/tree/template-images-media.doc.mjs +1 -1
  216. package/assets/docs/tree/template-styles.doc.mjs +2 -2
  217. package/assets/docs/tree/templates.doc.mjs +7 -1
  218. package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
  219. package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
  220. package/assets/docs/tree/themes.doc.mjs +4 -0
  221. package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
  222. package/assets/docs/tree/troubleshooting.doc.mjs +29 -13
  223. package/assets/docs/tree/type-scale.doc.mjs +3 -3
  224. package/assets/docs/tree/uninstall.doc.mjs +109 -0
  225. package/assets/docs/tree/updates.doc.mjs +92 -0
  226. package/assets/docs/tree/upgrading.doc.mjs +6 -6
  227. package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +14 -2
  228. package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
  229. package/assets/docs/tree/versioning.doc.mjs +10 -9
  230. package/assets/docs/tree/who-answers.doc.mjs +119 -0
  231. package/assets/docs/tree/write-the-template-file.doc.mjs +7 -6
  232. package/assets/docs/use-a-theme.doc.mjs +2 -2
  233. package/assets/docs/working-with-ai.doc.mjs +66 -13
  234. package/assets/theme.template.ts +1 -1
  235. package/authoring/codemod/codemod.doc.mjs +7 -3
  236. package/authoring/config/config.doc.mjs +9 -6
  237. package/authoring/config/type.ts +4 -2
  238. package/authoring/debug/parse.d.mts +5 -5
  239. package/authoring/discover/discover.doc.mjs +7 -1
  240. package/authoring/doctypes/_schema.d.mts +8 -3
  241. package/authoring/doctypes/_schema.mjs +1 -0
  242. package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
  243. package/authoring/doctypes/command/command.doc.mjs +20 -12
  244. package/authoring/doctypes/command/type.ts +14 -0
  245. package/authoring/doctypes/component/component.doc.mjs +30 -27
  246. package/authoring/doctypes/component/type.ts +21 -8
  247. package/authoring/doctypes/enum/enum.doc.mjs +7 -4
  248. package/authoring/doctypes/function/function.doc.mjs +9 -8
  249. package/authoring/doctypes/hook/hook.doc.mjs +5 -4
  250. package/authoring/doctypes/hook/type.ts +4 -0
  251. package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
  252. package/authoring/doctypes/reference/reference.doc.mjs +12 -11
  253. package/authoring/doctypes/schema/schema.doc.mjs +9 -9
  254. package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
  255. package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
  256. package/authoring/doctypes/template/parse.d.mts +6 -2
  257. package/authoring/doctypes/template/parse.mjs +3 -1
  258. package/authoring/doctypes/template/template.doc.mjs +3 -3
  259. package/authoring/doctypes/template/type.ts +22 -0
  260. package/authoring/doctypes/theme/theme.doc.mjs +2 -2
  261. package/authoring/gap-report/gap-report.doc.mjs +2 -2
  262. package/authoring/identity/identity.doc.mjs +3 -3
  263. package/authoring/index.d.ts +2 -0
  264. package/authoring/integration/integration.doc.mjs +30 -6
  265. package/authoring/integration/parse.test.mjs +21 -0
  266. package/authoring/integration/schema.d.mts +16 -3
  267. package/authoring/integration/schema.mjs +34 -2
  268. package/authoring/integration/type.ts +12 -0
  269. package/clients/cli/bin/astryx.mjs +20 -3
  270. package/clients/cli/cli-command.test.mjs +166 -0
  271. package/clients/cli/commands/blog.doc.mjs +1 -0
  272. package/clients/cli/commands/build-theme.batch-report.test.mjs +17 -3
  273. package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
  274. package/clients/cli/commands/build-theme.mjs +26 -13
  275. package/clients/cli/commands/build-theme.path-safety.test.mjs +224 -6
  276. package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
  277. package/clients/cli/commands/build.doc.mjs +1 -0
  278. package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
  279. package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
  280. package/clients/cli/commands/component.doc.mjs +1 -0
  281. package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
  282. package/clients/cli/commands/discover.doc.mjs +9 -1
  283. package/clients/cli/commands/discover.mjs +144 -93
  284. package/clients/cli/commands/discover.no-source.test.mjs +448 -33
  285. package/clients/cli/commands/discover.sources.test.mjs +20 -1
  286. package/clients/cli/commands/docs.doc.mjs +1 -0
  287. package/clients/cli/commands/docs.mjs +49 -19
  288. package/clients/cli/commands/docs.test.mjs +2 -2
  289. package/clients/cli/commands/doctor-integration-components.doc.mjs +19 -4
  290. package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
  291. package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
  292. package/clients/cli/commands/doctor-integration-validate.doc.mjs +22 -2
  293. package/clients/cli/commands/doctor-integration.test.mjs +888 -3
  294. package/clients/cli/commands/doctor.doc.mjs +12 -2
  295. package/clients/cli/commands/doctor.mjs +292 -7
  296. package/clients/cli/commands/doctor.test.mjs +10 -4
  297. package/clients/cli/commands/gap-report.doc.mjs +15 -2
  298. package/clients/cli/commands/gap-report.mjs +24 -2
  299. package/clients/cli/commands/gap-report.test.mjs +79 -0
  300. package/clients/cli/commands/hook.doc.mjs +1 -0
  301. package/clients/cli/commands/init.behavior.test.mjs +5 -0
  302. package/clients/cli/commands/init.doc.mjs +29 -3
  303. package/clients/cli/commands/integration-add.doc.mjs +7 -0
  304. package/clients/cli/commands/integration-authoring.test.mjs +49 -3
  305. package/clients/cli/commands/integration-check.doc.mjs +93 -0
  306. package/clients/cli/commands/integration-check.test.mjs +441 -0
  307. package/clients/cli/commands/integration-pack.doc.mjs +8 -1
  308. package/clients/cli/commands/integration-verify.doc.mjs +8 -1
  309. package/clients/cli/commands/integration.doc.mjs +6 -2
  310. package/clients/cli/commands/integration.mjs +119 -7
  311. package/clients/cli/commands/json-contract.test.mjs +11 -2
  312. package/clients/cli/commands/manifest.doc.mjs +1 -0
  313. package/clients/cli/commands/outside-project.test.mjs +774 -0
  314. package/clients/cli/commands/search.doc.mjs +1 -0
  315. package/clients/cli/commands/search.mjs +16 -11
  316. package/clients/cli/commands/search.test.mjs +429 -296
  317. package/clients/cli/commands/setup-nudge.test.mjs +102 -2
  318. package/clients/cli/commands/swizzle.doc.mjs +7 -0
  319. package/clients/cli/commands/swizzle.mjs +5 -3
  320. package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
  321. package/clients/cli/commands/template.doc.mjs +1 -0
  322. package/clients/cli/commands/text-json-parity.test.mjs +5 -0
  323. package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
  324. package/clients/cli/commands/theme-add.doc.mjs +8 -1
  325. package/clients/cli/commands/theme-build.doc.mjs +3 -2
  326. package/clients/cli/commands/theme-eject.doc.mjs +1 -0
  327. package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
  328. package/clients/cli/commands/theme-list.doc.mjs +1 -0
  329. package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
  330. package/clients/cli/commands/theme-remove.doc.mjs +7 -0
  331. package/clients/cli/commands/theme-targets.doc.mjs +1 -0
  332. package/clients/cli/commands/theme-template.doc.mjs +1 -0
  333. package/clients/cli/commands/theme-use.doc.mjs +7 -0
  334. package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
  335. package/clients/cli/commands/upgrade.doc.mjs +22 -1
  336. package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
  337. package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
  338. package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
  339. package/clients/cli/index.mjs +112 -16
  340. package/clients/cli/lib/cli-error.mjs +4 -1
  341. package/clients/cli/lib/component-format.test.mjs +1 -1
  342. package/clients/cli/lib/define-command.mjs +2 -2
  343. package/clients/cli/lib/json-shim.mjs +3 -1
  344. package/clients/cli/lib/manifest.d.ts +9 -0
  345. package/clients/cli/lib/manifest.mjs +17 -1
  346. package/clients/cli/lib/manifest.test.mjs +25 -0
  347. package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
  348. package/foundation/agent-docs/agent-doc-state.mjs +66 -6
  349. package/foundation/agent-docs/agent-docs.d.mts +4 -3
  350. package/foundation/agent-docs/agent-docs.mjs +11 -9
  351. package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
  352. package/foundation/agent-docs/computer-agent-text.mjs +623 -0
  353. package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
  354. package/foundation/config/project.d.mts +35 -3
  355. package/foundation/config/project.mjs +226 -7
  356. package/foundation/config/project.test.mjs +66 -0
  357. package/foundation/config/theme-state.mjs +5 -4
  358. package/foundation/discovery/authoring-self-docs.mjs +2 -1
  359. package/foundation/discovery/cli-self-docs.mjs +20 -3
  360. package/foundation/discovery/cli-self-docs.test.mjs +3 -2
  361. package/foundation/discovery/component-discovery.d.mts +190 -10
  362. package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
  363. package/foundation/discovery/component-discovery.mjs +864 -56
  364. package/foundation/discovery/component-discovery.test.mjs +96 -0
  365. package/foundation/discovery/component-replacement.mjs +20 -1
  366. package/foundation/discovery/component-replacement.test.mjs +40 -0
  367. package/foundation/discovery/copied-passages.d.mts +216 -0
  368. package/foundation/discovery/copied-passages.mjs +720 -0
  369. package/foundation/discovery/copied-passages.test.mjs +124 -0
  370. package/foundation/discovery/doc-consistency.d.mts +34 -0
  371. package/foundation/discovery/doc-consistency.mjs +513 -0
  372. package/foundation/discovery/doc-consistency.test.mjs +347 -0
  373. package/foundation/discovery/doc-fluff.d.mts +112 -0
  374. package/foundation/discovery/doc-fluff.mjs +328 -0
  375. package/foundation/discovery/doc-fluff.test.mjs +142 -0
  376. package/foundation/discovery/doc-types.d.mts +157 -0
  377. package/foundation/discovery/doc-types.mjs +1231 -0
  378. package/foundation/discovery/doc-types.test.mjs +744 -0
  379. package/foundation/discovery/docs-discovery.d.mts +88 -0
  380. package/foundation/discovery/docs-discovery.mjs +83 -2
  381. package/foundation/discovery/integration-doc-files.d.mts +22 -0
  382. package/foundation/discovery/integration-doc-files.mjs +231 -0
  383. package/foundation/discovery/integration-doc-files.test.mjs +246 -0
  384. package/foundation/discovery/module-exports.d.mts +27 -0
  385. package/foundation/discovery/module-exports.mjs +356 -31
  386. package/foundation/discovery/module-exports.test.mjs +172 -0
  387. package/foundation/discovery/package-tsconfig.d.mts +14 -0
  388. package/foundation/discovery/package-tsconfig.mjs +228 -0
  389. package/foundation/discovery/package-tsconfig.test.mjs +210 -0
  390. package/foundation/discovery/project-typescript.d.mts +32 -0
  391. package/foundation/discovery/project-typescript.mjs +89 -0
  392. package/foundation/discovery/prop-drift.d.mts +297 -0
  393. package/foundation/discovery/prop-drift.mjs +2428 -0
  394. package/foundation/discovery/prop-drift.test.mjs +2337 -0
  395. package/foundation/discovery/runner-allowlist.d.mts +40 -0
  396. package/foundation/discovery/runner-allowlist.mjs +53 -0
  397. package/foundation/discovery/stray-pointers.d.mts +52 -0
  398. package/foundation/discovery/stray-pointers.mjs +293 -0
  399. package/foundation/discovery/stray-pointers.test.mjs +86 -0
  400. package/foundation/discovery/template-adapter.mjs +74 -5
  401. package/foundation/discovery/template-needs.mjs +5 -2
  402. package/foundation/discovery/theme-imports.mjs +8 -4
  403. package/foundation/discovery/theme-imports.test.mjs +1 -1
  404. package/foundation/discovery/type-match.d.mts +53 -0
  405. package/foundation/discovery/type-match.mjs +660 -0
  406. package/foundation/discovery/type-match.test.mjs +169 -0
  407. package/foundation/discovery/type-text.d.mts +68 -0
  408. package/foundation/discovery/type-text.mjs +658 -0
  409. package/foundation/discovery/type-text.test.mjs +196 -0
  410. package/foundation/discovery/unresolved-references.d.mts +62 -0
  411. package/foundation/discovery/unresolved-references.mjs +790 -0
  412. package/foundation/discovery/unresolved-references.test.mjs +567 -0
  413. package/foundation/doc-compiler/doc-loads.test.mjs +51 -1
  414. package/foundation/doc-compiler/inputs.mjs +27 -1
  415. package/foundation/doc-compiler/inputs.test.mjs +0 -1
  416. package/foundation/doc-compiler/links.d.mts +41 -5
  417. package/foundation/doc-compiler/links.mjs +167 -28
  418. package/foundation/doc-compiler/links.test.mjs +97 -4
  419. package/foundation/doc-compiler/read.d.mts +1 -1
  420. package/foundation/doc-compiler/tree.mjs +30 -1
  421. package/foundation/doc-compiler/tree.test.mjs +8 -1
  422. package/foundation/env/cli-command.d.mts +83 -0
  423. package/foundation/env/cli-command.mjs +152 -0
  424. package/foundation/env/cli-command.test.mjs +129 -0
  425. package/foundation/env/node-version.test.mjs +15 -3
  426. package/foundation/env/package-manager.d.mts +93 -9
  427. package/foundation/env/package-manager.global.test.mjs +66 -0
  428. package/foundation/env/package-manager.mjs +184 -13
  429. package/foundation/env/package-manager.test.mjs +341 -15
  430. package/foundation/env/project-scope.d.mts +9 -0
  431. package/foundation/env/project-scope.mjs +33 -0
  432. package/foundation/env/search-path.d.mts +42 -0
  433. package/foundation/env/search-path.mjs +205 -0
  434. package/foundation/env/search-path.test.mjs +122 -0
  435. package/foundation/env/user-dirs.d.mts +39 -0
  436. package/foundation/env/user-dirs.mjs +93 -0
  437. package/foundation/env/user-dirs.test.mjs +72 -0
  438. package/foundation/env/user-settings.d.mts +46 -0
  439. package/foundation/env/user-settings.mjs +106 -0
  440. package/foundation/env/user-settings.test.mjs +64 -0
  441. package/foundation/fs/file-protection.mjs +15 -1
  442. package/foundation/fs/module-loader.d.mts +2 -1
  443. package/foundation/fs/module-loader.mjs +60 -4
  444. package/foundation/fs/module-loader.stdout.test.mjs +3 -2
  445. package/foundation/fs/module-loader.test.mjs +194 -0
  446. package/foundation/fs/path-compare.d.mts +33 -0
  447. package/foundation/fs/path-compare.mjs +73 -0
  448. package/foundation/fs/paths.d.mts +57 -1
  449. package/foundation/fs/paths.mjs +131 -3
  450. package/foundation/fs/paths.test.mjs +10 -1
  451. package/foundation/integrations/computer-integrations.d.mts +78 -0
  452. package/foundation/integrations/computer-integrations.mjs +316 -0
  453. package/foundation/integrations/computer-integrations.test.mjs +292 -0
  454. package/foundation/integrations/contribution-inventory.d.mts +11 -0
  455. package/foundation/integrations/contribution-inventory.mjs +56 -3
  456. package/foundation/integrations/integration-warnings.mjs +3 -2
  457. package/foundation/integrations/integration-warnings.test.mjs +8 -9
  458. package/foundation/integrations/integrations.d.mts +25 -1
  459. package/foundation/integrations/integrations.mjs +46 -3
  460. package/foundation/integrations/issue.ts +6 -0
  461. package/foundation/integrations/validate-contributions.d.mts +2 -0
  462. package/foundation/integrations/validate-contributions.mjs +41 -1
  463. package/foundation/release/agent-text-worker.d.mts +4 -0
  464. package/foundation/release/agent-text-worker.mjs +52 -0
  465. package/foundation/release/cache.d.mts +310 -0
  466. package/foundation/release/cache.mjs +1216 -0
  467. package/foundation/release/cache.test.mjs +920 -0
  468. package/foundation/release/choose.d.mts +207 -0
  469. package/foundation/release/choose.mjs +677 -0
  470. package/foundation/release/choose.test.mjs +427 -0
  471. package/foundation/release/core-worker.d.mts +4 -0
  472. package/foundation/release/core-worker.mjs +38 -0
  473. package/foundation/release/global-state.d.mts +259 -0
  474. package/foundation/release/global-state.mjs +472 -0
  475. package/foundation/release/global-state.test.mjs +381 -0
  476. package/foundation/release/handoff.d.mts +60 -0
  477. package/foundation/release/handoff.e2e.test.mjs +278 -0
  478. package/foundation/release/handoff.mjs +357 -0
  479. package/foundation/release/lock-lease.d.mts +23 -0
  480. package/foundation/release/lock-lease.mjs +80 -0
  481. package/foundation/release/notices.d.mts +253 -0
  482. package/foundation/release/notices.mjs +596 -0
  483. package/foundation/release/notices.test.mjs +565 -0
  484. package/foundation/release/npm-guard.d.mts +4 -0
  485. package/foundation/release/npm-guard.mjs +126 -0
  486. package/foundation/release/project.d.mts +141 -0
  487. package/foundation/release/project.mjs +466 -0
  488. package/foundation/release/project.test.mjs +288 -0
  489. package/foundation/release/refresh-worker.d.mts +4 -0
  490. package/foundation/release/refresh-worker.mjs +27 -0
  491. package/foundation/release/run-context.d.mts +47 -0
  492. package/foundation/release/run-context.mjs +149 -0
  493. package/foundation/release/update-notice-env.d.mts +28 -0
  494. package/foundation/release/update-notice-env.mjs +39 -0
  495. package/foundation/response/base.d.ts +26 -3
  496. package/foundation/response/error-codes.d.mts +3 -1
  497. package/foundation/response/error-codes.doc.mjs +12 -0
  498. package/foundation/response/error-codes.mjs +17 -0
  499. package/foundation/response/error-codes.test.mjs +2 -0
  500. package/foundation/response/json-contract.test.mjs +7 -2
  501. package/foundation/response/json.mjs +4 -1
  502. package/foundation/response/response-types.doc.mjs +22 -11
  503. package/foundation/response/response-types.doc.test.mjs +46 -0
  504. package/foundation/response/response.doc.mjs +3 -3
  505. package/foundation/xle/browser-imports.test.mjs +74 -0
  506. package/foundation/xle/registry.mjs +4 -0
  507. package/foundation/xle/registry.test.mjs +28 -0
  508. package/package.json +11 -11
  509. package/scripts/postinstall.mjs +24 -5
@@ -24,7 +24,10 @@
24
24
  import * as fs from 'node:fs';
25
25
  import * as path from 'node:path';
26
26
  import {isValidSemver} from '../env/semver.mjs';
27
- import {findSourceOnlyCandidates} from './contribution-inventory.mjs';
27
+ import {
28
+ findSourceOnlyCandidates,
29
+ findTemplateSourceOnlyCandidates,
30
+ } from './contribution-inventory.mjs';
28
31
  import {
29
32
  CODEMOD_FILE_RE,
30
33
  CODEMOD_SKIP_DIRS,
@@ -56,6 +59,9 @@ import {discoverIntegrationThemes} from '../discovery/theme-discovery.mjs';
56
59
  /** Stable issue code for an invalid optional agent-doc contribution. */
57
60
  export const INVALID_AGENT_DOCS = 'invalid_agent_docs';
58
61
 
62
+ /** Stable issue code for a `cliCommand` that was ignored as invalid. */
63
+ export const INVALID_CLI_COMMAND = 'invalid_cli_command';
64
+
59
65
  /** Stable issue code for a package whose provider ID is already claimed. */
60
66
  export const DUPLICATE_PROVIDER = 'duplicate_provider';
61
67
 
@@ -295,6 +301,32 @@ async function checkTemplates(integration, issues) {
295
301
  issueError('invalid_template', /** @type {any} */ (err).message),
296
302
  );
297
303
  }
304
+ checkTemplateSourcesWithoutDoc(integration, issues);
305
+ }
306
+
307
+ /**
308
+ * Warn about a `.tsx` directly in the templates root with no same-stem template
309
+ * metadata: template discovery pairs sources with docs, so `astryx template`
310
+ * never lists it. A PascalCase file directly in a shared components root is
311
+ * left to the component check, which already warns about it.
312
+ * @param {LoadedIntegration} integration loaded-integration-shaped object
313
+ * @param {Issue[]} issues
314
+ */
315
+ function checkTemplateSourcesWithoutDoc(integration, issues) {
316
+ const root = /** @type {string} */ (integration.templates);
317
+ const sharedComponents =
318
+ integration.components != null &&
319
+ path.resolve(integration.components) === path.resolve(root);
320
+ for (const file of findTemplateSourceOnlyCandidates(root)) {
321
+ if (sharedComponents && /^[A-Z]/u.test(file)) continue;
322
+ const stem = file.slice(0, -'.tsx'.length);
323
+ issues.push(
324
+ issueWarning(
325
+ 'source_without_template_doc',
326
+ `Template source "${file}" has no same-stem metadata file ${stem}.doc.mjs, so \`astryx template\` never lists it. Fix: add ${stem}.doc.mjs beside it with type: 'page' or 'block'; \`astryx docs authoring integration-template-doc\` lists its fields. If it is not a template, move it out of the templates root.`,
327
+ ),
328
+ );
329
+ }
298
330
  }
299
331
 
300
332
  /**
@@ -450,6 +482,14 @@ export async function validateLoadedIntegration(loaded) {
450
482
  if (loaded.__agentDocsError) {
451
483
  issues.push(issueError(INVALID_AGENT_DOCS, loaded.__agentDocsError));
452
484
  }
485
+ if (loaded.__cliCommandError) {
486
+ issues.push(
487
+ issueWarning(
488
+ INVALID_CLI_COMMAND,
489
+ `${loaded.__cliCommandError}. The command is ignored; printed commands use the package-manager prefix.`,
490
+ ),
491
+ );
492
+ }
453
493
  checkRoots(
454
494
  {
455
495
  components: loaded.components,
@@ -0,0 +1,4 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ export {};
@@ -0,0 +1,52 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The global copy's background step that keeps the computer-level
5
+ * agent text installed (spec AST-081 FR8), as its own detached process.
6
+ *
7
+ * Started by `maybeKeepAgentText` (global-state.mjs) from the global copy,
8
+ * with one argument, the per-user configuration folder. It writes the files
9
+ * the person's settings choose, with this release's text and the plain `astryx` command, and keeps every file a
10
+ * person edited, every file without the Astryx markers, and every link, as
11
+ * `astryx init --user` does. It then records this release as the one that
12
+ * wrote the text. It writes nothing to any stream and never reaches a
13
+ * person: it is not a command and takes no options.
14
+ *
15
+ * @input argv[2]: the per-user configuration folder (the state file's); the
16
+ * settings file
17
+ * @output the computer-level agent text and the updated global state on disk
18
+ * @position foundation/release — one of the two detached processes the CLI
19
+ * starts; the other is refresh-worker.mjs.
20
+ */
21
+
22
+ import {fileURLToPath} from 'node:url';
23
+ import {
24
+ COMPUTER_COMMAND,
25
+ writeComputerAgentText,
26
+ } from '../agent-docs/computer-agent-text.mjs';
27
+ import {
28
+ computerAgentTextSettings,
29
+ recordComputerAgentTextSettings,
30
+ } from '../env/user-settings.mjs';
31
+ import {recordAgentTextWritten} from './global-state.mjs';
32
+ import {readJson} from './project.mjs';
33
+
34
+ const stateDir = process.argv[2];
35
+ if (stateDir) {
36
+ try {
37
+ const settings = computerAgentTextSettings();
38
+ if (settings.install) {
39
+ const {links} = writeComputerAgentText({command: COMPUTER_COMMAND});
40
+ recordComputerAgentTextSettings({
41
+ install: true,
42
+ links: [...new Set([...settings.links, ...links])],
43
+ });
44
+ const pkg = readJson(
45
+ fileURLToPath(new URL('../../package.json', import.meta.url)),
46
+ );
47
+ recordAgentTextWritten(pkg?.version ?? null, stateDir);
48
+ }
49
+ } catch {
50
+ // A home folder that cannot be written is tried again later.
51
+ }
52
+ }
@@ -0,0 +1,310 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /**
5
+ * The per-user cache directory every Astryx cache lives in, never inside a
6
+ * project (`foundation/env/user-dirs.mjs`).
7
+ * @returns {string}
8
+ */
9
+ export function userCacheDir(): string;
10
+ /**
11
+ * The folder all cached releases live in.
12
+ * @param {string} [cacheDir]
13
+ * @returns {string}
14
+ */
15
+ export function releasesDir(cacheDir?: string): string;
16
+ /**
17
+ * Is `version` a plain release version?
18
+ * @param {unknown} version
19
+ * @returns {version is string}
20
+ */
21
+ export function isReleaseVersion(version: unknown): version is string;
22
+ /**
23
+ * A cached, verified release.
24
+ * @typedef {object} CachedRelease
25
+ * @property {string} version
26
+ * @property {string} dir the release folder
27
+ * @property {string} cliDir its `@astryxdesign/cli`
28
+ * @property {string} coreDir its `@astryxdesign/core`
29
+ * @property {string} bin the CLI's `astryx` entry file
30
+ */
31
+ /**
32
+ * The entry file a CLI package's `astryx` bin points at.
33
+ * @param {string} cliDir
34
+ * @returns {string | null}
35
+ */
36
+ export function cliBinOf(cliDir: string): string | null;
37
+ /**
38
+ * The cached release `version`, when it is installed and verified: its
39
+ * marker parses, names the version, and records the bytes of the CLI's and
40
+ * Core's package.json and the CLI's entry file, and those files still have
41
+ * them, and the number and total size of the two packages' files are the
42
+ * ones recorded. Anything else is a damaged release, which counts as absent and is
43
+ * replaced the next time a run needs it.
44
+ * @param {string} version
45
+ * @param {string} [cacheDir]
46
+ * @returns {CachedRelease | null}
47
+ */
48
+ export function cachedRelease(version: string, cacheDir?: string): CachedRelease | null;
49
+ /** Forget which releases this process verified, so the next look checks again. */
50
+ export function forgetVerifiedReleases(): void;
51
+ /**
52
+ * The size record of a release's two packages.
53
+ * @param {string} dir the release folder
54
+ * @returns {{cli: {count: number, bytes: number}, core: {count: number, bytes: number}} | null}
55
+ */
56
+ export function releaseTree(dir: string): {
57
+ cli: {
58
+ count: number;
59
+ bytes: number;
60
+ };
61
+ core: {
62
+ count: number;
63
+ bytes: number;
64
+ };
65
+ } | null;
66
+ /**
67
+ * Is `dir` inside the release cache? A copy that lives there was started by
68
+ * global mode, never installed by a person.
69
+ * @param {string} dir
70
+ * @param {string} [cacheDir]
71
+ * @returns {boolean}
72
+ */
73
+ export function isInReleaseCache(dir: string, cacheDir?: string): boolean;
74
+ /**
75
+ * How to start npm, never through a shell, so nothing a project declares is
76
+ * read by one: npm's own entry file run with this Node, from beside the
77
+ * running Node, else from beside an `npm` on the PATH (on Windows, npm's
78
+ * `npm.cmd` shim sits next to its `node_modules`); else `npm` on the PATH,
79
+ * started directly. An `npm` beside the running Node or on the PATH that
80
+ * links to npm's entry file (as distribution packages install it, such as
81
+ * `/usr/bin/npm` to `/usr/lib/node_modules_22/npm/bin/npm-cli.js`) counts as
82
+ * that entry file.
83
+ * @param {{env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, execPath?: string}} [where]
84
+ * `execPath`: the Node that runs npm (default: this one)
85
+ * @returns {{command: string, prefix: string[], shell: false}}
86
+ */
87
+ export function npmCommand(where?: {
88
+ env?: NodeJS.ProcessEnv;
89
+ platform?: NodeJS.Platform;
90
+ execPath?: string;
91
+ }): {
92
+ command: string;
93
+ prefix: string[];
94
+ shell: false;
95
+ };
96
+ /**
97
+ * Whether `spec` reads as an npm version range and nothing else: versions,
98
+ * `x`/`*` wildcards, prerelease tags, the range operators, `||`, and spaces.
99
+ * Anything a shell or npm would read as more, such as `&`, `;`, a lone `|`,
100
+ * quotes, or a URL, is refused.
101
+ * @param {string} spec
102
+ * @returns {boolean}
103
+ */
104
+ export function isVersionRange(spec: string): boolean;
105
+ /**
106
+ * The result of running npm.
107
+ * @typedef {object} NpmResult
108
+ * @property {number | null} status
109
+ * @property {NodeJS.Signals | null} [signal] the signal that ended npm, such as Ctrl-C's
110
+ * @property {string} stdout
111
+ * @property {string} stderr
112
+ * @property {Error} [error]
113
+ */
114
+ /**
115
+ * Run npm synchronously with no output on the caller's streams.
116
+ * @param {string[]} args
117
+ * npm runs under npm-guard.mjs, which gives it a process group of its own
118
+ * and ends that group when the time limit passes, when this run goes away
119
+ * (even killed outright), or when this run receives Ctrl-C. So no install
120
+ * outlives the run that started it.
121
+ *
122
+ * @param {string[]} args
123
+ * @param {{cwd?: string, timeoutMs?: number, pidFile?: string, npm?: {command: string, prefix: string[], shell?: false}}} [options]
124
+ * `pidFile` receives npm's process id while it runs (the release lock's
125
+ * record); `npm` replaces how npm is started (tests).
126
+ * @returns {NpmResult}
127
+ */
128
+ export function runNpm(args: string[], options?: {
129
+ cwd?: string;
130
+ timeoutMs?: number;
131
+ pidFile?: string;
132
+ npm?: {
133
+ command: string;
134
+ prefix: string[];
135
+ shell?: false;
136
+ };
137
+ }): NpmResult;
138
+ /**
139
+ * The newest published version that `spec` (a dist-tag or a range) names,
140
+ * asked of the registry through npm.
141
+ * @param {string} name e.g. `@astryxdesign/core`
142
+ * @param {string} spec e.g. `latest`, `^0.6.8`
143
+ * @param {{run?: typeof runNpm}} [options]
144
+ * @returns {string | null}
145
+ */
146
+ export function resolvePublishedVersion(name: string, spec: string, options?: {
147
+ run?: typeof runNpm;
148
+ }): string | null;
149
+ /**
150
+ * The release the registry tags `latest` for the CLI, and the Node range it
151
+ * declares; null when the registry cannot be asked, with the reason given to
152
+ * `onFailure`: `npm-missing` (npm cannot be started), `npm-failed: <npm's
153
+ * error code>` (npm ran and failed, such as on ECONNREFUSED or E404), or
154
+ * `bad-reply` (npm's answer names no release).
155
+ * @param {{run?: typeof runNpm, onFailure?: (reason: string) => void}} [options]
156
+ * @returns {{version: string, node: string | null} | null}
157
+ */
158
+ export function resolveLatestRelease(options?: {
159
+ run?: typeof runNpm;
160
+ onFailure?: (reason: string) => void;
161
+ }): {
162
+ version: string;
163
+ node: string | null;
164
+ } | null;
165
+ /**
166
+ * How long a failed install of a release is remembered, so offline runs do
167
+ * not start npm again on every run (spec AST-081 FR2): 2 minutes after a
168
+ * first failure, so a passing registry hiccup is retried soon, and 10 minutes
169
+ * after a second failure in a row. A successful install forgets it.
170
+ * @param {number} failures the failures in a row, 1 or more
171
+ * @returns {number}
172
+ */
173
+ export function failedInstallWaitMs(failures: number): number;
174
+ /**
175
+ * The recorded failed installs of `version` in a row, when the last was
176
+ * within its wait (failedInstallWaitMs), or null.
177
+ * @param {string} version
178
+ * @param {string} cacheDir
179
+ * @param {number} [now]
180
+ * @returns {{at: number, reason: string, failures: number, waitMs: number} | null}
181
+ */
182
+ export function recentFailedInstall(version: string, cacheDir: string, now?: number): {
183
+ at: number;
184
+ reason: string;
185
+ failures: number;
186
+ waitMs: number;
187
+ } | null;
188
+ /**
189
+ * Take a lock folder, or return false when another live run holds it. A lock
190
+ * whose holder has gone, such as a run stopped with Ctrl-C or killed, is taken
191
+ * over at once, and one from another computer once its holder has stopped
192
+ * renewing it. Throws when the cache folder cannot be written.
193
+ * @param {string} lockDir
194
+ * @param {{now?: number}} [options] the clock, for tests
195
+ * @returns {boolean}
196
+ */
197
+ export function tryLock(lockDir: string, { now }?: {
198
+ now?: number;
199
+ }): boolean;
200
+ /**
201
+ * Whether a process's arguments are this CLI's install of `version`, as
202
+ * runNpm starts it: the program (`argv[0]`) is npm, or node running npm's
203
+ * entry file `npm-cli.js` (`argv[1]`), each exactly by name, and the arguments
204
+ * include `install` and `@astryxdesign/cli@<version>`. A program that only has
205
+ * `npm` somewhere in its name or arguments is not.
206
+ * @param {string[]} argv
207
+ * @param {string} version
208
+ * @returns {boolean}
209
+ */
210
+ export function isReleaseInstall(argv: string[], version: string): boolean;
211
+ /**
212
+ * End the npm process group a stale lock records, only when that process is
213
+ * surely the install the lock was taken for: its command line is this CLI's
214
+ * install of the lock's release (isReleaseInstall), the lock is younger than
215
+ * any install may take, and the process started no earlier than the lock.
216
+ * Anything less certain is left alone, and the lock is simply taken over,
217
+ * since a recorded process id can name an unrelated process once the install
218
+ * ended.
219
+ * @param {string} lockDir a `.lock-<version>` folder
220
+ * @param {{now?: number, procRoot?: string, factsOf?: (pid: number) => {argv: string[] | null, startedAt: number | null}}} [options]
221
+ * the clock, the process table's folder, and the fact reader, for tests
222
+ * @returns {'ended' | 'left'} whether a process group was ended
223
+ */
224
+ export function endRecordedInstall(lockDir: string, { now, procRoot, factsOf }?: {
225
+ now?: number;
226
+ procRoot?: string;
227
+ factsOf?: (pid: number) => {
228
+ argv: string[] | null;
229
+ startedAt: number | null;
230
+ };
231
+ }): "ended" | "left";
232
+ /**
233
+ * Why a release could not be made available.
234
+ * @typedef {object} ReleaseUnavailable
235
+ * @property {string} version
236
+ * @property {string} reason one plain sentence
237
+ * @property {NodeJS.Signals} [signal] the install was stopped by this signal
238
+ */
239
+ /**
240
+ * Install release `version` into the cache, verify it, and return it. A
241
+ * release already cached returns at once. When another run is installing the
242
+ * same release, this waits for it.
243
+ *
244
+ * @param {string} version
245
+ * @param {{cacheDir?: string, run?: typeof runNpm, nodeVersion?: string, waitMs?: number, onProgress?: (event: 'install' | 'wait', version: string) => void}} [options]
246
+ * `onProgress` hears once when an install starts and once when the run
247
+ * starts waiting for another run's install.
248
+ * @returns {CachedRelease | ReleaseUnavailable}
249
+ */
250
+ export function ensureRelease(version: string, options?: {
251
+ cacheDir?: string;
252
+ run?: typeof runNpm;
253
+ nodeVersion?: string;
254
+ waitMs?: number;
255
+ onProgress?: (event: "install" | "wait", version: string) => void;
256
+ }): CachedRelease | ReleaseUnavailable;
257
+ /**
258
+ * The longest an install may take: generous, so a slow but moving download
259
+ * finishes, while a stalled one still ends in ERR_VERSIONS_UNAVAILABLE.
260
+ */
261
+ export const INSTALL_TIMEOUT_MS: number;
262
+ /**
263
+ * A cached, verified release.
264
+ */
265
+ export type CachedRelease = {
266
+ version: string;
267
+ /**
268
+ * the release folder
269
+ */
270
+ dir: string;
271
+ /**
272
+ * its `@astryxdesign/cli`
273
+ */
274
+ cliDir: string;
275
+ /**
276
+ * its `@astryxdesign/core`
277
+ */
278
+ coreDir: string;
279
+ /**
280
+ * the CLI's `astryx` entry file
281
+ */
282
+ bin: string;
283
+ };
284
+ /**
285
+ * The result of running npm.
286
+ */
287
+ export type NpmResult = {
288
+ status: number | null;
289
+ /**
290
+ * the signal that ended npm, such as Ctrl-C's
291
+ */
292
+ signal?: NodeJS.Signals | null | undefined;
293
+ stdout: string;
294
+ stderr: string;
295
+ error?: Error | undefined;
296
+ };
297
+ /**
298
+ * Why a release could not be made available.
299
+ */
300
+ export type ReleaseUnavailable = {
301
+ version: string;
302
+ /**
303
+ * one plain sentence
304
+ */
305
+ reason: string;
306
+ /**
307
+ * the install was stopped by this signal
308
+ */
309
+ signal?: NodeJS.Signals | undefined;
310
+ };