@astryxdesign/cli 0.6.3-canary.ea2f048 → 0.6.3-canary.f04b501
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/README.md +106 -72
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/build.doc.mjs +4 -3
- package/api/build/build.test.mjs +14 -3
- package/api/build/build.type.d.mts +36 -2
- package/api/build/build.type.mjs +25 -4
- package/api/build/help/help.d.mts +8 -5
- package/api/build/help/help.mjs +56 -6
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +31 -2
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +22 -11
- package/api/component/component.type.mjs +32 -24
- package/api/component/detail/blocks/blocks.d.mts +2 -1
- package/api/component/detail/blocks/blocks.mjs +4 -3
- package/api/component/list/list.d.mts +0 -5
- package/api/component/list/list.mjs +37 -9
- package/api/discover/discover.doc.mjs +2 -1
- package/api/discover/discover.type.d.mts +4 -4
- package/api/discover/discover.type.mjs +10 -10
- package/api/docs/_adapter.d.mts +32 -24
- package/api/docs/_adapter.mjs +81 -87
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +14 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +44 -20
- package/api/docs/detail/section/section.test.mjs +41 -0
- package/api/docs/docs.d.mts +7 -2
- package/api/docs/docs.doc.mjs +28 -10
- package/api/docs/docs.mjs +16 -9
- package/api/docs/docs.test.mjs +6 -0
- package/api/docs/docs.type.d.mts +40 -3
- package/api/docs/docs.type.mjs +36 -8
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +32 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integrationDocs.test.mjs +106 -0
- package/api/docs/list/list.mjs +3 -7
- package/api/doctor/doctor.d.mts +70 -0
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +404 -0
- package/api/doctor/doctor.test.mjs +522 -1
- package/api/gap-report/gap-report.doc.mjs +8 -4
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +1 -0
- package/api/hook/hook.type.d.mts +3 -3
- package/api/hook/hook.type.mjs +11 -11
- package/api/hook/list/list.d.mts +2 -2
- package/api/hook/list/list.mjs +69 -17
- package/api/init/init.doc.mjs +5 -0
- package/api/init/init.test.mjs +41 -1
- package/api/init/remove/remove.mjs +1 -1
- package/api/init/run/run.mjs +20 -10
- package/api/integration/add-contribution.component-names.test.mjs +120 -0
- package/api/integration/add-contribution.mjs +23 -10
- package/api/integration/add-contribution.test.mjs +121 -7
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.test.mjs +8 -4
- package/api/integration/integration-authoring.type.d.mts +1 -1
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +8 -4
- package/api/integration/integrationAddAgentDoc.doc.mjs +1 -0
- package/api/integration/integrationAddCodemod.doc.mjs +1 -0
- package/api/integration/integrationAddComponent.doc.mjs +2 -1
- package/api/integration/integrationAddDoc.doc.mjs +1 -0
- package/api/integration/integrationAddTemplate.doc.mjs +1 -0
- package/api/integration/integrationAddTheme.doc.mjs +6 -5
- package/api/integration/integrationComponentConflicts.doc.mjs +1 -0
- package/api/integration/integrationDocConflicts.doc.mjs +1 -0
- package/api/integration/integrationPackCheck.doc.mjs +1 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +1 -0
- package/api/integration/pack-check.mjs +49 -7
- package/api/integration/pack-check.test.mjs +266 -47
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/validate-integration-fixes.test.mjs +1389 -0
- package/api/integration/validate-integration.mjs +52 -102
- package/api/integration/validate-integration.test.mjs +176 -23
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +2 -1
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/layout/expand/expand.mjs +7 -5
- package/api/layout/expand/expand.path-safety.test.mjs +53 -0
- package/api/layout/grammar/grammar.mjs +2 -1
- package/api/layout/layoutCheck.doc.mjs +1 -0
- package/api/layout/layoutExpand.doc.mjs +2 -1
- package/api/layout/layoutGrammar.doc.mjs +1 -0
- package/api/search/search-return-type.test.mjs +54 -0
- package/api/search/search.d.mts +3 -10
- package/api/search/search.doc.mjs +6 -1
- package/api/search/search.mjs +31 -14
- package/api/search/search.test.mjs +34 -0
- package/api/search/search.type.d.mts +2 -2
- package/api/search/search.type.mjs +1 -1
- package/api/swizzle/copy/copy.mjs +28 -11
- package/api/swizzle/swizzle.doc.mjs +2 -1
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +17 -23
- package/api/template/copy/copy.test.mjs +17 -0
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +3 -1
- package/api/template/template.type.d.mts +6 -6
- package/api/template/template.type.mjs +12 -12
- package/api/theme/_adapter.d.mts +2 -3
- package/api/theme/_adapter.mjs +4 -5
- package/api/theme/add/add.binary.test.mjs +84 -0
- package/api/theme/add/add.mjs +20 -3
- package/api/theme/add/add.staging.test.mjs +66 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.mjs +133 -42
- package/api/theme/build/build.public-component-vars.test.mjs +1 -1
- package/api/theme/build/build.receipt-doc.test.mjs +111 -0
- package/api/theme/build/build.test.mjs +127 -0
- package/api/theme/build/font-warning.mjs +3 -3
- package/api/theme/build/font-warning.test.mjs +5 -2
- package/api/theme/generateTonalPalette.doc.mjs +1 -0
- package/api/theme/integration-themes.test.mjs +39 -28
- package/api/theme/list/list.test.mjs +19 -20
- package/api/theme/listThemes.doc.mjs +6 -5
- package/api/theme/palette/generate/generate.mjs +8 -3
- package/api/theme/palette/generate/generate.test.mjs +96 -0
- package/api/theme/palette/generate/generator.d.mts +10 -13
- package/api/theme/palette/generate/generator.mjs +15 -4
- package/api/theme/palette/generate/generator.test.mjs +10 -0
- package/api/theme/template/template.mjs +11 -2
- package/api/theme/template/template.test.mjs +15 -0
- package/api/theme/theme.type.d.mts +170 -11
- package/api/theme/theme.type.mjs +94 -27
- package/api/theme/themeAdd.doc.mjs +4 -3
- package/api/theme/themeBuild.doc.mjs +8 -4
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +5 -3
- package/api/theme/themePaletteGenerate.doc.mjs +1 -0
- package/api/theme/themeTargets.doc.mjs +1 -0
- package/api/theme/themeTemplate.doc.mjs +5 -1
- package/api/upgrade/_adapter.d.mts +12 -3
- package/api/upgrade/_adapter.mjs +123 -19
- package/api/upgrade/list/list.mjs +2 -1
- package/api/upgrade/list/list.test.mjs +73 -0
- package/api/upgrade/project-context.test.mjs +272 -0
- package/api/upgrade/provider-agreement.test.mjs +152 -0
- package/api/upgrade/run/run.mjs +1 -0
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +7 -4
- package/api/upgrade/upgrade.type.d.mts +9 -5
- package/api/upgrade/upgrade.type.mjs +12 -11
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/runner.mjs +115 -5
- package/assets/codemods/term-log.mjs +32 -8
- package/assets/codemods/term-log.test.mjs +19 -1
- package/assets/codemods/transform-prop.mjs +109 -0
- package/assets/codemods/transform-prop.test.mjs +95 -0
- package/assets/codemods/transforms/next/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +216 -0
- package/assets/codemods/transforms/next/index.mjs +11 -1
- package/assets/codemods/transforms/next/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/codemods/transforms/v0.0.14/__tests__/rename-status-variants.test.mjs +86 -165
- package/assets/codemods/transforms/v0.0.14/rename-status-variants.mjs +72 -210
- package/assets/codemods/transforms/v0.1.8/__tests__/rename-avatar-size-scale.test.mjs +83 -115
- package/assets/codemods/transforms/v0.1.8/rename-avatar-size-scale.mjs +57 -186
- package/assets/codemods/transforms/v0.3.0/__tests__/unwrap-authoring-factories.test.mjs +27 -5
- package/assets/codemods/transforms/v0.3.0/unwrap-authoring-factories.mjs +20 -5
- package/assets/codemods/transforms/v0.6.0/__tests__/next-codemods.test.mjs +47 -0
- package/assets/codemods/transforms/v0.6.0/rename-resizable-pixel-bounds.mjs +57 -10
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/cli-integrations.doc.mjs +78 -20
- package/assets/docs/cli.doc.mjs +15 -0
- package/assets/docs/styling-libraries.doc.mjs +1 -1
- package/assets/docs/theme.doc.mjs +1 -1
- package/assets/docs/working-with-ai.doc.mjs +1 -1
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaInlineRail.tsx +61 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaOverscrollChaining.tsx +126 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.doc.mjs +15 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaShowcase.tsx +86 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyGroupHeaders.tsx +99 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaStickyPassthrough.tsx +122 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.doc.mjs +14 -0
- package/assets/templates/blocks/components/ScrollableArea/ScrollableAreaTwoAxisBoard.tsx +95 -0
- package/assets/templates/pages/table-tree/page.tsx +1704 -0
- package/assets/templates/pages/table-tree/template.doc.mjs +12 -0
- package/assets/templates/themes/butter/butterTheme.doc.mjs +11 -0
- package/assets/templates/themes/chocolate/chocolateTheme.doc.mjs +11 -0
- package/assets/templates/themes/gothic/gothicTheme.doc.mjs +11 -0
- package/assets/templates/themes/matcha/matchaTheme.doc.mjs +11 -0
- package/assets/templates/themes/neutral/neutralTheme.doc.mjs +11 -0
- package/assets/templates/themes/stone/stoneTheme.doc.mjs +11 -0
- package/assets/templates/themes/y2k/y2kTheme.doc.mjs +11 -0
- package/authoring/_shared/contract.ts +22 -0
- package/authoring/codemod/codemod.doc.mjs +7 -2
- package/authoring/codemod/parse.d.mts +8 -8
- package/authoring/codemod/parse.mjs +8 -6
- package/authoring/config/config.doc.mjs +2 -2
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +13 -13
- package/authoring/config/parse.mjs +8 -8
- package/authoring/config/type.ts +18 -6
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +5 -5
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/doctypes/_schema.d.mts +788 -23
- package/authoring/doctypes/_schema.mjs +492 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +62 -0
- package/authoring/doctypes/base/type.ts +40 -0
- package/authoring/doctypes/command/command.doc.mjs +4 -3
- package/authoring/doctypes/command/parse.d.mts +2 -2
- package/authoring/doctypes/command/parse.mjs +1 -1
- package/authoring/doctypes/command/type.ts +4 -3
- package/authoring/doctypes/component/component.doc.mjs +6 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +6 -5
- package/authoring/doctypes/doctypes-new.test.mjs +48 -6
- package/authoring/doctypes/enum/enum.doc.mjs +1 -1
- package/authoring/doctypes/enum/parse.d.mts +2 -2
- package/authoring/doctypes/enum/parse.mjs +1 -1
- package/authoring/doctypes/enum/type.ts +4 -2
- package/authoring/doctypes/function/function.doc.mjs +5 -1
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +7 -3
- package/authoring/doctypes/hook/hook.doc.mjs +4 -0
- package/authoring/doctypes/hook/parse.d.mts +2 -2
- package/authoring/doctypes/hook/parse.mjs +1 -1
- package/authoring/doctypes/hook/type.ts +5 -4
- package/authoring/doctypes/legacy.d.mts +8 -6
- package/authoring/doctypes/legacy.mjs +5 -4
- package/authoring/doctypes/load-contract.test.mjs +208 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +132 -0
- package/authoring/doctypes/namespace/parse.d.mts +12 -0
- package/authoring/doctypes/namespace/parse.mjs +25 -0
- package/authoring/doctypes/namespace/parse.test.mjs +165 -0
- package/authoring/doctypes/namespace/type.ts +71 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -12
- package/authoring/doctypes/parse.test.mjs +77 -3
- package/authoring/doctypes/reference/parse.d.mts +2 -2
- package/authoring/doctypes/reference/parse.mjs +8 -5
- package/authoring/doctypes/reference/reference.doc.mjs +18 -5
- package/authoring/doctypes/reference/type.ts +53 -7
- package/authoring/doctypes/schema/parse.d.mts +2 -2
- package/authoring/doctypes/schema/parse.mjs +1 -1
- package/authoring/doctypes/schema/schema.doc.mjs +1 -1
- package/authoring/doctypes/schema/type.ts +4 -4
- package/authoring/doctypes/template/parse.d.mts +92 -1
- package/authoring/doctypes/template/parse.mjs +36 -2
- package/authoring/doctypes/template/parse.test.mjs +8 -2
- package/authoring/doctypes/template/template.doc.mjs +7 -3
- package/authoring/doctypes/template/type.ts +5 -2
- package/authoring/doctypes/theme/parse.d.mts +35 -0
- package/authoring/doctypes/theme/parse.mjs +76 -0
- package/authoring/doctypes/theme/theme.doc.d.mts +9 -0
- package/authoring/doctypes/theme/theme.doc.mjs +79 -0
- package/authoring/doctypes/theme/type.ts +42 -0
- package/authoring/doctypes/types.ts +12 -10
- package/authoring/gap-report/gap-report.doc.d.mts +12 -0
- package/authoring/gap-report/gap-report.doc.mjs +183 -0
- package/authoring/gap-report/parse.d.mts +10 -10
- package/authoring/gap-report/parse.mjs +6 -6
- package/authoring/gap-report/type.ts +1 -1
- package/authoring/identity/identity.doc.d.mts +9 -0
- package/authoring/identity/identity.doc.mjs +61 -0
- package/authoring/identity/type.ts +132 -0
- package/authoring/index.d.mts +2 -0
- package/authoring/index.d.ts +51 -17
- package/authoring/index.mjs +3 -1
- package/authoring/integration/integration.doc.mjs +15 -8
- package/authoring/integration/parse.d.mts +2 -2
- package/authoring/integration/parse.mjs +1 -1
- package/authoring/integration/parse.test.mjs +10 -1
- package/authoring/integration/schema.d.mts +6 -4
- package/authoring/integration/schema.mjs +9 -3
- package/authoring/integration/type.ts +18 -7
- package/authoring/shadcn/receipt.d.mts +6 -6
- package/clients/cli/__tests__/cliManifest.test.ts +27 -29
- package/clients/cli/command-load-failure.test.mjs +83 -0
- package/clients/cli/commands/blog.doc.mjs +1 -1
- package/clients/cli/commands/blog.mjs +23 -8
- package/clients/cli/commands/blog.test.mjs +42 -1
- package/clients/cli/commands/build-theme.ascii-output.test.mjs +161 -0
- package/clients/cli/commands/build-theme.flag-docs.test.mjs +110 -0
- package/clients/cli/commands/build-theme.mjs +5 -5
- package/clients/cli/commands/build-theme.path-safety.test.mjs +86 -1
- package/clients/cli/commands/build-theme.variants.test.mjs +76 -0
- package/clients/cli/commands/build.doc.mjs +5 -2
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +32 -47
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +40 -0
- package/clients/cli/commands/component/index.mjs +2 -7
- package/clients/cli/commands/component-package.test.mjs +46 -0
- package/clients/cli/commands/component-resolution.test.mjs +21 -0
- package/clients/cli/commands/component.doc.mjs +1 -1
- package/clients/cli/commands/component.test.mjs +19 -0
- package/clients/cli/commands/detail-levels.test.mjs +2 -2
- package/clients/cli/commands/discover.broken-integration.test.mjs +48 -0
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +5 -3
- package/clients/cli/commands/discover.mjs +3 -3
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +14 -4
- package/clients/cli/commands/docs.mjs +121 -21
- package/clients/cli/commands/docs.test.mjs +88 -0
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration.package-json.test.mjs +53 -0
- package/clients/cli/commands/doctor-integration.test.mjs +15 -7
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +6 -16
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +17 -6
- package/clients/cli/commands/gap-report.test.mjs +72 -0
- package/clients/cli/commands/hook/index.mjs +7 -17
- package/clients/cli/commands/hook.doc.mjs +1 -1
- package/clients/cli/commands/hook.text-projection.test.mjs +45 -0
- package/clients/cli/commands/init.doc.mjs +20 -9
- package/clients/cli/commands/init.flag-help.test.mjs +153 -0
- package/clients/cli/commands/integration-add.controls.test.mjs +132 -0
- package/clients/cli/commands/integration-add.doc.mjs +22 -6
- package/clients/cli/commands/integration-authoring.test.mjs +13 -9
- package/clients/cli/commands/integration-pack.doc.mjs +1 -1
- package/clients/cli/commands/integration-real-world.test.mjs +3 -9
- package/clients/cli/commands/integration.doc.mjs +1 -1
- package/clients/cli/commands/interactive-guard.test.mjs +101 -24
- package/clients/cli/commands/json-contract.test.mjs +33 -0
- package/clients/cli/commands/layout-check.doc.mjs +15 -4
- package/clients/cli/commands/layout-expand.doc.mjs +22 -5
- package/clients/cli/commands/layout-grammar.doc.mjs +1 -1
- package/clients/cli/commands/layout.doc.mjs +3 -3
- package/clients/cli/commands/layout.mjs +21 -9
- package/clients/cli/commands/layout.path-help.test.mjs +33 -0
- package/clients/cli/commands/layout.stdin-cap.test.mjs +47 -0
- package/clients/cli/commands/layout.text-fields.test.mjs +39 -0
- package/clients/cli/commands/manifest.doc.mjs +1 -1
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +7 -4
- package/clients/cli/commands/search.mjs +17 -7
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/swizzle.doc.mjs +3 -2
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +29 -7
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/theme-add.doc.mjs +4 -3
- package/clients/cli/commands/theme-build.doc.mjs +8 -7
- package/clients/cli/commands/theme-list.doc.mjs +2 -2
- package/clients/cli/commands/theme-palette-generate.doc.mjs +9 -5
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +1 -1
- package/clients/cli/commands/theme-targets.doc.mjs +1 -1
- package/clients/cli/commands/theme-template.behavior.test.mjs +12 -0
- package/clients/cli/commands/theme-template.doc.mjs +2 -2
- package/clients/cli/commands/theme.doc.mjs +1 -1
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +20 -9
- package/clients/cli/commands/upgrade.flag-help.test.mjs +188 -0
- package/clients/cli/commands/upgrade.hook-output.test.mjs +88 -0
- package/clients/cli/formatters/index.mjs +162 -1
- package/clients/cli/formatters/index.test.mjs +91 -0
- package/clients/cli/index.mjs +13 -30
- package/clients/cli/latest-version-env.test.mjs +50 -0
- package/clients/cli/lib/cli-error.test.mjs +7 -0
- package/clients/cli/lib/component-format.mjs +9 -9
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +32 -6
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +97 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +38 -2
- package/clients/cli/lib/json-shim.test.mjs +83 -0
- package/clients/cli/lib/manifest.d.ts +2 -0
- package/clients/cli/lib/manifest.mjs +29 -2
- package/clients/cli/lib/manifest.test.mjs +17 -0
- package/foundation/agent-docs/agent-docs.d.mts +4 -0
- package/foundation/agent-docs/agent-docs.mjs +69 -3
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +8 -0
- package/foundation/config/project.mjs +190 -32
- package/foundation/config/project.test.mjs +129 -16
- package/foundation/discovery/authoring-self-docs.d.mts +75 -0
- package/foundation/discovery/authoring-self-docs.mjs +224 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +154 -0
- package/foundation/discovery/authoring-surface.d.mts +74 -0
- package/foundation/discovery/authoring-surface.mjs +525 -0
- package/foundation/discovery/authoring-surface.test.mjs +392 -0
- package/foundation/discovery/cli-self-docs.d.mts +113 -0
- package/foundation/discovery/cli-self-docs.mjs +514 -0
- package/foundation/discovery/cli-self-docs.test.mjs +437 -0
- package/foundation/discovery/component-discovery.d.mts +1 -1
- package/foundation/discovery/component-discovery.mjs +2 -1
- package/foundation/discovery/component-loader.d.mts +35 -38
- package/foundation/discovery/component-loader.mjs +53 -222
- package/foundation/discovery/docs-discovery.d.mts +12 -4
- package/foundation/discovery/docs-discovery.mjs +214 -98
- package/foundation/discovery/docs-discovery.test.mjs +284 -15
- package/foundation/discovery/docs-output-budget.d.mts +28 -0
- package/foundation/discovery/docs-output-budget.mjs +50 -0
- package/foundation/discovery/docs-section-key.d.mts +98 -0
- package/foundation/discovery/docs-section-key.mjs +221 -0
- package/foundation/discovery/docs-section-key.test.mjs +224 -0
- package/foundation/discovery/template-adapter.d.mts +21 -5
- package/foundation/discovery/template-adapter.fixture-refs.test.mjs +248 -0
- package/foundation/discovery/template-adapter.integration-isolation.test.mjs +94 -0
- package/foundation/discovery/template-adapter.mjs +321 -66
- package/foundation/discovery/template-adapter.test.mjs +15 -0
- package/foundation/discovery/theme-discovery.d.mts +67 -7
- package/foundation/discovery/theme-discovery.mjs +916 -186
- package/foundation/discovery/theme-discovery.test.mjs +613 -219
- package/foundation/discovery/theming-targets.test.mjs +4 -0
- package/foundation/doc-compiler/bundle.d.mts +47 -0
- package/foundation/doc-compiler/bundle.mjs +218 -0
- package/foundation/doc-compiler/bundle.test.mjs +255 -0
- package/foundation/doc-compiler/compile.d.mts +362 -0
- package/foundation/doc-compiler/compile.mjs +511 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +277 -0
- package/foundation/doc-compiler/doc-compiler.test.mjs +714 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +1642 -0
- package/foundation/doc-compiler/import.d.mts +24 -0
- package/foundation/doc-compiler/import.mjs +59 -0
- package/foundation/doc-compiler/inputs.d.mts +102 -0
- package/foundation/doc-compiler/inputs.mjs +286 -0
- package/foundation/doc-compiler/inputs.test.mjs +299 -0
- package/foundation/doc-compiler/ir.d.mts +22 -0
- package/foundation/doc-compiler/ir.mjs +464 -0
- package/foundation/doc-compiler/lenses.d.mts +33 -0
- package/foundation/doc-compiler/lenses.mjs +127 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +492 -0
- package/foundation/doc-compiler/overlays.d.mts +37 -0
- package/foundation/doc-compiler/overlays.mjs +206 -0
- package/foundation/doc-compiler/parse-readable.d.mts +9 -0
- package/foundation/doc-compiler/parse-readable.mjs +29 -0
- package/foundation/doc-compiler/read.d.mts +126 -0
- package/foundation/doc-compiler/read.mjs +320 -0
- package/foundation/doc-compiler/read.test.mjs +313 -0
- package/foundation/doc-compiler/source.d.mts +33 -0
- package/foundation/doc-compiler/source.mjs +128 -0
- package/foundation/fs/module-loader.d.mts +1 -0
- package/foundation/fs/module-loader.mjs +50 -1
- package/foundation/fs/module-loader.stdout.test.mjs +332 -0
- package/foundation/fs/path-safety.d.mts +3 -2
- package/foundation/fs/path-safety.mjs +49 -19
- package/foundation/fs/path-safety.test.mjs +50 -0
- package/foundation/fs/publish-file-hardlink-unavailable.test.mjs +129 -94
- package/foundation/identity/provider-identity.d.mts +90 -0
- package/foundation/identity/provider-identity.mjs +320 -0
- package/foundation/identity/provider-identity.test.mjs +254 -0
- package/foundation/identity/providers.d.mts +7 -0
- package/foundation/identity/providers.mjs +16 -0
- package/foundation/integrations/autolink.d.mts +58 -1
- package/foundation/integrations/autolink.mjs +143 -45
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +1 -1
- package/foundation/integrations/contribution-inventory.mjs +17 -20
- package/foundation/integrations/contribution-inventory.test.mjs +67 -27
- package/foundation/integrations/integration-warnings.mjs +6 -0
- package/foundation/integrations/integrations.d.mts +49 -2
- package/foundation/integrations/integrations.mjs +81 -8
- package/foundation/integrations/integrations.test.mjs +384 -1
- package/foundation/integrations/provider-conflicts.test.mjs +125 -0
- package/foundation/integrations/provider-ledger.test.mjs +275 -0
- package/foundation/integrations/provider-resolution.d.mts +152 -0
- package/foundation/integrations/provider-resolution.mjs +576 -0
- package/foundation/integrations/provider-resolution.test.mjs +369 -0
- package/foundation/integrations/theme-descriptor.d.mts +8 -0
- package/foundation/integrations/theme-descriptor.mjs +44 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +114 -10
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/error-codes.doc.mjs +3 -4
- package/foundation/response/error-codes.mjs +2 -2
- package/foundation/response/error-codes.test.mjs +83 -0
- package/foundation/response/json-contract.test.mjs +57 -17
- package/foundation/response/json.d.mts +4 -2
- package/foundation/response/json.mjs +8 -10
- package/foundation/response/response-types.doc.mjs +16 -11
- package/foundation/response/response-types.doc.test.mjs +158 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.mjs +22 -10
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +3 -2
- package/foundation/xle/expand.test.mjs +54 -0
- package/package.json +9 -11
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/lib/update-check.mjs +0 -83
- package/clients/cli/lib/update-check.test.mjs +0 -137
- package/clients/cli/update-hint-commands.test.mjs +0 -54
package/api/doctor/doctor.d.mts
CHANGED
|
@@ -84,6 +84,58 @@ export function checkPeerDeps(ctx: DoctorContext): DoctorCheck;
|
|
|
84
84
|
* @returns {DoctorCheck}
|
|
85
85
|
*/
|
|
86
86
|
export function checkPackageManager(ctx: DoctorContext): DoctorCheck;
|
|
87
|
+
/**
|
|
88
|
+
* Check 6b — every contributing integration owns its provider identity.
|
|
89
|
+
*
|
|
90
|
+
* Artifact and document IDs are provider-scoped, so a package that claims a
|
|
91
|
+
* provider ID an earlier-loaded package already holds is loaded inert: its
|
|
92
|
+
* components, templates, themes, docs, and codemods are withdrawn while the
|
|
93
|
+
* earlier package keeps contributing. That can be a deliberate transition
|
|
94
|
+
* (a renamed package installed beside its predecessor), so it warns rather
|
|
95
|
+
* than fails, but it is never allowed to happen quietly.
|
|
96
|
+
*
|
|
97
|
+
* @param {DoctorContext} ctx
|
|
98
|
+
* @returns {DoctorCheck}
|
|
99
|
+
*/
|
|
100
|
+
export function checkProviderIdentity(ctx: DoctorContext): DoctorCheck;
|
|
101
|
+
/**
|
|
102
|
+
* Every authoring self-doc is reachable from `astryx docs authoring`, loads,
|
|
103
|
+
* and fits in one read, and every type `@astryxdesign/cli/authoring` exports
|
|
104
|
+
* has its doc there: the self-doc beside the module that declares it. The
|
|
105
|
+
* audits are imported here, inside the try, so a malformed self-doc is
|
|
106
|
+
* reported rather than taking Doctor down.
|
|
107
|
+
* @param {DoctorContext} [_ctx]
|
|
108
|
+
* @param {{root?: string, sources?: string[], topicKeys?: Set<string> | null}} [options]
|
|
109
|
+
* Another authoring tree, list, or topic index to audit (for tests).
|
|
110
|
+
* @returns {Promise<DoctorCheck>}
|
|
111
|
+
*/
|
|
112
|
+
export function checkAuthoringDocs(_ctx?: DoctorContext, options?: {
|
|
113
|
+
root?: string;
|
|
114
|
+
sources?: string[];
|
|
115
|
+
topicKeys?: Set<string> | null;
|
|
116
|
+
}): Promise<DoctorCheck>;
|
|
117
|
+
/**
|
|
118
|
+
* Every command, API function, schema, and enum doc the CLI ships declares a
|
|
119
|
+
* namespace, and the topic that namespace names reads it: `astryx docs cli`
|
|
120
|
+
* for `cli/commands` and `cli/api`, `astryx docs authoring` for `authoring`.
|
|
121
|
+
* @param {DoctorContext | Partial<DoctorContext>} _ctx
|
|
122
|
+
* @param {{root?: string, sources?: string[], authoringSources?: string[]}} [options]
|
|
123
|
+
* test seams: the CLI root, the docs to audit, and the authoring topic's list
|
|
124
|
+
* @returns {Promise<DoctorCheck>}
|
|
125
|
+
*/
|
|
126
|
+
export function checkCliDocs(_ctx: DoctorContext | Partial<DoctorContext>, options?: {
|
|
127
|
+
root?: string;
|
|
128
|
+
sources?: string[];
|
|
129
|
+
authoringSources?: string[];
|
|
130
|
+
}): Promise<DoctorCheck>;
|
|
131
|
+
/**
|
|
132
|
+
* Every topic reads progressively, in every language it ships: it loads, its
|
|
133
|
+
* section index and each of its sections fit in one read, and no contributed
|
|
134
|
+
* doc is invalid.
|
|
135
|
+
* @param {DoctorContext | Partial<DoctorContext>} ctx
|
|
136
|
+
* @returns {Promise<DoctorCheck>}
|
|
137
|
+
*/
|
|
138
|
+
export function checkDocsProgressiveDisclosure(ctx: DoctorContext | Partial<DoctorContext>): Promise<DoctorCheck>;
|
|
87
139
|
/**
|
|
88
140
|
* Run all diagnostic checks and return a structured report.
|
|
89
141
|
*
|
|
@@ -169,9 +221,27 @@ export type DoctorContext = {
|
|
|
169
221
|
* read at all.
|
|
170
222
|
*/
|
|
171
223
|
integrations?: import("../../foundation/integrations/integrations.mjs").LoadedIntegration[] | null | undefined;
|
|
224
|
+
/**
|
|
225
|
+
* - The topics a docs read sees.
|
|
226
|
+
*/
|
|
227
|
+
docsCatalog?: DocsCatalog | null | undefined;
|
|
228
|
+
/**
|
|
229
|
+
* `invalid_doc` issues from the project's contributed docs.
|
|
230
|
+
*/
|
|
231
|
+
docsCatalogIssues?: {
|
|
232
|
+
package?: string;
|
|
233
|
+
code: string;
|
|
234
|
+
message: string;
|
|
235
|
+
}[] | undefined;
|
|
236
|
+
/**
|
|
237
|
+
* - Why the project's docs catalog
|
|
238
|
+
* could not be built, when it could not.
|
|
239
|
+
*/
|
|
240
|
+
docsCatalogError?: string | null | undefined;
|
|
172
241
|
/**
|
|
173
242
|
* - Error thrown while resolving the config
|
|
174
243
|
* path (e.g. multiple config files present), surfaced by checkConfig as a FAIL.
|
|
175
244
|
*/
|
|
176
245
|
configError?: Error | null | undefined;
|
|
177
246
|
};
|
|
247
|
+
import { DocsCatalog } from '../../foundation/discovery/docs-discovery.mjs';
|
package/api/doctor/doctor.mjs
CHANGED
|
@@ -27,6 +27,15 @@ import {MIN_NODE_VERSION, isNodeVersionSupported} from '../../foundation/env/nod
|
|
|
27
27
|
import {CLI_ROOT, findCoreDir, findInstalledPackage} from '../../foundation/fs/paths.mjs';
|
|
28
28
|
import {explainPackageManager, getCliInvocation} from '../../foundation/env/package-manager.mjs';
|
|
29
29
|
import {findConfigPath, Project} from '../../foundation/config/project.mjs';
|
|
30
|
+
import {DocsCatalog} from '../../foundation/discovery/docs-discovery.mjs';
|
|
31
|
+
import {buildDocsIndexData} from '../../foundation/discovery/docs-section-key.mjs';
|
|
32
|
+
import {
|
|
33
|
+
DOC_OUTPUT_BUDGET_BYTES,
|
|
34
|
+
docsIndexBytes,
|
|
35
|
+
oversizedDocSections,
|
|
36
|
+
} from '../../foundation/discovery/docs-output-budget.mjs';
|
|
37
|
+
import {compileTopic, lowerTopic, overlayLanguages} from '../docs/_adapter.mjs';
|
|
38
|
+
import {detailView, indexView} from '../../foundation/doc-compiler/lenses.mjs';
|
|
30
39
|
import {semverCompare, isValidSemver, satisfiesRange} from '../../foundation/env/semver.mjs';
|
|
31
40
|
|
|
32
41
|
/**
|
|
@@ -52,6 +61,11 @@ import {semverCompare, isValidSemver, satisfiesRange} from '../../foundation/env
|
|
|
52
61
|
* @property {import('../../foundation/integrations/integrations.mjs').LoadedIntegration[]|null} [integrations]
|
|
53
62
|
* Every integration the project loaded, or null when the project could not be
|
|
54
63
|
* read at all.
|
|
64
|
+
* @property {DocsCatalog|null} [docsCatalog] - The topics a docs read sees.
|
|
65
|
+
* @property {Array<{package?: string, code: string, message: string}>} [docsCatalogIssues]
|
|
66
|
+
* `invalid_doc` issues from the project's contributed docs.
|
|
67
|
+
* @property {string|null} [docsCatalogError] - Why the project's docs catalog
|
|
68
|
+
* could not be built, when it could not.
|
|
55
69
|
* @property {Error|null} [configError] - Error thrown while resolving the config
|
|
56
70
|
* path (e.g. multiple config files present), surfaced by checkConfig as a FAIL.
|
|
57
71
|
*/
|
|
@@ -627,6 +641,372 @@ export function checkPackageManager(ctx) {
|
|
|
627
641
|
};
|
|
628
642
|
}
|
|
629
643
|
|
|
644
|
+
/**
|
|
645
|
+
* Check 6b — every contributing integration owns its provider identity.
|
|
646
|
+
*
|
|
647
|
+
* Artifact and document IDs are provider-scoped, so a package that claims a
|
|
648
|
+
* provider ID an earlier-loaded package already holds is loaded inert: its
|
|
649
|
+
* components, templates, themes, docs, and codemods are withdrawn while the
|
|
650
|
+
* earlier package keeps contributing. That can be a deliberate transition
|
|
651
|
+
* (a renamed package installed beside its predecessor), so it warns rather
|
|
652
|
+
* than fails, but it is never allowed to happen quietly.
|
|
653
|
+
*
|
|
654
|
+
* @param {DoctorContext} ctx
|
|
655
|
+
* @returns {DoctorCheck}
|
|
656
|
+
*/
|
|
657
|
+
export function checkProviderIdentity(ctx) {
|
|
658
|
+
const id = 'provider-identity';
|
|
659
|
+
const label = 'Integration provider identity';
|
|
660
|
+
|
|
661
|
+
if (ctx.integrations == null) {
|
|
662
|
+
return {
|
|
663
|
+
id,
|
|
664
|
+
label,
|
|
665
|
+
status: 'info',
|
|
666
|
+
message: 'Skipped — the project configuration could not be read.',
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
const conflicts = ctx.integrations.filter(
|
|
671
|
+
integration => integration.__providerConflict,
|
|
672
|
+
);
|
|
673
|
+
if (conflicts.length > 0) {
|
|
674
|
+
return {
|
|
675
|
+
id,
|
|
676
|
+
label,
|
|
677
|
+
status: 'warn',
|
|
678
|
+
message: conflicts
|
|
679
|
+
.map(integration => integration.__providerConflict?.message)
|
|
680
|
+
.join(' '),
|
|
681
|
+
fix:
|
|
682
|
+
'Give each integration its own `providerId` in astryx.integration.*. ' +
|
|
683
|
+
"A renamed package may keep its predecessor's ID only when the " +
|
|
684
|
+
'predecessor is no longer installed.',
|
|
685
|
+
};
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
const count = ctx.integrations.filter(
|
|
689
|
+
integration =>
|
|
690
|
+
integration.providerId != null && integration.__loadError == null,
|
|
691
|
+
).length;
|
|
692
|
+
if (count === 0) {
|
|
693
|
+
return {
|
|
694
|
+
id,
|
|
695
|
+
label,
|
|
696
|
+
status: 'info',
|
|
697
|
+
message: 'None — no loaded integration has a provider identity.',
|
|
698
|
+
};
|
|
699
|
+
}
|
|
700
|
+
return {
|
|
701
|
+
id,
|
|
702
|
+
label,
|
|
703
|
+
status: 'pass',
|
|
704
|
+
message:
|
|
705
|
+
count === 1
|
|
706
|
+
? '1 loaded integration has its own provider ID.'
|
|
707
|
+
: `${count} loaded integrations each have their own provider ID.`,
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/** @param {number} bytes */
|
|
712
|
+
const kilobytes = bytes => `${Math.ceil(bytes / 1024)} KB`;
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* @param {string[]} problems
|
|
716
|
+
* @returns {string}
|
|
717
|
+
*/
|
|
718
|
+
function joinProblems(problems) {
|
|
719
|
+
return problems.length === 1
|
|
720
|
+
? problems[0]
|
|
721
|
+
: `${problems.length} problems: ${problems.join('; ')}`;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/** How the self-doc audit's problems are fixed. */
|
|
725
|
+
const AUTHORING_DOCS_FIX =
|
|
726
|
+
'List every authoring self-doc in AUTHORING_SELF_DOCS, fix the one that fails to load, and split a section that is too large.';
|
|
727
|
+
|
|
728
|
+
/** How the public-surface audit's problems are fixed. */
|
|
729
|
+
const AUTHORING_SURFACE_FIX =
|
|
730
|
+
'Put a self-doc beside each module whose types @astryxdesign/cli/authoring exports and list it in AUTHORING_SELF_DOCS; export what each listed self-doc documents, or remove that self-doc.';
|
|
731
|
+
|
|
732
|
+
/** Types one problem names before it counts the rest. */
|
|
733
|
+
const NAMED_TYPES = 40;
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* @param {string[]} names
|
|
737
|
+
* @returns {string}
|
|
738
|
+
*/
|
|
739
|
+
function nameTypes(names) {
|
|
740
|
+
return names.length <= NAMED_TYPES
|
|
741
|
+
? names.join(', ')
|
|
742
|
+
: `${names.slice(0, NAMED_TYPES).join(', ')} and ${names.length - NAMED_TYPES} more`;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* The section keys `astryx docs authoring --index` lists, read the way that
|
|
747
|
+
* command reads them.
|
|
748
|
+
* @returns {Promise<{keys: Set<string>} | {keys: null, error: string}>}
|
|
749
|
+
*/
|
|
750
|
+
async function authoringTopicKeys() {
|
|
751
|
+
try {
|
|
752
|
+
const catalog = DocsCatalog.fromBuiltins();
|
|
753
|
+
const entry = catalog.resolve('authoring');
|
|
754
|
+
if (!entry) return {keys: null, error: 'it is not a built-in topic'};
|
|
755
|
+
const index = indexView(await lowerTopic(catalog, entry));
|
|
756
|
+
return {keys: new Set(index.sections.map(section => section.id))};
|
|
757
|
+
} catch (err) {
|
|
758
|
+
return {
|
|
759
|
+
keys: null,
|
|
760
|
+
error: err instanceof Error ? err.message : String(err),
|
|
761
|
+
};
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
/**
|
|
766
|
+
* @param {Awaited<ReturnType<typeof import('../../foundation/discovery/authoring-surface.mjs').auditAuthoringSurface>>} surface
|
|
767
|
+
* @returns {string[]}
|
|
768
|
+
*/
|
|
769
|
+
function surfaceProblems(surface) {
|
|
770
|
+
/** @type {string[]} */
|
|
771
|
+
const problems = [];
|
|
772
|
+
if (surface.types === 0 && surface.untraced.length === 0) {
|
|
773
|
+
problems.push(
|
|
774
|
+
'@astryxdesign/cli/authoring exports no types, so nothing was compared with `astryx docs authoring`',
|
|
775
|
+
);
|
|
776
|
+
}
|
|
777
|
+
for (const {module, names, reason, source, key} of surface.unreadable) {
|
|
778
|
+
const why =
|
|
779
|
+
reason === 'no-self-doc'
|
|
780
|
+
? `no self-doc sits beside ${module}`
|
|
781
|
+
: reason === 'unregistered'
|
|
782
|
+
? `${source} is not listed in AUTHORING_SELF_DOCS`
|
|
783
|
+
: reason === 'failed'
|
|
784
|
+
? `${source} does not load`
|
|
785
|
+
: `${source} renders section "${key}", which the topic's index does not list`;
|
|
786
|
+
problems.push(
|
|
787
|
+
`${nameTypes(names)} from ${module} ${names.length === 1 ? 'has' : 'have'} no doc in \`astryx docs authoring\`: ${why}`,
|
|
788
|
+
);
|
|
789
|
+
}
|
|
790
|
+
for (const {name, reason} of surface.untraced) {
|
|
791
|
+
problems.push(
|
|
792
|
+
`${name} cannot be traced to the module that declares it: ${reason}`,
|
|
793
|
+
);
|
|
794
|
+
}
|
|
795
|
+
for (const {source, subject} of surface.unmatched) {
|
|
796
|
+
problems.push(
|
|
797
|
+
subject
|
|
798
|
+
? `${source} documents ${subject}, which @astryxdesign/cli/authoring does not export`
|
|
799
|
+
: `${source} documents no type @astryxdesign/cli/authoring exports`,
|
|
800
|
+
);
|
|
801
|
+
}
|
|
802
|
+
return problems;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
/**
|
|
806
|
+
* Every authoring self-doc is reachable from `astryx docs authoring`, loads,
|
|
807
|
+
* and fits in one read, and every type `@astryxdesign/cli/authoring` exports
|
|
808
|
+
* has its doc there: the self-doc beside the module that declares it. The
|
|
809
|
+
* audits are imported here, inside the try, so a malformed self-doc is
|
|
810
|
+
* reported rather than taking Doctor down.
|
|
811
|
+
* @param {DoctorContext} [_ctx]
|
|
812
|
+
* @param {{root?: string, sources?: string[], topicKeys?: Set<string> | null}} [options]
|
|
813
|
+
* Another authoring tree, list, or topic index to audit (for tests).
|
|
814
|
+
* @returns {Promise<DoctorCheck>}
|
|
815
|
+
*/
|
|
816
|
+
export async function checkAuthoringDocs(_ctx, options = {}) {
|
|
817
|
+
const id = 'authoring-docs';
|
|
818
|
+
const label = 'Authoring docs';
|
|
819
|
+
try {
|
|
820
|
+
const {auditAuthoringSelfDocs} =
|
|
821
|
+
await import('../../foundation/discovery/authoring-self-docs.mjs');
|
|
822
|
+
const {auditAuthoringSurface} =
|
|
823
|
+
await import('../../foundation/discovery/authoring-surface.mjs');
|
|
824
|
+
const {root, sources} = options;
|
|
825
|
+
const audit = await auditAuthoringSelfDocs({root, sources});
|
|
826
|
+
const problems = [
|
|
827
|
+
...audit.unreachable.map(
|
|
828
|
+
source => `${source} is not in \`astryx docs authoring\``,
|
|
829
|
+
),
|
|
830
|
+
...audit.failed.map(
|
|
831
|
+
({source, error}) => `${source} failed to load: ${error}`,
|
|
832
|
+
),
|
|
833
|
+
...audit.oversized.map(
|
|
834
|
+
({key, bytes}) =>
|
|
835
|
+
`authoring section "${key}" is ${kilobytes(bytes)}, over the ${kilobytes(DOC_OUTPUT_BUDGET_BYTES)} one read may return`,
|
|
836
|
+
),
|
|
837
|
+
];
|
|
838
|
+
const topic =
|
|
839
|
+
options.topicKeys === undefined
|
|
840
|
+
? await authoringTopicKeys()
|
|
841
|
+
: {keys: options.topicKeys};
|
|
842
|
+
const surface = [
|
|
843
|
+
...('error' in topic
|
|
844
|
+
? [`\`astryx docs authoring\` could not be read: ${topic.error}`]
|
|
845
|
+
: []),
|
|
846
|
+
...surfaceProblems(
|
|
847
|
+
await auditAuthoringSurface({root, sources, topicKeys: topic.keys}),
|
|
848
|
+
),
|
|
849
|
+
];
|
|
850
|
+
if (problems.length + surface.length > 0) {
|
|
851
|
+
return {
|
|
852
|
+
id,
|
|
853
|
+
label,
|
|
854
|
+
status: 'fail',
|
|
855
|
+
message: joinProblems([...problems, ...surface]),
|
|
856
|
+
fix: [
|
|
857
|
+
problems.length > 0 ? AUTHORING_DOCS_FIX : null,
|
|
858
|
+
surface.length > 0 ? AUTHORING_SURFACE_FIX : null,
|
|
859
|
+
]
|
|
860
|
+
.filter(Boolean)
|
|
861
|
+
.join(' '),
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
return {
|
|
865
|
+
id,
|
|
866
|
+
label,
|
|
867
|
+
status: 'pass',
|
|
868
|
+
message: `All ${audit.sections} authoring schemas are readable in \`astryx docs authoring\`.`,
|
|
869
|
+
};
|
|
870
|
+
} catch (err) {
|
|
871
|
+
return {
|
|
872
|
+
id,
|
|
873
|
+
label,
|
|
874
|
+
status: 'fail',
|
|
875
|
+
message: `The authoring docs could not be audited: ${err instanceof Error ? err.message : String(err)}`,
|
|
876
|
+
fix: 'Reinstall @astryxdesign/cli.',
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
/** How the CLI-docs audit's problems are fixed. */
|
|
882
|
+
const CLI_DOCS_FIX =
|
|
883
|
+
"Set `namespace` on each CLI doc to the one that reads it: cli/commands for a command, cli/api for an API function or the output schema, error codes, and response types, and authoring for a file an author writes (and list it in AUTHORING_SELF_DOCS).";
|
|
884
|
+
|
|
885
|
+
/**
|
|
886
|
+
* Every command, API function, schema, and enum doc the CLI ships declares a
|
|
887
|
+
* namespace, and the topic that namespace names reads it: `astryx docs cli`
|
|
888
|
+
* for `cli/commands` and `cli/api`, `astryx docs authoring` for `authoring`.
|
|
889
|
+
* @param {DoctorContext | Partial<DoctorContext>} _ctx
|
|
890
|
+
* @param {{root?: string, sources?: string[], authoringSources?: string[]}} [options]
|
|
891
|
+
* test seams: the CLI root, the docs to audit, and the authoring topic's list
|
|
892
|
+
* @returns {Promise<DoctorCheck>}
|
|
893
|
+
*/
|
|
894
|
+
export async function checkCliDocs(_ctx, options = {}) {
|
|
895
|
+
const id = 'cli-docs';
|
|
896
|
+
const label = 'CLI docs';
|
|
897
|
+
try {
|
|
898
|
+
const {auditCliSelfDocs} =
|
|
899
|
+
await import('../../foundation/discovery/cli-self-docs.mjs');
|
|
900
|
+
const audit = await auditCliSelfDocs(options);
|
|
901
|
+
const problems = [
|
|
902
|
+
...audit.missing.map(
|
|
903
|
+
source =>
|
|
904
|
+
`${source} has no namespace, so no \`astryx docs\` topic reads it`,
|
|
905
|
+
),
|
|
906
|
+
...audit.unknown.map(
|
|
907
|
+
({source, namespace}) =>
|
|
908
|
+
`${source} has namespace "${namespace}", which no \`astryx docs\` topic reads`,
|
|
909
|
+
),
|
|
910
|
+
...audit.misfiled.map(({message}) => message),
|
|
911
|
+
...audit.failed.map(
|
|
912
|
+
({source, error}) => `${source} failed to load: ${error}`,
|
|
913
|
+
),
|
|
914
|
+
...audit.keyProblems.map(problem => `\`astryx docs cli\`: ${problem}`),
|
|
915
|
+
...audit.oversized.map(
|
|
916
|
+
({key, bytes}) =>
|
|
917
|
+
`cli section "${key}" is ${kilobytes(bytes)}, over the ${kilobytes(DOC_OUTPUT_BUDGET_BYTES)} one read may return`,
|
|
918
|
+
),
|
|
919
|
+
];
|
|
920
|
+
if (problems.length > 0) {
|
|
921
|
+
return {
|
|
922
|
+
id,
|
|
923
|
+
label,
|
|
924
|
+
status: 'fail',
|
|
925
|
+
message: joinProblems(problems),
|
|
926
|
+
fix: CLI_DOCS_FIX,
|
|
927
|
+
};
|
|
928
|
+
}
|
|
929
|
+
return {
|
|
930
|
+
id,
|
|
931
|
+
label,
|
|
932
|
+
status: 'pass',
|
|
933
|
+
message: `All ${audit.docs} CLI docs are readable: ${audit.sections} in \`astryx docs cli\` and ${audit.authoring} in \`astryx docs authoring\`.`,
|
|
934
|
+
};
|
|
935
|
+
} catch (err) {
|
|
936
|
+
return {
|
|
937
|
+
id,
|
|
938
|
+
label,
|
|
939
|
+
status: 'fail',
|
|
940
|
+
message: `The CLI docs could not be audited: ${err instanceof Error ? err.message : String(err)}`,
|
|
941
|
+
fix: 'Reinstall @astryxdesign/cli.',
|
|
942
|
+
};
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
/**
|
|
947
|
+
* Every topic reads progressively, in every language it ships: it loads, its
|
|
948
|
+
* section index and each of its sections fit in one read, and no contributed
|
|
949
|
+
* doc is invalid.
|
|
950
|
+
* @param {DoctorContext | Partial<DoctorContext>} ctx
|
|
951
|
+
* @returns {Promise<DoctorCheck>}
|
|
952
|
+
*/
|
|
953
|
+
export async function checkDocsProgressiveDisclosure(ctx) {
|
|
954
|
+
const id = 'docs-progressive-disclosure';
|
|
955
|
+
const label = 'Documentation navigation and size';
|
|
956
|
+
const budget = kilobytes(DOC_OUTPUT_BUDGET_BYTES);
|
|
957
|
+
/** @type {string[]} */
|
|
958
|
+
const problems = [];
|
|
959
|
+
if (ctx.docsCatalogError) {
|
|
960
|
+
problems.push(`The docs catalog could not be built: ${ctx.docsCatalogError}`);
|
|
961
|
+
}
|
|
962
|
+
for (const issue of ctx.docsCatalogIssues ?? []) {
|
|
963
|
+
problems.push(`${issue.package ?? 'a contributed doc'}: ${issue.message}`);
|
|
964
|
+
}
|
|
965
|
+
let topics = 0;
|
|
966
|
+
const catalog = ctx.docsCatalog;
|
|
967
|
+
if (catalog) {
|
|
968
|
+
for (const entry of catalog.entries()) {
|
|
969
|
+
for (const lang of [null, ...overlayLanguages(entry)]) {
|
|
970
|
+
const where = lang ? `${entry.name} [${lang}]` : entry.name;
|
|
971
|
+
try {
|
|
972
|
+
const doc = detailView(await compileTopic(catalog, entry, lang));
|
|
973
|
+
if (lang == null) topics += 1;
|
|
974
|
+
const indexBytes = docsIndexBytes(buildDocsIndexData(doc));
|
|
975
|
+
if (indexBytes > DOC_OUTPUT_BUDGET_BYTES) {
|
|
976
|
+
problems.push(
|
|
977
|
+
`${where}: its section index is ${kilobytes(indexBytes)}, over the ${budget} one read may return`,
|
|
978
|
+
);
|
|
979
|
+
}
|
|
980
|
+
for (const over of oversizedDocSections(doc.sections)) {
|
|
981
|
+
problems.push(
|
|
982
|
+
`${where} ${over.key}: ${kilobytes(over.bytes)}, over the ${budget} one read may return`,
|
|
983
|
+
);
|
|
984
|
+
}
|
|
985
|
+
} catch (err) {
|
|
986
|
+
problems.push(
|
|
987
|
+
`${where}: ${err instanceof Error ? err.message : String(err)}`,
|
|
988
|
+
);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
if (problems.length > 0) {
|
|
994
|
+
return {
|
|
995
|
+
id,
|
|
996
|
+
label,
|
|
997
|
+
status: 'fail',
|
|
998
|
+
message: joinProblems(problems),
|
|
999
|
+
fix: 'Fix the doc each problem names; split a section that is too large into smaller ones, each with its own key.',
|
|
1000
|
+
};
|
|
1001
|
+
}
|
|
1002
|
+
return {
|
|
1003
|
+
id,
|
|
1004
|
+
label,
|
|
1005
|
+
status: 'pass',
|
|
1006
|
+
message: `${topics} topics: every section index and section fits in one ${budget} read.`,
|
|
1007
|
+
};
|
|
1008
|
+
}
|
|
1009
|
+
|
|
630
1010
|
/**
|
|
631
1011
|
* Ordered list of synchronous check functions. Append here to add a check.
|
|
632
1012
|
* (checkConfig is async and is awaited separately by {@link runChecks}.)
|
|
@@ -638,6 +1018,7 @@ export const SYNC_CHECKS = [
|
|
|
638
1018
|
checkVersionAlignment,
|
|
639
1019
|
checkThemes,
|
|
640
1020
|
checkImplicitIntegrations,
|
|
1021
|
+
checkProviderIdentity,
|
|
641
1022
|
checkAgentDocs,
|
|
642
1023
|
checkPeerDeps,
|
|
643
1024
|
checkPackageManager,
|
|
@@ -669,11 +1050,28 @@ export async function runChecks(options = {}) {
|
|
|
669
1050
|
let configTheme = null;
|
|
670
1051
|
/** @type {import('../../foundation/integrations/integrations.mjs').LoadedIntegration[]|null} */
|
|
671
1052
|
let integrations = null;
|
|
1053
|
+
// A docs read falls back to the built-in topics when the project cannot be
|
|
1054
|
+
// read, so the docs checks do too; the config check reports the config.
|
|
1055
|
+
/** @type {DocsCatalog|null} */
|
|
1056
|
+
let docsCatalog = DocsCatalog.fromBuiltins();
|
|
1057
|
+
/** @type {Array<{package?: string, code: string, message: string}>} */
|
|
1058
|
+
let docsCatalogIssues = [];
|
|
1059
|
+
/** @type {string|null} */
|
|
1060
|
+
let docsCatalogError = null;
|
|
672
1061
|
try {
|
|
673
1062
|
const project = await Project.load(cwd);
|
|
674
1063
|
configTheme =
|
|
675
1064
|
/** @type {{theme?: string}} */ (project.config ?? {}).theme ?? null;
|
|
676
1065
|
integrations = project.loadedIntegrations;
|
|
1066
|
+
try {
|
|
1067
|
+
docsCatalog = await project.docs();
|
|
1068
|
+
docsCatalogIssues = (await project.issues()).filter(
|
|
1069
|
+
issue => issue.code === 'invalid_doc',
|
|
1070
|
+
);
|
|
1071
|
+
} catch (err) {
|
|
1072
|
+
docsCatalog = null;
|
|
1073
|
+
docsCatalogError = err instanceof Error ? err.message : String(err);
|
|
1074
|
+
}
|
|
677
1075
|
} catch {
|
|
678
1076
|
// Best-effort: a missing/invalid config leaves configTheme null.
|
|
679
1077
|
}
|
|
@@ -686,6 +1084,9 @@ export async function runChecks(options = {}) {
|
|
|
686
1084
|
configPath,
|
|
687
1085
|
configTheme,
|
|
688
1086
|
integrations,
|
|
1087
|
+
docsCatalog,
|
|
1088
|
+
docsCatalogIssues,
|
|
1089
|
+
docsCatalogError,
|
|
689
1090
|
configError,
|
|
690
1091
|
};
|
|
691
1092
|
|
|
@@ -698,6 +1099,9 @@ export async function runChecks(options = {}) {
|
|
|
698
1099
|
checks.push(await checkConfig(ctx));
|
|
699
1100
|
}
|
|
700
1101
|
}
|
|
1102
|
+
checks.push(await checkAuthoringDocs(ctx));
|
|
1103
|
+
checks.push(await checkCliDocs(ctx));
|
|
1104
|
+
checks.push(await checkDocsProgressiveDisclosure(ctx));
|
|
701
1105
|
|
|
702
1106
|
const summary = {pass: 0, warn: 0, fail: 0, info: 0};
|
|
703
1107
|
for (const c of checks) summary[c.status] += 1;
|