@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
@@ -43,8 +43,116 @@ export function findDoctorInstalledPackage(projectDir: string, packageName: stri
43
43
  export function listDoctorThemePackages(cwd: string): string[];
44
44
  /** @param {string} file */
45
45
  export function readPackageJson(file: string): any;
46
+ /**
47
+ * The integrations installed for the computer, and, outside a project, which
48
+ * of them the folder loads (spec AST-081 FR12): those it uses, and the names
49
+ * of the integrations the folder loads itself, whose copies win.
50
+ * @param {string} cwd
51
+ * @returns {Promise<{computerIntegrations: import('../../foundation/integrations/computer-integrations.mjs').ComputerIntegrationCandidate[], loadedComputerIntegrations: string[], folderIntegrations: string[]}>}
52
+ */
53
+ export function computerIntegrationsOutside(cwd: string): Promise<{
54
+ computerIntegrations: import("../../foundation/integrations/computer-integrations.mjs").ComputerIntegrationCandidate[];
55
+ loadedComputerIntegrations: string[];
56
+ folderIntegrations: string[];
57
+ }>;
58
+ /**
59
+ * Inside a project: the integrations installed for the computer it could add
60
+ * (spec AST-081 FR12), leaving out every package it loads or declares.
61
+ * @param {string} cwd
62
+ * @param {string[]} loadedNames the integrations the project loads
63
+ * @returns {Promise<import('../../foundation/integrations/computer-integrations.mjs').ComputerIntegrationCandidate[]>}
64
+ */
65
+ export function computerIntegrationsToAdd(cwd: string, loadedNames: string[]): Promise<import("../../foundation/integrations/computer-integrations.mjs").ComputerIntegrationCandidate[]>;
66
+ /**
67
+ * The computer-level agent text's setting and its state on disk.
68
+ * @returns {{settings: import('../../foundation/env/user-settings.mjs').ComputerAgentTextSettings, entries: Array<{path: string, state: import('../../foundation/agent-docs/computer-agent-text.mjs').ComputerAgentTextState, link?: true}>}}
69
+ */
70
+ export function computerAgentTextState(): {
71
+ settings: import("../../foundation/env/user-settings.mjs").ComputerAgentTextSettings;
72
+ entries: Array<{
73
+ path: string;
74
+ state: import("../../foundation/agent-docs/computer-agent-text.mjs").ComputerAgentTextState;
75
+ link?: true;
76
+ }>;
77
+ };
78
+ /**
79
+ * The release facts doctor reports, read here so the checks stay pure
80
+ * (spec AST-081 FR5, FR6, FR10; architecture:cli-surface INV21): who
81
+ * answered, the newest release the computer knows of, how far the global copy
82
+ * or the project is behind, and every `astryx` on the search path with the
83
+ * command that upgrades it.
84
+ * @param {string} cwd
85
+ * @param {{project: boolean}} options
86
+ * @returns {{answeredBy: {cli: string, core: string | null, copy: string}, latest: string | null, globalBehind: ReturnType<typeof globalBehind> | null, projectLag: ReturnType<typeof projectLag> | null, lastNoticeSkip: ReturnType<typeof lastNoticeSkip>, lastCheckFailure: ReturnType<typeof lastCheckFailure>, stateLock: ReturnType<typeof stateLockHolder>, searchPathCommands: Array<import('../../foundation/env/search-path.mjs').SearchPathCommand & {upgrade: string | null}>}}
87
+ */
88
+ export function releaseFacts(cwd: string, { project }: {
89
+ project: boolean;
90
+ }): {
91
+ answeredBy: {
92
+ cli: string;
93
+ core: string | null;
94
+ copy: string;
95
+ };
96
+ latest: string | null;
97
+ globalBehind: ReturnType<typeof globalBehind> | null;
98
+ projectLag: ReturnType<typeof projectLag> | null;
99
+ lastNoticeSkip: ReturnType<typeof lastNoticeSkip>;
100
+ lastCheckFailure: ReturnType<typeof lastCheckFailure>;
101
+ stateLock: ReturnType<typeof stateLockHolder>;
102
+ searchPathCommands: Array<import("../../foundation/env/search-path.mjs").SearchPathCommand & {
103
+ upgrade: string | null;
104
+ }>;
105
+ };
106
+ /** Whether `cwd` is outside every project. */
107
+ export function outsideProject(cwd: string): boolean;
108
+ /**
109
+ * The commands that bring a project's own CLI and Core to one release, with
110
+ * the project's package manager: Core up to the CLI, then its codemods, when
111
+ * the CLI is newer; else the CLI to the Core's release.
112
+ * @param {string} cwd
113
+ * @param {string} cli
114
+ * @param {string} core
115
+ * @returns {string}
116
+ */
117
+ export function alignCommand(cwd: string, cli: string, core: string): string;
118
+ /**
119
+ * The Core release the project at `cwd` names: installed, else locked, else
120
+ * declared; the version the daily hint and notice compare against (spec
121
+ * AST-081 FR2). Null outside a project or when it names none.
122
+ * @param {string} cwd
123
+ * @returns {string | null}
124
+ */
125
+ export function projectCoreVersion(cwd: string): string | null;
126
+ /**
127
+ * Whether the project at `cwd` installs its own CLI (spec AST-081 FR2).
128
+ * @param {string} cwd
129
+ * @returns {boolean}
130
+ */
131
+ export function projectHasOwnCli(cwd: string): boolean;
132
+ /**
133
+ * The command that adds the CLI at `version` with the project's package
134
+ * manager.
135
+ * @param {string} cwd
136
+ * @param {string} version
137
+ * @returns {string}
138
+ */
139
+ export function addCliCommandFor(cwd: string, version: string): string;
140
+ /**
141
+ * The command that adds a package with the folder's package manager, read
142
+ * from its lockfiles and `packageManager` field.
143
+ * @param {string} cwd
144
+ * @returns {(name: string) => string}
145
+ */
146
+ export function installCommandFor(cwd: string): (name: string) => string;
46
147
  export { resolveRecordedTheme } from "../theme/theme.mjs";
47
148
  export { collectUnloadedFonts } from "../theme/build/font-warning.mjs";
48
149
  export const SOURCE_EXTENSIONS: Set<string>;
150
+ export { displayHomePath };
151
+ import { globalBehind } from '../../foundation/release/notices.mjs';
152
+ import { projectLag } from '../../foundation/release/notices.mjs';
153
+ import { lastNoticeSkip } from '../../foundation/release/notices.mjs';
154
+ import { lastCheckFailure } from '../../foundation/release/global-state.mjs';
155
+ import { stateLockHolder } from '../../foundation/release/global-state.mjs';
156
+ import { displayHomePath } from '../../foundation/agent-docs/computer-agent-text.mjs';
49
157
  export { isLocalThemeOwner, planThemeAppWrite, readThemeState, resolveThemeModule } from "../../foundation/config/theme-state.mjs";
50
158
  export { themeBuild, validateThemePrivateInputs } from "../theme/build/build.mjs";
@@ -2,15 +2,52 @@
2
2
 
3
3
  /** @file Environment adapter for app-theme doctor evidence. */
4
4
 
5
+ import {isOutsideProject} from '../../foundation/env/project-scope.mjs';
6
+ import {answeredBy} from '../../foundation/release/run-context.mjs';
7
+ import {
8
+ knownLatestRelease,
9
+ lastCheckFailure,
10
+ stateLockHolder,
11
+ } from '../../foundation/release/global-state.mjs';
12
+ import {
13
+ addCliCommand,
14
+ alignCliAndCore,
15
+ globalBehind,
16
+ globalUpgradeCommand,
17
+ lastNoticeSkip,
18
+ projectLag,
19
+ } from '../../foundation/release/notices.mjs';
20
+ import {
21
+ coreVersionOf,
22
+ isGlobalCopy,
23
+ projectRootOf,
24
+ } from '../../foundation/release/choose.mjs';
25
+ import {readReleaseFacts} from '../../foundation/release/project.mjs';
26
+ import {detectPackageManager} from '../../foundation/env/package-manager.mjs';
27
+ import {astryxCommandsOnSearchPath} from '../../foundation/env/search-path.mjs';
28
+ import {readDeclaredDependencies} from '../../foundation/integrations/autolink.mjs';
29
+ import {
30
+ displayHomePath,
31
+ inspectComputerAgentText,
32
+ } from '../../foundation/agent-docs/computer-agent-text.mjs';
33
+ import {computerAgentTextSettings} from '../../foundation/env/user-settings.mjs';
5
34
  import * as fs from 'node:fs';
6
35
  import * as path from 'node:path';
7
- import {Project} from '../../foundation/config/project.mjs';
36
+ import {
37
+ Project,
38
+ availableComputerIntegrations,
39
+ computerIntegrationCandidates,
40
+ } from '../../foundation/config/project.mjs';
8
41
  import {
9
42
  discoverUnmigratedThemeCopies,
10
43
  themeImportPackage,
11
44
  } from '../../foundation/discovery/theme-discovery.mjs';
12
45
  import {resolveThemeImports} from '../../foundation/discovery/theme-imports.mjs';
13
- import {findCoreDir, findInstalledPackage} from '../../foundation/fs/paths.mjs';
46
+ import {
47
+ CLI_ROOT,
48
+ findProjectCoreDir,
49
+ findInstalledPackage,
50
+ } from '../../foundation/fs/paths.mjs';
14
51
  export {
15
52
  isLocalThemeOwner,
16
53
  planThemeAppWrite,
@@ -104,7 +141,7 @@ export function listProjectSourceFiles(root, generatedModule) {
104
141
 
105
142
  /** @param {string} projectDir */
106
143
  export async function discoverDoctorThemes(projectDir) {
107
- const project = await Project.load(projectDir);
144
+ const project = await Project.load(projectDir, {core: 'project'});
108
145
  return project.themes();
109
146
  }
110
147
 
@@ -124,7 +161,7 @@ export function discoverDoctorUnmigratedCopies(projectDir) {
124
161
 
125
162
  /** @param {string} projectDir */
126
163
  export function findDoctorCoreDir(projectDir) {
127
- return findCoreDir(projectDir);
164
+ return findProjectCoreDir(projectDir);
128
165
  }
129
166
 
130
167
  /** @param {string} projectDir @param {string} packageName */
@@ -188,3 +225,185 @@ export function readPackageJson(file) {
188
225
  return null;
189
226
  }
190
227
  }
228
+
229
+ /**
230
+ * The integrations installed for the computer, and, outside a project, which
231
+ * of them the folder loads (spec AST-081 FR12): those it uses, and the names
232
+ * of the integrations the folder loads itself, whose copies win.
233
+ * @param {string} cwd
234
+ * @returns {Promise<{computerIntegrations: import('../../foundation/integrations/computer-integrations.mjs').ComputerIntegrationCandidate[], loadedComputerIntegrations: string[], folderIntegrations: string[]}>}
235
+ */
236
+ export async function computerIntegrationsOutside(cwd) {
237
+ const computerIntegrations = computerIntegrationCandidates(cwd);
238
+ if (computerIntegrations.length === 0) {
239
+ return {
240
+ computerIntegrations,
241
+ loadedComputerIntegrations: [],
242
+ folderIntegrations: [],
243
+ };
244
+ }
245
+ try {
246
+ const project = await Project.load(cwd, {core: 'project'});
247
+ /** @type {Array<{name: string, __computer?: boolean, __loadError?: string}>} */
248
+ const loaded = project.loadedIntegrations;
249
+ return {
250
+ computerIntegrations,
251
+ loadedComputerIntegrations: loaded
252
+ .filter(i => i.__computer && !i.__loadError)
253
+ .map(i => i.name),
254
+ folderIntegrations: loaded.filter(i => !i.__computer).map(i => i.name),
255
+ };
256
+ } catch {
257
+ return {
258
+ computerIntegrations,
259
+ loadedComputerIntegrations: [],
260
+ folderIntegrations: [],
261
+ };
262
+ }
263
+ }
264
+
265
+ /**
266
+ * Inside a project: the integrations installed for the computer it could add
267
+ * (spec AST-081 FR12), leaving out every package it loads or declares.
268
+ * @param {string} cwd
269
+ * @param {string[]} loadedNames the integrations the project loads
270
+ * @returns {Promise<import('../../foundation/integrations/computer-integrations.mjs').ComputerIntegrationCandidate[]>}
271
+ */
272
+ export async function computerIntegrationsToAdd(cwd, loadedNames) {
273
+ const installed = new Set([...loadedNames, ...declaredPackageNames(cwd)]);
274
+ return availableComputerIntegrations(cwd, installed);
275
+ }
276
+
277
+ /**
278
+ * The package names the folder's package.json declares, nearest first.
279
+ * @param {string} cwd
280
+ * @returns {string[]}
281
+ */
282
+ function declaredPackageNames(cwd) {
283
+ for (let dir = path.resolve(cwd); ;) {
284
+ if (fs.existsSync(path.join(dir, 'package.json'))) {
285
+ return readDeclaredDependencies(dir).map(d => d.name);
286
+ }
287
+ const parent = path.dirname(dir);
288
+ if (parent === dir) return [];
289
+ dir = parent;
290
+ }
291
+ }
292
+
293
+ /**
294
+ * The computer-level agent text's setting and its state on disk.
295
+ * @returns {{settings: import('../../foundation/env/user-settings.mjs').ComputerAgentTextSettings, entries: Array<{path: string, state: import('../../foundation/agent-docs/computer-agent-text.mjs').ComputerAgentTextState, link?: true}>}}
296
+ */
297
+ export function computerAgentTextState() {
298
+ const settings = computerAgentTextSettings();
299
+ return {settings, entries: inspectComputerAgentText({links: settings.links})};
300
+ }
301
+
302
+ export {displayHomePath};
303
+
304
+ /**
305
+ * The release facts doctor reports, read here so the checks stay pure
306
+ * (spec AST-081 FR5, FR6, FR10; architecture:cli-surface INV21): who
307
+ * answered, the newest release the computer knows of, how far the global copy
308
+ * or the project is behind, and every `astryx` on the search path with the
309
+ * command that upgrades it.
310
+ * @param {string} cwd
311
+ * @param {{project: boolean}} options
312
+ * @returns {{answeredBy: {cli: string, core: string | null, copy: string}, latest: string | null, globalBehind: ReturnType<typeof globalBehind> | null, projectLag: ReturnType<typeof projectLag> | null, lastNoticeSkip: ReturnType<typeof lastNoticeSkip>, lastCheckFailure: ReturnType<typeof lastCheckFailure>, stateLock: ReturnType<typeof stateLockHolder>, searchPathCommands: Array<import('../../foundation/env/search-path.mjs').SearchPathCommand & {upgrade: string | null}>}}
313
+ */
314
+ export function releaseFacts(cwd, {project}) {
315
+ const answered = answeredBy(cwd);
316
+ return {
317
+ answeredBy: answered,
318
+ latest: knownLatestRelease(),
319
+ lastNoticeSkip: lastNoticeSkip(),
320
+ lastCheckFailure: lastCheckFailure(),
321
+ stateLock: stateLockHolder(),
322
+ globalBehind:
323
+ !project && isGlobalCopy(CLI_ROOT)
324
+ ? globalBehind({self: {version: answered.cli, root: CLI_ROOT}})
325
+ : null,
326
+ // The project's version is its own CLI's, or, with none, its Core's:
327
+ // installed, else locked, else declared, as the daily notice reads it.
328
+ projectLag: project
329
+ ? projectLag({
330
+ cwd,
331
+ current:
332
+ (answered.copy === 'starting' && projectCoreVersion(cwd)) ||
333
+ answered.cli,
334
+ })
335
+ : null,
336
+ searchPathCommands: astryxCommandsOnSearchPath().map(row => ({
337
+ ...row,
338
+ upgrade: row.cliRoot ? globalUpgradeCommand(row.cliRoot) : null,
339
+ })),
340
+ };
341
+ }
342
+
343
+ /** Whether `cwd` is outside every project. */
344
+ export function outsideProject(/** @type {string} */ cwd) {
345
+ return isOutsideProject(cwd);
346
+ }
347
+
348
+ /**
349
+ * The commands that bring a project's own CLI and Core to one release, with
350
+ * the project's package manager: Core up to the CLI, then its codemods, when
351
+ * the CLI is newer; else the CLI to the Core's release.
352
+ * @param {string} cwd
353
+ * @param {string} cli
354
+ * @param {string} core
355
+ * @returns {string}
356
+ */
357
+ export function alignCommand(cwd, cli, core) {
358
+ return alignCliAndCore({cwd, cli, core});
359
+ }
360
+
361
+ /**
362
+ * The Core release the project at `cwd` names: installed, else locked, else
363
+ * declared; the version the daily hint and notice compare against (spec
364
+ * AST-081 FR2). Null outside a project or when it names none.
365
+ * @param {string} cwd
366
+ * @returns {string | null}
367
+ */
368
+ export function projectCoreVersion(cwd) {
369
+ return coreVersionOf(readReleaseFacts(cwd));
370
+ }
371
+
372
+ /**
373
+ * Whether the project at `cwd` installs its own CLI (spec AST-081 FR2).
374
+ * @param {string} cwd
375
+ * @returns {boolean}
376
+ */
377
+ export function projectHasOwnCli(cwd) {
378
+ return Boolean(readReleaseFacts(cwd).cli);
379
+ }
380
+
381
+ /**
382
+ * The command that adds the CLI at `version` with the project's package
383
+ * manager.
384
+ * @param {string} cwd
385
+ * @param {string} version
386
+ * @returns {string}
387
+ */
388
+ export function addCliCommandFor(cwd, version) {
389
+ return addCliCommand(projectRootOf(readReleaseFacts(cwd)) ?? cwd, version);
390
+ }
391
+
392
+ /**
393
+ * The command that adds a package with the folder's package manager, read
394
+ * from its lockfiles and `packageManager` field.
395
+ * @param {string} cwd
396
+ * @returns {(name: string) => string}
397
+ */
398
+ export function installCommandFor(cwd) {
399
+ const pm = detectPackageManager(cwd);
400
+ const verb =
401
+ pm === 'pnpm'
402
+ ? 'pnpm add'
403
+ : pm === 'yarn'
404
+ ? 'yarn add'
405
+ : pm === 'bun'
406
+ ? 'bun add'
407
+ : 'npm install';
408
+ return name => `${verb} ${name}`;
409
+ }
@@ -168,6 +168,107 @@ export function checkDocsTree(_ctx: DoctorContext | Partial<DoctorContext>, opti
168
168
  * @returns {Promise<DoctorCheck>}
169
169
  */
170
170
  export function checkDocsProgressiveDisclosure(ctx: DoctorContext | Partial<DoctorContext>): Promise<DoctorCheck>;
171
+ /**
172
+ * Check 11 — the command every printed command starts with, and a warning when
173
+ * loaded integrations declare different ones (their `cliCommand`). Then the
174
+ * picker uses neither, so commands fall back to the package-manager guess.
175
+ *
176
+ * @param {DoctorContext} ctx
177
+ * @returns {DoctorCheck}
178
+ */
179
+ export function checkCliCommand(ctx: DoctorContext): DoctorCheck;
180
+ /**
181
+ * What a computer check reads: the running Node, the release that answered
182
+ * (`meta.answeredBy`), and the newest release the computer knows of.
183
+ * @typedef {object} ComputerContext
184
+ * @property {string} nodeVersion
185
+ * @property {{cli: string, core: string | null, copy: string}} answeredBy
186
+ * @property {string | null} latest the newest release known, or null
187
+ * @property {Array<{path: string, state: import('../../foundation/agent-docs/computer-agent-text.mjs').ComputerAgentTextState}>} [agentText]
188
+ * each file of the computer-level agent text against this release's rendering
189
+ * @property {import('../../foundation/env/user-settings.mjs').ComputerAgentTextSettings} [agentTextSettings]
190
+ * the person's choices about the computer-level agent text
191
+ * @property {string} [cwd] the folder doctor runs in, for the printed fix
192
+ * @property {import('../../foundation/release/notices.mjs').GlobalBehind | null} [globalBehind]
193
+ * the CLI installed for the computer, when it is older than the newest
194
+ * release (outside a project)
195
+ * @property {import('../../foundation/release/notices.mjs').ProjectLag | null} [projectLag]
196
+ * the project's release, when it is behind the newest (inside a project)
197
+ * @property {{key: string, reason: string, at: number} | null} [lastNoticeSkip]
198
+ * @property {{at: number, reason: string} | null} [lastCheckFailure] why the
199
+ * last update check did not reach the registry, after the last that did
200
+ * the newest update notice that did not print, and why (diagnostic only)
201
+ * @property {{pid: number | null, host: string | null, since: number} | null} [stateLock]
202
+ * who holds the state file's lock now (diagnostic only)
203
+ * @property {Array<import('../../foundation/env/search-path.mjs').SearchPathCommand & {upgrade?: string | null}>} [searchPathCommands]
204
+ * every `astryx` on the search path, with the command that upgrades it
205
+ * the `astryx` commands on the search path, in order
206
+ * @property {import('../../foundation/integrations/computer-integrations.mjs').ComputerIntegrationCandidate[]} [computerIntegrations]
207
+ * the integrations installed beside the running CLI
208
+ * @property {string[]} [loadedComputerIntegrations] the names of those that
209
+ * loaded outside a project
210
+ * @property {string[]} [folderIntegrations] the names of the integrations the
211
+ * folder loads itself, whose copies win over the computer's
212
+ */
213
+ /**
214
+ * The release that answered this run outside a project, and the Core it
215
+ * reads from.
216
+ * @param {ComputerContext} ctx
217
+ * @returns {DoctorCheck}
218
+ */
219
+ export function checkAnsweringRelease(ctx: ComputerContext): DoctorCheck;
220
+ /**
221
+ * The newest release this computer knows of, beside the one that answered
222
+ * (spec AST-081 FR10). Runs inside and outside a project, and is always
223
+ * info. Inside one, a release behind the newest names the install and
224
+ * upgrade commands; outside one, a CLI installed for the computer that is
225
+ * behind names the command of the package manager that installed it, after
226
+ * the Node it needs when the computer runs an older one. Doctor installs
227
+ * nothing.
228
+ * @param {ComputerContext} ctx
229
+ * @returns {DoctorCheck}
230
+ */
231
+ export function checkNewestRelease(ctx: ComputerContext): DoctorCheck;
232
+ /**
233
+ * The `astryx` commands on the search path (spec AST-081 FR11): the first is
234
+ * the one a shell runs. Warns when it is not the Astryx CLI, or is a release
235
+ * that predates the hand-off and so answers every folder itself.
236
+ * @param {ComputerContext} ctx
237
+ * @returns {DoctorCheck}
238
+ */
239
+ export function checkCliOnPath(ctx: ComputerContext): DoctorCheck;
240
+ /**
241
+ * The computer-level agent text (spec AST-081 FR4, FR8): turned off, present
242
+ * and equal to this release's rendering, present but different, or absent,
243
+ * for the files the chosen agents read. Always `info`: the text is optional,
244
+ * so it never warns or fails. A file Astryx did not write counts as absent,
245
+ * and a file a person edited is named; both are kept as they are.
246
+ * @param {ComputerContext} ctx
247
+ * @returns {DoctorCheck}
248
+ */
249
+ export function checkComputerAgentText(ctx: ComputerContext): DoctorCheck;
250
+ /**
251
+ * The integrations installed for the computer (spec AST-081 FR12). Outside a
252
+ * project: each one that loads, and a warning for each that is skipped
253
+ * because its peer ranges exclude the answering release, or fails to load.
254
+ * @param {ComputerContext} ctx
255
+ * @returns {DoctorCheck}
256
+ */
257
+ export function checkComputerIntegrations(ctx: ComputerContext): DoctorCheck;
258
+ /**
259
+ * Inside a project, the integrations installed for the computer that the
260
+ * project does not install: available, never used (spec AST-081 FR12).
261
+ * Always info.
262
+ * @param {{installed: Set<string>, candidates: import('../../foundation/integrations/computer-integrations.mjs').ComputerIntegrationCandidate[], install: (name: string) => string}} input
263
+ * `install`: the command that adds a package with the project's package
264
+ * manager (read by the adapter)
265
+ * @returns {DoctorCheck}
266
+ */
267
+ export function checkComputerIntegrationsAvailable({ installed, candidates, install }: {
268
+ installed: Set<string>;
269
+ candidates: import("../../foundation/integrations/computer-integrations.mjs").ComputerIntegrationCandidate[];
270
+ install: (name: string) => string;
271
+ }): DoctorCheck;
171
272
  /**
172
273
  * Run all diagnostic checks and return a structured report.
173
274
  *
@@ -192,6 +293,11 @@ export function doctor(options?: {
192
293
  type: "doctor";
193
294
  data: DoctorReport;
194
295
  }>;
296
+ /**
297
+ * The checks doctor runs outside a project, in order.
298
+ * @type {Array<(ctx: ComputerContext) => DoctorCheck>}
299
+ */
300
+ export const COMPUTER_CHECKS: Array<(ctx: ComputerContext) => DoctorCheck>;
195
301
  /**
196
302
  * Ordered list of synchronous check functions. Append here to add a check.
197
303
  * (checkConfig is async and is awaited separately by {@link runChecks}.)
@@ -240,6 +346,16 @@ export type DoctorContext = {
240
346
  * - Resolved core package directory, or null.
241
347
  */
242
348
  coreDir: string | null;
349
+ /**
350
+ * - Whether the project installs its own CLI;
351
+ * false means the copy that started the run answered it (spec AST-081 FR2).
352
+ */
353
+ ownCli?: boolean | undefined;
354
+ /**
355
+ * - The Core release the project names
356
+ * (installed, else locked, else declared), as the daily hint reads it.
357
+ */
358
+ projectCore?: string | null | undefined;
243
359
  /**
244
360
  * - Resolved astryx.config.mjs path, or null.
245
361
  */
@@ -301,4 +417,87 @@ export type DoctorContext = {
301
417
  */
302
418
  projectError?: string | null | undefined;
303
419
  };
420
+ /**
421
+ * What a computer check reads: the running Node, the release that answered
422
+ * (`meta.answeredBy`), and the newest release the computer knows of.
423
+ */
424
+ export type ComputerContext = {
425
+ nodeVersion: string;
426
+ answeredBy: {
427
+ cli: string;
428
+ core: string | null;
429
+ copy: string;
430
+ };
431
+ /**
432
+ * the newest release known, or null
433
+ */
434
+ latest: string | null;
435
+ /**
436
+ * each file of the computer-level agent text against this release's rendering
437
+ */
438
+ agentText?: {
439
+ path: string;
440
+ state: import("../../foundation/agent-docs/computer-agent-text.mjs").ComputerAgentTextState;
441
+ }[] | undefined;
442
+ /**
443
+ * the person's choices about the computer-level agent text
444
+ */
445
+ agentTextSettings?: import("../../foundation/env/user-settings.mjs").ComputerAgentTextSettings | undefined;
446
+ /**
447
+ * the folder doctor runs in, for the printed fix
448
+ */
449
+ cwd?: string | undefined;
450
+ /**
451
+ * the CLI installed for the computer, when it is older than the newest
452
+ * release (outside a project)
453
+ */
454
+ globalBehind?: import("../../foundation/release/notices.mjs").GlobalBehind | null | undefined;
455
+ /**
456
+ * the project's release, when it is behind the newest (inside a project)
457
+ */
458
+ projectLag?: import("../../foundation/release/notices.mjs").ProjectLag | null | undefined;
459
+ lastNoticeSkip?: {
460
+ key: string;
461
+ reason: string;
462
+ at: number;
463
+ } | null | undefined;
464
+ /**
465
+ * why the
466
+ * last update check did not reach the registry, after the last that did
467
+ * the newest update notice that did not print, and why (diagnostic only)
468
+ */
469
+ lastCheckFailure?: {
470
+ at: number;
471
+ reason: string;
472
+ } | null | undefined;
473
+ /**
474
+ * who holds the state file's lock now (diagnostic only)
475
+ */
476
+ stateLock?: {
477
+ pid: number | null;
478
+ host: string | null;
479
+ since: number;
480
+ } | null | undefined;
481
+ /**
482
+ * every `astryx` on the search path, with the command that upgrades it
483
+ * the `astryx` commands on the search path, in order
484
+ */
485
+ searchPathCommands?: (import("../../foundation/env/search-path.mjs").SearchPathCommand & {
486
+ upgrade?: string | null;
487
+ })[] | undefined;
488
+ /**
489
+ * the integrations installed beside the running CLI
490
+ */
491
+ computerIntegrations?: import("../../foundation/integrations/computer-integrations.mjs").ComputerIntegrationCandidate[] | undefined;
492
+ /**
493
+ * the names of those that
494
+ * loaded outside a project
495
+ */
496
+ loadedComputerIntegrations?: string[] | undefined;
497
+ /**
498
+ * the names of the integrations the
499
+ * folder loads itself, whose copies win over the computer's
500
+ */
501
+ folderIntegrations?: string[] | undefined;
502
+ };
304
503
  import { DocsCatalog } from '../../foundation/discovery/docs-discovery.mjs';
@@ -24,7 +24,8 @@ export const doc = {
24
24
  'integration provider identity and contribution issues, agent docs, the ' +
25
25
  'detected package manager, and the health of the docs the CLI reads (authoring ' +
26
26
  'and CLI docs, the docs tree, doc size), and returns a structured ' +
27
- 'report. Theme checks run when the generated app module exists; without one, doctor reports that the CLI manages no themes and names theme add. Earlier descriptor-less copies are a non-failing upgrade warning. It never installs, writes, or mutates. It imports astryx.config, executes every added theme source while validating private inputs, and loads every recorded built theme module to prove its runtime imports work, including themes from installed packages. Local theme source also runs during build-freshness checks. Stylesheets are parsed without execution. Config and theme top-level code therefore run, so use doctor only with project code you trust.',
27
+ 'report. Theme checks run when the generated app module exists; without one, doctor reports that the CLI manages no themes and names theme add. Earlier descriptor-less copies are a non-failing upgrade warning. It never installs, writes, or mutates. It imports astryx.config, executes every added theme source while validating private inputs, and loads every recorded built theme module to prove its runtime imports work, including themes from installed packages. Local theme source also runs during build-freshness checks. Stylesheets are parsed without execution. Config and theme top-level code therefore run, so use doctor only with project code you trust. Outside a project it checks the computer instead: the Node version (`node-version`), the release that answered (`answering-release`), the newest release the computer knows of (`newest-release`), the astryx commands on the search path (`cli-on-path`), the integrations installed for the computer (`computer-integrations`: each one used outside a project, and a warning for one skipped because its peer range excludes the answering release or that fails to load), and the computer-level agent text (`computer-agent-text`): present and matching this release, present but different, edited, absent, or turned off, and where it is linked, with `astryx init --user` as the fix for the stale and absent cases. The agent-text check is always info. The newest-release check also runs inside a project: it names a newer release when the computer knows of one; inside a project whose release is older it names the install and upgrade commands; outside one, when the CLI installed for the computer is older, it names the command of the package manager that installed it, after the Node the newest release needs when the computer runs an older one. It is always info and installs nothing. The `cli-on-path` check also runs inside a project: it lists every astryx command on the search path in order, passes when the first is a release that hands each project run to the release of that project, and warns when the first is another program or a release that predates the hand-off, naming `npm i -g @astryxdesign/cli@latest`. Inside a project, `computer-integrations` lists, as info, the integrations installed for the computer that the project does not install, with its install command; they are not used there. It never fails a check because the folder has no project, and installs nothing.' +
28
+ ' In global mode: with `cwd` outside a project, it checks the computer instead (the Node version, the version that answered, the newest version it knows of, the astryx commands on the search path, the integrations installed globally, and the agent guide for the computer) and never fails a check because the folder has no project. See {@link namespace:global} and {@link generic:who-answers}.',
28
29
  importPath: '@astryxdesign/cli/api',
29
30
  signature: 'doctor(options?: DoctorOptions): Promise<DoctorResponse>',
30
31
  keywords: ['doctor', 'diagnose', 'health', 'check', 'verify', 'environment'],
@@ -33,7 +34,7 @@ export const doc = {
33
34
  name: 'options.cwd',
34
35
  type: 'string',
35
36
  description:
36
- 'Directory to diagnose. A missing directory is not an error; it shows up in the checks (e.g. core-installed: fail).',
37
+ 'Directory to diagnose. A directory outside any project, a missing one included, gets the computer checks.',
37
38
  default: 'process.cwd()',
38
39
  },
39
40
  ],