@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
|
@@ -277,5 +277,17 @@ export const doc = {
|
|
|
277
277
|
description:
|
|
278
278
|
'Recorded in the debug log, never printed: the process was ended by a signal (Ctrl-C, SIGTERM) before the command reached a terminal path.',
|
|
279
279
|
},
|
|
280
|
+
|
|
281
|
+
// Global mode
|
|
282
|
+
{
|
|
283
|
+
value: 'ERR_VERSIONS_UNAVAILABLE',
|
|
284
|
+
description:
|
|
285
|
+
'Nothing could answer this run, and nothing was written: the project\'s own CLI could not start and nothing else could answer, or the Core a command needs outside a project could not be installed.',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
value: 'ERR_PROJECT_REQUIRED',
|
|
289
|
+
description:
|
|
290
|
+
'The command needs a project (an app with Astryx installed, or an integration package) and was run outside one. Nothing was written.',
|
|
291
|
+
},
|
|
280
292
|
],
|
|
281
293
|
};
|
|
@@ -88,6 +88,8 @@
|
|
|
88
88
|
* | 'ERR_LAYOUT_INVALID'
|
|
89
89
|
* | 'ERR_UNCLASSIFIED_EXIT'
|
|
90
90
|
* | 'ERR_SIGNAL_TERMINATED'
|
|
91
|
+
* | 'ERR_VERSIONS_UNAVAILABLE'
|
|
92
|
+
* | 'ERR_PROJECT_REQUIRED'
|
|
91
93
|
* )} ErrorCode
|
|
92
94
|
*/
|
|
93
95
|
|
|
@@ -236,6 +238,21 @@ export const ERROR_CODES = Object.freeze({
|
|
|
236
238
|
* command never reached a terminal path of its own.
|
|
237
239
|
*/
|
|
238
240
|
ERR_SIGNAL_TERMINATED: 'ERR_SIGNAL_TERMINATED',
|
|
241
|
+
|
|
242
|
+
// ── Global mode (which release answers) ──────────────────────────
|
|
243
|
+
/**
|
|
244
|
+
* The CLI release a run needs could not run: the release that matches the
|
|
245
|
+
* project's Core is not installed and could not be fetched (offline, or the
|
|
246
|
+
* registry lacks it), the project's own CLI could not be started, or a copy
|
|
247
|
+
* that carries no Core could not install its release's Core outside a
|
|
248
|
+
* project. Nothing was written.
|
|
249
|
+
*/
|
|
250
|
+
ERR_VERSIONS_UNAVAILABLE: 'ERR_VERSIONS_UNAVAILABLE',
|
|
251
|
+
/**
|
|
252
|
+
* The command needs a project (an app with Astryx installed, or an
|
|
253
|
+
* integration package) and was run outside one. Nothing was written.
|
|
254
|
+
*/
|
|
255
|
+
ERR_PROJECT_REQUIRED: 'ERR_PROJECT_REQUIRED',
|
|
239
256
|
});
|
|
240
257
|
|
|
241
258
|
/**
|
|
@@ -113,6 +113,7 @@ describe('error codes: shipped set', () => {
|
|
|
113
113
|
'ERR_NO_SOURCE',
|
|
114
114
|
'ERR_PALETTE_GENERATION',
|
|
115
115
|
'ERR_PATH_TRAVERSAL',
|
|
116
|
+
'ERR_PROJECT_REQUIRED',
|
|
116
117
|
'ERR_SIGNAL_TERMINATED',
|
|
117
118
|
'ERR_THEME_INVALID',
|
|
118
119
|
'ERR_THEME_LOAD',
|
|
@@ -133,6 +134,7 @@ describe('error codes: shipped set', () => {
|
|
|
133
134
|
'ERR_UNKNOWN_THEME',
|
|
134
135
|
'ERR_UNKNOWN_TOPIC',
|
|
135
136
|
'ERR_VERSION_DETECT',
|
|
137
|
+
'ERR_VERSIONS_UNAVAILABLE',
|
|
136
138
|
'ERR_WRITE_FAILED',
|
|
137
139
|
];
|
|
138
140
|
|
|
@@ -70,13 +70,18 @@ describe('json envelope shape', () => {
|
|
|
70
70
|
expect(env.apiVersion).toBe(API_VERSION);
|
|
71
71
|
expect(env.type).toBe('docs.list');
|
|
72
72
|
expect(env.data).toEqual([{name: 'Button'}]);
|
|
73
|
-
|
|
73
|
+
// The only meta every result carries names who answered (AST-081 FR5).
|
|
74
|
+
expect(Object.keys(env.meta)).toEqual(['answeredBy']);
|
|
75
|
+
const {cli, core, copy} = env.meta.answeredBy;
|
|
76
|
+
expect(typeof cli).toBe('string');
|
|
77
|
+
expect(core === null || typeof core === 'string').toBe(true);
|
|
78
|
+
expect(['project', 'matched', 'carried']).toContain(copy);
|
|
74
79
|
});
|
|
75
80
|
|
|
76
81
|
it('jsonOut attaches optional meta as a sibling of data', () => {
|
|
77
82
|
jsonOut({type: 'discover.list', data: [], meta: {configured: false}});
|
|
78
83
|
const env = JSON.parse(logs[0]);
|
|
79
|
-
expect(env.meta).toEqual({configured: false});
|
|
84
|
+
expect(env.meta).toEqual({configured: false, answeredBy: expect.any(Object)});
|
|
80
85
|
expect(env.data).toEqual([]);
|
|
81
86
|
});
|
|
82
87
|
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import {ERROR_CODES, isErrorCode} from './error-codes.mjs';
|
|
32
32
|
import {recordEnvelope, setOutcome} from '../debug/index.mjs';
|
|
33
|
+
import {answeredBy} from '../release/run-context.mjs';
|
|
33
34
|
|
|
34
35
|
export const API_VERSION = 1;
|
|
35
36
|
|
|
@@ -101,7 +102,9 @@ export function jsonOut(response) {
|
|
|
101
102
|
const envelope = {apiVersion: API_VERSION, type: response.type};
|
|
102
103
|
if (response.package !== undefined) envelope.package = response.package;
|
|
103
104
|
envelope.data = response.data;
|
|
104
|
-
|
|
105
|
+
// Every successful result names the release that answered (spec AST-081
|
|
106
|
+
// FR5): the CLI, the Core it paired with, and which copy it was.
|
|
107
|
+
envelope.meta = {...(response.meta ?? {}), answeredBy: answeredBy()};
|
|
105
108
|
// Serialize BEFORE marking handled. If JSON.stringify throws (a circular
|
|
106
109
|
// reference or a BigInt in `data` — an author bug in a command's return
|
|
107
110
|
// value), the `__xdsJsonHandled` flag must stay unset so the bin error
|
|
@@ -32,6 +32,11 @@ export const doc = {
|
|
|
32
32
|
description:
|
|
33
33
|
'The removal receipt — returned when --remove-agents is set: `data.removed` is true when a managed agent-docs block was found and removed, and false when there was none to remove.',
|
|
34
34
|
},
|
|
35
|
+
{
|
|
36
|
+
value: 'init.user',
|
|
37
|
+
description:
|
|
38
|
+
'The computer-level agent text receipt — returned when --user is set: `data.files`, one `{path, action, reason?}` per path acted on, the skill file first and then each link to its folder (action `written` | `linked` | `unchanged` | `removed` | `absent` | `kept`; `reason` only on `kept`: `edited` when a person changed the text, `not-astryx` when Astryx did not write it), `data.command` (the command the text names), and `data.warnings`.',
|
|
39
|
+
},
|
|
35
40
|
// component
|
|
36
41
|
{
|
|
37
42
|
value: 'component.list',
|
|
@@ -112,7 +117,7 @@ export const doc = {
|
|
|
112
117
|
{
|
|
113
118
|
value: 'discover.list',
|
|
114
119
|
description:
|
|
115
|
-
'
|
|
120
|
+
'What the project has, the integrations it loads and the official packages it declares, official packages first (name, category, components, version, a list per other kind they add, and latest when a source knows it); meta.available lists what the project could add, the official packages first, each with the command that adds it, and meta.sources reports each source, the official list last; when it lists no integration it carries meta.configured to tell "nothing configured" from "nothing discovered".',
|
|
116
121
|
},
|
|
117
122
|
{
|
|
118
123
|
value: 'discover.detail',
|
|
@@ -139,7 +144,7 @@ export const doc = {
|
|
|
139
144
|
{
|
|
140
145
|
value: 'search',
|
|
141
146
|
description:
|
|
142
|
-
'The echoed query, `matchCount` (total matches, before `limit`), and results, a ranked SearchResultEntry[] bounded by `limit`: each {domain, name, package, score, reason, description, command} (package is the npm package that owns the result), plus import (components, hooks), title, parent (the command that opens the level above), and, for a hit on one section, section (docs), or displayName and kind (templates).',
|
|
147
|
+
'The echoed query, `matchCount` (total matches, before `limit`), and results, a ranked SearchResultEntry[] bounded by `limit`: each {domain, name, package, score, reason, description, command} (package is the npm package that owns the result), plus import (components, hooks), title, parent (the command that opens the level above), and, for a hit on one section, section (docs), or displayName and kind (templates). When a search with no `type` could not obtain @astryxdesign/core, `meta.partial` is {skipped, reason}: the domains it skipped (component, hook, template) and why.',
|
|
143
148
|
},
|
|
144
149
|
|
|
145
150
|
// build
|
|
@@ -169,12 +174,13 @@ export const doc = {
|
|
|
169
174
|
// gap reports
|
|
170
175
|
{
|
|
171
176
|
value: 'gap-report.categories',
|
|
172
|
-
description:
|
|
177
|
+
description:
|
|
178
|
+
'The fixed gap category values and human-readable labels; when a loaded integration names its own issues URL, meta.destinations lists every destination ({to, default, issuesUrl}) and meta.ask tells an agent to ask the person.',
|
|
173
179
|
},
|
|
174
180
|
{
|
|
175
181
|
value: 'gap-report.file',
|
|
176
182
|
description:
|
|
177
|
-
'An aggregate receipt: overall status, the selected package, issuesUrl (or null), deliveries in handler order, each {handlerType: project | integration | fallback, handler, audience, status, url, message}, and filedCount/routedOnlyCount totals.',
|
|
183
|
+
'An aggregate receipt: overall status, the selected package, issuesUrl (or null), deliveries in handler order, each {handlerType: project | integration | fallback, handler, audience, status, url, message}, and filedCount/routedOnlyCount totals; without --to, when a loaded integration names its own issues URL, destinations and ask as on gap-report.categories.',
|
|
178
184
|
},
|
|
179
185
|
|
|
180
186
|
// template
|
|
@@ -283,19 +289,19 @@ export const doc = {
|
|
|
283
289
|
{
|
|
284
290
|
value: 'upgrade.status',
|
|
285
291
|
description:
|
|
286
|
-
'A short-circuit outcome with no codemods run (up_to_date, no_codemods, or config_fixable), each carrying the agent-docs summary.',
|
|
292
|
+
'A short-circuit outcome with no codemods run (up_to_date, no_codemods, or config_fixable), each carrying the agent-docs summary. no_codemods and config_fixable carry cliBehindCore ({cliVersion, command}) when the installed Core is newer than the CLI, which then has no codemods for the releases after its own version.',
|
|
287
293
|
},
|
|
288
294
|
{
|
|
289
295
|
value: 'upgrade.run',
|
|
290
296
|
description:
|
|
291
|
-
'The run receipt: from/to versions, codemod count, integrations processed, the agent-docs summary, sourcePathFound (false when the resolved source directory does not exist, so no source file was read), and (apply mode) filesChanged, transformsApplied, and per-codemod errors.',
|
|
297
|
+
'The run receipt: from/to versions, codemod count, integrations processed, the agent-docs summary, sourcePathFound (false when the resolved source directory does not exist, so no source file was read), and (apply mode) filesChanged, transformsApplied, and per-codemod errors. When the installed Core is newer than the CLI, it also carries cliBehindCore ({cliVersion, command}): codemods for the releases after cliVersion did not run.',
|
|
292
298
|
},
|
|
293
299
|
|
|
294
300
|
// manifest
|
|
295
301
|
{
|
|
296
302
|
value: 'manifest',
|
|
297
303
|
description:
|
|
298
|
-
|
|
304
|
+
"The CLI capability manifest: name, version, apiVersion, description, globalOptions, commands (each name, description, arguments, options, json, aliases?, responseTypes?, examples?, exitCodes? as [{code, when}], outsideProject? (same, refuse, or own; absent on a group), subcommands?), jsonSupported, globalMode ({docs, summary}: what a run may do beyond its command, such as the hand-off to the project's own CLI, the daily update check, and the agent skill file, and the docs topic that explains it), and the flat responseTypes index.",
|
|
299
305
|
},
|
|
300
306
|
|
|
301
307
|
// help and version, which no single command owns
|
|
@@ -327,12 +333,12 @@ export const doc = {
|
|
|
327
333
|
{
|
|
328
334
|
value: 'integration.pack-check',
|
|
329
335
|
description:
|
|
330
|
-
'The packed-package check: name, version, packable, tarball {filename, fileCount, size, unpackedSize} or null, inventory {manifest, roots [{kind, path, expectedFiles, missingFiles, complete}], expectedFiles, packedFiles}, contributions {local, packed}, each null or {themes [{slug, exportName}], components, templates [{id, type, name}], codemods [{version, id}], docs, agentDocsAppend}, and issues [{code, severity, message}].',
|
|
336
|
+
'The packed-package check: name, version, packable, tarball {filename, fileCount, size, unpackedSize} or null, inventory {manifest, roots [{kind, path, expectedFiles, missingFiles, complete}], expectedFiles, packedFiles}, contributions {local, packed}, each null or {themes [{slug, exportName}], components, templates [{id, type, name}], codemods [{version, id}], docs, agentDocsAppend}, and issues [{code, severity, message, fix?, file?, line?}] (the issues validation finds in the source and, prefixed packed_, in the packed tree, with the fix and the place when the check knows them).',
|
|
331
337
|
},
|
|
332
338
|
{
|
|
333
339
|
value: 'integration.validate',
|
|
334
340
|
description:
|
|
335
|
-
'The validation result: validated (false when nothing was validated: with no package.json the issues list carries one no_package error so the command exits 1, and with a package.json but no integration manifest the issues list is empty and proves nothing), the package name and version (both null when validated is false) plus issues, an AstryxIntegrationIssue[] of {code, severity: warning | error, message}.',
|
|
341
|
+
'The validation result: validated (false when nothing was validated: with no package.json the issues list carries one no_package error so the command exits 1, and with a package.json but no integration manifest the issues list is empty and proves nothing), the package name and version (both null when validated is false) plus issues, an AstryxIntegrationIssue[] of {code, severity: warning | error, message, fix?, file?, line?} (fix: the change that resolves it; file and line: where, relative to the package), and notes when there are any: {code, message} information that fails nothing, such as invalid_cli_command for a malformed cliCommand and cli_peer_version when the running CLI is outside the @astryxdesign/cli peer range of the package, and the package layout findings added after the last minor release, each with its fix in the message (duplicate_component_doc, symlinked_root, unreadable_file, invalid_package_json, no_provider_id, source_without_component_doc where a doc and its source still pair), and doc_name_mismatch and unknown_block_component, until they become warnings in the next minor release. A runner_command note lists each Astryx command a topic writes with a package runner (its file, line and the bare command to write). When the manifest loads, docTypes checks each doc against its published authoring type: status (checked | skipped), reason, typescript, docs, findings (all warnings, each naming the field and a fix), unchecked, and fixtures (test fixture docs not checked). When the manifest loads, docNames lists the component doc names it could not judge: status (checked), findings (always empty; a doc name the module its import names provably does not export is a doc_name_mismatch note, with its fix in the message) and unchecked ({file, name, reason}: a doc whose name differs from the name it is listed under and whose source exports cannot all be read, such as a re-export from another package). When the manifest loads, blockComponents lists the component names templates give in exampleFor or componentsUsed that could not be judged: status (checked), findings (always empty; a name neither the package nor Core has, and the template does not import, is an unknown_block_component note, with its fix in the message) and unchecked ({file, name, reason}: a name the template may reach through anything other than named imports and re-exports from Core, React, StyleX, local helpers or the entry of the package itself, such as an import from another package, a default or namespace import, an alias of or member read off an imported binding, require() or a dynamic import(), or a local module that cannot be read, or any name Core would have to resolve when Core is not installed). Since 0.7.3 each import apps cannot use is also a note (its fix in the message), listed only and failing --strict from the next minor. publicImports ({status: checked, findings: [], unchecked}) lists each import the check could not judge as {file, specifier, reason}; never counted or failed on.',
|
|
336
342
|
},
|
|
337
343
|
{
|
|
338
344
|
value: 'integration.template-conflicts',
|
|
@@ -342,12 +348,17 @@ export const doc = {
|
|
|
342
348
|
{
|
|
343
349
|
value: 'integration.component-conflicts',
|
|
344
350
|
description:
|
|
345
|
-
'validated (false when no integration manifest was found, so nothing was inspected), the integration identity, structural issues, and non-blocking conflicts where an integration component name is also owned by Core; each conflict includes the exact package-qualified command.',
|
|
351
|
+
'validated (false when no integration manifest was found, so nothing was inspected), the integration identity, structural issues, and non-blocking conflicts where an integration component name is also owned by Core; each conflict includes the exact package-qualified command. When the manifest loads and declares a components root, propDrift compares documented props with the TypeScript props: status (checked | skipped), reason, typescript, components, typesCompared, typesSkipped, findings (all warnings; a default_mismatch carries docDefault, codeDefault, and a fix), unchecked, typesNotCompared, and propsNotChecked.',
|
|
346
352
|
},
|
|
347
353
|
{
|
|
348
354
|
value: 'integration.doc-conflicts',
|
|
349
355
|
description:
|
|
350
|
-
'validated (false when no integration manifest was found, so nothing was inspected), the integration identity, structural issues, and Core doc overlaps. Each finding includes `severity` (`info` | `error`) and `relationship` (`replaces` | `extends` | `accidental`).',
|
|
356
|
+
'validated (false when no integration manifest was found, so nothing was inspected), the integration identity, structural issues, and Core doc overlaps. Each finding includes `severity` (`info` | `error`) and `relationship` (`replaces` | `extends` | `accidental`). copiedPassages lists each pair of topics that repeat 10 or more words of prose word for word: topic, section, otherTopic, otherOwner (package | core), words, passages, owner (the topic that should keep the text), text (the passage as the topic writes it), line (where the copy starts in the topic to change, or null), and message (the exact replacement); each is also a copied_passage warning in issues. fluff lists padding phrases and low-density topics: topic, kind (phrase | density), phrase, section, file (relative to the package root), line, density, and message (what to cut or write instead); each is also a doc_fluff warning in issues. strayPointers lists each code span that is exactly `astryx docs <name>` for a doc that exists, in the prose, description or summary of a topic or the text fields of a component doc: topic (the topic or component doc), kind (topic | component), section, field (the field outside any section, such as description or usage.bestPractices[0].description, else null), file (relative to the package root), line, pointer (the written command), link (the {@link} that replaces it), and message; each is also a stray_doc_pointer warning in issues.',
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
value: 'integration.check',
|
|
360
|
+
description:
|
|
361
|
+
'Every source check of an integration package in one result: validated (false when no integration manifest was found, so nothing was checked), the package name and version, strict, and checks, one entry per check (validate, components, templates, docs), each with check, errors, warnings, skipped, failed, and response, the envelope that check returns on its own. The totals are errors, warnings, and skipped; unchecked counts what the checks could not compare. With --strict, failures lists each warning and each piece of skipped work again as an error, in the issue format the checks use; it is empty without --strict. failed decides the exit code.',
|
|
351
362
|
},
|
|
352
363
|
],
|
|
353
364
|
};
|
|
@@ -12,6 +12,7 @@ import * as path from 'node:path';
|
|
|
12
12
|
import {describe, it, expect} from 'vitest';
|
|
13
13
|
import {doc} from './response-types.doc.mjs';
|
|
14
14
|
import {runCli} from '../../test-utils/run-cli.mjs';
|
|
15
|
+
import {linkThisCliAsProjectCli} from '../../test-utils/release-fixtures.mjs';
|
|
15
16
|
|
|
16
17
|
/** @param {string} type */
|
|
17
18
|
const describedAs = type =>
|
|
@@ -112,6 +113,51 @@ describe('response-types EnumDoc names every field', () => {
|
|
|
112
113
|
);
|
|
113
114
|
});
|
|
114
115
|
|
|
116
|
+
it('search, including meta.partial when Core cannot be obtained', async () => {
|
|
117
|
+
const empty = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-rt-partial-'));
|
|
118
|
+
// The project's own CLI answers and no Core is installed: an open search
|
|
119
|
+
// answers from docs and themes and says what it skipped.
|
|
120
|
+
linkThisCliAsProjectCli(empty);
|
|
121
|
+
try {
|
|
122
|
+
const res = await data(['search', 'button'], empty);
|
|
123
|
+
expect(res.meta.partial).toBeDefined();
|
|
124
|
+
expectNamed('search', ['meta', 'partial', ...fieldsOf(res.meta.partial)]);
|
|
125
|
+
for (const domain of res.meta.partial.skipped) {
|
|
126
|
+
expectNamed('search', [domain]);
|
|
127
|
+
}
|
|
128
|
+
} finally {
|
|
129
|
+
fs.rmSync(empty, {recursive: true, force: true});
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('init.user: every row field, action, and kept reason the receipt type declares', () => {
|
|
134
|
+
const types = fs.readFileSync(
|
|
135
|
+
new URL('../../api/init/init.type.mjs', import.meta.url),
|
|
136
|
+
'utf8',
|
|
137
|
+
);
|
|
138
|
+
/** The quoted members of the union a typedef or property declares. */
|
|
139
|
+
const union = (/** @type {RegExp} */ re) =>
|
|
140
|
+
[...(types.match(re)?.[1] ?? '').matchAll(/'([^']+)'/gu)].map(m => m[1]);
|
|
141
|
+
const actions = union(/@typedef \{([^}]*)\} InitUserAction/u);
|
|
142
|
+
const reasons = union(/@property \{([^}]*)\} \[reason\]/u);
|
|
143
|
+
expect(actions).toContain('linked');
|
|
144
|
+
expect(reasons.length).toBeGreaterThan(0);
|
|
145
|
+
const rowFields = [
|
|
146
|
+
...types
|
|
147
|
+
.split('@typedef {object} InitUserFile')[1]
|
|
148
|
+
.split('*/')[0]
|
|
149
|
+
.matchAll(/@property \{[^}]*\} \[?(\w+)/gu),
|
|
150
|
+
].map(m => m[1]);
|
|
151
|
+
expectNamed('init.user', [
|
|
152
|
+
'files',
|
|
153
|
+
'command',
|
|
154
|
+
'warnings',
|
|
155
|
+
...rowFields,
|
|
156
|
+
...actions,
|
|
157
|
+
...reasons,
|
|
158
|
+
]);
|
|
159
|
+
});
|
|
160
|
+
|
|
115
161
|
it('build.kit, including the hint a thin kit carries', async () => {
|
|
116
162
|
const res = await data(['build', 'zzqx-nothing-matches']);
|
|
117
163
|
expect(res.type).toBe('build.kit');
|
|
@@ -21,11 +21,11 @@ export const doc = {
|
|
|
21
21
|
fields: [
|
|
22
22
|
{
|
|
23
23
|
name: 'Success envelope',
|
|
24
|
-
type: '{ apiVersion: number; type: string; package?: string; data: unknown; meta?: Record<string, unknown> }',
|
|
24
|
+
type: '{ apiVersion: number; type: string; package?: string; data: unknown; meta?: { answeredBy?: { cli: string; core: string | null; copy: "project" | "starting" | "matched" | "carried" | "fallback" } } & Record<string, unknown> }',
|
|
25
25
|
description:
|
|
26
26
|
'Emitted for every successful command in --json mode: a type ' +
|
|
27
27
|
'discriminator, the package that owns what the response is about, ' +
|
|
28
|
-
'its data payload, and an optional meta
|
|
28
|
+
'its data payload, and an optional meta object beside data.',
|
|
29
29
|
fields: [
|
|
30
30
|
{
|
|
31
31
|
name: 'apiVersion',
|
|
@@ -65,7 +65,7 @@ export const doc = {
|
|
|
65
65
|
name: 'meta',
|
|
66
66
|
type: 'Record<string, unknown>',
|
|
67
67
|
description:
|
|
68
|
-
|
|
68
|
+
"Optional, emitted as a sibling of data (never merged in). `answeredBy` is on every successful result of a release that has it: `{cli, core, copy}`, the answering CLI version, the Core it pairs with (or null), and which copy answered: `project` (the project's own CLI), `starting` (the copy that started the run, in a project with no CLI of its own), `matched` (the release equal to the project's Core, when the project's own CLI cannot start), `carried` (outside a project), or `fallback` (the matched release could not be obtained, so the starting copy answered). A `deprecations` field is an array of `{id, replacements}` entries; each stable lifecycle id names the replacement commands without changing the command data. Other fields may be added (spec:AST-017 FR13).",
|
|
69
69
|
},
|
|
70
70
|
],
|
|
71
71
|
},
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in foundation/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @file The small routing helper the commands that pick among candidates
|
|
6
|
+
* share (build, search): two node kinds and the runner that walks them.
|
|
7
|
+
*
|
|
8
|
+
* A searcher answers a request in its command's own result shape, or returns
|
|
9
|
+
* null to pass. A dispatcher scores nothing: it names the children that should
|
|
10
|
+
* answer, best first, with a confidence from 0 to 1. Below its floor, or when
|
|
11
|
+
* none of the children it named answers, its fallback searcher answers. A
|
|
12
|
+
* dispatcher's children may be dispatchers, so trees nest. A classifier is a
|
|
13
|
+
* dispatcher whose route is a static word-weight classifier: the request's
|
|
14
|
+
* tokens vote for a class, and a class with a searcher takes the request when
|
|
15
|
+
* the classifier is sure enough.
|
|
16
|
+
*
|
|
17
|
+
* A tree file types the helpers for its command once, by taking them from
|
|
18
|
+
* `routeKit` typed as `RouteKit<Request, Context, Answer>` (see
|
|
19
|
+
* api/search/tree.mjs); each node is then plain `{id, summary, run}`.
|
|
20
|
+
*
|
|
21
|
+
* Every node gets the same context, so any node can be run, measured, and
|
|
22
|
+
* tuned on its own: `runTree` takes an optional `tuning` with weights that
|
|
23
|
+
* replace a node's shipped weights for one call, and a trace callback that
|
|
24
|
+
* sees every step. Neither ever reaches a command's output.
|
|
25
|
+
*
|
|
26
|
+
* @input a tree of nodes, a request, and the context the command's adapter
|
|
27
|
+
* gathered
|
|
28
|
+
* @output the first answer a searcher gives
|
|
29
|
+
* @position foundation; api/build and api/search build their trees with it
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* @template Request, Context, Answer
|
|
33
|
+
* @typedef {object} Searcher
|
|
34
|
+
* @property {'searcher'} kind
|
|
35
|
+
* @property {string} id
|
|
36
|
+
* @property {string} summary One plain line: what it answers.
|
|
37
|
+
* @property {(request: Request, ctx: Context, weights: unknown) => Answer | null | Promise<Answer | null>} run
|
|
38
|
+
* `weights` is a tuning override for this node, or null for its shipped weights.
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* @typedef {object} Route
|
|
42
|
+
* @property {readonly string[]} ids The children to try, best first.
|
|
43
|
+
* @property {number} confidence From 0 to 1.
|
|
44
|
+
*/
|
|
45
|
+
/**
|
|
46
|
+
* @template Request, Context
|
|
47
|
+
* @typedef {object} Dispatcher
|
|
48
|
+
* @property {'dispatcher'} kind
|
|
49
|
+
* @property {string} id
|
|
50
|
+
* @property {string} summary
|
|
51
|
+
* @property {readonly string[]} children
|
|
52
|
+
* @property {number} floor Below this confidence the fallback answers.
|
|
53
|
+
* @property {string} fallback A searcher's id.
|
|
54
|
+
* @property {(request: Request, ctx: Context, weights: unknown) => Route | Promise<Route>} route
|
|
55
|
+
*/
|
|
56
|
+
/**
|
|
57
|
+
* @template Request, Context, Answer
|
|
58
|
+
* @typedef {Searcher<Request, Context, Answer> | Dispatcher<Request, Context>} TreeNode
|
|
59
|
+
*/
|
|
60
|
+
/**
|
|
61
|
+
* @template Request, Context, Answer
|
|
62
|
+
* @typedef {object} Tree
|
|
63
|
+
* @property {string} root
|
|
64
|
+
* @property {ReadonlyMap<string, TreeNode<Request, Context, Answer>>} nodes
|
|
65
|
+
*/
|
|
66
|
+
/**
|
|
67
|
+
* One step the runner took.
|
|
68
|
+
* @typedef {object} TraceStep
|
|
69
|
+
* @property {string} id
|
|
70
|
+
* @property {'searcher' | 'dispatcher'} kind
|
|
71
|
+
* @property {number} depth
|
|
72
|
+
* @property {boolean} fallback Whether this step ran as a fallback.
|
|
73
|
+
* @property {Route} [route] A dispatcher's route.
|
|
74
|
+
* @property {boolean} [answered] Whether a searcher answered.
|
|
75
|
+
*/
|
|
76
|
+
/**
|
|
77
|
+
* @typedef {object} Tuning
|
|
78
|
+
* @property {Readonly<Record<string, unknown>>} [weights] Weights by node id, replacing that node's shipped weights for this call.
|
|
79
|
+
* @property {(step: TraceStep) => void} [onTrace]
|
|
80
|
+
*/
|
|
81
|
+
/**
|
|
82
|
+
* Static classifier weights: one row of numbers per token, one number per
|
|
83
|
+
* class. A request's score for a class is the sum of its tokens' numbers.
|
|
84
|
+
* @typedef {object} ClassifierWeights
|
|
85
|
+
* @property {readonly string[]} classes
|
|
86
|
+
* @property {Readonly<Record<string, readonly number[]>>} tokens
|
|
87
|
+
*/
|
|
88
|
+
/**
|
|
89
|
+
* @template Request, Context
|
|
90
|
+
* @typedef {object} ClassifierSpec
|
|
91
|
+
* @property {string} id
|
|
92
|
+
* @property {string} summary
|
|
93
|
+
* @property {Readonly<Record<string, string>>} searchers Class name -> the
|
|
94
|
+
* searcher that answers it. A class with no searcher goes to the fallback.
|
|
95
|
+
* @property {string} fallback The searcher that keeps every other request.
|
|
96
|
+
* @property {number} floor A searcher takes a request only when its class's
|
|
97
|
+
* probability is at least this.
|
|
98
|
+
* @property {(request: Request, ctx: Context) => readonly string[]} features
|
|
99
|
+
* The request's tokens.
|
|
100
|
+
* @property {(ctx: Context) => ClassifierWeights} weights The shipped weights,
|
|
101
|
+
* which the command's adapter put in the context.
|
|
102
|
+
*/
|
|
103
|
+
/**
|
|
104
|
+
* The helpers, typed for one command's request, context, and answer.
|
|
105
|
+
* @template Request, Context, Answer
|
|
106
|
+
* @typedef {object} RouteKit
|
|
107
|
+
* @property {(node: Omit<Searcher<Request, Context, Answer>, 'kind'>) => Searcher<Request, Context, Answer>} defineSearcher
|
|
108
|
+
* @property {(node: Omit<Dispatcher<Request, Context>, 'kind'>) => Dispatcher<Request, Context>} defineDispatcher
|
|
109
|
+
* @property {(spec: ClassifierSpec<Request, Context>) => Dispatcher<Request, Context>} defineClassifier
|
|
110
|
+
* @property {(root: string, nodes: readonly TreeNode<Request, Context, Answer>[]) => Tree<Request, Context, Answer>} defineTree
|
|
111
|
+
*/
|
|
112
|
+
/**
|
|
113
|
+
* The probability of each class for these tokens: a softmax over the summed
|
|
114
|
+
* rows of the tokens the weights know.
|
|
115
|
+
* @param {ClassifierWeights} weights
|
|
116
|
+
* @param {readonly string[]} tokens
|
|
117
|
+
* @returns {number[]}
|
|
118
|
+
*/
|
|
119
|
+
export function classify(weights: ClassifierWeights, tokens: readonly string[]): number[];
|
|
120
|
+
/**
|
|
121
|
+
* A dispatcher whose route is a static classifier. The most probable class
|
|
122
|
+
* (the first on a tie) is handed to its searcher; a class with no searcher,
|
|
123
|
+
* or the fallback's own class, stays with the fallback. Tuning weights for
|
|
124
|
+
* this node replace its shipped weights.
|
|
125
|
+
* @template Request, Context
|
|
126
|
+
* @param {ClassifierSpec<Request, Context>} spec
|
|
127
|
+
* @returns {Dispatcher<Request, Context>}
|
|
128
|
+
*/
|
|
129
|
+
export function defineClassifier<Request, Context>(spec: ClassifierSpec<Request, Context>): Dispatcher<Request, Context>;
|
|
130
|
+
/**
|
|
131
|
+
* @template Request, Context, Answer
|
|
132
|
+
* @param {Omit<Searcher<Request, Context, Answer>, 'kind'>} node
|
|
133
|
+
* @returns {Searcher<Request, Context, Answer>}
|
|
134
|
+
*/
|
|
135
|
+
export function defineSearcher<Request, Context, Answer>(node: Omit<Searcher<Request, Context, Answer>, "kind">): Searcher<Request, Context, Answer>;
|
|
136
|
+
/**
|
|
137
|
+
* @template Request, Context
|
|
138
|
+
* @param {Omit<Dispatcher<Request, Context>, 'kind'>} node
|
|
139
|
+
* @returns {Dispatcher<Request, Context>}
|
|
140
|
+
*/
|
|
141
|
+
export function defineDispatcher<Request, Context>(node: Omit<Dispatcher<Request, Context>, "kind">): Dispatcher<Request, Context>;
|
|
142
|
+
/**
|
|
143
|
+
* A tree from its nodes. Throws on a duplicate id, a missing root, child, or
|
|
144
|
+
* fallback, a fallback that is not a searcher, or a dispatcher cycle.
|
|
145
|
+
* @template Request, Context, Answer
|
|
146
|
+
* @param {string} root
|
|
147
|
+
* @param {readonly TreeNode<Request, Context, Answer>[]} list
|
|
148
|
+
* @returns {Tree<Request, Context, Answer>}
|
|
149
|
+
*/
|
|
150
|
+
export function defineTree<Request, Context, Answer>(root: string, list: readonly TreeNode<Request, Context, Answer>[]): Tree<Request, Context, Answer>;
|
|
151
|
+
/**
|
|
152
|
+
* Runs the tree from its root, or from `start` to run one node alone: a
|
|
153
|
+
* dispatcher below its floor runs its fallback; otherwise the children it
|
|
154
|
+
* names run in order and the first answer wins; when none answers, the
|
|
155
|
+
* fallback runs.
|
|
156
|
+
* @template Request, Context, Answer
|
|
157
|
+
* @param {Tree<Request, Context, Answer>} tree
|
|
158
|
+
* @param {Request} request
|
|
159
|
+
* @param {Context} ctx
|
|
160
|
+
* @param {{tuning?: Tuning, start?: string}} [options]
|
|
161
|
+
* @returns {Promise<Answer | null>}
|
|
162
|
+
*/
|
|
163
|
+
export function runTree<Request, Context, Answer>(tree: Tree<Request, Context, Answer>, request: Request, ctx: Context, options?: {
|
|
164
|
+
tuning?: Tuning;
|
|
165
|
+
start?: string;
|
|
166
|
+
}): Promise<Answer | null>;
|
|
167
|
+
/**
|
|
168
|
+
* The helpers in one object, for a tree file to type once (see the file
|
|
169
|
+
* comment).
|
|
170
|
+
* @type {RouteKit<any, any, any>}
|
|
171
|
+
*/
|
|
172
|
+
export const routeKit: RouteKit<any, any, any>;
|
|
173
|
+
export type Searcher<Request, Context, Answer> = {
|
|
174
|
+
kind: "searcher";
|
|
175
|
+
id: string;
|
|
176
|
+
/**
|
|
177
|
+
* One plain line: what it answers.
|
|
178
|
+
*/
|
|
179
|
+
summary: string;
|
|
180
|
+
/**
|
|
181
|
+
* `weights` is a tuning override for this node, or null for its shipped weights.
|
|
182
|
+
*/
|
|
183
|
+
run: (request: Request, ctx: Context, weights: unknown) => Answer | null | Promise<Answer | null>;
|
|
184
|
+
};
|
|
185
|
+
export type Route = {
|
|
186
|
+
/**
|
|
187
|
+
* The children to try, best first.
|
|
188
|
+
*/
|
|
189
|
+
ids: readonly string[];
|
|
190
|
+
/**
|
|
191
|
+
* From 0 to 1.
|
|
192
|
+
*/
|
|
193
|
+
confidence: number;
|
|
194
|
+
};
|
|
195
|
+
export type Dispatcher<Request, Context> = {
|
|
196
|
+
kind: "dispatcher";
|
|
197
|
+
id: string;
|
|
198
|
+
summary: string;
|
|
199
|
+
children: readonly string[];
|
|
200
|
+
/**
|
|
201
|
+
* Below this confidence the fallback answers.
|
|
202
|
+
*/
|
|
203
|
+
floor: number;
|
|
204
|
+
/**
|
|
205
|
+
* A searcher's id.
|
|
206
|
+
*/
|
|
207
|
+
fallback: string;
|
|
208
|
+
route: (request: Request, ctx: Context, weights: unknown) => Route | Promise<Route>;
|
|
209
|
+
};
|
|
210
|
+
export type TreeNode<Request, Context, Answer> = Searcher<Request, Context, Answer> | Dispatcher<Request, Context>;
|
|
211
|
+
export type Tree<Request, Context, Answer> = {
|
|
212
|
+
root: string;
|
|
213
|
+
nodes: ReadonlyMap<string, TreeNode<Request, Context, Answer>>;
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* One step the runner took.
|
|
217
|
+
*/
|
|
218
|
+
export type TraceStep = {
|
|
219
|
+
id: string;
|
|
220
|
+
kind: "searcher" | "dispatcher";
|
|
221
|
+
depth: number;
|
|
222
|
+
/**
|
|
223
|
+
* Whether this step ran as a fallback.
|
|
224
|
+
*/
|
|
225
|
+
fallback: boolean;
|
|
226
|
+
/**
|
|
227
|
+
* A dispatcher's route.
|
|
228
|
+
*/
|
|
229
|
+
route?: Route | undefined;
|
|
230
|
+
/**
|
|
231
|
+
* Whether a searcher answered.
|
|
232
|
+
*/
|
|
233
|
+
answered?: boolean | undefined;
|
|
234
|
+
};
|
|
235
|
+
export type Tuning = {
|
|
236
|
+
/**
|
|
237
|
+
* Weights by node id, replacing that node's shipped weights for this call.
|
|
238
|
+
*/
|
|
239
|
+
weights?: Readonly<Record<string, unknown>> | undefined;
|
|
240
|
+
onTrace?: ((step: TraceStep) => void) | undefined;
|
|
241
|
+
};
|
|
242
|
+
/**
|
|
243
|
+
* Static classifier weights: one row of numbers per token, one number per
|
|
244
|
+
* class. A request's score for a class is the sum of its tokens' numbers.
|
|
245
|
+
*/
|
|
246
|
+
export type ClassifierWeights = {
|
|
247
|
+
classes: readonly string[];
|
|
248
|
+
tokens: Readonly<Record<string, readonly number[]>>;
|
|
249
|
+
};
|
|
250
|
+
export type ClassifierSpec<Request, Context> = {
|
|
251
|
+
id: string;
|
|
252
|
+
summary: string;
|
|
253
|
+
/**
|
|
254
|
+
* Class name -> the
|
|
255
|
+
* searcher that answers it. A class with no searcher goes to the fallback.
|
|
256
|
+
*/
|
|
257
|
+
searchers: Readonly<Record<string, string>>;
|
|
258
|
+
/**
|
|
259
|
+
* The searcher that keeps every other request.
|
|
260
|
+
*/
|
|
261
|
+
fallback: string;
|
|
262
|
+
/**
|
|
263
|
+
* A searcher takes a request only when its class's
|
|
264
|
+
* probability is at least this.
|
|
265
|
+
*/
|
|
266
|
+
floor: number;
|
|
267
|
+
/**
|
|
268
|
+
* The request's tokens.
|
|
269
|
+
*/
|
|
270
|
+
features: (request: Request, ctx: Context) => readonly string[];
|
|
271
|
+
/**
|
|
272
|
+
* The shipped weights,
|
|
273
|
+
* which the command's adapter put in the context.
|
|
274
|
+
*/
|
|
275
|
+
weights: (ctx: Context) => ClassifierWeights;
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* The helpers, typed for one command's request, context, and answer.
|
|
279
|
+
*/
|
|
280
|
+
export type RouteKit<Request, Context, Answer> = {
|
|
281
|
+
defineSearcher: (node: Omit<Searcher<Request, Context, Answer>, "kind">) => Searcher<Request, Context, Answer>;
|
|
282
|
+
defineDispatcher: (node: Omit<Dispatcher<Request, Context>, "kind">) => Dispatcher<Request, Context>;
|
|
283
|
+
defineClassifier: (spec: ClassifierSpec<Request, Context>) => Dispatcher<Request, Context>;
|
|
284
|
+
defineTree: (root: string, nodes: readonly TreeNode<Request, Context, Answer>[]) => Tree<Request, Context, Answer>;
|
|
285
|
+
};
|