@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
@@ -15,8 +15,8 @@ export const doc = {
15
15
  description:
16
16
  'The optional astryx.config.* file at your project root. Declares which ' +
17
17
  'integrations to load, where to route issue links, post-codemod hooks, local ' +
18
- 'debug-log and gap-report handlers, and experimental layout components. All ' +
19
- 'optional; {} is valid.',
18
+ 'debug-log and gap-report handlers, a discover source, and experimental ' +
19
+ 'layout components. All optional; {} is valid.',
20
20
  appliesTo: 'astryx.config.{ts,mjs,js}',
21
21
  fields: [
22
22
  {
@@ -29,7 +29,9 @@ export const doc = {
29
29
  {
30
30
  name: 'issuesUrl',
31
31
  type: 'string',
32
- description: 'URL that "report an issue" affordances link to.',
32
+ description:
33
+ "Where reports about Core go: `astryx gap-report` routes a Core report here when no handler is loaded, gapReport handlers receive it as `report.target.issuesUrl`, and `astryx swizzle` prints it as the feedback link for a Core component. A report or swizzle for an integration's component uses that integration's own issuesUrl, never this one. An absolute URL; a value that is not a URL makes the config invalid.",
34
+ default: "'https://github.com/facebook/astryx/issues/new'",
33
35
  },
34
36
  {
35
37
  name: 'hooks',
@@ -40,7 +42,7 @@ export const doc = {
40
42
  name: 'hooks.postCodemod',
41
43
  type: 'PostCodemodHook[]',
42
44
  description:
43
- 'Commands run after an upgrade applies codemods (e.g. re-run your formatter). Each hook returns a command to execute, or null to skip.',
45
+ 'Commands to run after `astryx upgrade` changes files (e.g. re-run your formatter). Each hook is an object `{name?, buildCommand}`: buildCommand gets `{packageDir, files}` and returns `{command, args?, options?}` to run, or null to skip. A dry run prints each command instead of running it.',
44
46
  },
45
47
  ],
46
48
  },
@@ -77,7 +79,7 @@ export const doc = {
77
79
  name: 'experimental.xle.components',
78
80
  type: 'Record<string, XleComponent>',
79
81
  description:
80
- 'Custom components the layout expander (XLE) may emit, keyed by tag.',
82
+ 'Custom components for the removed layout expander, keyed by component name. The CLI still validates the field, so an entry without a string `from` makes `astryx.config` invalid, but nothing reads it.',
81
83
  },
82
84
  ],
83
85
  },
@@ -90,6 +92,7 @@ export const doc = {
90
92
  {
91
93
  label: 'Send every command run somewhere of your own',
92
94
  code:
95
+ "import {appendFileSync} from 'node:fs';\n\n" +
93
96
  'export default {\n' +
94
97
  ' debug: event => appendFileSync("runs.ndjson", JSON.stringify(event) + "\\n"),\n' +
95
98
  '};',
@@ -98,7 +101,7 @@ export const doc = {
98
101
  notes: [
99
102
  {
100
103
  type: 'prose',
101
- text: 'The config is validated at load with a strict schema: unknown keys are errors, so a typo fails fast rather than being silently ignored.',
104
+ text: 'The config is validated at load with a strict schema: an unknown key, a misspelled one included, or a value of the wrong type makes the whole file invalid. `astryx gap-report`, `astryx discover`, and `astryx upgrade` stop with the error, and `astryx doctor` fails its `config` check (exit 1). Reads such as `component`, `docs`, `search`, `template`, and `theme` carry on silently as if there were no config and no integrations, and no debug handler runs, so run `astryx doctor` after editing the file.',
102
105
  },
103
106
  ],
104
107
  };
@@ -115,8 +115,10 @@ export interface AstryxConfig {
115
115
  /** Experimental XLE (layout expression) configuration. */
116
116
  xle?: {
117
117
  /**
118
- * Register app-local components so XLE layout expressions can
119
- * reference them by name via {hint}. Keyed by component name.
118
+ * Custom components for the removed layout expander, keyed by
119
+ * component name. The CLI still validates the field, so an entry
120
+ * without a string `from` makes `astryx.config` invalid, but nothing
121
+ * reads it.
120
122
  */
121
123
  components?: Record<string, XleComponent>;
122
124
  };
@@ -44,9 +44,9 @@ declare const eventSchema: z.ZodObject<{
44
44
  args: z.ZodRecord<z.ZodString, z.ZodUnknown>;
45
45
  options: z.ZodRecord<z.ZodString, z.ZodUnknown>;
46
46
  optionSources: z.ZodRecord<z.ZodString, z.ZodEnum<{
47
- default: "default";
48
47
  cli: "cli";
49
48
  env: "env";
49
+ default: "default";
50
50
  config: "config";
51
51
  implied: "implied";
52
52
  }>>;
@@ -75,16 +75,16 @@ declare const eventSchema: z.ZodObject<{
75
75
  resultCount: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
76
76
  emptyResult: z.ZodDefault<z.ZodNullable<z.ZodBoolean>>;
77
77
  resultKind: z.ZodDefault<z.ZodNullable<z.ZodEnum<{
78
- theme: "theme";
79
- component: "component";
80
78
  command: "command";
79
+ none: "none";
80
+ component: "component";
81
81
  hook: "hook";
82
- template: "template";
83
82
  doc: "doc";
83
+ template: "template";
84
+ theme: "theme";
84
85
  integration: "integration";
85
86
  migration: "migration";
86
87
  mixed: "mixed";
87
- none: "none";
88
88
  }>>>;
89
89
  directMatch: z.ZodDefault<z.ZodNullable<z.ZodBoolean>>;
90
90
  stdout: z.ZodString;
@@ -16,7 +16,7 @@ export const doc = {
16
16
  displayName: 'DiscoverSource',
17
17
  namespace: 'authoring',
18
18
  description:
19
- 'A source for `astryx discover`: an async function that returns a catalog of packages a project could add, their versions, and what each version adds. Set it as `discover` in astryx.config, or export it as `discover` from an integration manifest. Discover calls every source, the project one first, and one that throws, runs past 30 seconds, or returns an invalid catalog never hides the others; discover then uses the last good answer it saved for that source. Discover only reads: it prints the command that adds a package and never runs it.',
19
+ 'A source for `astryx discover`: an async function that returns a catalog of packages a project could add, their versions, and what each version adds. Set it as `discover` in astryx.config, or export it as `discover` from an integration manifest. Discover calls every source, the project one first, and then reads the official list the CLI carries; another source\'s entry for an official package is kept. A source that throws, runs past 30 seconds, or returns an invalid catalog never hides the others; discover then uses the last good answer that source gave for the same request, or reports the source as failed when it saved none. Discover only reads: it prints the command that adds a package and never runs it.',
20
20
  appliesTo:
21
21
  '`discover` in astryx.config.*, or the `discover` named export of astryx.integration.*',
22
22
  fields: [
@@ -135,4 +135,10 @@ export const doc = {
135
135
  '};',
136
136
  },
137
137
  ],
138
+ notes: [
139
+ {
140
+ type: 'prose',
141
+ text: "In global mode: the discover source of an integration installed for the computer is called in folders outside any project; inside a project, only the sources of integrations the project installs are. See {@link namespace:global} and {@link generic:global-integrations}.",
142
+ },
143
+ ],
138
144
  };
@@ -4,12 +4,12 @@
4
4
  /** Every authored doc-kind discriminant accepted by parseDoc. */
5
5
  export const AuthoredDocKindSchema: z.ZodEnum<{
6
6
  function: "function";
7
+ command: "command";
7
8
  component: "component";
8
9
  generic: "generic";
9
10
  page: "page";
10
11
  block: "block";
11
12
  schema: "schema";
12
- command: "command";
13
13
  enum: "enum";
14
14
  namespace: "namespace";
15
15
  }>;
@@ -497,6 +497,11 @@ export const CommandDocKindSchema: z.ZodObject<{
497
497
  code: z.ZodNumber;
498
498
  when: z.ZodString;
499
499
  }, z.core.$loose>>>;
500
+ outsideProject: z.ZodOptional<z.ZodEnum<{
501
+ same: "same";
502
+ refuse: "refuse";
503
+ own: "own";
504
+ }>>;
500
505
  related: z.ZodOptional<z.ZodArray<z.ZodString>>;
501
506
  notes: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
502
507
  type: z.ZodLiteral<"prose">;
@@ -582,12 +587,12 @@ export const NamespaceDocKindSchema: z.ZodObject<{
582
587
  accepts: z.ZodObject<{
583
588
  kinds: z.ZodArray<z.ZodEnum<{
584
589
  function: "function";
590
+ command: "command";
585
591
  component: "component";
586
592
  generic: "generic";
587
593
  page: "page";
588
594
  block: "block";
589
595
  schema: "schema";
590
- command: "command";
591
596
  enum: "enum";
592
597
  namespace: "namespace";
593
598
  }>>;
@@ -602,12 +607,12 @@ export const NamespaceDocKindSchema: z.ZodObject<{
602
607
  group: z.ZodString;
603
608
  kinds: z.ZodOptional<z.ZodArray<z.ZodEnum<{
604
609
  function: "function";
610
+ command: "command";
605
611
  component: "component";
606
612
  generic: "generic";
607
613
  page: "page";
608
614
  block: "block";
609
615
  schema: "schema";
610
- command: "command";
611
616
  enum: "enum";
612
617
  namespace: "namespace";
613
618
  }>>>;
@@ -574,6 +574,7 @@ export const CommandDocKindSchema = z
574
574
  exitCodes: z
575
575
  .array(z.object({code: z.number(), when: z.string()}).passthrough())
576
576
  .optional(),
577
+ outsideProject: z.enum(['same', 'refuse', 'own']).optional(),
577
578
  related: z.array(z.string()).optional(),
578
579
  notes: z.array(ReferenceContentBlockSchema).optional(),
579
580
  })
@@ -12,14 +12,15 @@ export const doc = {
12
12
  displayName: 'Authored doc graph fields',
13
13
  namespace: 'authoring',
14
14
  description:
15
- "Fields every authored doc kind can declare for the docs tree: `placement`, plus two reserved fields, `aliases` and `audience`. The docs tree reads `placement` for every guide, the CLI's and each integration's. Nothing reads `aliases` or `audience` today: a reference topic outside the docs tree that sets one fails to load, and other doc kinds accept them and ignore them.",
16
- appliesTo: 'Every supported .doc.mjs object',
15
+ "Fields every authored doc kind can declare for the docs tree: `placement`, plus two reserved fields, `aliases` and `audience`. The docs tree reads `placement` for every guide and namespace doc, the CLI's and each integration's. Nothing reads `aliases` or `audience` today: a reference topic that sets one fails to load, placed in the docs tree or not, and other doc kinds accept them and ignore them.",
16
+ appliesTo:
17
+ "Every authored doc kind's .doc.mjs object. Theme descriptors take none of these fields.",
17
18
  fields: [
18
19
  {
19
20
  name: 'placement',
20
21
  type: 'DocPlacement',
21
22
  description:
22
- "Names the doc's one parent in the docs tree: a namespace of the same package, one of its slots, and an order. Read for every guide, the CLI's and each integration's: a guide with `placement` gets a route in the tree instead of a flat topic name, and cannot also `replaces` or `extends` a topic. In the CLI's own topic directory a topic that sets it fails to load: the CLI keeps its guides in its docs tree directory. Commands, API functions, schemas, and enums do not set it: the tree adopts each by its `namespace`.",
23
+ "Names the doc's one parent in the docs tree: a namespace of the same package, one of its slots, and an order. Read for every guide, the CLI's and each integration's, and for every namespace doc: a guide with `placement` gets a route in the tree instead of a flat topic name, and cannot also set `replaces` or `extends`; a namespace doc with `placement` nests under that parent. In the CLI's own topic directory a topic that sets it fails to load: the CLI keeps its guides in its docs tree directory. Commands, API functions, schemas, and enums do not set it: the tree adopts each by its `namespace`.",
23
24
  fields: [
24
25
  {
25
26
  name: 'placement.parent',
@@ -37,7 +38,8 @@ export const doc = {
37
38
  {
38
39
  name: 'placement.order',
39
40
  type: 'number',
40
- description: 'Integer sibling order within the slot.',
41
+ description:
42
+ "Integer sibling order within the slot. Docs without an order come after the ordered ones, sorted by title. The same order sets each doc's Previous and Next links.",
41
43
  },
42
44
  ],
43
45
  },
@@ -48,18 +48,20 @@ export const doc = {
48
48
  {
49
49
  name: 'description',
50
50
  type: 'string',
51
- description: 'Longer help body / when-to-use.',
51
+ description:
52
+ 'Longer body / when-to-use. `astryx docs` prints it after the summary; `--help` shows only the summary.',
52
53
  },
53
54
  {
54
55
  name: 'namespace',
55
56
  type: 'string',
56
57
  description:
57
- "Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's commands use 'cli/commands', which the docs tree adopts: each is the leaf `cli/commands/<name>`. Every command doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
58
+ "Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's commands use 'cli/commands', which the docs tree adopts: each is the leaf `cli/commands/<name>`, spaces as hyphens (`theme build` is `cli/commands/theme-build`). Every command doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
58
59
  },
59
60
  {
60
61
  name: 'aliases',
61
62
  type: 'string[]',
62
- description: 'Alternate slugs that also resolve to this doc.',
63
+ description:
64
+ 'Reserved: other names for this doc. Nothing reads it today, so they do not resolve to it.',
63
65
  },
64
66
  {
65
67
  name: 'fn',
@@ -83,13 +85,13 @@ export const doc = {
83
85
  name: 'args[].param',
84
86
  type: 'string',
85
87
  description:
86
- 'FunctionDoc param this arg binds to (inherits its description).',
88
+ "FunctionDoc param this arg binds to; `astryx docs` shows that param's description when the arg has none.",
87
89
  },
88
90
  {
89
91
  name: 'args[].description',
90
92
  type: 'string',
91
93
  description:
92
- 'Override description (else inherited from the referenced param).',
94
+ "Override description. `--help` shows an argument's description only when it sets this.",
93
95
  },
94
96
  {
95
97
  name: 'args[].required',
@@ -126,7 +128,7 @@ export const doc = {
126
128
  name: 'options[].description',
127
129
  type: 'string',
128
130
  description:
129
- 'Override/explicit description (required when `cliOnly`).',
131
+ 'Override/explicit description. Nothing requires it: a flag with neither this nor `param` shows no description.',
130
132
  },
131
133
  {
132
134
  name: 'options[].choices',
@@ -143,7 +145,7 @@ export const doc = {
143
145
  name: 'options[].cliOnly',
144
146
  type: 'boolean',
145
147
  description:
146
- 'True for CLI-only flags with no function param (e.g. --json).',
148
+ 'True for CLI-only flags with no function param (e.g. --verbose). Nothing reads it.',
147
149
  },
148
150
  ],
149
151
  },
@@ -196,6 +198,12 @@ export const doc = {
196
198
  },
197
199
  ],
198
200
  },
201
+ {
202
+ name: 'outsideProject',
203
+ type: "'same' | 'refuse' | 'own'",
204
+ description:
205
+ 'What the command does outside a project. `same`: the answer it gives in a new project. `refuse`: it writes nothing and fails, naming the app project or integration package it needs. `own`: something else. Every `refuse` and `own` command also carries an `In global mode:` note in its `notes` that tells readers exactly what it does. Every command and subcommand declares one, and `astryx manifest` publishes it; a command that only groups subcommands declares none. The CLI tests run every command in an empty folder and check what it does against this value; `astryx doctor` does not check it.',
206
+ },
199
207
  {
200
208
  name: 'deprecated',
201
209
  type: 'string',
@@ -220,13 +228,13 @@ export const doc = {
220
228
  type: 'command',
221
229
  name: 'search',
222
230
  displayName: 'astryx search',
223
- summary: 'Find components, hooks, docs, and templates.',
224
- namespace: 'cli',
231
+ summary: 'Find components, hooks, docs, templates, and themes.',
232
+ namespace: 'cli/commands',
225
233
  fn: 'search',
226
234
  args: [{name: 'query', param: 'query', required: true}],
227
235
  options: [
228
- {flag: '--type <domain>', param: 'options.type', choices: ['component', 'hook', 'doc', 'template']},
229
- {flag: '--json', cliOnly: true, description: 'Emit the typed JSON envelope.'},
236
+ {flag: '--type <domain>', param: 'options.type', choices: ['component', 'hook', 'doc', 'template', 'theme']},
237
+ {flag: '--verbose', cliOnly: true, description: "Also print each result's score and match reason."},
230
238
  ],
231
239
  examples: [{label: 'Terminal', cli: 'astryx search button --json'}],
232
240
  exitCodes: [{code: 1, when: 'The --type value is not a known domain.'}],
@@ -241,7 +249,7 @@ export const doc = {
241
249
  },
242
250
  {
243
251
  type: 'prose',
244
- text: "Bind an arg/option to a function param via `param` so it inherits that param's description. Use `cliOnly: true` for flags with no function param (e.g. `--json`); those must supply their own `description`.",
252
+ text: "Bind an arg/option to a function param via `param` so it inherits that param's description: an option's in `--help` and `astryx docs`, an arg's in `astryx docs` only. Mark a flag with no function param (e.g. `--verbose`) `cliOnly: true` and give it its own `description`; nothing checks either. `--json` is a global flag, so a command doc does not declare it.",
245
253
  },
246
254
  ],
247
255
  };
@@ -40,6 +40,18 @@ export interface CommandOptionDoc {
40
40
  cliOnly?: boolean;
41
41
  }
42
42
 
43
+ /**
44
+ * What a command does in a folder outside any project:
45
+ * - `same`: it gives the answer it gives in a new project, reading the Core
46
+ * the answering release carries.
47
+ * - `refuse`: it writes nothing and fails before doing any work, naming the app
48
+ * project or integration package it needs.
49
+ * - `own`: it does something else.
50
+ * Every `refuse` and `own` command also carries an `In global mode:` note
51
+ * in its `notes`, for readers.
52
+ */
53
+ export type CommandOutsideProject = 'same' | 'refuse' | 'own';
54
+
43
55
  export interface CommandExampleDoc {
44
56
  label?: string;
45
57
  /** A full terminal invocation, e.g. 'astryx search button --json'. */
@@ -81,6 +93,8 @@ export interface CommandDoc extends AuthoredDocGraphFields {
81
93
  examples?: CommandExampleDoc[];
82
94
  /** Documented exit codes. */
83
95
  exitCodes?: {code: number; when: string}[];
96
+ /** What the command does outside a project: `same`, `refuse`, or `own`. Every command and subcommand declares one, and `astryx manifest` publishes it; a command that only groups subcommands declares none. */
97
+ outsideProject?: CommandOutsideProject;
84
98
  /** Deprecation notice — a DEP-* id and the replacement. */
85
99
  deprecated?: string;
86
100
  /** Related command names; the CLI links each to its doc. */
@@ -30,7 +30,7 @@ export const doc = {
30
30
  name: 'name',
31
31
  type: 'string',
32
32
  description:
33
- "Stable machine identity and directory name without the Astryx prefix, PascalCase. e.g. 'Button', 'TextInput', 'AppShell'. For an integration component it is the export apps import: the doc sits beside the file that exports it, and when that file exports nothing under its own name, `name` may name the export it does have. Change `displayName`, not `name`, to edit the visible label; registry URLs derive from this identity by default.",
33
+ "Stable machine identity without the Astryx prefix, PascalCase. e.g. 'Button', 'TextInput', 'AppShell'. For an integration component it is the export apps import: the doc sits beside the file that exports it, and when that file exports nothing under its own name, `name` may name the export it does have. Change `displayName`, not `name`, to edit the visible label; registry URLs derive from this identity by default.",
34
34
  required: true,
35
35
  },
36
36
  {
@@ -56,25 +56,25 @@ export const doc = {
56
56
  name: 'replaces',
57
57
  type: 'string',
58
58
  description:
59
- 'Integration components only: the exact `name` of the Core ComponentDoc this component takes over for unqualified lookup, so every app that loads the integration gets it from component detail, component lists, search, `swizzle <Name>`, and issue routing; `swizzle --list` keeps listing Core names. The Core original stays reachable with `--package @astryxdesign/core`. It takes effect only when the package\'s peer range starts at the release that applies it, `"@astryxdesign/cli": ">=0.6.7"` or later; without such a range the component keeps its own name and `doctor integration components` warns. Set it only to intentionally own a Core identity; give an alternative or variant its own name instead.',
59
+ 'Integration components only: the exact `name` of the Core ComponentDoc this component takes over for unqualified lookup, so every app that loads the integration gets it from component detail, component lists, search, `swizzle <Name>`, and issue routing; `swizzle --list` keeps listing Core names. The Core original stays reachable with `--package @astryxdesign/core`. It takes effect only when the package\'s peer range starts at the release that applies it, `"@astryxdesign/cli": ">=0.6.7"` or later; with a lower range nothing changes and `doctor integration components` warns ({@link generic:replace-a-core-component}). Set it only to intentionally own a Core identity; give an alternative or variant its own name instead.',
60
60
  },
61
61
  {
62
62
  name: 'keywords',
63
63
  type: 'string[]',
64
64
  description:
65
- 'Search keywords for CLI discovery: synonyms and related UI concepts from other design systems (MUI, Chakra, Radix, and others). Lowercase. Used by `astryx component <term>` fuzzy matching.',
65
+ 'Search keywords for CLI discovery: synonyms and related UI concepts from other design systems (MUI, Chakra, Radix, and others). Lowercase. `astryx search` matches them; `astryx component <term>` also suggests Core components by keyword.',
66
66
  },
67
67
  {
68
68
  name: 'hiddenComponents',
69
69
  type: 'string[]',
70
70
  description:
71
- 'Sub-component names to hide from human-facing UI (CLI listings, docs catalogs). They stay public and importable; agents and tooling can still discover them via source.',
71
+ "Sub-component names to hide from human-facing UI (CLI listings, docs catalogs). They stay public and importable; agents and tooling can still discover them via source. In an integration it hides only full entries in this doc's `components`, which the CLI then neither lists nor opens; hide a sub-component that has its own doc with `hidden` in that doc.",
72
72
  },
73
73
  {
74
74
  name: 'hidden',
75
75
  type: 'boolean',
76
76
  description:
77
- 'Hide this entire component from human-facing UI. It stays public and importable. Use for shared primitives (NavIcon, NavMenu) that only make sense inside their parent.',
77
+ 'Hide this entire component from human-facing UI. It stays public and importable. Use for a shared primitive that only makes sense inside its parent.',
78
78
  },
79
79
  {
80
80
  name: 'group',
@@ -98,13 +98,13 @@ export const doc = {
98
98
  name: 'theming',
99
99
  type: '{ container?: boolean; targets: ComponentThemingTarget[]; vars?: ComponentThemingVar[]; derived?: ComponentThemingDerivedVar[] }',
100
100
  description:
101
- 'Theming configuration: the stable selector surface (xds-* classes + data-attribute reflections) that themes target via @scope selectors in defineTheme.',
101
+ 'Theming configuration: the stable selector surface (astryx-* classes + data-attribute reflections) that themes target via @scope selectors in defineTheme.',
102
102
  fields: [
103
103
  {
104
104
  name: 'theming.container',
105
105
  type: 'boolean',
106
106
  description:
107
- 'When true, container `padding` props are mapped to container tokens by the theme pipeline instead of emitting raw CSS.',
107
+ "Marks a container component. Nothing reads it today: the theme pipeline maps `padding` to container tokens from a `theming.derived` entry `{property: 'padding', expand: 'container'}`.",
108
108
  },
109
109
  {
110
110
  name: 'theming.targets',
@@ -122,7 +122,7 @@ export const doc = {
122
122
  name: 'theming.derived',
123
123
  type: 'ComponentThemingDerivedVar[]',
124
124
  description:
125
- 'Maps standard CSS properties to internal vars for theme-pipeline expansion. Ordered by priority: earlier entries emit first.',
125
+ "Maps standard CSS properties to internal vars for theme-pipeline expansion. Ordered by priority: earlier entries emit first. The pipeline reads only Core components' entries, so an integration's have no effect.",
126
126
  },
127
127
  ],
128
128
  },
@@ -193,7 +193,7 @@ export const doc = {
193
193
  name: 'subComponentOf',
194
194
  type: 'string',
195
195
  description:
196
- "SubComponentDoc variant (required there): the parent component's `name` (e.g. 'Chat'). Marks this file as a sub-component doc that inherits family fields (group, category, keywords, theming, playground) from the parent.",
196
+ "SubComponentDoc variant (required there): the parent component's `name` (e.g. 'Chat'). Marks this file as a sub-component doc. The CLI does not copy family fields (group, category, keywords, theming, playground) from the parent to an integration's sub-component: its detail, list group and search use only what its own doc sets. Set any the child needs in its own doc.",
197
197
  },
198
198
  {
199
199
  name: 'description',
@@ -206,9 +206,10 @@ export const doc = {
206
206
  {
207
207
  label: 'SingleComponentDoc (props on the doc)',
208
208
  code: `/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
209
- export const docs = {
210
- name: 'Switch',
211
- displayName: 'Switch',
209
+ export default {
210
+ type: 'component',
211
+ name: 'AcmeSwitch',
212
+ displayName: 'Acme Switch',
212
213
  category: 'Form Controls',
213
214
  keywords: ['toggle', 'switch', 'on off'],
214
215
  usage: {
@@ -229,17 +230,18 @@ export const docs = {
229
230
  {
230
231
  label: 'MultiComponentDoc (a components array)',
231
232
  code: `/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
232
- export const docs = {
233
- name: 'Table',
234
- displayName: 'Table',
233
+ export default {
234
+ type: 'component',
235
+ name: 'AcmeTable',
236
+ displayName: 'Acme Table',
235
237
  category: 'Table & List',
236
238
  usage: {description: 'Displays rows and columns of data. Compose the sub-components to build headers, rows, and cells.'},
237
239
  components: [
238
- {name: 'Table', displayName: 'Table', description: 'The table container.', props: []},
239
- {name: 'TableRow', displayName: 'Table Row', description: 'A row within the table body.', props: [
240
+ {name: 'AcmeTable', displayName: 'Acme Table', description: 'The table container.', props: []},
241
+ {name: 'AcmeTableRow', displayName: 'Acme Table Row', description: 'A row within the table body.', props: [
240
242
  {name: 'isSelected', type: 'boolean', description: 'Highlights the row as selected.'},
241
243
  ]},
242
- {name: 'useTableSelection', displayName: 'useTableSelection', description: 'Manages row selection state.',
244
+ {name: 'useAcmeTableSelection', displayName: 'useAcmeTableSelection', description: 'Manages row selection state.',
243
245
  params: [{name: 'rows', type: 'T[]', description: 'The rows to track.', required: true}],
244
246
  returns: [{name: 'selectedIds', type: 'Set<string>', description: 'Currently selected row ids.'}]},
245
247
  ],
@@ -249,7 +251,7 @@ export const docs = {
249
251
  notes: [
250
252
  {
251
253
  type: 'prose',
252
- text: "When it loads, a stamped component doc is checked as loosely as an unstamped one, so adding `type: 'component'` to an existing doc never breaks it: `displayName` may be missing, `category` may be any string, and `usage`, `theming`, `playground` and `examples` are not checked. Each entry in a group doc's `components` must have a `name`. Write to the type anyway; it is the contract.",
254
+ text: "When it loads, a stamped component doc is checked about as loosely as an unstamped one, so adding `type: 'component'` to a doc that follows the type never breaks it: `displayName` may be missing, `category` may be any string, `usage`, `theming` and `playground` are not checked, and `examples` need only be an array. Unlike an unstamped doc, each entry in a group doc's `components` must have a `name`, and `import` and `replaces`, when set, must be non-empty strings. Write to the type anyway; it is the contract.",
253
255
  },
254
256
  {
255
257
  type: 'prose',
@@ -261,7 +263,7 @@ export const docs = {
261
263
  items: [
262
264
  'SingleComponentDoc: one primary component; put props directly on the doc via `props`. Use for Switch, Badge, Spinner, TextInput.',
263
265
  'MultiComponentDoc: a directory exporting several components/hooks; list them in `components` (inline ComponentEntry or name-only ComponentRef). Use for Table, Dialog, TabList.',
264
- 'SubComponentDoc: a single sub-component in its own {Name}.doc.mjs inside the parent directory; set `subComponentOf` to the parent name. It inherits family fields and may omit `usage`.',
266
+ "SubComponentDoc: a single sub-component in its own {Name}.doc.mjs inside the parent directory; set `subComponentOf` to the parent name. It does not take the parent's family fields, and it may omit `usage`.",
265
267
  ],
266
268
  },
267
269
  {
@@ -269,11 +271,12 @@ export const docs = {
269
271
  lang: 'js',
270
272
  label: 'SubComponentDoc',
271
273
  code: `/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
272
- export const docs = {
273
- name: 'ChatComposer',
274
- displayName: 'Chat Composer',
275
- subComponentOf: 'Chat',
276
- description: 'The message input row within a Chat, with an editor and send affordance.',
274
+ export default {
275
+ type: 'component',
276
+ name: 'AcmeChatComposer',
277
+ displayName: 'Acme Chat Composer',
278
+ subComponentOf: 'AcmeChat',
279
+ description: 'The message input row within an Acme Chat, with an editor and send affordance.',
277
280
  props: [
278
281
  {name: 'onSend', type: '(text: string) => void', description: 'Called when the user submits a message.', required: true},
279
282
  ],
@@ -281,7 +284,7 @@ export const docs = {
281
284
  },
282
285
  {
283
286
  type: 'prose',
284
- text: "The stamped format is `export default { type: 'component', ... }`; legacy docs use `export const docs = {...}` and omit `type` (the parser shape-sniffs). A hook that is part of a component API is documented as a ComponentEntry in a MultiComponentDoc `components` array (with `params`/`returns`), not as a standalone HookDoc.",
287
+ text: "The stamped format is `export default { type: 'component', ... }`, which `astryx integration add component` writes; legacy docs use `export const docs = {...}` and omit `type` (the parser shape-sniffs). A hook that is part of a component API is listed in a MultiComponentDoc `components` array: inline as a ComponentEntry (with `params`/`returns`), or by name with its own SubComponentDoc file, as Core's useTableSelection is.",
285
288
  },
286
289
  ],
287
290
  };
@@ -273,6 +273,14 @@ export interface ComponentRef {
273
273
  * Used by both `docsZh` (Chinese translation) and `docsDense` (compressed format).
274
274
  */
275
275
  export interface ComponentTranslationDoc {
276
+ /** Optional exact name from the base doc. Allowed so an overlay can say
277
+ * which component it translates; the overlay renders through the base
278
+ * doc, so this field is ignored at render time. */
279
+ name?: string;
280
+ /** Optional translated displayName. Allowed so the displayName backfill
281
+ * codemod (which adds `displayName` next to every `name:` field) does not
282
+ * break translation overlays. Ignored at render time. */
283
+ displayName?: string;
276
284
  /** Compressed/translated component description. */
277
285
  description?: string;
278
286
  /** Prop descriptions keyed by prop name. Only include props that have descriptions. */
@@ -338,15 +346,17 @@ export interface SingleComponentDoc extends ComponentBaseDoc {
338
346
  * `subComponentOf` field, which names the parent component.
339
347
  *
340
348
  * A sub-component owns its `description`, `props`, and (optionally) its own
341
- * `usage`. Family-level fields (`group`, `category`, `keywords`, `theming`,
342
- * `playground`) are inherited from the directory's primary doc unless
343
- * overridden here. The generated registry entry is identical to the legacy
344
- * inline `components[]` expansion — this is purely a file-structure change.
349
+ * `usage`. The CLI does not copy family-level fields (`group`, `category`,
350
+ * `keywords`, `theming`, `playground`) from the parent to an integration's
351
+ * sub-component: its detail, list group and search use only what its own doc
352
+ * sets. Set any the child needs in its own doc. The generated registry entry
353
+ * is identical to the legacy inline `components[]` expansion — this is purely
354
+ * a file-structure change.
345
355
  */
346
356
  export interface SubComponentDoc extends Omit<ComponentBaseDoc, 'usage'> {
347
357
  /** Name of the parent component this sub-component belongs to, matching the
348
358
  * parent doc's `name` (e.g. `"Chat"`). Marks this file as a sub-component
349
- * doc so the pipeline parents and inherits family fields correctly. */
359
+ * doc. The CLI does not copy the parent's family fields to it. */
350
360
  subComponentOf: string;
351
361
  /** One-sentence description of what this sub-component does and its role
352
362
  * within the parent composition. */
@@ -16,13 +16,15 @@ export const doc = {
16
16
  description:
17
17
  'The doc-type for a closed vocabulary: a fixed set of literal values such as ' +
18
18
  'error codes or response-type discriminants. Colocated as a `.doc.mjs` next to ' +
19
- 'the source of truth it documents.',
19
+ 'the source of truth it documents. Only the CLI reads enum docs, from its own ' +
20
+ "source: one in an integration's docs directory fails to load, and so do that package's other docs.",
20
21
  appliesTo: '<enum>.doc.mjs',
21
22
  fields: [
22
23
  {
23
24
  name: 'type',
24
25
  type: "'enum'",
25
- description: 'Doc-kind discriminant. Marks the file as an enum doc.',
26
+ description:
27
+ 'Doc-kind discriminant. Optional in the type, but the CLI reads a doc as an enum doc only when it is set; without it the doc drops out of the docs tree.',
26
28
  },
27
29
  {
28
30
  name: 'name',
@@ -54,7 +56,8 @@ export const doc = {
54
56
  {
55
57
  name: 'aliases',
56
58
  type: 'string[]',
57
- description: 'Alternate slugs that also resolve to this doc.',
59
+ description:
60
+ 'Reserved: alternate slugs for this doc. Nothing reads it today, so `astryx docs <alias>` does not open it.',
58
61
  },
59
62
  {
60
63
  name: 'members',
@@ -91,7 +94,7 @@ export const doc = {
91
94
  type: 'enum',
92
95
  name: 'error-codes',
93
96
  displayName: 'Error Codes',
94
- namespace: 'cli',
97
+ namespace: 'cli/api',
95
98
  description: 'Stable error codes thrown by the CLI/API and surfaced in the JSON envelope.',
96
99
  members: [
97
100
  {value: 'ERR_UNKNOWN_TOPIC', description: 'The requested docs topic does not exist.'},