@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/api/build/build.doc.mjs
CHANGED
|
@@ -76,6 +76,10 @@ export const doc = {
|
|
|
76
76
|
code: 'ERR_CORE_NOT_FOUND',
|
|
77
77
|
when: 'a query is given and @astryxdesign/core cannot be found from cwd',
|
|
78
78
|
},
|
|
79
|
+
{
|
|
80
|
+
code: 'ERR_VERSIONS_UNAVAILABLE',
|
|
81
|
+
when: 'a query is given outside a project, or in a project with nothing installed, and the Core of the release that answers is not beside it or cached, and cannot be installed into the per-user cache (offline, a registry without it, or an unwritable cache)',
|
|
82
|
+
},
|
|
79
83
|
],
|
|
80
84
|
examples: [
|
|
81
85
|
{label: 'Get the playbook', code: 'const r = await build();'},
|
package/api/build/build.mjs
CHANGED
|
@@ -4,20 +4,27 @@
|
|
|
4
4
|
* @file build API — dispatcher + barrel for the "assemble a page" assistant.
|
|
5
5
|
*
|
|
6
6
|
* `build()` with no query signals the workflow playbook (`build.help`). With a
|
|
7
|
-
* query it runs
|
|
8
|
-
* KIT (`build.kit`). Each shape is projected by its own leaf; this file only
|
|
7
|
+
* query it runs build's tree (tree.mjs), whose searchers answer with a
|
|
8
|
+
* composition KIT (`build.kit`). Each shape is projected by its own leaf; this file only
|
|
9
9
|
* routes to the leaves and re-exports them, keeping the SAME `build` export so
|
|
10
10
|
* api/index.mjs and the CLI consumer stay unchanged.
|
|
11
11
|
*
|
|
12
12
|
* no query → build.help (api/build/help/help.mjs)
|
|
13
|
-
* a query → build.kit (api/build/kit/
|
|
13
|
+
* a query → build.kit (api/build/tree.mjs: kit/signals.mjs, the block
|
|
14
|
+
* picker in blocks/blocks.mjs, then kit/answer.mjs)
|
|
14
15
|
*/
|
|
15
16
|
|
|
16
17
|
import {AstryxError} from '../error.mjs';
|
|
17
18
|
import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
|
|
18
19
|
import {buildHelp} from './help/help.mjs';
|
|
19
20
|
import {buildKit} from './kit/kit.mjs';
|
|
20
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
loadBlockPicker,
|
|
23
|
+
loadTreeWeights,
|
|
24
|
+
withListingCache,
|
|
25
|
+
} from './_adapter.mjs';
|
|
26
|
+
import {runTree} from '../../foundation/route/route.mjs';
|
|
27
|
+
import {BUILD_TREE} from './tree.mjs';
|
|
21
28
|
|
|
22
29
|
// Barrel: surface the leaves alongside the dispatcher for the fractal shape.
|
|
23
30
|
export {buildHelp, buildKit};
|
|
@@ -34,7 +41,10 @@ export async function build(query, options = {}) {
|
|
|
34
41
|
if (!query || !String(query).trim()) {
|
|
35
42
|
return buildHelp();
|
|
36
43
|
}
|
|
37
|
-
if (
|
|
44
|
+
if (
|
|
45
|
+
options.limit != null &&
|
|
46
|
+
(!Number.isInteger(options.limit) || options.limit <= 0)
|
|
47
|
+
) {
|
|
38
48
|
throw new AstryxError(
|
|
39
49
|
`Invalid limit "${options.limit}". Must be a positive integer.`,
|
|
40
50
|
undefined,
|
|
@@ -43,5 +53,14 @@ export async function build(query, options = {}) {
|
|
|
43
53
|
}
|
|
44
54
|
// The kit resolves every candidate's source and docs by walking the same
|
|
45
55
|
// tree; read each directory once for this call.
|
|
46
|
-
return withListingCache(
|
|
56
|
+
return withListingCache(
|
|
57
|
+
async () =>
|
|
58
|
+
/** @type {import('./build.type.mjs').BuildKitResponse} */ (
|
|
59
|
+
await runTree(
|
|
60
|
+
BUILD_TREE,
|
|
61
|
+
{query, options},
|
|
62
|
+
{weights: loadTreeWeights(), blocks: loadBlockPicker()},
|
|
63
|
+
)
|
|
64
|
+
),
|
|
65
|
+
);
|
|
47
66
|
}
|
package/api/build/build.type.mjs
CHANGED
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
* @property {boolean} data.directMatch True when the top page template is a confident direct match.
|
|
78
78
|
* @property {BuildStart | null} data.start The page template to start from: the ranker's pick, else the app shell. Null only when the kit is narrowed to components or hooks (`type`), or when the project has no page template to offer.
|
|
79
79
|
* @property {import('../search/search.type.mjs').SearchResultEntry[]} data.pages Closest page templates by search (≤3). Each entry's `command` carries `--skeleton` when `directMatch` is false, so it previews the layout; `start.command` is the scaffold.
|
|
80
|
-
* @property {import('../search/search.type.mjs').SearchResultEntry[]} data.blocks Drop-in block patterns covering parts of the idea (≤5).
|
|
80
|
+
* @property {import('../search/search.type.mjs').SearchResultEntry[]} data.blocks Drop-in block patterns covering parts of the idea (≤5), best first. A block search returned keeps search's score and reason; any other block carries the block picker's relative score (100 for its best candidate, never below 1) and reason, so the two kinds of score are not comparable.
|
|
81
81
|
* @property {import('../search/search.type.mjs').SearchResultEntry[]} data.domain Idea-specific components/hooks (≤6), excluding frame/foundation.
|
|
82
82
|
* @property {string[]} data.frame Always-on page-shell component names. Every page template already uses them.
|
|
83
83
|
* @property {string[]} data.foundation Always-on layout/typography/action component names. Every page template already uses them.
|
package/api/build/help/help.mjs
CHANGED
|
@@ -63,7 +63,7 @@ export function buildHelp() {
|
|
|
63
63
|
"Keep the template's page frame, gap, and padding values. Replace its data, copy, and sections.",
|
|
64
64
|
'No <div>/raw HTML for layout — use VStack/HStack/Grid/Stack/Card etc.',
|
|
65
65
|
'No style={{}} — use component props, and design tokens for values.',
|
|
66
|
-
"Wrap the app in <Theme theme={...}> (import {Theme} from '@astryxdesign/core') and import core reset.css + astryx.css.",
|
|
66
|
+
"Wrap the app in <Theme theme={...}> (import {Theme} from '@astryxdesign/core/theme') and import core reset.css + astryx.css.",
|
|
67
67
|
],
|
|
68
68
|
related: [
|
|
69
69
|
{
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The kit for a request. `blocks` names the blocks to list, best first: a
|
|
6
|
+
* block build names itself keeps build's entry, another keeps search's own
|
|
7
|
+
* entry (its real score and reason), a name search did not return is
|
|
8
|
+
* dropped, and the kit never lists more blocks than build's own. Blocks of
|
|
9
|
+
* the same name from two packages are both kept.
|
|
10
|
+
*
|
|
11
|
+
* @param {import('./signals.mjs').KitSignals} signals
|
|
12
|
+
* @param {string[]} [blocks] block names; build's own when omitted
|
|
13
|
+
* @param {Map<string, import('../../search/search.type.mjs').SearchResultEntry>} [picked]
|
|
14
|
+
* the block picker's own entry (its real score and reason) for each named
|
|
15
|
+
* block search did not return
|
|
16
|
+
* @returns {import('../build.type.mjs').BuildKitResponse}
|
|
17
|
+
*/
|
|
18
|
+
export function kitAnswer(signals: import("./signals.mjs").KitSignals, blocks?: string[], picked?: Map<string, import("../../search/search.type.mjs").SearchResultEntry>): import("../build.type.mjs").BuildKitResponse;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file The build.kit response, from a request's signals (signals.mjs) and the
|
|
5
|
+
* blocks to name. With build's own blocks it is the kit build has always
|
|
6
|
+
* given; another list changes only the blocks, never their count.
|
|
7
|
+
* @input {@link import('./signals.mjs').KitSignals} and block names
|
|
8
|
+
* @output the build.kit response
|
|
9
|
+
* @position api/build/kit, beside signals.mjs; the main searcher in tree.mjs
|
|
10
|
+
* calls it with the block picker's list.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {firstSentence} from '../../../foundation/text/string-utils.mjs';
|
|
14
|
+
import {FOUNDATION, FRAME} from './signals.mjs';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Fewer offerable results than this and the kit says how to look further.
|
|
18
|
+
*
|
|
19
|
+
* Three is the point below which a kit stops being a starting point. An agent
|
|
20
|
+
* that reads a near-empty kit does not conclude "my wording was wrong" — it
|
|
21
|
+
* concludes the package has nothing and falls back on its own memory of what
|
|
22
|
+
* Astryx contains, which is exactly the failure `build` exists to prevent.
|
|
23
|
+
*/
|
|
24
|
+
const THIN_KIT = 3;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The kit for a request. `blocks` names the blocks to list, best first: a
|
|
28
|
+
* block build names itself keeps build's entry, another keeps search's own
|
|
29
|
+
* entry (its real score and reason), a name search did not return is
|
|
30
|
+
* dropped, and the kit never lists more blocks than build's own. Blocks of
|
|
31
|
+
* the same name from two packages are both kept.
|
|
32
|
+
*
|
|
33
|
+
* @param {import('./signals.mjs').KitSignals} signals
|
|
34
|
+
* @param {string[]} [blocks] block names; build's own when omitted
|
|
35
|
+
* @param {Map<string, import('../../search/search.type.mjs').SearchResultEntry>} [picked]
|
|
36
|
+
* the block picker's own entry (its real score and reason) for each named
|
|
37
|
+
* block search did not return
|
|
38
|
+
* @returns {import('../build.type.mjs').BuildKitResponse}
|
|
39
|
+
*/
|
|
40
|
+
export function kitAnswer(
|
|
41
|
+
signals,
|
|
42
|
+
blocks = signals.kitBlocks,
|
|
43
|
+
picked = new Map(),
|
|
44
|
+
) {
|
|
45
|
+
// Entries by name, in build's order: two packages can ship a block with the
|
|
46
|
+
// same name, and each name in `blocks` takes the next entry of that name, so
|
|
47
|
+
// both stay listed.
|
|
48
|
+
/** @type {Map<string, import('../build.type.mjs').BuildKitResponse['data']['blocks']>} */
|
|
49
|
+
const own = new Map();
|
|
50
|
+
for (const b of signals.blocks)
|
|
51
|
+
own.set(b.name, [...(own.get(b.name) ?? []), b]);
|
|
52
|
+
/** @type {Set<string>} */
|
|
53
|
+
const added = new Set();
|
|
54
|
+
const named = blocks
|
|
55
|
+
.flatMap(name => {
|
|
56
|
+
const entry = own.get(name)?.shift();
|
|
57
|
+
if (entry) return [entry];
|
|
58
|
+
// A block build does not name itself keeps search's own entry, once;
|
|
59
|
+
// one search did not return keeps the picker's entry.
|
|
60
|
+
const found =
|
|
61
|
+
own.has(name) || added.has(name)
|
|
62
|
+
? undefined
|
|
63
|
+
: (signals.searchedEntries.get(name) ?? picked.get(name));
|
|
64
|
+
if (!found) return [];
|
|
65
|
+
added.add(name);
|
|
66
|
+
return [found];
|
|
67
|
+
})
|
|
68
|
+
.slice(0, signals.blocks.length);
|
|
69
|
+
|
|
70
|
+
// What to try when the kit comes back thin. Keyword search over a design
|
|
71
|
+
// system misses in a predictable way — the reader's words and the package's
|
|
72
|
+
// often do not overlap — so name the two commands that browse rather than
|
|
73
|
+
// search, and say plainly that this is not semantic matching.
|
|
74
|
+
//
|
|
75
|
+
// STRUCTURED, not prose: `commands` are bare subcommands, because the API
|
|
76
|
+
// cannot know how the caller invokes the CLI. Baking `astryx component
|
|
77
|
+
// --list` into the text hands a pnpm-workspace reader a command that does
|
|
78
|
+
// not resolve — the same defect `getCliInvocation` exists to prevent, and
|
|
79
|
+
// the renderer applies it. A JSON caller gets the parts, not a sentence.
|
|
80
|
+
const hint =
|
|
81
|
+
signals.pages.length + named.length + signals.domain.length < THIN_KIT
|
|
82
|
+
? {
|
|
83
|
+
reason:
|
|
84
|
+
'Few matches. This is keyword search, not semantic — try other wordings.',
|
|
85
|
+
commands: ['component --list', 'template --list'],
|
|
86
|
+
}
|
|
87
|
+
: undefined;
|
|
88
|
+
|
|
89
|
+
const answer = (/** @type {typeof named} */ list) => ({
|
|
90
|
+
type: /** @type {const} */ ('build.kit'),
|
|
91
|
+
data: {
|
|
92
|
+
query: signals.query,
|
|
93
|
+
// Distinguishes "search found nothing" from a weak-but-non-empty result
|
|
94
|
+
// set. Either way the kit still names a template to start from.
|
|
95
|
+
hasResults: signals.matchCount > 0,
|
|
96
|
+
matchCount: signals.matchCount,
|
|
97
|
+
directMatch: signals.directMatch,
|
|
98
|
+
start: signals.start,
|
|
99
|
+
pages: signals.pages,
|
|
100
|
+
blocks: list,
|
|
101
|
+
domain: signals.domain,
|
|
102
|
+
frame: FRAME,
|
|
103
|
+
foundation: FOUNDATION,
|
|
104
|
+
hint,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// An added block must not make the answer longer than build's own, as JSON
|
|
109
|
+
// or as text: trim the added blocks' descriptions, never which blocks are
|
|
110
|
+
// listed.
|
|
111
|
+
const fitted = fitDescriptions(named, signals.blocks, {
|
|
112
|
+
json: list => bytes(answer(list)),
|
|
113
|
+
text: textSize,
|
|
114
|
+
});
|
|
115
|
+
return answer(fitted);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** @param {unknown} value */
|
|
119
|
+
const bytes = value => Buffer.byteLength(JSON.stringify(value));
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* What the blocks add to the text answer, which prints each block's name,
|
|
123
|
+
* package, and the first sentence of its description.
|
|
124
|
+
* @param {{name: string, package?: string, description?: string}[]} list
|
|
125
|
+
*/
|
|
126
|
+
const textSize = list =>
|
|
127
|
+
list.reduce(
|
|
128
|
+
(n, b) =>
|
|
129
|
+
n +
|
|
130
|
+
Buffer.byteLength(
|
|
131
|
+
`${b.name}${b.package ?? ''}${firstSentence(b.description ?? '')}`,
|
|
132
|
+
),
|
|
133
|
+
0,
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
/** An added block keeps at least this much of its description. */
|
|
137
|
+
const MIN_DESCRIPTION = 24;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* A description cut to about `keep` characters (never fewer than
|
|
141
|
+
* {@link MIN_DESCRIPTION}) at a word boundary, with an ellipsis. Never empty:
|
|
142
|
+
* a description already that short is kept whole.
|
|
143
|
+
* @param {string} description
|
|
144
|
+
* @param {number} keep
|
|
145
|
+
*/
|
|
146
|
+
function cutTo(description, keep) {
|
|
147
|
+
const room = Math.max(keep, MIN_DESCRIPTION);
|
|
148
|
+
if (description.length <= room) return description;
|
|
149
|
+
const cut = description.slice(0, room);
|
|
150
|
+
const at = cut.lastIndexOf(' ');
|
|
151
|
+
return `${(at > 0 ? cut.slice(0, at) : cut).trimEnd()}…`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* The listed blocks with the added blocks' descriptions shortened until
|
|
156
|
+
* neither the JSON nor the text answer is longer than with build's own
|
|
157
|
+
* blocks, or every added description is as short as it may get. A
|
|
158
|
+
* description is never emptied, and build's own entries never change.
|
|
159
|
+
* @template {{name: string, package?: string, description?: string}} B
|
|
160
|
+
* @param {B[]} list
|
|
161
|
+
* @param {B[]} own build's own entries
|
|
162
|
+
* @param {{json: (list: B[]) => number, text: (list: B[]) => number}} size
|
|
163
|
+
* @returns {B[]}
|
|
164
|
+
*/
|
|
165
|
+
function fitDescriptions(list, own, size) {
|
|
166
|
+
const limit = {json: size.json(own), text: size.text(own)};
|
|
167
|
+
let out = list;
|
|
168
|
+
/** The bytes over each limit; 0 when within. */
|
|
169
|
+
const over = (/** @type {B[]} */ l) => ({
|
|
170
|
+
text: Math.max(0, size.text(l) - limit.text),
|
|
171
|
+
json: Math.max(0, size.json(l) - limit.json),
|
|
172
|
+
});
|
|
173
|
+
// The last added block first, each cut by what is still over and never
|
|
174
|
+
// below MIN_DESCRIPTION; when one is as short as it may get, the next one
|
|
175
|
+
// up is cut, and passes repeat while any cut still helps.
|
|
176
|
+
for (let changed = true; changed;) {
|
|
177
|
+
changed = false;
|
|
178
|
+
for (let k = out.length - 1; k >= 0; k--) {
|
|
179
|
+
const o = over(out);
|
|
180
|
+
if (o.text === 0 && o.json === 0) return out;
|
|
181
|
+
const b = out[k];
|
|
182
|
+
if (own.includes(b) || !b.description) continue;
|
|
183
|
+
const first = firstSentence(b.description);
|
|
184
|
+
const keep = Math.min(
|
|
185
|
+
o.text > 0 ? first.length - o.text - 1 : b.description.length,
|
|
186
|
+
o.json > 0 ? b.description.length - o.json - 1 : b.description.length,
|
|
187
|
+
);
|
|
188
|
+
const description = cutTo(b.description, keep);
|
|
189
|
+
if (description.length >= b.description.length) continue;
|
|
190
|
+
out = out.map((x, i) => (i === k ? {...x, description} : x));
|
|
191
|
+
changed = true;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect} from 'vitest';
|
|
4
|
+
import {kitAnswer} from './answer.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @param {any[]} blocks
|
|
8
|
+
* @param {any[]} [searched] blocks search returned that build did not name
|
|
9
|
+
*/
|
|
10
|
+
const signals = (blocks, searched = []) =>
|
|
11
|
+
/** @type {any} */ ({
|
|
12
|
+
query: 'q',
|
|
13
|
+
matchCount: blocks.length,
|
|
14
|
+
directMatch: false,
|
|
15
|
+
start: null,
|
|
16
|
+
pages: [],
|
|
17
|
+
blocks,
|
|
18
|
+
kitBlocks: blocks.map(b => b.name),
|
|
19
|
+
domain: [],
|
|
20
|
+
searchedEntries: new Map(searched.map(b => [b.name, b])),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe('kitAnswer', () => {
|
|
24
|
+
const a = {name: 'Hero', package: '@a/one', score: 90, reason: 'name'};
|
|
25
|
+
const b = {name: 'Hero', package: '@b/two', score: 80, reason: 'name'};
|
|
26
|
+
const c = {name: 'Footer', package: '@a/one', score: 70, reason: 'keyword'};
|
|
27
|
+
|
|
28
|
+
it('keeps blocks of the same name from two packages', () => {
|
|
29
|
+
const kit = kitAnswer(signals([a, b, c]));
|
|
30
|
+
expect(kit.data.blocks).toEqual([a, b, c]);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('keeps both when the picker re-orders them', () => {
|
|
34
|
+
const kit = kitAnswer(signals([a, b, c]), ['Footer', 'Hero', 'Hero']);
|
|
35
|
+
expect(kit.data.blocks).toEqual([c, a, b]);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('never lists a block neither build nor search gave, or more than build gave', () => {
|
|
39
|
+
const kit = kitAnswer(signals([a, c]), ['Hero', 'Hero', 'Nav', 'Footer']);
|
|
40
|
+
expect(kit.data.blocks).toEqual([a, c]);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('lists a block search returned with search’s own entry, within build’s count', () => {
|
|
44
|
+
const nav = {name: 'Nav', package: '@a/one', score: 60, reason: 'keyword'};
|
|
45
|
+
const kit = kitAnswer(signals([a, c], [nav]), [
|
|
46
|
+
'Nav',
|
|
47
|
+
'Nav',
|
|
48
|
+
'Hero',
|
|
49
|
+
'Footer',
|
|
50
|
+
]);
|
|
51
|
+
expect(kit.data.blocks).toEqual([nav, a]);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('trims an added block’s description so the answer is never longer than build’s own', () => {
|
|
55
|
+
const hero = {
|
|
56
|
+
...a,
|
|
57
|
+
description: 'A wide hero with a title and two buttons.',
|
|
58
|
+
};
|
|
59
|
+
const foot = {...c, description: 'A footer with links in three columns.'};
|
|
60
|
+
const nav = {
|
|
61
|
+
name: 'Nav',
|
|
62
|
+
package: '@a/one',
|
|
63
|
+
score: 60,
|
|
64
|
+
reason: 'keyword',
|
|
65
|
+
description: 'word '.repeat(200).trim(),
|
|
66
|
+
};
|
|
67
|
+
const own = kitAnswer(signals([hero, foot]));
|
|
68
|
+
const kit = kitAnswer(signals([hero, foot], [nav]), ['Nav', 'Hero']);
|
|
69
|
+
expect(kit.data.blocks.map(b => b.name)).toEqual(['Nav', 'Hero']);
|
|
70
|
+
expect(kit.data.blocks[1]).toEqual(hero);
|
|
71
|
+
expect(Buffer.byteLength(JSON.stringify(kit))).toBeLessThanOrEqual(
|
|
72
|
+
Buffer.byteLength(JSON.stringify(own)),
|
|
73
|
+
);
|
|
74
|
+
expect(kit.data.blocks[0].description).toMatch(/…$/);
|
|
75
|
+
});
|
|
76
|
+
it('trims an added block’s first sentence so the text answer is never longer either', () => {
|
|
77
|
+
const long = ' More words follow here. '.repeat(20);
|
|
78
|
+
const hero = {...a, description: `A hero.${long}`};
|
|
79
|
+
const foot = {...c, description: `A footer.${long}`};
|
|
80
|
+
const nav = {
|
|
81
|
+
name: 'Nav',
|
|
82
|
+
package: '@a/one',
|
|
83
|
+
score: 60,
|
|
84
|
+
reason: 'keyword',
|
|
85
|
+
description:
|
|
86
|
+
'A navigation bar with a logo, five links, a search box and a menu.',
|
|
87
|
+
};
|
|
88
|
+
const kit = kitAnswer(signals([hero, foot], [nav]), ['Nav', 'Hero']);
|
|
89
|
+
const d = kit.data.blocks[0].description;
|
|
90
|
+
expect(d).toMatch(/…$/);
|
|
91
|
+
expect(d.length).toBeLessThan(nav.description.length);
|
|
92
|
+
expect(nav.description.startsWith(d.slice(0, -1))).toBe(true);
|
|
93
|
+
expect(kit.data.blocks[1]).toEqual(hero);
|
|
94
|
+
});
|
|
95
|
+
it('never empties an added block’s description', () => {
|
|
96
|
+
const nav = {
|
|
97
|
+
name: 'Nav',
|
|
98
|
+
package: '@a/one',
|
|
99
|
+
score: 60,
|
|
100
|
+
reason: 'keyword',
|
|
101
|
+
description:
|
|
102
|
+
'A navigation bar with a logo, five links, a search box and a menu.',
|
|
103
|
+
};
|
|
104
|
+
const kit = kitAnswer(signals([a, c], [nav]), ['Nav', 'Hero']);
|
|
105
|
+
expect(kit.data.blocks[0].name).toBe('Nav');
|
|
106
|
+
expect(kit.data.blocks[0].description.length).toBeGreaterThan(0);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* What an idea asks for (spec:AST-048/FR3): a whole `page`; a `part` of one,
|
|
6
|
+
* when its head noun names one of the system's components and it lists fewer
|
|
7
|
+
* than PAGE_PIECES pieces; or an `edit` of a page the builder already has.
|
|
8
|
+
*
|
|
9
|
+
* @param {string} query
|
|
10
|
+
* @param {PageTemplate[]} pages
|
|
11
|
+
* @param {ComponentWords[]} components
|
|
12
|
+
* @returns {IdeaKind}
|
|
13
|
+
*/
|
|
14
|
+
export function ideaKind(query: string, pages: PageTemplate[], components: ComponentWords[]): IdeaKind;
|
|
15
|
+
/**
|
|
16
|
+
* Whether an idea asks for a new page (see `asksNewPage`), from the idea and
|
|
17
|
+
* the project's page templates.
|
|
18
|
+
* @param {string} query
|
|
19
|
+
* @param {PageTemplate[]} pages
|
|
20
|
+
* @returns {boolean}
|
|
21
|
+
*/
|
|
22
|
+
export function asksForNewPage(query: string, pages: PageTemplate[]): boolean;
|
|
23
|
+
export type PageTemplate = import("./words.mjs").PageTemplate;
|
|
24
|
+
export type ComponentWords = import("./words.mjs").ComponentWords;
|
|
25
|
+
export type IdeaKind = import("./words.mjs").IdeaKind;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Whether a build idea asks for a page, a part of a page, or a change to
|
|
5
|
+
* a page the builder already has.
|
|
6
|
+
*
|
|
7
|
+
* Parts (spec:AST-048/FR3). "A date range picker" asks for a part of a page,
|
|
8
|
+
* not a page, and the system's own components say what a part is: an idea
|
|
9
|
+
* whose head noun is a word of a component's name or keywords, Core's or an
|
|
10
|
+
* integration's, asks for that part, unless the noun is a family word ("a data
|
|
11
|
+
* table") or the idea lists a page's worth of pieces. Words search drops as
|
|
12
|
+
* stopwords ("page", "screen", "app", "view") name no component, so "a calendar
|
|
13
|
+
* page" asks for a page and "a calendar" for a part. A part starts from the
|
|
14
|
+
* base template of the family the idea names ("an empty state for a settings
|
|
15
|
+
* page"), else from the app shell. An idea that changes a page or part the
|
|
16
|
+
* builder already has starts from the app shell too: that page is the
|
|
17
|
+
* builder's to keep (FR9), and no template scaffolds it. "Existing" marks one
|
|
18
|
+
* when its phrase names a page family or a component ("add a column to the
|
|
19
|
+
* existing table"), unless the idea asks for a new page ("a new dashboard like
|
|
20
|
+
* the existing dashboard", "clone the existing dashboard as a new page"). A
|
|
21
|
+
* bare "existing" phrase that names a page ("existing reports dashboard with a
|
|
22
|
+
* date filter") reads as the builder's own page.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import {stem} from '../../search/search.mjs';
|
|
26
|
+
import {
|
|
27
|
+
HEAD_END,
|
|
28
|
+
CONTAINER_PHRASE,
|
|
29
|
+
PHRASE_END,
|
|
30
|
+
terms,
|
|
31
|
+
containersOf,
|
|
32
|
+
familyWordsOf,
|
|
33
|
+
} from './words.mjs';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @typedef {import('./words.mjs').PageTemplate} PageTemplate
|
|
37
|
+
* @typedef {import('./words.mjs').ComponentWords} ComponentWords
|
|
38
|
+
* @typedef {import('./words.mjs').IdeaKind} IdeaKind
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* How many listed pieces make an idea a page: a part is one thing with a detail
|
|
43
|
+
* or two ("a status pill with a tooltip"), while three pieces, two commas
|
|
44
|
+
* apart, describe a page.
|
|
45
|
+
*/
|
|
46
|
+
const PAGE_PIECES = 3;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The word that marks a page or part the builder already has, when its phrase
|
|
50
|
+
* names one (see `changesExistingPage`).
|
|
51
|
+
*/
|
|
52
|
+
const EXISTING = /\bexisting\b/i;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The word that marks an idea asking for a new page ("a new dashboard", "as a
|
|
56
|
+
* new page"), which is never a change to one the builder has.
|
|
57
|
+
*/
|
|
58
|
+
const NEW = /\bnew\b/;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* What an idea asks for (spec:AST-048/FR3): a whole `page`; a `part` of one,
|
|
62
|
+
* when its head noun names one of the system's components and it lists fewer
|
|
63
|
+
* than PAGE_PIECES pieces; or an `edit` of a page the builder already has.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} query
|
|
66
|
+
* @param {PageTemplate[]} pages
|
|
67
|
+
* @param {ComponentWords[]} components
|
|
68
|
+
* @returns {IdeaKind}
|
|
69
|
+
*/
|
|
70
|
+
export function ideaKind(query, pages, components) {
|
|
71
|
+
const text = String(query);
|
|
72
|
+
const familyWords = familyWordsOf(pages);
|
|
73
|
+
if (changesExistingPage(text, familyWords, components)) return 'edit';
|
|
74
|
+
// The head's last word, page words included: "calendar" is the noun of "a
|
|
75
|
+
// calendar", "page" the noun of "a calendar page". An overlay frame names
|
|
76
|
+
// where the thing lives, not the thing: "drafts" is the noun of "drafts in
|
|
77
|
+
// a modal".
|
|
78
|
+
const head = (text.split(HEAD_END)[0] ?? '').replace(CONTAINER_PHRASE, m =>
|
|
79
|
+
containersOf(m).size > 0 ? ' ' : m,
|
|
80
|
+
);
|
|
81
|
+
const words = (head.toLowerCase().match(/[a-z0-9]+/g) ?? []).filter(
|
|
82
|
+
w => w.length >= 2,
|
|
83
|
+
);
|
|
84
|
+
const noun = stem(words[words.length - 1] ?? '');
|
|
85
|
+
if (familyWords.has(noun)) return 'page';
|
|
86
|
+
const pieces = (text.match(/,/g) ?? []).length + 1;
|
|
87
|
+
if (pieces >= PAGE_PIECES) return 'page';
|
|
88
|
+
return components.some(c => componentTerms(c).includes(noun))
|
|
89
|
+
? 'part'
|
|
90
|
+
: 'page';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Whether an idea changes a page or part the builder already has: "existing"
|
|
95
|
+
* in the same phrase as a word that names a family of page templates or one of
|
|
96
|
+
* the system's components ("the existing incidents table", "the existing
|
|
97
|
+
* banner"). A new page "inspired by the existing one", or "existing users" on a
|
|
98
|
+
* new page, names neither, and an idea that asks for a new page is no change
|
|
99
|
+
* whatever it names.
|
|
100
|
+
* @param {string} text
|
|
101
|
+
* @param {Map<string, string>} familyWords
|
|
102
|
+
* @param {ComponentWords[]} components
|
|
103
|
+
* @returns {boolean}
|
|
104
|
+
*/
|
|
105
|
+
function changesExistingPage(text, familyWords, components) {
|
|
106
|
+
const componentWords = new Set(components.flatMap(nameTerms));
|
|
107
|
+
const phrases = text.toLowerCase().split(PHRASE_END);
|
|
108
|
+
if (asksNewPage(phrases, familyWords)) return false;
|
|
109
|
+
return phrases.some(phrase => {
|
|
110
|
+
const at = phrase.search(EXISTING);
|
|
111
|
+
return (
|
|
112
|
+
at >= 0 &&
|
|
113
|
+
terms(phrase.slice(at)).some(
|
|
114
|
+
t => familyWords.has(t) || componentWords.has(t),
|
|
115
|
+
)
|
|
116
|
+
);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Whether an idea asks for a new page: "new" before a word that names a family
|
|
122
|
+
* of page templates ("a new dashboard"), or before only words search drops,
|
|
123
|
+
* such as "page" ("as a new page"). "A new column" asks for a part.
|
|
124
|
+
* @param {string[]} phrases
|
|
125
|
+
* @param {Map<string, string>} familyWords
|
|
126
|
+
* @returns {boolean}
|
|
127
|
+
*/
|
|
128
|
+
function asksNewPage(phrases, familyWords) {
|
|
129
|
+
return phrases.some(phrase => {
|
|
130
|
+
const at = phrase.search(NEW);
|
|
131
|
+
if (at < 0) return false;
|
|
132
|
+
const after = terms(phrase.slice(at + 'new'.length));
|
|
133
|
+
return after.length === 0 || familyWords.has(after[0]);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Whether an idea asks for a new page (see `asksNewPage`), from the idea and
|
|
139
|
+
* the project's page templates.
|
|
140
|
+
* @param {string} query
|
|
141
|
+
* @param {PageTemplate[]} pages
|
|
142
|
+
* @returns {boolean}
|
|
143
|
+
*/
|
|
144
|
+
export function asksForNewPage(query, pages) {
|
|
145
|
+
return asksNewPage(
|
|
146
|
+
String(query).toLowerCase().split(PHRASE_END),
|
|
147
|
+
familyWordsOf(pages),
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The words of a component's name: "DateRangeInput" is date, range, input.
|
|
153
|
+
* @param {ComponentWords} component
|
|
154
|
+
* @returns {string[]}
|
|
155
|
+
*/
|
|
156
|
+
function nameTerms(component) {
|
|
157
|
+
return terms(component.name.replace(/([a-z0-9])([A-Z])/g, '$1 $2'));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* The terms a component answers to: the words of its name and of its keywords.
|
|
162
|
+
* @param {ComponentWords} component
|
|
163
|
+
* @returns {string[]}
|
|
164
|
+
*/
|
|
165
|
+
function componentTerms(component) {
|
|
166
|
+
return [
|
|
167
|
+
...nameTerms(component),
|
|
168
|
+
...component.keywords.flatMap(keyword => terms(keyword)),
|
|
169
|
+
];
|
|
170
|
+
}
|
package/api/build/kit/kit.d.mts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* The page template to start from, and the kit around it
|
|
5
|
+
* The page template to start from, and the kit around it, with the blocks
|
|
6
|
+
* build names itself.
|
|
6
7
|
*
|
|
7
8
|
* @param {string} query what you're building (e.g. "analytics dashboard")
|
|
8
9
|
* @param {{cwd?: string, type?: import('../../search/search.type.mjs').SearchDomain, limit?: number}} [options]
|
|
@@ -13,6 +14,3 @@ export function buildKit(query: string, options?: {
|
|
|
13
14
|
type?: import("../../search/search.type.mjs").SearchDomain;
|
|
14
15
|
limit?: number;
|
|
15
16
|
}): Promise<import("../build.type.mjs").BuildKitResponse>;
|
|
16
|
-
export type SearchResultEntry = import("../../search/search.type.mjs").SearchResultEntry;
|
|
17
|
-
export type BuildStart = import("../build.type.mjs").BuildStart;
|
|
18
|
-
export type PageTemplate = import("../_adapter.mjs").PageTemplate;
|