@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
|
@@ -18,8 +18,11 @@ export const doc = {
|
|
|
18
18
|
'Runs read-only project health diagnostics by default: Node version, @astryxdesign/core ' +
|
|
19
19
|
'install and version alignment, theme packages, generated app themes when present, earlier copied-theme migration, config, integrations (every one astryx.config names must load, linked without a config entry, ' +
|
|
20
20
|
'provider identity, contribution issues), agent docs, core peer dependencies, package manager, ' +
|
|
21
|
-
"and the
|
|
22
|
-
'The `integration` subcommands provide authoring checks for one integration package.'
|
|
21
|
+
"the docs the CLI reads, the newest release the computer knows of, with the install and upgrade commands when the project's release is older, and every `astryx` command on the search path, warning when the first one is not the Astryx CLI or predates the hand-off. It writes nothing, but loading astryx.config runs that file's code. " +
|
|
22
|
+
'The `integration` subcommands provide authoring checks for one integration package. ' +
|
|
23
|
+
'Outside a project it checks the computer instead: the Node version, the release that answered, ' +
|
|
24
|
+
"the newest release this computer knows of, with the command that upgrades the CLI installed for the computer when it is older, the astryx commands on the search path, the integrations installed for the computer (warning about one it skips), and whether the computer-level agent text (`astryx init --user`) is present, matches this release, was edited, or is turned off (info only); when that text names `astryx` and no `astryx` command is on the search path, apart from a package runner's own copy, it says so and names the install step the text records, or npm's when it records none. " +
|
|
25
|
+
'It never fails a check because the folder has no project.',
|
|
23
26
|
fn: 'doctor',
|
|
24
27
|
subcommands: ['integration'],
|
|
25
28
|
examples: [
|
|
@@ -42,9 +45,16 @@ export const doc = {
|
|
|
42
45
|
cli: 'astryx doctor integration docs @acme/widgets',
|
|
43
46
|
},
|
|
44
47
|
],
|
|
48
|
+
outsideProject: 'own',
|
|
45
49
|
exitCodes: [
|
|
46
50
|
{code: 0, when: 'no checks failed (warnings are allowed)'},
|
|
47
51
|
{code: 1, when: 'one or more checks failed'},
|
|
48
52
|
],
|
|
49
53
|
related: ['init', 'upgrade'],
|
|
54
|
+
notes: [
|
|
55
|
+
{
|
|
56
|
+
type: 'prose',
|
|
57
|
+
text: "In global mode: outside a project, doctor checks your computer instead of a folder: `node-version`, `answering-release` (the version that answered), `newest-release`, `cli-on-path` (every astryx command on your PATH), `computer-integrations` (integrations installed globally), and `computer-agent-text` (the agent guide). It never fails a check because the folder has no project. In a project, the project's version of Astryx runs it, whichever astryx command you start. See {@link namespace:global} and {@link generic:who-answers}.",
|
|
58
|
+
},
|
|
59
|
+
],
|
|
50
60
|
};
|
|
@@ -38,6 +38,8 @@ import {doc as integrationDocConflictsFn} from '../../../api/integration/integra
|
|
|
38
38
|
import {NO_RESULT_SET} from '../../../foundation/debug/index.mjs';
|
|
39
39
|
import {cliError} from '../lib/cli-error.mjs';
|
|
40
40
|
import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
|
|
41
|
+
import {formatCliCommand} from '../../../foundation/env/package-manager.mjs';
|
|
42
|
+
import {isOutsideProject} from '../../../foundation/env/project-scope.mjs';
|
|
41
43
|
|
|
42
44
|
const STATUS = {
|
|
43
45
|
pass: '[ok]',
|
|
@@ -92,12 +94,119 @@ function issueBlocks(issues) {
|
|
|
92
94
|
return [
|
|
93
95
|
section('Integration issues'),
|
|
94
96
|
records(issues, {
|
|
95
|
-
fields: ['severity', 'code', 'message'],
|
|
97
|
+
fields: ['severity', 'code', 'message', 'fix', 'file', 'line'],
|
|
96
98
|
format: {severity: statusToken},
|
|
97
99
|
}),
|
|
98
100
|
];
|
|
99
101
|
}
|
|
100
102
|
|
|
103
|
+
/**
|
|
104
|
+
* The docs checked against the authoring types: a visible line when it was
|
|
105
|
+
* skipped, the findings (all warnings), the files it could not check, or an
|
|
106
|
+
* [ok] (never after a failed check).
|
|
107
|
+
* @param {import('../../../api/integration/validate-integration.type.mjs').DocTypesReport | undefined} report
|
|
108
|
+
* @param {boolean} failed
|
|
109
|
+
*/
|
|
110
|
+
function docTypesBlocks(report, failed) {
|
|
111
|
+
if (!report) return [];
|
|
112
|
+
if (
|
|
113
|
+
report.status === 'checked' &&
|
|
114
|
+
report.docs === 0 &&
|
|
115
|
+
report.findings.length === 0 &&
|
|
116
|
+
report.unchecked.length === 0
|
|
117
|
+
) {
|
|
118
|
+
return [
|
|
119
|
+
text('[info] No doc files to type-check.'),
|
|
120
|
+
...(report.fixtures
|
|
121
|
+
? [text(`[info] ${report.fixtures} test fixture doc(s) not checked.`)]
|
|
122
|
+
: []),
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
if (report.status === 'skipped') {
|
|
126
|
+
return [text(`[skip] Docs not type-checked: ${report.reason}`)];
|
|
127
|
+
}
|
|
128
|
+
const blocks = [
|
|
129
|
+
section(
|
|
130
|
+
`Checking ${report.docs} doc(s) against the authoring types${report.typescript ? ` (TypeScript ${report.typescript})` : ''}`,
|
|
131
|
+
),
|
|
132
|
+
];
|
|
133
|
+
if (report.findings.length > 0) {
|
|
134
|
+
const files = new Set(report.findings.map(f => f.doc)).size;
|
|
135
|
+
blocks.push(
|
|
136
|
+
records(report.findings, {
|
|
137
|
+
fields: [
|
|
138
|
+
'severity',
|
|
139
|
+
'doc',
|
|
140
|
+
'line',
|
|
141
|
+
'export',
|
|
142
|
+
'type',
|
|
143
|
+
'field',
|
|
144
|
+
'problem',
|
|
145
|
+
'message',
|
|
146
|
+
'fix',
|
|
147
|
+
],
|
|
148
|
+
format: {severity: statusToken},
|
|
149
|
+
}),
|
|
150
|
+
text(
|
|
151
|
+
`${report.findings.length} doc field(s) in ${files} file(s) do not match the authoring types. ` +
|
|
152
|
+
'These are warnings; `astryx docs authoring` lists every field.',
|
|
153
|
+
),
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
if (report.unchecked.length > 0) {
|
|
157
|
+
blocks.push(
|
|
158
|
+
text(`[info] Not type-checked: ${report.unchecked.length} doc file(s):`),
|
|
159
|
+
records(report.unchecked, {fields: ['doc', 'reason']}),
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
if (report.fixtures) {
|
|
163
|
+
blocks.push(
|
|
164
|
+
text(`[info] ${report.fixtures} test fixture doc(s) not checked.`),
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
if (report.findings.length === 0 && report.docs > 0) {
|
|
168
|
+
// After a failed check an [ok] reads as a pass, but the result still shows.
|
|
169
|
+
blocks.push(
|
|
170
|
+
text(
|
|
171
|
+
failed
|
|
172
|
+
? `[info] No doc field differs from its authoring type (${report.docs} checked).`
|
|
173
|
+
: report.unchecked.length > 0
|
|
174
|
+
? `[ok] Every doc that was checked matches its authoring type (${report.docs} checked).`
|
|
175
|
+
: `[ok] Every doc matches its authoring type (${report.docs} checked).`,
|
|
176
|
+
),
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
return blocks;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* The component doc names that could not be judged against their sources.
|
|
184
|
+
* @param {import('../../../api/integration/validate-integration.type.mjs').DocNamesReport | undefined} report
|
|
185
|
+
*/
|
|
186
|
+
function docNamesBlocks(report) {
|
|
187
|
+
if (!report || report.unchecked.length === 0) return [];
|
|
188
|
+
return [
|
|
189
|
+
text(
|
|
190
|
+
`[info] Component names not checked: ${report.unchecked.length} doc(s) whose source exports this check cannot read:`,
|
|
191
|
+
),
|
|
192
|
+
records(report.unchecked, {fields: ['file', 'name', 'reason']}),
|
|
193
|
+
];
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* The block component names this check could not judge.
|
|
198
|
+
* @param {import('../../../api/integration/validate-integration.type.mjs').BlockComponentsReport | undefined} report
|
|
199
|
+
*/
|
|
200
|
+
function blockComponentsBlocks(report) {
|
|
201
|
+
if (!report || report.unchecked.length === 0) return [];
|
|
202
|
+
return [
|
|
203
|
+
text(
|
|
204
|
+
`[info] Block component names not checked: ${report.unchecked.length} name(s) this check could not judge:`,
|
|
205
|
+
),
|
|
206
|
+
records(report.unchecked, {fields: ['file', 'name', 'reason']}),
|
|
207
|
+
];
|
|
208
|
+
}
|
|
209
|
+
|
|
101
210
|
/**
|
|
102
211
|
* @param {import('../../../api/integration/validate-integration.type.mjs').ValidateIntegrationResponse['data']} data
|
|
103
212
|
*/
|
|
@@ -110,15 +219,31 @@ function printIntegrationValidation(data) {
|
|
|
110
219
|
...(data.issues.length > 0
|
|
111
220
|
? [
|
|
112
221
|
records(data.issues, {
|
|
113
|
-
fields: ['severity', 'code', 'message'],
|
|
222
|
+
fields: ['severity', 'code', 'message', 'fix', 'file', 'line'],
|
|
114
223
|
format: {severity: statusToken},
|
|
115
224
|
}),
|
|
116
225
|
]
|
|
117
226
|
: [text('[ok] No integration issues found.')]),
|
|
227
|
+
...(data.notes ?? []).map(note =>
|
|
228
|
+
text(`note (${note.code}): ${note.message}`),
|
|
229
|
+
),
|
|
118
230
|
text(
|
|
119
231
|
`Summary: ${errors} error${errors === 1 ? '' : 's'}, ` +
|
|
120
232
|
`${warnings} warning${warnings === 1 ? '' : 's'}`,
|
|
121
233
|
),
|
|
234
|
+
...docTypesBlocks(data.docTypes, errors > 0),
|
|
235
|
+
...docNamesBlocks(data.docNames),
|
|
236
|
+
...blockComponentsBlocks(data.blockComponents),
|
|
237
|
+
...(data.publicImports && data.publicImports.unchecked.length > 0
|
|
238
|
+
? [
|
|
239
|
+
text(
|
|
240
|
+
`[info] Imports not checked: ${data.publicImports.unchecked.length}:`,
|
|
241
|
+
),
|
|
242
|
+
records(data.publicImports.unchecked, {
|
|
243
|
+
fields: ['file', 'specifier', 'reason'],
|
|
244
|
+
}),
|
|
245
|
+
]
|
|
246
|
+
: []),
|
|
122
247
|
);
|
|
123
248
|
}
|
|
124
249
|
|
|
@@ -173,6 +298,101 @@ function printTemplateConflicts(data) {
|
|
|
173
298
|
emit(...output);
|
|
174
299
|
}
|
|
175
300
|
|
|
301
|
+
/**
|
|
302
|
+
* The documented-props comparison, with every field its JSON carries: a
|
|
303
|
+
* visible line when it was skipped, the findings (all warnings), the
|
|
304
|
+
* components it could not read, and how many were compared with which
|
|
305
|
+
* TypeScript, as an [ok] when nothing differs (never after a failed check).
|
|
306
|
+
* Then how many documented prop types were judged and which were not.
|
|
307
|
+
* @param {import('../../../api/integration/authoring-checks.type.mjs').PropDriftReport | undefined} report
|
|
308
|
+
* @param {boolean} failed
|
|
309
|
+
*/
|
|
310
|
+
function propDriftBlocks(report, failed) {
|
|
311
|
+
if (!report) return [];
|
|
312
|
+
if (report.status === 'skipped') {
|
|
313
|
+
return [text(`[skip] Props not compared: ${report.reason}`)];
|
|
314
|
+
}
|
|
315
|
+
const blocks = [];
|
|
316
|
+
if (report.findings.length > 0) {
|
|
317
|
+
// Two docs of one name are two components.
|
|
318
|
+
const components = new Set(
|
|
319
|
+
report.findings.map(f => `${f.doc}\0${f.component}`),
|
|
320
|
+
).size;
|
|
321
|
+
blocks.push(
|
|
322
|
+
records(report.findings, {
|
|
323
|
+
fields: [
|
|
324
|
+
'severity',
|
|
325
|
+
'component',
|
|
326
|
+
'prop',
|
|
327
|
+
'kind',
|
|
328
|
+
'message',
|
|
329
|
+
'doc',
|
|
330
|
+
'source',
|
|
331
|
+
'docType',
|
|
332
|
+
'codeType',
|
|
333
|
+
'docRequired',
|
|
334
|
+
'codeRequired',
|
|
335
|
+
'docDefault',
|
|
336
|
+
'codeDefault',
|
|
337
|
+
'fix',
|
|
338
|
+
],
|
|
339
|
+
format: {severity: statusToken},
|
|
340
|
+
}),
|
|
341
|
+
text(
|
|
342
|
+
`${report.findings.length} prop(s) differ between the docs and the code in ${components} of ${report.components} component(s) compared (TypeScript ${report.typescript}). ` +
|
|
343
|
+
'These are warnings: update the doc, or the code if the doc is right.',
|
|
344
|
+
),
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
if (report.unchecked.length > 0) {
|
|
348
|
+
blocks.push(
|
|
349
|
+
text(
|
|
350
|
+
`[info] Props not compared for ${report.unchecked.length} documented component(s):`,
|
|
351
|
+
),
|
|
352
|
+
records(report.unchecked, {fields: ['component', 'doc', 'reason']}),
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
const notChecked = report.propsNotChecked ?? [];
|
|
356
|
+
if (notChecked.length > 0) {
|
|
357
|
+
blocks.push(
|
|
358
|
+
text(
|
|
359
|
+
`[info] Props not checked for a doc entry in ${notChecked.length} component(s):`,
|
|
360
|
+
),
|
|
361
|
+
records(notChecked, {fields: ['component', 'doc', 'reason', 'props']}),
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
if (report.findings.length === 0) {
|
|
365
|
+
const apart =
|
|
366
|
+
notChecked.length > 0 ? ', apart from the props not checked' : '';
|
|
367
|
+
blocks.push(
|
|
368
|
+
text(
|
|
369
|
+
!failed && report.components > 0
|
|
370
|
+
? `[ok] Documented prop names and required flags match the code in ${report.components} component(s)${apart} (TypeScript ${report.typescript}).`
|
|
371
|
+
: `[info] Props compared in ${report.components} component(s) (TypeScript ${report.typescript}).`,
|
|
372
|
+
),
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
if (report.typesSkipped) {
|
|
376
|
+
blocks.push(text(`[skip] Prop types not judged: ${report.typesSkipped}.`));
|
|
377
|
+
return blocks;
|
|
378
|
+
}
|
|
379
|
+
const notCompared = report.typesNotCompared.flatMap(entry => entry.props);
|
|
380
|
+
blocks.push(
|
|
381
|
+
text(
|
|
382
|
+
`[info] Documented prop types judged: ${report.typesCompared}; not compared: ${notCompared.length}. ` +
|
|
383
|
+
'A type is judged when the doc writes it the same as the source (exactly, if it contains `readonly`), or when both are primitives, literals, arrays and unions of those, or names for them.',
|
|
384
|
+
),
|
|
385
|
+
);
|
|
386
|
+
if (notCompared.length > 0) {
|
|
387
|
+
blocks.push(
|
|
388
|
+
records(report.typesNotCompared, {
|
|
389
|
+
fields: ['component', 'doc', 'reason', 'props'],
|
|
390
|
+
}),
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
return blocks;
|
|
394
|
+
}
|
|
395
|
+
|
|
176
396
|
/**
|
|
177
397
|
* @param {import('../../../api/integration/authoring-checks.type.mjs').IntegrationComponentConflictResponse['data']} data
|
|
178
398
|
*/
|
|
@@ -186,7 +406,8 @@ function printComponentConflicts(data) {
|
|
|
186
406
|
// An [ok] after a failed check reads as a pass: say nothing it could not check.
|
|
187
407
|
const failed = data.issues.some(issue => issue.severity === 'error');
|
|
188
408
|
if (data.conflicts.length === 0) {
|
|
189
|
-
if (!failed)
|
|
409
|
+
if (!failed)
|
|
410
|
+
output.push(text('[ok] No component names conflict with Core.'));
|
|
190
411
|
} else {
|
|
191
412
|
output.push(
|
|
192
413
|
records(data.conflicts, {
|
|
@@ -205,6 +426,7 @@ function printComponentConflicts(data) {
|
|
|
205
426
|
),
|
|
206
427
|
);
|
|
207
428
|
}
|
|
429
|
+
output.push(...propDriftBlocks(data.propDrift, failed));
|
|
208
430
|
emit(...output);
|
|
209
431
|
}
|
|
210
432
|
|
|
@@ -216,7 +438,16 @@ function printDocConflicts(data) {
|
|
|
216
438
|
section(
|
|
217
439
|
`Checking integration docs: ${integrationLabel(data) ?? '(local package)'}`,
|
|
218
440
|
),
|
|
219
|
-
|
|
441
|
+
// A copied passage or fluff is listed below with its detail, so its
|
|
442
|
+
// issue is not printed twice.
|
|
443
|
+
...issueBlocks(
|
|
444
|
+
data.issues.filter(
|
|
445
|
+
issue =>
|
|
446
|
+
issue.code !== 'copied_passage' &&
|
|
447
|
+
issue.code !== 'doc_fluff' &&
|
|
448
|
+
issue.code !== 'stray_doc_pointer',
|
|
449
|
+
),
|
|
450
|
+
),
|
|
220
451
|
];
|
|
221
452
|
if (
|
|
222
453
|
!data.issues.some(
|
|
@@ -239,9 +470,99 @@ function printDocConflicts(data) {
|
|
|
239
470
|
}),
|
|
240
471
|
);
|
|
241
472
|
}
|
|
473
|
+
const copied = data.copiedPassages ?? [];
|
|
474
|
+
if (copied.length === 0) {
|
|
475
|
+
if (!data.issues.some(issue => issue.severity === 'error')) {
|
|
476
|
+
output.push(text('[ok] No topic copies a passage from another.'));
|
|
477
|
+
}
|
|
478
|
+
} else {
|
|
479
|
+
output.push(
|
|
480
|
+
text(
|
|
481
|
+
`[warn] ${copied.length} copied passage(s) (copied_passage): two topics say the same thing word for word. Keep the text in one and link to it from the other.`,
|
|
482
|
+
),
|
|
483
|
+
records(copied, {
|
|
484
|
+
fields: [
|
|
485
|
+
'topic',
|
|
486
|
+
'section',
|
|
487
|
+
'line',
|
|
488
|
+
'otherTopic',
|
|
489
|
+
'otherOwner',
|
|
490
|
+
'owner',
|
|
491
|
+
'text',
|
|
492
|
+
'words',
|
|
493
|
+
'passages',
|
|
494
|
+
'message',
|
|
495
|
+
],
|
|
496
|
+
}),
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
const fluff = data.fluff ?? [];
|
|
500
|
+
if (fluff.length === 0) {
|
|
501
|
+
if (!data.issues.some(issue => issue.severity === 'error')) {
|
|
502
|
+
output.push(text('[ok] No filler phrases or low-density topics.'));
|
|
503
|
+
}
|
|
504
|
+
} else {
|
|
505
|
+
output.push(
|
|
506
|
+
text(
|
|
507
|
+
`[warn] ${fluff.length} fluff finding(s) (doc_fluff): words that add length, not meaning. Cut each one.`,
|
|
508
|
+
),
|
|
509
|
+
records(fluff, {
|
|
510
|
+
fields: [
|
|
511
|
+
'topic',
|
|
512
|
+
'kind',
|
|
513
|
+
'phrase',
|
|
514
|
+
'section',
|
|
515
|
+
'file',
|
|
516
|
+
'line',
|
|
517
|
+
'density',
|
|
518
|
+
'message',
|
|
519
|
+
],
|
|
520
|
+
}),
|
|
521
|
+
);
|
|
522
|
+
}
|
|
523
|
+
const stray = data.strayPointers ?? [];
|
|
524
|
+
if (stray.length === 0) {
|
|
525
|
+
if (!data.issues.some(issue => issue.severity === 'error')) {
|
|
526
|
+
output.push(text('[ok] Every pointer to a doc is a link.'));
|
|
527
|
+
}
|
|
528
|
+
} else {
|
|
529
|
+
output.push(
|
|
530
|
+
text(
|
|
531
|
+
`[warn] ${stray.length} stray doc pointer(s) (stray_doc_pointer): a written \`astryx docs <name>\` where a link would be checked. Replace each with the link shown.`,
|
|
532
|
+
),
|
|
533
|
+
records(stray, {
|
|
534
|
+
fields: [
|
|
535
|
+
'topic',
|
|
536
|
+
'section',
|
|
537
|
+
'file',
|
|
538
|
+
'line',
|
|
539
|
+
'pointer',
|
|
540
|
+
'link',
|
|
541
|
+
'message',
|
|
542
|
+
],
|
|
543
|
+
}),
|
|
544
|
+
);
|
|
545
|
+
}
|
|
242
546
|
emit(...output);
|
|
243
547
|
}
|
|
244
548
|
|
|
549
|
+
/**
|
|
550
|
+
* Print one `doctor integration` check's result as its own subcommand prints
|
|
551
|
+
* it. `astryx integration check` prints each check it runs through this.
|
|
552
|
+
* @param {import('../../../api/integration/integration-check.type.mjs').IntegrationCheckResponse} response
|
|
553
|
+
*/
|
|
554
|
+
export function printIntegrationCheckResponse(response) {
|
|
555
|
+
if (response.type === 'integration.validate') {
|
|
556
|
+
printIntegrationValidation(response.data);
|
|
557
|
+
} else if (response.type === 'integration.component-conflicts') {
|
|
558
|
+
printComponentConflicts(response.data);
|
|
559
|
+
} else if (response.type === 'integration.template-conflicts') {
|
|
560
|
+
printTemplateConflicts(response.data);
|
|
561
|
+
} else {
|
|
562
|
+
printDocConflicts(response.data);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
245
566
|
/** @param {import('commander').Command} program */
|
|
246
567
|
async function runProjectDoctor(program) {
|
|
247
568
|
const report = await runChecks();
|
|
@@ -265,7 +586,7 @@ async function runIntegrationValidation(program, pkg) {
|
|
|
265
586
|
noPackage
|
|
266
587
|
? 'Nothing was validated: no package.json found. Run this command inside a package directory.'
|
|
267
588
|
: 'Nothing was validated: no astryx.integration.* found next to package.json. ' +
|
|
268
|
-
|
|
589
|
+
`To validate an installed integration: ${formatCliCommand('doctor integration validate <package>')}`,
|
|
269
590
|
),
|
|
270
591
|
);
|
|
271
592
|
} else printIntegrationValidation(result.data);
|
|
@@ -288,10 +609,14 @@ async function runAuthoringCheck(program, pkg, kind) {
|
|
|
288
609
|
|
|
289
610
|
if (program.opts().json) jsonOut(result);
|
|
290
611
|
else if (!result.data.validated) {
|
|
612
|
+
// Outside a project no integration is installed to check by name
|
|
613
|
+
// (spec AST-081 FR3).
|
|
291
614
|
emit(
|
|
292
615
|
text(
|
|
293
|
-
|
|
294
|
-
|
|
616
|
+
isOutsideProject()
|
|
617
|
+
? 'Nothing was checked: no astryx.integration.* found next to package.json, and this folder is outside a project.'
|
|
618
|
+
: 'Nothing was checked: no astryx.integration.* found next to package.json. ' +
|
|
619
|
+
`To check an installed integration: ${formatCliCommand(`doctor integration ${kind} <package>`)}`,
|
|
295
620
|
),
|
|
296
621
|
);
|
|
297
622
|
} else if (kind === 'templates') {
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
checkPackageManager,
|
|
21
21
|
} from '../../../api/doctor/doctor.mjs';
|
|
22
22
|
import {MIN_NODE_VERSION} from '../../../foundation/env/node-version.mjs';
|
|
23
|
+
import {CLI_VERSION, linkThisCliAsProjectCli} from '../../../test-utils/release-fixtures.mjs';
|
|
23
24
|
|
|
24
25
|
let tmpDir;
|
|
25
26
|
let logCalls;
|
|
@@ -101,7 +102,7 @@ describe('doctor — individual checks', () => {
|
|
|
101
102
|
});
|
|
102
103
|
|
|
103
104
|
it('app themes: reports unmanaged state as one INFO check', async () => {
|
|
104
|
-
fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"app"}\n');
|
|
105
|
+
fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"app","dependencies":{"@astryxdesign/core":"*"}}\n');
|
|
105
106
|
const result = await runChecks({cwd: tmpDir});
|
|
106
107
|
const themeChecks = result.checks.filter(check =>
|
|
107
108
|
check.id.startsWith('theme-'),
|
|
@@ -176,17 +177,45 @@ describe('doctor — individual checks', () => {
|
|
|
176
177
|
it('agent-docs: the fix names the scoped package when the project has no local CLI', () => {
|
|
177
178
|
fs.writeFileSync(path.join(tmpDir, 'package-lock.json'), '{}');
|
|
178
179
|
const res = checkAgentDocs({cwd: tmpDir});
|
|
179
|
-
expect(res.fix).toContain(
|
|
180
|
+
expect(res.fix).toContain(
|
|
181
|
+
`\`npx @astryxdesign/cli@${CLI_VERSION} init --features agents\``,
|
|
182
|
+
);
|
|
180
183
|
});
|
|
181
184
|
|
|
182
185
|
it('agent-docs: the fix keeps `npx astryx` when the project has a local CLI', () => {
|
|
183
186
|
fs.writeFileSync(path.join(tmpDir, 'package-lock.json'), '{}');
|
|
184
187
|
fs.mkdirSync(path.join(tmpDir, 'node_modules', '.bin'), {recursive: true});
|
|
185
188
|
fs.writeFileSync(path.join(tmpDir, 'node_modules', '.bin', 'astryx'), '');
|
|
189
|
+
linkThisCliAsProjectCli(tmpDir);
|
|
186
190
|
const res = checkAgentDocs({cwd: tmpDir});
|
|
187
191
|
expect(res.fix).toContain('`npx astryx init --features agents`');
|
|
188
192
|
});
|
|
189
193
|
|
|
194
|
+
it('agent-docs: at the top of a home settings folder, the fix moves the project or edits by hand, never init', () => {
|
|
195
|
+
const saved = {HOME: process.env.HOME, USERPROFILE: process.env.USERPROFILE};
|
|
196
|
+
process.env.HOME = tmpDir;
|
|
197
|
+
process.env.USERPROFILE = tmpDir;
|
|
198
|
+
try {
|
|
199
|
+
const project = path.join(tmpDir, '.dotfiles');
|
|
200
|
+
fs.mkdirSync(project);
|
|
201
|
+
fs.writeFileSync(path.join(project, 'package.json'), '{"name":"dots"}');
|
|
202
|
+
for (const content of [null, '# Agents\nno markers here\n']) {
|
|
203
|
+
if (content != null) fs.writeFileSync(path.join(project, 'AGENTS.md'), content);
|
|
204
|
+
const res = checkAgentDocs({cwd: project});
|
|
205
|
+
expect(res.fix).toContain('Agent docs are not written into the home folder');
|
|
206
|
+
expect(res.fix).toContain(
|
|
207
|
+
'Move the project into a folder of its own, or edit the Astryx block in its agent file by hand.',
|
|
208
|
+
);
|
|
209
|
+
expect(res.fix).not.toContain('init --features agents');
|
|
210
|
+
}
|
|
211
|
+
} finally {
|
|
212
|
+
for (const [key, value] of Object.entries(saved)) {
|
|
213
|
+
if (value === undefined) delete process.env[key];
|
|
214
|
+
else process.env[key] = value;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
|
|
190
219
|
it('agent-docs: WARN when docs exist without XDS markers', () => {
|
|
191
220
|
fs.writeFileSync(path.join(tmpDir, 'AGENTS.md'), '# AGENTS\nno markers here');
|
|
192
221
|
const res = checkAgentDocs({cwd: tmpDir});
|
|
@@ -217,6 +246,25 @@ describe('doctor — individual checks', () => {
|
|
|
217
246
|
);
|
|
218
247
|
});
|
|
219
248
|
|
|
249
|
+
it('agent-docs: PASS from a nested package, reading the root that declares Astryx', () => {
|
|
250
|
+
fs.writeFileSync(
|
|
251
|
+
path.join(tmpDir, 'package.json'),
|
|
252
|
+
JSON.stringify({dependencies: {'@astryxdesign/core': '0.7.0'}}),
|
|
253
|
+
);
|
|
254
|
+
fs.writeFileSync(
|
|
255
|
+
path.join(tmpDir, 'AGENTS.md'),
|
|
256
|
+
'<!-- ASTRYX:START -->\nstuff\n<!-- ASTRYX:END -->\n',
|
|
257
|
+
);
|
|
258
|
+
const functions = path.join(tmpDir, 'functions');
|
|
259
|
+
fs.mkdirSync(path.join(functions, 'src'), {recursive: true});
|
|
260
|
+
fs.writeFileSync(path.join(functions, 'package.json'), '{"name":"functions"}');
|
|
261
|
+
|
|
262
|
+
expect(checkAgentDocs({cwd: path.join(functions, 'src')})).toMatchObject({
|
|
263
|
+
status: 'pass',
|
|
264
|
+
message: `Astryx agent docs section present in ${path.join('..', '..', 'AGENTS.md')}.`,
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
|
|
220
268
|
it('agent-docs: reads every file init can write, Hermes included', () => {
|
|
221
269
|
fs.writeFileSync(
|
|
222
270
|
path.join(tmpDir, 'HERMES.md'),
|
|
@@ -228,6 +276,27 @@ describe('doctor — individual checks', () => {
|
|
|
228
276
|
});
|
|
229
277
|
});
|
|
230
278
|
|
|
279
|
+
it('agent-docs: FAIL when GEMINI.md imports an AGENTS.md that holds no block', () => {
|
|
280
|
+
const geminiImport = '<!-- ASTRYX:START -->\n@./AGENTS.md\n<!-- ASTRYX:END -->\n';
|
|
281
|
+
fs.writeFileSync(path.join(tmpDir, 'GEMINI.md'), geminiImport);
|
|
282
|
+
expect(checkAgentDocs({cwd: tmpDir})).toMatchObject({
|
|
283
|
+
status: 'fail',
|
|
284
|
+
message: expect.stringMatching(/^GEMINI\.md imports AGENTS\.md, which holds no Astryx block/),
|
|
285
|
+
fix: expect.stringMatching(/init --features agents/),
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
// A copy elsewhere does not mend it: Codex and Gemini CLI still get none.
|
|
289
|
+
fs.writeFileSync(path.join(tmpDir, 'CLAUDE.md'), '<!-- ASTRYX:START -->\nstuff\n<!-- ASTRYX:END -->\n');
|
|
290
|
+
fs.writeFileSync(path.join(tmpDir, 'AGENTS.md'), '# Agents\n');
|
|
291
|
+
expect(checkAgentDocs({cwd: tmpDir}).status).toBe('fail');
|
|
292
|
+
|
|
293
|
+
fs.writeFileSync(path.join(tmpDir, 'AGENTS.md'), '<!-- ASTRYX:START -->\nstuff\n<!-- ASTRYX:END -->\n');
|
|
294
|
+
expect(checkAgentDocs({cwd: tmpDir})).toMatchObject({
|
|
295
|
+
status: 'pass',
|
|
296
|
+
message: 'Astryx agent docs section present in AGENTS.md, CLAUDE.md.',
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
|
|
231
300
|
it('agent-docs: INFO names what it looked for and where', () => {
|
|
232
301
|
const res = checkAgentDocs({cwd: tmpDir});
|
|
233
302
|
expect(res.status).toBe('info');
|
|
@@ -301,7 +370,8 @@ describe('doctor — runChecks / report', () => {
|
|
|
301
370
|
expect(total).toBe(report.checks.length);
|
|
302
371
|
});
|
|
303
372
|
|
|
304
|
-
it('reports a FAIL for core
|
|
373
|
+
it('reports a FAIL for core in a project that declares Core but installs none', async () => {
|
|
374
|
+
fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"app","dependencies":{"@astryxdesign/core":"*"}}\n');
|
|
305
375
|
const report = await runChecks({cwd: tmpDir});
|
|
306
376
|
expect(find(report.checks, 'core-installed').status).toBe('fail');
|
|
307
377
|
expect(report.summary.fail).toBeGreaterThan(0);
|
|
@@ -346,7 +416,8 @@ describe('doctor — command', () => {
|
|
|
346
416
|
process.exitCode = prevExit;
|
|
347
417
|
});
|
|
348
418
|
|
|
349
|
-
it('sets exit code 1 when a check FAILs (
|
|
419
|
+
it('sets exit code 1 when a check FAILs (Core declared, not installed)', async () => {
|
|
420
|
+
fs.writeFileSync(path.join(tmpDir, 'package.json'), '{"name":"app","dependencies":{"@astryxdesign/core":"*"}}\n');
|
|
350
421
|
const prevCwd = process.cwd();
|
|
351
422
|
const prevExit = process.exitCode;
|
|
352
423
|
process.exitCode = undefined;
|
|
@@ -16,6 +16,8 @@ export const doc = {
|
|
|
16
16
|
'Reports a missing component, variant, layout, styling, accessibility, API, or documentation capability to the package that owns it: the --package you name, else the integration whose component replaces it, else the one package that provides the component, else Core. ' +
|
|
17
17
|
'Every configured handler receives the report: the project config handler first, then each integration handler in config order. Public handlers run only with --confirm-public; internal handlers always run. A failing handler does not stop the others. ' +
|
|
18
18
|
"With no handler it files a GitHub issue for the owning package, only with --confirm-public (without it nothing is sent), or returns the package's issues URL when that is not on GitHub. " +
|
|
19
|
+
"With --to <package>, the report goes only to that integration's issues URL instead, under the same --confirm-public rule. " +
|
|
20
|
+
'When loaded integrations name their own issues URLs, the output lists every destination: an agent asks the person where to file and passes their choice with --to; it never picks a package itself, and without a choice the default is used. ' +
|
|
19
21
|
'The report records whether an agent or a person ran it.',
|
|
20
22
|
fn: 'gapReport',
|
|
21
23
|
args: [
|
|
@@ -55,13 +57,19 @@ export const doc = {
|
|
|
55
57
|
flag: '--confirm-public',
|
|
56
58
|
param: 'options.confirmPublic',
|
|
57
59
|
description:
|
|
58
|
-
'Allow public delivery: public handlers run, and
|
|
60
|
+
'Allow public delivery: public handlers run, and a GitHub issues URL gets an issue filed with your gh login',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
flag: '--to <package>',
|
|
64
|
+
param: 'options.to',
|
|
65
|
+
description:
|
|
66
|
+
"Send the report only to this loaded integration's issues URL, as the person chose; the destinations the output lists are the choices",
|
|
59
67
|
},
|
|
60
68
|
{
|
|
61
69
|
flag: '--list-categories',
|
|
62
70
|
param: 'options.listCategories',
|
|
63
71
|
description:
|
|
64
|
-
'List valid report categories without filing; the component and the other gap-report options are refused with ERR_INVALID_ARGUMENT',
|
|
72
|
+
'List valid report categories, and the destinations when there is more than one, without filing; the component and the other gap-report options are refused with ERR_INVALID_ARGUMENT',
|
|
65
73
|
},
|
|
66
74
|
],
|
|
67
75
|
examples: [
|
|
@@ -70,7 +78,12 @@ export const doc = {
|
|
|
70
78
|
label: 'Prepare a report (nothing public happens without --confirm-public)',
|
|
71
79
|
cli: "astryx gap-report Button --category missing_variant --reason 'Need a compact size'",
|
|
72
80
|
},
|
|
81
|
+
{
|
|
82
|
+
label: 'File where the person chose',
|
|
83
|
+
cli: "astryx gap-report Button --category missing_variant --reason 'Need a compact size' --to @acme/widgets",
|
|
84
|
+
},
|
|
73
85
|
],
|
|
86
|
+
outsideProject: 'same',
|
|
74
87
|
exitCodes: [
|
|
75
88
|
{
|
|
76
89
|
code: 0,
|