@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
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import {gapReport as gapReportApi} from '../../../api/gap-report/gap-report.mjs';
|
|
8
8
|
import {NO_RESULT_SET, resultSet} from '../../../foundation/debug/index.mjs';
|
|
9
9
|
import {jsonOut} from '../../../foundation/response/json.mjs';
|
|
10
|
-
import {emit, record, records, section} from '../formatters/index.mjs';
|
|
10
|
+
import {emit, record, records, section, text} from '../formatters/index.mjs';
|
|
11
11
|
import {cliError} from '../lib/cli-error.mjs';
|
|
12
12
|
import {defineCommand} from '../lib/define-command.mjs';
|
|
13
13
|
import {doc as gapReportCommand} from './gap-report.doc.mjs';
|
|
@@ -19,7 +19,7 @@ export function registerGapReport(program) {
|
|
|
19
19
|
fn: gapReportFn,
|
|
20
20
|
action: async (
|
|
21
21
|
/** @type {string|undefined} */ component,
|
|
22
|
-
/** @type {{category?: string, reason?: string, additionalContext?: string, package?: string, confirmPublic?: boolean, listCategories?: boolean}} */ options,
|
|
22
|
+
/** @type {{category?: string, reason?: string, additionalContext?: string, package?: string, confirmPublic?: boolean, listCategories?: boolean, to?: string}} */ options,
|
|
23
23
|
) => {
|
|
24
24
|
/** @type {Awaited<ReturnType<typeof gapReportApi>>} */
|
|
25
25
|
let result;
|
|
@@ -35,6 +35,7 @@ export function registerGapReport(program) {
|
|
|
35
35
|
package: options.package,
|
|
36
36
|
confirmPublic: options.confirmPublic,
|
|
37
37
|
listCategories: options.listCategories,
|
|
38
|
+
to: options.to,
|
|
38
39
|
});
|
|
39
40
|
} catch (error) {
|
|
40
41
|
const err =
|
|
@@ -78,6 +79,9 @@ export function registerGapReport(program) {
|
|
|
78
79
|
section('Gap report categories'),
|
|
79
80
|
records(result.data, {fields: ['value', 'label']}),
|
|
80
81
|
);
|
|
82
|
+
if (result.meta) {
|
|
83
|
+
emit(...destinationBlocks(result.meta.destinations, result.meta.ask));
|
|
84
|
+
}
|
|
81
85
|
return answered;
|
|
82
86
|
}
|
|
83
87
|
|
|
@@ -119,8 +123,26 @@ export function registerGapReport(program) {
|
|
|
119
123
|
);
|
|
120
124
|
}
|
|
121
125
|
|
|
126
|
+
if (result.data.destinations && result.data.ask) {
|
|
127
|
+
emit(...destinationBlocks(result.data.destinations, result.data.ask));
|
|
128
|
+
}
|
|
129
|
+
|
|
122
130
|
if (isFailure) process.exitCode = 1;
|
|
123
131
|
return answered;
|
|
124
132
|
},
|
|
125
133
|
});
|
|
126
134
|
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The destinations a report can go to, then the line telling an agent to ask
|
|
138
|
+
* the person (architecture:cli-surface INV36).
|
|
139
|
+
* @param {import('../../../api/gap-report/gap-report.type.mjs').GapReportDestination[]} destinations
|
|
140
|
+
* @param {string} ask
|
|
141
|
+
*/
|
|
142
|
+
function destinationBlocks(destinations, ask) {
|
|
143
|
+
return [
|
|
144
|
+
section('Destinations'),
|
|
145
|
+
records(destinations, {fields: ['to', 'default', 'issuesUrl']}),
|
|
146
|
+
text(ask),
|
|
147
|
+
];
|
|
148
|
+
}
|
|
@@ -331,3 +331,82 @@ describe('gap-report control docs', () => {
|
|
|
331
331
|
).rejects.toMatchObject({code: 'ERR_INVALID_ARGUMENT'});
|
|
332
332
|
});
|
|
333
333
|
});
|
|
334
|
+
|
|
335
|
+
describe('gap-report destinations in text', () => {
|
|
336
|
+
it('lists the destinations and tells the agent to ask the person', async () => {
|
|
337
|
+
const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'astryx-gap-dest-'));
|
|
338
|
+
try {
|
|
339
|
+
fs.writeFileSync(
|
|
340
|
+
path.join(cwd, 'package.json'),
|
|
341
|
+
JSON.stringify({name: 'fixture-app'}),
|
|
342
|
+
);
|
|
343
|
+
const pkg = path.join(cwd, 'node_modules', '@test', 'widgets');
|
|
344
|
+
fs.mkdirSync(pkg, {recursive: true});
|
|
345
|
+
fs.writeFileSync(
|
|
346
|
+
path.join(pkg, 'package.json'),
|
|
347
|
+
JSON.stringify({name: '@test/widgets', version: '1.0.0'}),
|
|
348
|
+
);
|
|
349
|
+
fs.writeFileSync(
|
|
350
|
+
path.join(pkg, 'astryx.integration.mjs'),
|
|
351
|
+
"export default {issuesUrl: 'https://tracker.example/widgets'};\n",
|
|
352
|
+
);
|
|
353
|
+
fs.writeFileSync(
|
|
354
|
+
path.join(cwd, 'astryx.config.mjs'),
|
|
355
|
+
`export default {
|
|
356
|
+
integrations: ['@test/widgets'],
|
|
357
|
+
gapReport: {audience: 'internal', handle: () => ({status: 'filed', message: 'shared'})},
|
|
358
|
+
};\n`,
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
const listed = await runCli(['gap-report', '--list-categories'], {cwd});
|
|
362
|
+
expect(listed.status).toBe(0);
|
|
363
|
+
expect(listed.stdout).toContain('Destinations');
|
|
364
|
+
expect(listed.stdout).toMatch(/^default:\s+true$/m);
|
|
365
|
+
expect(listed.stdout).toMatch(/^to:\s+@test\/widgets$/m);
|
|
366
|
+
expect(listed.stdout).toMatch(
|
|
367
|
+
/^issuesUrl:\s+https:\/\/tracker\.example\/widgets$/m,
|
|
368
|
+
);
|
|
369
|
+
expect(listed.stdout).toMatch(/ask the person/i);
|
|
370
|
+
|
|
371
|
+
const filed = await runCli(
|
|
372
|
+
[
|
|
373
|
+
'gap-report',
|
|
374
|
+
'Button',
|
|
375
|
+
'--category',
|
|
376
|
+
'docs_gap',
|
|
377
|
+
'--reason',
|
|
378
|
+
'Need a keyboard example',
|
|
379
|
+
],
|
|
380
|
+
{cwd},
|
|
381
|
+
);
|
|
382
|
+
expect(filed.status).toBe(0);
|
|
383
|
+
expect(filed.stdout).toContain('Destinations');
|
|
384
|
+
expect(filed.stdout).toMatch(/ask the person/i);
|
|
385
|
+
|
|
386
|
+
const chosen = await runCli(
|
|
387
|
+
[
|
|
388
|
+
'gap-report',
|
|
389
|
+
'Button',
|
|
390
|
+
'--category',
|
|
391
|
+
'docs_gap',
|
|
392
|
+
'--reason',
|
|
393
|
+
'Need a keyboard example',
|
|
394
|
+
'--to',
|
|
395
|
+
'@test/widgets',
|
|
396
|
+
'--json',
|
|
397
|
+
],
|
|
398
|
+
{cwd},
|
|
399
|
+
);
|
|
400
|
+
expect(chosen.status).toBe(0);
|
|
401
|
+
expect(JSON.parse(chosen.stdout).data.deliveries).toEqual([
|
|
402
|
+
expect.objectContaining({
|
|
403
|
+
handler: 'issuesUrl',
|
|
404
|
+
status: 'routed_only',
|
|
405
|
+
url: 'https://tracker.example/widgets',
|
|
406
|
+
}),
|
|
407
|
+
]);
|
|
408
|
+
} finally {
|
|
409
|
+
fs.rmSync(cwd, {recursive: true, force: true});
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
});
|
|
@@ -11,17 +11,17 @@ import {
|
|
|
11
11
|
formatHookCompact,
|
|
12
12
|
formatHookBrief,
|
|
13
13
|
formatHookParams,
|
|
14
|
-
} from '
|
|
15
|
-
import {getCliInvocation} from '
|
|
16
|
-
import {jsonOut} from '
|
|
17
|
-
import {emit, section, text, list, records, code, record} from '
|
|
18
|
-
import {cliError} from '
|
|
19
|
-
import {defineCommand} from '
|
|
20
|
-
import {resultSet} from '
|
|
21
|
-
import {ERROR_CODES} from '
|
|
22
|
-
import {hook as hookApi} from '
|
|
23
|
-
import {doc as hookCommand} from '
|
|
24
|
-
import {doc as hookFn} from '
|
|
14
|
+
} from '../lib/hook-format.mjs';
|
|
15
|
+
import {getCliInvocation} from '../../../foundation/env/package-manager.mjs';
|
|
16
|
+
import {jsonOut} from '../../../foundation/response/json.mjs';
|
|
17
|
+
import {emit, section, text, list, records, code, record} from '../formatters/index.mjs';
|
|
18
|
+
import {cliError} from '../lib/cli-error.mjs';
|
|
19
|
+
import {defineCommand} from '../lib/define-command.mjs';
|
|
20
|
+
import {resultSet} from '../../../foundation/debug/index.mjs';
|
|
21
|
+
import {ERROR_CODES} from '../../../foundation/response/error-codes.mjs';
|
|
22
|
+
import {hook as hookApi} from '../../../api/hook/hook.mjs';
|
|
23
|
+
import {doc as hookCommand} from './hook.doc.mjs';
|
|
24
|
+
import {doc as hookFn} from '../../../api/hook/hook.doc.mjs';
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* The api layer's hook() widens its return to `{type: string, data: unknown}`,
|
|
@@ -29,9 +29,9 @@ import {doc as hookFn} from '../../../../api/hook/hook.doc.mjs';
|
|
|
29
29
|
* the colocated api/hook/hook.type.mjs to get narrowing + typed data.
|
|
30
30
|
*
|
|
31
31
|
* @typedef {(
|
|
32
|
-
* | import('
|
|
33
|
-
* | import('
|
|
34
|
-
* | import('
|
|
32
|
+
* | import('../../../api/hook/hook.type.mjs').HookListResponse
|
|
33
|
+
* | import('../../../api/hook/hook.type.mjs').HookDetailResponse
|
|
34
|
+
* | import('../../../api/hook/hook.type.mjs').HookDetailParamsResponse
|
|
35
35
|
* )} HookResult
|
|
36
36
|
*/
|
|
37
37
|
|
|
@@ -40,7 +40,7 @@ import {doc as hookFn} from '../../../../api/hook/hook.doc.mjs';
|
|
|
40
40
|
* count is every hook across the groups — names or docs, depending on detail.
|
|
41
41
|
*
|
|
42
42
|
* @param {HookResult} result
|
|
43
|
-
* @returns {import('
|
|
43
|
+
* @returns {import('../../../foundation/debug/command-result.mjs').CommandResult}
|
|
44
44
|
*/
|
|
45
45
|
function summarize(result) {
|
|
46
46
|
if (result.type === 'hook.list') {
|
|
@@ -90,7 +90,7 @@ export function registerHook(program) {
|
|
|
90
90
|
lang, zh,
|
|
91
91
|
}));
|
|
92
92
|
} catch (e) {
|
|
93
|
-
const err = /** @type {import('
|
|
93
|
+
const err = /** @type {import('../../../api/error.mjs').AstryxError} */ (e);
|
|
94
94
|
return cliError(err.message, {suggestions: err.suggestions, code: err.code});
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -112,7 +112,7 @@ export function registerHook(program) {
|
|
|
112
112
|
// The whole view is one markdown document: a `## <category>` heading
|
|
113
113
|
// over each category's concatenated hook docs.
|
|
114
114
|
const groups = result.data.components;
|
|
115
|
-
/** @type {import('
|
|
115
|
+
/** @type {import('../formatters/index.mjs').Block[]} */
|
|
116
116
|
const out = [];
|
|
117
117
|
for (const [cat, items] of Object.entries(groups)) {
|
|
118
118
|
const body = items
|
|
@@ -130,7 +130,7 @@ export function registerHook(program) {
|
|
|
130
130
|
// --detail compact — one record (name + description) per hook,
|
|
131
131
|
// grouped by category.
|
|
132
132
|
const groups = result.data.components;
|
|
133
|
-
/** @type {import('
|
|
133
|
+
/** @type {import('../formatters/index.mjs').Block[]} */
|
|
134
134
|
const out = [];
|
|
135
135
|
for (const [cat, items] of Object.entries(groups)) {
|
|
136
136
|
out.push(section(cat), records(items, {fields: ['name', 'description']}));
|
|
@@ -147,7 +147,7 @@ export function registerHook(program) {
|
|
|
147
147
|
const [cat, hookNames] = Object.entries(groups)[0];
|
|
148
148
|
emit(section(`${cat}:`), list(hookNames));
|
|
149
149
|
} else {
|
|
150
|
-
/** @type {import('
|
|
150
|
+
/** @type {import('../formatters/index.mjs').Block[]} */
|
|
151
151
|
const out = [];
|
|
152
152
|
for (const [category, hookNames] of Object.entries(groups)) {
|
|
153
153
|
out.push(section(category), list(hookNames));
|
|
@@ -197,12 +197,12 @@ export function registerHook(program) {
|
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
// Re-export lib functions for external consumers
|
|
200
|
-
export {discoverHooks, findHookDoc, getAllHookNames} from '
|
|
201
|
-
export {loadDocs} from '
|
|
200
|
+
export {discoverHooks, findHookDoc, getAllHookNames} from '../../../foundation/discovery/hook-discovery.mjs';
|
|
201
|
+
export {loadDocs} from '../../../foundation/discovery/component-loader.mjs';
|
|
202
202
|
export {
|
|
203
203
|
formatHookFull,
|
|
204
204
|
formatHookCompact,
|
|
205
205
|
formatHookBrief,
|
|
206
206
|
formatHookBriefAll,
|
|
207
207
|
formatHookParams,
|
|
208
|
-
} from '
|
|
208
|
+
} from '../lib/hook-format.mjs';
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
resolveImportPath,
|
|
22
22
|
discoverComponents,
|
|
23
23
|
findComponentSource,
|
|
24
|
-
} from './component
|
|
24
|
+
} from './component.mjs';
|
|
25
25
|
import {findCoreDir} from '../../../foundation/fs/paths.mjs';
|
|
26
26
|
import {runCli} from '../../../test-utils/run-cli.mjs';
|
|
27
27
|
|
|
@@ -39,6 +39,11 @@ const exists = rel => fs.existsSync(path.join(tmpDir, rel));
|
|
|
39
39
|
|
|
40
40
|
describe('astryx init — default (no flags)', () => {
|
|
41
41
|
it('installs the tool-agnostic AGENTS.md cheat sheet and prints next steps', async () => {
|
|
42
|
+
// Inside a project; outside one the steps are left out (outside-project.test.mjs).
|
|
43
|
+
fs.writeFileSync(
|
|
44
|
+
path.join(tmpDir, 'package.json'),
|
|
45
|
+
'{"name":"app","dependencies":{"@astryxdesign/core":"*"}}',
|
|
46
|
+
);
|
|
42
47
|
const {status, stdout} = await runCli(['init'], {cwd: tmpDir});
|
|
43
48
|
expect(status).toBe(0);
|
|
44
49
|
expect(exists('AGENTS.md')).toBe(true);
|
|
@@ -65,10 +70,12 @@ describe('astryx init — default (no flags)', () => {
|
|
|
65
70
|
});
|
|
66
71
|
|
|
67
72
|
describe('astryx init --features', () => {
|
|
68
|
-
it('--features agents writes AGENTS.md
|
|
73
|
+
it('--features agents writes AGENTS.md and the GEMINI.md import of it', async () => {
|
|
69
74
|
const {status} = await runCli(['init', '--features', 'agents'], {cwd: tmpDir});
|
|
70
75
|
expect(status).toBe(0);
|
|
71
76
|
expect(exists('AGENTS.md')).toBe(true);
|
|
77
|
+
expect(read('GEMINI.md')).toBe(`${MARKER_START}\n@./AGENTS.md\n<!-- ASTRYX:END -->\n`);
|
|
78
|
+
expect(exists('theme.template.ts')).toBe(false);
|
|
72
79
|
});
|
|
73
80
|
|
|
74
81
|
it('--features theme writes the annotated theme template', async () => {
|
|
@@ -121,7 +128,234 @@ describe('astryx init --agent <preset>', () => {
|
|
|
121
128
|
});
|
|
122
129
|
});
|
|
123
130
|
|
|
131
|
+
describe('astryx init from a subfolder', () => {
|
|
132
|
+
/** @param {string} dir */
|
|
133
|
+
const astryxProject = dir =>
|
|
134
|
+
fs.writeFileSync(
|
|
135
|
+
path.join(dir, 'package.json'),
|
|
136
|
+
JSON.stringify({name: 'app', dependencies: {'@astryxdesign/core': '0.7.0'}}),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
it('writes the agent docs at the project root and reports them from where it ran', async () => {
|
|
140
|
+
astryxProject(tmpDir);
|
|
141
|
+
const sub = path.join(tmpDir, 'src', 'app');
|
|
142
|
+
fs.mkdirSync(sub, {recursive: true});
|
|
143
|
+
|
|
144
|
+
const json = await runCli(['init', '--json'], {cwd: sub});
|
|
145
|
+
expect(json.status).toBe(0);
|
|
146
|
+
expect(JSON.parse(json.stdout).data.docsWritten).toEqual([
|
|
147
|
+
'../../AGENTS.md',
|
|
148
|
+
'../../GEMINI.md',
|
|
149
|
+
]);
|
|
150
|
+
expect(read('AGENTS.md')).toContain(MARKER_START);
|
|
151
|
+
expect(fs.readdirSync(sub)).toEqual([]);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('keeps --agent-docs-path relative to where it ran', async () => {
|
|
155
|
+
astryxProject(tmpDir);
|
|
156
|
+
const sub = path.join(tmpDir, 'docs');
|
|
157
|
+
fs.mkdirSync(sub);
|
|
158
|
+
|
|
159
|
+
const json = await runCli(['init', '--agent-docs-path', 'AI.md', '--json'], {cwd: sub});
|
|
160
|
+
expect(JSON.parse(json.stdout).data.docsWritten).toEqual(['AI.md']);
|
|
161
|
+
expect(fs.readFileSync(path.join(sub, 'AI.md'), 'utf8')).toContain(MARKER_START);
|
|
162
|
+
expect(exists('AGENTS.md')).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('astryx init in the home folder', () => {
|
|
167
|
+
const saved = {HOME: process.env.HOME, USERPROFILE: process.env.USERPROFILE};
|
|
168
|
+
const personal = '# My notes\n\nAlways use tabs.\n';
|
|
169
|
+
|
|
170
|
+
beforeEach(() => {
|
|
171
|
+
process.env.HOME = tmpDir;
|
|
172
|
+
process.env.USERPROFILE = tmpDir;
|
|
173
|
+
fs.mkdirSync(path.join(tmpDir, '.claude'), {recursive: true});
|
|
174
|
+
fs.writeFileSync(path.join(tmpDir, '.claude', 'CLAUDE.md'), personal);
|
|
175
|
+
});
|
|
176
|
+
afterEach(() => {
|
|
177
|
+
for (const [key, value] of Object.entries(saved)) {
|
|
178
|
+
if (value === undefined) delete process.env[key];
|
|
179
|
+
else process.env[key] = value;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('writes no agent docs, says why, and keeps the soft-failure exit code', async () => {
|
|
184
|
+
const json = await runCli(['init', '--json'], {cwd: tmpDir});
|
|
185
|
+
expect(json.status).toBe(0);
|
|
186
|
+
const env = JSON.parse(json.stdout);
|
|
187
|
+
expect(env.data.docsWritten).toEqual([]);
|
|
188
|
+
expect(env.data.docsError).toEqual({
|
|
189
|
+
kind: 'install-failed',
|
|
190
|
+
message: expect.stringMatching(/not written into the home folder/),
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const text = await runCli(['init'], {cwd: tmpDir});
|
|
194
|
+
expect(text.status).toBe(0);
|
|
195
|
+
expect(text.stderr).toMatch(/not written into the home folder/);
|
|
196
|
+
expect(text.stderr).not.toMatch(/Error:/);
|
|
197
|
+
|
|
198
|
+
expect(read('.claude/CLAUDE.md')).toBe(personal);
|
|
199
|
+
expect(fs.readdirSync(tmpDir)).toEqual(['.claude']);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('does not let a package.json in the home folder pull the docs there', async () => {
|
|
203
|
+
fs.writeFileSync(
|
|
204
|
+
path.join(tmpDir, 'package.json'),
|
|
205
|
+
JSON.stringify({dependencies: {'@astryxdesign/core': '0.7.0'}}),
|
|
206
|
+
);
|
|
207
|
+
const scratch = path.join(tmpDir, 'scratch');
|
|
208
|
+
fs.mkdirSync(scratch);
|
|
209
|
+
|
|
210
|
+
const json = await runCli(['init', '--json'], {cwd: scratch});
|
|
211
|
+
expect(json.status).toBe(0);
|
|
212
|
+
expect(JSON.parse(json.stdout).data.docsWritten).toEqual(['AGENTS.md', 'GEMINI.md']);
|
|
213
|
+
expect(fs.existsSync(path.join(scratch, 'AGENTS.md'))).toBe(true);
|
|
214
|
+
expect(exists('AGENTS.md')).toBe(false);
|
|
215
|
+
expect(read('.claude/CLAUDE.md')).toBe(personal);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('--remove-agents in a folder in home never reaches the home folder', async () => {
|
|
219
|
+
fs.writeFileSync(
|
|
220
|
+
path.join(tmpDir, '.claude', 'CLAUDE.md'),
|
|
221
|
+
`${personal}\n<!-- ASTRYX:START -->\nAstryx v0.7.0\n<!-- ASTRYX:END -->\n`,
|
|
222
|
+
);
|
|
223
|
+
fs.writeFileSync(
|
|
224
|
+
path.join(tmpDir, 'package.json'),
|
|
225
|
+
JSON.stringify({dependencies: {'@astryxdesign/core': '0.7.0'}}),
|
|
226
|
+
);
|
|
227
|
+
const scratch = path.join(tmpDir, 'scratch');
|
|
228
|
+
fs.mkdirSync(scratch);
|
|
229
|
+
|
|
230
|
+
const json = await runCli(['init', '--remove-agents', '--json'], {cwd: scratch});
|
|
231
|
+
expect(JSON.parse(json.stdout).data.removed).toBe(false);
|
|
232
|
+
expect(read('.claude/CLAUDE.md')).toContain('<!-- ASTRYX:START -->');
|
|
233
|
+
|
|
234
|
+
// Run in the home folder itself, it still removes the block there.
|
|
235
|
+
const home = await runCli(['init', '--remove-agents', '--json'], {cwd: tmpDir});
|
|
236
|
+
expect(JSON.parse(home.stdout).data.removed).toBe(true);
|
|
237
|
+
expect(read('.claude/CLAUDE.md')).toBe(personal);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it.each(['.gemini', '.claude'])('refuses the settings folder ~/%s', async folder => {
|
|
241
|
+
const dir = path.join(tmpDir, folder);
|
|
242
|
+
fs.mkdirSync(dir, {recursive: true});
|
|
243
|
+
const before = fs.readdirSync(dir);
|
|
244
|
+
|
|
245
|
+
const json = await runCli(['init', '--json'], {cwd: dir});
|
|
246
|
+
expect(json.status).toBe(0);
|
|
247
|
+
const env = JSON.parse(json.stdout);
|
|
248
|
+
expect(env.data.docsWritten).toEqual([]);
|
|
249
|
+
expect(env.data.docsError.message).toMatch(/settings folder in it outside a project/);
|
|
250
|
+
expect(fs.readdirSync(dir)).toEqual(before);
|
|
251
|
+
expect(read('.claude/CLAUDE.md')).toBe(personal);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
describe('astryx init in an agent worktree inside a home settings folder', () => {
|
|
256
|
+
const saved = {HOME: process.env.HOME, USERPROFILE: process.env.USERPROFILE};
|
|
257
|
+
|
|
258
|
+
beforeEach(() => {
|
|
259
|
+
process.env.HOME = tmpDir;
|
|
260
|
+
process.env.USERPROFILE = tmpDir;
|
|
261
|
+
});
|
|
262
|
+
afterEach(() => {
|
|
263
|
+
for (const [key, value] of Object.entries(saved)) {
|
|
264
|
+
if (value === undefined) delete process.env[key];
|
|
265
|
+
else process.env[key] = value;
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
it.each([
|
|
270
|
+
['Codex', path.join('.codex', 'worktrees', 'a1b2c3', 'web')],
|
|
271
|
+
['Cursor', path.join('.cursor', 'worktrees', 'web', 'x9y8')],
|
|
272
|
+
])('writes at the project root of a %s worktree', async (_tool, rel) => {
|
|
273
|
+
const project = path.join(tmpDir, rel);
|
|
274
|
+
fs.mkdirSync(path.join(project, 'src'), {recursive: true});
|
|
275
|
+
fs.writeFileSync(path.join(project, '.git'), 'gitdir: /elsewhere/.git/worktrees/web\n');
|
|
276
|
+
fs.writeFileSync(
|
|
277
|
+
path.join(project, 'package.json'),
|
|
278
|
+
JSON.stringify({name: 'web', dependencies: {'@astryxdesign/core': '0.7.0'}}),
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
const json = await runCli(['init', '--json'], {cwd: path.join(project, 'src')});
|
|
282
|
+
expect(json.status).toBe(0);
|
|
283
|
+
const env = JSON.parse(json.stdout);
|
|
284
|
+
expect(env.data.docsWritten).toEqual(['../AGENTS.md', '../GEMINI.md']);
|
|
285
|
+
expect(env.data.docsError).toBeNull();
|
|
286
|
+
|
|
287
|
+
const explicit = await runCli(['init', '--agent-docs-path', 'AI.md', '--json'], {
|
|
288
|
+
cwd: path.join(project, 'src'),
|
|
289
|
+
});
|
|
290
|
+
expect(JSON.parse(explicit.stdout).data.docsWritten).toEqual(['AI.md']);
|
|
291
|
+
|
|
292
|
+
// Nothing reaches the settings folder itself.
|
|
293
|
+
const settings = path.join(tmpDir, rel.split(path.sep)[0]);
|
|
294
|
+
expect(fs.readdirSync(settings)).toEqual(['worktrees']);
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
describe('astryx init and the project root', () => {
|
|
299
|
+
it('writes where it runs when no folder above has a package.json, as before', async () => {
|
|
300
|
+
const notes = path.join(tmpDir, 'notes');
|
|
301
|
+
fs.mkdirSync(notes);
|
|
302
|
+
|
|
303
|
+
const json = await runCli(['init', '--json'], {cwd: notes});
|
|
304
|
+
expect(json.status).toBe(0);
|
|
305
|
+
const env = JSON.parse(json.stdout);
|
|
306
|
+
expect(env.data.docsWritten).toEqual(['AGENTS.md', 'GEMINI.md']);
|
|
307
|
+
expect(env.data.docsError).toBeNull();
|
|
308
|
+
expect(fs.readdirSync(notes).sort()).toEqual(['AGENTS.md', 'GEMINI.md']);
|
|
309
|
+
expect(fs.readdirSync(tmpDir)).toEqual(['notes']);
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it('writes at the project root that declares Astryx, past a nested package that does not', async () => {
|
|
313
|
+
fs.writeFileSync(
|
|
314
|
+
path.join(tmpDir, 'package.json'),
|
|
315
|
+
JSON.stringify({name: 'app', dependencies: {'@astryxdesign/core': '0.7.0'}}),
|
|
316
|
+
);
|
|
317
|
+
const functions = path.join(tmpDir, 'functions');
|
|
318
|
+
fs.mkdirSync(path.join(functions, 'src'), {recursive: true});
|
|
319
|
+
fs.writeFileSync(path.join(functions, 'package.json'), '{"name":"functions"}\n');
|
|
320
|
+
|
|
321
|
+
const json = await runCli(['init', '--json'], {cwd: path.join(functions, 'src')});
|
|
322
|
+
expect(JSON.parse(json.stdout).data.docsWritten).toEqual([
|
|
323
|
+
'../../AGENTS.md',
|
|
324
|
+
'../../GEMINI.md',
|
|
325
|
+
]);
|
|
326
|
+
expect(fs.readdirSync(functions).sort()).toEqual(['package.json', 'src']);
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
|
|
124
330
|
describe('astryx init --remove-agents', () => {
|
|
331
|
+
it('run in a subfolder, removes what init wrote at the project root, with the same JSON shape', async () => {
|
|
332
|
+
fs.writeFileSync(
|
|
333
|
+
path.join(tmpDir, 'package.json'),
|
|
334
|
+
JSON.stringify({name: 'app', dependencies: {'@astryxdesign/core': '0.7.0'}}),
|
|
335
|
+
);
|
|
336
|
+
const sub = path.join(tmpDir, 'src', 'app');
|
|
337
|
+
fs.mkdirSync(sub, {recursive: true});
|
|
338
|
+
await runCli(['init'], {cwd: sub});
|
|
339
|
+
expect(exists('AGENTS.md')).toBe(true);
|
|
340
|
+
|
|
341
|
+
const text = await runCli(['init', '--remove-agents'], {cwd: sub});
|
|
342
|
+
expect(text.status).toBe(0);
|
|
343
|
+
expect(text.stdout).toMatch(/Removed empty \.\.\/\.\.\/AGENTS\.md/);
|
|
344
|
+
expect(exists('AGENTS.md')).toBe(false);
|
|
345
|
+
expect(exists('GEMINI.md')).toBe(false);
|
|
346
|
+
|
|
347
|
+
await runCli(['init'], {cwd: sub});
|
|
348
|
+
const json = await runCli(['init', '--remove-agents', '--json'], {cwd: sub});
|
|
349
|
+
expect(json.status).toBe(0);
|
|
350
|
+
// meta.answeredBy names the release that answered (spec AST-081).
|
|
351
|
+
expect(JSON.parse(json.stdout)).toEqual({
|
|
352
|
+
apiVersion: 1,
|
|
353
|
+
type: 'init.remove',
|
|
354
|
+
data: {removed: true},
|
|
355
|
+
meta: {answeredBy: expect.any(Object)},
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
|
|
125
359
|
it('removes the Astryx section it previously installed', async () => {
|
|
126
360
|
await runCli(['init', '--features', 'agents'], {cwd: tmpDir});
|
|
127
361
|
expect(exists('AGENTS.md')).toBe(true);
|
|
@@ -16,10 +16,29 @@ export const doc = {
|
|
|
16
16
|
summary: 'Initialize the design system in your project',
|
|
17
17
|
description:
|
|
18
18
|
'Non-interactive project setup (no prompts, so it behaves the same for humans, ' +
|
|
19
|
-
'agents, and CI). By default it
|
|
20
|
-
'
|
|
21
|
-
|
|
22
|
-
'
|
|
19
|
+
'agents, and CI). By default it writes the agent-docs block, including guidance ' +
|
|
20
|
+
'from configured integrations, to AGENTS.md and to the Claude Code file the project ' +
|
|
21
|
+
'has (CLAUDE.md, else .claude/CLAUDE.md; when CLAUDE.md exists, a block in ' +
|
|
22
|
+
'.claude/CLAUDE.md is removed, unless the project ignores CLAUDE.md, in which case a .claude/CLAUDE.md the ' +
|
|
23
|
+
'project commits keeps a copy), and a one-line import of AGENTS.md to GEMINI.md ' +
|
|
24
|
+
'unless GEMINI.md already imports it. It then prints getting-started steps. Agent ' +
|
|
25
|
+
'docs go to the project root: the nearest folder at or above this one whose ' +
|
|
26
|
+
'package.json declares an @astryxdesign package, else the nearest with any ' +
|
|
27
|
+
'package.json, else this folder. The search stops at a repository root and never ' +
|
|
28
|
+
'counts the home folder. In the home folder, or in a settings folder in it ' +
|
|
29
|
+
'such as ~/.gemini outside a project, no agent docs are written. Every folder of the ' +
|
|
30
|
+
'home folder whose name starts with a dot is a settings folder, and such a folder ' +
|
|
31
|
+
'itself never counts as a project, even with a package.json; a project inside one, ' +
|
|
32
|
+
'such as an agent worktree with its own package.json, works. The managed block is ' +
|
|
33
|
+
'written whatever ignore rules or generated markers say; the text around it is never changed. ' +
|
|
34
|
+
'--features and --all print only ' +
|
|
35
|
+
"the chosen features' " +
|
|
36
|
+
'guidance (no getting-started steps); the theme feature also writes an annotated theme template. ' +
|
|
37
|
+
'Outside a project it writes the same files but prints no step that sets up a project: ' +
|
|
38
|
+
'no getting-started steps, and no step that adds a theme to an app. ' +
|
|
39
|
+
'--user writes the computer-level agent text instead (see the flag), in any folder, and touches nothing in the folder. ' +
|
|
40
|
+
'The CLI installed for the computer also keeps that text current in the background, unless --user --remove-agents turned it off; ' +
|
|
41
|
+
'package install scripts, project setup, and upgrade never write it.',
|
|
23
42
|
fn: 'init',
|
|
24
43
|
options: [
|
|
25
44
|
{
|
|
@@ -39,19 +58,35 @@ export const doc = {
|
|
|
39
58
|
flag: '--remove-agents',
|
|
40
59
|
param: 'options.removeAgents',
|
|
41
60
|
description:
|
|
42
|
-
'Remove the managed block from AGENTS.md, CLAUDE.md, .claude/CLAUDE.md, .cursorrules, .hermes.md and HERMES.md ' +
|
|
43
|
-
|
|
61
|
+
'Remove the managed block from AGENTS.md, CLAUDE.md, .claude/CLAUDE.md, GEMINI.md, .cursorrules, .hermes.md and HERMES.md, ' +
|
|
62
|
+
'at the project root (where init writes them) and in this folder ' +
|
|
63
|
+
"(deleting AGENTS.md or .claude/CLAUDE.md when only init's heading is left, and GEMINI.md when nothing is left) and do nothing else. " +
|
|
64
|
+
'Below the project root, a project-root agent file whose block resolves outside the project is left as it is, with a note. ' +
|
|
44
65
|
'--features, --all, --agent and --agent-docs-path are refused; a file written with --agent-docs-path keeps its block',
|
|
45
66
|
},
|
|
67
|
+
{
|
|
68
|
+
flag: '--user',
|
|
69
|
+
param: 'options.user',
|
|
70
|
+
description:
|
|
71
|
+
'Write or refresh the computer-level agent text instead of setting up the folder: one skill file, ~/.agents/skills/astryx/SKILL.md, which most coding agents read, ' +
|
|
72
|
+
'linked into the skill folders of agents that read only their own (~/.claude/skills always; Kiro, Windsurf, Letta, Xcode\'s coding assistant, and ~/.config/agents/skills when that folder exists): a folder symlink with a relative target, a junction on Windows, or a copy where neither can be made. Continue, whose scanner skips links, gets a managed copy, refreshed with the file. ' +
|
|
73
|
+
"It tells agents anywhere on the computer that Astryx is there, when it is relevant, and to start with `astryx search`. " +
|
|
74
|
+
'Records the links it made in astryx/settings.json in the per-user configuration folder, so removal removes exactly those; the CLI installed for the computer refreshes the file in the background after each upgrade. ' +
|
|
75
|
+
'Works in any folder. A file without the Astryx markers, one edited since Astryx wrote it, or a symlink, is kept as it is, and so is anything at a link target that Astryx did not create. ' +
|
|
76
|
+
'Warns, and still writes, when no `astryx` command on the computer runs the Astryx CLI. ' +
|
|
77
|
+
'With --remove-agents it removes the file, the links, and the copy instead and records that the text is turned off. --features, --all, --agent and --agent-docs-path are refused',
|
|
78
|
+
},
|
|
46
79
|
{
|
|
47
80
|
flag: '--agent <tool>',
|
|
48
81
|
param: 'options.agent',
|
|
49
82
|
choices: ['claude', 'cursor', 'codex', 'hermes', 'muse', 'all'],
|
|
50
83
|
description:
|
|
51
84
|
'Target AI tool for agent docs: claude (CLAUDE.md or .claude/CLAUDE.md, else creates .claude/CLAUDE.md), cursor (.cursorrules if present, else AGENTS.md), ' +
|
|
52
|
-
'codex and muse (AGENTS.md), hermes (.hermes.md or HERMES.md if present, else AGENTS.md), all (every existing agent doc
|
|
85
|
+
'codex and muse (AGENTS.md), hermes (.hermes.md or HERMES.md if present, else AGENTS.md), all (every existing agent doc except GEMINI.md, which keeps its ' +
|
|
86
|
+
'one-line import of AGENTS.md, else AGENTS.md and .claude/CLAUDE.md). With claude and all, when CLAUDE.md gets the block, .claude/CLAUDE.md gets none and ' +
|
|
87
|
+
'a block already there is removed, unless the project ignores CLAUDE.md: then a .claude/CLAUDE.md the project commits gets a copy too, with claude and all alike. ' +
|
|
53
88
|
'An unknown tool exits 1 with ERR_UNKNOWN_AGENT. ' +
|
|
54
|
-
|
|
89
|
+
'Used only when agent docs are installed (the default, --all, or --features agents); --agent-docs-path takes precedence.',
|
|
55
90
|
},
|
|
56
91
|
{
|
|
57
92
|
flag: '--agent-docs-path <path...>',
|
|
@@ -59,6 +94,7 @@ export const doc = {
|
|
|
59
94
|
description:
|
|
60
95
|
'Explicit file path(s) for agent docs, inside the project; takes precedence over --agent. ' +
|
|
61
96
|
'If any path is outside the project, no agent docs are written and the command exits 1. ' +
|
|
97
|
+
'A path in the home folder itself, or in a settings folder in it outside a project (such as ~/.claude or ~/.claude/hooks), is refused with a note (exit 0), and nothing is written. ' +
|
|
62
98
|
'Used only when agent docs are installed',
|
|
63
99
|
},
|
|
64
100
|
],
|
|
@@ -66,16 +102,25 @@ export const doc = {
|
|
|
66
102
|
{label: 'Default setup', cli: 'astryx init'},
|
|
67
103
|
{label: 'All features, no prompts', cli: 'astryx init --all'},
|
|
68
104
|
{label: 'Machine-readable receipt', cli: 'astryx init --json'},
|
|
105
|
+
{label: 'Agent text for the whole computer', cli: 'astryx init --user'},
|
|
106
|
+
{label: 'Remove the computer-level agent text and turn it off', cli: 'astryx init --user --remove-agents'},
|
|
69
107
|
],
|
|
108
|
+
outsideProject: 'own',
|
|
70
109
|
exitCodes: [
|
|
71
110
|
{
|
|
72
111
|
code: 0,
|
|
73
|
-
when:
|
|
112
|
+
when: "success, including agent docs left unwritten in five soft cases, each reported as docsError with one note: running in the home folder, or in a settings folder in it outside a project; a GEMINI.md that resolves outside the project; when init runs below the project root, a project-root agent file that resolves outside the project; the project's Claude Code file (root CLAUDE.md, or .claude/CLAUDE.md when there is no root one) when it resolves outside the project and is a block-less import of an existing AGENTS.md, which 0.7.1 left alone; and a .claude/CLAUDE.md that resolves outside the project and that 0.7.1 did not write: beside a CLAUDE.md the project ignores, the one --agent claude adds or a block-less import of an existing AGENTS.md; with --agent claude beside a CLAUDE.md, one whose block it would remove",
|
|
74
113
|
},
|
|
75
114
|
{
|
|
76
115
|
code: 1,
|
|
77
|
-
when: 'an unknown --agent or feature, an --agent-docs-path outside the project, --remove-agents combined with install options, or --all with --features (ERR_INVALID_ARGUMENT)',
|
|
116
|
+
when: 'an unknown --agent (ERR_UNKNOWN_AGENT) or feature, an --agent-docs-path outside the project, --remove-agents combined with install options, --user combined with --features, --all, --agent or --agent-docs-path, or --all with --features (ERR_INVALID_ARGUMENT); or, when init runs at the project root, an agent file 0.7.1 also wrote there that resolves outside the project (ERR_PATH_TRAVERSAL, docsError path-safety, nothing written)',
|
|
78
117
|
},
|
|
79
118
|
],
|
|
80
119
|
related: ['doctor', 'upgrade', 'build', 'theme'],
|
|
120
|
+
notes: [
|
|
121
|
+
{
|
|
122
|
+
type: 'prose',
|
|
123
|
+
text: "In global mode: outside a project, init writes the agent docs (AGENTS.md) into the folder and prints no getting-started steps. `init --user` writes the agent guide for your computer, in any folder, and is never handed to a project's own CLI. In a project, the project's version of Astryx runs it, whichever astryx command you start. See {@link namespace:global} and {@link generic:computer-agent-guide}.",
|
|
124
|
+
},
|
|
125
|
+
],
|
|
81
126
|
};
|
|
@@ -67,6 +67,7 @@ describe('astryx init flag interactions', () => {
|
|
|
67
67
|
expect(help).toContain(file);
|
|
68
68
|
}
|
|
69
69
|
expect(help).toMatch(/--agent-docs-path are refused/);
|
|
70
|
+
expect(help).toMatch(/at the project root \(where init writes them\) and in this folder/);
|
|
70
71
|
|
|
71
72
|
await initJson(['--agent-docs-path', 'docs/AI.md']);
|
|
72
73
|
await initJson([]);
|