@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
package/clients/cli/index.mjs
CHANGED
|
@@ -16,17 +16,27 @@ import {Command, Option} from 'commander';
|
|
|
16
16
|
import {fileURLToPath} from 'node:url';
|
|
17
17
|
import * as fs from 'node:fs';
|
|
18
18
|
import * as path from 'node:path';
|
|
19
|
-
import {getCliInvocation} from '../../foundation/env/package-manager.mjs';
|
|
19
|
+
import {formatCliCommand, getCliInvocation, quoteCommandArgument} from '../../foundation/env/package-manager.mjs';
|
|
20
|
+
import {hasRecordedProject} from '../../foundation/env/cli-command.mjs';
|
|
21
|
+
import {isOutsideProject} from '../../foundation/env/project-scope.mjs';
|
|
20
22
|
import {API_VERSION, setJsonMode} from '../../foundation/response/json.mjs';
|
|
23
|
+
import {answeredBy, runChoice} from '../../foundation/release/run-context.mjs';
|
|
24
|
+
import {cliInstallAdvice, installFolder} from '../../foundation/release/notices.mjs';
|
|
21
25
|
import {buildManifest} from './lib/manifest.mjs';
|
|
22
26
|
import {cliError} from './lib/cli-error.mjs';
|
|
23
|
-
import {
|
|
27
|
+
import {section, text, records} from './formatters/index.mjs';
|
|
24
28
|
import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
|
|
25
29
|
import {levenshteinDistance} from '../../foundation/text/string-utils.mjs';
|
|
26
30
|
import {installJsonShim} from './lib/json-shim.mjs';
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
|
|
31
|
+
import {markReportsResult} from './lib/define-command.mjs';
|
|
32
|
+
import {
|
|
33
|
+
agentDocsTargetDir,
|
|
34
|
+
assertAgentDocsTarget,
|
|
35
|
+
isAstryxInitialized,
|
|
36
|
+
isAstryxPromptInReach,
|
|
37
|
+
} from '../../foundation/agent-docs/agent-docs.mjs';
|
|
38
|
+
import {CLI_ROOT} from '../../foundation/fs/paths.mjs';
|
|
39
|
+
import {setupNudge} from '../../foundation/agent-docs/agent-doc-state.mjs';
|
|
30
40
|
import * as debug from '../../foundation/debug/index.mjs';
|
|
31
41
|
|
|
32
42
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -63,7 +73,7 @@ export function handleVersionJsonPreflight(argv = process.argv.slice(2)) {
|
|
|
63
73
|
// reports the same shape Commander's own `--version` path does.
|
|
64
74
|
debug.recordCommandResult(debug.NO_RESULT_SET);
|
|
65
75
|
debug.setOutcome('ok', {exitCode: 0});
|
|
66
|
-
console.log(JSON.stringify({apiVersion: API_VERSION, type: 'version', data: {version: pkg.version}}, null, 2));
|
|
76
|
+
console.log(JSON.stringify({apiVersion: API_VERSION, type: 'version', data: {version: pkg.version}, meta: {answeredBy: answeredBy()}}, null, 2));
|
|
67
77
|
process.exit(0);
|
|
68
78
|
}
|
|
69
79
|
|
|
@@ -98,6 +108,7 @@ export const JSON_SUPPORTED = new Set([
|
|
|
98
108
|
'theme targets',
|
|
99
109
|
'theme palette generate',
|
|
100
110
|
'integration add',
|
|
111
|
+
'integration check',
|
|
101
112
|
'integration verify',
|
|
102
113
|
'integration pack',
|
|
103
114
|
'upgrade',
|
|
@@ -184,6 +195,31 @@ export async function loadProjectDebugHandler() {
|
|
|
184
195
|
}
|
|
185
196
|
}
|
|
186
197
|
|
|
198
|
+
/**
|
|
199
|
+
* Load the project's integrations before a help run, so help prints commands
|
|
200
|
+
* with the `cliCommand` they declare (spec:AST-081 FR5). Help is printed while
|
|
201
|
+
* Commander parses, before any hook, so the preAction load cannot reach it.
|
|
202
|
+
* `Project.load` reads astryx.config and each integration's manifest; it does
|
|
203
|
+
* no discovery. Skipped when the debug preload already loaded the project, and
|
|
204
|
+
* outside a package. Called from the bin before Commander parses.
|
|
205
|
+
*
|
|
206
|
+
* @param {string[]} [argv] arguments after the binary.
|
|
207
|
+
* @returns {Promise<void>}
|
|
208
|
+
*/
|
|
209
|
+
export async function loadProjectForHelp(argv = process.argv.slice(2)) {
|
|
210
|
+
const help =
|
|
211
|
+
argv.includes('--help') || argv.includes('-h') || argv[0] === 'help';
|
|
212
|
+
if (!help) return;
|
|
213
|
+
try {
|
|
214
|
+
const cwd = process.cwd();
|
|
215
|
+
if (hasRecordedProject(cwd)) return;
|
|
216
|
+
const {Project} = await import('../../foundation/config/project.mjs');
|
|
217
|
+
await Project.load(cwd);
|
|
218
|
+
} catch {
|
|
219
|
+
// Help prints with the package-manager guess.
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
187
223
|
/**
|
|
188
224
|
* Hand the whole invocation to the debug recorder: which command ran, its
|
|
189
225
|
* positional arguments by name, its options and where each value came from,
|
|
@@ -258,7 +294,7 @@ function captureInvocation(actionCommand, root) {
|
|
|
258
294
|
*/
|
|
259
295
|
const commands = [
|
|
260
296
|
{name: 'init', path: './commands/init.mjs', register: 'registerInit'},
|
|
261
|
-
{name: 'component', path: './commands/component
|
|
297
|
+
{name: 'component', path: './commands/component.mjs', register: 'registerComponent'},
|
|
262
298
|
{name: 'docs', path: './commands/docs.mjs', register: 'registerDocs'},
|
|
263
299
|
{name: 'blog', path: './commands/blog.mjs', register: 'registerBlog'},
|
|
264
300
|
{name: 'swizzle', path: './commands/swizzle.mjs', register: 'registerSwizzle'},
|
|
@@ -266,16 +302,40 @@ const commands = [
|
|
|
266
302
|
// agent-docs folded into init — functions still importable from agent-docs.mjs
|
|
267
303
|
{name: 'template', path: './commands/template.mjs', register: 'registerTemplate'},
|
|
268
304
|
{name: 'upgrade', path: './commands/upgrade.mjs', register: 'registerUpgrade'},
|
|
269
|
-
{name: 'theme', path: './commands/
|
|
305
|
+
{name: 'theme', path: './commands/theme.mjs', register: 'registerTheme'},
|
|
270
306
|
{name: 'integration', path: './commands/integration.mjs', register: 'registerIntegration'},
|
|
271
|
-
{name: 'hook', path: './commands/hook
|
|
307
|
+
{name: 'hook', path: './commands/hook.mjs', register: 'registerHook'},
|
|
272
308
|
{name: 'discover', path: './commands/discover.mjs', register: 'registerDiscover'},
|
|
273
309
|
{name: 'search', path: './commands/search.mjs', register: 'registerSearch'},
|
|
274
310
|
{name: 'build', path: './commands/build.mjs', register: 'registerBuild'},
|
|
275
311
|
{name: 'doctor', path: './commands/doctor.mjs', register: 'registerDoctor'},
|
|
312
|
+
// Registered after every other command: the manifest lists the commands in
|
|
313
|
+
// registration order.
|
|
314
|
+
{name: 'manifest', path: './commands/manifest.mjs', register: 'registerManifest'},
|
|
315
|
+
{name: 'postinstall', path: './commands/postinstall.mjs', register: 'registerPostinstall'},
|
|
276
316
|
];
|
|
277
317
|
|
|
278
318
|
const SETUP_NUDGE_EXEMPT = new Set(['init', 'agent-docs']);
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Is `cwd` inside the CLI's own source checkout while the CLI runs from it?
|
|
322
|
+
* An installed CLI always lives under `node_modules`; a CLI running from source
|
|
323
|
+
* does not, and its checkout is the pnpm workspace that holds it. Developing
|
|
324
|
+
* Astryx is not an app to set up, so the setup nudge stays quiet there.
|
|
325
|
+
* @param {string} cwd
|
|
326
|
+
* @returns {boolean}
|
|
327
|
+
*/
|
|
328
|
+
function inOwnSourceCheckout(cwd) {
|
|
329
|
+
if (CLI_ROOT.split(path.sep).includes('node_modules')) return false;
|
|
330
|
+
let checkout = CLI_ROOT;
|
|
331
|
+
while (!fs.existsSync(path.join(checkout, 'pnpm-workspace.yaml'))) {
|
|
332
|
+
const parent = path.dirname(checkout);
|
|
333
|
+
if (parent === checkout) return false;
|
|
334
|
+
checkout = parent;
|
|
335
|
+
}
|
|
336
|
+
const rel = path.relative(checkout, path.resolve(cwd));
|
|
337
|
+
return rel !== '..' && !rel.startsWith(`..${path.sep}`) && !path.isAbsolute(rel);
|
|
338
|
+
}
|
|
279
339
|
/** An integration package's manifest: the package is not an app to set up. */
|
|
280
340
|
const INTEGRATION_MANIFEST_FILES = [
|
|
281
341
|
'astryx.integration.ts',
|
|
@@ -307,7 +367,8 @@ export async function createProgram() {
|
|
|
307
367
|
// kit in clients/cli/formatters.
|
|
308
368
|
program.addHelpText(
|
|
309
369
|
'after',
|
|
310
|
-
|
|
370
|
+
// A function, so the example names the invocation when help is printed.
|
|
371
|
+
() => '\n' +
|
|
311
372
|
[
|
|
312
373
|
section(
|
|
313
374
|
'Output format',
|
|
@@ -330,9 +391,13 @@ export async function createProgram() {
|
|
|
330
391
|
{fields: ['block', 'shape']},
|
|
331
392
|
),
|
|
332
393
|
text(
|
|
333
|
-
|
|
394
|
+
`Grep a field across records, e.g. ${formatCliCommand('search button')} | grep "^command:". ` +
|
|
334
395
|
'Errors/warnings go to stderr; use --json for structured parsing.',
|
|
335
396
|
),
|
|
397
|
+
text(
|
|
398
|
+
"Global mode: in a project, the project's own CLI answers (this copy hands the run to it); a copy installed for the computer checks for updates once a day and keeps an agent skill in your home folder. " +
|
|
399
|
+
`See ${formatCliCommand('docs global')}.`,
|
|
400
|
+
),
|
|
336
401
|
]
|
|
337
402
|
.map(block => block.toString())
|
|
338
403
|
.join('\n\n'),
|
|
@@ -429,6 +494,7 @@ export async function createProgram() {
|
|
|
429
494
|
// Enriched, self-describing surface (the full manifest payload).
|
|
430
495
|
manifest,
|
|
431
496
|
},
|
|
497
|
+
meta: {answeredBy: answeredBy()},
|
|
432
498
|
}, null, 2));
|
|
433
499
|
debug.recordCommandResult(
|
|
434
500
|
debug.resultSet({
|
|
@@ -525,10 +591,29 @@ export async function createProgram() {
|
|
|
525
591
|
process.exit(1);
|
|
526
592
|
});
|
|
527
593
|
|
|
594
|
+
/**
|
|
595
|
+
* Load the project's integrations before any command runs, so every command
|
|
596
|
+
* it prints starts with the `cliCommand` they declare (the picker reads them
|
|
597
|
+
* synchronously; see foundation/env/cli-command.mjs). Skipped when this
|
|
598
|
+
* process already loaded the project, such as the bin's debug preload. A
|
|
599
|
+
* project that cannot load is the command's to report, never this hook's.
|
|
600
|
+
*/
|
|
601
|
+
program.hook('preAction', async () => {
|
|
602
|
+
try {
|
|
603
|
+
const cwd = process.cwd();
|
|
604
|
+
if (hasRecordedProject(cwd)) return;
|
|
605
|
+
const {Project} = await import('../../foundation/config/project.mjs');
|
|
606
|
+
await Project.load(cwd);
|
|
607
|
+
} catch {
|
|
608
|
+
// Best-effort: the picker falls back to its package-manager guess.
|
|
609
|
+
}
|
|
610
|
+
});
|
|
611
|
+
|
|
528
612
|
/**
|
|
529
613
|
* Enforcement layer 3 — setup nudge. If this project hasn't run `astryx init`
|
|
530
|
-
* yet (no Astryx marker in any agent-doc file
|
|
531
|
-
* the user/agent that
|
|
614
|
+
* yet (no Astryx marker in any agent-doc file between the project and its
|
|
615
|
+
* repository root — see isAstryxPromptInReach), remind the user/agent that
|
|
616
|
+
* setup is missing.
|
|
532
617
|
*
|
|
533
618
|
* Uses `preAction` (not postAction) so it fires for EVERY valid command — even
|
|
534
619
|
* ones whose action errors or calls process.exit (postAction is skipped then).
|
|
@@ -538,7 +623,9 @@ export async function createProgram() {
|
|
|
538
623
|
* consumers parse stdout, not stderr — a stderr nudge would not reach them anyway.
|
|
539
624
|
* The core/cli postinstall layers already nudge at install time regardless of
|
|
540
625
|
* --json; a machine-readable nudge could later be an envelope field. Also skipped
|
|
541
|
-
* for the installer commands themselves
|
|
626
|
+
* for the installer commands themselves, outside a project (no package.json,
|
|
627
|
+
* or one that neither installs nor declares Astryx), and inside the CLI's own
|
|
628
|
+
* source checkout when it runs from there.
|
|
542
629
|
*/
|
|
543
630
|
program.hook('preAction', (thisCommand, actionCommand) => {
|
|
544
631
|
try {
|
|
@@ -546,15 +633,62 @@ export async function createProgram() {
|
|
|
546
633
|
if (SETUP_NUDGE_EXEMPT.has(actionCommand.name())) return;
|
|
547
634
|
const cwd = process.cwd();
|
|
548
635
|
if (!fs.existsSync(path.join(cwd, 'package.json'))) return; // not a project
|
|
636
|
+
// A package.json that neither installs nor declares Astryx is outside a
|
|
637
|
+
// project: `init` would set up a project the folder does not have
|
|
638
|
+
// (spec AST-081 FR3).
|
|
639
|
+
if (isOutsideProject(cwd)) return;
|
|
549
640
|
// An integration package is not an app: `init` is not its next step.
|
|
550
641
|
if (INTEGRATION_MANIFEST_FILES.some(file => fs.existsSync(path.join(cwd, file)))) return;
|
|
551
|
-
if (
|
|
552
|
-
|
|
553
|
-
//
|
|
554
|
-
//
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
642
|
+
if (inOwnSourceCheckout(cwd)) return; // developing Astryx itself, not an app
|
|
643
|
+
if (isAstryxPromptInReach(cwd)) return; // already set up — stay quiet
|
|
644
|
+
// Where init writes the docs, by init's own rule: the project root, which
|
|
645
|
+
// can sit above a nested package such as functions/. Inside a git
|
|
646
|
+
// repository the walk above already reaches it (the root never lies
|
|
647
|
+
// above the repository root), so this changes nothing there; outside a
|
|
648
|
+
// repository the walk checks only cwd, and this finds the root.
|
|
649
|
+
if (isAstryxInitialized(agentDocsTargetDir(cwd))) return;
|
|
650
|
+
// In the home folder, or at the top of a settings folder in it, init
|
|
651
|
+
// writes no agent docs, so naming it would repeat on every command.
|
|
652
|
+
try {
|
|
653
|
+
assertAgentDocsTarget(agentDocsTargetDir(cwd));
|
|
654
|
+
} catch {
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
// Same wording as the core/cli postinstall nudges. getCliInvocation()
|
|
658
|
+
// renders the correct form for THIS project — an integration's cliCommand,
|
|
659
|
+
// scoped `npx @astryxdesign/cli` one-off, or `<pm> astryx` when installed —
|
|
660
|
+
// never npx with the unscoped name, which fetches an unrelated package.
|
|
661
|
+
// A project with no CLI of its own, answered by another release than its
|
|
662
|
+
// Core's: add the CLI at Core's version first, as the daily hint says,
|
|
663
|
+
// then run that CLI's init (spec AST-081 FR2).
|
|
664
|
+
// A folder that belongs to no project spec:AST-040 FR9 defines gets no
|
|
665
|
+
// reminder, as outside a project.
|
|
666
|
+
const target = installFolder(cwd);
|
|
667
|
+
if (target == null) return;
|
|
668
|
+
// From a folder inside the project whose package.json is not the
|
|
669
|
+
// project's, init runs from the project's folder. Only `cd` comes
|
|
670
|
+
// before it, so the command is the picker's for that folder, never the
|
|
671
|
+
// bare `astryx` name a package runner would fetch from the registry
|
|
672
|
+
// (spec AST-081 FR5).
|
|
673
|
+
if (target.moved) {
|
|
674
|
+
console.error(
|
|
675
|
+
setupNudge(getCliInvocation(target.dir), {before: `cd ${quoteCommandArgument(target.dir)}`}).trimEnd(),
|
|
676
|
+
);
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
const choice = runChoice(cwd);
|
|
680
|
+
if (choice.copy === 'starting' && choice.coreVersion && choice.coreVersion !== choice.version) {
|
|
681
|
+
// The daily hint's comparison and command: add the CLI at Core's
|
|
682
|
+
// version, then run that CLI's init.
|
|
683
|
+
const add = cliInstallAdvice({cwd, core: choice.coreVersion});
|
|
684
|
+
if (add?.command) {
|
|
685
|
+
console.error(
|
|
686
|
+
setupNudge(getCliInvocation(add.root, {installed: true}), {before: add.command}).trimEnd(),
|
|
687
|
+
);
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
console.error(setupNudge(getCliInvocation(cwd)).trimEnd());
|
|
558
692
|
} catch {
|
|
559
693
|
// Never let the nudge break a command.
|
|
560
694
|
}
|
|
@@ -563,7 +697,7 @@ export async function createProgram() {
|
|
|
563
697
|
for (const cmd of commands) {
|
|
564
698
|
try {
|
|
565
699
|
const mod = await import(cmd.path);
|
|
566
|
-
mod[cmd.register](program);
|
|
700
|
+
mod[cmd.register](program, {jsonSupported: JSON_SUPPORTED, version: pkg.version});
|
|
567
701
|
} catch (e) {
|
|
568
702
|
// Command fails to load but CLI still works
|
|
569
703
|
const reason = /** @type {any} */ (e).message;
|
|
@@ -583,84 +717,6 @@ export async function createProgram() {
|
|
|
583
717
|
}
|
|
584
718
|
}
|
|
585
719
|
|
|
586
|
-
// Capability manifest — a single, self-describing view of the whole CLI so
|
|
587
|
-
// agents can discover every command, argument, flag, and response type without
|
|
588
|
-
// scraping `--help`. `astryx manifest --json` is the dedicated surface; the bare
|
|
589
|
-
// `xds --json` embeds the same payload under data.manifest for convenience.
|
|
590
|
-
// Intentionally CLI-special — no `api/manifest`. It introspects the live
|
|
591
|
-
// Commander `program`, so extracting it to `api/` would create the `api → cli`
|
|
592
|
-
// cycle from #4302. `buildManifest(program)` lives in lib/; see its header.
|
|
593
|
-
const manifestCommand = program
|
|
594
|
-
.command('manifest')
|
|
595
|
-
.description('Print the full CLI capability manifest (use with --json)')
|
|
596
|
-
.action(() => {
|
|
597
|
-
const manifest = buildManifest(program, {
|
|
598
|
-
jsonSupported: JSON_SUPPORTED,
|
|
599
|
-
version: pkg.version,
|
|
600
|
-
});
|
|
601
|
-
// The manifest IS a result set: one entry per command the CLI ships.
|
|
602
|
-
debug.recordCommandResult(
|
|
603
|
-
debug.resultSet({
|
|
604
|
-
count: manifest.commands.length,
|
|
605
|
-
resultKind: 'command',
|
|
606
|
-
}),
|
|
607
|
-
);
|
|
608
|
-
if (program.opts().json) {
|
|
609
|
-
process.__xdsJsonHandled = true;
|
|
610
|
-
console.log(JSON.stringify({apiVersion: API_VERSION, type: 'manifest', data: manifest}, null, 2));
|
|
611
|
-
return;
|
|
612
|
-
}
|
|
613
|
-
// Human-readable summary as greppable records (agents should use --json).
|
|
614
|
-
// One record per command: name, whether it supports --json, and the
|
|
615
|
-
// description. Field names are the manifest entry's own keys.
|
|
616
|
-
emit(
|
|
617
|
-
section(`${manifest.name} v${manifest.version} (${manifest.commands.length} commands)`),
|
|
618
|
-
records(
|
|
619
|
-
manifest.commands.map(c => ({
|
|
620
|
-
name: c.name,
|
|
621
|
-
json: c.json ? 'yes' : '',
|
|
622
|
-
description: c.description || '',
|
|
623
|
-
})),
|
|
624
|
-
{fields: ['name', 'json', 'description']},
|
|
625
|
-
),
|
|
626
|
-
text(`Run \`${getCliInvocation()} manifest --json\` for the full structured manifest.`),
|
|
627
|
-
);
|
|
628
|
-
});
|
|
629
|
-
addDocHelp(manifestCommand, manifestDoc);
|
|
630
|
-
markReportsResult(manifestCommand);
|
|
631
|
-
|
|
632
|
-
// Hidden command used by package.json postinstall scripts
|
|
633
|
-
const postinstallCommand = program
|
|
634
|
-
.command('postinstall', {hidden: true})
|
|
635
|
-
.action(() => {
|
|
636
|
-
// Prints the welcome box. Nothing is looked up.
|
|
637
|
-
debug.recordCommandResult(debug.NO_RESULT_SET);
|
|
638
|
-
const r = getCliInvocation();
|
|
639
|
-
const pad = (/** @type {string} */ s, /** @type {number} */ len) => s + ' '.repeat(Math.max(0, len - s.length));
|
|
640
|
-
const W = 49; // inner width of the box
|
|
641
|
-
const line = (/** @type {string} */ s) => ` │ ${pad(s, W)}│`;
|
|
642
|
-
console.log(`
|
|
643
|
-
╭${'─'.repeat(W + 2)}╮
|
|
644
|
-
${line('')}
|
|
645
|
-
${line(' Design system installed!')}
|
|
646
|
-
${line('')}
|
|
647
|
-
${line(' Get started:')}
|
|
648
|
-
${line(` ${r} init Setup + AI agent docs`)}
|
|
649
|
-
${line(` ${r} --help See all commands`)}
|
|
650
|
-
${line('')}
|
|
651
|
-
${line(' Or run directly:')}
|
|
652
|
-
${line(` ${r} init Setup + AI agent docs`)}
|
|
653
|
-
${line(` ${r} component Browse component docs`)}
|
|
654
|
-
${line(` ${r} hook Browse hook docs`)}
|
|
655
|
-
${line(` ${r} docs Design system reference`)}
|
|
656
|
-
${line(` ${r} swizzle Customize a component`)}
|
|
657
|
-
${line(` ${r} template Add a page template`)}
|
|
658
|
-
${line('')}
|
|
659
|
-
╰${'─'.repeat(W + 2)}╯
|
|
660
|
-
`);
|
|
661
|
-
});
|
|
662
|
-
markReportsResult(postinstallCommand);
|
|
663
|
-
|
|
664
720
|
// Install the JSON shim AFTER all commands are registered so we can
|
|
665
721
|
// patch outputHelp on every command (root + subcommands). The shim
|
|
666
722
|
// extends the --json contract to cover Commander's parse-time short
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
import {isJsonMode, jsonError as _jsonError, humanWarn} from '../../../foundation/response/json.mjs';
|
|
54
54
|
import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
|
|
55
55
|
import {setOutcome} from '../../../foundation/debug/index.mjs';
|
|
56
|
+
import {formatCliCommand} from '../../../foundation/env/package-manager.mjs';
|
|
56
57
|
|
|
57
58
|
/**
|
|
58
59
|
* Suggestion object — matches the shape used by API errors and the JSON
|
|
@@ -122,7 +123,9 @@ export function cliError(message, options = {}) {
|
|
|
122
123
|
if (suggestions?.length) {
|
|
123
124
|
console.error('');
|
|
124
125
|
for (const s of suggestions) {
|
|
125
|
-
|
|
126
|
+
// A suggested command stays bare in JSON and is prefixed here.
|
|
127
|
+
const name = /^astryx(\s|$)/.test(s.name) ? formatCliCommand(s.name) : s.name;
|
|
128
|
+
const tag = s.reason ? ` ${name} (${s.reason})` : ` ${name}`;
|
|
126
129
|
console.error(tag);
|
|
127
130
|
}
|
|
128
131
|
}
|
|
@@ -21,7 +21,7 @@ import {getCliInvocation} from '../../../foundation/env/package-manager.mjs';
|
|
|
21
21
|
* (→ `.astryx-table-cell`), and `astryx-button` → key `button`.
|
|
22
22
|
*
|
|
23
23
|
* Keep the `astryx-` literal in sync with packages/core/src/naming.ts
|
|
24
|
-
* (NAMESPACE / classPrefix), the same way
|
|
24
|
+
* (NAMESPACE / classPrefix), the same way commands/theme.mjs mirrors it.
|
|
25
25
|
* <!-- SYNC: packages/core/src/naming.ts (namespace prefix source of truth) -->
|
|
26
26
|
* @param {import('@astryxdesign/cli/authoring').ComponentThemingTarget} target
|
|
27
27
|
* @returns {string}
|
|
@@ -67,7 +67,7 @@ describe('formatFull sub-component rendering', () => {
|
|
|
67
67
|
expect(out).not.toContain('undefined');
|
|
68
68
|
// Points the reader at the sub-component's own docs instead of a blank.
|
|
69
69
|
expect(out).toMatch(
|
|
70
|
-
/(?:astryx|@astryxdesign\/cli) component XDSRadioListItem/,
|
|
70
|
+
/(?:astryx|@astryxdesign\/cli(?:@\S+)?) component XDSRadioListItem/,
|
|
71
71
|
);
|
|
72
72
|
});
|
|
73
73
|
|
|
@@ -63,10 +63,10 @@ export function reportsResultVia(cmd) {
|
|
|
63
63
|
/**
|
|
64
64
|
* Mark a hand-registered command as reporting its result.
|
|
65
65
|
*
|
|
66
|
-
* For
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
66
|
+
* For what does not come from a CommandDoc: the root program, and the stub
|
|
67
|
+
* left behind when a command module fails to load. Every command, `manifest`
|
|
68
|
+
* and the hidden `postinstall` hook included, registers through
|
|
69
|
+
* {@link defineCommand}. These call {@link recordCommandResult} themselves; this
|
|
70
70
|
* says so, and the coverage test pins the set of commands allowed to, so the
|
|
71
71
|
* mark cannot become a quiet way around the contract.
|
|
72
72
|
*
|
|
@@ -105,10 +105,12 @@ export function commandDocsOf(cmd) {
|
|
|
105
105
|
* fn?: import('@astryxdesign/cli/authoring').FunctionDoc,
|
|
106
106
|
* action?: (...args: any[]) => import('../../../foundation/debug/command-result.mjs').CommandResult
|
|
107
107
|
* | Promise<import('../../../foundation/debug/command-result.mjs').CommandResult>,
|
|
108
|
-
*
|
|
108
|
+
* hidden?: boolean,
|
|
109
|
+
* }} [impl] `hidden` keeps the command out of help and the manifest (a
|
|
110
|
+
* package-script hook, not a command for people or agents).
|
|
109
111
|
* @returns {import('commander').Command} the created command.
|
|
110
112
|
*/
|
|
111
|
-
export function defineCommand(parent, doc, {fn, action} = {}) {
|
|
113
|
+
export function defineCommand(parent, doc, {fn, action, hidden} = {}) {
|
|
112
114
|
// The command token is the last path segment ("theme build" -> "build"),
|
|
113
115
|
// since subcommands are added to their group command, not the program.
|
|
114
116
|
const token = doc.name.split(' ').pop() ?? doc.name;
|
|
@@ -119,7 +121,10 @@ export function defineCommand(parent, doc, {fn, action} = {}) {
|
|
|
119
121
|
})
|
|
120
122
|
.join(' ');
|
|
121
123
|
|
|
122
|
-
const cmd = parent.command(
|
|
124
|
+
const cmd = parent.command(
|
|
125
|
+
argSpec ? `${token} ${argSpec}` : token,
|
|
126
|
+
hidden ? {hidden: true} : {},
|
|
127
|
+
);
|
|
123
128
|
Object.defineProperty(cmd, COMMAND_DOCS, {value: {doc, fn}, configurable: true});
|
|
124
129
|
if (doc.summary) cmd.description(doc.summary);
|
|
125
130
|
if (doc.deprecated) {
|
|
@@ -180,8 +185,8 @@ export function defineCommand(parent, doc, {fn, action} = {}) {
|
|
|
180
185
|
*/
|
|
181
186
|
export function addDocHelp(cmd, doc) {
|
|
182
187
|
addExitCodesHelp(cmd, doc.exitCodes);
|
|
183
|
-
// Rendered when help is shown, so the run prefix (
|
|
184
|
-
// ...) is looked up then, not on every start.
|
|
188
|
+
// Rendered when help is shown, so the run prefix (pnpm exec astryx, yarn
|
|
189
|
+
// astryx, ...) is looked up then, not on every start.
|
|
185
190
|
cmd.addHelpText('after', () => {
|
|
186
191
|
const examples = (doc.examples ?? []).flatMap(({label, cli}) => [
|
|
187
192
|
...(label ? [` # ${label}`] : []),
|
|
@@ -24,6 +24,10 @@ for (const file of fs.readdirSync(COMMANDS).sort()) {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const manifest = buildManifest(program, {jsonSupported: JSON_SUPPORTED, version: '0.0.0-test'});
|
|
27
|
+
/** Hidden commands (a package-script hook): documented, never in the manifest. */
|
|
28
|
+
const HIDDEN = new Set(
|
|
29
|
+
program.commands.filter((c) => /** @type {any} */ (c)._hidden).map((c) => c.name()),
|
|
30
|
+
);
|
|
27
31
|
/** @type {Map<string, any>} */
|
|
28
32
|
const entries = new Map();
|
|
29
33
|
const walk = (/** @type {any} */ c) => {
|
|
@@ -98,6 +102,7 @@ describe('command exit codes', () => {
|
|
|
98
102
|
|
|
99
103
|
it('the manifest carries every command exit code', () => {
|
|
100
104
|
for (const doc of commandDocs) {
|
|
105
|
+
if (HIDDEN.has(doc.name)) continue;
|
|
101
106
|
expect(entries.get(doc.name)?.exitCodes, doc.name).toEqual(
|
|
102
107
|
doc.exitCodes.map(({code, when}) => ({code, when})),
|
|
103
108
|
);
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
*/
|
|
43
43
|
|
|
44
44
|
import {API_VERSION, isJsonMode, toErrorEnvelope} from '../../../foundation/response/json.mjs';
|
|
45
|
+
import {answeredBy} from '../../../foundation/release/run-context.mjs';
|
|
45
46
|
import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
|
|
46
47
|
import {setCommand, setOutcome, recordHelp} from '../../../foundation/debug/index.mjs';
|
|
47
48
|
|
|
@@ -84,7 +85,7 @@ function jsonActive() {
|
|
|
84
85
|
* subcommand (e.g. `astryx component --help --json`).
|
|
85
86
|
*
|
|
86
87
|
* @param {import('commander').Command} cmd
|
|
87
|
-
* @returns {{apiVersion: number, type: 'help', data: object}}
|
|
88
|
+
* @returns {{apiVersion: number, type: 'help', data: object, meta: {answeredBy: {cli: string, core: string | null, copy: 'project' | 'starting' | 'matched' | 'carried' | 'fallback'}}}}
|
|
88
89
|
*/
|
|
89
90
|
export function buildHelpEnvelope(cmd) {
|
|
90
91
|
// Reconstruct the fully-qualified command name (e.g. "astryx theme build").
|
|
@@ -119,6 +120,7 @@ export function buildHelpEnvelope(cmd) {
|
|
|
119
120
|
options,
|
|
120
121
|
subcommands,
|
|
121
122
|
},
|
|
123
|
+
meta: {answeredBy: answeredBy()},
|
|
122
124
|
};
|
|
123
125
|
}
|
|
124
126
|
|
|
@@ -50,6 +50,13 @@ export interface ManifestCommand {
|
|
|
50
50
|
examples?: string[];
|
|
51
51
|
/** Documented exit codes: the process exit status and when it occurs. */
|
|
52
52
|
exitCodes?: {code: number; when: string}[];
|
|
53
|
+
/**
|
|
54
|
+
* What the command does in a folder outside any project: `same` gives the
|
|
55
|
+
* answer it gives in a new project; `refuse` writes nothing and fails, naming
|
|
56
|
+
* the app project or integration package it needs; `own` does something
|
|
57
|
+
* else, which its docs state. Absent on a group that only holds subcommands.
|
|
58
|
+
*/
|
|
59
|
+
outsideProject?: 'same' | 'refuse' | 'own';
|
|
53
60
|
/** Nested subcommands (e.g. `theme build` under `theme`). */
|
|
54
61
|
subcommands?: ManifestCommand[];
|
|
55
62
|
}
|
|
@@ -64,6 +71,8 @@ export interface CLIManifest {
|
|
|
64
71
|
commands: ManifestCommand[];
|
|
65
72
|
/** Sorted list of fully-qualified command names that support `--json`. */
|
|
66
73
|
jsonSupported: string[];
|
|
74
|
+
/** What a run may do beyond its command (the hand-off, the daily update check, the agent skill), and the docs topic that explains it. */
|
|
75
|
+
globalMode: {docs: string; summary: string};
|
|
67
76
|
/** Flat index of response `type` discriminators keyed by command name. */
|
|
68
77
|
responseTypes: Record<string, string[]>;
|
|
69
78
|
}
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Its per-command facts come from the command's own definitions: names,
|
|
11
11
|
* arguments and options from Commander metadata (program.commands, cmd.options,
|
|
12
|
-
* cmd.registeredArguments, cmd.description()); examples
|
|
12
|
+
* cmd.registeredArguments, cmd.description()); examples, exit codes, and what
|
|
13
|
+
* it does outside a project from its CommandDoc;
|
|
13
14
|
* response `type` discriminators from the returns of the FunctionDoc it wraps
|
|
14
15
|
* (both attached by `defineCommand`); `--json` support from the JSON_SUPPORTED
|
|
15
16
|
* allowlist in index.mjs. The hand-kept lists are CLI_LAYER_RESPONSE_TYPES,
|
|
@@ -39,6 +40,16 @@ import {API_VERSION} from '../../../foundation/response/json.mjs';
|
|
|
39
40
|
import {commandDocsOf} from './define-command.mjs';
|
|
40
41
|
import {doc as manifestDoc} from '../commands/manifest.doc.mjs';
|
|
41
42
|
|
|
43
|
+
/**
|
|
44
|
+
* What a run may do beyond the command it was asked for (spec AST-081;
|
|
45
|
+
* `spec:AST-017` FR14), and where it is explained.
|
|
46
|
+
*/
|
|
47
|
+
export const GLOBAL_MODE = Object.freeze({
|
|
48
|
+
docs: 'astryx docs global',
|
|
49
|
+
summary:
|
|
50
|
+
"In a folder that belongs to a project, the project's own CLI answers: this copy hands the run to it. In a project with no CLI of its own, and outside any project, this copy answers. A copy installed for the computer checks the registry for a newer release once a day in the background, and keeps one agent skill file in the home folder.",
|
|
51
|
+
});
|
|
52
|
+
|
|
42
53
|
/**
|
|
43
54
|
* Envelopes the CLI layer builds itself, so the wrapped FunctionDoc cannot
|
|
44
55
|
* declare them: `manifest` wraps no API function, `theme build` batches several
|
|
@@ -194,6 +205,10 @@ function describeCommand(cmd, root, jsonSupported) {
|
|
|
194
205
|
}));
|
|
195
206
|
if (exitCodes.length > 0) entry.exitCodes = exitCodes;
|
|
196
207
|
|
|
208
|
+
// What the command does outside a project (spec AST-081 FR4). Every command
|
|
209
|
+
// declares it in its CommandDoc; a group that only holds subcommands does not.
|
|
210
|
+
if (docs?.doc.outsideProject) entry.outsideProject = docs.doc.outsideProject;
|
|
211
|
+
|
|
197
212
|
// Sort subcommands by name for a stable, agent-facing contract — the same
|
|
198
213
|
// guarantee the top-level command list makes. Otherwise Commander
|
|
199
214
|
// registration order leaks into the manifest and a pure reorder of
|
|
@@ -265,6 +280,7 @@ export function buildManifest(program, opts = {}) {
|
|
|
265
280
|
globalOptions: describeGlobalOptions(program),
|
|
266
281
|
commands,
|
|
267
282
|
jsonSupported: [...jsonSupported].sort(),
|
|
283
|
+
globalMode: GLOBAL_MODE,
|
|
268
284
|
// Flat index of every response `type` discriminator the CLI can emit,
|
|
269
285
|
// keyed by command — lets an agent know what to expect back per call.
|
|
270
286
|
responseTypes: Object.fromEntries(
|
|
@@ -55,6 +55,10 @@ const CLI_LAYER_TYPES = {
|
|
|
55
55
|
};
|
|
56
56
|
|
|
57
57
|
const manifest = buildManifest(program, {jsonSupported: JSON_SUPPORTED, version: '0.0.0-test'});
|
|
58
|
+
/** Hidden commands (a package-script hook): documented, never in the manifest. */
|
|
59
|
+
const HIDDEN = new Set(
|
|
60
|
+
program.commands.filter((c) => /** @type {any} */ (c)._hidden).map((c) => c.name()),
|
|
61
|
+
);
|
|
58
62
|
|
|
59
63
|
/** Flatten the manifest command tree into fully-qualified names. */
|
|
60
64
|
function flatten(cmds, out = []) {
|
|
@@ -116,12 +120,19 @@ describe('manifest: drift guards', () => {
|
|
|
116
120
|
|
|
117
121
|
it('takes every command example from its CommandDoc', () => {
|
|
118
122
|
for (const [name, doc] of commandDocs) {
|
|
123
|
+
if (HIDDEN.has(name)) continue;
|
|
119
124
|
const entry = allEntries.find((c) => c.name === name);
|
|
120
125
|
expect(entry, `CommandDoc "${name}" has no manifest entry`).toBeDefined();
|
|
121
126
|
expect(entry.examples ?? [], name).toEqual((doc.examples ?? []).map((e) => e.cli));
|
|
122
127
|
}
|
|
123
128
|
});
|
|
124
129
|
|
|
130
|
+
it('documents the hidden postinstall hook and keeps it out of the manifest', () => {
|
|
131
|
+
expect([...HIDDEN]).toEqual(['postinstall']);
|
|
132
|
+
expect(commandDocs.has('postinstall')).toBe(true);
|
|
133
|
+
expect(allNames.has('postinstall')).toBe(false);
|
|
134
|
+
});
|
|
135
|
+
|
|
125
136
|
it('lists every response type the wrapped API function returns', () => {
|
|
126
137
|
for (const [name, doc] of commandDocs) {
|
|
127
138
|
if (!doc.fn) continue;
|
|
@@ -152,6 +163,7 @@ describe('manifest: drift guards', () => {
|
|
|
152
163
|
|
|
153
164
|
it('takes response types from the wrapped FunctionDoc, plus CLI-layer envelopes', () => {
|
|
154
165
|
for (const [name, doc] of commandDocs) {
|
|
166
|
+
if (HIDDEN.has(name)) continue;
|
|
155
167
|
const entry = allEntries.find((c) => c.name === name);
|
|
156
168
|
const returns = doc.fn ? functionDocs.get(doc.fn).returns.map((r) => r.type) : [];
|
|
157
169
|
const expected = [...returns, ...(CLI_LAYER_TYPES[name] ?? [])];
|
|
@@ -307,3 +319,28 @@ describe('manifest: text projection', () => {
|
|
|
307
319
|
for (const key of textKeys) expect(jsonKeys).toContain(key);
|
|
308
320
|
});
|
|
309
321
|
});
|
|
322
|
+
|
|
323
|
+
describe('global mode is discoverable (spec:AST-017 FR14)', () => {
|
|
324
|
+
it('the manifest names what a run may do beyond its command, and the docs topic that explains it', () => {
|
|
325
|
+
expect(manifest.globalMode.docs).toBe('astryx docs global');
|
|
326
|
+
for (const word of ['hands the run', 'once a day', 'agent skill']) {
|
|
327
|
+
expect(manifest.globalMode.summary).toContain(word);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('--help carries one line pointing to the global mode docs', () => {
|
|
332
|
+
const help = program.helpInformation() + '';
|
|
333
|
+
let after = '';
|
|
334
|
+
program.emit('afterHelp', {
|
|
335
|
+
error: false,
|
|
336
|
+
write: (/** @type {string} */ s) => {
|
|
337
|
+
after += s;
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
const lines = `${help}${after}`
|
|
341
|
+
.split('\n')
|
|
342
|
+
.filter(line => line.startsWith('Global mode:'));
|
|
343
|
+
expect(lines).toHaveLength(1);
|
|
344
|
+
expect(lines[0]).toMatch(/docs global\.$/u);
|
|
345
|
+
});
|
|
346
|
+
});
|