@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.
- package/{src/api → api/blog}/blog.mjs +42 -6
- package/{src/api → api/blog}/blog.test.mjs +2 -2
- package/api/build/build.mjs +92 -0
- package/api/build/build.test.mjs +92 -0
- package/{src/api → api/component}/component.mjs +49 -26
- package/{src/api → api/discover}/discover.mjs +55 -18
- package/{src/api → api/docs}/docs.mjs +47 -21
- package/{src/api → api/doctor}/doctor.mjs +11 -8
- package/{src/api → api/hook}/hook.mjs +11 -11
- package/{src/api → api}/index.mjs +16 -9
- package/{src/api → api/integration}/validate-integration.mjs +48 -15
- package/{src/api → api/integration}/validate-integration.test.mjs +1 -1
- package/{src/api → api/layout}/layout.mjs +66 -17
- package/{src/api → api/layout}/layout.test.mjs +1 -1
- package/{src/api → api/search}/search.mjs +71 -12
- package/api/swizzle/swizzle.mjs +283 -0
- package/{src/commands → api/swizzle}/swizzle.test.mjs +26 -1
- package/{src/api → api/template}/template-integration.test.mjs +2 -2
- package/{src/api → api/template}/template-suffix.test.mjs +3 -3
- package/{src/api → api/template}/template.mjs +96 -19
- package/{src/api → api/theme}/theme-add.mjs +35 -7
- package/{src → authoring}/codemod.mjs +6 -6
- package/{src → authoring}/config.test.mjs +1 -1
- package/{src → authoring}/doc.mjs +1 -1
- package/{src → authoring}/doc.test.mjs +1 -1
- package/{src → authoring}/template.mjs +1 -1
- package/bin/astryx.mjs +12 -10
- package/{src → cli}/commands/blog.mjs +48 -7
- package/{src → cli}/commands/build-theme.mjs +125 -46
- package/{src → cli}/commands/build.mjs +33 -57
- package/{src → cli}/commands/component/index.mjs +49 -22
- package/{src → cli}/commands/component-ownership.test.mjs +3 -3
- package/{src → cli}/commands/component-package.test.mjs +1 -1
- package/{src → cli}/commands/component-resolution.test.mjs +2 -2
- package/{src → cli}/commands/discover.mjs +17 -8
- package/{src → cli}/commands/docs.mjs +39 -7
- package/{src → cli}/commands/docs.test.mjs +1 -1
- package/{src → cli}/commands/doctor.mjs +3 -3
- package/{src → cli}/commands/doctor.test.mjs +2 -2
- package/{src → cli}/commands/ensure-core-built.mjs +3 -2
- package/{src → cli}/commands/external-showcase.test.mjs +1 -1
- package/{src → cli}/commands/hook/index.mjs +37 -14
- package/{src → cli}/commands/import-hint-correctness.test.mjs +1 -1
- package/{src → cli}/commands/init.mjs +20 -9
- package/{src → cli}/commands/layout.mjs +58 -18
- package/{src → cli}/commands/search.mjs +19 -12
- package/{src → cli}/commands/search.test.mjs +1 -1
- package/{src → cli}/commands/setup-nudge.test.mjs +1 -1
- package/cli/commands/swizzle.mjs +103 -0
- package/{src → cli}/commands/template.mjs +73 -22
- package/{src → cli}/commands/template.path-safety.test.mjs +2 -2
- package/{src → cli}/commands/upgrade.integration-policy.test.mjs +1 -1
- package/{src → cli}/commands/upgrade.mjs +160 -52
- package/{src → cli}/commands/upgrade.test.mjs +1 -1
- package/{src → cli}/commands/validate-integration.mjs +17 -37
- package/{src → cli}/index.mjs +17 -15
- package/{src/codemods → codemods}/ensure-jscodeshift.mjs +1 -1
- package/{src/codemods → codemods}/integration-discovery.mjs +6 -3
- package/{src/codemods → codemods}/integration-discovery.test.mjs +1 -1
- package/{src/codemods → codemods}/integration-runner.mjs +8 -3
- package/{src/codemods → codemods}/registry.mjs +3 -1
- package/{src/codemods → codemods}/run-codemod.mjs +17 -10
- package/{src/codemods → codemods}/runner.mjs +22 -12
- package/{src/codemods → codemods}/transforms/v0.0.10/remove-size-props.mjs +9 -4
- package/{src/codemods → codemods}/transforms/v0.0.12/add-is-icon-only.mjs +27 -22
- package/{src/codemods → codemods}/transforms/v0.0.13/icon-name-deprecations.mjs +12 -5
- package/{src/codemods → codemods}/transforms/v0.0.13/rename-attachments-to-drawer.mjs +15 -8
- package/{src/codemods → codemods}/transforms/v0.0.13/toolbar-density-to-size.mjs +10 -4
- package/{src/codemods → codemods}/transforms/v0.0.14/rename-action-props.mjs +11 -5
- package/{src/codemods → codemods}/transforms/v0.0.14/rename-section-wash-to-muted.mjs +11 -6
- package/{src/codemods → codemods}/transforms/v0.0.14/rename-status-variants.mjs +15 -10
- package/{src/codemods → codemods}/transforms/v0.0.15/migrate-item-children-to-endcontent.mjs +13 -8
- package/{src/codemods → codemods}/transforms/v0.0.15/migrate-selector-children-to-render-option.mjs +18 -13
- package/{src/codemods → codemods}/transforms/v0.0.15/migrate-theme-selectors-to-data-attrs.mjs +8 -4
- package/{src/codemods → codemods}/transforms/v0.0.15/rename-date-picker-to-input.mjs +11 -6
- package/{src/codemods → codemods}/transforms/v0.0.15/rename-imperative-ref-to-handleRef.mjs +6 -1
- package/{src/codemods → codemods}/transforms/v0.0.15/rename-isStreaming-to-isStopShown.mjs +6 -1
- package/{src/codemods → codemods}/transforms/v0.0.15/rename-stack-element-to-as.mjs +8 -3
- package/{src/codemods → codemods}/transforms/v0.0.2/migrate-badge-dot-to-statusdot.mjs +17 -10
- package/{src/codemods → codemods}/transforms/v0.0.2/migrate-gap-to-numeric.mjs +7 -1
- package/{src/codemods → codemods}/transforms/v0.0.2/migrate-isFullBleed-to-padding.mjs +9 -4
- package/{src/codemods → codemods}/transforms/v0.0.2/migrate-useXDSIcon-to-getIcon.mjs +12 -7
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-banner-endButton-to-endContent.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-form-tooltip-startIcon.mjs +8 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-isShown-to-isOpen.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-selector-items-to-options.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-sidenav-header-to-heading.mjs +11 -4
- package/{src/codemods → codemods}/transforms/v0.0.2/rename-topnav-title-to-heading.mjs +10 -4
- package/{src/codemods → codemods}/transforms/v0.0.2/unify-uncontrolled-to-defaultX.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.2/unify-visibility-to-onOpenChange.mjs +10 -5
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-badge-children-to-label.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-collapse-to-collapsible.mjs +9 -3
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-radius-tokens.mjs +11 -5
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-shadow-tokens.mjs +13 -6
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-skeleton-radius.mjs +7 -1
- package/{src/codemods → codemods}/transforms/v0.0.6/migrate-token-names.mjs +11 -5
- package/{src/codemods → codemods}/transforms/v0.0.7/rename-banner-variant-to-container.mjs +8 -3
- package/{src/codemods → codemods}/transforms/v0.0.8/migrate-token-renames.mjs +15 -8
- package/{src/codemods → codemods}/transforms/v0.0.8/rename-endslot-to-endcontent.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.1.0/drop-xds-prefix-imports.mjs +19 -14
- package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-css-surfaces.mjs +21 -17
- package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-declare-module.mjs +7 -2
- package/{src/codemods → codemods}/transforms/v0.1.0/migrate-xds-module-specifiers.mjs +16 -11
- package/{src/codemods → codemods}/transforms/v0.1.2/rename-text-color-active-to-accent.mjs +15 -9
- package/{src/codemods → codemods}/transforms/v0.1.3/migrate-layout-components-to-experimental.mjs +17 -12
- package/{src/codemods → codemods}/transforms/v0.1.5/rename-switch-label-spacing-default-to-hug.mjs +15 -9
- package/{src/codemods → codemods}/transforms/v0.1.7/migrate-table-tableprops-to-direct-props.mjs +17 -10
- package/{src/codemods → codemods}/transforms/v0.1.7/rename-table-renderprops-styles-to-xstyle.mjs +18 -13
- package/{src/codemods → codemods}/transforms/v0.1.8/rename-avatar-size-scale.mjs +15 -10
- package/docs/internationalization.doc.mjs +92 -46
- package/{src/commands → lib/agent-docs}/agent-docs.mjs +30 -11
- package/{src/commands → lib/agent-docs}/agent-docs.path-safety.test.mjs +1 -1
- package/{src/lib → lib}/component-discovery.mjs +44 -2
- package/{src/lib → lib}/component-format.mjs +65 -24
- package/{src/lib → lib}/component-loader.mjs +27 -13
- package/{src/lib → lib}/componentDocOverlay.test.mjs +0 -1
- package/{src/lib → lib}/error-codes.test.mjs +1 -1
- package/{src/lib → lib}/hook-discovery.mjs +14 -1
- package/{src/lib → lib}/hook-format.mjs +29 -5
- package/{src/lib → lib}/integration-warnings.mjs +2 -2
- package/{src/lib → lib}/integrations.mjs +20 -0
- package/{src/lib → lib}/integrations.test.mjs +1 -1
- package/{src/lib → lib}/json-contract.test.mjs +1 -1
- package/{src/lib → lib}/json-shim.mjs +10 -5
- package/{src/lib → lib}/json-shim.test.mjs +1 -1
- package/{src/lib → lib}/levenshtein.mjs +6 -0
- package/{src/lib → lib}/manifest.mjs +7 -5
- package/{src/lib → lib}/manifest.test.mjs +2 -2
- package/{src/lib → lib}/module-loader.mjs +1 -0
- package/{src/lib → lib}/package-scanner.mjs +47 -0
- package/{src/lib → lib}/project.mjs +48 -18
- package/{src/lib → lib}/project.test.mjs +1 -1
- package/{src/lib → lib}/resolve-theme.mjs +5 -0
- package/{src/lib → lib}/string-utils.mjs +15 -0
- package/{src/lib → lib}/term-log.mjs +12 -3
- package/{src/lib → lib}/xle/browser.mjs +18 -8
- package/{src/lib → lib}/xle/expand.mjs +155 -22
- package/{src/lib → lib}/xle/parse.mjs +119 -13
- package/{src/lib → lib}/xle/print.mjs +54 -14
- package/{src/lib → lib}/xle/registry-core.mjs +28 -3
- package/{src/lib → lib}/xle/registry.mjs +9 -4
- package/{src/lib → lib}/xle/splice.mjs +13 -2
- package/{src/lib → lib}/xle/validate.mjs +95 -14
- package/lib/xle/xle-ast.d.ts +214 -0
- package/package.json +33 -26
- package/scripts/postinstall.mjs +4 -4
- package/templates/blocks/components/Avatar/AvatarShowcase.tsx +1 -1
- package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.doc.mjs +19 -0
- package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +46 -0
- package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider02Overrides.doc.mjs +14 -0
- package/templates/blocks/components/InternationalizationProvider/InternationalizationProvider02Overrides.tsx +33 -0
- package/{src/types → types}/api.contract.assert.ts +17 -8
- package/{src/types → types}/api.d.ts +106 -0
- package/{src/types → types}/base.d.ts +17 -2
- package/types/build.d.ts +53 -0
- package/types/codemod.d.ts +166 -0
- package/{src/types → types}/component.d.ts +1 -1
- package/{src/types → types}/discover.d.ts +1 -1
- package/{src/types → types}/docs.d.ts +1 -4
- package/{src/types → types}/hook.d.ts +1 -1
- package/types/jscodeshift.d.ts +19 -0
- package/types/layout.d.ts +74 -0
- package/types/theme.d.ts +53 -0
- package/{src/types → types}/upgrade.d.ts +8 -1
- package/{src/utils → utils}/paths.mjs +4 -1
- package/src/commands/swizzle.mjs +0 -417
- package/src/types/build.d.ts +0 -23
- package/src/types/codemod.d.ts +0 -81
- package/src/types/theme.d.ts +0 -23
- /package/{src/api → api/docs}/docOverlays.test.mjs +0 -0
- /package/{src/api → api}/error.mjs +0 -0
- /package/{src/api → api/integration}/integration-block-exports.test.mjs +0 -0
- /package/{src/api → api/template}/template.test.mjs +0 -0
- /package/{src → authoring}/codemod.test.mjs +0 -0
- /package/{src → authoring}/config.mjs +0 -0
- /package/{src → authoring}/integration.mjs +0 -0
- /package/{src → authoring}/template.test.mjs +0 -0
- /package/{src → cli}/cli-exit-codes.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.color-scheme.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.import-path.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.path-safety.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.prose.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.variants.test.mjs +0 -0
- /package/{src → cli}/commands/build-theme.watch.test.mjs +0 -0
- /package/{src → cli}/commands/cli-postinstall.test.mjs +0 -0
- /package/{src → cli}/commands/component.test.mjs +0 -0
- /package/{src → cli}/commands/detail-levels.test.mjs +0 -0
- /package/{src → cli}/commands/init.next-steps.test.mjs +0 -0
- /package/{src → cli}/commands/interactive-guard.test.mjs +0 -0
- /package/{src → cli}/commands/json-contract.test.mjs +0 -0
- /package/{src → cli}/commands/swizzle.path-safety.test.mjs +0 -0
- /package/{src → cli}/commands/swizzle.routing.test.mjs +0 -0
- /package/{src → cli}/commands/template.test.mjs +0 -0
- /package/{src → cli}/commands/upgrade.config-ordering.test.mjs +0 -0
- /package/{src → cli}/commands/validate-integration.test.mjs +0 -0
- /package/{src → cli}/update-hint-commands.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/registry.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/rename-imperative-ref-to-handleRef.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/rename-isStreaming-to-isStopShown.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/rename-section-wash-to-muted.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/runner.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/toolbar-density-to-size.test.mjs +0 -0
- /package/{src/codemods → codemods}/__tests__/validation.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.10/__tests__/remove-size-props.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.10/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.12/__tests__/add-is-icon-only.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.12/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.13/__tests__/icon-name-deprecations.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.13/__tests__/rename-attachments-to-drawer.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.13/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.14/__tests__/rename-action-props.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.14/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-item-children-to-endcontent.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-selector-children-to-render-option.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/migrate-theme-selectors-to-data-attrs.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/rename-date-picker-to-input.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/__tests__/rename-stack-element-to-as.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.15/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-badge-dot-to-statusdot.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-gap-to-numeric.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-isFullBleed-to-padding.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/migrate-useXDSIcon-to-getIcon.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-banner-endButton-to-endContent.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-form-tooltip-startIcon.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-isShown-to-isOpen.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-selector-items-to-options.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-sidenav-header-to-heading.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/rename-topnav-title-to-heading.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/unify-uncontrolled-to-defaultX.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/__tests__/unify-visibility-to-onOpenChange.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.2/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-collapse-to-collapsible.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-radius-tokens.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-shadow-tokens.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-skeleton-radius.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/__tests__/migrate-token-names.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.6/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.7/__tests__/rename-banner-variant-to-container.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.7/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.8/__tests__/migrate-token-renames.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.8/__tests__/rename-endslot-to-endcontent.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.0.8/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/drop-xds-prefix-imports.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-css-surfaces.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-declare-module.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/migrate-xds-module-specifiers.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/__tests__/v0.1.0-ordering.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.0/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.2/__tests__/rename-text-color-active-to-accent.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.2/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.3/__tests__/migrate-layout-components-to-experimental.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.3/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.5/__tests__/rename-switch-label-spacing-default-to-hug.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.5/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.7/__tests__/migrate-table-tableprops-to-direct-props.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.7/__tests__/rename-table-renderprops-styles-to-xstyle.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.7/index.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +0 -0
- /package/{src/codemods → codemods}/transforms/v0.1.8/index.mjs +0 -0
- /package/{src/commands → lib/agent-docs}/agent-docs.test.mjs +0 -0
- /package/{src/lib → lib}/cli-error.mjs +0 -0
- /package/{src/lib → lib}/cli-error.test.mjs +0 -0
- /package/{src/lib → lib}/component-discovery.importpath.test.mjs +0 -0
- /package/{src/lib → lib}/component-format.test.mjs +0 -0
- /package/{src/lib → lib}/component-loader.test.mjs +0 -0
- /package/{src/lib → lib}/config-cache.mjs +0 -0
- /package/{src/lib → lib}/config-cache.test.mjs +0 -0
- /package/{src/lib → lib}/config-schema.mjs +0 -0
- /package/{src/lib → lib}/error-codes.mjs +0 -0
- /package/{src/lib → lib}/integration-warnings.test.mjs +0 -0
- /package/{src/lib → lib}/json.mjs +0 -0
- /package/{src/lib → lib}/module-loader.test.mjs +0 -0
- /package/{src/lib → lib}/node-version.mjs +0 -0
- /package/{src/lib → lib}/node-version.test.mjs +0 -0
- /package/{src/lib → lib}/parse.mjs +0 -0
- /package/{src/lib → lib}/site.mjs +0 -0
- /package/{src/lib → lib}/xle/browser.d.ts +0 -0
- /package/{src/lib → lib}/xle/xle.test.mjs +0 -0
- /package/{src/schemas → schemas}/doc-schema.mjs +0 -0
- /package/{src/schemas → schemas}/template-schema.mjs +0 -0
- /package/{src/types → types}/config.d.ts +0 -0
- /package/{src/types → types}/doc.d.ts +0 -0
- /package/{src/types → types}/doctor.d.ts +0 -0
- /package/{src/types → types}/error-codes.d.ts +0 -0
- /package/{src/types → types}/index.d.ts +0 -0
- /package/{src/types → types}/integration.d.ts +0 -0
- /package/{src/types → types}/manifest.d.ts +0 -0
- /package/{src/types → types}/search.d.ts +0 -0
- /package/{src/types → types}/swizzle.d.ts +0 -0
- /package/{src/types → types}/template-api.d.ts +0 -0
- /package/{src/types → types}/template.d.ts +0 -0
- /package/{src/types → types}/validate-integration.d.ts +0 -0
- /package/{src/utils → utils}/github.mjs +0 -0
- /package/{src/utils → utils}/package-manager.mjs +0 -0
- /package/{src/utils → utils}/package-manager.test.mjs +0 -0
- /package/{src/utils → utils}/path-safety.mjs +0 -0
- /package/{src/utils → utils}/path-safety.test.mjs +0 -0
- /package/{src/utils → utils}/paths.test.mjs +0 -0
- /package/{src/utils → utils}/semver.mjs +0 -0
- /package/{src/utils → utils}/semver.test.mjs +0 -0
- /package/{src/utils → utils}/update-check.mjs +0 -0
- /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 —
|
|
4
|
+
* @file build command — thin wrapper around api/build.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* astryx build
|
|
8
|
-
*
|
|
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
|
-
*
|
|
15
|
-
*
|
|
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 '
|
|
19
|
-
import {jsonOut, humanLog} from '
|
|
20
|
-
import {cliError} from '
|
|
21
|
-
import {
|
|
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
|
-
*
|
|
32
|
-
*
|
|
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 →
|
|
68
|
+
// No query → the playbook. Still routed through the API for the envelope.
|
|
86
69
|
if (!query || !String(query).trim()) {
|
|
87
|
-
|
|
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
|
-
//
|
|
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 =
|
|
90
|
+
result = /** @type {import('../../types/build').BuildKitResponse} */ (
|
|
91
|
+
await buildApi(query, {cwd: process.cwd(), type: options.type, limit})
|
|
92
|
+
);
|
|
106
93
|
} catch (e) {
|
|
107
|
-
|
|
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,
|
|
101
|
+
const {query: q, hasResults, directMatch, pages, blocks, domain, frame, foundation} =
|
|
102
|
+
result.data;
|
|
114
103
|
|
|
115
|
-
if (
|
|
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
|
-
|
|
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): ${
|
|
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): ${
|
|
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 '
|
|
9
|
+
import {findCoreDir} from '../../../utils/paths.mjs';
|
|
10
10
|
import {
|
|
11
11
|
resolveImportPath,
|
|
12
|
-
} from '
|
|
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 '
|
|
20
|
-
import {resolveTheme} from '
|
|
21
|
-
import {getCliInvocation} from '
|
|
22
|
-
import {jsonOut, humanLog} from '
|
|
23
|
-
import {cliError} from '
|
|
24
|
-
import {ERROR_CODES} from '
|
|
25
|
-
import {component as componentApi} from '
|
|
26
|
-
import {findRelatedBlocks} from '
|
|
27
|
-
import {Project} from '
|
|
28
|
-
import {warnOnIntegrationIssues} from '
|
|
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
|
-
|
|
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
|
-
|
|
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 '
|
|
255
|
-
export {discoverExternalPackages} from '
|
|
256
|
-
export {loadDocs} from '
|
|
257
|
-
export {formatFull, formatCompact, formatBrief, formatProps, formatBriefAll} from '
|
|
258
|
-
export {levenshteinDistance, findClosestComponents, searchComponents} from '
|
|
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 '
|
|
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('
|
|
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('
|
|
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 '
|
|
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 '
|
|
5
|
-
import {findShowcase, findRelatedBlocks} from '
|
|
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 '
|
|
14
|
-
import {jsonOut, humanLog} from '
|
|
15
|
-
import {cliError} from '
|
|
16
|
-
import {discover as discoverApi} from '
|
|
17
|
-
import {getCliInvocation} from '
|
|
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(
|
|
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
|
-
|
|
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 '
|
|
16
|
-
import {jsonOut, humanLog} from '
|
|
17
|
-
import {cliError} from '
|
|
18
|
-
import {docs as docsApi} from '
|
|
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
|
-
|
|
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('
|
|
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 '
|
|
14
|
-
import {jsonOut, humanLog} from '
|
|
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('
|
|
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 '
|
|
23
|
-
import {MIN_NODE_VERSION} from '
|
|
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 '
|
|
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.
|