@astryxdesign/cli 0.1.8-canary.0c4d8d7 → 0.1.8-canary.0db5dfd

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 (303) hide show
  1. package/{src/api → api/blog}/blog.mjs +42 -6
  2. package/{src/api → api/blog}/blog.test.mjs +2 -2
  3. package/api/build/build.mjs +92 -0
  4. package/api/build/build.test.mjs +92 -0
  5. package/{src/api → api/component}/component.mjs +49 -26
  6. package/{src/api → api/discover}/discover.mjs +55 -18
  7. package/{src/api → api/docs}/docs.mjs +47 -21
  8. package/{src/api → api/doctor}/doctor.mjs +11 -8
  9. package/{src/api → api/hook}/hook.mjs +11 -11
  10. package/{src/api → api}/index.mjs +16 -9
  11. package/{src/api → api/integration}/validate-integration.mjs +48 -15
  12. package/{src/api → api/integration}/validate-integration.test.mjs +1 -1
  13. package/{src/api → api/layout}/layout.mjs +66 -17
  14. package/{src/api → api/layout}/layout.test.mjs +1 -1
  15. package/{src/api → api/search}/search.mjs +71 -12
  16. package/api/swizzle/swizzle.mjs +283 -0
  17. package/{src/commands → api/swizzle}/swizzle.test.mjs +26 -1
  18. package/{src/api → api/template}/template-integration.test.mjs +2 -2
  19. package/{src/api → api/template}/template-suffix.test.mjs +3 -3
  20. package/{src/api → api/template}/template.mjs +96 -19
  21. package/{src/api → api/theme}/theme-add.mjs +35 -7
  22. package/{src → authoring}/codemod.mjs +6 -6
  23. package/{src → authoring}/config.test.mjs +1 -1
  24. package/{src → authoring}/doc.mjs +1 -1
  25. package/{src → authoring}/doc.test.mjs +1 -1
  26. package/{src → authoring}/template.mjs +1 -1
  27. package/bin/astryx.mjs +12 -10
  28. package/{src → cli}/commands/blog.mjs +48 -7
  29. package/{src → cli}/commands/build-theme.mjs +125 -46
  30. package/{src → cli}/commands/build.mjs +33 -57
  31. package/{src → cli}/commands/component/index.mjs +49 -22
  32. package/{src → cli}/commands/component-ownership.test.mjs +3 -3
  33. package/{src → cli}/commands/component-package.test.mjs +1 -1
  34. package/{src → cli}/commands/component-resolution.test.mjs +2 -2
  35. package/{src → cli}/commands/discover.mjs +17 -8
  36. package/{src → cli}/commands/docs.mjs +39 -7
  37. package/{src → cli}/commands/docs.test.mjs +1 -1
  38. package/{src → cli}/commands/doctor.mjs +3 -3
  39. package/{src → cli}/commands/doctor.test.mjs +2 -2
  40. package/{src → cli}/commands/ensure-core-built.mjs +3 -2
  41. package/{src → cli}/commands/external-showcase.test.mjs +1 -1
  42. package/{src → cli}/commands/hook/index.mjs +37 -14
  43. package/{src → cli}/commands/import-hint-correctness.test.mjs +1 -1
  44. package/{src → cli}/commands/init.mjs +20 -9
  45. package/{src → cli}/commands/layout.mjs +58 -18
  46. package/{src → cli}/commands/search.mjs +19 -12
  47. package/{src → cli}/commands/search.test.mjs +1 -1
  48. package/{src → cli}/commands/setup-nudge.test.mjs +1 -1
  49. package/cli/commands/swizzle.mjs +103 -0
  50. package/{src → cli}/commands/template.mjs +73 -22
  51. package/{src → cli}/commands/template.path-safety.test.mjs +2 -2
  52. package/{src → cli}/commands/upgrade.integration-policy.test.mjs +1 -1
  53. package/{src → cli}/commands/upgrade.mjs +160 -52
  54. package/{src → cli}/commands/upgrade.test.mjs +1 -1
  55. package/{src → cli}/commands/validate-integration.mjs +17 -37
  56. package/{src → cli}/index.mjs +17 -15
  57. package/{src/codemods → codemods}/ensure-jscodeshift.mjs +1 -1
  58. package/{src/codemods → codemods}/integration-discovery.mjs +6 -3
  59. package/{src/codemods → codemods}/integration-discovery.test.mjs +1 -1
  60. package/{src/codemods → codemods}/integration-runner.mjs +8 -3
  61. package/{src/codemods → codemods}/registry.mjs +3 -1
  62. package/{src/codemods → codemods}/run-codemod.mjs +17 -10
  63. package/{src/codemods → codemods}/runner.mjs +22 -12
  64. package/{src/codemods → codemods}/transforms/v0.0.10/remove-size-props.mjs +9 -4
  65. package/{src/codemods → codemods}/transforms/v0.0.12/add-is-icon-only.mjs +27 -22
  66. package/{src/codemods → codemods}/transforms/v0.0.13/icon-name-deprecations.mjs +12 -5
  67. package/{src/codemods → codemods}/transforms/v0.0.13/rename-attachments-to-drawer.mjs +15 -8
  68. package/{src/codemods → codemods}/transforms/v0.0.13/toolbar-density-to-size.mjs +10 -4
  69. package/{src/codemods → codemods}/transforms/v0.0.14/rename-action-props.mjs +11 -5
  70. package/{src/codemods → codemods}/transforms/v0.0.14/rename-section-wash-to-muted.mjs +11 -6
  71. package/{src/codemods → codemods}/transforms/v0.0.14/rename-status-variants.mjs +15 -10
  72. package/{src/codemods → codemods}/transforms/v0.0.15/migrate-item-children-to-endcontent.mjs +13 -8
  73. package/{src/codemods → codemods}/transforms/v0.0.15/migrate-selector-children-to-render-option.mjs +18 -13
  74. package/{src/codemods → codemods}/transforms/v0.0.15/migrate-theme-selectors-to-data-attrs.mjs +8 -4
  75. package/{src/codemods → codemods}/transforms/v0.0.15/rename-date-picker-to-input.mjs +11 -6
  76. package/{src/codemods → codemods}/transforms/v0.0.15/rename-imperative-ref-to-handleRef.mjs +6 -1
  77. package/{src/codemods → codemods}/transforms/v0.0.15/rename-isStreaming-to-isStopShown.mjs +6 -1
  78. package/{src/codemods → codemods}/transforms/v0.0.15/rename-stack-element-to-as.mjs +8 -3
  79. package/{src/codemods → codemods}/transforms/v0.0.2/migrate-badge-dot-to-statusdot.mjs +17 -10
  80. package/{src/codemods → codemods}/transforms/v0.0.2/migrate-gap-to-numeric.mjs +7 -1
  81. package/{src/codemods → codemods}/transforms/v0.0.2/migrate-isFullBleed-to-padding.mjs +9 -4
  82. package/{src/codemods → codemods}/transforms/v0.0.2/migrate-useXDSIcon-to-getIcon.mjs +12 -7
  83. package/{src/codemods → codemods}/transforms/v0.0.2/rename-banner-endButton-to-endContent.mjs +7 -2
  84. package/{src/codemods → codemods}/transforms/v0.0.2/rename-form-tooltip-startIcon.mjs +8 -2
  85. package/{src/codemods → codemods}/transforms/v0.0.2/rename-isShown-to-isOpen.mjs +7 -2
  86. package/{src/codemods → codemods}/transforms/v0.0.2/rename-selector-items-to-options.mjs +7 -2
  87. package/{src/codemods → codemods}/transforms/v0.0.2/rename-sidenav-header-to-heading.mjs +11 -4
  88. package/{src/codemods → codemods}/transforms/v0.0.2/rename-topnav-title-to-heading.mjs +10 -4
  89. package/{src/codemods → codemods}/transforms/v0.0.2/unify-uncontrolled-to-defaultX.mjs +7 -2
  90. package/{src/codemods → codemods}/transforms/v0.0.2/unify-visibility-to-onOpenChange.mjs +10 -5
  91. package/{src/codemods → codemods}/transforms/v0.0.6/migrate-badge-children-to-label.mjs +7 -2
  92. package/{src/codemods → codemods}/transforms/v0.0.6/migrate-collapse-to-collapsible.mjs +9 -3
  93. package/{src/codemods → codemods}/transforms/v0.0.6/migrate-radius-tokens.mjs +11 -5
  94. package/{src/codemods → codemods}/transforms/v0.0.6/migrate-shadow-tokens.mjs +13 -6
  95. package/{src/codemods → codemods}/transforms/v0.0.6/migrate-skeleton-radius.mjs +7 -1
  96. package/{src/codemods → codemods}/transforms/v0.0.6/migrate-token-names.mjs +11 -5
  97. package/{src/codemods → codemods}/transforms/v0.0.7/rename-banner-variant-to-container.mjs +8 -3
  98. package/{src/codemods → codemods}/transforms/v0.0.8/migrate-token-renames.mjs +15 -8
  99. package/{src/codemods → codemods}/transforms/v0.0.8/rename-endslot-to-endcontent.mjs +7 -2
  100. package/{src/codemods → codemods}/transforms/v0.1.0/drop-xds-prefix-imports.mjs +19 -14
  101. package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-css-surfaces.mjs +21 -17
  102. package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-declare-module.mjs +7 -2
  103. package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-module-specifiers.mjs +16 -11
  104. package/{src/codemods → codemods}/transforms/v0.1.2/rename-text-color-active-to-accent.mjs +15 -9
  105. package/{src/codemods → codemods}/transforms/v0.1.3/migrate-layout-components-to-experimental.mjs +17 -12
  106. package/{src/codemods → codemods}/transforms/v0.1.5/rename-switch-label-spacing-default-to-hug.mjs +15 -9
  107. package/{src/codemods → codemods}/transforms/v0.1.7/migrate-table-tableprops-to-direct-props.mjs +17 -10
  108. package/{src/codemods → codemods}/transforms/v0.1.7/rename-table-renderprops-styles-to-xstyle.mjs +18 -13
  109. package/{src/codemods → codemods}/transforms/v0.1.8/rename-avatar-size-scale.mjs +15 -10
  110. package/docs/internationalization.doc.mjs +92 -46
  111. package/{src/commands → lib/agent-docs}/agent-docs.mjs +30 -11
  112. package/{src/commands → lib/agent-docs}/agent-docs.path-safety.test.mjs +1 -1
  113. package/{src/lib → lib}/component-discovery.mjs +44 -2
  114. package/{src/lib → lib}/component-format.mjs +65 -24
  115. package/{src/lib → lib}/component-loader.mjs +27 -13
  116. package/{src/lib → lib}/componentDocOverlay.test.mjs +0 -1
  117. package/{src/lib → lib}/error-codes.test.mjs +1 -1
  118. package/{src/lib → lib}/hook-discovery.mjs +14 -1
  119. package/{src/lib → lib}/hook-format.mjs +29 -5
  120. package/{src/lib → lib}/integration-warnings.mjs +2 -2
  121. package/{src/lib → lib}/integrations.mjs +20 -0
  122. package/{src/lib → lib}/integrations.test.mjs +1 -1
  123. package/{src/lib → lib}/json-contract.test.mjs +1 -1
  124. package/{src/lib → lib}/json-shim.mjs +10 -5
  125. package/{src/lib → lib}/json-shim.test.mjs +1 -1
  126. package/{src/lib → lib}/levenshtein.mjs +6 -0
  127. package/{src/lib → lib}/manifest.mjs +7 -5
  128. package/{src/lib → lib}/manifest.test.mjs +2 -2
  129. package/{src/lib → lib}/module-loader.mjs +1 -0
  130. package/{src/lib → lib}/package-scanner.mjs +47 -0
  131. package/{src/lib → lib}/project.mjs +48 -18
  132. package/{src/lib → lib}/project.test.mjs +1 -1
  133. package/{src/lib → lib}/resolve-theme.mjs +5 -0
  134. package/{src/lib → lib}/string-utils.mjs +15 -0
  135. package/{src/lib → lib}/term-log.mjs +12 -3
  136. package/{src/lib → lib}/xle/browser.mjs +18 -8
  137. package/{src/lib → lib}/xle/expand.mjs +155 -22
  138. package/{src/lib → lib}/xle/parse.mjs +119 -13
  139. package/{src/lib → lib}/xle/print.mjs +54 -14
  140. package/{src/lib → lib}/xle/registry-core.mjs +28 -3
  141. package/{src/lib → lib}/xle/registry.mjs +9 -4
  142. package/{src/lib → lib}/xle/splice.mjs +13 -2
  143. package/{src/lib → lib}/xle/validate.mjs +95 -14
  144. package/lib/xle/xle-ast.d.ts +214 -0
  145. package/package.json +33 -26
  146. package/scripts/postinstall.mjs +4 -4
  147. package/templates/blocks/components/Avatar/AvatarShowcase.tsx +1 -1
  148. package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.doc.mjs +19 -0
  149. package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +46 -0
  150. package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider02Overrides.doc.mjs +14 -0
  151. package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider02Overrides.tsx +33 -0
  152. package/{src/types → types}/api.contract.assert.ts +17 -8
  153. package/{src/types → types}/api.d.ts +106 -0
  154. package/{src/types → types}/base.d.ts +17 -2
  155. package/types/build.d.ts +53 -0
  156. package/types/codemod.d.ts +166 -0
  157. package/{src/types → types}/component.d.ts +1 -1
  158. package/{src/types → types}/discover.d.ts +1 -1
  159. package/{src/types → types}/docs.d.ts +1 -4
  160. package/{src/types → types}/hook.d.ts +1 -1
  161. package/types/jscodeshift.d.ts +19 -0
  162. package/types/layout.d.ts +74 -0
  163. package/types/theme.d.ts +53 -0
  164. package/{src/types → types}/upgrade.d.ts +8 -1
  165. package/{src/utils → utils}/paths.mjs +4 -1
  166. package/src/commands/swizzle.mjs +0 -417
  167. package/src/types/build.d.ts +0 -23
  168. package/src/types/codemod.d.ts +0 -81
  169. package/src/types/theme.d.ts +0 -23
  170. /package/{src/api → api/docs}/docOverlays.test.mjs +0 -0
  171. /package/{src/api → api}/error.mjs +0 -0
  172. /package/{src/api → api/integration}/integration-block-exports.test.mjs +0 -0
  173. /package/{src/api → api/template}/template.test.mjs +0 -0
  174. /package/{src → authoring}/codemod.test.mjs +0 -0
  175. /package/{src → authoring}/config.mjs +0 -0
  176. /package/{src → authoring}/integration.mjs +0 -0
  177. /package/{src → authoring}/template.test.mjs +0 -0
  178. /package/{src → cli}/cli-exit-codes.test.mjs +0 -0
  179. /package/{src → cli}/commands/build-theme.color-scheme.test.mjs +0 -0
  180. /package/{src → cli}/commands/build-theme.import-path.test.mjs +0 -0
  181. /package/{src → cli}/commands/build-theme.path-safety.test.mjs +0 -0
  182. /package/{src → cli}/commands/build-theme.prose.test.mjs +0 -0
  183. /package/{src → cli}/commands/build-theme.variants.test.mjs +0 -0
  184. /package/{src → cli}/commands/build-theme.watch.test.mjs +0 -0
  185. /package/{src → cli}/commands/cli-postinstall.test.mjs +0 -0
  186. /package/{src → cli}/commands/component.test.mjs +0 -0
  187. /package/{src → cli}/commands/detail-levels.test.mjs +0 -0
  188. /package/{src → cli}/commands/init.next-steps.test.mjs +0 -0
  189. /package/{src → cli}/commands/interactive-guard.test.mjs +0 -0
  190. /package/{src → cli}/commands/json-contract.test.mjs +0 -0
  191. /package/{src → cli}/commands/swizzle.path-safety.test.mjs +0 -0
  192. /package/{src → cli}/commands/swizzle.routing.test.mjs +0 -0
  193. /package/{src → cli}/commands/template.test.mjs +0 -0
  194. /package/{src → cli}/commands/upgrade.config-ordering.test.mjs +0 -0
  195. /package/{src → cli}/commands/validate-integration.test.mjs +0 -0
  196. /package/{src → cli}/update-hint-commands.test.mjs +0 -0
  197. /package/{src/codemods → codemods}/__tests__/registry.test.mjs +0 -0
  198. /package/{src/codemods → codemods}/__tests__/rename-imperative-ref-to-handleRef.test.mjs +0 -0
  199. /package/{src/codemods → codemods}/__tests__/rename-isStreaming-to-isStopShown.test.mjs +0 -0
  200. /package/{src/codemods → codemods}/__tests__/rename-section-wash-to-muted.test.mjs +0 -0
  201. /package/{src/codemods → codemods}/__tests__/runner.test.mjs +0 -0
  202. /package/{src/codemods → codemods}/__tests__/toolbar-density-to-size.test.mjs +0 -0
  203. /package/{src/codemods → codemods}/__tests__/validation.test.mjs +0 -0
  204. /package/{src/codemods → codemods}/transforms/v0.0.10/__tests__/remove-size-props.test.mjs +0 -0
  205. /package/{src/codemods → codemods}/transforms/v0.0.10/index.mjs +0 -0
  206. /package/{src/codemods → codemods}/transforms/v0.0.12/__tests__/add-is-icon-only.test.mjs +0 -0
  207. /package/{src/codemods → codemods}/transforms/v0.0.12/index.mjs +0 -0
  208. /package/{src/codemods → codemods}/transforms/v0.0.13/__tests__/icon-name-deprecations.test.mjs +0 -0
  209. /package/{src/codemods → codemods}/transforms/v0.0.13/__tests__/rename-attachments-to-drawer.test.mjs +0 -0
  210. /package/{src/codemods → codemods}/transforms/v0.0.13/index.mjs +0 -0
  211. /package/{src/codemods → codemods}/transforms/v0.0.14/__tests__/rename-action-props.test.mjs +0 -0
  212. /package/{src/codemods → codemods}/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +0 -0
  213. /package/{src/codemods → codemods}/transforms/v0.0.14/index.mjs +0 -0
  214. /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-item-children-to-endcontent.test.mjs +0 -0
  215. /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-selector-children-to-render-option.test.mjs +0 -0
  216. /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-theme-selectors-to-data-attrs.test.mjs +0 -0
  217. /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/rename-date-picker-to-input.test.mjs +0 -0
  218. /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/rename-stack-element-to-as.test.mjs +0 -0
  219. /package/{src/codemods → codemods}/transforms/v0.0.15/index.mjs +0 -0
  220. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-badge-dot-to-statusdot.test.mjs +0 -0
  221. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-gap-to-numeric.test.mjs +0 -0
  222. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-isFullBleed-to-padding.test.mjs +0 -0
  223. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-useXDSIcon-to-getIcon.test.mjs +0 -0
  224. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-banner-endButton-to-endContent.test.mjs +0 -0
  225. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-form-tooltip-startIcon.test.mjs +0 -0
  226. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-isShown-to-isOpen.test.mjs +0 -0
  227. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-selector-items-to-options.test.mjs +0 -0
  228. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-sidenav-header-to-heading.test.mjs +0 -0
  229. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-topnav-title-to-heading.test.mjs +0 -0
  230. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/unify-uncontrolled-to-defaultX.test.mjs +0 -0
  231. /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/unify-visibility-to-onOpenChange.test.mjs +0 -0
  232. /package/{src/codemods → codemods}/transforms/v0.0.2/index.mjs +0 -0
  233. /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-collapse-to-collapsible.test.mjs +0 -0
  234. /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-radius-tokens.test.mjs +0 -0
  235. /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-shadow-tokens.test.mjs +0 -0
  236. /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-skeleton-radius.test.mjs +0 -0
  237. /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-token-names.test.mjs +0 -0
  238. /package/{src/codemods → codemods}/transforms/v0.0.6/index.mjs +0 -0
  239. /package/{src/codemods → codemods}/transforms/v0.0.7/__tests__/rename-banner-variant-to-container.test.mjs +0 -0
  240. /package/{src/codemods → codemods}/transforms/v0.0.7/index.mjs +0 -0
  241. /package/{src/codemods → codemods}/transforms/v0.0.8/__tests__/migrate-token-renames.test.mjs +0 -0
  242. /package/{src/codemods → codemods}/transforms/v0.0.8/__tests__/rename-endslot-to-endcontent.test.mjs +0 -0
  243. /package/{src/codemods → codemods}/transforms/v0.0.8/index.mjs +0 -0
  244. /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/drop-xds-prefix-imports.test.mjs +0 -0
  245. /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-css-surfaces.test.mjs +0 -0
  246. /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-declare-module.test.mjs +0 -0
  247. /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-module-specifiers.test.mjs +0 -0
  248. /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/v0.1.0-ordering.test.mjs +0 -0
  249. /package/{src/codemods → codemods}/transforms/v0.1.0/index.mjs +0 -0
  250. /package/{src/codemods → codemods}/transforms/v0.1.2/__tests__/rename-text-color-active-to-accent.test.mjs +0 -0
  251. /package/{src/codemods → codemods}/transforms/v0.1.2/index.mjs +0 -0
  252. /package/{src/codemods → codemods}/transforms/v0.1.3/__tests__/migrate-layout-components-to-experimental.test.mjs +0 -0
  253. /package/{src/codemods → codemods}/transforms/v0.1.3/index.mjs +0 -0
  254. /package/{src/codemods → codemods}/transforms/v0.1.5/__tests__/rename-switch-label-spacing-default-to-hug.test.mjs +0 -0
  255. /package/{src/codemods → codemods}/transforms/v0.1.5/index.mjs +0 -0
  256. /package/{src/codemods → codemods}/transforms/v0.1.7/__tests__/migrate-table-tableprops-to-direct-props.test.mjs +0 -0
  257. /package/{src/codemods → codemods}/transforms/v0.1.7/__tests__/rename-table-renderprops-styles-to-xstyle.test.mjs +0 -0
  258. /package/{src/codemods → codemods}/transforms/v0.1.7/index.mjs +0 -0
  259. /package/{src/codemods → codemods}/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +0 -0
  260. /package/{src/codemods → codemods}/transforms/v0.1.8/index.mjs +0 -0
  261. /package/{src/commands → lib/agent-docs}/agent-docs.test.mjs +0 -0
  262. /package/{src/lib → lib}/cli-error.mjs +0 -0
  263. /package/{src/lib → lib}/cli-error.test.mjs +0 -0
  264. /package/{src/lib → lib}/component-discovery.importpath.test.mjs +0 -0
  265. /package/{src/lib → lib}/component-format.test.mjs +0 -0
  266. /package/{src/lib → lib}/component-loader.test.mjs +0 -0
  267. /package/{src/lib → lib}/config-cache.mjs +0 -0
  268. /package/{src/lib → lib}/config-cache.test.mjs +0 -0
  269. /package/{src/lib → lib}/config-schema.mjs +0 -0
  270. /package/{src/lib → lib}/error-codes.mjs +0 -0
  271. /package/{src/lib → lib}/integration-warnings.test.mjs +0 -0
  272. /package/{src/lib → lib}/json.mjs +0 -0
  273. /package/{src/lib → lib}/module-loader.test.mjs +0 -0
  274. /package/{src/lib → lib}/node-version.mjs +0 -0
  275. /package/{src/lib → lib}/node-version.test.mjs +0 -0
  276. /package/{src/lib → lib}/parse.mjs +0 -0
  277. /package/{src/lib → lib}/site.mjs +0 -0
  278. /package/{src/lib → lib}/xle/browser.d.ts +0 -0
  279. /package/{src/lib → lib}/xle/xle.test.mjs +0 -0
  280. /package/{src/schemas → schemas}/doc-schema.mjs +0 -0
  281. /package/{src/schemas → schemas}/template-schema.mjs +0 -0
  282. /package/{src/types → types}/config.d.ts +0 -0
  283. /package/{src/types → types}/doc.d.ts +0 -0
  284. /package/{src/types → types}/doctor.d.ts +0 -0
  285. /package/{src/types → types}/error-codes.d.ts +0 -0
  286. /package/{src/types → types}/index.d.ts +0 -0
  287. /package/{src/types → types}/integration.d.ts +0 -0
  288. /package/{src/types → types}/manifest.d.ts +0 -0
  289. /package/{src/types → types}/search.d.ts +0 -0
  290. /package/{src/types → types}/swizzle.d.ts +0 -0
  291. /package/{src/types → types}/template-api.d.ts +0 -0
  292. /package/{src/types → types}/template.d.ts +0 -0
  293. /package/{src/types → types}/validate-integration.d.ts +0 -0
  294. /package/{src/utils → utils}/github.mjs +0 -0
  295. /package/{src/utils → utils}/package-manager.mjs +0 -0
  296. /package/{src/utils → utils}/package-manager.test.mjs +0 -0
  297. /package/{src/utils → utils}/path-safety.mjs +0 -0
  298. /package/{src/utils → utils}/path-safety.test.mjs +0 -0
  299. /package/{src/utils → utils}/paths.test.mjs +0 -0
  300. /package/{src/utils → utils}/semver.mjs +0 -0
  301. /package/{src/utils → utils}/semver.test.mjs +0 -0
  302. /package/{src/utils → utils}/update-check.mjs +0 -0
  303. /package/{src/utils → utils}/update-check.test.mjs +0 -0
@@ -1,46 +1,26 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  /**
4
- * @file build command — the page-building assistant.
4
+ * @file build command — thin wrapper around api/build.
5
5
  *
6
- * Two modes:
7
- * astryx build → the PLAYBOOK: how to build a page with Astryx
8
- * astryx build "<what>" → a COMPOSITION KIT for what you're building:
9
- * the closest page template (scaffold or layout
10
- * reference), the blocks that cover parts, and
11
- * the components to fill gaps, plus a one-line
12
- * "Compose:" suggestion.
6
+ * astryx build → the PLAYBOOK (how to build a page)
7
+ * astryx build "<what>" → a COMPOSITION KIT (closest page template,
8
+ * blocks, components) with a recommended START.
13
9
  *
14
- * `build` is the opinionated "assemble a page" verb. For a neutral lookup across
15
- * the whole CLI, use `astryx search <query>` instead.
10
+ * All grouping/scoring lives in api/build; this file only parses flags and
11
+ * renders. Command strings are prefixed for the caller's package manager here
12
+ * (never in the API payload) via formatCliCommand/getCliInvocation.
16
13
  */
17
14
 
18
- import {getCliInvocation, formatCliCommand} from '../utils/package-manager.mjs';
19
- import {jsonOut, humanLog} from '../lib/json.mjs';
20
- import {cliError} from '../lib/cli-error.mjs';
21
- import {search as searchApi} from '../api/search.mjs';
22
-
23
- /** A page scoring at/above this is confident enough to call a direct match. */
24
- const PAGE_DIRECT = 95;
25
- /** Below this a page is too weak to even offer as a layout reference. */
26
- const PAGE_FLOOR = 50;
27
- /** Below this a block/domain-component match is incidental noise, not surfaced. */
28
- const DOMAIN_FLOOR = 55;
15
+ import {getCliInvocation, formatCliCommand} from '../../utils/package-manager.mjs';
16
+ import {jsonOut, humanLog} from '../../lib/json.mjs';
17
+ import {cliError} from '../../lib/cli-error.mjs';
18
+ import {build as buildApi} from '../../api/build/build.mjs';
29
19
 
30
20
  /**
31
- * Always-surfaced primitives. Every page needs a shell + layout/typography/
32
- * action atoms, but these never keyword-match an idea ("dashboard" != "Stack"),
33
- * so search alone never returns them. We list them unconditionally so an agent
34
- * composing from scratch has the whole kit (esp. off-template).
21
+ * Print the build playbook (shown when `build` is run with no query).
22
+ * @param {string} run - The CLI invocation prefix (e.g. `npx astryx`).
35
23
  */
36
- const FRAME = ['AppShell', 'TopNav', 'SideNav', 'Layout'];
37
- const FOUNDATION = [
38
- 'VStack', 'HStack', 'Grid', 'StackItem', 'Card', 'Section',
39
- 'Text', 'Heading', 'Button', 'Icon', 'Badge', 'Divider',
40
- ];
41
- const ALWAYS = new Set([...FRAME, ...FOUNDATION]);
42
-
43
- /** Print the build playbook (shown when `build` is run with no query). */
44
24
  function printPlaybook(run) {
45
25
  const lines = [
46
26
  '',
@@ -71,6 +51,9 @@ function printPlaybook(run) {
71
51
  for (const l of lines) humanLog(l);
72
52
  }
73
53
 
54
+ /**
55
+ * @param {import('commander').Command} program
56
+ */
74
57
  export function registerBuild(program) {
75
58
  program
76
59
  .command('build [query]')
@@ -78,18 +61,19 @@ export function registerBuild(program) {
78
61
  .option('--type <domain>', 'Filter the kit to one domain (component|hook|template)')
79
62
  .option('--limit <n>', 'Max candidates to draw from (default 60)')
80
63
  .option('--detail', 'Verbose output (include import paths and match reason)')
81
- .action(async (query, options) => {
64
+ .action(async (/** @type {string | undefined} */ query, /** @type {{type?: import('../../types/search').SearchDomain, limit?: string, detail?: boolean}} */ options) => {
82
65
  const run = getCliInvocation();
83
66
  const json = program.opts().json || false;
84
67
 
85
- // No query → print the playbook (the "how to build" skill).
68
+ // No query → the playbook. Still routed through the API for the envelope.
86
69
  if (!query || !String(query).trim()) {
87
- if (json) return jsonOut('build.help', {playbook: true});
70
+ const result = await buildApi(undefined, {cwd: process.cwd()});
71
+ if (json) return jsonOut(result.type, result.data);
88
72
  printPlaybook(run);
89
73
  return;
90
74
  }
91
75
 
92
- // Default to a deep pool so each role section has candidates after grouping.
76
+ // Arg validation stays in the CLI.
93
77
  let limit = 60;
94
78
  if (options.limit != null) {
95
79
  const parsed = Number.parseInt(options.limit, 10);
@@ -100,19 +84,24 @@ export function registerBuild(program) {
100
84
  limit = parsed;
101
85
  }
102
86
 
87
+ /** @type {import('../../types/build').BuildKitResponse} */
103
88
  let result;
104
89
  try {
105
- result = await searchApi(query, {cwd: process.cwd(), type: options.type, limit});
90
+ result = /** @type {import('../../types/build').BuildKitResponse} */ (
91
+ await buildApi(query, {cwd: process.cwd(), type: options.type, limit})
92
+ );
106
93
  } catch (e) {
107
- cliError(e.message, {suggestions: e.suggestions});
94
+ const err = /** @type {import('../../api/error.mjs').AstryxError} */ (e);
95
+ cliError(err.message, {suggestions: err.suggestions});
108
96
  return;
109
97
  }
110
98
 
111
99
  if (json) return jsonOut(result.type, result.data);
112
100
 
113
- const {query: q, results} = result.data;
101
+ const {query: q, hasResults, directMatch, pages, blocks, domain, frame, foundation} =
102
+ result.data;
114
103
 
115
- if (results.length === 0) {
104
+ if (!hasResults) {
116
105
  humanLog('');
117
106
  humanLog(`No matches for "${q}".`);
118
107
  humanLog(`Try a broader term, or browse: ${run} component --list`);
@@ -120,20 +109,7 @@ export function registerBuild(program) {
120
109
  return;
121
110
  }
122
111
 
123
- // ── Group results by role (the build kit) ──────────────────────
124
- const pages = results
125
- .filter(r => r.domain === 'template' && r.kind !== 'block' && r.score >= PAGE_FLOOR)
126
- .slice(0, 3);
127
- const blocks = results
128
- .filter(r => r.domain === 'template' && r.kind === 'block' && r.score >= DOMAIN_FLOOR)
129
- .slice(0, 5);
130
- // Idea-specific atoms = matched components/hooks MINUS the always-on kit.
131
- const domain = results
132
- .filter(r => (r.domain === 'component' || r.domain === 'hook') && r.score >= DOMAIN_FLOOR && !ALWAYS.has(r.name))
133
- .slice(0, 6);
134
- const directMatch = pages.length > 0 && pages[0].score >= PAGE_DIRECT;
135
-
136
- const printItem = (r, label) => {
112
+ const printItem = (/** @type {import('../../types/search').SearchResultEntry} */ r, /** @type {string} */ label) => {
137
113
  const display = r.domain === 'template' && r.displayName ? r.displayName : r.name;
138
114
  humanLog('');
139
115
  humanLog(` [${label}] ${display}`);
@@ -167,7 +143,7 @@ export function registerBuild(program) {
167
143
 
168
144
  // FRAME — always (the page shell).
169
145
  humanLog('');
170
- humanLog(`FRAME — page shell (always): ${FRAME.join(', ')}`);
146
+ humanLog(`FRAME — page shell (always): ${frame.join(', ')}`);
171
147
  humanLog(` full-page → AppShell; or Layout + SideNav/TopNav. ${run} component AppShell`);
172
148
 
173
149
  // BLOCKS — idea-specific composed patterns.
@@ -186,7 +162,7 @@ export function registerBuild(program) {
186
162
 
187
163
  // FOUNDATION — always (layout/typography/actions).
188
164
  humanLog('');
189
- humanLog(`FOUNDATION — always available (layout/text/actions): ${FOUNDATION.join(' ')}`);
165
+ humanLog(`FOUNDATION — always available (layout/text/actions): ${foundation.join(' ')}`);
190
166
 
191
167
  // SETUP — so it renders / stays on-system.
192
168
  humanLog('');
@@ -6,27 +6,47 @@
6
6
  * Global options: --detail full|compact|brief, --lang en|zh|dense
7
7
  */
8
8
 
9
- import {findCoreDir} from '../../utils/paths.mjs';
9
+ import {findCoreDir} from '../../../utils/paths.mjs';
10
10
  import {
11
11
  resolveImportPath,
12
- } from '../../lib/component-discovery.mjs';
12
+ } from '../../../lib/component-discovery.mjs';
13
13
  import {
14
14
  formatFull,
15
15
  formatCompact,
16
16
  formatBrief,
17
17
  formatProps,
18
18
  formatBriefAll,
19
- } from '../../lib/component-format.mjs';
20
- import {resolveTheme} from '../../lib/resolve-theme.mjs';
21
- import {getCliInvocation} from '../../utils/package-manager.mjs';
22
- import {jsonOut, humanLog} from '../../lib/json.mjs';
23
- import {cliError} from '../../lib/cli-error.mjs';
24
- import {ERROR_CODES} from '../../lib/error-codes.mjs';
25
- import {component as componentApi} from '../../api/component.mjs';
26
- import {findRelatedBlocks} from '../../api/template.mjs';
27
- import {Project} from '../../lib/project.mjs';
28
- import {warnOnIntegrationIssues} from '../../lib/integration-warnings.mjs';
19
+ } from '../../../lib/component-format.mjs';
20
+ import {resolveTheme} from '../../../lib/resolve-theme.mjs';
21
+ import {getCliInvocation} from '../../../utils/package-manager.mjs';
22
+ import {jsonOut, humanLog} from '../../../lib/json.mjs';
23
+ import {cliError} from '../../../lib/cli-error.mjs';
24
+ import {ERROR_CODES} from '../../../lib/error-codes.mjs';
25
+ import {component as componentApi} from '../../../api/component/component.mjs';
26
+ import {findRelatedBlocks} from '../../../api/template/template.mjs';
27
+ import {Project} from '../../../lib/project.mjs';
28
+ import {warnOnIntegrationIssues} from '../../../lib/integration-warnings.mjs';
29
29
 
30
+ /**
31
+ * The api layer's component() widens its return to `{type: string, data: unknown}`,
32
+ * so annotate the command-local result with the precise discriminated union from
33
+ * src/types/component to get narrowing + typed data.
34
+ *
35
+ * @typedef {(
36
+ * | import('../../../types/component').ComponentListResponse
37
+ * | import('../../../types/component').ComponentBriefResponse
38
+ * | import('../../../types/component').ComponentFullResponse
39
+ * | import('../../../types/component').ComponentDetailResponse
40
+ * | import('../../../types/component').ComponentDetailPropsResponse
41
+ * | import('../../../types/component').ComponentDetailSourceResponse
42
+ * | import('../../../types/component').ComponentDetailShowcaseResponse
43
+ * | import('../../../types/component').ComponentDetailBlocksResponse
44
+ * )} ComponentResult
45
+ */
46
+
47
+ /**
48
+ * @param {import('commander').Command} program
49
+ */
30
50
  export function registerComponent(program) {
31
51
  program
32
52
  .command('component [name]')
@@ -38,7 +58,7 @@ export function registerComponent(program) {
38
58
  .option('--showcase', 'Print showcase source code')
39
59
  .option('--blocks', 'List example blocks: showcase, examples, and related')
40
60
  .option('--package <name>', 'Scope lookup to an external package (e.g. @acme/xds-widgets)')
41
- .action(async (name, options) => {
61
+ .action(async (/** @type {string | undefined} */ name, /** @type {{list?: boolean, category?: string, props?: boolean, source?: boolean, showcase?: boolean, blocks?: boolean, package?: string}} */ options) => {
42
62
  const run = getCliInvocation();
43
63
  const zh = program.opts().zh || false;
44
64
  const dense = program.opts().dense || false;
@@ -67,9 +87,10 @@ export function registerComponent(program) {
67
87
  // Never let the nudge break the command.
68
88
  }
69
89
 
90
+ /** @type {ComponentResult} */
70
91
  let result;
71
92
  try {
72
- result = await componentApi(name, {
93
+ result = /** @type {ComponentResult} */ (await componentApi(name, {
73
94
  cwd: process.cwd(),
74
95
  list: options.list,
75
96
  category: options.category,
@@ -80,16 +101,19 @@ export function registerComponent(program) {
80
101
  blocks: options.blocks,
81
102
  detail,
82
103
  lang, zh, dense,
83
- });
104
+ }));
84
105
  } catch (e) {
85
- cliError(e.message, {suggestions: e.suggestions, code: e.code});
106
+ const err = /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
107
+ cliError(err.message, {suggestions: err.suggestions, code: err.code});
86
108
  return;
87
109
  }
88
110
 
89
111
  if (json) return jsonOut(result.type, result.data);
90
112
 
91
113
  // ── Text output ────────────────────────────────────────────
92
- const coreDir = findCoreDir(process.cwd());
114
+ // The api layer already resolved against core (result exists), so core is
115
+ // present on this path; narrow away the null branch findCoreDir allows.
116
+ const coreDir = /** @type {string} */ (findCoreDir(process.cwd()));
93
117
  const themeData = resolveTheme(process.cwd());
94
118
 
95
119
  switch (result.type) {
@@ -101,6 +125,7 @@ export function registerComponent(program) {
101
125
  const CORE_PKG = '@astryxdesign/core';
102
126
  // Names that appear under more than one package across the whole
103
127
  // listing — these must always be package-qualified to disambiguate.
128
+ /** @type {Map<string, Set<string>>} */
104
129
  const nameCounts = new Map();
105
130
  for (const items of Object.values(result.data)) {
106
131
  for (const item of items) {
@@ -109,7 +134,9 @@ export function registerComponent(program) {
109
134
  nameCounts.set(item.name, set);
110
135
  }
111
136
  }
137
+ /** @param {string} n */
112
138
  const isCollision = n => (nameCounts.get(n)?.size ?? 0) > 1;
139
+ /** @param {import('../../../types/component').ComponentListEntry} item */
113
140
  const pkgSuffix = item => {
114
141
  if (item.package !== CORE_PKG) return ` [${item.package}]`;
115
142
  if (isCollision(item.name)) return ` [${item.package}]`;
@@ -251,8 +278,8 @@ export function registerComponent(program) {
251
278
 
252
279
  // Re-export lib functions for backward compatibility
253
280
  // (agent-docs.mjs, tests, and generate-skill-doc.sh import from here)
254
- export {discoverComponents, discoverExternalComponents, discoverExternalComponentsGrouped, findComponentReadme, findComponentSource, findExternalComponentDoc, resolveImportPath} from '../../lib/component-discovery.mjs';
255
- export {discoverExternalPackages} from '../../utils/paths.mjs';
256
- export {loadDocs} from '../../lib/component-loader.mjs';
257
- export {formatFull, formatCompact, formatBrief, formatProps, formatBriefAll} from '../../lib/component-format.mjs';
258
- export {levenshteinDistance, findClosestComponents, searchComponents} from '../../lib/string-utils.mjs';
281
+ export {discoverComponents, discoverExternalComponents, discoverExternalComponentsGrouped, findComponentReadme, findComponentSource, findExternalComponentDoc, resolveImportPath} from '../../../lib/component-discovery.mjs';
282
+ export {discoverExternalPackages} from '../../../utils/paths.mjs';
283
+ export {loadDocs} from '../../../lib/component-loader.mjs';
284
+ export {formatFull, formatCompact, formatBrief, formatProps, formatBriefAll} from '../../../lib/component-format.mjs';
285
+ export {levenshteinDistance, findClosestComponents, searchComponents} from '../../../lib/string-utils.mjs';
@@ -10,7 +10,7 @@ import {
10
10
  findIntegrationComponentDoc,
11
11
  findIntegrationComponentSource,
12
12
  CORE_PACKAGE,
13
- } from '../lib/component-discovery.mjs';
13
+ } from '../../lib/component-discovery.mjs';
14
14
 
15
15
  // The api `component()` reads integrations via Project.load(). In the vitest
16
16
  // environment, Vite's `server.fs.allow` only permits loading modules from
@@ -20,12 +20,12 @@ import {
20
20
  // produces) while keeping the integration's `components` dir on disk under
21
21
  // node_modules so its `.doc.mjs` files load normally.
22
22
  const projectLoadMock = vi.fn();
23
- vi.mock('../lib/project.mjs', () => ({
23
+ vi.mock('../../lib/project.mjs', () => ({
24
24
  Project: {load: (...args) => projectLoadMock(...args)},
25
25
  }));
26
26
 
27
27
  // Import the api AFTER the mock is registered.
28
- const {component} = await import('../api/component.mjs');
28
+ const {component} = await import('../../api/component/component.mjs');
29
29
 
30
30
  let tmpDir;
31
31
 
@@ -4,7 +4,7 @@ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
4
4
  import * as fs from 'node:fs';
5
5
  import * as path from 'node:path';
6
6
  import * as os from 'node:os';
7
- import {component} from '../api/component.mjs';
7
+ import {component} from '../../api/component/component.mjs';
8
8
 
9
9
  // These tests create a minimal monorepo fixture with:
10
10
  // - packages/core (symlinked to real @astryxdesign/core for loadDocs compatibility)
@@ -1,8 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  import {describe, it, expect} from 'vitest';
4
- import {component} from '../api/component.mjs';
5
- import {findShowcase, findRelatedBlocks} from '../api/template.mjs';
4
+ import {component} from '../../api/component/component.mjs';
5
+ import {findShowcase, findRelatedBlocks} from '../../api/template/template.mjs';
6
6
 
7
7
  const CWD = {cwd: '.'};
8
8
 
@@ -10,18 +10,26 @@
10
10
  * astryx discover searchterm Search across all packages
11
11
  */
12
12
 
13
- import {formatFull, formatBrief, formatCompact} from '../lib/component-format.mjs';
14
- import {jsonOut, humanLog} from '../lib/json.mjs';
15
- import {cliError} from '../lib/cli-error.mjs';
16
- import {discover as discoverApi} from '../api/discover.mjs';
17
- import {getCliInvocation} from '../utils/package-manager.mjs';
13
+ import {formatFull, formatBrief, formatCompact} from '../../lib/component-format.mjs';
14
+ import {jsonOut, humanLog} from '../../lib/json.mjs';
15
+ import {cliError} from '../../lib/cli-error.mjs';
16
+ import {discover as discoverApi} from '../../api/discover/discover.mjs';
17
+ import {getCliInvocation} from '../../utils/package-manager.mjs';
18
18
 
19
+ /**
20
+ * @param {import('commander').Command} program
21
+ */
19
22
  export function registerDiscover(program) {
20
23
  program
21
24
  .command('discover [query]')
22
25
  .description('Discover external packages and components')
23
26
  .option('--components', 'List components only')
24
- .action(async (query, options) => {
27
+ .action(
28
+ /**
29
+ * @param {string | undefined} query
30
+ * @param {{components?: boolean}} options
31
+ */
32
+ async (query, options) => {
25
33
  const detail = program.opts().detail || 'full';
26
34
  const json = program.opts().json || false;
27
35
  const lang = program.opts().lang || null;
@@ -32,7 +40,8 @@ export function registerDiscover(program) {
32
40
  try {
33
41
  result = await discoverApi(query, {components: options.components, lang, zh});
34
42
  } catch (e) {
35
- cliError(e.message, {suggestions: e.suggestions, code: e.code});
43
+ const err = /** @type {import('../../api/error.mjs').AstryxError} */ (e);
44
+ cliError(err.message, {suggestions: err.suggestions, code: err.code});
36
45
  return;
37
46
  }
38
47
 
@@ -40,7 +49,7 @@ export function registerDiscover(program) {
40
49
  // Forward optional meta (e.g. configured flag for discover.list) as a
41
50
  // sibling of data via jsonOut, so the envelope still carries
42
51
  // apiVersion and goes through the single sanctioned emit path.
43
- return jsonOut(result.type, result.data, result.meta);
52
+ return jsonOut(result.type, result.data, 'meta' in result ? result.meta : undefined);
44
53
  }
45
54
 
46
55
  switch (result.type) {
@@ -12,13 +12,18 @@
12
12
  * astryx docs <topic> <section> Print one section
13
13
  */
14
14
 
15
- import {getCliInvocation} from '../utils/package-manager.mjs';
16
- import {jsonOut, humanLog} from '../lib/json.mjs';
17
- import {cliError} from '../lib/cli-error.mjs';
18
- import {docs as docsApi} from '../api/docs.mjs';
15
+ import {getCliInvocation} from '../../utils/package-manager.mjs';
16
+ import {jsonOut, humanLog} from '../../lib/json.mjs';
17
+ import {cliError} from '../../lib/cli-error.mjs';
18
+ import {docs as docsApi} from '../../api/docs/docs.mjs';
19
19
 
20
20
  // ─── Formatting ──────────────────────────────────────────────────────────────
21
21
 
22
+ /**
23
+ * @param {string[]} headers
24
+ * @param {string[][]} rows
25
+ * @returns {string}
26
+ */
22
27
  function formatTable(headers, rows) {
23
28
  const widths = headers.map((h, i) =>
24
29
  Math.max(h.length, ...rows.map(r => (r[i] || '').length)),
@@ -31,15 +36,28 @@ function formatTable(headers, rows) {
31
36
  return `${head}\n${sep}\n${body}`;
32
37
  }
33
38
 
39
+ /**
40
+ * @param {string[]} headers
41
+ * @param {string[][]} rows
42
+ * @returns {string}
43
+ */
34
44
  function formatTableCompact(headers, rows) {
35
45
  return rows.map(r => r.join(' = ')).join('\n');
36
46
  }
37
47
 
48
+ /**
49
+ * @param {import('../../../core/src/docs-types').ContentBlock} block
50
+ * @param {'full' | 'compact' | 'brief'} detail
51
+ * @returns {string | null}
52
+ */
38
53
  function formatBlock(block, detail) {
39
54
  switch (block.type) {
40
55
  case 'prose':
41
56
  return block.text;
42
57
 
58
+ case 'heading':
59
+ return `${'#'.repeat(block.level || 3)} ${block.text}`;
60
+
43
61
  case 'code':
44
62
  if (detail === 'compact' || detail === 'brief') return null;
45
63
  {
@@ -57,7 +75,7 @@ function formatBlock(block, detail) {
57
75
  return formatTable(block.headers, block.rows);
58
76
 
59
77
  case 'list': {
60
- const prefix = block.style === 'ordered' ? (i) => `${i + 1}. `
78
+ const prefix = block.style === 'ordered' ? (/** @type {number} */ i) => `${i + 1}. `
61
79
  : block.style === 'dont' ? () => '❌ '
62
80
  : block.style === 'do' ? () => '✓ '
63
81
  : () => '- ';
@@ -69,6 +87,11 @@ function formatBlock(block, detail) {
69
87
  }
70
88
  }
71
89
 
90
+ /**
91
+ * @param {import('../../../core/src/docs-types').ReferenceSection} section
92
+ * @param {'full' | 'compact' | 'brief'} detail
93
+ * @returns {string}
94
+ */
72
95
  function formatSection(section, detail) {
73
96
  const blocks = section.content
74
97
  .map(b => formatBlock(b, detail))
@@ -83,6 +106,11 @@ function formatSection(section, detail) {
83
106
  return `${heading}\n\n${blocks.join('\n\n')}`;
84
107
  }
85
108
 
109
+ /**
110
+ * @param {import('../../../core/src/docs-types').ReferenceDoc} docs
111
+ * @param {'full' | 'compact' | 'brief'} detail
112
+ * @returns {string}
113
+ */
86
114
  function formatReferenceFull(docs, detail) {
87
115
  if (detail === 'brief') {
88
116
  const header = `${docs.title}: ${docs.description}`;
@@ -100,11 +128,14 @@ function formatReferenceFull(docs, detail) {
100
128
 
101
129
  // ─── Command ─────────────────────────────────────────────────────────────────
102
130
 
131
+ /**
132
+ * @param {import('commander').Command} program
133
+ */
103
134
  export function registerDocs(program) {
104
135
  program
105
136
  .command('docs [topic] [section]')
106
137
  .description('Print reference docs')
107
- .action(async (topic, section) => {
138
+ .action(async (/** @type {string | undefined} */ topic, /** @type {string | undefined} */ section) => {
108
139
  const run = getCliInvocation();
109
140
  const lang = program.opts().lang || null;
110
141
  const zh = program.opts().zh || false;
@@ -118,7 +149,8 @@ export function registerDocs(program) {
118
149
  } catch (e) {
119
150
  // docs API throws structured errors with {name, reason} suggestions —
120
151
  // pass them through untouched so the CLI envelope matches the API.
121
- cliError(e.message, {suggestions: e.suggestions || [], code: e.code});
152
+ const err = /** @type {import('../../api/error.mjs').AstryxError} */ (e);
153
+ cliError(err.message, {suggestions: err.suggestions || [], code: err.code});
122
154
  return;
123
155
  }
124
156
 
@@ -71,7 +71,7 @@ describe('hyphenated doc filenames', () => {
71
71
  });
72
72
 
73
73
  it('returns docs.detail via API for hyphenated topic', async () => {
74
- const {docs: docsApi} = await import('../api/docs.mjs');
74
+ const {docs: docsApi} = await import('../../api/docs/docs.mjs');
75
75
  const result = await docsApi('getting-started');
76
76
  expect(result.type).toBe('docs.detail');
77
77
  expect(result.data).toBeDefined();
@@ -10,8 +10,8 @@
10
10
  * as a CI gate.
11
11
  */
12
12
 
13
- import {runChecks} from '../api/doctor.mjs';
14
- import {jsonOut, humanLog} from '../lib/json.mjs';
13
+ import {runChecks} from '../../api/doctor/doctor.mjs';
14
+ import {jsonOut, humanLog} from '../../lib/json.mjs';
15
15
 
16
16
  /** Status → human glyph (monochrome, matching the rest of the CLI). */
17
17
  const GLYPH = {
@@ -23,7 +23,7 @@ const GLYPH = {
23
23
 
24
24
  /**
25
25
  * Render the report as a human-readable checklist.
26
- * @param {import('../api/doctor.mjs').DoctorReport} report
26
+ * @param {import('../../api/doctor/doctor.mjs').DoctorReport} report
27
27
  */
28
28
  function printHuman(report) {
29
29
  humanLog('astryx doctor — diagnosing your setup\n');
@@ -19,8 +19,8 @@ import {
19
19
  checkAgentDocs,
20
20
  checkPeerDeps,
21
21
  checkPackageManager,
22
- } from '../api/doctor.mjs';
23
- import {MIN_NODE_VERSION} from '../lib/node-version.mjs';
22
+ } from '../../api/doctor/doctor.mjs';
23
+ import {MIN_NODE_VERSION} from '../../lib/node-version.mjs';
24
24
 
25
25
  let tmpDir;
26
26
  let logCalls;
@@ -40,6 +40,7 @@ const BUILD_TIMEOUT_MS = 180_000;
40
40
  const STALE_LOCK_MS = BUILD_TIMEOUT_MS + 20_000;
41
41
  const POLL_MS = 250;
42
42
 
43
+ /** @param {number} ms */
43
44
  function sleepSync(ms) {
44
45
  Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
45
46
  }
@@ -67,7 +68,7 @@ function tryAcquire() {
67
68
  fs.mkdirSync(LOCK_DIR);
68
69
  return true;
69
70
  } catch (err) {
70
- if (err.code !== 'EEXIST') {
71
+ if (/** @type {NodeJS.ErrnoException} */ (err).code !== 'EEXIST') {
71
72
  throw err;
72
73
  }
73
74
  if (lockIsStale()) {
@@ -76,7 +77,7 @@ function tryAcquire() {
76
77
  fs.mkdirSync(LOCK_DIR);
77
78
  return true;
78
79
  } catch (retryErr) {
79
- if (retryErr.code !== 'EEXIST') {
80
+ if (/** @type {NodeJS.ErrnoException} */ (retryErr).code !== 'EEXIST') {
80
81
  throw retryErr;
81
82
  }
82
83
  }
@@ -4,7 +4,7 @@ import {describe, it, expect, beforeEach, afterEach} from 'vitest';
4
4
  import * as fs from 'node:fs';
5
5
  import * as path from 'node:path';
6
6
  import * as os from 'node:os';
7
- import {findShowcase, findRelatedBlocks} from '../api/template.mjs';
7
+ import {findShowcase, findRelatedBlocks} from '../../api/template/template.mjs';
8
8
 
9
9
  // These tests verify that findShowcase and findRelatedBlocks can discover
10
10
  // blocks from external packages that declare xds.blocks in package.json.