@astryxdesign/cli 0.6.3 → 0.6.4-canary.10dd683
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/CHANGELOG.md +194 -0
- package/README.md +117 -78
- package/api/blog/blog.doc.mjs +1 -0
- package/api/build/_adapter.d.mts +50 -0
- package/api/build/_adapter.mjs +60 -0
- package/api/build/build.doc.mjs +16 -9
- package/api/build/build.test.mjs +197 -8
- package/api/build/build.type.d.mts +91 -2
- package/api/build/build.type.mjs +52 -8
- package/api/build/help/help.d.mts +12 -5
- package/api/build/help/help.mjs +69 -6
- package/api/build/kit/kit.d.mts +4 -1
- package/api/build/kit/kit.mjs +165 -49
- package/api/build/kit/rank.d.mts +44 -0
- package/api/build/kit/rank.mjs +432 -0
- package/api/build/kit/rank.test.mjs +196 -0
- package/api/component/_adapter.d.mts +6 -12
- package/api/component/_adapter.mjs +20 -10
- package/api/component/component.doc.mjs +13 -3
- package/api/component/component.mjs +91 -14
- 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 +40 -11
- package/api/discover/_adapter.d.mts +114 -6
- package/api/discover/_adapter.mjs +372 -17
- package/api/discover/_adapter.test.mjs +215 -0
- package/api/discover/_catalog-view.d.mts +115 -0
- package/api/discover/_catalog-view.mjs +203 -0
- package/api/discover/_catalog-view.test.mjs +128 -0
- package/api/discover/detail/detail.d.mts +18 -6
- package/api/discover/detail/detail.mjs +67 -13
- package/api/discover/detail/detail.test.mjs +85 -0
- package/api/discover/detail/item/item.d.mts +26 -0
- package/api/discover/detail/item/item.mjs +78 -0
- package/api/discover/detail/item/item.test.mjs +73 -0
- package/api/discover/discover.d.mts +3 -9
- package/api/discover/discover.doc.mjs +62 -18
- package/api/discover/discover.mjs +220 -36
- package/api/discover/discover.test.mjs +11 -2
- package/api/discover/discover.type.d.mts +150 -11
- package/api/discover/discover.type.mjs +107 -17
- package/api/discover/list/list.d.mts +20 -6
- package/api/discover/list/list.mjs +45 -12
- package/api/discover/list/list.test.mjs +46 -0
- package/api/discover/search/search.d.mts +18 -16
- package/api/discover/search/search.mjs +102 -56
- package/api/discover/search/search.test.mjs +144 -10
- package/api/docs/_adapter.d.mts +272 -41
- package/api/docs/_adapter.mjs +985 -108
- package/api/docs/compiled-topics.test.mjs +78 -0
- package/api/docs/detail/detail.mjs +22 -63
- package/api/docs/detail/section/section.d.mts +1 -1
- package/api/docs/detail/section/section.mjs +54 -19
- package/api/docs/detail/section/section.test.mjs +50 -0
- package/api/docs/docs.d.mts +10 -3
- package/api/docs/docs.doc.mjs +55 -16
- package/api/docs/docs.mjs +53 -10
- package/api/docs/docs.test.mjs +164 -4
- package/api/docs/docs.type.d.mts +221 -5
- package/api/docs/docs.type.mjs +153 -11
- package/api/docs/index/index.d.mts +18 -0
- package/api/docs/index/index.mjs +40 -0
- package/api/docs/index/index.test.mjs +62 -0
- package/api/docs/integration-tree.test.mjs +555 -0
- package/api/docs/integrationDocs.test.mjs +114 -8
- package/api/docs/list/list.mjs +28 -12
- package/api/docs/node/node.d.mts +43 -0
- package/api/docs/node/node.mjs +192 -0
- package/api/docs/reference-blocks.test.mjs +406 -0
- package/api/doctor/doctor.d.mts +99 -1
- package/api/doctor/doctor.doc.mjs +1 -0
- package/api/doctor/doctor.mjs +548 -1
- package/api/doctor/doctor.test.mjs +610 -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/index.d.mts +1 -1
- package/api/index.mjs +1 -0
- package/api/init/init.doc.mjs +6 -1
- 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.d.mts +2 -1
- package/api/integration/add-contribution.mjs +130 -15
- package/api/integration/add-contribution.test.mjs +258 -7
- package/api/integration/add-helpers.d.mts +5 -2
- package/api/integration/add-helpers.mjs +36 -9
- package/api/integration/add-theme.mjs +34 -64
- package/api/integration/add-theme.test.mjs +105 -21
- package/api/integration/authoring-checks.mjs +138 -28
- package/api/integration/authoring-checks.test.mjs +179 -7
- package/api/integration/authoring-checks.type.mjs +6 -1
- package/api/integration/integration-authoring.type.d.mts +3 -1
- package/api/integration/integration-authoring.type.mjs +2 -0
- package/api/integration/integration-block-exports.test.mjs +10 -6
- package/api/integration/integrationAdd.doc.mjs +14 -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 +8 -1
- 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 +2 -1
- package/api/integration/integrationPackCheck.doc.mjs +2 -1
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.mjs +83 -7
- package/api/integration/pack-check.test.mjs +387 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +14 -1
- package/api/integration/summarizeIssues.doc.mjs +1 -0
- package/api/integration/template-conflict-compatibility.test.mjs +73 -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 +179 -26
- package/api/integration/validate-unread-theme-folders.test.mjs +110 -0
- package/api/integration/validateIntegration.doc.mjs +3 -2
- package/api/json/assertResponse.doc.mjs +1 -0
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +1 -0
- package/api/json/parseResponse.doc.mjs +3 -2
- package/api/layout/_adapter.mjs +20 -5
- 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 +62 -11
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +471 -83
- package/api/search/search.test.mjs +124 -1
- package/api/search/search.type.d.mts +15 -3
- package/api/search/search.type.mjs +5 -2
- 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/list/list.mjs +1 -0
- package/api/template/table-floating-bulk-actions.test.mjs +66 -0
- package/api/template/template-integration.test.mjs +1072 -3
- package/api/template/template-suffix.test.mjs +41 -21
- package/api/template/template.d.mts +1 -1
- package/api/template/template.doc.mjs +30 -8
- package/api/template/template.mjs +45 -8
- package/api/template/template.type.d.mts +12 -14
- package/api/template/template.type.mjs +15 -14
- 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 +31 -22
- package/api/theme/add/add.rollback.test.mjs +158 -0
- package/api/theme/add/add.staging.test.mjs +83 -0
- package/api/theme/add/add.test.mjs +14 -1
- package/api/theme/build/build.family.test.mjs +7 -12
- package/api/theme/build/build.mjs +140 -59
- 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.rollback.test.mjs +148 -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 +20 -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 +6 -2
- package/api/upgrade/_adapter.d.mts +32 -5
- package/api/upgrade/_adapter.mjs +139 -22
- 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 +356 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +12 -5
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +27 -11
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +330 -8
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +56 -4
- package/assets/codemods/integration-runner.protection.test.mjs +153 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/run-codemod.mjs +177 -34
- package/assets/codemods/runner.mjs +350 -102
- 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/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/codemods/transforms/v0.6.4/__tests__/migrate-native-picker-to-presentation.test.mjs +63 -0
- package/assets/codemods/transforms/v0.6.4/__tests__/migrate-theme-catalog-to-descriptors.test.mjs +220 -0
- package/assets/codemods/transforms/v0.6.4/index.mjs +31 -0
- package/assets/codemods/transforms/v0.6.4/migrate-native-picker-to-presentation.mjs +148 -0
- package/assets/codemods/transforms/v0.6.4/migrate-theme-catalog-to-descriptors.mjs +141 -0
- package/assets/docs/README.md +9 -0
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/getting-started.doc.mjs +2 -2
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +2 -2
- package/assets/docs/layout.doc.mjs +1 -1
- package/assets/docs/principles.doc.mjs +6 -6
- package/assets/docs/styling-libraries.doc.mjs +4 -4
- package/assets/docs/styling.doc.mjs +4 -4
- package/assets/docs/theme.doc.mjs +5 -5
- package/assets/docs/tokens.doc.mjs +1 -1
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/{cli-integrations.doc.mjs → tree/integrations.doc.mjs} +144 -26
- package/assets/docs/tree/integrations.test.mjs +62 -0
- package/assets/docs/tree/writing-docs.doc.mjs +286 -0
- package/assets/docs/working-with-ai.doc.mjs +4 -4
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.doc.mjs +1 -1
- package/assets/templates/blocks/components/CheckboxList/CheckboxListSelectAllPattern.tsx +1 -3
- package/assets/templates/blocks/components/DateInput/DateInputDateRange.tsx +1 -1
- package/assets/templates/blocks/components/InternationalizationProvider/InternationalizationProvider01ShippedLocale.tsx +1 -1
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.doc.mjs +14 -0
- package/assets/templates/blocks/components/Item/ItemDocumentTabs.tsx +100 -0
- 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/blocks/components/Table/TableBulkActionsTable.doc.mjs +14 -0
- package/assets/templates/blocks/components/Table/TableBulkActionsTable.tsx +71 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.doc.mjs +19 -0
- package/assets/templates/blocks/components/Table/TableFloatingBulkActionsTable.tsx +139 -0
- package/assets/templates/blocks/components/TimeInput/TimeInputConstrained.tsx +1 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerFormats.tsx +34 -0
- package/assets/templates/blocks/components/Timer/TimerInline.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerInline.tsx +14 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.doc.mjs +13 -0
- package/assets/templates/blocks/components/Timer/TimerShowcase.tsx +47 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.doc.mjs +14 -0
- package/assets/templates/blocks/components/Timer/TimerTypography.tsx +31 -0
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.doc.mjs +19 -3
- package/assets/templates/blocks/components/Toolbar/ToolbarTableFilter.tsx +383 -65
- 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/codemod/type.ts +12 -0
- package/authoring/config/config.doc.mjs +10 -2
- package/authoring/config/debug-composition.test.mjs +92 -0
- package/authoring/config/parse.d.mts +15 -13
- package/authoring/config/parse.mjs +27 -8
- package/authoring/config/parse.test.mjs +8 -0
- package/authoring/config/type.ts +29 -6
- package/authoring/debug/debug.doc.d.mts +11 -0
- package/authoring/debug/debug.doc.mjs +182 -0
- package/authoring/debug/parse.d.mts +8 -8
- package/authoring/debug/parse.mjs +3 -3
- package/authoring/discover/discover.doc.d.mts +13 -0
- package/authoring/discover/discover.doc.mjs +138 -0
- package/authoring/discover/parse.d.mts +24 -0
- package/authoring/discover/parse.mjs +128 -0
- package/authoring/discover/parse.test.mjs +124 -0
- package/authoring/discover/type.ts +87 -0
- package/authoring/doctypes/_schema.d.mts +790 -23
- package/authoring/doctypes/_schema.mjs +543 -39
- package/authoring/doctypes/base/graph-fields.doc.d.mts +9 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +64 -0
- package/authoring/doctypes/base/type.ts +41 -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 +5 -4
- 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 +7 -2
- package/authoring/doctypes/function/parse.d.mts +2 -2
- package/authoring/doctypes/function/parse.mjs +1 -1
- package/authoring/doctypes/function/type.ts +9 -4
- 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 +233 -0
- package/authoring/doctypes/namespace/namespace.doc.d.mts +9 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +128 -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 +163 -0
- package/authoring/doctypes/namespace/type.ts +74 -0
- package/authoring/doctypes/parse.d.mts +22 -18
- package/authoring/doctypes/parse.mjs +22 -11
- 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 +48 -6
- package/authoring/doctypes/reference/type.ts +70 -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 +94 -1
- package/authoring/doctypes/template/parse.mjs +40 -2
- package/authoring/doctypes/template/parse.test.mjs +26 -2
- package/authoring/doctypes/template/template.doc.mjs +13 -3
- package/authoring/doctypes/template/type.ts +13 -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 +3 -0
- package/authoring/index.d.ts +62 -17
- package/authoring/index.mjs +4 -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 +19 -8
- 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.adaptations.test.mjs +100 -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 +16 -50
- 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 +16 -8
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +50 -0
- package/clients/cli/commands/build.mjs +137 -114
- package/clients/cli/commands/build.playbook.test.mjs +75 -0
- package/clients/cli/commands/build.text-fields.test.mjs +81 -0
- package/clients/cli/commands/component/index.mjs +3 -8
- package/clients/cli/commands/component-ownership.test.mjs +3 -3
- 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 +52 -5
- package/clients/cli/commands/discover.components-flag.test.mjs +97 -0
- package/clients/cli/commands/discover.doc.mjs +55 -9
- package/clients/cli/commands/discover.mjs +393 -118
- package/clients/cli/commands/discover.sources.test.mjs +267 -0
- package/clients/cli/commands/discover.text-projection.test.mjs +103 -0
- package/clients/cli/commands/docs.doc.mjs +28 -6
- package/clients/cli/commands/docs.mjs +240 -26
- package/clients/cli/commands/docs.test.mjs +193 -1
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +3 -3
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +15 -8
- 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 +90 -8
- package/clients/cli/commands/doctor.doc.mjs +1 -1
- package/clients/cli/commands/doctor.mjs +59 -32
- 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 +32 -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/integration.mjs +1 -0
- 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 +28 -9
- package/clients/cli/commands/search.test.mjs +75 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -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 +52 -13
- package/clients/cli/commands/template.flag-help.test.mjs +117 -0
- package/clients/cli/commands/template.mjs +4 -91
- package/clients/cli/commands/template.path-help.test.mjs +40 -0
- package/clients/cli/commands/text-json-parity.test.mjs +719 -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.behavior.test.mjs +4 -3
- 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 +22 -10
- package/clients/cli/commands/upgrade.file-protection.test.mjs +228 -0
- 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/commands/upgrade.mjs +29 -7
- package/clients/cli/formatters/index.mjs +164 -1
- package/clients/cli/formatters/index.test.mjs +97 -0
- package/clients/cli/index.mjs +21 -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 +37 -2
- package/clients/cli/lib/manifest.test.mjs +17 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +82 -12
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +266 -4
- package/foundation/agent-docs/agent-docs.test.mjs +19 -1
- package/foundation/config/integration-debug.test.mjs +28 -3
- package/foundation/config/project-themes.test.mjs +11 -19
- package/foundation/config/project.d.mts +20 -11
- package/foundation/config/project.mjs +263 -91
- package/foundation/config/project.test.mjs +270 -21
- package/foundation/discovery/authoring-self-docs.d.mts +87 -0
- package/foundation/discovery/authoring-self-docs.mjs +237 -0
- package/foundation/discovery/authoring-self-docs.test.mjs +170 -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 +119 -0
- package/foundation/discovery/cli-self-docs.mjs +490 -0
- package/foundation/discovery/cli-self-docs.test.mjs +375 -0
- package/foundation/discovery/component-discovery.d.mts +39 -1
- package/foundation/discovery/component-discovery.mjs +50 -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 +119 -11
- package/foundation/discovery/docs-discovery.mjs +423 -108
- package/foundation/discovery/docs-discovery.test.mjs +365 -20
- 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 +116 -0
- package/foundation/discovery/docs-section-key.mjs +322 -0
- package/foundation/discovery/docs-section-key.test.mjs +246 -0
- package/foundation/discovery/template-adapter.d.mts +113 -11
- 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 +774 -83
- package/foundation/discovery/template-adapter.test.mjs +57 -0
- package/foundation/discovery/template-conflict-release.d.mts +13 -0
- package/foundation/discovery/template-conflict-release.mjs +40 -0
- package/foundation/discovery/template-conflict-release.test.mjs +40 -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 +278 -0
- package/foundation/doc-compiler/bundle.test.mjs +266 -0
- package/foundation/doc-compiler/compile.d.mts +343 -0
- package/foundation/doc-compiler/compile.mjs +558 -0
- package/foundation/doc-compiler/diagnostics.d.mts +126 -0
- package/foundation/doc-compiler/diagnostics.mjs +305 -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 +291 -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 +471 -0
- package/foundation/doc-compiler/lenses.d.mts +36 -0
- package/foundation/doc-compiler/lenses.mjs +173 -0
- package/foundation/doc-compiler/links.d.mts +162 -0
- package/foundation/doc-compiler/links.mjs +294 -0
- package/foundation/doc-compiler/links.test.mjs +192 -0
- package/foundation/doc-compiler/lower-doc.test.mjs +495 -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 +127 -0
- package/foundation/doc-compiler/read.mjs +325 -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/doc-compiler/tree.d.mts +288 -0
- package/foundation/doc-compiler/tree.mjs +876 -0
- package/foundation/doc-compiler/tree.test.mjs +598 -0
- package/foundation/fs/file-protection.d.mts +33 -0
- package/foundation/fs/file-protection.mjs +825 -0
- package/foundation/fs/file-protection.test.mjs +250 -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/autolink.test.mjs +1 -1
- package/foundation/integrations/cli-requirement.d.mts +45 -0
- package/foundation/integrations/cli-requirement.mjs +154 -0
- package/foundation/integrations/cli-requirement.test.mjs +84 -0
- package/foundation/integrations/contribution-fixes.d.mts +145 -0
- package/foundation/integrations/contribution-fixes.mjs +1284 -0
- package/foundation/integrations/contribution-inventory.d.mts +3 -2
- package/foundation/integrations/contribution-inventory.mjs +27 -24
- package/foundation/integrations/contribution-inventory.test.mjs +86 -27
- package/foundation/integrations/integration-warnings.d.mts +9 -2
- package/foundation/integrations/integration-warnings.mjs +52 -21
- package/foundation/integrations/integration-warnings.test.mjs +74 -1
- package/foundation/integrations/integrations.d.mts +63 -3
- package/foundation/integrations/integrations.mjs +122 -9
- package/foundation/integrations/integrations.test.mjs +415 -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 +131 -29
- package/foundation/response/base.d.ts +8 -4
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.d.ts +2 -0
- package/foundation/response/error-codes.doc.mjs +13 -4
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +137 -10
- 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.d.mts +5 -1
- package/foundation/response/response-types.doc.mjs +41 -21
- package/foundation/response/response-types.doc.test.mjs +158 -0
- package/foundation/response/response.doc.mjs +1 -1
- package/foundation/text/string-utils.d.mts +8 -0
- package/foundation/text/string-utils.mjs +40 -10
- package/foundation/xle/expand.d.mts +2 -0
- package/foundation/xle/expand.mjs +4 -3
- package/foundation/xle/expand.test.mjs +54 -0
- package/foundation/xle/xle.test.mjs +13 -0
- package/package.json +10 -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
|
@@ -3,19 +3,37 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file docs command — Print Astryx reference docs
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* In text, every read is one level: a topic lists its sections, so a reader can
|
|
7
|
+
* open one section by its key, and `--full` prints the whole topic. `--json`
|
|
8
|
+
* keeps the docs() contract: a topic returns its whole doc, and `--index` its
|
|
9
|
+
* sections.
|
|
7
10
|
* Supports --detail (full|compact|brief) and --lang (en|zh|dense).
|
|
8
11
|
*
|
|
9
12
|
* Usage:
|
|
10
13
|
* astryx docs List available topics
|
|
11
|
-
* astryx docs <topic>
|
|
14
|
+
* astryx docs <topic> List the topic's sections (a topic
|
|
15
|
+
* with one section prints whole)
|
|
12
16
|
* astryx docs <topic> <section> Print one section
|
|
17
|
+
* astryx docs <topic> --full Print the whole topic
|
|
18
|
+
* astryx docs <route> Open a node of the docs tree, such as
|
|
19
|
+
* cli, cli/api, or cli/api/functions/search
|
|
13
20
|
*/
|
|
14
21
|
|
|
15
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
formatCliCommand,
|
|
24
|
+
getCliInvocation,
|
|
25
|
+
} from '../../../foundation/env/package-manager.mjs';
|
|
16
26
|
import {jsonOut} from '../../../foundation/response/json.mjs';
|
|
17
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
emit,
|
|
29
|
+
section,
|
|
30
|
+
records,
|
|
31
|
+
text,
|
|
32
|
+
code,
|
|
33
|
+
wrapText,
|
|
34
|
+
} from '../formatters/index.mjs';
|
|
18
35
|
import {cliError} from '../lib/cli-error.mjs';
|
|
36
|
+
import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
|
|
19
37
|
import {defineCommand} from '../lib/define-command.mjs';
|
|
20
38
|
import {resultSet} from '../../../foundation/debug/index.mjs';
|
|
21
39
|
import {docs as docsApi} from '../../../api/docs/docs.mjs';
|
|
@@ -80,10 +98,14 @@ function formatBlock(block, detail) {
|
|
|
80
98
|
return formatTable(block.headers, block.rows);
|
|
81
99
|
|
|
82
100
|
case 'list': {
|
|
83
|
-
const prefix =
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
101
|
+
const prefix =
|
|
102
|
+
block.style === 'ordered'
|
|
103
|
+
? (/** @type {number} */ i) => `${i + 1}. `
|
|
104
|
+
: block.style === 'dont'
|
|
105
|
+
? () => 'x '
|
|
106
|
+
: block.style === 'do'
|
|
107
|
+
? () => '+ '
|
|
108
|
+
: () => '- ';
|
|
87
109
|
return block.items.map((item, i) => `${prefix(i)}${item}`).join('\n');
|
|
88
110
|
}
|
|
89
111
|
|
|
@@ -93,7 +115,7 @@ function formatBlock(block, detail) {
|
|
|
93
115
|
}
|
|
94
116
|
|
|
95
117
|
/**
|
|
96
|
-
* @param {import('
|
|
118
|
+
* @param {import('../../../api/docs/docs.type.mjs').DocsReadSection} section
|
|
97
119
|
* @param {'full' | 'compact' | 'brief'} detail
|
|
98
120
|
* @returns {string}
|
|
99
121
|
*/
|
|
@@ -107,12 +129,13 @@ function formatSection(section, detail) {
|
|
|
107
129
|
return `${section.title}: ${first.split('\n')[0]}`;
|
|
108
130
|
}
|
|
109
131
|
|
|
110
|
-
const heading =
|
|
132
|
+
const heading =
|
|
133
|
+
detail === 'compact' ? `[${section.title}]` : `## ${section.title}`;
|
|
111
134
|
return `${heading}\n\n${blocks.join('\n\n')}`;
|
|
112
135
|
}
|
|
113
136
|
|
|
114
137
|
/**
|
|
115
|
-
* @param {import('
|
|
138
|
+
* @param {import('../../../api/docs/docs.type.mjs').DocsReadDoc} docs
|
|
116
139
|
* @param {'full' | 'compact' | 'brief'} detail
|
|
117
140
|
* @returns {string}
|
|
118
141
|
*/
|
|
@@ -123,22 +146,129 @@ function formatReferenceFull(docs, detail) {
|
|
|
123
146
|
return `${header}\n${sections.join('\n')}`;
|
|
124
147
|
}
|
|
125
148
|
|
|
126
|
-
const header =
|
|
127
|
-
|
|
128
|
-
|
|
149
|
+
const header =
|
|
150
|
+
detail === 'compact'
|
|
151
|
+
? `# ${docs.title}\n${docs.description}`
|
|
152
|
+
: `# ${docs.title}\n\n${docs.description}`;
|
|
129
153
|
const sections = docs.sections.map(s => formatSection(s, detail));
|
|
130
154
|
const sep = detail === 'compact' ? '\n\n' : '\n\n';
|
|
131
155
|
return `${header}\n\n${sections.join(sep)}`;
|
|
132
156
|
}
|
|
133
157
|
|
|
158
|
+
/**
|
|
159
|
+
* The moves a read offers (spec:AST-047), one runnable command per line: up to
|
|
160
|
+
* the level it sits in, the item before and after it, and the docs it names.
|
|
161
|
+
* @param {import('../../../api/docs/docs.type.mjs').DocsLinks | undefined} links
|
|
162
|
+
* @returns {string[]}
|
|
163
|
+
*/
|
|
164
|
+
function linkLines(links) {
|
|
165
|
+
if (!links) return [];
|
|
166
|
+
return [
|
|
167
|
+
`Up: ${formatCliCommand(links.up)}`,
|
|
168
|
+
...(links.previous ? [`Previous: ${formatCliCommand(links.previous)}`] : []),
|
|
169
|
+
...(links.next ? [`Next: ${formatCliCommand(links.next)}`] : []),
|
|
170
|
+
...(links.related ?? []).map(
|
|
171
|
+
(command, i) => `${i === 0 ? 'Related: ' : ' '}${formatCliCommand(command)}`,
|
|
172
|
+
),
|
|
173
|
+
];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* A topic's section index: what the topic is, one line per section with the
|
|
178
|
+
* key to read it by, and how to read further.
|
|
179
|
+
* @param {import('../../../api/docs/docs.type.mjs').DocsIndex} index
|
|
180
|
+
* @param {string} run
|
|
181
|
+
*/
|
|
182
|
+
function emitIndex(index, run) {
|
|
183
|
+
emit(
|
|
184
|
+
section(
|
|
185
|
+
index.title,
|
|
186
|
+
index.description ? wrapText(index.description) : undefined,
|
|
187
|
+
),
|
|
188
|
+
// Summaries wrap rather than being cut: the summary is how a reader picks
|
|
189
|
+
// the one section to open.
|
|
190
|
+
records(index.sections, {
|
|
191
|
+
fields: ['id', 'title', 'summary'],
|
|
192
|
+
layout: 'inline',
|
|
193
|
+
}),
|
|
194
|
+
text(
|
|
195
|
+
[
|
|
196
|
+
`Read one section: ${run} docs ${index.name} <section>`,
|
|
197
|
+
`Read everything: ${run} docs ${index.name} --full`,
|
|
198
|
+
...linkLines(index.links),
|
|
199
|
+
].join('\n'),
|
|
200
|
+
),
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* One child row of a namespace: its route name, then the doc's own title when
|
|
206
|
+
* it is not the route name (`assertResponse()`, `search()`), then its summary.
|
|
207
|
+
* @param {import('../../../api/docs/docs.type.mjs').DocsNodeChild} child
|
|
208
|
+
* @returns {{name: string, summary: string}}
|
|
209
|
+
*/
|
|
210
|
+
function childRow(child) {
|
|
211
|
+
return {
|
|
212
|
+
name: child.name,
|
|
213
|
+
summary:
|
|
214
|
+
child.title === child.name ? child.summary : `${child.title}: ${child.summary}`,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* One node of the docs tree. A namespace lists each slot's children, one level
|
|
220
|
+
* down, with the command to open one; a typed doc prints its content. Both end
|
|
221
|
+
* with the way back up.
|
|
222
|
+
* @param {import('../../../api/docs/docs.type.mjs').DocsNode} node
|
|
223
|
+
* @param {'full' | 'compact' | 'brief'} detail
|
|
224
|
+
* @param {string} run
|
|
225
|
+
*/
|
|
226
|
+
function emitNode(node, detail, run) {
|
|
227
|
+
if (node.kind === 'namespace') {
|
|
228
|
+
emit(
|
|
229
|
+
section(node.title, wrapText(node.summary)),
|
|
230
|
+
...node.slots.flatMap(slot => [
|
|
231
|
+
// A namespace with one slot titled like itself needs no second heading.
|
|
232
|
+
...(node.slots.length === 1 && slot.title === node.title
|
|
233
|
+
? []
|
|
234
|
+
: [section(slot.title)]),
|
|
235
|
+
records(slot.children.map(childRow), {
|
|
236
|
+
fields: ['name', 'summary'],
|
|
237
|
+
layout: 'inline',
|
|
238
|
+
overflow: 'truncate',
|
|
239
|
+
}),
|
|
240
|
+
]),
|
|
241
|
+
text(
|
|
242
|
+
[
|
|
243
|
+
// A child's route is its parent's route and its name, except a flat
|
|
244
|
+
// topic in the Unorganized level, which keeps its own name.
|
|
245
|
+
node.slots.every(slot =>
|
|
246
|
+
slot.children.every(child => child.route.startsWith(`${node.route}/`)),
|
|
247
|
+
)
|
|
248
|
+
? `Open one: ${run} docs ${node.route}/<name>`
|
|
249
|
+
: `Open one: ${run} docs <name>`,
|
|
250
|
+
...linkLines(node.links),
|
|
251
|
+
].join('\n'),
|
|
252
|
+
),
|
|
253
|
+
);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
emit(
|
|
257
|
+
code(formatSection({title: node.title, content: node.content}, detail)),
|
|
258
|
+
text(linkLines(node.links).join('\n')),
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
134
262
|
/**
|
|
135
263
|
* What the run answered with. A named topic (or one of its sections) resolves
|
|
136
264
|
* or throws, so it is always a direct match of one doc; the bare form lists
|
|
137
265
|
* every topic there is.
|
|
138
266
|
*
|
|
139
267
|
* @param {import('../../../api/docs/docs.type.mjs').DocsListResponse
|
|
268
|
+
* | import('../../../api/docs/docs.type.mjs').DocsIndexResponse
|
|
140
269
|
* | import('../../../api/docs/docs.type.mjs').DocsDetailResponse
|
|
141
|
-
* | import('../../../api/docs/docs.type.mjs').DocsDetailSectionResponse
|
|
270
|
+
* | import('../../../api/docs/docs.type.mjs').DocsDetailSectionResponse
|
|
271
|
+
* | import('../../../api/docs/docs.type.mjs').DocsNodeResponse} result
|
|
142
272
|
* @returns {import('../../../foundation/debug/command-result.mjs').CommandResult}
|
|
143
273
|
*/
|
|
144
274
|
function summarize(result) {
|
|
@@ -155,7 +285,11 @@ function summarize(result) {
|
|
|
155
285
|
export function registerDocs(program) {
|
|
156
286
|
defineCommand(program, docsCommand, {
|
|
157
287
|
fn: docsFn,
|
|
158
|
-
action: async (
|
|
288
|
+
action: async (
|
|
289
|
+
/** @type {string | undefined} */ topic,
|
|
290
|
+
/** @type {string | undefined} */ sectionName,
|
|
291
|
+
/** @type {{index?: boolean, full?: boolean}} */ options = {},
|
|
292
|
+
) => {
|
|
159
293
|
const run = getCliInvocation();
|
|
160
294
|
const lang = program.opts().lang || null;
|
|
161
295
|
const zh = program.opts().zh || false;
|
|
@@ -163,13 +297,42 @@ export function registerDocs(program) {
|
|
|
163
297
|
const detail = program.opts().detail || 'full';
|
|
164
298
|
const json = program.opts().json || false;
|
|
165
299
|
|
|
300
|
+
if (options.index && options.full) {
|
|
301
|
+
return cliError(
|
|
302
|
+
'Ask for the section list or the whole topic, not both: --index and --full cannot both be set.',
|
|
303
|
+
{code: ERROR_CODES.ERR_INVALID_ARGUMENT},
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
// Text reads one level: a topic lists its sections (one with a single
|
|
307
|
+
// section prints whole). JSON keeps docs(): the whole topic unless
|
|
308
|
+
// --index. The dense variant is written to be read whole.
|
|
309
|
+
const listSections =
|
|
310
|
+
Boolean(options.index) ||
|
|
311
|
+
(!json &&
|
|
312
|
+
!options.full &&
|
|
313
|
+
!dense &&
|
|
314
|
+
lang !== 'dense' &&
|
|
315
|
+
sectionName == null);
|
|
166
316
|
let result;
|
|
167
317
|
try {
|
|
168
|
-
result = await docsApi(topic, sectionName, {
|
|
318
|
+
result = await docsApi(topic, sectionName, {
|
|
319
|
+
lang,
|
|
320
|
+
zh,
|
|
321
|
+
dense,
|
|
322
|
+
index: listSections,
|
|
323
|
+
});
|
|
324
|
+
if (
|
|
325
|
+
!options.index &&
|
|
326
|
+
result.type === 'docs.index' &&
|
|
327
|
+
result.data.sections.length <= 1
|
|
328
|
+
) {
|
|
329
|
+
result = await docsApi(topic, sectionName, {lang, zh, dense});
|
|
330
|
+
}
|
|
169
331
|
} catch (e) {
|
|
170
332
|
// docs API throws structured errors with {name, reason} suggestions —
|
|
171
333
|
// pass them through untouched so the CLI envelope matches the API.
|
|
172
|
-
const err =
|
|
334
|
+
const err =
|
|
335
|
+
/** @type {import('../../../api/error.mjs').AstryxError} */ (e);
|
|
173
336
|
return cliError(err.message, {
|
|
174
337
|
suggestions: err.suggestions || [],
|
|
175
338
|
code: err.code,
|
|
@@ -184,28 +347,79 @@ export function registerDocs(program) {
|
|
|
184
347
|
|
|
185
348
|
switch (result.type) {
|
|
186
349
|
case 'docs.list': {
|
|
187
|
-
// The text view mirrors the JSON list
|
|
188
|
-
//
|
|
350
|
+
// The text view mirrors the JSON list, with the docs tree's
|
|
351
|
+
// namespaces (`meta.namespaces`) first under their own heading: that
|
|
352
|
+
// is where the CLI's own docs start, and a namespace reads
|
|
353
|
+
// differently from a topic.
|
|
354
|
+
const namespaces = result.meta?.namespaces ?? [];
|
|
355
|
+
const topics = result.data;
|
|
189
356
|
emit(
|
|
190
|
-
|
|
191
|
-
|
|
357
|
+
...(namespaces.length > 0
|
|
358
|
+
? [
|
|
359
|
+
section('Docs tree'),
|
|
360
|
+
records(namespaces, {
|
|
361
|
+
fields: ['topic', 'description', 'package'],
|
|
362
|
+
layout: 'inline',
|
|
363
|
+
}),
|
|
364
|
+
]
|
|
365
|
+
: []),
|
|
366
|
+
section('Topics'),
|
|
367
|
+
records(topics, {
|
|
368
|
+
fields: ['topic', 'description', 'package'],
|
|
369
|
+
layout: 'inline',
|
|
370
|
+
}),
|
|
192
371
|
text(
|
|
193
372
|
[
|
|
194
|
-
`Usage: ${run} docs <topic
|
|
195
|
-
` ${run} docs <topic> <section
|
|
373
|
+
`Usage: ${run} docs <topic> list a topic's sections`,
|
|
374
|
+
` ${run} docs <topic> <section> read one section`,
|
|
375
|
+
` ${run} docs <topic> --full read the whole topic`,
|
|
376
|
+
` ${run} docs cli/api go down the docs tree one level at a time`,
|
|
377
|
+
`With --json, a topic returns its whole doc; add --index for its section list.`,
|
|
196
378
|
].join('\n'),
|
|
197
379
|
),
|
|
380
|
+
// A package whose doc files did not load has no topics here; say
|
|
381
|
+
// so, and where to look, instead of leaving them silently missing.
|
|
382
|
+
...(result.meta?.notLoaded?.length
|
|
383
|
+
? [
|
|
384
|
+
section('Not loaded'),
|
|
385
|
+
records(result.meta.notLoaded, {
|
|
386
|
+
fields: ['package', 'message'],
|
|
387
|
+
layout: 'inline',
|
|
388
|
+
}),
|
|
389
|
+
text(
|
|
390
|
+
`Run \`${run} doctor integration docs\` in that package to see every problem.`,
|
|
391
|
+
),
|
|
392
|
+
]
|
|
393
|
+
: []),
|
|
198
394
|
);
|
|
199
395
|
break;
|
|
200
396
|
}
|
|
201
397
|
|
|
398
|
+
case 'docs.index': {
|
|
399
|
+
emitIndex(result.data, run);
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
|
|
202
403
|
case 'docs.detail': {
|
|
203
|
-
emit(
|
|
404
|
+
emit(
|
|
405
|
+
code(formatReferenceFull(result.data, detail)),
|
|
406
|
+
text(linkLines(result.data.links).join('\n')),
|
|
407
|
+
);
|
|
204
408
|
break;
|
|
205
409
|
}
|
|
206
410
|
|
|
207
411
|
case 'docs.detail.section': {
|
|
208
|
-
|
|
412
|
+
// One section ends with its moves: up to its topic's index, and to
|
|
413
|
+
// the sections before and after it.
|
|
414
|
+
emit(
|
|
415
|
+
code(formatSection(result.data, detail)),
|
|
416
|
+
text(linkLines(result.data.links).join('\n')),
|
|
417
|
+
);
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
case 'docs.node': {
|
|
422
|
+
emitNode(result.data, detail, run);
|
|
209
423
|
break;
|
|
210
424
|
}
|
|
211
425
|
}
|
|
@@ -6,6 +6,8 @@ import * as path from 'node:path';
|
|
|
6
6
|
import * as os from 'node:os';
|
|
7
7
|
import {Command} from 'commander';
|
|
8
8
|
import {registerDocs} from './docs.mjs';
|
|
9
|
+
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
10
|
+
import {displayWidth} from '../formatters/index.mjs';
|
|
9
11
|
|
|
10
12
|
let tmpDir;
|
|
11
13
|
|
|
@@ -73,7 +75,7 @@ describe('hyphenated doc filenames', () => {
|
|
|
73
75
|
|
|
74
76
|
it('returns docs.detail via API for hyphenated topic', async () => {
|
|
75
77
|
const {docs: docsApi} = await import('../../../api/docs/docs.mjs');
|
|
76
|
-
const result = await docsApi('getting-started');
|
|
78
|
+
const result = await docsApi('getting-started', undefined, {full: true});
|
|
77
79
|
expect(result.type).toBe('docs.detail');
|
|
78
80
|
expect(result.data).toBeDefined();
|
|
79
81
|
expect(result.data.description).toBeDefined();
|
|
@@ -100,3 +102,193 @@ describe('migration docs', () => {
|
|
|
100
102
|
expect(output).toContain('Map shadcn and Radix Primitives');
|
|
101
103
|
});
|
|
102
104
|
});
|
|
105
|
+
|
|
106
|
+
describe('progressive reads', () => {
|
|
107
|
+
const SLOW = 60_000;
|
|
108
|
+
/** @param {string} out */
|
|
109
|
+
const widest = out => Math.max(...out.split('\n').map(line => line.length));
|
|
110
|
+
|
|
111
|
+
it('lists every topic on one line each', async () => {
|
|
112
|
+
const {status, stdout} = await runCli(['docs']);
|
|
113
|
+
expect(status).toBe(0);
|
|
114
|
+
expect(stdout).toMatch(/^principles +\S/m);
|
|
115
|
+
expect(widest(stdout)).toBeLessThanOrEqual(120);
|
|
116
|
+
expect(stdout).toContain('Usage: pnpm exec astryx docs <topic>');
|
|
117
|
+
}, SLOW);
|
|
118
|
+
|
|
119
|
+
it("prints a topic's section index with the keys to read by", async () => {
|
|
120
|
+
const {status, stdout} = await runCli(['docs', 'theme', '--index']);
|
|
121
|
+
expect(status).toBe(0);
|
|
122
|
+
expect(stdout).toMatch(/^quick-start +Quick Start/m);
|
|
123
|
+
expect(stdout).toContain('docs theme <section>');
|
|
124
|
+
expect(stdout).toMatch(/Read everything: +\S.* docs theme --full$/m);
|
|
125
|
+
expect(widest(stdout)).toBeLessThanOrEqual(120);
|
|
126
|
+
}, SLOW);
|
|
127
|
+
|
|
128
|
+
it('prints one section by its key', async () => {
|
|
129
|
+
const {status, stdout} = await runCli(['docs', 'theme', 'quick-start']);
|
|
130
|
+
expect(status).toBe(0);
|
|
131
|
+
expect(stdout).toMatch(/^## Quick Start/m);
|
|
132
|
+
}, SLOW);
|
|
133
|
+
|
|
134
|
+
it("lists a topic's sections by default; --full prints the whole topic", async () => {
|
|
135
|
+
const index = await runCli(['docs', 'theme', '--index']);
|
|
136
|
+
expect((await runCli(['docs', 'theme'])).stdout).toBe(index.stdout);
|
|
137
|
+
const full = await runCli(['docs', 'theme', '--full']);
|
|
138
|
+
expect(full.status).toBe(0);
|
|
139
|
+
expect(full.stdout).toMatch(/^## Quick Start/m);
|
|
140
|
+
expect(full.stdout.length).toBeGreaterThan(index.stdout.length * 3);
|
|
141
|
+
expect((await runCli(['--detail', 'full', 'docs', 'theme', '--full'])).stdout).toBe(
|
|
142
|
+
full.stdout,
|
|
143
|
+
);
|
|
144
|
+
}, SLOW);
|
|
145
|
+
|
|
146
|
+
it('returns the matching envelopes as JSON', async () => {
|
|
147
|
+
const envelope = async args => JSON.parse((await runCli([...args, '--json'])).stdout);
|
|
148
|
+
// JSON keeps docs(): a bare read is the whole topic.
|
|
149
|
+
expect((await envelope(['docs', 'theme'])).type).toBe('docs.detail');
|
|
150
|
+
expect((await envelope(['docs', 'theme', '--full'])).type).toBe('docs.detail');
|
|
151
|
+
expect((await envelope(['docs', 'theme', '--index'])).type).toBe(
|
|
152
|
+
'docs.index',
|
|
153
|
+
);
|
|
154
|
+
expect((await envelope(['docs', 'theme', 'quick-start'])).type).toBe(
|
|
155
|
+
'docs.detail.section',
|
|
156
|
+
);
|
|
157
|
+
}, SLOW);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe('the docs tree, one level at a time', () => {
|
|
161
|
+
const SLOW = 60_000;
|
|
162
|
+
/** @param {string} out */
|
|
163
|
+
const widest = out => Math.max(...out.split('\n').map(line => line.length));
|
|
164
|
+
|
|
165
|
+
it('lists the docs tree first, under its own heading, then the topics', async () => {
|
|
166
|
+
const {status, stdout} = await runCli(['docs']);
|
|
167
|
+
expect(status).toBe(0);
|
|
168
|
+
expect(stdout).toMatch(/^Docs tree$/m);
|
|
169
|
+
expect(stdout).toMatch(/^Topics$/m);
|
|
170
|
+
expect(stdout).toMatch(/^cli +Commands, programmatic APIs/m);
|
|
171
|
+
expect(stdout.indexOf('\ncli ')).toBeLessThan(stdout.indexOf('\nprinciples '));
|
|
172
|
+
expect(stdout).not.toMatch(/^cli-integrations /m);
|
|
173
|
+
}, SLOW);
|
|
174
|
+
|
|
175
|
+
it("shows a child's own name when its route name does not spell it", async () => {
|
|
176
|
+
const {status, stdout} = await runCli(['docs', 'cli/api/functions']);
|
|
177
|
+
expect(status).toBe(0);
|
|
178
|
+
expect(stdout).toMatch(/^assert-response +assertResponse\(\): \S/m);
|
|
179
|
+
expect(stdout).toMatch(/^search +search\(\): Unified ranked search/m);
|
|
180
|
+
}, SLOW);
|
|
181
|
+
|
|
182
|
+
it('prints a namespace: each slot, its children, and how to go down and up', async () => {
|
|
183
|
+
const {status, stdout} = await runCli(['docs', 'cli/api']);
|
|
184
|
+
expect(status).toBe(0);
|
|
185
|
+
expect(stdout).toMatch(/^API$/m);
|
|
186
|
+
expect(stdout).toMatch(/^Reference$/m);
|
|
187
|
+
expect(stdout).toMatch(/^functions +Functions: Every function/m);
|
|
188
|
+
expect(stdout).toMatch(/^schemas +/m);
|
|
189
|
+
expect(stdout).toMatch(/^enums +/m);
|
|
190
|
+
// One level only: no function is listed on the api page.
|
|
191
|
+
expect(stdout).not.toMatch(/^search +/m);
|
|
192
|
+
expect(stdout).toMatch(/Open one: .*docs cli\/api\/<name>$/m);
|
|
193
|
+
expect(stdout).toMatch(/Up: .*docs cli$/m);
|
|
194
|
+
expect(widest(stdout)).toBeLessThanOrEqual(120);
|
|
195
|
+
}, SLOW);
|
|
196
|
+
|
|
197
|
+
it('prints a typed doc and the way back up', async () => {
|
|
198
|
+
const {status, stdout} = await runCli(['docs', 'cli/api/functions/search']);
|
|
199
|
+
expect(status).toBe(0);
|
|
200
|
+
expect(stdout).toMatch(/^## search\(\)/m);
|
|
201
|
+
expect(stdout).toContain('Read it with `astryx docs cli/commands/search`.');
|
|
202
|
+
expect(stdout).toMatch(/Up: .*docs cli\/api\/functions$/m);
|
|
203
|
+
}, SLOW);
|
|
204
|
+
|
|
205
|
+
it('reads the dense variant whole, asked with --dense or with --lang dense', async () => {
|
|
206
|
+
for (const args of [['--dense', 'docs', 'theme'], ['--lang', 'dense', 'docs', 'theme']]) {
|
|
207
|
+
const {status, stdout} = await runCli(args);
|
|
208
|
+
expect(status).toBe(0);
|
|
209
|
+
expect(stdout).not.toContain('Read one section:');
|
|
210
|
+
}
|
|
211
|
+
}, SLOW);
|
|
212
|
+
|
|
213
|
+
it('refuses --index with --full', async () => {
|
|
214
|
+
const both = await runCli(['docs', 'theme', '--index', '--full', '--json']);
|
|
215
|
+
expect(both.status).toBe(1);
|
|
216
|
+
expect(JSON.parse(both.stdout).code).toBe('ERR_INVALID_ARGUMENT');
|
|
217
|
+
}, SLOW);
|
|
218
|
+
|
|
219
|
+
it('reads the integration guide by its route, and not by its old name', async () => {
|
|
220
|
+
const guide = await runCli(['docs', 'cli/integrations', '--index']);
|
|
221
|
+
expect(guide.status).toBe(0);
|
|
222
|
+
expect(guide.stdout).toMatch(/Read one section: .*docs cli\/integrations <section>/);
|
|
223
|
+
// A bare read is one level too: the sections, and how to read it all.
|
|
224
|
+
const bare = await runCli(['docs', 'cli/integrations']);
|
|
225
|
+
expect(bare.status).toBe(0);
|
|
226
|
+
expect(bare.stdout).toBe(guide.stdout);
|
|
227
|
+
expect(bare.stdout).toMatch(/Read everything: +.*docs cli\/integrations --full$/m);
|
|
228
|
+
const one = await runCli(['docs', 'cli/integrations', 'codemods']);
|
|
229
|
+
expect(one.status).toBe(0);
|
|
230
|
+
expect(one.stdout).toMatch(/^## Codemods$/m);
|
|
231
|
+
expect(one.stdout).toMatch(/^Up: .*docs cli\/integrations --index$/m);
|
|
232
|
+
expect(one.stdout).toMatch(/^Previous: .*docs cli\/integrations agent-docs$/m);
|
|
233
|
+
expect(one.stdout).toMatch(/^Next: .*docs cli\/integrations recording-runs$/m);
|
|
234
|
+
const full = await runCli(['docs', 'cli/integrations', '--full']);
|
|
235
|
+
expect(full.status).toBe(0);
|
|
236
|
+
expect(full.stdout).toMatch(/^## Overview$/m);
|
|
237
|
+
expect(full.stdout.length).toBeGreaterThan(bare.stdout.length * 4);
|
|
238
|
+
const old = await runCli(['docs', 'cli-integrations']);
|
|
239
|
+
expect(old.status).toBe(1);
|
|
240
|
+
expect(old.stderr).toContain('Unknown topic "cli-integrations"');
|
|
241
|
+
}, SLOW);
|
|
242
|
+
|
|
243
|
+
it('returns docs.node as JSON, and fails a section of a namespace', async () => {
|
|
244
|
+
const node = JSON.parse((await runCli(['docs', 'cli', '--json'])).stdout);
|
|
245
|
+
expect(node).toMatchObject({
|
|
246
|
+
type: 'docs.node',
|
|
247
|
+
data: {route: 'cli', kind: 'namespace', breadcrumb: []},
|
|
248
|
+
});
|
|
249
|
+
expect(node.data.slots.map(slot => slot.name)).toEqual(['guides', 'reference']);
|
|
250
|
+
const section = await runCli(['docs', 'cli', 'commands', '--json']);
|
|
251
|
+
expect(section.status).toBe(1);
|
|
252
|
+
const error = JSON.parse(section.stdout);
|
|
253
|
+
expect(error).toMatchObject({code: 'ERR_UNKNOWN_SECTION'});
|
|
254
|
+
expect(error.suggestions.map(s => s.name)).toEqual([
|
|
255
|
+
'cli/integrations',
|
|
256
|
+
'cli/writing-docs',
|
|
257
|
+
'cli/commands',
|
|
258
|
+
'cli/api',
|
|
259
|
+
]);
|
|
260
|
+
}, SLOW);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
describe('text width in every language', () => {
|
|
264
|
+
const SLOW = 60_000;
|
|
265
|
+
/** Widest line outside code blocks, in terminal columns. */
|
|
266
|
+
const widest = out => {
|
|
267
|
+
let inCode = false;
|
|
268
|
+
let max = 0;
|
|
269
|
+
for (const line of out.split('\n')) {
|
|
270
|
+
if (/^\s*```/.test(line)) {
|
|
271
|
+
inCode = !inCode;
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
// A single unbreakable token (a long URL) cannot wrap without breaking it.
|
|
275
|
+
const oneToken = !/\s/.test(line.trim());
|
|
276
|
+
if (!inCode && !line.startsWith('#') && !oneToken) {
|
|
277
|
+
max = Math.max(max, displayWidth(line));
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return max;
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
it('keeps the additive section index within 120 columns', async () => {
|
|
284
|
+
const {status, stdout} = await runCli([
|
|
285
|
+
'docs',
|
|
286
|
+
'theme',
|
|
287
|
+
'--index',
|
|
288
|
+
'--lang',
|
|
289
|
+
'zh',
|
|
290
|
+
]);
|
|
291
|
+
expect(status).toBe(0);
|
|
292
|
+
expect(widest(stdout)).toBeLessThanOrEqual(120);
|
|
293
|
+
}, SLOW);
|
|
294
|
+
});
|
|
@@ -7,7 +7,7 @@ export const doc = {
|
|
|
7
7
|
type: 'command',
|
|
8
8
|
name: 'doctor integration components',
|
|
9
9
|
displayName: 'astryx doctor integration components',
|
|
10
|
-
namespace: 'cli',
|
|
10
|
+
namespace: 'cli/commands',
|
|
11
11
|
summary: 'Warn when integration component names conflict with Core',
|
|
12
12
|
description:
|
|
13
13
|
'Compares one local or installed integration with Core component names. A ' +
|
|
@@ -7,8 +7,8 @@ export const doc = {
|
|
|
7
7
|
type: 'command',
|
|
8
8
|
name: 'doctor integration docs',
|
|
9
9
|
displayName: 'astryx doctor integration docs',
|
|
10
|
-
namespace: 'cli',
|
|
11
|
-
summary: '
|
|
10
|
+
namespace: 'cli/commands',
|
|
11
|
+
summary: 'Check an integration\'s docs: the docs tree they add, every link, and overlaps with Core topics',
|
|
12
12
|
description:
|
|
13
13
|
'Reports intentional Core topic replacements and extensions as information. ' +
|
|
14
14
|
'A same-name topic without `replaces` or `extends` is an accidental conflict ' +
|
|
@@ -32,7 +32,7 @@ export const doc = {
|
|
|
32
32
|
],
|
|
33
33
|
exitCodes: [
|
|
34
34
|
{code: 0, when: 'all Core overlaps are explicitly declared or no overlap exists'},
|
|
35
|
-
{code: 1, when: 'an overlap is accidental or
|
|
35
|
+
{code: 1, when: 'an overlap is accidental, a doc is invalid, a namespace or placement fails, or a reference block cannot include what it names. A link that names no doc is a warning, and does not change the exit code'},
|
|
36
36
|
],
|
|
37
37
|
related: ['doctor integration validate', 'docs'],
|
|
38
38
|
};
|
|
@@ -9,13 +9,14 @@ export const doc = {
|
|
|
9
9
|
type: 'command',
|
|
10
10
|
name: 'doctor integration templates',
|
|
11
11
|
displayName: 'astryx doctor integration templates',
|
|
12
|
-
namespace: 'cli',
|
|
13
|
-
summary: '
|
|
12
|
+
namespace: 'cli/commands',
|
|
13
|
+
summary: 'Validate integration template replacements and Core id overlaps',
|
|
14
14
|
description:
|
|
15
|
-
'
|
|
16
|
-
'block template ids.
|
|
17
|
-
'
|
|
18
|
-
'
|
|
15
|
+
'Validates one local or installed integration against the built-in Core page ' +
|
|
16
|
+
'and block template ids. Intentional replacements are informational and name ' +
|
|
17
|
+
'the command for selecting the Core original. Missing targets, ambiguous ' +
|
|
18
|
+
'replacements, and invalid declarations are errors; undeclared same-id overlaps ' +
|
|
19
|
+
'remain warnings that require package selection.',
|
|
19
20
|
fn: 'integrationTemplateConflicts',
|
|
20
21
|
args: [
|
|
21
22
|
{
|
|
@@ -37,8 +38,14 @@ export const doc = {
|
|
|
37
38
|
},
|
|
38
39
|
],
|
|
39
40
|
exitCodes: [
|
|
40
|
-
{
|
|
41
|
-
|
|
41
|
+
{
|
|
42
|
+
code: 0,
|
|
43
|
+
when: 'replacement declarations are valid; undeclared id conflicts are warnings',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
code: 1,
|
|
47
|
+
when: 'the integration, a template, or a replacement declaration is invalid',
|
|
48
|
+
},
|
|
42
49
|
],
|
|
43
50
|
related: ['doctor integration validate', 'template'],
|
|
44
51
|
};
|
|
@@ -9,7 +9,7 @@ export const doc = {
|
|
|
9
9
|
type: 'command',
|
|
10
10
|
name: 'doctor integration validate',
|
|
11
11
|
displayName: 'astryx doctor integration validate',
|
|
12
|
-
namespace: 'cli',
|
|
12
|
+
namespace: 'cli/commands',
|
|
13
13
|
summary: 'Validate an integration manifest and its contributions',
|
|
14
14
|
description:
|
|
15
15
|
'Validates one integration at a time: the local package rooted at cwd, or an ' +
|
|
@@ -9,7 +9,7 @@ export const doc = {
|
|
|
9
9
|
type: 'command',
|
|
10
10
|
name: 'doctor integration',
|
|
11
11
|
displayName: 'astryx doctor integration',
|
|
12
|
-
namespace: 'cli',
|
|
12
|
+
namespace: 'cli/commands',
|
|
13
13
|
summary: 'Check an integration package while authoring it',
|
|
14
14
|
description:
|
|
15
15
|
'The integration-authoring diagnostics group. Validate a manifest and all ' +
|