@astryxdesign/cli 0.6.3 → 0.6.4-canary.078fd25
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 +152 -107
- 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 +22 -10
- package/api/build/build.test.mjs +219 -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 +208 -53
- 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 +31 -12
- package/api/component/_adapter.mjs +79 -15
- package/api/component/component.d.mts +6 -3
- package/api/component/component.doc.mjs +49 -19
- package/api/component/component.mjs +339 -22
- package/api/component/component.test.mjs +38 -0
- package/api/component/component.type.d.mts +47 -11
- package/api/component/component.type.mjs +76 -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 +277 -41
- package/api/docs/_adapter.mjs +993 -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/docOverlays.test.mjs +27 -1
- 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.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/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 +104 -1
- package/api/doctor/doctor.doc.mjs +18 -8
- package/api/doctor/doctor.mjs +635 -7
- package/api/doctor/doctor.test.mjs +732 -11
- package/api/doctor/doctor.type.d.mts +1 -1
- package/api/doctor/doctor.type.mjs +1 -1
- package/api/gap-report/gap-report.doc.mjs +27 -14
- package/api/hook/_adapter.mjs +19 -5
- package/api/hook/hook.doc.mjs +7 -3
- 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 +2 -1
- package/api/index.mjs +6 -3
- package/api/init/init.doc.mjs +22 -12
- 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 +56 -65
- package/api/integration/add-theme.test.mjs +139 -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 +5 -4
- package/api/integration/integrationTemplateConflicts.doc.d.mts +3 -0
- package/api/integration/integrationTemplateConflicts.doc.mjs +4 -0
- package/api/integration/pack-check.lifecycle-output.test.mjs +107 -0
- package/api/integration/pack-check.mjs +160 -11
- package/api/integration/pack-check.test.mjs +477 -47
- package/api/integration/pack-check.type.d.mts +26 -2
- package/api/integration/pack-check.type.mjs +15 -2
- 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 +2 -1
- package/api/json/envelope-types.test.mjs +76 -0
- package/api/json/index.ts +2 -0
- package/api/json/isError.doc.mjs +2 -1
- 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 +89 -12
- package/api/search/search.doc.mjs +8 -2
- package/api/search/search.mjs +697 -97
- 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 +8 -5
- package/api/swizzle/swizzle.type.d.mts +2 -2
- package/api/swizzle/swizzle.type.mjs +2 -2
- package/api/template/copy/copy.mjs +18 -24
- package/api/template/copy/copy.test.mjs +26 -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 +32 -9
- 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 +2 -2
- 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 +12 -12
- package/api/theme/themeBuild.doc.mjs +21 -17
- package/api/theme/themeList.doc.mjs +6 -3
- package/api/theme/themeListAvailable.doc.mjs +6 -3
- package/api/theme/themePaletteGenerate.doc.mjs +16 -8
- package/api/theme/themeTargets.doc.mjs +4 -2
- package/api/theme/themeTemplate.doc.mjs +8 -3
- 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/files-changed.test.mjs +111 -0
- package/api/upgrade/run/run.mjs +358 -59
- package/api/upgrade/status/status.mjs +2 -2
- package/api/upgrade/upgrade.doc.mjs +32 -23
- package/api/upgrade/upgrade.type.d.mts +43 -5
- package/api/upgrade/upgrade.type.mjs +29 -13
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/__tests__/runner.test.mjs +332 -8
- package/assets/codemods/file-count.test.mjs +163 -0
- package/assets/codemods/integration-discovery.mjs +48 -4
- package/assets/codemods/integration-discovery.test.mjs +73 -0
- package/assets/codemods/integration-runner.mjs +59 -7
- 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 +353 -104
- 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 +12 -1
- package/assets/docs/authoring.doc.mjs +14 -0
- package/assets/docs/browser-support.doc.mjs +11 -11
- package/assets/docs/color.doc.mjs +8 -2
- package/assets/docs/elevation.doc.mjs +6 -4
- package/assets/docs/getting-started.doc.mjs +6 -17
- package/assets/docs/icons.doc.mjs +2 -21
- package/assets/docs/illustrations.doc.mjs +7 -15
- package/assets/docs/internationalization.doc.mjs +7 -5
- package/assets/docs/layout.doc.dense.mjs +132 -84
- package/assets/docs/layout.doc.mjs +134 -78
- package/assets/docs/migration.doc.mjs +19 -21
- package/assets/docs/motion.doc.mjs +16 -3
- package/assets/docs/principles.doc.dense.mjs +5 -5
- package/assets/docs/principles.doc.mjs +14 -6
- package/assets/docs/principles.doc.zh.mjs +6 -6
- package/assets/docs/shape.doc.mjs +8 -3
- package/assets/docs/spacing.doc.mjs +7 -2
- package/assets/docs/styling-libraries.doc.mjs +10 -6
- package/assets/docs/styling.doc.mjs +22 -26
- package/assets/docs/theme.doc.dense.mjs +58 -18
- package/assets/docs/theme.doc.mjs +60 -50
- package/assets/docs/theme.doc.zh.mjs +9 -8
- package/assets/docs/tokens.doc.dense.mjs +2 -2
- package/assets/docs/tokens.doc.mjs +390 -9
- package/assets/docs/tokens.doc.zh.mjs +2 -2
- package/assets/docs/tree/add-a-component.doc.mjs +75 -0
- package/assets/docs/tree/add-a-theme.doc.mjs +85 -0
- package/assets/docs/tree/add-a-topic.doc.mjs +144 -0
- package/assets/docs/tree/agent-guidance.doc.mjs +138 -0
- package/assets/docs/tree/api.doc.mjs +30 -0
- package/assets/docs/tree/block-template.doc.mjs +130 -0
- package/assets/docs/tree/build-the-template.doc.mjs +28 -0
- package/assets/docs/tree/building-blocks.doc.mjs +46 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +137 -0
- package/assets/docs/tree/checks.doc.mjs +119 -0
- package/assets/docs/tree/cli.doc.mjs +23 -0
- package/assets/docs/tree/codemods.doc.mjs +147 -0
- package/assets/docs/tree/commands.doc.mjs +25 -0
- package/assets/docs/tree/component-family.doc.mjs +113 -0
- package/assets/docs/tree/component-imports.doc.mjs +69 -0
- package/assets/docs/tree/component-lookups.doc.mjs +149 -0
- package/assets/docs/tree/components.doc.mjs +23 -0
- package/assets/docs/tree/configuration.doc.mjs +23 -0
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +182 -0
- package/assets/docs/tree/define-the-theme.doc.mjs +118 -0
- package/assets/docs/tree/describe-the-component.doc.mjs +57 -0
- package/assets/docs/tree/docs.doc.mjs +21 -0
- package/assets/docs/tree/document-the-template.doc.mjs +28 -0
- package/assets/docs/tree/document-the-theme.doc.mjs +68 -0
- package/assets/docs/tree/export-template-assets.doc.mjs +147 -0
- package/assets/docs/tree/extend-or-replace.doc.mjs +103 -0
- package/assets/docs/tree/fonts-and-assets.doc.mjs +106 -0
- package/assets/docs/tree/generate-a-palette.doc.mjs +66 -0
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +105 -0
- package/assets/docs/tree/help.doc.mjs +16 -0
- package/assets/docs/tree/integrations.doc.mjs +40 -0
- package/assets/docs/tree/links.doc.mjs +98 -0
- package/assets/docs/tree/package-and-test.doc.mjs +32 -0
- package/assets/docs/tree/page-template.doc.mjs +71 -0
- package/assets/docs/tree/publishing.doc.mjs +111 -0
- package/assets/docs/tree/quick-start.doc.mjs +272 -0
- package/assets/docs/tree/replace-a-core-component.doc.mjs +104 -0
- package/assets/docs/tree/replace-a-core-template.doc.mjs +172 -0
- package/assets/docs/tree/sections-and-placement.doc.mjs +108 -0
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +59 -0
- package/assets/docs/tree/ship.doc.mjs +16 -0
- package/assets/docs/tree/short-and-findable.doc.mjs +108 -0
- package/assets/docs/tree/single-component.doc.mjs +165 -0
- package/assets/docs/tree/start-a-template.doc.mjs +143 -0
- package/assets/docs/tree/subcomponent.doc.mjs +115 -0
- package/assets/docs/tree/template-assets.doc.mjs +64 -0
- package/assets/docs/tree/template-doc-overview.doc.mjs +109 -0
- package/assets/docs/tree/template-fonts.doc.mjs +102 -0
- package/assets/docs/tree/template-grading-rubric.doc.mjs +452 -0
- package/assets/docs/tree/template-icons.doc.mjs +97 -0
- package/assets/docs/tree/template-images-media.doc.mjs +127 -0
- package/assets/docs/tree/template-styles.doc.mjs +93 -0
- package/assets/docs/tree/templates.doc.mjs +34 -0
- package/assets/docs/tree/test-in-an-app.doc.mjs +115 -0
- package/assets/docs/tree/test-template-in-app.doc.mjs +128 -0
- package/assets/docs/tree/themes.doc.mjs +39 -0
- package/assets/docs/tree/troubleshooting.doc.mjs +149 -0
- package/assets/docs/tree/upgrading.doc.mjs +103 -0
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +51 -0
- package/assets/docs/tree/verify-packed-template.doc.mjs +77 -0
- package/assets/docs/tree/versioning.doc.mjs +161 -0
- package/assets/docs/tree/write-good-templates.doc.mjs +64 -0
- package/assets/docs/tree/write-the-template-file.doc.mjs +154 -0
- package/assets/docs/typography.doc.mjs +24 -4
- package/assets/docs/working-with-ai.doc.mjs +34 -26
- 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 +11 -3
- 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 +792 -24
- package/authoring/doctypes/_schema.mjs +549 -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 +43 -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 +12 -3
- package/authoring/doctypes/component/parse.d.mts +2 -2
- package/authoring/doctypes/component/parse.mjs +1 -1
- package/authoring/doctypes/component/type.ts +14 -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 +55 -6
- package/authoring/doctypes/reference/type.ts +75 -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 +2 -2
- 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 +22 -13
- 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 +153 -61
- package/clients/cli/commands/component-batch.test.mjs +341 -0
- package/clients/cli/commands/component-ownership.test.mjs +92 -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 +28 -10
- 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 +295 -38
- package/clients/cli/commands/doctor-integration-components.doc.mjs +1 -1
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +6 -5
- 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 +143 -8
- package/clients/cli/commands/doctor.doc.mjs +4 -2
- package/clients/cli/commands/doctor.mjs +108 -37
- package/clients/cli/commands/doctor.test.mjs +42 -0
- package/clients/cli/commands/gap-report.doc.mjs +27 -15
- 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 +24 -10
- 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 +39 -13
- package/clients/cli/commands/integration-authoring.test.mjs +74 -19
- package/clients/cli/commands/integration-pack.doc.mjs +6 -10
- package/clients/cli/commands/integration-real-world.test.mjs +4 -10
- package/clients/cli/commands/integration-verify.doc.mjs +22 -0
- package/clients/cli/commands/integration.doc.mjs +5 -5
- package/clients/cli/commands/integration.mjs +75 -43
- 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 +2 -2
- package/clients/cli/commands/no-prompt-wording.test.mjs +94 -0
- package/clients/cli/commands/search.doc.mjs +16 -6
- package/clients/cli/commands/search.mjs +49 -11
- package/clients/cli/commands/search.test.mjs +92 -0
- package/clients/cli/commands/setup-nudge.test.mjs +6 -0
- package/clients/cli/commands/swizzle.doc.mjs +4 -3
- package/clients/cli/commands/swizzle.path-safety.test.mjs +42 -0
- package/clients/cli/commands/template.doc.mjs +53 -14
- 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 +725 -0
- package/clients/cli/commands/theme-add.doc.mjs +5 -4
- 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 +12 -7
- package/clients/cli/commands/theme-palette-generate.test.mjs +19 -0
- package/clients/cli/commands/theme-palette.doc.mjs +2 -3
- package/clients/cli/commands/theme-targets.behavior.test.mjs +4 -3
- package/clients/cli/commands/theme-targets.doc.mjs +3 -3
- 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 +3 -2
- package/clients/cli/commands/upgrade.ascii-output.test.mjs +87 -0
- package/clients/cli/commands/upgrade.doc.mjs +83 -12
- 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 +47 -34
- 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 +56 -6
- package/clients/cli/lib/define-command.test.mjs +54 -0
- package/clients/cli/lib/doc-text-ascii.test.mjs +82 -0
- package/clients/cli/lib/exit-codes.test.mjs +113 -0
- package/clients/cli/lib/hook-format.mjs +19 -10
- package/clients/cli/lib/json-shim.mjs +62 -16
- 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 +53 -6
- package/clients/cli/lib/manifest.test.mjs +22 -2
- package/clients/cli/lib/parse-error-format.test.mjs +81 -0
- package/foundation/agent-docs/agent-docs.d.mts +7 -2
- package/foundation/agent-docs/agent-docs.mjs +83 -13
- 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 +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 +174 -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 +504 -0
- package/foundation/discovery/cli-self-docs.test.mjs +395 -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 +427 -108
- package/foundation/discovery/docs-discovery.test.mjs +386 -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 +1643 -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 +298 -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 +292 -0
- package/foundation/doc-compiler/tree.mjs +881 -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 +65 -0
- package/foundation/integrations/cli-requirement.mjs +189 -0
- package/foundation/integrations/cli-requirement.test.mjs +89 -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 +28 -25
- 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/batch.type.d.mts +33 -0
- package/foundation/response/batch.type.mjs +34 -0
- 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 +19 -12
- package/foundation/response/error-codes.mjs +8 -2
- package/foundation/response/error-codes.test.mjs +166 -14
- 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 +7 -2
- package/foundation/response/response-types.doc.mjs +69 -25
- package/foundation/response/response-types.doc.test.mjs +181 -0
- package/foundation/response/response.doc.mjs +12 -11
- 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/api/docs/docs.test.mjs +0 -83
- package/api/docs/integrationDocs.test.mjs +0 -208
- package/api/search/search.test.mjs +0 -389
- package/assets/docs/cli-integrations.doc.mjs +0 -367
- package/assets/templates/themes/manifest.json +0 -95
- package/clients/cli/commands/docs.test.mjs +0 -102
- 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/foundation/agent-docs/agent-docs.test.mjs +0 -1141
|
@@ -29,6 +29,8 @@ export interface Suggestion {
|
|
|
29
29
|
* human-readable `error` string, which changes freely.
|
|
30
30
|
*/
|
|
31
31
|
export interface CLIError {
|
|
32
|
+
/** Version of the JSON envelope contract, as on the success envelope. */
|
|
33
|
+
apiVersion: number;
|
|
32
34
|
error: string;
|
|
33
35
|
code: ErrorCode;
|
|
34
36
|
suggestions?: Suggestion[];
|
|
@@ -36,13 +38,15 @@ export interface CLIError {
|
|
|
36
38
|
|
|
37
39
|
/** Returned by the fallback hook for commands without --json support. */
|
|
38
40
|
export interface CLIUnsupportedError {
|
|
41
|
+
apiVersion: number;
|
|
39
42
|
error: `JSON output is not supported for the '${string}' command`;
|
|
40
43
|
code: ErrorCode;
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
/**
|
|
44
|
-
* A success response
|
|
45
|
-
*
|
|
47
|
+
* A success response: a `type` discriminator, its `data` payload, and an
|
|
48
|
+
* optional `meta` sidecar (emitted as a sibling of `data`, never merged in).
|
|
49
|
+
* `--json` prints it with `apiVersion` added (see `parseResponse`).
|
|
46
50
|
*
|
|
47
51
|
* Structural by design — there is no central union of every response `type`.
|
|
48
52
|
* A specific command narrows `data` via its own return type.
|
|
@@ -75,7 +79,7 @@ export function jsonError(
|
|
|
75
79
|
/** Parse raw CLI output (string or object) into a typed result. */
|
|
76
80
|
export function parseResponse(
|
|
77
81
|
raw: unknown,
|
|
78
|
-
): CLIResponse | CLIError | CLIUnsupportedError;
|
|
82
|
+
): (CLIResponse & {apiVersion: number}) | CLIError | CLIUnsupportedError;
|
|
79
83
|
|
|
80
84
|
/** Type guard: returns true if result is an error. */
|
|
81
85
|
export function isError(
|
|
@@ -90,7 +94,7 @@ export function isError(
|
|
|
90
94
|
export function assertResponse<T extends string>(
|
|
91
95
|
raw: unknown,
|
|
92
96
|
type: T,
|
|
93
|
-
): CLIResponse & {type: T};
|
|
97
|
+
): CLIResponse & {apiVersion: number; type: T};
|
|
94
98
|
|
|
95
99
|
declare global {
|
|
96
100
|
namespace NodeJS {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* One complete row for an accepted selector.
|
|
6
|
+
*/
|
|
7
|
+
export type BatchRow<TResult, TCandidate> = ({
|
|
8
|
+
selector: string;
|
|
9
|
+
status: "found";
|
|
10
|
+
result: TResult;
|
|
11
|
+
} | {
|
|
12
|
+
selector: string;
|
|
13
|
+
status: "ambiguous";
|
|
14
|
+
code: string;
|
|
15
|
+
error: string;
|
|
16
|
+
candidates: TCandidate[];
|
|
17
|
+
} | {
|
|
18
|
+
selector: string;
|
|
19
|
+
status: "not_found" | "error";
|
|
20
|
+
code: string;
|
|
21
|
+
error: string;
|
|
22
|
+
suggestions?: import("./base").Suggestion[];
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* One ordered batch receipt inside the shared `{type, data}` success envelope.
|
|
26
|
+
*/
|
|
27
|
+
export type BatchResponse<TType extends string, TResult, TCandidate> = {
|
|
28
|
+
type: TType;
|
|
29
|
+
data: {
|
|
30
|
+
count: number;
|
|
31
|
+
results: BatchRow<TResult, TCandidate>[];
|
|
32
|
+
};
|
|
33
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Shared published types for complete multi-selector lookup receipts.
|
|
5
|
+
* Adopting API subjects specialize these types with their single-result and
|
|
6
|
+
* ambiguity-candidate types instead of defining command-specific row shapes.
|
|
7
|
+
*
|
|
8
|
+
* @input One exact selector, its single-result response, and its candidate shape.
|
|
9
|
+
* @output BatchRow and BatchResponse for every AST-053 lookup adopter.
|
|
10
|
+
* @position packages/cli/foundation/response — shared JSON response types
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* One complete row for an accepted selector.
|
|
15
|
+
* @template TResult
|
|
16
|
+
* @template TCandidate
|
|
17
|
+
* @typedef {(
|
|
18
|
+
* | {selector: string; status: 'found'; result: TResult}
|
|
19
|
+
* | {selector: string; status: 'ambiguous'; code: string; error: string; candidates: TCandidate[]}
|
|
20
|
+
* | {selector: string; status: 'not_found' | 'error'; code: string; error: string; suggestions?: import('./base').Suggestion[]}
|
|
21
|
+
* )} BatchRow
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* One ordered batch receipt inside the shared `{type, data}` success envelope.
|
|
26
|
+
* @template {string} TType
|
|
27
|
+
* @template TResult
|
|
28
|
+
* @template TCandidate
|
|
29
|
+
* @typedef {object} BatchResponse
|
|
30
|
+
* @property {TType} type
|
|
31
|
+
* @property {{count: number; results: BatchRow<TResult, TCandidate>[]}} data
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
export {};
|
|
@@ -75,6 +75,8 @@ export function allErrorCodes(): string[];
|
|
|
75
75
|
* | 'ERR_UNKNOWN_FEATURE'
|
|
76
76
|
* | 'ERR_UNKNOWN_CODEMOD'
|
|
77
77
|
* | 'ERR_CODEMOD_FAILED'
|
|
78
|
+
* | 'ERR_CODEMOD_PROTECTED'
|
|
79
|
+
* | 'ERR_CODEMOD_PROTECTION_SOURCE'
|
|
78
80
|
* | 'ERR_NOT_FOUND'
|
|
79
81
|
* | 'ERR_NO_DOC'
|
|
80
82
|
* | 'ERR_NO_SHOWCASE'
|
|
@@ -107,4 +109,4 @@ export const ERROR_CODES: Readonly<Record<ErrorCode, ErrorCode>>;
|
|
|
107
109
|
/**
|
|
108
110
|
* Stable error-code string union. Append-only.
|
|
109
111
|
*/
|
|
110
|
-
export type ErrorCode = ("ERR_UNKNOWN" | "ERR_UNKNOWN_COMMAND" | "ERR_UNKNOWN_SUBCOMMAND" | "ERR_INVALID_OPTION" | "ERR_INVALID_ARGUMENT" | "ERR_MISSING_ARGUMENT" | "ERR_INVALID_LANG" | "ERR_INVALID_DETAIL" | "ERR_NODE_VERSION" | "ERR_CORE_NOT_FOUND" | "ERR_CORE_INCOMPATIBLE" | "ERR_UNKNOWN_COMPONENT" | "ERR_UNKNOWN_HOOK" | "ERR_UNKNOWN_TOPIC" | "ERR_UNKNOWN_SECTION" | "ERR_UNKNOWN_CATEGORY" | "ERR_UNKNOWN_TEMPLATE" | "ERR_AMBIGUOUS_TEMPLATE" | "ERR_AMBIGUOUS_COMPONENT" | "ERR_AMBIGUOUS_THEME" | "ERR_UNKNOWN_THEME" | "ERR_INTEGRATION_ROOT_CONFLICT" | "ERR_INTEGRATION_EXPORT_CONFLICT" | "ERR_UNKNOWN_PACKAGE" | "ERR_UNKNOWN_AGENT" | "ERR_UNKNOWN_FEATURE" | "ERR_UNKNOWN_CODEMOD" | "ERR_CODEMOD_FAILED" | "ERR_NOT_FOUND" | "ERR_NO_DOC" | "ERR_NO_SHOWCASE" | "ERR_NO_SOURCE" | "ERR_INVALID_DOC" | "ERR_FILE_NOT_FOUND" | "ERR_FILE_EXISTS" | "ERR_PATH_TRAVERSAL" | "ERR_WRITE_FAILED" | "ERR_THEME_INVALID" | "ERR_THEME_LOAD" | "ERR_PALETTE_GENERATION" | "ERR_VERSION_DETECT" | "ERR_INVALID_VERSION" | "ERR_DEP_MISSING" | "ERR_GH_CLI" | "ERR_UNKNOWN_POST" | "ERR_FETCH_FAILED" | "ERR_LAYOUT_PARSE" | "ERR_LAYOUT_INVALID" | "ERR_UNCLASSIFIED_EXIT" | "ERR_SIGNAL_TERMINATED");
|
|
112
|
+
export type ErrorCode = ("ERR_UNKNOWN" | "ERR_UNKNOWN_COMMAND" | "ERR_UNKNOWN_SUBCOMMAND" | "ERR_INVALID_OPTION" | "ERR_INVALID_ARGUMENT" | "ERR_MISSING_ARGUMENT" | "ERR_INVALID_LANG" | "ERR_INVALID_DETAIL" | "ERR_NODE_VERSION" | "ERR_CORE_NOT_FOUND" | "ERR_CORE_INCOMPATIBLE" | "ERR_UNKNOWN_COMPONENT" | "ERR_UNKNOWN_HOOK" | "ERR_UNKNOWN_TOPIC" | "ERR_UNKNOWN_SECTION" | "ERR_UNKNOWN_CATEGORY" | "ERR_UNKNOWN_TEMPLATE" | "ERR_AMBIGUOUS_TEMPLATE" | "ERR_AMBIGUOUS_COMPONENT" | "ERR_AMBIGUOUS_THEME" | "ERR_UNKNOWN_THEME" | "ERR_INTEGRATION_ROOT_CONFLICT" | "ERR_INTEGRATION_EXPORT_CONFLICT" | "ERR_UNKNOWN_PACKAGE" | "ERR_UNKNOWN_AGENT" | "ERR_UNKNOWN_FEATURE" | "ERR_UNKNOWN_CODEMOD" | "ERR_CODEMOD_FAILED" | "ERR_CODEMOD_PROTECTED" | "ERR_CODEMOD_PROTECTION_SOURCE" | "ERR_NOT_FOUND" | "ERR_NO_DOC" | "ERR_NO_SHOWCASE" | "ERR_NO_SOURCE" | "ERR_INVALID_DOC" | "ERR_FILE_NOT_FOUND" | "ERR_FILE_EXISTS" | "ERR_PATH_TRAVERSAL" | "ERR_WRITE_FAILED" | "ERR_THEME_INVALID" | "ERR_THEME_LOAD" | "ERR_PALETTE_GENERATION" | "ERR_VERSION_DETECT" | "ERR_INVALID_VERSION" | "ERR_DEP_MISSING" | "ERR_GH_CLI" | "ERR_UNKNOWN_POST" | "ERR_FETCH_FAILED" | "ERR_LAYOUT_PARSE" | "ERR_LAYOUT_INVALID" | "ERR_UNCLASSIFIED_EXIT" | "ERR_SIGNAL_TERMINATED");
|
|
@@ -12,7 +12,7 @@ export const doc = {
|
|
|
12
12
|
type: 'enum',
|
|
13
13
|
name: 'error-codes',
|
|
14
14
|
displayName: 'Error Codes',
|
|
15
|
-
namespace: 'cli',
|
|
15
|
+
namespace: 'cli/api',
|
|
16
16
|
description:
|
|
17
17
|
'Stable, append-only machine-readable error codes on the --json error envelope (envelope.code). Codes never change or get removed; branch on these, not on prose.',
|
|
18
18
|
members: [
|
|
@@ -36,17 +36,16 @@ export const doc = {
|
|
|
36
36
|
{
|
|
37
37
|
value: 'ERR_INVALID_OPTION',
|
|
38
38
|
description:
|
|
39
|
-
'An unknown
|
|
39
|
+
'An unknown option was passed, --json was given to a command without JSON output, or layout --form got a value other than compact, outline, or auto.',
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
value: 'ERR_INVALID_ARGUMENT',
|
|
43
43
|
description:
|
|
44
|
-
|
|
44
|
+
'An argument or option value is invalid: wrong type, out of range, an unknown choice, an extra argument, or a conflicting combination.',
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
value: 'ERR_MISSING_ARGUMENT',
|
|
48
|
-
description:
|
|
49
|
-
'A required positional argument was omitted (Commander `missingArgument`).',
|
|
48
|
+
description: 'A required argument or option value was omitted.',
|
|
50
49
|
},
|
|
51
50
|
{
|
|
52
51
|
value: 'ERR_INVALID_LANG',
|
|
@@ -134,12 +133,11 @@ export const doc = {
|
|
|
134
133
|
},
|
|
135
134
|
{
|
|
136
135
|
value: 'ERR_UNKNOWN_PACKAGE',
|
|
137
|
-
description: 'No package matched the requested name
|
|
136
|
+
description: 'No package matched the requested name.',
|
|
138
137
|
},
|
|
139
138
|
{
|
|
140
139
|
value: 'ERR_UNKNOWN_AGENT',
|
|
141
|
-
description:
|
|
142
|
-
'An unrecognized `--agent` value was passed to agent-docs/init.',
|
|
140
|
+
description: 'An unrecognized `--agent` value was passed to init.',
|
|
143
141
|
},
|
|
144
142
|
{
|
|
145
143
|
value: 'ERR_UNKNOWN_FEATURE',
|
|
@@ -154,6 +152,16 @@ export const doc = {
|
|
|
154
152
|
value: 'ERR_CODEMOD_FAILED',
|
|
155
153
|
description: 'One or more codemods failed during an upgrade run.',
|
|
156
154
|
},
|
|
155
|
+
{
|
|
156
|
+
value: 'ERR_CODEMOD_PROTECTED',
|
|
157
|
+
description:
|
|
158
|
+
'A required codemod change remains blocked by a protected consumer file.',
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
value: 'ERR_CODEMOD_PROTECTION_SOURCE',
|
|
162
|
+
description:
|
|
163
|
+
'A working-tree protection declaration could not be read or parsed.',
|
|
164
|
+
},
|
|
157
165
|
{
|
|
158
166
|
value: 'ERR_NOT_FOUND',
|
|
159
167
|
description:
|
|
@@ -187,8 +195,7 @@ export const doc = {
|
|
|
187
195
|
},
|
|
188
196
|
{
|
|
189
197
|
value: 'ERR_FILE_EXISTS',
|
|
190
|
-
description:
|
|
191
|
-
'Refused to overwrite an existing file in non-interactive mode.',
|
|
198
|
+
description: 'Refused to overwrite an existing file.',
|
|
192
199
|
},
|
|
193
200
|
{
|
|
194
201
|
value: 'ERR_PATH_TRAVERSAL',
|
|
@@ -204,7 +211,7 @@ export const doc = {
|
|
|
204
211
|
{
|
|
205
212
|
value: 'ERR_THEME_INVALID',
|
|
206
213
|
description:
|
|
207
|
-
'A theme definition or contributed theme
|
|
214
|
+
'A theme definition or contributed theme descriptor is invalid.',
|
|
208
215
|
},
|
|
209
216
|
{
|
|
210
217
|
value: 'ERR_THEME_LOAD',
|
|
@@ -263,7 +270,7 @@ export const doc = {
|
|
|
263
270
|
{
|
|
264
271
|
value: 'ERR_UNCLASSIFIED_EXIT',
|
|
265
272
|
description:
|
|
266
|
-
'Recorded in the debug log, never printed: a command exited non-zero without
|
|
273
|
+
'Recorded in the debug log, never printed: a command exited non-zero without reporting an error code.',
|
|
267
274
|
},
|
|
268
275
|
{
|
|
269
276
|
value: 'ERR_SIGNAL_TERMINATED',
|
|
@@ -64,6 +64,8 @@
|
|
|
64
64
|
* | 'ERR_UNKNOWN_FEATURE'
|
|
65
65
|
* | 'ERR_UNKNOWN_CODEMOD'
|
|
66
66
|
* | 'ERR_CODEMOD_FAILED'
|
|
67
|
+
* | 'ERR_CODEMOD_PROTECTED'
|
|
68
|
+
* | 'ERR_CODEMOD_PROTECTION_SOURCE'
|
|
67
69
|
* | 'ERR_NOT_FOUND'
|
|
68
70
|
* | 'ERR_NO_DOC'
|
|
69
71
|
* | 'ERR_NO_SHOWCASE'
|
|
@@ -161,6 +163,10 @@ export const ERROR_CODES = Object.freeze({
|
|
|
161
163
|
ERR_UNKNOWN_CODEMOD: 'ERR_UNKNOWN_CODEMOD',
|
|
162
164
|
/** One or more codemods failed during an upgrade run. */
|
|
163
165
|
ERR_CODEMOD_FAILED: 'ERR_CODEMOD_FAILED',
|
|
166
|
+
/** A required codemod change remains blocked by a protected consumer file. */
|
|
167
|
+
ERR_CODEMOD_PROTECTED: 'ERR_CODEMOD_PROTECTED',
|
|
168
|
+
/** A working-tree protection declaration could not be read or parsed. */
|
|
169
|
+
ERR_CODEMOD_PROTECTION_SOURCE: 'ERR_CODEMOD_PROTECTION_SOURCE',
|
|
164
170
|
/** A generic discover/lookup query matched nothing in any package. */
|
|
165
171
|
ERR_NOT_FOUND: 'ERR_NOT_FOUND',
|
|
166
172
|
|
|
@@ -177,7 +183,7 @@ export const ERROR_CODES = Object.freeze({
|
|
|
177
183
|
// ── Filesystem ───────────────────────────────────────────────────
|
|
178
184
|
/** A required input file did not exist. */
|
|
179
185
|
ERR_FILE_NOT_FOUND: 'ERR_FILE_NOT_FOUND',
|
|
180
|
-
/** Refused to overwrite an existing file
|
|
186
|
+
/** Refused to overwrite an existing file. */
|
|
181
187
|
ERR_FILE_EXISTS: 'ERR_FILE_EXISTS',
|
|
182
188
|
/** A path escaped its allowed root, or a name contained traversal markers. */
|
|
183
189
|
ERR_PATH_TRAVERSAL: 'ERR_PATH_TRAVERSAL',
|
|
@@ -185,7 +191,7 @@ export const ERROR_CODES = Object.freeze({
|
|
|
185
191
|
ERR_WRITE_FAILED: 'ERR_WRITE_FAILED',
|
|
186
192
|
|
|
187
193
|
// ── Theme build ──────────────────────────────────────────────────
|
|
188
|
-
/** A theme definition or contributed theme
|
|
194
|
+
/** A theme definition or contributed theme descriptor is invalid. */
|
|
189
195
|
ERR_THEME_INVALID: 'ERR_THEME_INVALID',
|
|
190
196
|
/** A theme file could not be loaded / parsed into a defineTheme result. */
|
|
191
197
|
ERR_THEME_LOAD: 'ERR_THEME_LOAD',
|
|
@@ -15,6 +15,9 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import {describe, it, expect} from 'vitest';
|
|
18
|
+
import * as fs from 'node:fs';
|
|
19
|
+
import * as os from 'node:os';
|
|
20
|
+
import * as path from 'node:path';
|
|
18
21
|
import {ERROR_CODES, isErrorCode, allErrorCodes} from './error-codes.mjs';
|
|
19
22
|
import {runCli} from '../../test-utils/run-cli.mjs';
|
|
20
23
|
|
|
@@ -75,20 +78,133 @@ describe('error-codes taxonomy', () => {
|
|
|
75
78
|
});
|
|
76
79
|
});
|
|
77
80
|
|
|
81
|
+
describe('error codes: shipped set', () => {
|
|
82
|
+
// Every code a release has published. INV3: a shipped code is never removed
|
|
83
|
+
// or respelled. Add a code here once it ships; never delete an entry.
|
|
84
|
+
const SHIPPED = [
|
|
85
|
+
'ERR_AMBIGUOUS_COMPONENT',
|
|
86
|
+
'ERR_AMBIGUOUS_TEMPLATE',
|
|
87
|
+
'ERR_AMBIGUOUS_THEME',
|
|
88
|
+
'ERR_CODEMOD_FAILED',
|
|
89
|
+
'ERR_CODEMOD_PROTECTED',
|
|
90
|
+
'ERR_CODEMOD_PROTECTION_SOURCE',
|
|
91
|
+
'ERR_CORE_INCOMPATIBLE',
|
|
92
|
+
'ERR_CORE_NOT_FOUND',
|
|
93
|
+
'ERR_DEP_MISSING',
|
|
94
|
+
'ERR_FETCH_FAILED',
|
|
95
|
+
'ERR_FILE_EXISTS',
|
|
96
|
+
'ERR_FILE_NOT_FOUND',
|
|
97
|
+
'ERR_GH_CLI',
|
|
98
|
+
'ERR_INTEGRATION_EXPORT_CONFLICT',
|
|
99
|
+
'ERR_INTEGRATION_ROOT_CONFLICT',
|
|
100
|
+
'ERR_INVALID_ARGUMENT',
|
|
101
|
+
'ERR_INVALID_DETAIL',
|
|
102
|
+
'ERR_INVALID_DOC',
|
|
103
|
+
'ERR_INVALID_LANG',
|
|
104
|
+
'ERR_INVALID_OPTION',
|
|
105
|
+
'ERR_INVALID_VERSION',
|
|
106
|
+
'ERR_LAYOUT_INVALID',
|
|
107
|
+
'ERR_LAYOUT_PARSE',
|
|
108
|
+
'ERR_MISSING_ARGUMENT',
|
|
109
|
+
'ERR_NODE_VERSION',
|
|
110
|
+
'ERR_NOT_FOUND',
|
|
111
|
+
'ERR_NO_DOC',
|
|
112
|
+
'ERR_NO_SHOWCASE',
|
|
113
|
+
'ERR_NO_SOURCE',
|
|
114
|
+
'ERR_PALETTE_GENERATION',
|
|
115
|
+
'ERR_PATH_TRAVERSAL',
|
|
116
|
+
'ERR_SIGNAL_TERMINATED',
|
|
117
|
+
'ERR_THEME_INVALID',
|
|
118
|
+
'ERR_THEME_LOAD',
|
|
119
|
+
'ERR_UNCLASSIFIED_EXIT',
|
|
120
|
+
'ERR_UNKNOWN',
|
|
121
|
+
'ERR_UNKNOWN_AGENT',
|
|
122
|
+
'ERR_UNKNOWN_CATEGORY',
|
|
123
|
+
'ERR_UNKNOWN_CODEMOD',
|
|
124
|
+
'ERR_UNKNOWN_COMMAND',
|
|
125
|
+
'ERR_UNKNOWN_COMPONENT',
|
|
126
|
+
'ERR_UNKNOWN_FEATURE',
|
|
127
|
+
'ERR_UNKNOWN_HOOK',
|
|
128
|
+
'ERR_UNKNOWN_PACKAGE',
|
|
129
|
+
'ERR_UNKNOWN_POST',
|
|
130
|
+
'ERR_UNKNOWN_SECTION',
|
|
131
|
+
'ERR_UNKNOWN_SUBCOMMAND',
|
|
132
|
+
'ERR_UNKNOWN_TEMPLATE',
|
|
133
|
+
'ERR_UNKNOWN_THEME',
|
|
134
|
+
'ERR_UNKNOWN_TOPIC',
|
|
135
|
+
'ERR_VERSION_DETECT',
|
|
136
|
+
'ERR_WRITE_FAILED',
|
|
137
|
+
];
|
|
138
|
+
|
|
139
|
+
it('still carries every shipped code, spelled the same', () => {
|
|
140
|
+
const missing = SHIPPED.filter(
|
|
141
|
+
code => !isErrorCode(code) || ERROR_CODES[code] !== code,
|
|
142
|
+
);
|
|
143
|
+
expect(missing, 'shipped codes removed or respelled').toEqual([]);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
78
147
|
describe('error codes: end-to-end JSON envelopes', () => {
|
|
79
148
|
const cases = [
|
|
80
|
-
{
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
{
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
149
|
+
{
|
|
150
|
+
name: 'unknown component',
|
|
151
|
+
args: ['component', 'Bogus', '--json'],
|
|
152
|
+
code: 'ERR_UNKNOWN_COMPONENT',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'unknown hook',
|
|
156
|
+
args: ['hook', 'bogusHook', '--json'],
|
|
157
|
+
code: 'ERR_UNKNOWN_HOOK',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'unknown topic',
|
|
161
|
+
args: ['docs', 'bogusTopic', '--json'],
|
|
162
|
+
code: 'ERR_UNKNOWN_TOPIC',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: 'unknown template',
|
|
166
|
+
args: ['template', 'bogusTemplate', '--json'],
|
|
167
|
+
code: 'ERR_UNKNOWN_TEMPLATE',
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: 'unknown command',
|
|
171
|
+
args: ['bogus-cmd', '--json'],
|
|
172
|
+
code: 'ERR_UNKNOWN_COMMAND',
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'invalid --lang',
|
|
176
|
+
args: ['docs', 'color', '--lang', 'fr', '--json'],
|
|
177
|
+
code: 'ERR_INVALID_LANG',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: 'invalid --detail',
|
|
181
|
+
args: ['docs', 'color', '--detail', 'bogus', '--json'],
|
|
182
|
+
code: 'ERR_INVALID_DETAIL',
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: 'unknown option',
|
|
186
|
+
args: ['component', 'Button', '--bogus-flag', '--json'],
|
|
187
|
+
code: 'ERR_INVALID_OPTION',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: 'missing argument',
|
|
191
|
+
args: ['theme', 'build', '--json'],
|
|
192
|
+
code: 'ERR_MISSING_ARGUMENT',
|
|
193
|
+
},
|
|
89
194
|
// `theme` is not on the --json allowlist, so --json on any theme subcommand
|
|
90
195
|
// is rejected at the preAction gate with a stable invalid-option code.
|
|
91
|
-
{
|
|
196
|
+
{
|
|
197
|
+
name: 'json not supported',
|
|
198
|
+
args: ['theme', '--json'],
|
|
199
|
+
code: 'ERR_INVALID_OPTION',
|
|
200
|
+
},
|
|
201
|
+
// A group given a word it does not have names the unknown subcommand,
|
|
202
|
+
// in JSON as in text.
|
|
203
|
+
{
|
|
204
|
+
name: 'unknown subcommand of a group',
|
|
205
|
+
args: ['theme', 'bogus-sub', '--json'],
|
|
206
|
+
code: 'ERR_UNKNOWN_SUBCOMMAND',
|
|
207
|
+
},
|
|
92
208
|
];
|
|
93
209
|
|
|
94
210
|
for (const {name, args, code} of cases) {
|
|
@@ -104,6 +220,24 @@ describe('error codes: end-to-end JSON envelopes', () => {
|
|
|
104
220
|
});
|
|
105
221
|
}
|
|
106
222
|
|
|
223
|
+
it('a filesystem failure carries a registered code, never the Node errno', async () => {
|
|
224
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-errno-'));
|
|
225
|
+
try {
|
|
226
|
+
// A file where the target directory should be: mkdir fails with ENOTDIR.
|
|
227
|
+
fs.writeFileSync(path.join(dir, 'blocker'), 'x');
|
|
228
|
+
const {status, stdout} = await runCli(
|
|
229
|
+
['template', 'dashboard', 'blocker/out', '--json'],
|
|
230
|
+
{cwd: dir},
|
|
231
|
+
);
|
|
232
|
+
expect(status).toBe(1);
|
|
233
|
+
const env = envelope(stdout);
|
|
234
|
+
expect(env.error).toMatch(/ENOTDIR/);
|
|
235
|
+
expect(isErrorCode(env.code)).toBe(true);
|
|
236
|
+
} finally {
|
|
237
|
+
fs.rmSync(dir, {recursive: true, force: true});
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
|
|
107
241
|
it('every error envelope carries a code (even unmatched paths fall back to ERR_UNKNOWN)', async () => {
|
|
108
242
|
const {stdout} = await runCli(['component', 'Bogus', '--json']);
|
|
109
243
|
const env = envelope(stdout);
|
|
@@ -122,13 +256,31 @@ describe('error codes: human mode stays clean', () => {
|
|
|
122
256
|
expect(stdout).not.toContain('ERR_UNKNOWN_COMPONENT');
|
|
123
257
|
});
|
|
124
258
|
|
|
125
|
-
it('unknown subcommand exits 1 in
|
|
126
|
-
//
|
|
127
|
-
//
|
|
128
|
-
// ERR_UNKNOWN_SUBCOMMAND code rides along on the cliError call.
|
|
259
|
+
it('unknown subcommand exits 1, with the code in JSON and not in text', async () => {
|
|
260
|
+
// A group that is not JSON-capable itself still answers an unknown
|
|
261
|
+
// subcommand in JSON, so a JSON caller learns the subcommands it has.
|
|
129
262
|
const {status, stderr} = await runCli(['theme', 'bogus-sub']);
|
|
130
263
|
expect(status).toBe(1);
|
|
131
264
|
expect(stderr).toContain("unknown subcommand 'theme bogus-sub'");
|
|
132
265
|
expect(stderr).not.toContain('ERR_UNKNOWN_SUBCOMMAND');
|
|
266
|
+
for (const args of [
|
|
267
|
+
['--json', 'theme', 'bogus-sub'],
|
|
268
|
+
['theme', 'bogus-sub', '--json'],
|
|
269
|
+
['--json', 'doctor', 'integration', 'bogus-sub'],
|
|
270
|
+
]) {
|
|
271
|
+
const json = await runCli(args);
|
|
272
|
+
expect(json.status, args.join(' ')).toBe(1);
|
|
273
|
+
expect(JSON.parse(json.stdout), args.join(' ')).toMatchObject({
|
|
274
|
+
code: 'ERR_UNKNOWN_SUBCOMMAND',
|
|
275
|
+
suggestions: expect.arrayContaining([expect.objectContaining({reason: 'available subcommand'})]),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Text and JSON agree for a group that shows help when run bare.
|
|
279
|
+
const text = await runCli(['doctor', 'integration', 'bogus-sub']);
|
|
280
|
+
expect(text.status).toBe(1);
|
|
281
|
+
expect(text.stderr).toContain("unknown subcommand 'doctor integration bogus-sub'");
|
|
282
|
+
const doctor = await runCli(['doctor', 'integrations']);
|
|
283
|
+
expect(doctor.status).toBe(1);
|
|
284
|
+
expect(doctor.stderr).toContain("unknown subcommand 'doctor integrations'");
|
|
133
285
|
});
|
|
134
286
|
});
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
|
|
14
14
|
import {describe, it, expect, beforeEach, afterEach, vi} from 'vitest';
|
|
15
15
|
import {spawnSync} from 'node:child_process';
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as os from 'node:os';
|
|
16
18
|
import * as path from 'node:path';
|
|
17
19
|
import {fileURLToPath} from 'node:url';
|
|
18
20
|
import {
|
|
@@ -27,10 +29,20 @@ import {
|
|
|
27
29
|
} from './json.mjs';
|
|
28
30
|
|
|
29
31
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
30
|
-
const CLI = path.resolve(
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
const CLI = path.resolve(
|
|
33
|
+
__dirname,
|
|
34
|
+
'..',
|
|
35
|
+
'..',
|
|
36
|
+
'clients',
|
|
37
|
+
'cli',
|
|
38
|
+
'bin',
|
|
39
|
+
'astryx.mjs',
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
/** @param {string[]} args @param {{cwd?: string}} [options] */
|
|
43
|
+
function runCli(args, {cwd = process.cwd()} = {}) {
|
|
33
44
|
return spawnSync(process.execPath, [CLI, ...args], {
|
|
45
|
+
cwd,
|
|
34
46
|
encoding: 'utf8',
|
|
35
47
|
timeout: 20_000,
|
|
36
48
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -42,7 +54,9 @@ describe('json envelope shape', () => {
|
|
|
42
54
|
let logs;
|
|
43
55
|
beforeEach(() => {
|
|
44
56
|
logs = [];
|
|
45
|
-
vi.spyOn(console, 'log').mockImplementation((...a) =>
|
|
57
|
+
vi.spyOn(console, 'log').mockImplementation((...a) =>
|
|
58
|
+
logs.push(a.join(' ')),
|
|
59
|
+
);
|
|
46
60
|
setJsonMode(false);
|
|
47
61
|
});
|
|
48
62
|
afterEach(() => {
|
|
@@ -80,11 +94,13 @@ describe('json envelope shape', () => {
|
|
|
80
94
|
});
|
|
81
95
|
|
|
82
96
|
it('toErrorEnvelope honors an explicit code argument', () => {
|
|
83
|
-
expect(toErrorEnvelope('boom', undefined, 'ERR_UNKNOWN_COMPONENT')).toEqual(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
97
|
+
expect(toErrorEnvelope('boom', undefined, 'ERR_UNKNOWN_COMPONENT')).toEqual(
|
|
98
|
+
{
|
|
99
|
+
apiVersion: API_VERSION,
|
|
100
|
+
error: 'boom',
|
|
101
|
+
code: 'ERR_UNKNOWN_COMPONENT',
|
|
102
|
+
},
|
|
103
|
+
);
|
|
88
104
|
});
|
|
89
105
|
|
|
90
106
|
it('toErrorEnvelope reads a code carried on a thrown Error', () => {
|
|
@@ -96,6 +112,17 @@ describe('json envelope shape', () => {
|
|
|
96
112
|
});
|
|
97
113
|
});
|
|
98
114
|
|
|
115
|
+
it('toErrorEnvelope never emits an unregistered code', () => {
|
|
116
|
+
// A Node system error carries `code: 'EACCES'`; that is not an Astryx code.
|
|
117
|
+
const sysErr = Object.assign(new Error('EACCES: permission denied'), {
|
|
118
|
+
code: 'EACCES',
|
|
119
|
+
});
|
|
120
|
+
expect(toErrorEnvelope(sysErr).code).toBe('ERR_UNKNOWN');
|
|
121
|
+
expect(toErrorEnvelope('boom', undefined, 'ENOENT').code).toBe('ERR_UNKNOWN');
|
|
122
|
+
const docErr = Object.assign(new Error('no doc'), {code: 'ERR_NO_DOC'});
|
|
123
|
+
expect(toErrorEnvelope(docErr, undefined, 'ENOENT').code).toBe('ERR_NO_DOC');
|
|
124
|
+
});
|
|
125
|
+
|
|
99
126
|
it('toErrorEnvelope includes suggestions when present', () => {
|
|
100
127
|
const env = toErrorEnvelope('x', [{name: 'Button', reason: 'close match'}]);
|
|
101
128
|
expect(env.suggestions).toEqual([{name: 'Button', reason: 'close match'}]);
|
|
@@ -109,8 +136,12 @@ describe('json envelope shape', () => {
|
|
|
109
136
|
// The guard is `Array.isArray(...) && .length`, not a bare `?.length` — a
|
|
110
137
|
// string ("hello".length === 5) or a `{length: n}` object must NOT slip
|
|
111
138
|
// through as `suggestions`, which is contractually a Suggestion[].
|
|
112
|
-
expect(
|
|
113
|
-
|
|
139
|
+
expect(
|
|
140
|
+
'suggestions' in toErrorEnvelope('x', /** @type {any} */ ('hello')),
|
|
141
|
+
).toBe(false);
|
|
142
|
+
expect(
|
|
143
|
+
'suggestions' in toErrorEnvelope('x', /** @type {any} */ ({length: 3})),
|
|
144
|
+
).toBe(false);
|
|
114
145
|
});
|
|
115
146
|
});
|
|
116
147
|
|
|
@@ -119,8 +150,12 @@ describe('stdout discipline (humanLog / humanWarn)', () => {
|
|
|
119
150
|
beforeEach(() => {
|
|
120
151
|
logs = [];
|
|
121
152
|
errs = [];
|
|
122
|
-
vi.spyOn(console, 'log').mockImplementation((...a) =>
|
|
123
|
-
|
|
153
|
+
vi.spyOn(console, 'log').mockImplementation((...a) =>
|
|
154
|
+
logs.push(a.join(' ')),
|
|
155
|
+
);
|
|
156
|
+
vi.spyOn(console, 'error').mockImplementation((...a) =>
|
|
157
|
+
errs.push(a.join(' ')),
|
|
158
|
+
);
|
|
124
159
|
});
|
|
125
160
|
afterEach(() => {
|
|
126
161
|
vi.restoreAllMocks();
|
|
@@ -174,10 +209,15 @@ describe('contract: every --json emission is valid JSON with apiVersion', () =>
|
|
|
174
209
|
});
|
|
175
210
|
|
|
176
211
|
it('init emits its install receipt', () => {
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
212
|
+
const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-json-contract-'));
|
|
213
|
+
try {
|
|
214
|
+
const r = runCli(['init', '--json'], {cwd});
|
|
215
|
+
const env = JSON.parse(r.stdout);
|
|
216
|
+
expect(env.apiVersion).toBe(API_VERSION);
|
|
217
|
+
expect(env.type).toBe('init.run');
|
|
218
|
+
} finally {
|
|
219
|
+
fs.rmSync(cwd, {recursive: true, force: true});
|
|
220
|
+
}
|
|
181
221
|
});
|
|
182
222
|
|
|
183
223
|
it('supported command (discover) emits clean JSON, no human chatter leak', () => {
|
|
@@ -50,8 +50,10 @@ export function jsonOut(response: {
|
|
|
50
50
|
*
|
|
51
51
|
* The `code` is resolved in priority order: an explicit `code` argument,
|
|
52
52
|
* then a `code` property carried on a thrown Error/AstryxError, then the
|
|
53
|
-
* generic `ERR_UNKNOWN` fallback.
|
|
54
|
-
*
|
|
53
|
+
* generic `ERR_UNKNOWN` fallback. Only a registered code (error-codes.mjs) is
|
|
54
|
+
* taken from either source, so a Node system error's `ENOENT` never reaches
|
|
55
|
+
* the envelope. It always appears on the envelope so consumers can branch on
|
|
56
|
+
* it unconditionally.
|
|
55
57
|
*
|
|
56
58
|
* @param {unknown} err
|
|
57
59
|
* @param {import('./base').Suggestion[]} [suggestions]
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* Version of the JSON envelope contract. Bump on breaking shape changes so
|
|
29
29
|
* consumers can negotiate. Exposed on every envelope as `apiVersion`.
|
|
30
30
|
*/
|
|
31
|
-
import {ERROR_CODES} from './error-codes.mjs';
|
|
31
|
+
import {ERROR_CODES, isErrorCode} from './error-codes.mjs';
|
|
32
32
|
import {recordEnvelope, setOutcome} from '../debug/index.mjs';
|
|
33
33
|
|
|
34
34
|
export const API_VERSION = 1;
|
|
@@ -118,8 +118,10 @@ export function jsonOut(response) {
|
|
|
118
118
|
*
|
|
119
119
|
* The `code` is resolved in priority order: an explicit `code` argument,
|
|
120
120
|
* then a `code` property carried on a thrown Error/AstryxError, then the
|
|
121
|
-
* generic `ERR_UNKNOWN` fallback.
|
|
122
|
-
*
|
|
121
|
+
* generic `ERR_UNKNOWN` fallback. Only a registered code (error-codes.mjs) is
|
|
122
|
+
* taken from either source, so a Node system error's `ENOENT` never reaches
|
|
123
|
+
* the envelope. It always appears on the envelope so consumers can branch on
|
|
124
|
+
* it unconditionally.
|
|
123
125
|
*
|
|
124
126
|
* @param {unknown} err
|
|
125
127
|
* @param {import('./base').Suggestion[]} [suggestions]
|
|
@@ -130,13 +132,9 @@ export function jsonOut(response) {
|
|
|
130
132
|
export function toErrorEnvelope(err, suggestions, code) {
|
|
131
133
|
const message =
|
|
132
134
|
err instanceof Error ? err.message : typeof err === 'string' ? err : String(err);
|
|
133
|
-
const
|
|
134
|
-
code
|
|
135
|
-
|
|
136
|
-
typeof (/** @type {any} */ (err).code) === 'string'
|
|
137
|
-
? /** @type {any} */ (err).code
|
|
138
|
-
: undefined) ||
|
|
139
|
-
ERROR_CODES.ERR_UNKNOWN;
|
|
135
|
+
const carried =
|
|
136
|
+
err && typeof err === 'object' ? /** @type {any} */ (err).code : undefined;
|
|
137
|
+
const resolvedCode = [code, carried].find(isErrorCode) ?? ERROR_CODES.ERR_UNKNOWN;
|
|
140
138
|
/** @type {any} */
|
|
141
139
|
const env = {apiVersion: API_VERSION, error: message, code: resolvedCode};
|
|
142
140
|
if (Array.isArray(suggestions) && suggestions.length) env.suggestions = suggestions;
|