@astryxdesign/cli 0.7.2-canary.fdd384f → 0.7.2
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 +119 -0
- package/README.md +169 -149
- package/api/build/_adapter.d.mts +8 -0
- package/api/build/_adapter.mjs +12 -1
- package/api/build/build.doc.mjs +4 -0
- package/api/build/kit/kit.mjs +3 -11
- package/api/component/_adapter.d.mts +31 -0
- package/api/component/_adapter.mjs +119 -11
- package/api/component/component.doc.mjs +6 -1
- package/api/component/component.mjs +60 -10
- package/api/component/doc-links.test.mjs +386 -0
- package/api/discover/_adapter.d.mts +132 -12
- package/api/discover/_adapter.mjs +488 -27
- package/api/discover/_adapter.test.mjs +599 -17
- package/api/discover/_catalog-view.d.mts +16 -5
- package/api/discover/_catalog-view.mjs +32 -8
- package/api/discover/detail/doc/doc.mjs +9 -1
- package/api/discover/discover.d.mts +11 -0
- package/api/discover/discover.doc.mjs +9 -7
- package/api/discover/discover.mjs +121 -19
- package/api/discover/discover.type.d.mts +20 -7
- package/api/discover/discover.type.mjs +17 -7
- package/api/discover/list/list.d.mts +4 -3
- package/api/discover/list/list.mjs +17 -10
- package/api/docs/_adapter.d.mts +63 -0
- package/api/docs/_adapter.mjs +312 -18
- package/api/docs/docs.doc.mjs +2 -1
- package/api/docs/docs.mjs +2 -1
- package/api/docs/docs.test.mjs +5 -2
- package/api/docs/integration-tree.test.mjs +22 -0
- package/api/docs/list/list.mjs +12 -2
- package/api/docs/reference-blocks.test.mjs +1 -3
- package/api/doctor/_adapter.d.mts +108 -0
- package/api/doctor/_adapter.mjs +223 -4
- package/api/doctor/doctor.d.mts +199 -0
- package/api/doctor/doctor.doc.mjs +3 -2
- package/api/doctor/doctor.mjs +530 -34
- package/api/doctor/doctor.test.mjs +180 -14
- package/api/doctor/release-checks.test.mjs +156 -0
- package/api/doctor/theme-checks.mjs +16 -3
- package/api/doctor/theme-checks.test.mjs +223 -7
- package/api/error.d.mts +10 -0
- package/api/error.mjs +25 -0
- package/api/gap-report/gap-report.d.mts +3 -0
- package/api/gap-report/gap-report.doc.mjs +11 -3
- package/api/gap-report/gap-report.mjs +152 -48
- package/api/gap-report/gap-report.test.mjs +233 -0
- package/api/gap-report/gap-report.type.d.mts +41 -0
- package/api/gap-report/gap-report.type.mjs +18 -0
- package/api/hook/_adapter.mjs +3 -11
- package/api/hook/hook.doc.mjs +4 -0
- package/api/hook/list/list.d.mts +1 -1
- package/api/init/_adapter.d.mts +22 -0
- package/api/init/_adapter.mjs +59 -0
- package/api/init/init.d.mts +7 -5
- package/api/init/init.doc.mjs +28 -7
- package/api/init/init.mjs +28 -4
- package/api/init/init.type.d.mts +48 -3
- package/api/init/init.type.mjs +37 -3
- package/api/init/run/run.d.mts +1 -1
- package/api/init/run/run.mjs +15 -4
- package/api/init/user/user.d.mts +14 -0
- package/api/init/user/user.mjs +87 -0
- package/api/init/user/user.test.mjs +232 -0
- package/api/integration/_adapter.d.mts +33 -0
- package/api/integration/_adapter.mjs +58 -0
- package/api/integration/authoring-checks.mjs +100 -5
- package/api/integration/authoring-checks.test.mjs +769 -0
- package/api/integration/authoring-checks.type.d.mts +134 -0
- package/api/integration/authoring-checks.type.mjs +60 -1
- package/api/integration/integrationCheck.doc.mjs +1 -1
- package/api/integration/integrationComponentConflicts.doc.mjs +11 -3
- package/api/integration/integrationDocConflicts.doc.mjs +22 -5
- package/api/integration/pack-check.mjs +303 -13
- package/api/integration/pack-check.test.mjs +371 -10
- package/api/integration/validate-integration-fixes.test.mjs +67 -0
- package/api/integration/validate-integration.d.mts +8 -0
- package/api/integration/validate-integration.mjs +55 -9
- package/api/integration/validate-integration.test.mjs +77 -8
- package/api/integration/validate-integration.type.d.mts +8 -0
- package/api/integration/validate-integration.type.mjs +3 -1
- package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
- package/api/integration/validateIntegration.doc.mjs +4 -2
- package/api/search/_adapter.d.mts +11 -0
- package/api/search/_adapter.mjs +25 -0
- package/api/search/search.d.mts +73 -13
- package/api/search/search.doc.mjs +8 -3
- package/api/search/search.domain-priority.test.mjs +108 -18
- package/api/search/search.mjs +541 -52
- package/api/search/search.test.mjs +143 -1
- package/api/search/search.type.d.mts +14 -1
- package/api/search/search.type.mjs +6 -1
- package/api/swizzle/_adapter.mjs +2 -2
- package/api/swizzle/copy/copy.mjs +1 -1
- package/api/template/template-integration.test.mjs +1 -1
- package/api/theme/_adapter.d.mts +16 -0
- package/api/theme/_adapter.mjs +32 -5
- package/api/theme/build/build.d.mts +2 -1
- package/api/theme/build/build.mjs +70 -14
- package/api/theme/build/build.packed-old-core.test.mjs +20 -3
- package/api/theme/build/font-warning.mjs +5 -3
- package/api/theme/build/font-warning.test.mjs +2 -1
- package/api/theme/remove/remove.test.mjs +2 -2
- package/api/theme/targets/targets.mjs +3 -10
- package/api/theme/themeTargets.doc.mjs +4 -0
- package/api/theme/use/use.test.mjs +1 -1
- package/api/upgrade/_adapter.d.mts +40 -2
- package/api/upgrade/_adapter.mjs +118 -5
- package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
- package/api/upgrade/run/run.mjs +35 -2
- package/api/upgrade/status/status.d.mts +21 -5
- package/api/upgrade/status/status.mjs +45 -8
- package/api/upgrade/upgrade.doc.mjs +6 -3
- package/api/upgrade/upgrade.mjs +5 -1
- package/api/upgrade/upgrade.type.d.mts +23 -0
- package/api/upgrade/upgrade.type.mjs +16 -1
- package/assets/codemods/__tests__/registry.test.mjs +1 -0
- package/assets/codemods/registry.mjs +1 -0
- package/assets/codemods/runner.mjs +7 -1
- package/assets/codemods/transforms/next/index.mjs +1 -11
- package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
- package/assets/discover/official-packages.json +367 -0
- package/assets/docs/author-a-theme.doc.mjs +2 -2
- package/assets/docs/browser-support.doc.mjs +1 -1
- package/assets/docs/getting-started.doc.mjs +23 -3
- package/assets/docs/styling-overview.doc.mjs +1 -1
- package/assets/docs/theme.doc.mjs +1 -1
- package/assets/docs/tree/add-a-component.doc.mjs +12 -2
- package/assets/docs/tree/add-a-theme.doc.mjs +13 -3
- package/assets/docs/tree/add-a-topic.doc.mjs +54 -9
- package/assets/docs/tree/agent-guidance.doc.mjs +19 -5
- package/assets/docs/tree/block-template.doc.mjs +6 -18
- package/assets/docs/tree/build-the-template.doc.mjs +1 -1
- package/assets/docs/tree/building-blocks.doc.mjs +4 -0
- package/assets/docs/tree/check-the-props.doc.mjs +8 -3
- package/assets/docs/tree/check-your-docs.doc.mjs +30 -13
- package/assets/docs/tree/checks.doc.mjs +17 -17
- package/assets/docs/tree/ci-and-containers.doc.mjs +88 -0
- package/assets/docs/tree/cli-command.doc.mjs +142 -0
- package/assets/docs/tree/cli.doc.mjs +6 -0
- package/assets/docs/tree/codemods.doc.mjs +17 -7
- package/assets/docs/tree/commands.doc.mjs +7 -1
- package/assets/docs/tree/component-family.doc.mjs +3 -5
- package/assets/docs/tree/component-imports.doc.mjs +13 -3
- package/assets/docs/tree/components.doc.mjs +7 -1
- package/assets/docs/tree/computer-agent-guide.doc.mjs +160 -0
- package/assets/docs/tree/computer-integrations.doc.mjs +93 -0
- package/assets/docs/tree/configuration.doc.mjs +7 -3
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
- package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
- package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
- package/assets/docs/tree/docs.doc.mjs +9 -3
- package/assets/docs/tree/document-the-template.doc.mjs +1 -1
- package/assets/docs/tree/document-the-theme.doc.mjs +3 -3
- package/assets/docs/tree/export-template-assets.doc.mjs +1 -1
- package/assets/docs/tree/extend-or-replace.doc.mjs +19 -9
- package/assets/docs/tree/fonts-and-assets.doc.mjs +2 -2
- package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
- package/assets/docs/tree/global-integrations.doc.mjs +124 -0
- package/assets/docs/tree/global.doc.mjs +131 -0
- package/assets/docs/tree/grade-template-with-agent.doc.mjs +5 -5
- package/assets/docs/tree/install-once.doc.mjs +105 -0
- package/assets/docs/tree/integrations.doc.mjs +13 -1
- package/assets/docs/tree/layout-spacing.doc.mjs +2 -3
- package/assets/docs/tree/layout.doc.mjs +6 -6
- package/assets/docs/tree/links.doc.mjs +6 -5
- package/assets/docs/tree/migration-setup.doc.mjs +3 -2
- package/assets/docs/tree/migration-verification.doc.mjs +0 -1
- package/assets/docs/tree/migration.doc.mjs +0 -1
- package/assets/docs/tree/monorepos.doc.mjs +84 -0
- package/assets/docs/tree/package-and-test.doc.mjs +1 -1
- package/assets/docs/tree/page-template.doc.mjs +3 -7
- package/assets/docs/tree/problems.doc.mjs +205 -0
- package/assets/docs/tree/project-global-or-both.doc.mjs +131 -0
- package/assets/docs/tree/publishing.doc.mjs +6 -6
- package/assets/docs/tree/quick-start.doc.mjs +52 -26
- package/assets/docs/tree/reference.doc.mjs +192 -0
- package/assets/docs/tree/replace-a-core-component.doc.mjs +15 -7
- package/assets/docs/tree/replace-a-core-template.doc.mjs +9 -11
- package/assets/docs/tree/scaffold.doc.mjs +1 -1
- package/assets/docs/tree/sections-and-placement.doc.mjs +9 -11
- package/assets/docs/tree/see-it-in-an-app.doc.mjs +17 -5
- package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
- package/assets/docs/tree/single-component.doc.mjs +14 -6
- package/assets/docs/tree/start-a-template.doc.mjs +18 -8
- package/assets/docs/tree/subcomponent.doc.mjs +6 -6
- package/assets/docs/tree/template-assets.doc.mjs +2 -2
- package/assets/docs/tree/template-doc-overview.doc.mjs +6 -17
- package/assets/docs/tree/template-fonts.doc.mjs +1 -1
- package/assets/docs/tree/template-icons.doc.mjs +1 -1
- package/assets/docs/tree/template-images-media.doc.mjs +1 -1
- package/assets/docs/tree/template-styles.doc.mjs +2 -2
- package/assets/docs/tree/templates.doc.mjs +7 -1
- package/assets/docs/tree/test-in-an-app.doc.mjs +7 -7
- package/assets/docs/tree/test-template-in-app.doc.mjs +5 -5
- package/assets/docs/tree/themes.doc.mjs +4 -0
- package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
- package/assets/docs/tree/troubleshooting.doc.mjs +22 -14
- package/assets/docs/tree/uninstall.doc.mjs +109 -0
- package/assets/docs/tree/updates.doc.mjs +92 -0
- package/assets/docs/tree/upgrading.doc.mjs +6 -6
- package/assets/docs/tree/use-a-theme-in-an-app.doc.mjs +14 -2
- package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
- package/assets/docs/tree/versioning.doc.mjs +9 -9
- package/assets/docs/tree/who-answers.doc.mjs +119 -0
- package/assets/docs/tree/write-the-template-file.doc.mjs +5 -5
- package/assets/docs/working-with-ai.doc.mjs +23 -9
- package/authoring/codemod/codemod.doc.mjs +7 -3
- package/authoring/config/config.doc.mjs +9 -6
- package/authoring/config/type.ts +4 -2
- package/authoring/debug/parse.d.mts +5 -5
- package/authoring/discover/discover.doc.mjs +7 -1
- package/authoring/doctypes/_schema.d.mts +8 -3
- package/authoring/doctypes/_schema.mjs +1 -0
- package/authoring/doctypes/base/graph-fields.doc.mjs +6 -4
- package/authoring/doctypes/command/command.doc.mjs +20 -12
- package/authoring/doctypes/command/type.ts +14 -0
- package/authoring/doctypes/component/component.doc.mjs +29 -26
- package/authoring/doctypes/component/type.ts +15 -5
- package/authoring/doctypes/enum/enum.doc.mjs +7 -4
- package/authoring/doctypes/function/function.doc.mjs +9 -8
- package/authoring/doctypes/hook/hook.doc.mjs +5 -4
- package/authoring/doctypes/hook/type.ts +4 -0
- package/authoring/doctypes/namespace/namespace.doc.mjs +7 -6
- package/authoring/doctypes/reference/reference.doc.mjs +12 -11
- package/authoring/doctypes/schema/schema.doc.mjs +9 -9
- package/authoring/doctypes/template/template.doc.mjs +2 -2
- package/authoring/doctypes/theme/theme.doc.mjs +2 -2
- package/authoring/gap-report/gap-report.doc.mjs +2 -2
- package/authoring/identity/identity.doc.mjs +3 -3
- package/authoring/index.d.ts +1 -0
- package/authoring/integration/integration.doc.mjs +22 -5
- package/authoring/integration/parse.test.mjs +11 -0
- package/authoring/integration/schema.d.mts +14 -3
- package/authoring/integration/schema.mjs +33 -2
- package/authoring/integration/type.ts +8 -0
- package/clients/cli/bin/astryx.mjs +20 -3
- package/clients/cli/cli-command.test.mjs +166 -0
- package/clients/cli/commands/blog.doc.mjs +1 -0
- package/clients/cli/commands/build-theme.batch-report.test.mjs +14 -2
- package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
- package/clients/cli/commands/build-theme.mjs +25 -12
- package/clients/cli/commands/build.doc.mjs +1 -0
- package/clients/cli/commands/build.exit-codes-doc.test.mjs +4 -0
- package/clients/cli/commands/cli-postinstall.test.mjs +49 -1
- package/clients/cli/commands/component.doc.mjs +1 -0
- package/clients/cli/commands/discover.broken-integration.test.mjs +11 -7
- package/clients/cli/commands/discover.doc.mjs +9 -1
- package/clients/cli/commands/discover.mjs +144 -93
- package/clients/cli/commands/discover.no-source.test.mjs +448 -33
- package/clients/cli/commands/discover.sources.test.mjs +20 -1
- package/clients/cli/commands/docs.doc.mjs +1 -0
- package/clients/cli/commands/docs.mjs +49 -19
- package/clients/cli/commands/docs.test.mjs +2 -2
- package/clients/cli/commands/doctor-integration-components.doc.mjs +7 -3
- package/clients/cli/commands/doctor-integration-docs.doc.mjs +20 -5
- package/clients/cli/commands/doctor-integration-templates.doc.mjs +1 -0
- package/clients/cli/commands/doctor-integration-validate.doc.mjs +13 -2
- package/clients/cli/commands/doctor-integration.test.mjs +52 -4
- package/clients/cli/commands/doctor.doc.mjs +12 -2
- package/clients/cli/commands/doctor.mjs +102 -7
- package/clients/cli/commands/doctor.test.mjs +10 -4
- package/clients/cli/commands/gap-report.doc.mjs +15 -2
- package/clients/cli/commands/gap-report.mjs +24 -2
- package/clients/cli/commands/gap-report.test.mjs +79 -0
- package/clients/cli/commands/hook.doc.mjs +1 -0
- package/clients/cli/commands/init.behavior.test.mjs +5 -0
- package/clients/cli/commands/init.doc.mjs +29 -3
- package/clients/cli/commands/integration-add.doc.mjs +7 -0
- package/clients/cli/commands/integration-authoring.test.mjs +49 -3
- package/clients/cli/commands/integration-check.doc.mjs +10 -2
- package/clients/cli/commands/integration-check.test.mjs +175 -1
- package/clients/cli/commands/integration-pack.doc.mjs +8 -1
- package/clients/cli/commands/integration-verify.doc.mjs +8 -1
- package/clients/cli/commands/integration.mjs +15 -9
- package/clients/cli/commands/json-contract.test.mjs +11 -2
- package/clients/cli/commands/manifest.doc.mjs +1 -0
- package/clients/cli/commands/outside-project.test.mjs +774 -0
- package/clients/cli/commands/search.doc.mjs +1 -0
- package/clients/cli/commands/search.mjs +16 -11
- package/clients/cli/commands/search.test.mjs +429 -296
- package/clients/cli/commands/setup-nudge.test.mjs +102 -2
- package/clients/cli/commands/swizzle.doc.mjs +7 -0
- package/clients/cli/commands/swizzle.mjs +5 -3
- package/clients/cli/commands/swizzle.routing.test.mjs +19 -2
- package/clients/cli/commands/template.doc.mjs +1 -0
- package/clients/cli/commands/theme-add-lifecycle.test.mjs +3 -3
- package/clients/cli/commands/theme-add.doc.mjs +8 -1
- package/clients/cli/commands/theme-build.doc.mjs +1 -0
- package/clients/cli/commands/theme-eject.doc.mjs +1 -0
- package/clients/cli/commands/theme-list.behavior.test.mjs +6 -0
- package/clients/cli/commands/theme-list.doc.mjs +1 -0
- package/clients/cli/commands/theme-palette-generate.doc.mjs +1 -0
- package/clients/cli/commands/theme-remove.doc.mjs +7 -0
- package/clients/cli/commands/theme-targets.doc.mjs +1 -0
- package/clients/cli/commands/theme-template.doc.mjs +1 -0
- package/clients/cli/commands/theme-use.doc.mjs +7 -0
- package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
- package/clients/cli/commands/upgrade.doc.mjs +22 -1
- package/clients/cli/commands/upgrade.file-protection.test.mjs +3 -2
- package/clients/cli/commands/upgrade.hook-output.test.mjs +2 -1
- package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
- package/clients/cli/index.mjs +111 -16
- package/clients/cli/lib/cli-error.mjs +4 -1
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +2 -2
- package/clients/cli/lib/json-shim.mjs +3 -1
- package/clients/cli/lib/manifest.d.ts +9 -0
- package/clients/cli/lib/manifest.mjs +17 -1
- package/clients/cli/lib/manifest.test.mjs +25 -0
- package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
- package/foundation/agent-docs/agent-doc-state.mjs +66 -6
- package/foundation/agent-docs/agent-docs.d.mts +4 -3
- package/foundation/agent-docs/agent-docs.mjs +11 -9
- package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
- package/foundation/agent-docs/computer-agent-text.mjs +623 -0
- package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
- package/foundation/config/project.d.mts +35 -3
- package/foundation/config/project.mjs +145 -8
- package/foundation/config/project.test.mjs +66 -0
- package/foundation/config/theme-state.mjs +5 -4
- package/foundation/discovery/authoring-self-docs.mjs +1 -1
- package/foundation/discovery/cli-self-docs.mjs +20 -3
- package/foundation/discovery/cli-self-docs.test.mjs +3 -2
- package/foundation/discovery/component-replacement.mjs +2 -1
- package/foundation/discovery/copied-passages.d.mts +216 -0
- package/foundation/discovery/copied-passages.mjs +720 -0
- package/foundation/discovery/copied-passages.test.mjs +124 -0
- package/foundation/discovery/doc-consistency.d.mts +34 -0
- package/foundation/discovery/doc-consistency.mjs +513 -0
- package/foundation/discovery/doc-consistency.test.mjs +347 -0
- package/foundation/discovery/doc-fluff.d.mts +112 -0
- package/foundation/discovery/doc-fluff.mjs +328 -0
- package/foundation/discovery/doc-fluff.test.mjs +142 -0
- package/foundation/discovery/doc-types.d.mts +1 -1
- package/foundation/discovery/doc-types.mjs +15 -8
- package/foundation/discovery/doc-types.test.mjs +94 -2
- package/foundation/discovery/docs-discovery.d.mts +7 -0
- package/foundation/discovery/docs-discovery.mjs +26 -2
- package/foundation/discovery/project-typescript.d.mts +11 -2
- package/foundation/discovery/project-typescript.mjs +32 -4
- package/foundation/discovery/prop-drift.d.mts +26 -7
- package/foundation/discovery/prop-drift.mjs +173 -8
- package/foundation/discovery/prop-drift.test.mjs +120 -2
- package/foundation/discovery/runner-allowlist.d.mts +40 -0
- package/foundation/discovery/runner-allowlist.mjs +53 -0
- package/foundation/discovery/stray-pointers.d.mts +52 -0
- package/foundation/discovery/stray-pointers.mjs +293 -0
- package/foundation/discovery/stray-pointers.test.mjs +86 -0
- package/foundation/discovery/template-needs.mjs +5 -2
- package/foundation/discovery/theme-imports.mjs +8 -4
- package/foundation/discovery/theme-imports.test.mjs +1 -1
- package/foundation/discovery/type-text.mjs +1 -1
- package/foundation/discovery/type-text.test.mjs +1 -1
- package/foundation/doc-compiler/doc-loads.test.mjs +42 -2
- package/foundation/doc-compiler/inputs.mjs +4 -1
- package/foundation/doc-compiler/links.d.mts +32 -0
- package/foundation/doc-compiler/links.mjs +163 -26
- package/foundation/doc-compiler/links.test.mjs +97 -4
- package/foundation/doc-compiler/read.d.mts +1 -1
- package/foundation/doc-compiler/tree.mjs +30 -1
- package/foundation/doc-compiler/tree.test.mjs +8 -1
- package/foundation/env/cli-command.d.mts +83 -0
- package/foundation/env/cli-command.mjs +152 -0
- package/foundation/env/cli-command.test.mjs +129 -0
- package/foundation/env/node-version.test.mjs +15 -3
- package/foundation/env/package-manager.d.mts +93 -9
- package/foundation/env/package-manager.global.test.mjs +66 -0
- package/foundation/env/package-manager.mjs +184 -13
- package/foundation/env/package-manager.test.mjs +341 -15
- package/foundation/env/project-scope.d.mts +9 -0
- package/foundation/env/project-scope.mjs +33 -0
- package/foundation/env/search-path.d.mts +42 -0
- package/foundation/env/search-path.mjs +205 -0
- package/foundation/env/search-path.test.mjs +122 -0
- package/foundation/env/user-dirs.d.mts +39 -0
- package/foundation/env/user-dirs.mjs +93 -0
- package/foundation/env/user-dirs.test.mjs +72 -0
- package/foundation/env/user-settings.d.mts +46 -0
- package/foundation/env/user-settings.mjs +106 -0
- package/foundation/env/user-settings.test.mjs +64 -0
- package/foundation/fs/file-protection.mjs +15 -1
- package/foundation/fs/module-loader.d.mts +2 -1
- package/foundation/fs/module-loader.mjs +60 -4
- package/foundation/fs/module-loader.stdout.test.mjs +3 -2
- package/foundation/fs/module-loader.test.mjs +194 -0
- package/foundation/fs/path-compare.d.mts +33 -0
- package/foundation/fs/path-compare.mjs +73 -0
- package/foundation/fs/paths.d.mts +57 -1
- package/foundation/fs/paths.mjs +131 -3
- package/foundation/fs/paths.test.mjs +10 -1
- package/foundation/integrations/computer-integrations.d.mts +78 -0
- package/foundation/integrations/computer-integrations.mjs +316 -0
- package/foundation/integrations/computer-integrations.test.mjs +292 -0
- package/foundation/integrations/contribution-inventory.d.mts +11 -0
- package/foundation/integrations/contribution-inventory.mjs +50 -2
- package/foundation/integrations/integration-warnings.mjs +3 -2
- package/foundation/integrations/integration-warnings.test.mjs +8 -9
- package/foundation/integrations/integrations.d.mts +25 -1
- package/foundation/integrations/integrations.mjs +46 -3
- package/foundation/integrations/issue.ts +6 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +41 -1
- package/foundation/release/agent-text-worker.d.mts +4 -0
- package/foundation/release/agent-text-worker.mjs +52 -0
- package/foundation/release/cache.d.mts +310 -0
- package/foundation/release/cache.mjs +1216 -0
- package/foundation/release/cache.test.mjs +920 -0
- package/foundation/release/choose.d.mts +207 -0
- package/foundation/release/choose.mjs +677 -0
- package/foundation/release/choose.test.mjs +427 -0
- package/foundation/release/core-worker.d.mts +4 -0
- package/foundation/release/core-worker.mjs +38 -0
- package/foundation/release/global-state.d.mts +259 -0
- package/foundation/release/global-state.mjs +472 -0
- package/foundation/release/global-state.test.mjs +381 -0
- package/foundation/release/handoff.d.mts +60 -0
- package/foundation/release/handoff.e2e.test.mjs +278 -0
- package/foundation/release/handoff.mjs +357 -0
- package/foundation/release/lock-lease.d.mts +23 -0
- package/foundation/release/lock-lease.mjs +80 -0
- package/foundation/release/notices.d.mts +253 -0
- package/foundation/release/notices.mjs +596 -0
- package/foundation/release/notices.test.mjs +565 -0
- package/foundation/release/npm-guard.d.mts +4 -0
- package/foundation/release/npm-guard.mjs +126 -0
- package/foundation/release/project.d.mts +141 -0
- package/foundation/release/project.mjs +466 -0
- package/foundation/release/project.test.mjs +288 -0
- package/foundation/release/refresh-worker.d.mts +4 -0
- package/foundation/release/refresh-worker.mjs +27 -0
- package/foundation/release/run-context.d.mts +47 -0
- package/foundation/release/run-context.mjs +149 -0
- package/foundation/release/update-notice-env.d.mts +28 -0
- package/foundation/release/update-notice-env.mjs +39 -0
- package/foundation/response/base.d.ts +26 -3
- package/foundation/response/error-codes.d.mts +3 -1
- package/foundation/response/error-codes.doc.mjs +12 -0
- package/foundation/response/error-codes.mjs +17 -0
- package/foundation/response/error-codes.test.mjs +2 -0
- package/foundation/response/json-contract.test.mjs +7 -2
- package/foundation/response/json.mjs +4 -1
- package/foundation/response/response-types.doc.mjs +17 -11
- package/foundation/response/response-types.doc.test.mjs +46 -0
- package/foundation/response/response.doc.mjs +3 -3
- package/foundation/xle/browser-imports.test.mjs +74 -0
- package/package.json +11 -11
- package/scripts/postinstall.mjs +24 -5
- /package/assets/codemods/transforms/{next → v0.7.2}/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +0 -0
- /package/assets/codemods/transforms/{next → v0.7.2}/migrate-list-edge-compensation-to-edge.mjs +0 -0
|
@@ -34,13 +34,17 @@ export function kindLists(contributions: CatalogPackage["contributions"]): Recor
|
|
|
34
34
|
*/
|
|
35
35
|
export function hasKind(entry: Record<string, unknown>, kind: DiscoverKind): boolean;
|
|
36
36
|
/**
|
|
37
|
-
* Where a catalog package stands against the project.
|
|
37
|
+
* Where a catalog package stands against the project. An entry the official
|
|
38
|
+
* list supplied is checked against the project's own package.json
|
|
39
|
+
* (`officialDeclared`); any other entry against the folder discover runs in
|
|
40
|
+
* (`declared`).
|
|
38
41
|
* @param {CatalogPackage} pkg
|
|
39
42
|
* @param {Set<string>} installedNames
|
|
40
43
|
* @param {Set<string>} declared
|
|
44
|
+
* @param {Set<string>} [officialDeclared]
|
|
41
45
|
* @returns {{state: 'installed' | 'declared' | 'alias' | 'available', installedAs?: string}}
|
|
42
46
|
*/
|
|
43
|
-
export function catalogState(pkg: CatalogPackage, installedNames: Set<string>, declared: Set<string>): {
|
|
47
|
+
export function catalogState(pkg: CatalogPackage, installedNames: Set<string>, declared: Set<string>, officialDeclared?: Set<string>): {
|
|
44
48
|
state: "installed" | "declared" | "alias" | "available";
|
|
45
49
|
installedAs?: string;
|
|
46
50
|
};
|
|
@@ -64,12 +68,18 @@ export function catalogEntry(pkg: CatalogPackage, version: string | undefined):
|
|
|
64
68
|
};
|
|
65
69
|
/**
|
|
66
70
|
* What the project could add: every catalog package it does not have, once per
|
|
67
|
-
* integration (the first name a source lists), never an alias of one it has
|
|
71
|
+
* integration (the first name a source lists), never an alias of one it has,
|
|
72
|
+
* each with the command that adds it when `install` is given.
|
|
68
73
|
* @param {CatalogResult} catalog
|
|
69
74
|
* @param {InstalledPackage[]} installed
|
|
70
75
|
* @param {Set<string>} declared
|
|
76
|
+
* @param {{officialDeclared?: Set<string>, install?: (pkg: CatalogPackage) => string}} [options]
|
|
71
77
|
*/
|
|
72
|
-
export function availableEntries(catalog: CatalogResult, installed: InstalledPackage[], declared: Set<string
|
|
78
|
+
export function availableEntries(catalog: CatalogResult, installed: InstalledPackage[], declared: Set<string>, { officialDeclared, install }?: {
|
|
79
|
+
officialDeclared?: Set<string>;
|
|
80
|
+
install?: (pkg: CatalogPackage) => string;
|
|
81
|
+
}): {
|
|
82
|
+
install?: string | undefined;
|
|
73
83
|
source: string;
|
|
74
84
|
aliases?: string[] | undefined;
|
|
75
85
|
description?: string | undefined;
|
|
@@ -93,9 +103,10 @@ export function withLatest(installed: InstalledPackage[], catalog: CatalogResult
|
|
|
93
103
|
* @param {InstalledPackage[]} installed
|
|
94
104
|
* @param {CatalogResult} catalog
|
|
95
105
|
* @param {Set<string>} declared
|
|
106
|
+
* @param {Set<string>} [officialDeclared]
|
|
96
107
|
* @returns {SearchItem[]}
|
|
97
108
|
*/
|
|
98
|
-
export function searchItems(installed: InstalledPackage[], catalog: CatalogResult, declared: Set<string>): SearchItem[];
|
|
109
|
+
export function searchItems(installed: InstalledPackage[], catalog: CatalogResult, declared: Set<string>, officialDeclared?: Set<string>): SearchItem[];
|
|
99
110
|
export type InstalledPackage = import("./_adapter.mjs").InstalledPackage;
|
|
100
111
|
export type CatalogResult = import("./_adapter.mjs").CatalogResult;
|
|
101
112
|
export type CatalogPackage = CatalogResult["packages"][number];
|
|
@@ -59,15 +59,24 @@ export function hasKind(entry, kind) {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
* Where a catalog package stands against the project.
|
|
62
|
+
* Where a catalog package stands against the project. An entry the official
|
|
63
|
+
* list supplied is checked against the project's own package.json
|
|
64
|
+
* (`officialDeclared`); any other entry against the folder discover runs in
|
|
65
|
+
* (`declared`).
|
|
63
66
|
* @param {CatalogPackage} pkg
|
|
64
67
|
* @param {Set<string>} installedNames
|
|
65
68
|
* @param {Set<string>} declared
|
|
69
|
+
* @param {Set<string>} [officialDeclared]
|
|
66
70
|
* @returns {{state: 'installed' | 'declared' | 'alias' | 'available', installedAs?: string}}
|
|
67
71
|
*/
|
|
68
|
-
export function catalogState(pkg, installedNames, declared) {
|
|
72
|
+
export function catalogState(pkg, installedNames, declared, officialDeclared) {
|
|
69
73
|
if (installedNames.has(pkg.package)) return {state: 'installed'};
|
|
70
|
-
if (
|
|
74
|
+
if (
|
|
75
|
+
(pkg.official && officialDeclared ? officialDeclared : declared).has(
|
|
76
|
+
pkg.package,
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
return {state: 'declared'};
|
|
71
80
|
const installedAs = pkg.aliases.find(
|
|
72
81
|
name => installedNames.has(name) || declared.has(name),
|
|
73
82
|
);
|
|
@@ -103,18 +112,28 @@ export function catalogEntry(pkg, version) {
|
|
|
103
112
|
|
|
104
113
|
/**
|
|
105
114
|
* What the project could add: every catalog package it does not have, once per
|
|
106
|
-
* integration (the first name a source lists), never an alias of one it has
|
|
115
|
+
* integration (the first name a source lists), never an alias of one it has,
|
|
116
|
+
* each with the command that adds it when `install` is given.
|
|
107
117
|
* @param {CatalogResult} catalog
|
|
108
118
|
* @param {InstalledPackage[]} installed
|
|
109
119
|
* @param {Set<string>} declared
|
|
120
|
+
* @param {{officialDeclared?: Set<string>, install?: (pkg: CatalogPackage) => string}} [options]
|
|
110
121
|
*/
|
|
111
|
-
export function availableEntries(
|
|
122
|
+
export function availableEntries(
|
|
123
|
+
catalog,
|
|
124
|
+
installed,
|
|
125
|
+
declared,
|
|
126
|
+
{officialDeclared, install} = {},
|
|
127
|
+
) {
|
|
112
128
|
const installedNames = new Set(installed.map(p => p.name));
|
|
113
129
|
/** @type {Set<string>} */
|
|
114
130
|
const integrations = new Set();
|
|
115
131
|
const entries = [];
|
|
116
132
|
for (const pkg of catalog.packages) {
|
|
117
|
-
if (
|
|
133
|
+
if (
|
|
134
|
+
catalogState(pkg, installedNames, declared, officialDeclared).state !==
|
|
135
|
+
'available'
|
|
136
|
+
)
|
|
118
137
|
continue;
|
|
119
138
|
if (integrations.has(pkg.integration)) continue;
|
|
120
139
|
integrations.add(pkg.integration);
|
|
@@ -124,6 +143,7 @@ export function availableEntries(catalog, installed, declared) {
|
|
|
124
143
|
...entry,
|
|
125
144
|
...(pkg.aliases.length > 0 ? {aliases: pkg.aliases} : {}),
|
|
126
145
|
source: pkg.source,
|
|
146
|
+
...(install ? {install: install(pkg)} : {}),
|
|
127
147
|
});
|
|
128
148
|
}
|
|
129
149
|
return entries;
|
|
@@ -150,9 +170,10 @@ export function withLatest(installed, catalog) {
|
|
|
150
170
|
* @param {InstalledPackage[]} installed
|
|
151
171
|
* @param {CatalogResult} catalog
|
|
152
172
|
* @param {Set<string>} declared
|
|
173
|
+
* @param {Set<string>} [officialDeclared]
|
|
153
174
|
* @returns {SearchItem[]}
|
|
154
175
|
*/
|
|
155
|
-
export function searchItems(installed, catalog, declared) {
|
|
176
|
+
export function searchItems(installed, catalog, declared, officialDeclared) {
|
|
156
177
|
/** @type {SearchItem[]} */
|
|
157
178
|
const items = [];
|
|
158
179
|
for (const pkg of installed) {
|
|
@@ -176,7 +197,10 @@ export function searchItems(installed, catalog, declared) {
|
|
|
176
197
|
/** @type {Set<string>} */
|
|
177
198
|
const integrations = new Set();
|
|
178
199
|
for (const pkg of catalog.packages) {
|
|
179
|
-
if (
|
|
200
|
+
if (
|
|
201
|
+
catalogState(pkg, installedNames, declared, officialDeclared).state !==
|
|
202
|
+
'available'
|
|
203
|
+
)
|
|
180
204
|
continue;
|
|
181
205
|
if (integrations.has(pkg.integration)) continue;
|
|
182
206
|
integrations.add(pkg.integration);
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
import {findComponent, loadValidatedDoc} from '../../_adapter.mjs';
|
|
17
|
+
import {linkComponentResponse} from '../../../component/_adapter.mjs';
|
|
17
18
|
import {levenshteinDistance} from '../../../../foundation/text/string-utils.mjs';
|
|
18
19
|
import {AstryxError} from '../../../error.mjs';
|
|
19
20
|
import {ERROR_CODES} from '../../../../foundation/response/error-codes.mjs';
|
|
@@ -27,7 +28,14 @@ import {ERROR_CODES} from '../../../../foundation/response/error-codes.mjs';
|
|
|
27
28
|
* @returns {Promise<import('../../discover.type.mjs').DiscoverDetailDocResponse>}
|
|
28
29
|
*/
|
|
29
30
|
export async function docFromResult(result, opts) {
|
|
30
|
-
|
|
31
|
+
const data = await loadValidatedDoc(result, opts);
|
|
32
|
+
// Its `{@link}`s read as the commands that open their docs, as
|
|
33
|
+
// `astryx component` prints them (spec:AST-047 FR9).
|
|
34
|
+
const linked = await linkComponentResponse(
|
|
35
|
+
{type: 'component.detail', package: result.pkg.name, data},
|
|
36
|
+
process.cwd(),
|
|
37
|
+
);
|
|
38
|
+
return {type: 'discover.detail.doc', data: linked.data};
|
|
31
39
|
}
|
|
32
40
|
|
|
33
41
|
/**
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
// @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Whether discover answers a query in this project, or answers every query
|
|
6
|
+
* with the list (spec:AST-051 FR1): it answers once the project loads an
|
|
7
|
+
* integration or has a discover source of its own. This is the rule
|
|
8
|
+
* `discover()` applies to the project it loads; the command reads it to keep
|
|
9
|
+
* the list's hints from suggesting queries that only return the list.
|
|
10
|
+
* @param {import('../../foundation/config/project.mjs').Project | undefined} project
|
|
11
|
+
* @returns {boolean}
|
|
12
|
+
*/
|
|
13
|
+
export function answersQueries(project: import("../../foundation/config/project.mjs").Project | undefined): boolean;
|
|
4
14
|
/**
|
|
5
15
|
* @param {string} [query]
|
|
6
16
|
* @param {import('./discover.type.mjs').DiscoverOptions} [options]
|
|
@@ -13,3 +23,4 @@
|
|
|
13
23
|
* >}
|
|
14
24
|
*/
|
|
15
25
|
export function discover(query?: string, options?: import("./discover.type.mjs").DiscoverOptions): Promise<import("./discover.type.mjs").DiscoverListResponse | import("./discover.type.mjs").DiscoverDetailResponse | import("./discover.type.mjs").DiscoverDetailDocResponse | import("./discover.type.mjs").DiscoverItemResponse | import("./discover.type.mjs").DiscoverSearchResponse>;
|
|
26
|
+
export { OFFICIAL_SOURCE_NAME } from "./_adapter.mjs";
|
|
@@ -14,13 +14,15 @@ export const doc = {
|
|
|
14
14
|
namespace: 'cli/api',
|
|
15
15
|
displayName: 'discover()',
|
|
16
16
|
summary:
|
|
17
|
-
'Browse and search integrations: the ones a project has and, through discover sources, the ones it could add.',
|
|
17
|
+
'Browse and search integrations: the ones a project has and, through the official list and discover sources, the ones it could add.',
|
|
18
18
|
description:
|
|
19
|
-
'Lists the integrations a project loads and
|
|
20
|
-
'the
|
|
19
|
+
'Lists the integrations a project loads and the official packages it declares, then the packages it could add: ' +
|
|
20
|
+
'the official Astryx packages first, from the list the CLI carries, then whatever the discover sources of the ' +
|
|
21
|
+
'project and its integrations list, with what each one adds per kind. An @scope/name query shows one package with every ' +
|
|
21
22
|
'version its source knows; @scope/name@version shows one version; @scope/name/Component returns an installed ' +
|
|
22
23
|
"component's validated doc, and any other item path returns that item. A free-text term searches every item and " +
|
|
23
|
-
'package. Discover only reads: it prints the command that adds a package and never runs it.'
|
|
24
|
+
'package. Discover only reads: it prints the command that adds a package and never runs it.' +
|
|
25
|
+
" In global mode: with `cwd` outside a project, integrations installed next to this CLI package globally are listed as installed; inside a project, only the project's own are, and the compatible global ones are listed in `meta.available` with source `installed for this computer` and an `install` command. See {@link namespace:global} and {@link generic:computer-integrations}.",
|
|
24
26
|
importPath: '@astryxdesign/cli/api',
|
|
25
27
|
signature:
|
|
26
28
|
'discover(query?: string, options?: DiscoverOptions): Promise<DiscoverListResponse | DiscoverDetailResponse | DiscoverDetailDocResponse | DiscoverItemResponse | DiscoverSearchResponse>',
|
|
@@ -89,12 +91,12 @@ export const doc = {
|
|
|
89
91
|
{
|
|
90
92
|
type: 'discover.list',
|
|
91
93
|
description:
|
|
92
|
-
'
|
|
94
|
+
'What the project has: the integrations it loads and the official packages it declares (name, category, components, version, and a list per other kind they add), official packages first. meta.available lists what the project could add, official packages first, each with the command that adds it; inside a project, an integration installed for the computer that the project does not install is listed there too, with source `installed for this computer` and the install command for the project in `install`. meta.sources reports each source, the official list last. When it lists no integration it carries meta.configured.',
|
|
93
95
|
},
|
|
94
96
|
{
|
|
95
97
|
type: 'discover.detail',
|
|
96
98
|
description:
|
|
97
|
-
|
|
99
|
+
"One package: what the shown version adds, whether the project has it, its versions and latest release when a source knows them, and the command that adds it when the project does not have it. An entry from the official list lists the newest release this CLI knows as latest and the project's Core version; its add command pins the project's Core version, else the Core range it declares (quoted), else the latest release. A version or item the official list does not show answers ERR_UNKNOWN_PACKAGE.",
|
|
98
100
|
},
|
|
99
101
|
{
|
|
100
102
|
type: 'discover.detail.doc',
|
|
@@ -123,7 +125,7 @@ export const doc = {
|
|
|
123
125
|
},
|
|
124
126
|
{
|
|
125
127
|
code: 'ERR_UNKNOWN_PACKAGE',
|
|
126
|
-
when: 'neither the project nor any discover source has the package',
|
|
128
|
+
when: 'neither the project, the official list, nor any discover source has the package',
|
|
127
129
|
},
|
|
128
130
|
{
|
|
129
131
|
code: 'ERR_UNKNOWN_COMPONENT',
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* @file Programmatic API for the discover command — dispatcher + barrel.
|
|
5
5
|
*
|
|
6
6
|
* `discover()` browses the integrations a project has and, through discover
|
|
7
|
-
* sources, the ones it could add. It
|
|
7
|
+
* sources and the official list the CLI carries, the ones it could add. It
|
|
8
|
+
* only reads: the package manager installs.
|
|
8
9
|
* Its job is to resolve the project and its sources (via ./_adapter) and route
|
|
9
10
|
* to the leaf that owns each response shape:
|
|
10
11
|
*
|
|
@@ -22,14 +23,20 @@
|
|
|
22
23
|
* the discover leaves.
|
|
23
24
|
*/
|
|
24
25
|
|
|
26
|
+
export {OFFICIAL_SOURCE_NAME} from './_adapter.mjs';
|
|
25
27
|
import {
|
|
26
28
|
addCommand,
|
|
27
29
|
callSources,
|
|
30
|
+
computerAvailableEntries,
|
|
28
31
|
declaredDependencies,
|
|
29
32
|
describeInstalled,
|
|
30
33
|
discoverPackages,
|
|
31
34
|
findComponent,
|
|
32
35
|
hasSources,
|
|
36
|
+
officialDeclarations,
|
|
37
|
+
officialFirst,
|
|
38
|
+
officialList,
|
|
39
|
+
withDeclaredOfficial,
|
|
33
40
|
} from './_adapter.mjs';
|
|
34
41
|
import {
|
|
35
42
|
availableEntries,
|
|
@@ -49,9 +56,6 @@ import {DISCOVER_KINDS} from '../../authoring/discover/parse.mjs';
|
|
|
49
56
|
|
|
50
57
|
const DEFAULT_LIMIT = 20;
|
|
51
58
|
|
|
52
|
-
/** @type {import('./_adapter.mjs').CatalogResult} */
|
|
53
|
-
const NO_CATALOG = {sources: [], packages: []};
|
|
54
|
-
|
|
55
59
|
/**
|
|
56
60
|
* Split a package-shaped query: `name`, `name@version`, or `name/item`, with an
|
|
57
61
|
* optional `@scope/` prefix on the name.
|
|
@@ -144,6 +148,23 @@ function similarItems(entry, wanted) {
|
|
|
144
148
|
}));
|
|
145
149
|
}
|
|
146
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Whether discover answers a query in this project, or answers every query
|
|
153
|
+
* with the list (spec:AST-051 FR1): it answers once the project loads an
|
|
154
|
+
* integration or has a discover source of its own. This is the rule
|
|
155
|
+
* `discover()` applies to the project it loads; the command reads it to keep
|
|
156
|
+
* the list's hints from suggesting queries that only return the list.
|
|
157
|
+
* @param {import('../../foundation/config/project.mjs').Project | undefined} project
|
|
158
|
+
* @returns {boolean}
|
|
159
|
+
*/
|
|
160
|
+
export function answersQueries(project) {
|
|
161
|
+
return (
|
|
162
|
+
project != null &&
|
|
163
|
+
(project.loadedIntegrations.some(i => !i.__loadError) ||
|
|
164
|
+
hasSources(project))
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
147
168
|
/**
|
|
148
169
|
* @param {string} [query]
|
|
149
170
|
* @param {import('./discover.type.mjs').DiscoverOptions} [options]
|
|
@@ -165,24 +186,62 @@ export async function discover(query, options = {}) {
|
|
|
165
186
|
: undefined;
|
|
166
187
|
|
|
167
188
|
const {packages: scanned, configured, project} = await discoverPackages();
|
|
168
|
-
const
|
|
169
|
-
const packages = await describeInstalled(project, scanned);
|
|
189
|
+
const integrations = await describeInstalled(project, scanned);
|
|
170
190
|
const declared = declaredDependencies(project);
|
|
191
|
+
// The official list is always read, so discover always has a source.
|
|
192
|
+
const official = officialList({project});
|
|
193
|
+
const declarations = officialDeclarations(project, official.packages);
|
|
171
194
|
const add = addCommand(project);
|
|
195
|
+
const addOfficial = addCommand(project, {official: official.packages});
|
|
196
|
+
/** @param {{package: string, official?: true}} pkg */
|
|
197
|
+
const installFor = pkg => (pkg.official ? addOfficial : add)(pkg.package);
|
|
172
198
|
|
|
173
199
|
/** @param {{package?: string, version?: string}} [request] */
|
|
174
|
-
const catalogFor =
|
|
175
|
-
|
|
200
|
+
const catalogFor = request => callSources(project, request, {official});
|
|
201
|
+
/**
|
|
202
|
+
* What the project has, once a catalog says which official packages it
|
|
203
|
+
* declares.
|
|
204
|
+
* @param {import('./_adapter.mjs').CatalogResult} catalog
|
|
205
|
+
*/
|
|
206
|
+
const installedFor = catalog =>
|
|
207
|
+
withDeclaredOfficial(
|
|
208
|
+
project,
|
|
209
|
+
integrations,
|
|
210
|
+
catalog,
|
|
211
|
+
declarations,
|
|
212
|
+
official.packages,
|
|
213
|
+
);
|
|
176
214
|
|
|
177
|
-
// No query, or
|
|
178
|
-
|
|
179
|
-
|
|
215
|
+
// No query, or any query in a project that loads no integration and has no
|
|
216
|
+
// discover source of its own: the list (spec:AST-051 FR1).
|
|
217
|
+
if (!query || (integrations.length === 0 && !hasSources(project))) {
|
|
180
218
|
const catalog = await catalogFor();
|
|
219
|
+
const packages = installedFor(catalog);
|
|
220
|
+
// Inside a project, the integrations installed for the computer are
|
|
221
|
+
// available, never loaded (spec AST-081 FR12).
|
|
222
|
+
const computer = await computerAvailableEntries(
|
|
223
|
+
project,
|
|
224
|
+
packages,
|
|
225
|
+
declared,
|
|
226
|
+
add,
|
|
227
|
+
);
|
|
228
|
+
const fromSources = officialFirst(
|
|
229
|
+
availableEntries(catalog, packages, declared, {
|
|
230
|
+
officialDeclared: declarations.any,
|
|
231
|
+
install: installFor,
|
|
232
|
+
}),
|
|
233
|
+
official.packages,
|
|
234
|
+
entry => entry.name,
|
|
235
|
+
);
|
|
236
|
+
const named = new Set(fromSources.map(entry => entry.name));
|
|
181
237
|
return list(withLatest(packages, catalog), {
|
|
182
238
|
configured,
|
|
183
239
|
type,
|
|
184
240
|
only,
|
|
185
|
-
available:
|
|
241
|
+
available: [
|
|
242
|
+
...fromSources,
|
|
243
|
+
...computer.filter(entry => !named.has(entry.name)),
|
|
244
|
+
],
|
|
186
245
|
sources: catalog.sources,
|
|
187
246
|
});
|
|
188
247
|
}
|
|
@@ -199,7 +258,6 @@ export async function discover(query, options = {}) {
|
|
|
199
258
|
}
|
|
200
259
|
|
|
201
260
|
const target = splitTarget(query);
|
|
202
|
-
const installedNames = new Set(packages.map(p => p.name));
|
|
203
261
|
|
|
204
262
|
/**
|
|
205
263
|
* One package, one version, or one item, once `target.name` is known to be
|
|
@@ -207,29 +265,72 @@ export async function discover(query, options = {}) {
|
|
|
207
265
|
* @param {import('./_adapter.mjs').CatalogResult} catalog
|
|
208
266
|
*/
|
|
209
267
|
const packageView = async catalog => {
|
|
268
|
+
const packages = installedFor(catalog);
|
|
269
|
+
const installedNames = new Set(packages.map(p => p.name));
|
|
210
270
|
const entry = catalog.packages.find(p => p.package === target.name);
|
|
211
271
|
const installedAs = entry
|
|
212
|
-
? catalogState(entry, installedNames, declared)
|
|
272
|
+
? catalogState(entry, installedNames, declared, declarations.any)
|
|
273
|
+
.installedAs
|
|
213
274
|
: undefined;
|
|
214
|
-
const
|
|
275
|
+
const isIntegration = integrations.some(p => p.name === target.name);
|
|
276
|
+
// An entry only the official list supplies answers for what it lists.
|
|
277
|
+
// Any other version or item of that package keeps the answer discover
|
|
278
|
+
// gave before the list existed: ERR_UNKNOWN_PACKAGE.
|
|
279
|
+
const officialOnly = entry?.official === true && !isIntegration;
|
|
280
|
+
if (officialOnly && target.version) {
|
|
281
|
+
const local = packages.find(p => p.name === target.name)?.version;
|
|
282
|
+
if (
|
|
283
|
+
target.version !== local &&
|
|
284
|
+
!entry.versions.some(v => v.version === target.version)
|
|
285
|
+
) {
|
|
286
|
+
throw new AstryxError(
|
|
287
|
+
`${target.name}@${target.version} is not a version discover knows here: ${
|
|
288
|
+
entry.versions.length > 0
|
|
289
|
+
? `it knows ${entry.versions.map(v => v.version).join(', ')}`
|
|
290
|
+
: 'it knows no version of it for this project'
|
|
291
|
+
}. Other versions are on the package registry.`,
|
|
292
|
+
[...new Set([...entry.versions.map(v => v.version), local])]
|
|
293
|
+
.filter(v => v != null)
|
|
294
|
+
.map(v => ({
|
|
295
|
+
name: `${target.name}@${v}`,
|
|
296
|
+
reason: 'version discover knows',
|
|
297
|
+
})),
|
|
298
|
+
ERROR_CODES.ERR_UNKNOWN_PACKAGE,
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
const context = {
|
|
303
|
+
catalog: entry,
|
|
304
|
+
version: target.version,
|
|
305
|
+
// Only an entry the official list supplied gets a pinned version.
|
|
306
|
+
add: entry?.official ? addOfficial : add,
|
|
307
|
+
installedAs,
|
|
308
|
+
};
|
|
215
309
|
if (!target.item) return detail(packages, target.name, context);
|
|
216
310
|
const found = item(packages, target.name, target.item, context);
|
|
217
311
|
if (found) return found;
|
|
312
|
+
if (officialOnly) {
|
|
313
|
+
throw new AstryxError(
|
|
314
|
+
`"${target.item}" not found in ${target.name}`,
|
|
315
|
+
similarItems(entry, target.item),
|
|
316
|
+
ERROR_CODES.ERR_UNKNOWN_PACKAGE,
|
|
317
|
+
);
|
|
318
|
+
}
|
|
218
319
|
// Only an installed package has docs to fall back to. For one that is
|
|
219
320
|
// only in a source, the item is what is unknown, not the package.
|
|
220
|
-
if (entry && !
|
|
321
|
+
if (entry && !isIntegration) {
|
|
221
322
|
throw new AstryxError(
|
|
222
323
|
`"${target.item}" not found in ${target.name}`,
|
|
223
324
|
similarItems(entry, target.item),
|
|
224
325
|
ERROR_CODES.ERR_UNKNOWN_COMPONENT,
|
|
225
326
|
);
|
|
226
327
|
}
|
|
227
|
-
return await doc(
|
|
328
|
+
return await doc(integrations, target.name, target.item, {lang, zh});
|
|
228
329
|
};
|
|
229
330
|
|
|
230
331
|
// An installed component keeps resolving to its full doc, before any source
|
|
231
332
|
// is asked anything.
|
|
232
|
-
const installedPkg =
|
|
333
|
+
const installedPkg = integrations.find(p => p.name === target.name);
|
|
233
334
|
if (installedPkg && target.item && !target.version) {
|
|
234
335
|
const resolved = findComponent([installedPkg], target.item);
|
|
235
336
|
if (resolved) return await docFromResult(resolved, {lang, zh});
|
|
@@ -251,8 +352,9 @@ export async function discover(query, options = {}) {
|
|
|
251
352
|
);
|
|
252
353
|
}
|
|
253
354
|
|
|
355
|
+
const packages = installedFor(listing);
|
|
254
356
|
return await search(packages, query, {
|
|
255
|
-
items: searchItems(packages, listing, declared),
|
|
357
|
+
items: searchItems(packages, listing, declared, declarations.any),
|
|
256
358
|
type,
|
|
257
359
|
only,
|
|
258
360
|
limit: limit ?? DEFAULT_LIMIT,
|
|
@@ -7,25 +7,29 @@
|
|
|
7
7
|
export type DiscoverListResponse = {
|
|
8
8
|
type: "discover.list";
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* What the project has: the integrations
|
|
11
|
+
* it loads and the official packages it declares, official packages first.
|
|
11
12
|
*/
|
|
12
13
|
data: DiscoverListEntry[];
|
|
13
14
|
/**
|
|
14
15
|
* Present when the list is empty, and
|
|
15
|
-
* whenever
|
|
16
|
+
* whenever discover has a source, which is always: the official list the CLI
|
|
17
|
+
* carries is one.
|
|
16
18
|
*/
|
|
17
19
|
meta?: DiscoverListMeta | undefined;
|
|
18
20
|
};
|
|
19
21
|
export type DiscoverListMeta = {
|
|
20
22
|
/**
|
|
21
|
-
* Present when `data`
|
|
23
|
+
* Present when `data` lists no integration (a
|
|
24
|
+
* declared official package is not one), so callers can
|
|
22
25
|
* distinguish "no packages configured" from "configured but nothing
|
|
23
26
|
* discovered".
|
|
24
27
|
*/
|
|
25
28
|
configured?: boolean | undefined;
|
|
26
29
|
/**
|
|
27
30
|
* What the project could add,
|
|
28
|
-
* one entry per integration, never an alias of a package it has
|
|
31
|
+
* one entry per integration, never an alias of a package it has; official
|
|
32
|
+
* packages first.
|
|
29
33
|
*/
|
|
30
34
|
available?: DiscoverAvailableEntry[] | undefined;
|
|
31
35
|
/**
|
|
@@ -34,7 +38,7 @@ export type DiscoverListMeta = {
|
|
|
34
38
|
sources?: DiscoverSourceState[] | undefined;
|
|
35
39
|
};
|
|
36
40
|
/**
|
|
37
|
-
* An installed integration.
|
|
41
|
+
* An installed integration, or an official package the project declares.
|
|
38
42
|
*/
|
|
39
43
|
export type DiscoverListEntry = {
|
|
40
44
|
name: string;
|
|
@@ -89,14 +93,23 @@ export type DiscoverAvailableEntry = {
|
|
|
89
93
|
*/
|
|
90
94
|
aliases?: string[] | undefined;
|
|
91
95
|
/**
|
|
92
|
-
* The discover source that lists it
|
|
96
|
+
* The discover source that lists it; `Astryx` for
|
|
97
|
+
* the official list; `installed for this computer` for an integration
|
|
98
|
+
* installed beside the CLI that the project does not install (spec AST-081
|
|
99
|
+
* FR12).
|
|
93
100
|
*/
|
|
94
101
|
source: string;
|
|
102
|
+
/**
|
|
103
|
+
* The package-manager command that adds it to
|
|
104
|
+
* this project; discover prints it and never runs it.
|
|
105
|
+
*/
|
|
106
|
+
install?: string | undefined;
|
|
95
107
|
};
|
|
96
108
|
export type DiscoverSourceState = {
|
|
97
109
|
name: string;
|
|
98
110
|
/**
|
|
99
|
-
* `astryx.config`,
|
|
111
|
+
* `astryx.config`, the integration that exports it, or
|
|
112
|
+
* `@astryxdesign/cli` for the official list.
|
|
100
113
|
*/
|
|
101
114
|
from: string;
|
|
102
115
|
/**
|
|
@@ -21,23 +21,27 @@
|
|
|
21
21
|
* astryx --json discover
|
|
22
22
|
* @typedef {object} DiscoverListResponse
|
|
23
23
|
* @property {'discover.list'} type
|
|
24
|
-
* @property {DiscoverListEntry[]} data
|
|
24
|
+
* @property {DiscoverListEntry[]} data What the project has: the integrations
|
|
25
|
+
* it loads and the official packages it declares, official packages first.
|
|
25
26
|
* @property {DiscoverListMeta} [meta] Present when the list is empty, and
|
|
26
|
-
* whenever
|
|
27
|
+
* whenever discover has a source, which is always: the official list the CLI
|
|
28
|
+
* carries is one.
|
|
27
29
|
*/
|
|
28
30
|
|
|
29
31
|
/**
|
|
30
32
|
* @typedef {object} DiscoverListMeta
|
|
31
|
-
* @property {boolean} [configured] Present when `data`
|
|
33
|
+
* @property {boolean} [configured] Present when `data` lists no integration (a
|
|
34
|
+
* declared official package is not one), so callers can
|
|
32
35
|
* distinguish "no packages configured" from "configured but nothing
|
|
33
36
|
* discovered".
|
|
34
37
|
* @property {DiscoverAvailableEntry[]} [available] What the project could add,
|
|
35
|
-
* one entry per integration, never an alias of a package it has
|
|
38
|
+
* one entry per integration, never an alias of a package it has; official
|
|
39
|
+
* packages first.
|
|
36
40
|
* @property {DiscoverSourceState[]} [sources] What each discover source did.
|
|
37
41
|
*/
|
|
38
42
|
|
|
39
43
|
/**
|
|
40
|
-
* An installed integration.
|
|
44
|
+
* An installed integration, or an official package the project declares.
|
|
41
45
|
* @typedef {object} DiscoverListEntry
|
|
42
46
|
* @property {string} name
|
|
43
47
|
* @property {string} category
|
|
@@ -66,13 +70,19 @@
|
|
|
66
70
|
* @property {string[]} [agentDocs]
|
|
67
71
|
* @property {string} [description]
|
|
68
72
|
* @property {string[]} [aliases] The integration's other package names.
|
|
69
|
-
* @property {string} source The discover source that lists it
|
|
73
|
+
* @property {string} source The discover source that lists it; `Astryx` for
|
|
74
|
+
* the official list; `installed for this computer` for an integration
|
|
75
|
+
* installed beside the CLI that the project does not install (spec AST-081
|
|
76
|
+
* FR12).
|
|
77
|
+
* @property {string} [install] The package-manager command that adds it to
|
|
78
|
+
* this project; discover prints it and never runs it.
|
|
70
79
|
*/
|
|
71
80
|
|
|
72
81
|
/**
|
|
73
82
|
* @typedef {object} DiscoverSourceState
|
|
74
83
|
* @property {string} name
|
|
75
|
-
* @property {string} from `astryx.config`,
|
|
84
|
+
* @property {string} from `astryx.config`, the integration that exports it, or
|
|
85
|
+
* `@astryxdesign/cli` for the official list.
|
|
76
86
|
* @property {'fresh' | 'saved' | 'failed'} status `saved`: the live call
|
|
77
87
|
* failed and discover used the copy saved at `savedAt`.
|
|
78
88
|
* @property {string} [generatedAt]
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Build the discover.list response. `data` lists installed integrations
|
|
6
|
-
*
|
|
7
|
-
* configured
|
|
5
|
+
* Build the discover.list response. `data` lists installed integrations and
|
|
6
|
+
* the official packages the project declares. A `data` with no integration
|
|
7
|
+
* carries `meta.configured`, so callers can distinguish "nothing configured"
|
|
8
|
+
* from "configured but nothing discovered". With discover sources,
|
|
8
9
|
* `meta.available` lists what the project could add and `meta.sources` reports
|
|
9
10
|
* what each source did.
|
|
10
11
|
*
|
|
@@ -12,9 +12,10 @@ import {toEntry} from '../_adapter.mjs';
|
|
|
12
12
|
import {hasKind} from '../_catalog-view.mjs';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
* Build the discover.list response. `data` lists installed integrations
|
|
16
|
-
*
|
|
17
|
-
* configured
|
|
15
|
+
* Build the discover.list response. `data` lists installed integrations and
|
|
16
|
+
* the official packages the project declares. A `data` with no integration
|
|
17
|
+
* carries `meta.configured`, so callers can distinguish "nothing configured"
|
|
18
|
+
* from "configured but nothing discovered". With discover sources,
|
|
18
19
|
* `meta.available` lists what the project could add and `meta.sources` reports
|
|
19
20
|
* what each source did.
|
|
20
21
|
*
|
|
@@ -31,18 +32,24 @@ import {hasKind} from '../_catalog-view.mjs';
|
|
|
31
32
|
export function list(packages, {configured, available, sources, type, only}) {
|
|
32
33
|
const keep = (/** @type {Record<string, unknown>} */ entry) =>
|
|
33
34
|
type == null || hasKind(entry, type);
|
|
34
|
-
const
|
|
35
|
+
const shown =
|
|
35
36
|
only === 'available'
|
|
36
37
|
? []
|
|
37
|
-
: packages
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
);
|
|
38
|
+
: packages.filter(pkg =>
|
|
39
|
+
keep(/** @type {Record<string, unknown>} */ (toEntry(pkg))),
|
|
40
|
+
);
|
|
41
|
+
const data = shown.map(toEntry);
|
|
42
42
|
|
|
43
43
|
/** @type {Record<string, unknown>} */
|
|
44
44
|
const meta = {};
|
|
45
|
-
|
|
45
|
+
// An official package the project declares is not an integration, so it
|
|
46
|
+
// never hides whether any integration is configured.
|
|
47
|
+
if (
|
|
48
|
+
!shown.some(
|
|
49
|
+
pkg => !(/** @type {{declaredOfficial?: true}} */ (pkg).declaredOfficial),
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
meta.configured = configured;
|
|
46
53
|
if (sources !== undefined) {
|
|
47
54
|
meta.available = only === 'installed' ? [] : (available ?? []).filter(keep);
|
|
48
55
|
meta.sources = sources;
|