@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
@@ -14,14 +14,14 @@
14
14
  * @position api/hook/_adapter.mjs — shared by ./list, ./detail, ./detail/params
15
15
  */
16
16
 
17
- import {findCoreDir} from '../../foundation/fs/paths.mjs';
17
+ import {requireCoreDir} from '../../foundation/fs/paths.mjs';
18
18
  import {
19
19
  findHookDoc,
20
20
  getAllHookNames,
21
21
  } from '../../foundation/discovery/hook-discovery.mjs';
22
22
  import {loadDocs} from '../../foundation/discovery/component-loader.mjs';
23
23
  import {levenshteinDistance} from '../../foundation/text/string-utils.mjs';
24
- import {AstryxError} from '../error.mjs';
24
+ import {AstryxError, coreDirOrThrow} from '../error.mjs';
25
25
  import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
26
26
 
27
27
  /** The package that owns Core's components, hooks, and codemods. */
@@ -34,15 +34,7 @@ export {CORE_PROVIDER_ID as CORE_PACKAGE} from '../../foundation/identity/provid
34
34
  * @returns {string} Absolute path to the core package directory.
35
35
  */
36
36
  export function resolveCoreDir(cwd) {
37
- const coreDir = findCoreDir(cwd);
38
- if (!coreDir) {
39
- throw new AstryxError(
40
- 'Could not find @astryxdesign/core package',
41
- undefined,
42
- ERROR_CODES.ERR_CORE_NOT_FOUND,
43
- );
44
- }
45
- return coreDir;
37
+ return coreDirOrThrow(requireCoreDir, cwd);
46
38
  }
47
39
 
48
40
  /**
@@ -90,6 +90,10 @@ export const doc = {
90
90
  code: 'ERR_CORE_NOT_FOUND',
91
91
  when: '@astryxdesign/core cannot be resolved from cwd',
92
92
  },
93
+ {
94
+ code: 'ERR_VERSIONS_UNAVAILABLE',
95
+ when: 'outside a project, or in a project with nothing installed, the Core of the release that answers is not beside it or cached, and cannot be installed into the per-user cache (offline, a registry without it, or an unwritable cache)',
96
+ },
93
97
  {
94
98
  code: 'ERR_UNKNOWN_CATEGORY',
95
99
  when: 'options.category is not a string or matches no known category',
@@ -13,7 +13,7 @@
13
13
  export function list({ cwd, category, detail, zh, lang, }?: {
14
14
  cwd?: string | undefined;
15
15
  category?: string | undefined;
16
- detail?: "compact" | "full" | "brief" | "names" | undefined;
16
+ detail?: "names" | "compact" | "full" | "brief" | undefined;
17
17
  zh?: boolean | undefined;
18
18
  lang?: string | null | undefined;
19
19
  }): Promise<import("../hook.type.mjs").HookListResponse>;
package/api/index.d.mts CHANGED
@@ -16,6 +16,7 @@ export { init } from "./init/init.mjs";
16
16
  export { doctor } from "./doctor/doctor.mjs";
17
17
  export { integrationAddTheme } from "./integration/add-theme.mjs";
18
18
  export { integrationPackCheck } from "./integration/pack-check.mjs";
19
+ export { integrationCheck } from "./integration/check/check.mjs";
19
20
  export { AstryxError } from "./error.mjs";
20
21
  export { logger } from "./logger.mjs";
21
22
  export * from "../foundation/response/batch.type.mjs";
@@ -37,6 +38,7 @@ export * from "./integration/integration-authoring.type.mjs";
37
38
  export * from "./integration/pack-check.type.mjs";
38
39
  export * from "./integration/validate-integration.type.mjs";
39
40
  export * from "./integration/authoring-checks.type.mjs";
41
+ export * from "./integration/integration-check.type.mjs";
40
42
  export type Logger = import("./logger.mjs").Logger;
41
43
  export { themeBuild, themeAdd, themeRemove, themeUse, themeEject, themeTemplate, themeList, themeListAvailable, themeListCopySources, themeTargets, themePaletteGenerate, generateTonalPalette, listThemes } from "./theme/theme.mjs";
42
44
  export { integrationAdd, integrationAddAgentDoc, integrationAddCodemod, integrationAddComponent, integrationAddDoc, integrationAddTemplate } from "./integration/add-contribution.mjs";
package/api/index.mjs CHANGED
@@ -67,6 +67,7 @@ export {
67
67
  integrationComponentConflicts,
68
68
  integrationDocConflicts,
69
69
  } from './integration/authoring-checks.mjs';
70
+ export {integrationCheck} from './integration/check/check.mjs';
70
71
  export {AstryxError} from './error.mjs';
71
72
  // The one shared logger: the `logger` instance side-effecting commands write
72
73
  // through, plus its generated `Logger` type. Part of the public surface so an
@@ -100,3 +101,4 @@ export * from './integration/integration-authoring.type.mjs';
100
101
  export * from './integration/pack-check.type.mjs';
101
102
  export * from './integration/validate-integration.type.mjs';
102
103
  export * from './integration/authoring-checks.type.mjs';
104
+ export * from './integration/integration-check.type.mjs';
@@ -0,0 +1,22 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /**
5
+ * Write or refresh the computer-level agent text, or remove it, and record
6
+ * the setting and the links Astryx made; after a write, record the release
7
+ * that wrote it.
8
+ * @param {{remove: boolean}} options
9
+ * @returns {{home: string, command: string, files: import('./init.type.mjs').InitUserFile[], cliOnSearchPath: boolean}}
10
+ */
11
+ export function applyComputerAgentText({ remove }: {
12
+ remove: boolean;
13
+ }): {
14
+ home: string;
15
+ command: string;
16
+ files: import("./init.type.mjs").InitUserFile[];
17
+ cliOnSearchPath: boolean;
18
+ };
19
+ import { COMPUTER_COMMAND } from '../../foundation/agent-docs/computer-agent-text.mjs';
20
+ import { COMPUTER_INSTALL_STEP } from '../../foundation/agent-docs/computer-agent-text.mjs';
21
+ import { displayHomePath } from '../../foundation/agent-docs/computer-agent-text.mjs';
22
+ export { COMPUTER_COMMAND, COMPUTER_INSTALL_STEP, displayHomePath };
@@ -0,0 +1,59 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file Environment adapter for `init --user`: the home folder, the settings
5
+ * file, the per-user state, and the search path (spec AST-081 FR7, FR8;
6
+ * architecture:cli-surface INV21).
7
+ *
8
+ * @input the home folder, the settings file, the search path
9
+ * @output the computer-level agent text written or removed, with the setting
10
+ * and the links recorded
11
+ * @position packages/cli/api/init — imported by the user leaf only
12
+ */
13
+
14
+ import * as os from 'node:os';
15
+ import {
16
+ COMPUTER_COMMAND,
17
+ COMPUTER_INSTALL_STEP,
18
+ astryxOnSearchPath,
19
+ computerAgentCommand,
20
+ displayHomePath,
21
+ removeComputerAgentText,
22
+ writeComputerAgentText,
23
+ } from '../../foundation/agent-docs/computer-agent-text.mjs';
24
+ import {
25
+ computerAgentTextSettings,
26
+ recordComputerAgentTextSettings,
27
+ } from '../../foundation/env/user-settings.mjs';
28
+ import {recordAgentTextWritten} from '../../foundation/release/global-state.mjs';
29
+ import {cliVersion} from '../../foundation/release/run-context.mjs';
30
+
31
+ export {COMPUTER_COMMAND, COMPUTER_INSTALL_STEP, displayHomePath};
32
+
33
+ /**
34
+ * Write or refresh the computer-level agent text, or remove it, and record
35
+ * the setting and the links Astryx made; after a write, record the release
36
+ * that wrote it.
37
+ * @param {{remove: boolean}} options
38
+ * @returns {{home: string, command: string, files: import('./init.type.mjs').InitUserFile[], cliOnSearchPath: boolean}}
39
+ */
40
+ export function applyComputerAgentText({remove}) {
41
+ const home = os.homedir();
42
+ const command = computerAgentCommand();
43
+ const recorded = computerAgentTextSettings().links;
44
+ /** @type {import('./init.type.mjs').InitUserFile[]} */
45
+ let files;
46
+ if (remove) {
47
+ files = removeComputerAgentText({home, links: recorded});
48
+ recordComputerAgentTextSettings({install: false, links: []});
49
+ } else {
50
+ const written = writeComputerAgentText({home, command});
51
+ files = written.rows;
52
+ recordComputerAgentTextSettings({
53
+ install: true,
54
+ links: [...new Set([...recorded, ...written.links])],
55
+ });
56
+ recordAgentTextWritten(cliVersion());
57
+ }
58
+ return {home, command, files, cliOnSearchPath: astryxOnSearchPath()};
59
+ }
@@ -9,19 +9,21 @@
9
9
  * @typedef {import('./init.type.mjs').InitRunData} InitRunData
10
10
  */
11
11
  /**
12
- * Run the non-interactive init flow. Dispatches to the remove leaf when
13
- * `--remove-agents` is set, otherwise to the install (run) leaf, and returns
14
- * that leaf's receipt. Progress is emitted through `logger` (silent by
12
+ * Run the non-interactive init flow. Dispatches to the user leaf when
13
+ * `--user` is set (it writes, or with `--remove-agents` removes, the
14
+ * computer-level agent text and nothing in the folder), to the remove leaf
15
+ * when `--remove-agents` is set, otherwise to the install (run) leaf, and
16
+ * returns that leaf's receipt. Progress is emitted through `logger` (silent by
15
17
  * default); unknown feature or template names throw AstryxError with a stable
16
18
  * code.
17
19
  *
18
20
  * @param {InitOptions} [options]
19
21
  * @param {{cwd?: string}} [ctx]
20
- * @returns {Promise<import('./init.type.mjs').InitRunResponse | import('./init.type.mjs').InitRemoveResponse>}
22
+ * @returns {Promise<import('./init.type.mjs').InitRunResponse | import('./init.type.mjs').InitRemoveResponse | import('./init.type.mjs').InitUserResponse>}
21
23
  */
22
24
  export function init(options?: InitOptions, { cwd }?: {
23
25
  cwd?: string;
24
- }): Promise<import("./init.type.mjs").InitRunResponse | import("./init.type.mjs").InitRemoveResponse>;
26
+ }): Promise<import("./init.type.mjs").InitRunResponse | import("./init.type.mjs").InitRemoveResponse | import("./init.type.mjs").InitUserResponse>;
25
27
  export { getNextSteps } from "./run/run.mjs";
26
28
  /**
27
29
  * Re-exported types so callers can keep referencing them off the init barrel
@@ -21,10 +21,14 @@ export const doc = {
21
21
  'agent-docs cheat sheet, including guidance from configured integrations, and ' +
22
22
  "prints getting-started guidance; `features` / `all` print only the chosen features' " +
23
23
  'guidance instead (the theme feature also writes the annotated theme template). ' +
24
- 'With `removeAgents` it removes the managed agent-docs block instead of installing.',
24
+ 'With `removeAgents` it removes the managed agent-docs block instead of installing. ' +
25
+ 'Outside a project it writes the same files but prints no getting-started steps and no step that adds a theme to an app, since those set up a project the folder does not have. ' +
26
+ "With `user` it sets up the computer instead of the folder: it writes the computer-level agent text, one skill file at `~/.agents/skills/astryx/SKILL.md`, linked into the skill folders of agents that read only their own (`~/.claude/skills` always; Kiro, Windsurf, Letta, Xcode's coding assistant, and `~/.config/agents/skills` when that folder exists), with a managed copy for Continue, whose scanner skips links,, telling agents anywhere on the computer that Astryx is there and when to use it; with `user` and `removeAgents` it removes the file and the links it made and records that the text is turned off. " +
27
+ 'The CLI installed for the computer refreshes the file in the background after each upgrade; package install scripts, project setup, and upgrade never write it.' +
28
+ " In global mode: with `cwd` outside a project, it writes the agent docs and prints no getting-started steps; `user` writes only the agent guide for the computer, in the home folder, and touches nothing in `cwd`. See {@link namespace:global} and {@link generic:computer-agent-guide}.",
25
29
  importPath: '@astryxdesign/cli/api',
26
30
  signature:
27
- 'init(options?: InitOptions, ctx?: {cwd?: string}): Promise<InitRunResponse | InitRemoveResponse>',
31
+ 'init(options?: InitOptions, ctx?: {cwd?: string}): Promise<InitRunResponse | InitRemoveResponse | InitUserResponse>',
28
32
  keywords: ['init', 'setup', 'install', 'scaffold', 'agents', 'bootstrap'],
29
33
  params: [
30
34
  {
@@ -41,13 +45,24 @@ export const doc = {
41
45
  {
42
46
  name: 'options.removeAgents',
43
47
  type: 'boolean',
44
- description: 'Remove the managed agent-docs block instead of installing.',
48
+ description:
49
+ 'Remove the managed agent-docs block instead of installing. With `user`, remove the computer-level agent text instead.',
50
+ },
51
+ {
52
+ name: 'options.user',
53
+ type: 'boolean',
54
+ description:
55
+ "Write or refresh the computer-level agent text instead of setting up `ctx.cwd`: one skill file at `~/.agents/skills/astryx/SKILL.md` in the current user's home folder, linked (a folder symlink with a relative target, a junction on Windows, or a copy where neither can be made) into `~/.claude/skills/astryx`, and into the skills folder of Kiro, Windsurf, Letta, Xcode's coding assistant, and `~/.config/agents/skills` when that folder exists; Continue, whose scanner skips links, gets a managed copy, refreshed with the file. " +
56
+ 'The text uses the `astryx` command, or the command of the host that started the run; an integration\'s `cliCommand` never applies. ' +
57
+ 'Records the links it made, or with `removeAgents` that the text is turned off, in `astryx/settings.json` in the per-user configuration folder. ' +
58
+ 'A file without the Astryx markers, one edited since Astryx wrote it, or a symlink, is kept as it is, and so is anything at a link target that Astryx did not create. When no `astryx` command on the computer runs the Astryx CLI, the text is still written and the receipt carries a warning to install the CLI for the computer (`npm i -g @astryxdesign/cli`). ' +
59
+ 'Cannot be combined with `features`, `all`, `agent`, or `agentDocsPath`.',
45
60
  },
46
61
  {
47
62
  name: 'options.agent',
48
63
  type: 'string',
49
64
  description:
50
- 'Agent preset: claude, cursor, codex, hermes, muse, all. Used only when the agents feature runs.',
65
+ 'Agent preset: claude, cursor, codex, hermes, muse, all. Used only when the agents feature runs. Refused with `user`.',
51
66
  },
52
67
  {
53
68
  name: 'options.agentDocsPath',
@@ -71,22 +86,27 @@ export const doc = {
71
86
  {
72
87
  type: 'init.run',
73
88
  description:
74
- 'The install receipt: the `mode` (`default` | `features`), the features run, agent-doc files written, any soft docsError, the theme-template outcome (`created` | `skipped` | `failed`) plus its path, the page-template outcome (`workflow` | `created` | `skipped`) plus its path, and whether the next-steps were emitted.',
89
+ 'The install receipt: the `mode` (`default` | `features`), the features run, agent-doc files written, any soft docsError, the theme-template outcome (`created` | `skipped` | `failed`) plus its path, the page-template outcome (`workflow` | `created` | `skipped`) plus its path, and whether the next-steps were emitted (never outside a project).',
75
90
  },
76
91
  {
77
92
  type: 'init.remove',
78
93
  description:
79
94
  'The removal receipt, returned when `removeAgents` is set: `data.removed` is true when a managed agent-docs block was found and removed, and false when there was none to remove.',
80
95
  },
96
+ {
97
+ type: 'init.user',
98
+ description:
99
+ 'The computer-level agent text receipt, returned when `user` is set: `data.files`, one `{path, action, reason?}` per path acted on (`~/.agents/skills/astryx/SKILL.md`, then each link to its folder, such as `~/.claude/skills/astryx`; action `written` | `linked` | `unchanged` | `removed` | `absent` | `kept`; `reason` on `kept`: `edited` | `not-astryx`), `data.command` (the command the text names), and `data.warnings`.',
100
+ },
81
101
  ],
82
102
  throws: [
83
103
  {
84
104
  code: 'ERR_INVALID_ARGUMENT',
85
- when: '--remove-agents is combined with --features, --all, --agent, or --agent-docs-path; or --all is combined with --features',
105
+ when: '--remove-agents is combined with --features, --all, --agent, or --agent-docs-path; --user is combined with --features, --all, --agent, or --agent-docs-path; or --all is combined with --features',
86
106
  },
87
107
  {
88
108
  code: 'ERR_UNKNOWN_AGENT',
89
- when: 'the agents feature runs (default mode, features includes agents, or all) and `agent` is not one of claude, cursor, codex, hermes, muse, all',
109
+ when: 'the agents feature runs (default mode, features includes agents, or all) and `agent` is not one of claude, cursor, codex, hermes, muse, all',
90
110
  },
91
111
  {
92
112
  code: 'ERR_UNKNOWN_FEATURE',
@@ -109,6 +129,7 @@ export const doc = {
109
129
  {label: 'Default setup', code: 'const r = await init();'},
110
130
  {label: 'All features', code: 'await init({all: true});'},
111
131
  {label: 'Remove agent docs', code: 'await init({removeAgents: true});'},
132
+ {label: 'Agent text for the whole computer', code: 'const r = await init({user: true});\nfor (const w of r.data.warnings) console.warn(w);'},
112
133
  ],
113
134
  command: 'init',
114
135
  related: ['doctor', 'upgrade', 'build', 'themeTemplate'],
package/api/init/init.mjs CHANGED
@@ -10,6 +10,9 @@
10
10
  * install path (agent-docs, theme +
11
11
  * page-building guidance, template)
12
12
  * - `init.remove` (remove/remove.mjs) — the `--remove-agents` path
13
+ * - `init.user` (user/user.mjs) — the `--user` path: the
14
+ * computer-level agent text, written
15
+ * or (with `--remove-agents`) removed
13
16
  *
14
17
  * This module also re-exports the leaf symbols the CLI + tests import by name
15
18
  * (`getNextSteps`) so api/index.mjs, the command handler
@@ -18,6 +21,7 @@
18
21
 
19
22
  import {run} from './run/run.mjs';
20
23
  import {remove} from './remove/remove.mjs';
24
+ import {user} from './user/user.mjs';
21
25
  import {AstryxError} from '../error.mjs';
22
26
  import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
23
27
 
@@ -32,17 +36,37 @@ export {getNextSteps} from './run/run.mjs';
32
36
  */
33
37
 
34
38
  /**
35
- * Run the non-interactive init flow. Dispatches to the remove leaf when
36
- * `--remove-agents` is set, otherwise to the install (run) leaf, and returns
37
- * that leaf's receipt. Progress is emitted through `logger` (silent by
39
+ * Run the non-interactive init flow. Dispatches to the user leaf when
40
+ * `--user` is set (it writes, or with `--remove-agents` removes, the
41
+ * computer-level agent text and nothing in the folder), to the remove leaf
42
+ * when `--remove-agents` is set, otherwise to the install (run) leaf, and
43
+ * returns that leaf's receipt. Progress is emitted through `logger` (silent by
38
44
  * default); unknown feature or template names throw AstryxError with a stable
39
45
  * code.
40
46
  *
41
47
  * @param {InitOptions} [options]
42
48
  * @param {{cwd?: string}} [ctx]
43
- * @returns {Promise<import('./init.type.mjs').InitRunResponse | import('./init.type.mjs').InitRemoveResponse>}
49
+ * @returns {Promise<import('./init.type.mjs').InitRunResponse | import('./init.type.mjs').InitRemoveResponse | import('./init.type.mjs').InitUserResponse>}
44
50
  */
45
51
  export async function init(options = {}, {cwd = process.cwd()} = {}) {
52
+ if (options.user) {
53
+ // Its own path: fixed files in the home folder, never the project
54
+ // agent-docs resolution, so it works the same in every folder.
55
+ const refused = [
56
+ options.features ? '--features' : null,
57
+ options.all ? '--all' : null,
58
+ options.agentDocsPath ? '--agent-docs-path' : null,
59
+ options.agent ? '--agent' : null,
60
+ ].filter(Boolean);
61
+ if (refused.length > 0) {
62
+ throw new AstryxError(
63
+ `\`--user\` cannot be combined with ${refused.join(', ')}: it writes one skill file for every agent on the computer, linked into the folders agents read, with no features, agents, or path to choose.`,
64
+ undefined,
65
+ ERROR_CODES.ERR_INVALID_ARGUMENT,
66
+ );
67
+ }
68
+ return user({remove: Boolean(options.removeAgents)});
69
+ }
46
70
  if (options.removeAgents) {
47
71
  const ignored = [
48
72
  options.features ? '--features' : null,
@@ -42,7 +42,7 @@ export type InitRunData = {
42
42
  */
43
43
  templatePath: string | null;
44
44
  /**
45
- * Whether the getting-started "Next steps" were emitted (default mode).
45
+ * Whether the getting-started "Next steps" were emitted (default mode inside a project; false outside one).
46
46
  */
47
47
  nextSteps: boolean;
48
48
  };
@@ -59,6 +59,47 @@ export type InitRemoveResponse = {
59
59
  removed: boolean;
60
60
  };
61
61
  };
62
+ /**
63
+ * What `init --user` did with one file of the computer-level agent text.
64
+ * `written`: created or refreshed. `unchanged`: already this release's text.
65
+ * `removed`: deleted (with `--remove-agents`). `absent`: nothing to remove.
66
+ * `kept`: a file left as it is, because a person edited it or Astryx did not
67
+ * write it (see `reason`).
68
+ */
69
+ export type InitUserAction = "written" | "linked" | "unchanged" | "removed" | "absent" | "kept";
70
+ export type InitUserFile = {
71
+ /**
72
+ * Absolute path in the home folder: the skill file,
73
+ * or a link to its folder.
74
+ */
75
+ path: string;
76
+ action: InitUserAction;
77
+ /**
78
+ * Only on `kept`: `edited`, the
79
+ * text no longer matches the hash Astryx recorded in it; `not-astryx`, it
80
+ * has no Astryx markers or is a symlink, or a link target holds something
81
+ * Astryx did not create.
82
+ */
83
+ reason?: "edited" | "not-astryx" | undefined;
84
+ };
85
+ export type InitUserData = {
86
+ /**
87
+ * One row per path acted on: `~/.agents/skills/astryx/SKILL.md` first, then each link to its folder: `~/.claude/skills/astryx` always, and another agent's skills folder when that agent's folder exists (`linked`, or `unchanged` when the link is already there). Removal removes the file and the links Astryx made.
88
+ */
89
+ files: InitUserFile[];
90
+ /**
91
+ * The command the text tells agents to run: `astryx`, or the host's command when a host started the run.
92
+ */
93
+ command: string;
94
+ /**
95
+ * Non-fatal notes, such as no `astryx` on the computer that runs the Astryx CLI.
96
+ */
97
+ warnings: string[];
98
+ };
99
+ export type InitUserResponse = {
100
+ type: "init.user";
101
+ data: InitUserData;
102
+ };
62
103
  /**
63
104
  * Options for `init()`.
64
105
  */
@@ -72,11 +113,15 @@ export type InitOptions = {
72
113
  */
73
114
  all?: boolean | undefined;
74
115
  /**
75
- * Remove the managed agent-docs block instead of installing.
116
+ * Remove the managed agent-docs block instead of installing; with `user`, remove the computer-level agent text.
76
117
  */
77
118
  removeAgents?: boolean | undefined;
78
119
  /**
79
- * Agent preset: claude, cursor, codex, hermes, muse, all.
120
+ * Write the computer-level agent text (`~/.agents/skills/astryx/SKILL.md`, linked into `~/.claude/skills` and the skill folders of other installed tools, with a copy for Continue) instead of setting up the folder.
121
+ */
122
+ user?: boolean | undefined;
123
+ /**
124
+ * Agent preset: claude, cursor, codex, hermes, muse, all. Refused with `user`.
80
125
  */
81
126
  agent?: string | undefined;
82
127
  /**
@@ -17,7 +17,7 @@
17
17
  * @property {string | null} themeTemplatePath Relative output path when `themeTemplate === 'created'`.
18
18
  * @property {'workflow' | 'created' | 'skipped' | null} template Template outcome (`workflow` is the CLI default; `created`/`skipped` are programmatic).
19
19
  * @property {string | null} templatePath Relative output path when `template === 'created'`.
20
- * @property {boolean} nextSteps Whether the getting-started "Next steps" were emitted (default mode).
20
+ * @property {boolean} nextSteps Whether the getting-started "Next steps" were emitted (default mode inside a project; false outside one).
21
21
  */
22
22
 
23
23
  /**
@@ -32,13 +32,47 @@
32
32
  * @property {{removed: boolean}} data False when no managed agent-docs block was found, so nothing was removed.
33
33
  */
34
34
 
35
+ /**
36
+ * What `init --user` did with one file of the computer-level agent text.
37
+ * `written`: created or refreshed. `unchanged`: already this release's text.
38
+ * `removed`: deleted (with `--remove-agents`). `absent`: nothing to remove.
39
+ * `kept`: a file left as it is, because a person edited it or Astryx did not
40
+ * write it (see `reason`).
41
+ * @typedef {'written' | 'linked' | 'unchanged' | 'removed' | 'absent' | 'kept'} InitUserAction
42
+ */
43
+
44
+ /**
45
+ * @typedef {object} InitUserFile
46
+ * @property {string} path Absolute path in the home folder: the skill file,
47
+ * or a link to its folder.
48
+ * @property {InitUserAction} action
49
+ * @property {'edited' | 'not-astryx'} [reason] Only on `kept`: `edited`, the
50
+ * text no longer matches the hash Astryx recorded in it; `not-astryx`, it
51
+ * has no Astryx markers or is a symlink, or a link target holds something
52
+ * Astryx did not create.
53
+ */
54
+
55
+ /**
56
+ * @typedef {object} InitUserData
57
+ * @property {InitUserFile[]} files One row per path acted on: `~/.agents/skills/astryx/SKILL.md` first, then each link to its folder: `~/.claude/skills/astryx` always, and another agent's skills folder when that agent's folder exists (`linked`, or `unchanged` when the link is already there). Removal removes the file and the links Astryx made.
58
+ * @property {string} command The command the text tells agents to run: `astryx`, or the host's command when a host started the run.
59
+ * @property {string[]} warnings Non-fatal notes, such as no `astryx` on the computer that runs the Astryx CLI.
60
+ */
61
+
62
+ /**
63
+ * @typedef {object} InitUserResponse
64
+ * @property {'init.user'} type
65
+ * @property {InitUserData} data
66
+ */
67
+
35
68
  /**
36
69
  * Options for `init()`.
37
70
  * @typedef {object} InitOptions
38
71
  * @property {string} [features] Comma-separated features to install (agents, theme, template).
39
72
  * @property {boolean} [all] Install all features.
40
- * @property {boolean} [removeAgents] Remove the managed agent-docs block instead of installing.
41
- * @property {string} [agent] Agent preset: claude, cursor, codex, hermes, muse, all.
73
+ * @property {boolean} [removeAgents] Remove the managed agent-docs block instead of installing; with `user`, remove the computer-level agent text.
74
+ * @property {boolean} [user] Write the computer-level agent text (`~/.agents/skills/astryx/SKILL.md`, linked into `~/.claude/skills` and the skill folders of other installed tools, with a copy for Continue) instead of setting up the folder.
75
+ * @property {string} [agent] Agent preset: claude, cursor, codex, hermes, muse, all. Refused with `user`.
42
76
  * @property {string | string[]} [agentDocsPath] Explicit agent-docs file path(s).
43
77
  * @property {string} [templateName] Scaffold a named page template (programmatic only; the CLI never sets it).
44
78
  */
@@ -8,7 +8,7 @@
8
8
  * installed built themes and imports their production and font stylesheets. The
9
9
  * app imports that module once and passes its default to <Theme>.
10
10
  *
11
- * @param {string} invocation install-aware CLI invocation stem (e.g. `npx astryx`, `pnpm exec astryx`, or `npx @astryxdesign/cli` for one-off runs)
11
+ * @param {string} invocation install-aware CLI invocation stem (e.g. `pnpm exec astryx`, `yarn astryx`, or `npx @astryxdesign/cli` for one-off runs)
12
12
  * @returns {string[]} ordered list of human-facing lines
13
13
  */
14
14
  export function getNextSteps(invocation: string): string[];
@@ -19,6 +19,7 @@ import * as fs from 'node:fs';
19
19
  import {CLI_ROOT} from '../../../foundation/fs/paths.mjs';
20
20
  import {PathSafetyError, assertWithin} from '../../../foundation/fs/path-safety.mjs';
21
21
  import {getCliInvocation} from '../../../foundation/env/package-manager.mjs';
22
+ import {isOutsideProject} from '../../../foundation/env/project-scope.mjs';
22
23
  import {
23
24
  installAgentDocs,
24
25
  renderAgentDocsBlock,
@@ -39,7 +40,7 @@ const VALID_AGENTS = ['claude', 'cursor', 'codex', 'hermes', 'muse', 'all'];
39
40
  * installed built themes and imports their production and font stylesheets. The
40
41
  * app imports that module once and passes its default to <Theme>.
41
42
  *
42
- * @param {string} invocation install-aware CLI invocation stem (e.g. `npx astryx`, `pnpm exec astryx`, or `npx @astryxdesign/cli` for one-off runs)
43
+ * @param {string} invocation install-aware CLI invocation stem (e.g. `pnpm exec astryx`, `yarn astryx`, or `npx @astryxdesign/cli` for one-off runs)
43
44
  * @returns {string[]} ordered list of human-facing lines
44
45
  */
45
46
  export function getNextSteps(invocation) {
@@ -50,11 +51,11 @@ export function getNextSteps(invocation) {
50
51
  ` (run \`${invocation} doctor\` to verify)`,
51
52
  " 2. Import base styles: import '@astryxdesign/core/reset.css'",
52
53
  " and import '@astryxdesign/core/astryx.css'",
53
- " 3. Import components: import { Button } from '@astryxdesign/core'",
54
+ " 3. Import components: import { Button } from '@astryxdesign/core/Button'",
54
55
  ' 4. Add and wire a theme:',
55
56
  ' npm install @astryxdesign/theme-neutral',
56
57
  ` ${invocation} theme add neutral`,
57
- " import { Theme } from '@astryxdesign/core'",
58
+ " import { Theme } from '@astryxdesign/core/theme'",
58
59
  " import { themes, defaultThemeSlug } from './astryx-themes'",
59
60
  ' <Theme theme={themes[defaultThemeSlug]}>...</Theme>',
60
61
  ` Extend an imported theme to customize it. Run \`${invocation} theme eject <slug>\` only to fork source.`,
@@ -140,8 +141,11 @@ function applyTheme(cwd, invocation, data) {
140
141
  data.themeTemplate = 'failed';
141
142
  logger.error('Could not write the theme template.');
142
143
  }
144
+ // Outside a project there is no app to add a theme to (spec AST-081 FR3).
143
145
  logger.log(
144
- ` Edit the blank template for a new theme, or run \`${invocation} theme add <slug>\` to import an installed built theme (\`${invocation} theme list\` to browse). Extend an imported theme for ordinary customization; use \`${invocation} theme eject <slug>\` only to fork source.`,
146
+ isOutsideProject(cwd)
147
+ ? ` Edit the blank template for a new theme, or run \`${invocation} theme eject <slug>\` to start from the source of a built theme (\`${invocation} theme list\` to browse).`
148
+ : ` Edit the blank template for a new theme, or run \`${invocation} theme add <slug>\` to import an installed built theme (\`${invocation} theme list\` to browse). Extend an imported theme for ordinary customization; use \`${invocation} theme eject <slug>\` only to fork source.`,
145
149
  );
146
150
  }
147
151
 
@@ -276,7 +280,10 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
276
280
  }
277
281
 
278
282
  // No flags: TTY-free default — install the AI agent cheat sheet with NO
279
- // prompts, then print the getting-started guidance.
283
+ // prompts, then print the getting-started guidance. Outside a project the
284
+ // steps would set up a project the folder does not have, so they are left
285
+ // out (spec AST-081 FR3).
286
+ const outside = isOutsideProject(cwd);
280
287
  /** @type {import('../init.type.mjs').InitRunData} */
281
288
  const data = {
282
289
  mode: 'default',
@@ -288,13 +295,17 @@ export async function run(options = {}, {cwd = process.cwd()} = {}) {
288
295
  themeTemplatePath: null,
289
296
  template: null,
290
297
  templatePath: null,
291
- nextSteps: true,
298
+ nextSteps: !outside,
292
299
  };
293
300
  await applyAgents(cwd, options, invocation, data);
294
301
  logger.log('');
295
302
  logger.log(
296
303
  ` Tip: \`${invocation} init --all\` also points you to the theme and page-building workflows.`,
297
304
  );
305
+ if (outside) {
306
+ logger.log('');
307
+ return {type: 'init.run', data};
308
+ }
298
309
  for (const line of getNextSteps(invocation)) logger.log(line);
299
310
  return {type: 'init.run', data};
300
311
  }
@@ -0,0 +1,14 @@
1
+ // @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
2
+ // DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
3
+
4
+ /**
5
+ * Write or remove the computer-level agent text and return an `init.user`
6
+ * receipt. Progress is emitted through the shared `logger` (silent by
7
+ * default); warnings go to its warn channel.
8
+ *
9
+ * @param {{remove?: boolean}} [options]
10
+ * @returns {Promise<import('../init.type.mjs').InitUserResponse>}
11
+ */
12
+ export function user({ remove }?: {
13
+ remove?: boolean;
14
+ }): Promise<import("../init.type.mjs").InitUserResponse>;