@astryxdesign/cli 0.7.2-canary.fe2c655 → 0.7.3-canary.02f5fe4
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 +216 -162
- package/api/build/_adapter.d.mts +66 -0
- package/api/build/_adapter.mjs +139 -4
- package/api/build/blocks/blocks.d.mts +92 -0
- package/api/build/blocks/blocks.mjs +528 -0
- package/api/build/blocks/blocks.test.mjs +238 -0
- package/api/build/blocks/blocks.weights.json +1 -0
- package/api/build/build.doc.mjs +4 -0
- package/api/build/build.mjs +25 -6
- package/api/build/build.type.mjs +1 -1
- package/api/build/help/help.mjs +1 -1
- package/api/build/kit/answer.d.mts +18 -0
- package/api/build/kit/answer.mjs +195 -0
- package/api/build/kit/answer.test.mjs +108 -0
- package/api/build/kit/kind.d.mts +25 -0
- package/api/build/kit/kind.mjs +170 -0
- package/api/build/kit/kit.d.mts +2 -4
- package/api/build/kit/kit.mjs +8 -406
- package/api/build/kit/rank.d.mts +3 -32
- package/api/build/kit/rank.mjs +25 -342
- package/api/build/kit/rank.test.mjs +2 -1
- package/api/build/kit/signals.d.mts +79 -0
- package/api/build/kit/signals.mjs +295 -0
- package/api/build/kit/start.d.mts +32 -0
- package/api/build/kit/start.mjs +163 -0
- package/api/build/kit/words.d.mts +72 -0
- package/api/build/kit/words.mjs +202 -0
- package/api/build/tree.d.mts +20 -0
- package/api/build/tree.mjs +53 -0
- package/api/build/tree.test.mjs +185 -0
- package/api/build/tree.weights.json +1 -0
- package/api/component/_adapter.d.mts +72 -1
- package/api/component/_adapter.mjs +251 -23
- package/api/component/component-replacement.test.mjs +1 -0
- package/api/component/component.doc.mjs +6 -1
- package/api/component/component.mjs +97 -16
- package/api/component/component.test.mjs +95 -0
- package/api/component/doc-links.test.mjs +386 -0
- package/api/component/integration-export-name.test.mjs +644 -0
- package/api/component/list/list.mjs +42 -4
- package/api/discover/_adapter.d.mts +131 -12
- package/api/discover/_adapter.mjs +520 -34
- package/api/discover/_adapter.test.mjs +641 -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 +120 -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 +76 -2
- package/api/docs/_adapter.mjs +630 -34
- package/api/docs/docs-homes.test.mjs +127 -0
- package/api/docs/docs.doc.mjs +5 -4
- package/api/docs/docs.mjs +2 -1
- package/api/docs/docs.test.mjs +39 -20
- package/api/docs/integration-tree.test.mjs +42 -20
- package/api/docs/integrationDocs.test.mjs +125 -1
- package/api/docs/list/list.mjs +12 -2
- package/api/docs/namespace-section.test.mjs +6 -6
- package/api/docs/reference-blocks.test.mjs +3 -5
- package/api/doctor/_adapter.d.mts +128 -0
- package/api/doctor/_adapter.mjs +253 -4
- package/api/doctor/doctor.d.mts +217 -0
- package/api/doctor/doctor.doc.mjs +3 -2
- package/api/doctor/doctor.mjs +691 -52
- package/api/doctor/doctor.test.mjs +267 -18
- package/api/doctor/release-checks.test.mjs +156 -0
- package/api/doctor/theme-checks.mjs +17 -4
- 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 +219 -52
- 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/hook.mjs +1 -1
- package/api/hook/list/list.d.mts +1 -1
- package/api/index.d.mts +2 -0
- package/api/index.mjs +2 -0
- 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 +45 -10
- package/api/init/init.mjs +28 -4
- package/api/init/init.test.mjs +18 -2
- package/api/init/init.type.d.mts +50 -5
- package/api/init/init.type.mjs +39 -5
- package/api/init/remove/remove.mjs +17 -4
- package/api/init/remove/remove.test.mjs +114 -2
- package/api/init/run/run.d.mts +1 -1
- package/api/init/run/run.mjs +86 -12
- 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 +53 -0
- package/api/integration/_adapter.mjs +132 -0
- package/api/integration/add-contribution.component-names.test.mjs +66 -0
- package/api/integration/add-contribution.mjs +8 -4
- package/api/integration/add-contribution.test.mjs +4 -2
- package/api/integration/authoring-checks.mjs +192 -14
- package/api/integration/authoring-checks.test.mjs +1028 -0
- package/api/integration/authoring-checks.type.d.mts +143 -0
- package/api/integration/authoring-checks.type.mjs +74 -2
- package/api/integration/check/check.d.mts +96 -0
- package/api/integration/check/check.mjs +357 -0
- package/api/integration/check/check.test.mjs +489 -0
- package/api/integration/integration-check.type.d.mts +118 -0
- package/api/integration/integration-check.type.mjs +84 -0
- package/api/integration/integrationCheck.doc.d.mts +10 -0
- package/api/integration/integrationCheck.doc.mjs +73 -0
- package/api/integration/integrationComponentConflicts.doc.mjs +45 -6
- package/api/integration/integrationDocConflicts.doc.mjs +22 -5
- package/api/integration/pack-check.mjs +486 -123
- package/api/integration/pack-check.test.mjs +817 -10
- package/api/integration/validate-integration-case-disk.test.mjs +111 -0
- package/api/integration/validate-integration-fixes.test.mjs +73 -5
- package/api/integration/validate-integration-gaps.test.mjs +1975 -0
- package/api/integration/validate-integration.d.mts +23 -2
- package/api/integration/validate-integration.mjs +358 -45
- package/api/integration/validate-integration.test.mjs +88 -8
- package/api/integration/validate-integration.type.d.mts +105 -0
- package/api/integration/validate-integration.type.mjs +79 -1
- package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
- package/api/integration/validateIntegration.doc.mjs +19 -3
- package/api/search/ORDERING.md +28 -0
- package/api/search/_adapter.d.mts +91 -0
- package/api/search/_adapter.mjs +172 -0
- package/api/search/_adapter.test.mjs +173 -0
- package/api/search/_candidate-score.d.mts +40 -0
- package/api/search/_candidate-score.mjs +238 -0
- package/api/search/_cards.json +6098 -0
- package/api/search/_compound.d.mts +50 -0
- package/api/search/_compound.mjs +170 -0
- package/api/search/_doc-searcher.d.mts +4 -0
- package/api/search/_doc-searcher.mjs +23 -0
- package/api/search/_doc-searcher.test.mjs +36 -0
- package/api/search/_doc-searcher.weights.json +1 -0
- package/api/search/_doc-text.d.mts +30 -0
- package/api/search/_doc-text.mjs +87 -0
- package/api/search/_entries.d.mts +63 -0
- package/api/search/_entries.mjs +232 -0
- package/api/search/_entries.test.mjs +48 -0
- package/api/search/_features.d.mts +35 -0
- package/api/search/_features.mjs +155 -0
- package/api/search/_gather-components.d.mts +26 -0
- package/api/search/_gather-components.mjs +284 -0
- package/api/search/_gather-docs.d.mts +20 -0
- package/api/search/_gather-docs.mjs +254 -0
- package/api/search/_gather-hooks.d.mts +12 -0
- package/api/search/_gather-hooks.mjs +52 -0
- package/api/search/_gather-templates.d.mts +25 -0
- package/api/search/_gather-templates.mjs +107 -0
- package/api/search/_lexical.d.mts +135 -0
- package/api/search/_lexical.mjs +351 -0
- package/api/search/_main-searcher.d.mts +19 -0
- package/api/search/_main-searcher.mjs +115 -0
- package/api/search/_main-searcher.test.mjs +106 -0
- package/api/search/_main-searcher.weights.json +1 -0
- package/api/search/_module-doc.d.mts +32 -0
- package/api/search/_module-doc.mjs +78 -0
- package/api/search/_order.d.mts +32 -0
- package/api/search/_order.mjs +162 -0
- package/api/search/_order.test.mjs +72 -0
- package/api/search/_priority.d.mts +50 -0
- package/api/search/_priority.mjs +139 -0
- package/api/search/_query-words.d.mts +25 -0
- package/api/search/_query-words.mjs +92 -0
- package/api/search/_query.d.mts +65 -0
- package/api/search/_query.mjs +176 -0
- package/api/search/_result.d.mts +97 -0
- package/api/search/_result.mjs +150 -0
- package/api/search/_score.d.mts +60 -0
- package/api/search/_score.mjs +283 -0
- package/api/search/_synonyms.d.mts +21 -0
- package/api/search/_synonyms.mjs +67 -0
- package/api/search/_template-searcher.d.mts +4 -0
- package/api/search/_template-searcher.mjs +23 -0
- package/api/search/_template-searcher.test.mjs +40 -0
- package/api/search/_template-searcher.weights.json +1 -0
- package/api/search/_titles.d.mts +33 -0
- package/api/search/_titles.mjs +65 -0
- package/api/search/_words.d.mts +64 -0
- package/api/search/_words.mjs +157 -0
- package/api/search/search.d.mts +22 -236
- package/api/search/search.doc.mjs +14 -7
- package/api/search/search.domain-priority.test.mjs +108 -18
- package/api/search/search.integration-check.test.mjs +24 -0
- package/api/search/search.mjs +59 -1904
- package/api/search/search.test.mjs +193 -15
- package/api/search/search.type.d.mts +20 -2
- package/api/search/search.type.mjs +12 -2
- package/api/search/tree.d.mts +15 -0
- package/api/search/tree.mjs +40 -0
- package/api/search/tree.test.mjs +66 -0
- package/api/search/tree.weights.json +1 -0
- package/api/swizzle/_adapter.mjs +2 -2
- package/api/swizzle/copy/copy.mjs +29 -15
- package/api/template/template-integration.test.mjs +1 -1
- package/api/template/template.mjs +5 -1
- package/api/template/template.test.mjs +120 -3
- 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.family.test.mjs +64 -0
- package/api/theme/build/build.mjs +250 -38
- package/api/theme/build/build.packed-old-core.test.mjs +21 -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/themeBuild.doc.mjs +4 -4
- package/api/theme/themeTargets.doc.mjs +4 -0
- package/api/theme/use/use.test.mjs +1 -1
- package/api/upgrade/_adapter.d.mts +97 -11
- package/api/upgrade/_adapter.mjs +315 -32
- package/api/upgrade/registry/registry.d.mts +10 -4
- package/api/upgrade/registry/registry.mjs +33 -16
- package/api/upgrade/registry/registry.test.mjs +85 -0
- package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
- package/api/upgrade/run/run.d.mts +4 -2
- package/api/upgrade/run/run.mjs +48 -4
- package/api/upgrade/run/run.test.mjs +417 -3
- package/api/upgrade/status/status.d.mts +21 -5
- package/api/upgrade/status/status.mjs +45 -8
- package/api/upgrade/upgrade.doc.mjs +16 -8
- package/api/upgrade/upgrade.mjs +18 -3
- package/api/upgrade/upgrade.test.mjs +194 -0
- package/api/upgrade/upgrade.type.d.mts +28 -3
- package/api/upgrade/upgrade.type.mjs +24 -7
- 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/v0.7.0/__tests__/validate-data-token-ownership.test.mjs +11 -0
- package/assets/codemods/transforms/v0.7.0/validate-data-token-ownership.mjs +3 -3
- package/assets/codemods/transforms/v0.7.2/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +120 -0
- package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
- package/assets/codemods/transforms/v0.7.2/migrate-list-edge-compensation-to-edge.mjs +198 -0
- package/assets/discover/official-packages.json +367 -0
- package/assets/docs/README.md +10 -0
- package/assets/docs/author-a-theme.doc.mjs +5 -5
- package/assets/docs/browser-support.doc.mjs +1 -1
- package/assets/docs/getting-started.doc.mjs +26 -6
- package/assets/docs/is-my-code-good.doc.mjs +287 -0
- package/assets/docs/styling-overview.doc.mjs +1 -1
- package/assets/docs/theme.doc.dense.mjs +1 -1
- package/assets/docs/theme.doc.mjs +2 -2
- package/assets/docs/theme.doc.zh.mjs +1 -1
- package/assets/docs/tree/add-a-component.doc.mjs +22 -2
- package/assets/docs/tree/add-a-theme.doc.mjs +14 -4
- 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/api.doc.mjs +6 -0
- package/assets/docs/tree/authoring.doc.mjs +61 -0
- package/assets/docs/tree/block-template.doc.mjs +8 -20
- package/assets/docs/tree/build-the-template.doc.mjs +1 -1
- package/assets/docs/tree/building-blocks.doc.mjs +6 -2
- package/assets/docs/tree/check-the-props.doc.mjs +201 -0
- package/assets/docs/tree/check-your-docs.doc.mjs +69 -11
- package/assets/docs/tree/checks.doc.mjs +32 -24
- package/assets/docs/tree/ci-and-containers.doc.mjs +101 -0
- package/assets/docs/tree/cli-command.doc.mjs +142 -0
- package/assets/docs/tree/cli.doc.mjs +7 -1
- 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 +8 -6
- package/assets/docs/tree/component-imports.doc.mjs +21 -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 +8 -4
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
- package/assets/docs/tree/define-the-theme.doc.mjs +7 -6
- package/assets/docs/tree/describe-the-component.doc.mjs +3 -3
- 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 +4 -4
- 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/{authoring.doc.mjs → tree/field-reference.doc.mjs} +4 -3
- package/assets/docs/tree/fonts-and-assets.doc.mjs +3 -3
- package/assets/docs/tree/generate-a-palette.doc.mjs +8 -6
- 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/help.doc.mjs +2 -2
- package/assets/docs/tree/host-entry.doc.mjs +128 -0
- package/assets/docs/tree/install-once.doc.mjs +105 -0
- 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 +7 -6
- 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 +4 -8
- 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 +54 -28
- 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 +10 -12
- 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/ship.doc.mjs +2 -2
- package/assets/docs/tree/short-and-findable.doc.mjs +9 -8
- package/assets/docs/tree/single-component.doc.mjs +15 -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-grading-rubric.doc.mjs +17 -38
- 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 +5 -1
- package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
- package/assets/docs/tree/tokens-data.doc.mjs +2 -2
- package/assets/docs/tree/troubleshooting.doc.mjs +29 -13
- package/assets/docs/tree/type-scale.doc.mjs +3 -3
- 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 +15 -3
- package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
- package/assets/docs/tree/versioning.doc.mjs +14 -9
- package/assets/docs/tree/who-answers.doc.mjs +119 -0
- package/assets/docs/tree/write-good-templates.doc.mjs +1 -1
- package/assets/docs/tree/write-the-template-file.doc.mjs +7 -6
- package/assets/docs/use-a-theme.doc.mjs +2 -2
- package/assets/docs/use-integrations.doc.mjs +120 -0
- package/assets/docs/working-with-ai.doc.mjs +70 -13
- package/assets/templates/themes/butter/butterTheme.ts +4 -2
- package/assets/templates/themes/stone/stoneTheme.ts +4 -2
- package/assets/templates/themes/y2k/y2kTheme.ts +4 -2
- package/assets/theme.template.ts +1 -1
- 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 +30 -27
- package/authoring/doctypes/component/type.ts +21 -8
- 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 +10 -10
- package/authoring/doctypes/template/integration-template.doc.d.mts +11 -0
- package/authoring/doctypes/template/integration-template.doc.mjs +49 -0
- package/authoring/doctypes/template/parse.d.mts +6 -2
- package/authoring/doctypes/template/parse.mjs +3 -1
- package/authoring/doctypes/template/template.doc.mjs +3 -3
- package/authoring/doctypes/template/type.ts +22 -0
- 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 +2 -0
- package/authoring/integration/integration.doc.mjs +30 -6
- package/authoring/integration/parse.test.mjs +21 -0
- package/authoring/integration/schema.d.mts +16 -3
- package/authoring/integration/schema.mjs +34 -2
- package/authoring/integration/type.ts +13 -1
- package/clients/cli/bin/astryx.mjs +11 -65
- package/clients/cli/cli-command.test.mjs +166 -0
- package/clients/cli/command-result-coverage.test.mjs +6 -5
- package/clients/cli/commands/blog.doc.mjs +1 -0
- package/clients/cli/commands/build-theme.batch-report.test.mjs +17 -3
- package/clients/cli/commands/build-theme.color-scheme.test.mjs +1 -1
- package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
- package/clients/cli/commands/build-theme.path-safety.test.mjs +224 -6
- package/clients/cli/commands/build-theme.registry.test.mjs +5 -2
- 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/{component/index.mjs → component.mjs} +37 -37
- package/clients/cli/commands/component.test.mjs +6 -6
- 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 +3 -2
- package/clients/cli/commands/docs.mjs +50 -20
- package/clients/cli/commands/docs.test.mjs +16 -16
- package/clients/cli/commands/doctor-integration-components.doc.mjs +19 -4
- 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 +22 -2
- package/clients/cli/commands/doctor-integration.test.mjs +936 -3
- package/clients/cli/commands/doctor.doc.mjs +12 -2
- package/clients/cli/commands/doctor.mjs +332 -7
- package/clients/cli/commands/doctor.test.mjs +75 -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/{hook/index.mjs → hook.mjs} +22 -22
- package/clients/cli/commands/import-hint-correctness.test.mjs +1 -1
- package/clients/cli/commands/init.behavior.test.mjs +235 -1
- package/clients/cli/commands/init.doc.mjs +55 -10
- package/clients/cli/commands/init.flag-help.test.mjs +1 -0
- package/clients/cli/commands/init.mjs +2 -2
- 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 +93 -0
- package/clients/cli/commands/integration-check.test.mjs +489 -0
- 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.doc.mjs +6 -2
- package/clients/cli/commands/integration.mjs +119 -7
- package/clients/cli/commands/json-contract.test.mjs +11 -2
- package/clients/cli/commands/manifest.doc.mjs +2 -1
- package/clients/cli/commands/manifest.mjs +67 -0
- package/clients/cli/commands/outside-project.test.mjs +874 -0
- package/clients/cli/commands/postinstall.doc.mjs +23 -0
- package/clients/cli/commands/postinstall.mjs +31 -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 +180 -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/text-json-parity.test.mjs +5 -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 +3 -2
- 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/{build-theme.mjs → theme.mjs} +27 -14
- package/clients/cli/commands/upgrade.config-ordering.test.mjs +2 -1
- package/clients/cli/commands/upgrade.doc.mjs +26 -3
- 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.mjs +9 -2
- package/clients/cli/commands/upgrade.older-cli.test.mjs +160 -0
- package/clients/cli/commands/upgrade.subfolder-path.test.mjs +97 -0
- package/clients/cli/index.mjs +156 -100
- package/clients/cli/lib/cli-error.mjs +4 -1
- package/clients/cli/lib/component-format.mjs +1 -1
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +14 -9
- package/clients/cli/lib/exit-codes.test.mjs +5 -0
- 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 +37 -0
- package/clients/cli/lib/welcome-box.mjs +50 -0
- package/clients/cli/run.mjs +108 -0
- package/foundation/agent-docs/agent-doc-state.d.mts +67 -13
- package/foundation/agent-docs/agent-doc-state.mjs +123 -14
- package/foundation/agent-docs/agent-docs.d.mts +104 -15
- package/foundation/agent-docs/agent-docs.mjs +1028 -114
- package/foundation/agent-docs/agent-docs.path-safety.test.mjs +1239 -17
- package/foundation/agent-docs/agent-docs.test.mjs +683 -39
- package/foundation/agent-docs/computer-agent-text.d.mts +170 -0
- package/foundation/agent-docs/computer-agent-text.mjs +750 -0
- package/foundation/agent-docs/computer-agent-text.test.mjs +699 -0
- package/foundation/config/project.d.mts +35 -3
- package/foundation/config/project.mjs +243 -26
- package/foundation/config/project.test.mjs +122 -0
- package/foundation/config/theme-state.mjs +5 -4
- package/foundation/discovery/authoring-self-docs.d.mts +7 -0
- package/foundation/discovery/authoring-self-docs.mjs +17 -4
- package/foundation/discovery/authoring-self-docs.test.mjs +15 -3
- package/foundation/discovery/authoring-surface.d.mts +1 -1
- package/foundation/discovery/authoring-surface.mjs +2 -2
- package/foundation/discovery/authoring-surface.test.mjs +1 -1
- package/foundation/discovery/cli-self-docs.d.mts +2 -1
- package/foundation/discovery/cli-self-docs.mjs +22 -4
- package/foundation/discovery/cli-self-docs.test.mjs +3 -2
- package/foundation/discovery/component-discovery.d.mts +227 -10
- package/foundation/discovery/component-discovery.export-names.test.mjs +760 -0
- package/foundation/discovery/component-discovery.mjs +940 -57
- package/foundation/discovery/component-discovery.test.mjs +96 -0
- package/foundation/discovery/component-loader.d.mts +1 -1
- package/foundation/discovery/component-replacement.mjs +20 -1
- package/foundation/discovery/component-replacement.test.mjs +40 -0
- 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 +157 -0
- package/foundation/discovery/doc-types.mjs +1231 -0
- package/foundation/discovery/doc-types.test.mjs +744 -0
- package/foundation/discovery/docs-discovery.d.mts +88 -0
- package/foundation/discovery/docs-discovery.mjs +97 -3
- package/foundation/discovery/integration-doc-files.d.mts +22 -0
- package/foundation/discovery/integration-doc-files.mjs +231 -0
- package/foundation/discovery/integration-doc-files.test.mjs +246 -0
- package/foundation/discovery/module-exports.d.mts +68 -0
- package/foundation/discovery/module-exports.mjs +609 -31
- package/foundation/discovery/module-exports.test.mjs +172 -0
- package/foundation/discovery/package-tsconfig.d.mts +14 -0
- package/foundation/discovery/package-tsconfig.mjs +228 -0
- package/foundation/discovery/package-tsconfig.test.mjs +210 -0
- package/foundation/discovery/project-typescript.d.mts +32 -0
- package/foundation/discovery/project-typescript.mjs +89 -0
- package/foundation/discovery/prop-drift.d.mts +297 -0
- package/foundation/discovery/prop-drift.mjs +2428 -0
- package/foundation/discovery/prop-drift.test.mjs +2337 -0
- package/foundation/discovery/runner-allowlist.d.mts +38 -0
- package/foundation/discovery/runner-allowlist.mjs +51 -0
- package/foundation/discovery/runner-commands.d.mts +77 -0
- package/foundation/discovery/runner-commands.mjs +294 -0
- package/foundation/discovery/runner-commands.test.mjs +128 -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-adapter.mjs +92 -6
- package/foundation/discovery/template-needs.mjs +6 -46
- package/foundation/discovery/theme-discovery.mjs +147 -3
- package/foundation/discovery/theme-imports.mjs +8 -4
- package/foundation/discovery/theme-imports.test.mjs +1 -1
- package/foundation/discovery/type-match.d.mts +53 -0
- package/foundation/discovery/type-match.mjs +660 -0
- package/foundation/discovery/type-match.test.mjs +169 -0
- package/foundation/discovery/type-text.d.mts +68 -0
- package/foundation/discovery/type-text.mjs +658 -0
- package/foundation/discovery/type-text.test.mjs +196 -0
- package/foundation/discovery/unresolved-references.d.mts +62 -0
- package/foundation/discovery/unresolved-references.mjs +790 -0
- package/foundation/discovery/unresolved-references.test.mjs +567 -0
- package/foundation/doc-compiler/doc-loads.test.mjs +84 -10
- package/foundation/doc-compiler/inputs.mjs +27 -1
- package/foundation/doc-compiler/inputs.test.mjs +0 -1
- package/foundation/doc-compiler/links.d.mts +41 -5
- package/foundation/doc-compiler/links.mjs +167 -28
- package/foundation/doc-compiler/links.test.mjs +97 -4
- package/foundation/doc-compiler/read.d.mts +1 -1
- package/foundation/doc-compiler/read.mjs +59 -1
- package/foundation/doc-compiler/read.test.mjs +11 -2
- package/foundation/doc-compiler/split-topic-keywords.test.mjs +3 -2
- package/foundation/doc-compiler/tree.d.mts +32 -6
- package/foundation/doc-compiler/tree.mjs +107 -44
- package/foundation/doc-compiler/tree.test.mjs +14 -7
- 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 +122 -4
- package/foundation/fs/paths.mjs +675 -29
- package/foundation/fs/paths.test.mjs +439 -54
- package/foundation/fs/read-record.d.mts +18 -0
- package/foundation/fs/read-record.mjs +131 -0
- package/foundation/fs/read-record.test.mjs +77 -0
- package/foundation/integrations/autolink.d.mts +2 -1
- package/foundation/integrations/autolink.mjs +4 -13
- package/foundation/integrations/cli-peer-version.d.mts +36 -0
- package/foundation/integrations/cli-peer-version.mjs +132 -0
- package/foundation/integrations/cli-peer-version.test.mjs +354 -0
- package/foundation/integrations/computer-integrations.d.mts +81 -0
- package/foundation/integrations/computer-integrations.mjs +345 -0
- package/foundation/integrations/computer-integrations.test.mjs +292 -0
- package/foundation/integrations/contribution-inventory.d.mts +26 -20
- package/foundation/integrations/contribution-inventory.mjs +97 -8
- package/foundation/integrations/exports-subpaths.d.mts +57 -0
- package/foundation/integrations/exports-subpaths.mjs +113 -0
- package/foundation/integrations/integration-warnings.mjs +3 -2
- package/foundation/integrations/integration-warnings.test.mjs +8 -9
- package/foundation/integrations/integrations.d.mts +51 -1
- package/foundation/integrations/integrations.mjs +106 -4
- package/foundation/integrations/issue.ts +6 -0
- package/foundation/integrations/public-imports.d.mts +118 -0
- package/foundation/integrations/public-imports.mjs +1769 -0
- package/foundation/integrations/public-imports.test.mjs +1793 -0
- package/foundation/integrations/validate-contributions.d.mts +117 -0
- package/foundation/integrations/validate-contributions.mjs +1209 -14
- 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 +923 -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 +263 -0
- package/foundation/release/global-state.mjs +474 -0
- package/foundation/release/global-state.test.mjs +381 -0
- package/foundation/release/handoff.d.mts +79 -0
- package/foundation/release/handoff.e2e.test.mjs +278 -0
- package/foundation/release/handoff.mjs +524 -0
- package/foundation/release/lock-lease.d.mts +23 -0
- package/foundation/release/lock-lease.mjs +80 -0
- package/foundation/release/notices.d.mts +307 -0
- package/foundation/release/notices.mjs +707 -0
- package/foundation/release/notices.test.mjs +586 -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 +163 -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 +22 -11
- package/foundation/response/response-types.doc.test.mjs +46 -0
- package/foundation/response/response.doc.mjs +3 -3
- package/foundation/route/route.d.mts +285 -0
- package/foundation/route/route.mjs +324 -0
- package/foundation/route/route.test.mjs +153 -0
- package/foundation/runtime/hosted-runtime.test.mjs +403 -0
- package/foundation/runtime/locked-versions.d.mts +32 -0
- package/foundation/runtime/locked-versions.mjs +65 -0
- package/foundation/runtime/package-root.d.mts +91 -0
- package/foundation/runtime/package-root.mjs +174 -0
- package/foundation/runtime/package-set.d.mts +62 -0
- package/foundation/runtime/package-set.mjs +130 -0
- package/foundation/runtime/package-set.test.mjs +432 -0
- package/foundation/text/string-utils.d.mts +2 -1
- package/foundation/text/string-utils.mjs +16 -5
- package/foundation/text/suggest-order.d.mts +72 -0
- package/foundation/text/suggest-order.mjs +363 -0
- package/foundation/text/suggest-order.test.mjs +259 -0
- package/foundation/xle/browser-imports.test.mjs +74 -0
- package/foundation/xle/registry.mjs +4 -0
- package/foundation/xle/registry.test.mjs +28 -0
- package/host/door-conformance.test.mjs +274 -0
- package/host/index.d.ts +116 -0
- package/host/index.mjs +295 -0
- package/host/index.test.mjs +302 -0
- package/package.json +16 -11
- package/scripts/postinstall.mjs +24 -5
- package/assets/docs/tree/integrations.doc.mjs +0 -40
|
@@ -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});
|
|
@@ -78,6 +94,7 @@ export const integrationBaseSchema = z.object({
|
|
|
78
94
|
docs: z.string().optional(),
|
|
79
95
|
themes: z.string().optional(),
|
|
80
96
|
issuesUrl: z.string().url().optional(),
|
|
97
|
+
docsiteUrl: z.string().url().optional(),
|
|
81
98
|
});
|
|
82
99
|
|
|
83
100
|
// Unknown top-level keys are stripped rather than rejected. `.strict()` made a key from a
|
|
@@ -91,14 +108,15 @@ export const integrationBaseSchema = z.object({
|
|
|
91
108
|
// IS an authoring mistake and still fails here.
|
|
92
109
|
export const integrationSchema = integrationBaseSchema.extend({
|
|
93
110
|
agentDocs: agentDocsSchema.optional(),
|
|
111
|
+
cliCommand: cliCommandSchema.optional(),
|
|
94
112
|
});
|
|
95
113
|
|
|
96
114
|
/**
|
|
97
115
|
* Parse every default-manifest field except the independently isolated
|
|
98
|
-
* `agentDocs`
|
|
116
|
+
* `agentDocs` and `cliCommand` fields.
|
|
99
117
|
* @param {unknown} input
|
|
100
118
|
* @param {string} label
|
|
101
|
-
* @returns {Omit<AstryxIntegration, 'agentDocs'>}
|
|
119
|
+
* @returns {Omit<AstryxIntegration, 'agentDocs' | 'cliCommand'>}
|
|
102
120
|
*/
|
|
103
121
|
export function parseIntegrationBase(input, label) {
|
|
104
122
|
const result = integrationBaseSchema.safeParse(input);
|
|
@@ -118,6 +136,20 @@ export function parseAgentDocsField(input, label) {
|
|
|
118
136
|
return result.data;
|
|
119
137
|
}
|
|
120
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
|
+
|
|
121
153
|
/**
|
|
122
154
|
* Compile-time drift-lock: sealed schema must infer exactly {@link AstryxIntegration}.
|
|
123
155
|
*
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* The manifest module may also carry `debug` and `gapReport` NAMED exports.
|
|
12
12
|
* They are not fields here on purpose: a CLI released before a given manifest
|
|
13
13
|
* field existed could reject it and lose every contribution, while an unknown
|
|
14
|
-
* named export is simply not read. See `astryx docs
|
|
14
|
+
* named export is simply not read. See `astryx docs authoring`.
|
|
15
15
|
*/
|
|
16
16
|
export interface AstryxIntegration {
|
|
17
17
|
/** Stable logical provider ID. Omit to use package.json#name. Set this only
|
|
@@ -44,6 +44,18 @@ export interface AstryxIntegration {
|
|
|
44
44
|
};
|
|
45
45
|
/** Where to file issues/feedback for this integration. */
|
|
46
46
|
issuesUrl?: string;
|
|
47
|
+
/** Link to this integration's docs site, such as its home page. The CLI
|
|
48
|
+
* accepts it as a known field; catalogs that list the package may show
|
|
49
|
+
* it. */
|
|
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;
|
|
47
59
|
}
|
|
48
60
|
|
|
49
61
|
/**
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// unsupported runtimes this guard protects against.
|
|
15
15
|
//
|
|
16
16
|
// Sibling package modules (e.g. `cli/`, `lib/`) are resolved by this bin's REAL
|
|
17
|
-
// path. When the CLI is installed as a package,
|
|
17
|
+
// path. When the CLI is installed as a package, the package manager runs this file
|
|
18
18
|
// through the `node_modules/.bin/astryx` symlink, and some Node versions resolve
|
|
19
19
|
// relative specifiers from the symlink's directory rather than the real package
|
|
20
20
|
// — breaking bare `../…` imports with a cryptic ERR_MODULE_NOT_FOUND.
|
|
@@ -53,67 +53,13 @@ if (!isNodeVersionSupported(process.versions.node)) {
|
|
|
53
53
|
process.exit(1);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
* never reach a --json consumer as a raw stack trace. If we're in JSON mode,
|
|
67
|
-
* convert it to the contract's error envelope on stdout and exit 1; otherwise
|
|
68
|
-
* preserve the normal human-facing behavior.
|
|
69
|
-
*
|
|
70
|
-
* We detect JSON mode two ways: the global flag (set once root options are
|
|
71
|
-
* parsed) and a raw argv check, since a throw can occur during parsing/command
|
|
72
|
-
* load — before the preAction hook engages the flag.
|
|
73
|
-
*/
|
|
74
|
-
function inJsonMode() {
|
|
75
|
-
return isJsonMode() || process.argv.slice(2).includes('--json');
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** @param {unknown} err */
|
|
79
|
-
function handleFatal(err) {
|
|
80
|
-
// CommanderError (parse errors, --help, unknown command) routes
|
|
81
|
-
// through the JSON shim so that a --json consumer always gets a
|
|
82
|
-
// valid envelope and the right exit code. handleCommanderError
|
|
83
|
-
// calls process.exit when it owns the error.
|
|
84
|
-
if (handleCommanderError(err)) return;
|
|
85
|
-
|
|
86
|
-
// Anything still here is an uncaught throw or an unhandled rejection —
|
|
87
|
-
// a bug rather than a user error, and the class of failure most worth
|
|
88
|
-
// having a record of.
|
|
89
|
-
setOutcome('fatal', {exitCode: 1, error: err});
|
|
90
|
-
|
|
91
|
-
if (inJsonMode()) {
|
|
92
|
-
// Only emit if a command didn't already produce an envelope.
|
|
93
|
-
if (!process.__xdsJsonHandled) {
|
|
94
|
-
process.__xdsJsonHandled = true;
|
|
95
|
-
console.log(JSON.stringify(toErrorEnvelope(err), null, 2));
|
|
96
|
-
}
|
|
97
|
-
process.exit(1);
|
|
98
|
-
}
|
|
99
|
-
// Human mode: preserve Commander/Node default-ish behavior.
|
|
100
|
-
console.error(err instanceof Error ? err.stack || err.message : String(err));
|
|
101
|
-
process.exit(1);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
process.on('unhandledRejection', handleFatal);
|
|
105
|
-
process.on('uncaughtException', handleFatal);
|
|
106
|
-
|
|
107
|
-
// Pick up the project's `debug` function before parsing, so parse errors and
|
|
108
|
-
// `--help` — which short-circuit before any hook runs — are reported too.
|
|
109
|
-
await loadProjectDebugHandler();
|
|
110
|
-
|
|
111
|
-
// `--version --json` answers and exits without Commander, so it runs here —
|
|
112
|
-
// after the handler exists, or the run would go unrecorded.
|
|
113
|
-
handleVersionJsonPreflight();
|
|
114
|
-
|
|
115
|
-
try {
|
|
116
|
-
await program.parseAsync(process.argv);
|
|
117
|
-
} catch (err) {
|
|
118
|
-
handleFatal(err);
|
|
119
|
-
}
|
|
56
|
+
// Global mode: the run chooses the release that answers this folder and, when
|
|
57
|
+
// it is not this copy, hands the run to it before anything the project
|
|
58
|
+
// provides (its astryx.config, integrations, or Core) is loaded; only then
|
|
59
|
+
// does it load and dispatch the command. See clients/cli/run.mjs,
|
|
60
|
+
// foundation/release/handoff.mjs, and spec AST-081 FR2 and FR9.
|
|
61
|
+
const {runCli} = await importSrc('run.mjs');
|
|
62
|
+
await runCli({
|
|
63
|
+
cliRoot: join(binDir, '..', '..', '..'),
|
|
64
|
+
argv: process.argv.slice(2),
|
|
65
|
+
});
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Every printed command starts with the project's CLI command: the door a host
|
|
5
|
+
* sets, or the `cliCommand` a loaded integration declares. JSON keeps commands
|
|
6
|
+
* bare.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {afterEach, beforeEach, describe, expect, it} from 'vitest';
|
|
10
|
+
import {spawnSync} from 'node:child_process';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as os from 'node:os';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import {runCli} from '../../test-utils/run-cli.mjs';
|
|
15
|
+
import {
|
|
16
|
+
hasRecordedProject,
|
|
17
|
+
runWithCliDoor,
|
|
18
|
+
} from '../../foundation/env/cli-command.mjs';
|
|
19
|
+
import {getCliInvocation} from '../../foundation/env/package-manager.mjs';
|
|
20
|
+
import {loadProjectForHelp} from './index.mjs';
|
|
21
|
+
|
|
22
|
+
const BIN = path.resolve(import.meta.dirname, 'bin', 'astryx.mjs');
|
|
23
|
+
|
|
24
|
+
/** @type {string} */
|
|
25
|
+
let tmpDir;
|
|
26
|
+
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
// Repo-local, so Vite permits importing the integration manifest.
|
|
29
|
+
tmpDir = fs.mkdtempSync(path.join(process.cwd(), '.astryx-cli-command-'));
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
fs.rmSync(tmpDir, {recursive: true, force: true});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* An app that installs one integration declaring `cliCommand`, with no
|
|
38
|
+
* astryx.config: the integration is autolinked.
|
|
39
|
+
* @param {string} cliCommand
|
|
40
|
+
*/
|
|
41
|
+
function appWithIntegration(cliCommand) {
|
|
42
|
+
fs.writeFileSync(
|
|
43
|
+
path.join(tmpDir, 'package.json'),
|
|
44
|
+
JSON.stringify({name: 'app', dependencies: {'@acme/x': '1.0.0'}}),
|
|
45
|
+
);
|
|
46
|
+
fs.writeFileSync(path.join(tmpDir, 'AGENTS.md'), '<!-- ASTRYX:START -->\n');
|
|
47
|
+
const pkg = path.join(tmpDir, 'node_modules', '@acme', 'x');
|
|
48
|
+
fs.mkdirSync(pkg, {recursive: true});
|
|
49
|
+
fs.writeFileSync(
|
|
50
|
+
path.join(pkg, 'package.json'),
|
|
51
|
+
JSON.stringify({name: '@acme/x', version: '1.0.0'}),
|
|
52
|
+
);
|
|
53
|
+
fs.writeFileSync(
|
|
54
|
+
path.join(pkg, 'astryx.integration.mjs'),
|
|
55
|
+
`export default ${JSON.stringify({cliCommand})};\n`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
describe("an integration's cliCommand", () => {
|
|
60
|
+
it('starts the hints of a command that never loads the project itself', async () => {
|
|
61
|
+
appWithIntegration('acme astryx');
|
|
62
|
+
const {status, stderr} = await runCli(['theme', 'remove', 'nope'], tmpDir);
|
|
63
|
+
expect(status).toBe(1);
|
|
64
|
+
expect(stderr).toContain('`acme astryx theme add nope`');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe('the setup nudge in a project with no CLI of its own', () => {
|
|
69
|
+
it('names the declared cliCommand for the step after installing the CLI (spec AST-081 FR5)', async () => {
|
|
70
|
+
// Outside this repository: the nudge stays quiet in the CLI's own checkout.
|
|
71
|
+
const app = fs.mkdtempSync(
|
|
72
|
+
path.join(os.tmpdir(), 'astryx-cli-command-nudge-'),
|
|
73
|
+
);
|
|
74
|
+
try {
|
|
75
|
+
// Only Core, of another release than the CLI that answers, an
|
|
76
|
+
// integration declaring cliCommand, and no agent docs yet.
|
|
77
|
+
fs.writeFileSync(
|
|
78
|
+
path.join(app, 'package.json'),
|
|
79
|
+
JSON.stringify({
|
|
80
|
+
name: 'app',
|
|
81
|
+
dependencies: {'@acme/x': '1.0.0', '@astryxdesign/core': '0.0.1'},
|
|
82
|
+
}),
|
|
83
|
+
);
|
|
84
|
+
fs.writeFileSync(path.join(app, 'package-lock.json'), '{}');
|
|
85
|
+
for (const [name, version, extra] of [
|
|
86
|
+
['@acme/x', '1.0.0', 'acme astryx'],
|
|
87
|
+
['@astryxdesign/core', '0.0.1', null],
|
|
88
|
+
]) {
|
|
89
|
+
const dir = path.join(app, 'node_modules', ...name.split('/'));
|
|
90
|
+
fs.mkdirSync(dir, {recursive: true});
|
|
91
|
+
fs.writeFileSync(
|
|
92
|
+
path.join(dir, 'package.json'),
|
|
93
|
+
JSON.stringify({name, version}),
|
|
94
|
+
);
|
|
95
|
+
if (extra) {
|
|
96
|
+
fs.writeFileSync(
|
|
97
|
+
path.join(dir, 'astryx.integration.mjs'),
|
|
98
|
+
`export default ${JSON.stringify({cliCommand: extra})};\n`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const {stderr} = await runCli(['docs', 'tokens'], app);
|
|
104
|
+
expect(stderr).toContain(
|
|
105
|
+
'Next step: run `npm install @astryxdesign/cli@0.0.1`, then `acme astryx init`',
|
|
106
|
+
);
|
|
107
|
+
} finally {
|
|
108
|
+
fs.rmSync(app, {recursive: true, force: true});
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('help', () => {
|
|
114
|
+
it('loads the project for a help run, and only for one', async () => {
|
|
115
|
+
appWithIntegration('acme astryx');
|
|
116
|
+
const cwd = process.cwd();
|
|
117
|
+
process.chdir(tmpDir);
|
|
118
|
+
try {
|
|
119
|
+
await loadProjectForHelp(['docs', 'theme']);
|
|
120
|
+
expect(hasRecordedProject(tmpDir)).toBe(false);
|
|
121
|
+
await loadProjectForHelp(['component', '--help']);
|
|
122
|
+
expect(getCliInvocation(tmpDir)).toBe('acme astryx');
|
|
123
|
+
} finally {
|
|
124
|
+
process.chdir(cwd);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("prints the integration's command in `--help`", () => {
|
|
129
|
+
appWithIntegration('acme astryx');
|
|
130
|
+
const result = spawnSync(process.execPath, [BIN, '--help'], {
|
|
131
|
+
cwd: tmpDir,
|
|
132
|
+
encoding: 'utf-8',
|
|
133
|
+
});
|
|
134
|
+
expect(result.status).toBe(0);
|
|
135
|
+
expect(result.stdout).toContain('acme astryx search button');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe("a host's door", () => {
|
|
140
|
+
it('prefixes doc commands in text and leaves them bare in JSON', async () => {
|
|
141
|
+
const text = await runWithCliDoor('acme astryx', () =>
|
|
142
|
+
runCli(['docs', 'getting-started', '--full']),
|
|
143
|
+
);
|
|
144
|
+
expect(text.stdout).toContain('acme astryx init');
|
|
145
|
+
|
|
146
|
+
const json = await runWithCliDoor('acme astryx', () =>
|
|
147
|
+
runCli(['docs', 'getting-started', '--json']),
|
|
148
|
+
);
|
|
149
|
+
expect(json.stdout).toContain('astryx init');
|
|
150
|
+
expect(json.stdout).not.toContain('acme astryx');
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('prefixes suggested commands in text and leaves them bare in JSON', async () => {
|
|
154
|
+
const text = await runWithCliDoor('acme astryx', () =>
|
|
155
|
+
runCli(['search', '']),
|
|
156
|
+
);
|
|
157
|
+
expect(text.stderr).toContain('acme astryx search button');
|
|
158
|
+
|
|
159
|
+
const json = await runWithCliDoor('acme astryx', () =>
|
|
160
|
+
runCli(['search', '', '--json']),
|
|
161
|
+
);
|
|
162
|
+
expect(JSON.parse(json.stdout).suggestions[0].name).toBe(
|
|
163
|
+
'astryx search button',
|
|
164
|
+
);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
@@ -44,12 +44,13 @@ const NO_ACTION_OF_THEIR_OWN = [];
|
|
|
44
44
|
/**
|
|
45
45
|
* Commands that record for themselves instead of returning a descriptor.
|
|
46
46
|
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
47
|
+
* Empty: every command, `manifest` and the hidden `postinstall` hook included,
|
|
48
|
+
* registers through defineCommand. The mark is a hatch, and a hatch nobody
|
|
49
|
+
* watches is a hole: this list is the watch. The root program is checked
|
|
50
|
+
* separately below.
|
|
51
|
+
* @type {string[]}
|
|
51
52
|
*/
|
|
52
|
-
const RECORD_FOR_THEMSELVES = [
|
|
53
|
+
const RECORD_FOR_THEMSELVES = [];
|
|
53
54
|
|
|
54
55
|
/**
|
|
55
56
|
* Every command in the program, depth first, with its fully qualified name.
|
|
@@ -24,6 +24,7 @@ export const doc = {
|
|
|
24
24
|
{label: 'List posts', cli: 'astryx blog'},
|
|
25
25
|
{label: 'Read one post', cli: 'astryx blog introducing-astryx --json'},
|
|
26
26
|
],
|
|
27
|
+
outsideProject: 'same',
|
|
27
28
|
exitCodes: [
|
|
28
29
|
{code: 0, when: 'success'},
|
|
29
30
|
{code: 1, when: 'unknown slug, or the feed or a post cannot be fetched'},
|
|
@@ -91,12 +91,24 @@ function count(text, pattern) {
|
|
|
91
91
|
|
|
92
92
|
/** @param {string} stdout */
|
|
93
93
|
function lines(stdout) {
|
|
94
|
-
return stdout.split('\n').filter(Boolean);
|
|
94
|
+
return bareRecipe(stdout).split('\n').filter(Boolean);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The font recipe names `docs typography` with the project's CLI invocation,
|
|
99
|
+
* which depends on where the test runs; compare it as bare `astryx`.
|
|
100
|
+
* @param {string} stdout
|
|
101
|
+
*/
|
|
102
|
+
function bareRecipe(stdout) {
|
|
103
|
+
return stdout.replace(
|
|
104
|
+
/(recipe: |guidance: )\S.*? docs typography/g,
|
|
105
|
+
'$1astryx docs typography',
|
|
106
|
+
);
|
|
95
107
|
}
|
|
96
108
|
|
|
97
109
|
/** @param {string} stdout The sizes follow Core's CSS, so goldens keep the shape. */
|
|
98
110
|
function normalized(stdout) {
|
|
99
|
-
return stdout.replace(/\d+(\.\d+)? KB/g, '<size> KB');
|
|
111
|
+
return bareRecipe(stdout).replace(/\d+(\.\d+)? KB/g, '<size> KB');
|
|
100
112
|
}
|
|
101
113
|
|
|
102
114
|
/** Bytes of the full report printed by one invocation per theme. */
|
|
@@ -168,7 +180,9 @@ describe('theme build report', () => {
|
|
|
168
180
|
}
|
|
169
181
|
expect(count(out, 'Install in your app')).toBe(1);
|
|
170
182
|
expect(count(out, 'Or with a <link> tag:')).toBe(1);
|
|
171
|
-
expect(
|
|
183
|
+
expect(
|
|
184
|
+
count(out, "import { Theme } from '@astryxdesign/core/theme';"),
|
|
185
|
+
).toBe(2);
|
|
172
186
|
expect(count(out, '[note]')).toBe(1);
|
|
173
187
|
expect(count(out, 'note: Font')).toBe(0);
|
|
174
188
|
expect(count(out, 'fonts.googleapis.com/css2')).toBe(1);
|
|
@@ -73,7 +73,7 @@ describe('theme build color-scheme output', () => {
|
|
|
73
73
|
const project = path.join(tmpDir, 'project');
|
|
74
74
|
const themesDir = path.join(project, 'themes');
|
|
75
75
|
// A raw light-dark() token value is what triggers the color-scheme
|
|
76
|
-
// injection in
|
|
76
|
+
// injection in theme.mjs. `defineTheme.test.ts` already covers the
|
|
77
77
|
// separate [light, dark] tuple -> light-dark() conversion; this fixture
|
|
78
78
|
// writes the string directly so this test stays focused on the CLI's own
|
|
79
79
|
// color-scheme decision, not on that conversion.
|
|
@@ -75,7 +75,7 @@ describe('theme build font-loading warning', () => {
|
|
|
75
75
|
expect(result.stdout).toContain('display=swap');
|
|
76
76
|
expect(result.stdout).toContain('@font-face');
|
|
77
77
|
expect(result.stdout).toContain('font-display: swap');
|
|
78
|
-
expect(result.stdout).toContain('
|
|
78
|
+
expect(result.stdout).toContain(' docs typography');
|
|
79
79
|
// The one-line summaries follow the CLI's stream contract. These are
|
|
80
80
|
// NOTICES about a correct theme, not warnings, so they go to stdout with
|
|
81
81
|
// the rest of the build's progress — stderr stays for the defects an
|
|
@@ -105,8 +105,8 @@ describe('theme build font-loading warning', () => {
|
|
|
105
105
|
);
|
|
106
106
|
|
|
107
107
|
expect(result.code).toBe(0);
|
|
108
|
-
expect(result.stdout).
|
|
109
|
-
|
|
108
|
+
expect(result.stdout).toMatch(
|
|
109
|
+
/\[note\] Fonts named but not loaded: "Space Grotesk", "JetBrains Mono"\. Load them in your app \(recipe: .+ docs typography\)\.\n/,
|
|
110
110
|
);
|
|
111
111
|
expect(result.stdout).not.toContain('fonts.googleapis.com');
|
|
112
112
|
expect(result.stdout).not.toContain('@font-face');
|