@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
|
@@ -18,7 +18,7 @@ export const doc = {
|
|
|
18
18
|
'functions. A hook (HookDoc) is the hook-flavored view of this same kind; FunctionDoc ' +
|
|
19
19
|
'adds the fields an API function needs (a {type, data} return envelope, thrown error ' +
|
|
20
20
|
'codes, the wrapping CLI command). The CLI binding itself lives in a separate CommandDoc.',
|
|
21
|
-
appliesTo: 'api/<
|
|
21
|
+
appliesTo: 'api/<dir>/<name>.doc.mjs',
|
|
22
22
|
fields: [
|
|
23
23
|
{
|
|
24
24
|
name: 'type',
|
|
@@ -41,7 +41,7 @@ export const doc = {
|
|
|
41
41
|
name: 'kind',
|
|
42
42
|
type: "'hook' | 'api'",
|
|
43
43
|
description:
|
|
44
|
-
|
|
44
|
+
"Which flavor. Nothing reads it today: no reader sections docs by it or infers it from `importPath`. The CLI's API function docs set 'api'.",
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
name: 'summary',
|
|
@@ -57,12 +57,13 @@ export const doc = {
|
|
|
57
57
|
name: 'namespace',
|
|
58
58
|
type: 'string',
|
|
59
59
|
description:
|
|
60
|
-
"Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's API functions use 'cli/api', which the docs tree adopts by kind: each is the leaf `cli/api/functions/<name
|
|
60
|
+
"Optional in the type, but every doc the CLI ships declares it. The group that reads this doc. The CLI's API functions use 'cli/api', which the docs tree adopts by kind: each is the leaf `cli/api/functions/<name>`, the name in kebab case (`themeUse` is `theme-use`). Every function doc the CLI ships declares one, and `astryx doctor` fails on one that is missing or that nothing reads.",
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
name: 'aliases',
|
|
64
64
|
type: 'string[]',
|
|
65
|
-
description:
|
|
65
|
+
description:
|
|
66
|
+
'Reserved: other names for this doc. Nothing reads it today, so they do not resolve to it.',
|
|
66
67
|
},
|
|
67
68
|
{
|
|
68
69
|
name: 'keywords',
|
|
@@ -231,11 +232,11 @@ export const doc = {
|
|
|
231
232
|
displayName: 'search()',
|
|
232
233
|
namespace: 'cli/api',
|
|
233
234
|
importPath: '@astryxdesign/cli/api',
|
|
234
|
-
summary: 'Find components, hooks, docs, and
|
|
235
|
+
summary: 'Find components, hooks, docs, templates, and themes by term.',
|
|
235
236
|
signature: 'search(query, options?): Promise<SearchResponse>',
|
|
236
237
|
params: [
|
|
237
238
|
{name: 'query', type: 'string', description: 'The search term.', required: true},
|
|
238
|
-
{name: 'options.type', type: "'component' | 'hook' | 'doc' | 'template'", description: 'Restrict results to one domain.'},
|
|
239
|
+
{name: 'options.type', type: "'component' | 'hook' | 'doc' | 'template' | 'theme'", description: 'Restrict results to one domain.'},
|
|
239
240
|
],
|
|
240
241
|
returns: [
|
|
241
242
|
{type: 'search', description: 'Envelope with the query and ranked results[].'},
|
|
@@ -253,11 +254,11 @@ export const doc = {
|
|
|
253
254
|
notes: [
|
|
254
255
|
{
|
|
255
256
|
type: 'prose',
|
|
256
|
-
text: '
|
|
257
|
+
text: '`parseDoc` accepts a stamped function doc without `displayName` and does not check its `usage`, and the CLI reads its own function docs without checking them. Write to the type anyway; it is the contract.',
|
|
257
258
|
},
|
|
258
259
|
{
|
|
259
260
|
type: 'prose',
|
|
260
|
-
text: "The `type` discriminant is 'function' for both flavors.
|
|
261
|
+
text: "The `type` discriminant is 'function' for both flavors. `kind: 'hook'` or `kind: 'api'` names the flavor; nothing reads it today.",
|
|
261
262
|
},
|
|
262
263
|
{
|
|
263
264
|
type: 'prose',
|
|
@@ -16,7 +16,8 @@ export const doc = {
|
|
|
16
16
|
'The doc-type for a standalone React hook (e.g. useMediaQuery, useFocusTrap, ' +
|
|
17
17
|
'useOverflow) that gets its own `.doc.mjs`. Hooks that are part of a component API ' +
|
|
18
18
|
"(e.g. useImperativeDialog) belong in that component's MultiComponentDoc `components` " +
|
|
19
|
-
"array instead. `HookDoc` is the hook-flavored view of the shared `type: 'function'` kind."
|
|
19
|
+
"array instead. `HookDoc` is the hook-flavored view of the shared `type: 'function'` kind. " +
|
|
20
|
+
"`astryx hook` reads Core's hook docs only; an integration lists its hooks in a component doc's `components` array.",
|
|
20
21
|
appliesTo: '{useX}.doc.mjs',
|
|
21
22
|
fields: [
|
|
22
23
|
{
|
|
@@ -195,14 +196,14 @@ export const docs = {
|
|
|
195
196
|
description:
|
|
196
197
|
'Subscribes to a CSS media query and re-renders when it changes. Use for responsive behavior that CSS alone cannot express, such as swapping components by breakpoint.',
|
|
197
198
|
},
|
|
198
|
-
relatedHooks: ['
|
|
199
|
+
relatedHooks: ['useImageMode'],
|
|
199
200
|
};`,
|
|
200
201
|
},
|
|
201
202
|
],
|
|
202
203
|
notes: [
|
|
203
204
|
{
|
|
204
205
|
type: 'prose',
|
|
205
|
-
text: '
|
|
206
|
+
text: '`parseDoc` accepts a stamped hook doc without `displayName` and does not check its `usage`, and `astryx hook` prints a hook doc without checking it at all. Write to the type anyway; it is the contract.',
|
|
206
207
|
},
|
|
207
208
|
{
|
|
208
209
|
type: 'prose',
|
|
@@ -210,7 +211,7 @@ export const docs = {
|
|
|
210
211
|
},
|
|
211
212
|
{
|
|
212
213
|
type: 'prose',
|
|
213
|
-
text: "
|
|
214
|
+
text: "A hook that is part of a component API is listed in that component's MultiComponentDoc `components` array: inline with `params`/`returns`, or by name with its own SubComponentDoc file, as Core's useTableSelection is.",
|
|
214
215
|
},
|
|
215
216
|
],
|
|
216
217
|
};
|
|
@@ -68,6 +68,10 @@ export interface HookDoc extends AuthoredDocGraphFields {
|
|
|
68
68
|
* Translation overlay for hook documentation.
|
|
69
69
|
*/
|
|
70
70
|
export interface HookTranslationDoc {
|
|
71
|
+
/** Optional exact name from the base doc. Ignored at render time. */
|
|
72
|
+
name?: string;
|
|
73
|
+
/** Optional translated displayName. Ignored at render time. */
|
|
74
|
+
displayName?: string;
|
|
71
75
|
/** Compressed/translated description. */
|
|
72
76
|
description?: string;
|
|
73
77
|
/** Param descriptions keyed by param name. */
|
|
@@ -55,7 +55,8 @@ export const doc = {
|
|
|
55
55
|
{
|
|
56
56
|
name: 'audience',
|
|
57
57
|
type: "'public' | 'internal'",
|
|
58
|
-
description:
|
|
58
|
+
description:
|
|
59
|
+
"Reserved: bundle audience. Nothing reads it yet: a namespace that sets 'internal' still shows in `astryx docs`.",
|
|
59
60
|
default: "'public'",
|
|
60
61
|
},
|
|
61
62
|
{
|
|
@@ -67,7 +68,7 @@ export const doc = {
|
|
|
67
68
|
name: 'slots',
|
|
68
69
|
type: 'Record<string, NamespaceSlot>',
|
|
69
70
|
description:
|
|
70
|
-
|
|
71
|
+
"Named placement and collection targets. Each slot declares a title and the doc kinds it accepts. `accepts.providers` is not read yet: only docs of the namespace's own package can be placed in a slot.",
|
|
71
72
|
required: true,
|
|
72
73
|
},
|
|
73
74
|
{
|
|
@@ -80,7 +81,7 @@ export const doc = {
|
|
|
80
81
|
name: 'blocks',
|
|
81
82
|
type: '(ReferenceContentBlock | GraphContentBlock)[]',
|
|
82
83
|
description:
|
|
83
|
-
'Ordered layout content for the namespace page. Graph-only workflow, collection, and reference blocks are available here without widening the stable ReferenceContentBlock union used by existing topic renderers.
|
|
84
|
+
'Ordered layout content for the namespace page. Graph-only workflow, collection, and reference blocks are available here without widening the stable ReferenceContentBlock union used by existing topic renderers. `astryx docs <route>` prints the prose, heading, code, table, and list blocks above the slots, and `--json` returns every block with its links resolved. A collection block is not rendered yet, and `astryx doctor` warns on one.',
|
|
84
85
|
},
|
|
85
86
|
],
|
|
86
87
|
examples: [
|
|
@@ -100,7 +101,7 @@ export const docs = {
|
|
|
100
101
|
},
|
|
101
102
|
},
|
|
102
103
|
adopts: [{
|
|
103
|
-
source: {group: 'cli
|
|
104
|
+
source: {group: 'cli/commands', kinds: ['command']},
|
|
104
105
|
into: 'reference',
|
|
105
106
|
}],
|
|
106
107
|
};`,
|
|
@@ -109,11 +110,11 @@ export const docs = {
|
|
|
109
110
|
notes: [
|
|
110
111
|
{
|
|
111
112
|
type: 'prose',
|
|
112
|
-
text: "The docs tree reads namespace docs from the CLI and from every configured integration. An integration's namespace doc is a top-level level of the tree, and its guides name it with `placement`; a doc can be placed only in a namespace of its own package. When two packages claim one route, the CLI's own docs win, then integrations in configured order, and `astryx doctor` names the loser.",
|
|
113
|
+
text: "The docs tree reads namespace docs from the CLI and from every configured integration. An integration's namespace doc without a `placement` is a top-level level of the tree, and its guides name it with `placement`; a doc can be placed only in a namespace of its own package. When two packages claim one route, the CLI's own docs win, then integrations in configured order, and `astryx doctor` names the loser.",
|
|
113
114
|
},
|
|
114
115
|
{
|
|
115
116
|
type: 'prose',
|
|
116
|
-
text: 'Child docs request one canonical home with placement.
|
|
117
|
+
text: 'Child docs request one canonical home with placement. A collection block refers to those docs by stable reference and never creates a second identity or parent. It is not rendered yet: `astryx doctor` warns on one.',
|
|
117
118
|
},
|
|
118
119
|
{
|
|
119
120
|
type: 'list',
|
|
@@ -18,7 +18,8 @@ export const doc = {
|
|
|
18
18
|
'accessibility, migration guides. Unlike ComponentDoc it is not tied to a component: ' +
|
|
19
19
|
'drop a `.doc.mjs` in the docs directory and it shows up in `astryx docs`. Content is ' +
|
|
20
20
|
'built from ordered sections of mixed content blocks.',
|
|
21
|
-
appliesTo:
|
|
21
|
+
appliesTo:
|
|
22
|
+
"<topic>.doc.{ts,mjs,js} in the folder the integration manifest's `docs` names",
|
|
22
23
|
fields: [
|
|
23
24
|
{
|
|
24
25
|
name: 'type',
|
|
@@ -69,7 +70,7 @@ export const doc = {
|
|
|
69
70
|
name: 'extends',
|
|
70
71
|
type: 'string',
|
|
71
72
|
description:
|
|
72
|
-
"Name of an existing topic this doc merges onto, section by section
|
|
73
|
+
"Name of an existing topic this doc merges onto, section by section. A section replaces the base section with the same `id`, or else the one with exactly its title when either of the two has no `id`. A key derived from a title counts only against an `id`: a section without an `id` also matches a base section whose `id` is the key its title derives, and a section with an `id` also matches a base section without one whose title derives that `id`. Two different `id`s never match, two sections without an `id` whose titles differ only in case or punctuation stay separate, and a section that matches none is appended. The topic keeps the base's title and description. For correcting or adding to a topic rather than owning it. Exclusive with `replaces`.",
|
|
73
74
|
example: "'theme'",
|
|
74
75
|
},
|
|
75
76
|
{
|
|
@@ -83,7 +84,7 @@ export const doc = {
|
|
|
83
84
|
name: 'sections[].id',
|
|
84
85
|
type: 'string',
|
|
85
86
|
description:
|
|
86
|
-
'Stable section anchor. New docs should set this instead of relying on a mutable title.',
|
|
87
|
+
'Stable section anchor. New docs should set this instead of relying on a mutable title. Published @astryxdesign/cli 0.6.3 and earlier reject the field and hide every doc topic the package ships, so `astryx integration verify` fails an integration that sets one until it declares an `@astryxdesign/cli` peer of `>=0.6.4`.',
|
|
87
88
|
},
|
|
88
89
|
{
|
|
89
90
|
name: 'sections[].title',
|
|
@@ -109,7 +110,7 @@ export const doc = {
|
|
|
109
110
|
name: 'sections[].previewType',
|
|
110
111
|
type: 'ReferenceTokenPreviewType',
|
|
111
112
|
description:
|
|
112
|
-
|
|
113
|
+
'Preview type for token tables in this section. The CLI rejects a value not in the list below and returns the value in `astryx docs --json`, but draws no preview from it. Omit for non-token sections.',
|
|
113
114
|
},
|
|
114
115
|
],
|
|
115
116
|
},
|
|
@@ -117,17 +118,17 @@ export const doc = {
|
|
|
117
118
|
name: 'tokenCategory',
|
|
118
119
|
type: 'string',
|
|
119
120
|
description:
|
|
120
|
-
"Token category for foundational docs that map to a token section (e.g. 'color').
|
|
121
|
+
"Token category for foundational docs that map to a token section (e.g. 'color'). `astryx docs --json` returns it as authored; no tokens page links to the doc through it.",
|
|
121
122
|
},
|
|
122
123
|
],
|
|
123
124
|
examples: [
|
|
124
125
|
{
|
|
125
126
|
label: 'A reference doc with one section',
|
|
126
127
|
code: `/** @type {import('@astryxdesign/cli/authoring').ReferenceDoc} */
|
|
127
|
-
export
|
|
128
|
+
export default {
|
|
128
129
|
type: 'generic',
|
|
129
|
-
name: 'spacing',
|
|
130
|
-
title: 'Spacing',
|
|
130
|
+
name: 'acme-spacing',
|
|
131
|
+
title: 'Acme Spacing',
|
|
131
132
|
description: 'Spacing tokens for gap, margin, and padding.',
|
|
132
133
|
category: 'foundations',
|
|
133
134
|
tokenCategory: 'spacing',
|
|
@@ -151,7 +152,7 @@ export const docs = {
|
|
|
151
152
|
},
|
|
152
153
|
{
|
|
153
154
|
type: 'prose',
|
|
154
|
-
text: 'Each `sections[].content` is an ordered array of ReferenceContentBlock, the stable discriminated union of prose, heading, code, table, list, and token-ref, plus the reference block (ReferenceDocBlock). A read inlines a reference block the way it inlines a token-ref, so `astryx docs`, in text and in `--json`, returns only the stable block kinds. Docs-graph-only workflow and collection blocks are exported separately as GraphContentBlock and accepted by NamespaceDoc. choice, callout, and checklist remain invalid. ReferenceContentBlock is also reused by the `notes` field on SchemaDoc and CommandDoc. Inside text, `{@link <target>}` links another doc by identity (`[<provider>:]<kind>:<name>`): the CLI prints the command that opens it, and `astryx doctor` warns on one that names no doc.',
|
|
155
|
+
text: 'Each `sections[].content` is an ordered array of ReferenceContentBlock, the stable discriminated union of prose, heading, code, table, list, and token-ref, plus the reference block (ReferenceDocBlock). A read inlines a reference block the way it inlines a token-ref, so `astryx docs`, in text and in `--json`, returns only the stable block kinds. Docs-graph-only workflow and collection blocks are exported separately as GraphContentBlock and accepted by NamespaceDoc. choice, callout, and checklist remain invalid. ReferenceContentBlock is also reused by the `notes` field on SchemaDoc and CommandDoc. Inside text, `{@link <target>}` links another doc by identity (`[<provider>:]<kind>:<name>`): the CLI prints the command that opens it, and `astryx doctor` warns on one that names no doc. Write a CLI command in text, shell code, or a table cell as a bare `astryx` command: a text read adds the runner the reader uses in front of it, and `--json` returns it as written.',
|
|
155
156
|
},
|
|
156
157
|
{
|
|
157
158
|
type: 'prose',
|
|
@@ -194,7 +195,7 @@ type ReferenceDocBlock = {
|
|
|
194
195
|
|
|
195
196
|
type GraphContentBlock =
|
|
196
197
|
| { type: 'workflow'; title?: string; steps: WorkflowStep[] }
|
|
197
|
-
| { type: 'collection'; source: {slot: string}; presentation?: 'list' | 'cards' | 'compact'; whenEmpty?: 'show' | 'omit' }
|
|
198
|
+
| { type: 'collection'; title?: string; source: {slot: string}; presentation?: 'list' | 'cards' | 'compact'; whenEmpty?: 'show' | 'omit' }
|
|
198
199
|
| ReferenceDocBlock;`,
|
|
199
200
|
},
|
|
200
201
|
{
|
|
@@ -203,7 +204,7 @@ type GraphContentBlock =
|
|
|
203
204
|
},
|
|
204
205
|
{
|
|
205
206
|
type: 'prose',
|
|
206
|
-
text: "A section may set `previewType
|
|
207
|
+
text: "A section may set `previewType`, a hint for previewing its token table, to one of 'swatch' | 'shadow-box' | 'radius-box' | 'spacing-bar' | 'size-bar' | 'border-line' | 'duration-bar' | 'easing-curve' | 'font-sample'; the CLI rejects any other value.",
|
|
207
208
|
},
|
|
208
209
|
],
|
|
209
210
|
};
|
|
@@ -55,7 +55,7 @@ export const doc = {
|
|
|
55
55
|
name: 'aliases',
|
|
56
56
|
type: 'string[]',
|
|
57
57
|
description:
|
|
58
|
-
'
|
|
58
|
+
'Reserved: alternate slugs for this doc. Nothing reads it yet: `astryx docs` finds a schema doc by its `name` only.',
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
name: 'appliesTo',
|
|
@@ -141,7 +141,7 @@ export const doc = {
|
|
|
141
141
|
name: 'notes',
|
|
142
142
|
type: 'ReferenceContentBlock[]',
|
|
143
143
|
description:
|
|
144
|
-
'Freeform prose/notes rendered after the field table.
|
|
144
|
+
'Freeform prose/notes rendered after the field table and examples. The stable ReferenceContentBlock union (prose, heading, code, table, list, token-ref), without the reference block a ReferenceDoc section also takes; a token-ref note is accepted but not rendered.',
|
|
145
145
|
},
|
|
146
146
|
],
|
|
147
147
|
examples: [
|
|
@@ -152,17 +152,17 @@ export const doc = {
|
|
|
152
152
|
type: 'schema',
|
|
153
153
|
name: 'integration',
|
|
154
154
|
displayName: 'Astryx Integration',
|
|
155
|
-
namespace: '
|
|
156
|
-
description: 'The astryx.integration.* manifest that
|
|
155
|
+
namespace: 'authoring',
|
|
156
|
+
description: 'The astryx.integration.* manifest that points the CLI at what a package contributes.',
|
|
157
157
|
appliesTo: 'astryx.integration.{ts,mjs,js}',
|
|
158
158
|
fields: [
|
|
159
|
-
{name: '
|
|
159
|
+
{name: 'docs', type: 'string', description: 'The folder that holds your doc topics, relative to package.json.'},
|
|
160
160
|
{
|
|
161
|
-
name: '
|
|
162
|
-
type: '{
|
|
163
|
-
description: '
|
|
161
|
+
name: 'agentDocs',
|
|
162
|
+
type: '{ append?: readonly string[] }',
|
|
163
|
+
description: 'Guidance your package adds to the agent instructions the CLI manages.',
|
|
164
164
|
fields: [
|
|
165
|
-
{name: '
|
|
165
|
+
{name: 'agentDocs.append', type: 'readonly string[]', description: 'Lines added at the end, at most eight.'},
|
|
166
166
|
],
|
|
167
167
|
},
|
|
168
168
|
],
|
|
@@ -31,14 +31,14 @@ export const doc = {
|
|
|
31
31
|
name: 'name',
|
|
32
32
|
type: 'string',
|
|
33
33
|
description:
|
|
34
|
-
|
|
34
|
+
"Stable identifier for block templates; change `displayName`, not `name`, to edit their visible label in the gallery. For page templates it is a human-readable label, while the existing template-directory/CLI slug owns the default registry path. `astryx template --list` and `astryx search` print `name` as the label of both, and `astryx template <id>` finds a template by its id, never by `name`: an integration template's id is its path under the templates folder without the `.doc.*` suffix.",
|
|
35
35
|
required: true,
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
name: 'displayName',
|
|
39
39
|
type: 'string',
|
|
40
40
|
description:
|
|
41
|
-
"Human-readable label for the gallery
|
|
41
|
+
"Human-readable label for the gallery. The CLI prints `name` instead; `astryx template --list --json` also returns an integration template's `displayName`. Spaces out block names that mirror a PascalCase component ('ChatMessageMetadata' → 'Chat Message Metadata').",
|
|
42
42
|
required: true,
|
|
43
43
|
},
|
|
44
44
|
{
|
|
@@ -12,7 +12,7 @@ export const doc = {
|
|
|
12
12
|
displayName: 'ThemeDoc',
|
|
13
13
|
namespace: 'authoring',
|
|
14
14
|
description:
|
|
15
|
-
|
|
15
|
+
"The strongly typed descriptor for one source theme: bundled with the CLI, shipped by an integration, or kept in the project's src/themes, where `theme eject` writes one.",
|
|
16
16
|
appliesTo: '<theme-source-stem>.doc.mjs',
|
|
17
17
|
fields: [
|
|
18
18
|
{
|
|
@@ -65,7 +65,7 @@ export default {
|
|
|
65
65
|
notes: [
|
|
66
66
|
{
|
|
67
67
|
type: 'prose',
|
|
68
|
-
text:
|
|
68
|
+
text: "ThemeDoc is static metadata. The descriptor holds one default-exported object of literal string and boolean fields, directly under a `/** @type {import('@astryxdesign/cli/authoring').ThemeDoc} */` comment, and nothing else: without that comment, or with any other statement, it fails to load. Discovery validates it without executing the descriptor or theme source.",
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
type: 'prose',
|
|
@@ -15,7 +15,7 @@ export const doc = {
|
|
|
15
15
|
displayName: 'GapReportHandler',
|
|
16
16
|
namespace: 'authoring',
|
|
17
17
|
description:
|
|
18
|
-
|
|
18
|
+
"A handler for `astryx gap-report`: a plain object with an `audience` and a `handle` function. Set it as `gapReport` in astryx.config, or export it as `gapReport` from an integration manifest. Handlers add up rather than replace each other: the project handler first, then each loaded integration's in load order (the `integrations` list, then autolinked ones), whichever package the report is about.",
|
|
19
19
|
appliesTo:
|
|
20
20
|
'`gapReport` in astryx.config.*, or the `gapReport` named export of astryx.integration.*',
|
|
21
21
|
fields: [
|
|
@@ -104,7 +104,7 @@ export const doc = {
|
|
|
104
104
|
name: 'report.target.version',
|
|
105
105
|
type: 'string',
|
|
106
106
|
description:
|
|
107
|
-
|
|
107
|
+
"The integration's version from its package.json. Null for Core, and when the package.json has none.",
|
|
108
108
|
required: true,
|
|
109
109
|
},
|
|
110
110
|
{
|
|
@@ -12,7 +12,7 @@ export const doc = {
|
|
|
12
12
|
displayName: 'Provider and artifact identity',
|
|
13
13
|
namespace: 'authoring',
|
|
14
14
|
description:
|
|
15
|
-
|
|
15
|
+
"Separates stable provider/artifact identity from package instances and runtime lifecycle state. Provider identity names integration manifests and settles provider conflicts. Docs-tree nodes are identified by doc identity; the tree covers the CLI's docs and each integration's. Artifact IDs for kinds outside the docs tree, provider instances, and compiler-input entries are defined for every provider-owned artifact; no command builds them.",
|
|
16
16
|
appliesTo:
|
|
17
17
|
'Integration manifests, provider conflicts, and docs-tree node ids.',
|
|
18
18
|
fields: [
|
|
@@ -41,14 +41,14 @@ export const doc = {
|
|
|
41
41
|
name: 'ProviderInstance',
|
|
42
42
|
type: '{ id; providerId; packageName; packageVersion; sourceDigest }',
|
|
43
43
|
description:
|
|
44
|
-
'One immutable package version and source/content digest.
|
|
44
|
+
'One immutable package version and source/content digest. It carries no installed, configured, loaded, selected, or healthy state.',
|
|
45
45
|
required: true,
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
name: 'AuthoredDocEntry',
|
|
49
49
|
type: '{ id; provider; kind; stableName; source; authored }',
|
|
50
50
|
description:
|
|
51
|
-
'Normalized compiler input.
|
|
51
|
+
'Normalized compiler input. `stableName`, the key in its doc ID, is given separately from the authored display name; source paths remain package-relative, and provider provenance plus the authored snapshot are immutable.',
|
|
52
52
|
required: true,
|
|
53
53
|
},
|
|
54
54
|
],
|
package/authoring/index.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export const doc = {
|
|
|
16
16
|
'The astryx.integration.* manifest that sits beside an integration ' +
|
|
17
17
|
"package's package.json. It can preserve a stable provider identity across a package rename, " +
|
|
18
18
|
"and points the CLI at the package's components, templates, codemods, doc topics, " +
|
|
19
|
-
'source themes, managed agent guidance, and
|
|
19
|
+
'source themes, managed agent guidance, issue tracker, and the command its users run the CLI with. Every field is optional.',
|
|
20
20
|
appliesTo: 'astryx.integration.{ts,mjs,js}',
|
|
21
21
|
fields: [
|
|
22
22
|
{
|
|
@@ -51,7 +51,7 @@ export const doc = {
|
|
|
51
51
|
name: 'docs',
|
|
52
52
|
type: 'string',
|
|
53
53
|
description:
|
|
54
|
-
'The folder that holds your doc topics, relative to package.json. Every {topic}.doc.{ts,mjs,js}
|
|
54
|
+
'The folder that holds your doc topics, relative to package.json. Every {topic}.doc.{ts,mjs,js} under it shows up in `astryx docs`: a flat topic next to the built-in topics, where it can set `replaces` or `extends` to take over a built-in topic or add to it, and a guide with `placement` at its own route in the docs tree, under a namespace doc of the same package.',
|
|
55
55
|
example: "'./docs'",
|
|
56
56
|
},
|
|
57
57
|
{
|
|
@@ -71,7 +71,8 @@ export const doc = {
|
|
|
71
71
|
{
|
|
72
72
|
name: 'issuesUrl',
|
|
73
73
|
type: 'string',
|
|
74
|
-
description:
|
|
74
|
+
description:
|
|
75
|
+
"Where people file issues for this package: an absolute URL, such as its GitHub issues page. A value that is not a URL fails the whole manifest; the scheme is not checked. Nothing warns when it is missing, but without it `astryx gap-report` about this package fails unless the project or a loaded integration has a gapReport handler, and `astryx swizzle` prints no feedback link for this package's components. When no handler is loaded, a github.com issues URL is filed with the GitHub CLI once the reporter passes `--confirm-public`; any other URL is returned for the reporter to open.",
|
|
75
76
|
example: "'https://github.com/acme/widgets/issues'",
|
|
76
77
|
},
|
|
77
78
|
{
|
|
@@ -81,6 +82,13 @@ export const doc = {
|
|
|
81
82
|
"Link to this integration's docs site, such as its home page. Catalogs that list the package may show it.",
|
|
82
83
|
example: "'https://widgets.acme.dev'",
|
|
83
84
|
},
|
|
85
|
+
{
|
|
86
|
+
name: 'cliCommand',
|
|
87
|
+
type: 'string',
|
|
88
|
+
description:
|
|
89
|
+
'The command your users run the Astryx CLI with, when it is not their package manager, such as a wrapper your company ships. Every command the CLI prints in an app that loads your package starts with it, in place of `pnpm exec astryx` or `yarn astryx`: hints, errors, Doctor fixes, and doc text. One line, without a subcommand. If two loaded packages set different commands, neither is used and `astryx doctor` warns. An invalid value is ignored with an `invalid_cli_command` warning, and the rest of the manifest still loads. JSON output keeps commands bare.',
|
|
90
|
+
example: "'acme astryx'",
|
|
91
|
+
},
|
|
84
92
|
],
|
|
85
93
|
examples: [
|
|
86
94
|
{
|
|
@@ -99,6 +107,10 @@ export const doc = {
|
|
|
99
107
|
},
|
|
100
108
|
],
|
|
101
109
|
notes: [
|
|
110
|
+
{
|
|
111
|
+
type: 'prose',
|
|
112
|
+
text: "In global mode: a manifest loads the same way when users install your package for their computer, beside the global CLI, and then applies in folders outside any project; inside a project, only if the project installs it. Peer ranges for `@astryxdesign/core` and `@astryxdesign/cli` are checked against the global CLI's release. See {@link namespace:global} and {@link generic:global-integrations}.",
|
|
113
|
+
},
|
|
102
114
|
{
|
|
103
115
|
type: 'prose',
|
|
104
116
|
text:
|
|
@@ -114,11 +126,16 @@ export const doc = {
|
|
|
114
126
|
'trimmed, non-blank string of at most 240 Unicode code points with no ' +
|
|
115
127
|
'line separators, control characters, NUL, or Astryx/XDS managed-marker ' +
|
|
116
128
|
'text. The configured project may contain at most 32 integration lines ' +
|
|
117
|
-
'total.'
|
|
129
|
+
'total. Write each command in a line as a bare `astryx` command; the ' +
|
|
130
|
+
'managed block says once, before your lines, how the app starts the CLI.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'prose',
|
|
134
|
+
text: "Set `cliCommand` only when your users run the CLI with a command other than their package manager's, such as `acme astryx`. The CLI picks the command it prints in this order: the `cliCommand` of the loaded integrations when they name one command, then the command a host tool names, then the package manager's. Two different `cliCommand` values cancel out, and `astryx doctor` warns in its `cli-command` check. See `astryx docs cli/integrations/building-blocks/configuration/cli-command`.",
|
|
118
135
|
},
|
|
119
136
|
{
|
|
120
137
|
type: 'prose',
|
|
121
|
-
text: 'A themes root is
|
|
138
|
+
text: 'A themes root is version-gated: an older CLI lists and adds none of its themes. Depending on its age, that CLI ignores `themes` with an `unknown_manifest_key` warning and loads every other contribution kind, reports the root as invalid because it expects the earlier `manifest.json` theme catalog, or, if it is old enough to treat an unknown field as an error, rejects the whole manifest, so the package contributes nothing there.',
|
|
122
139
|
},
|
|
123
140
|
{
|
|
124
141
|
type: 'prose',
|
|
@@ -97,6 +97,17 @@ describe('parseIntegration (load boundary)', () => {
|
|
|
97
97
|
expect(reason({docsiteUrl: 'nope'})).toContain('docsiteUrl');
|
|
98
98
|
});
|
|
99
99
|
|
|
100
|
+
it('accepts a cliCommand and rejects one that is not a single clean line', () => {
|
|
101
|
+
expect(parseIntegration({cliCommand: 'acme astryx'})).toEqual({
|
|
102
|
+
cliCommand: 'acme astryx',
|
|
103
|
+
});
|
|
104
|
+
expect(reason({cliCommand: ''})).toContain('cliCommand');
|
|
105
|
+
expect(reason({cliCommand: ' acme astryx'})).toContain('cliCommand');
|
|
106
|
+
expect(reason({cliCommand: 'acme\nastryx'})).toContain('cliCommand');
|
|
107
|
+
expect(reason({cliCommand: 'a'.repeat(121)})).toContain('120');
|
|
108
|
+
expect(reason({cliCommand: 42})).toContain('cliCommand');
|
|
109
|
+
});
|
|
110
|
+
|
|
100
111
|
it('rejects a noncanonical providerId', () => {
|
|
101
112
|
expect(reason({providerId: 'Acme Widgets'})).toContain('providerId');
|
|
102
113
|
});
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Parse every default-manifest field except the independently isolated
|
|
6
|
-
* `agentDocs`
|
|
6
|
+
* `agentDocs` and `cliCommand` fields.
|
|
7
7
|
* @param {unknown} input
|
|
8
8
|
* @param {string} label
|
|
9
|
-
* @returns {Omit<AstryxIntegration, 'agentDocs'>}
|
|
9
|
+
* @returns {Omit<AstryxIntegration, 'agentDocs' | 'cliCommand'>}
|
|
10
10
|
*/
|
|
11
|
-
export function parseIntegrationBase(input: unknown, label: string): Omit<AstryxIntegration, "agentDocs">;
|
|
11
|
+
export function parseIntegrationBase(input: unknown, label: string): Omit<AstryxIntegration, "agentDocs" | "cliCommand">;
|
|
12
12
|
/**
|
|
13
13
|
* Parse only the optional agent-doc contribution.
|
|
14
14
|
* @param {unknown} input
|
|
@@ -16,6 +16,15 @@ export function parseIntegrationBase(input: unknown, label: string): Omit<Astryx
|
|
|
16
16
|
* @returns {NonNullable<AstryxIntegration['agentDocs']>}
|
|
17
17
|
*/
|
|
18
18
|
export function parseAgentDocsField(input: unknown, label: string): NonNullable<AstryxIntegration["agentDocs"]>;
|
|
19
|
+
/**
|
|
20
|
+
* Parse only the optional `cliCommand` field. Isolated like `agentDocs`: an
|
|
21
|
+
* invalid command is ignored with a warning, and the rest of the manifest
|
|
22
|
+
* still contributes.
|
|
23
|
+
* @param {unknown} input
|
|
24
|
+
* @param {string} label
|
|
25
|
+
* @returns {string}
|
|
26
|
+
*/
|
|
27
|
+
export function parseCliCommandField(input: unknown, label: string): string;
|
|
19
28
|
/**
|
|
20
29
|
* The manifest keys this CLI does not know, in the order they were authored.
|
|
21
30
|
*
|
|
@@ -28,6 +37,7 @@ export function parseAgentDocsField(input: unknown, label: string): NonNullable<
|
|
|
28
37
|
* @returns {string[]}
|
|
29
38
|
*/
|
|
30
39
|
export function unknownIntegrationKeys(input: unknown): string[];
|
|
40
|
+
export const cliCommandSchema: z.ZodString;
|
|
31
41
|
export const agentDocsSchema: z.ZodObject<{
|
|
32
42
|
append: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
|
|
33
43
|
}, z.core.$strip>;
|
|
@@ -53,6 +63,7 @@ export const integrationSchema: z.ZodObject<{
|
|
|
53
63
|
agentDocs: z.ZodOptional<z.ZodObject<{
|
|
54
64
|
append: z.ZodOptional<z.ZodReadonly<z.ZodArray<z.ZodString>>>;
|
|
55
65
|
}, z.core.$strip>>;
|
|
66
|
+
cliCommand: z.ZodOptional<z.ZodString>;
|
|
56
67
|
}, z.core.$strip>;
|
|
57
68
|
/**
|
|
58
69
|
* Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
|
|
@@ -19,6 +19,7 @@ import {formatZodError} from '../_shared/errors.mjs';
|
|
|
19
19
|
/** @typedef {import('./type.js').AstryxIntegration} AstryxIntegration */
|
|
20
20
|
|
|
21
21
|
const MAX_AGENT_DOC_LINES = 8;
|
|
22
|
+
const MAX_CLI_COMMAND_CODE_POINTS = 120;
|
|
22
23
|
const MAX_AGENT_DOC_LINE_CODE_POINTS = 240;
|
|
23
24
|
const MANAGED_MARKER_TEXT = /(?:ASTRYX|XDS):(START|END)/u;
|
|
24
25
|
const PROVIDER_ID_RE =
|
|
@@ -51,6 +52,21 @@ function invalidAgentDocLine(value) {
|
|
|
51
52
|
return null;
|
|
52
53
|
}
|
|
53
54
|
|
|
55
|
+
export const cliCommandSchema = z.string().superRefine((value, ctx) => {
|
|
56
|
+
const message = invalidAgentDocLine(value);
|
|
57
|
+
if (message) {
|
|
58
|
+
ctx.addIssue({code: 'custom', message});
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const codePoints = [...value].length;
|
|
62
|
+
if (codePoints > MAX_CLI_COMMAND_CODE_POINTS) {
|
|
63
|
+
ctx.addIssue({
|
|
64
|
+
code: 'custom',
|
|
65
|
+
message: `must contain at most ${MAX_CLI_COMMAND_CODE_POINTS} Unicode code points (received ${codePoints})`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
54
70
|
const agentDocLineSchema = z.string().superRefine((value, ctx) => {
|
|
55
71
|
const message = invalidAgentDocLine(value);
|
|
56
72
|
if (message) ctx.addIssue({code: 'custom', message});
|
|
@@ -92,14 +108,15 @@ export const integrationBaseSchema = z.object({
|
|
|
92
108
|
// IS an authoring mistake and still fails here.
|
|
93
109
|
export const integrationSchema = integrationBaseSchema.extend({
|
|
94
110
|
agentDocs: agentDocsSchema.optional(),
|
|
111
|
+
cliCommand: cliCommandSchema.optional(),
|
|
95
112
|
});
|
|
96
113
|
|
|
97
114
|
/**
|
|
98
115
|
* Parse every default-manifest field except the independently isolated
|
|
99
|
-
* `agentDocs`
|
|
116
|
+
* `agentDocs` and `cliCommand` fields.
|
|
100
117
|
* @param {unknown} input
|
|
101
118
|
* @param {string} label
|
|
102
|
-
* @returns {Omit<AstryxIntegration, 'agentDocs'>}
|
|
119
|
+
* @returns {Omit<AstryxIntegration, 'agentDocs' | 'cliCommand'>}
|
|
103
120
|
*/
|
|
104
121
|
export function parseIntegrationBase(input, label) {
|
|
105
122
|
const result = integrationBaseSchema.safeParse(input);
|
|
@@ -119,6 +136,20 @@ export function parseAgentDocsField(input, label) {
|
|
|
119
136
|
return result.data;
|
|
120
137
|
}
|
|
121
138
|
|
|
139
|
+
/**
|
|
140
|
+
* Parse only the optional `cliCommand` field. Isolated like `agentDocs`: an
|
|
141
|
+
* invalid command is ignored with a warning, and the rest of the manifest
|
|
142
|
+
* still contributes.
|
|
143
|
+
* @param {unknown} input
|
|
144
|
+
* @param {string} label
|
|
145
|
+
* @returns {string}
|
|
146
|
+
*/
|
|
147
|
+
export function parseCliCommandField(input, label) {
|
|
148
|
+
const result = cliCommandSchema.safeParse(input);
|
|
149
|
+
if (!result.success) throw new Error(formatZodError(label, result.error));
|
|
150
|
+
return result.data;
|
|
151
|
+
}
|
|
152
|
+
|
|
122
153
|
/**
|
|
123
154
|
* Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
|
|
124
155
|
*
|
|
@@ -48,6 +48,14 @@ export interface AstryxIntegration {
|
|
|
48
48
|
* accepts it as a known field; catalogs that list the package may show
|
|
49
49
|
* it. */
|
|
50
50
|
docsiteUrl?: string;
|
|
51
|
+
/** The command that runs the Astryx CLI for this package's users, such as
|
|
52
|
+
* `acme astryx`. Every command the CLI prints in a project that loads
|
|
53
|
+
* this package starts with it, in place of the package-manager prefix
|
|
54
|
+
* (`pnpm exec astryx`, `yarn astryx`). One line, no subcommand. When two
|
|
55
|
+
* loaded integrations set different commands, neither is used and
|
|
56
|
+
* `astryx doctor` warns. An invalid value is ignored with a warning; the
|
|
57
|
+
* rest of the manifest still loads. JSON output keeps commands bare. */
|
|
58
|
+
cliCommand?: string;
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
/**
|