@astryxdesign/cli 0.7.2-canary.fdd384f → 0.7.2
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 +169 -149
- package/api/build/_adapter.d.mts +8 -0
- package/api/build/_adapter.mjs +12 -1
- package/api/build/build.doc.mjs +4 -0
- package/api/build/kit/kit.mjs +3 -11
- package/api/component/_adapter.d.mts +31 -0
- package/api/component/_adapter.mjs +119 -11
- package/api/component/component.doc.mjs +6 -1
- package/api/component/component.mjs +60 -10
- package/api/component/doc-links.test.mjs +386 -0
- package/api/discover/_adapter.d.mts +132 -12
- package/api/discover/_adapter.mjs +488 -27
- package/api/discover/_adapter.test.mjs +599 -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 +121 -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 +63 -0
- package/api/docs/_adapter.mjs +312 -18
- package/api/docs/docs.doc.mjs +2 -1
- package/api/docs/docs.mjs +2 -1
- package/api/docs/docs.test.mjs +5 -2
- package/api/docs/integration-tree.test.mjs +22 -0
- package/api/docs/list/list.mjs +12 -2
- package/api/docs/reference-blocks.test.mjs +1 -3
- package/api/doctor/_adapter.d.mts +108 -0
- package/api/doctor/_adapter.mjs +223 -4
- package/api/doctor/doctor.d.mts +199 -0
- package/api/doctor/doctor.doc.mjs +3 -2
- package/api/doctor/doctor.mjs +530 -34
- package/api/doctor/doctor.test.mjs +180 -14
- package/api/doctor/release-checks.test.mjs +156 -0
- package/api/doctor/theme-checks.mjs +16 -3
- 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 +152 -48
- 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/list/list.d.mts +1 -1
- 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 +28 -7
- package/api/init/init.mjs +28 -4
- package/api/init/init.type.d.mts +48 -3
- package/api/init/init.type.mjs +37 -3
- package/api/init/run/run.d.mts +1 -1
- package/api/init/run/run.mjs +15 -4
- 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 +33 -0
- package/api/integration/_adapter.mjs +58 -0
- package/api/integration/authoring-checks.mjs +100 -5
- package/api/integration/authoring-checks.test.mjs +769 -0
- package/api/integration/authoring-checks.type.d.mts +134 -0
- package/api/integration/authoring-checks.type.mjs +60 -1
- package/api/integration/integrationCheck.doc.mjs +1 -1
- package/api/integration/integrationComponentConflicts.doc.mjs +11 -3
- package/api/integration/integrationDocConflicts.doc.mjs +22 -5
- package/api/integration/pack-check.mjs +303 -13
- package/api/integration/pack-check.test.mjs +371 -10
- package/api/integration/validate-integration-fixes.test.mjs +67 -0
- package/api/integration/validate-integration.d.mts +8 -0
- package/api/integration/validate-integration.mjs +55 -9
- package/api/integration/validate-integration.test.mjs +77 -8
- package/api/integration/validate-integration.type.d.mts +8 -0
- package/api/integration/validate-integration.type.mjs +3 -1
- package/api/integration/validate-unread-theme-folders.test.mjs +3 -2
- package/api/integration/validateIntegration.doc.mjs +4 -2
- package/api/search/_adapter.d.mts +11 -0
- package/api/search/_adapter.mjs +25 -0
- package/api/search/search.d.mts +73 -13
- package/api/search/search.doc.mjs +8 -3
- package/api/search/search.domain-priority.test.mjs +108 -18
- package/api/search/search.mjs +541 -52
- package/api/search/search.test.mjs +143 -1
- package/api/search/search.type.d.mts +14 -1
- package/api/search/search.type.mjs +6 -1
- package/api/swizzle/_adapter.mjs +2 -2
- package/api/swizzle/copy/copy.mjs +1 -1
- package/api/template/template-integration.test.mjs +1 -1
- 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.mjs +70 -14
- package/api/theme/build/build.packed-old-core.test.mjs +20 -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/themeTargets.doc.mjs +4 -0
- package/api/theme/use/use.test.mjs +1 -1
- package/api/upgrade/_adapter.d.mts +40 -2
- package/api/upgrade/_adapter.mjs +118 -5
- package/api/upgrade/run/cli-behind-core.test.mjs +438 -0
- package/api/upgrade/run/run.mjs +35 -2
- package/api/upgrade/status/status.d.mts +21 -5
- package/api/upgrade/status/status.mjs +45 -8
- package/api/upgrade/upgrade.doc.mjs +6 -3
- package/api/upgrade/upgrade.mjs +5 -1
- package/api/upgrade/upgrade.type.d.mts +23 -0
- package/api/upgrade/upgrade.type.mjs +16 -1
- 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/next/index.mjs +1 -11
- package/assets/codemods/transforms/v0.7.2/index.mjs +20 -0
- package/assets/discover/official-packages.json +367 -0
- package/assets/docs/author-a-theme.doc.mjs +2 -2
- package/assets/docs/browser-support.doc.mjs +1 -1
- package/assets/docs/getting-started.doc.mjs +23 -3
- package/assets/docs/styling-overview.doc.mjs +1 -1
- package/assets/docs/theme.doc.mjs +1 -1
- package/assets/docs/tree/add-a-component.doc.mjs +12 -2
- package/assets/docs/tree/add-a-theme.doc.mjs +13 -3
- 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/block-template.doc.mjs +6 -18
- package/assets/docs/tree/build-the-template.doc.mjs +1 -1
- package/assets/docs/tree/building-blocks.doc.mjs +4 -0
- package/assets/docs/tree/check-the-props.doc.mjs +8 -3
- package/assets/docs/tree/check-your-docs.doc.mjs +30 -13
- package/assets/docs/tree/checks.doc.mjs +17 -17
- package/assets/docs/tree/ci-and-containers.doc.mjs +88 -0
- package/assets/docs/tree/cli-command.doc.mjs +142 -0
- package/assets/docs/tree/cli.doc.mjs +6 -0
- 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 +3 -5
- package/assets/docs/tree/component-imports.doc.mjs +13 -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 +7 -3
- package/assets/docs/tree/debug-and-gap-reports.doc.mjs +41 -22
- package/assets/docs/tree/define-the-theme.doc.mjs +6 -5
- package/assets/docs/tree/describe-the-component.doc.mjs +2 -2
- 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 +3 -3
- 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/tree/fonts-and-assets.doc.mjs +2 -2
- package/assets/docs/tree/generate-a-palette.doc.mjs +7 -5
- 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/install-once.doc.mjs +105 -0
- package/assets/docs/tree/integrations.doc.mjs +13 -1
- 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 +6 -5
- 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 +3 -7
- 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 +52 -26
- 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 +9 -11
- 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/short-and-findable.doc.mjs +9 -8
- package/assets/docs/tree/single-component.doc.mjs +14 -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-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 +4 -0
- package/assets/docs/tree/tokens-and-setup.doc.mjs +19 -15
- package/assets/docs/tree/troubleshooting.doc.mjs +22 -14
- 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 +14 -2
- package/assets/docs/tree/verify-packed-template.doc.mjs +3 -3
- package/assets/docs/tree/versioning.doc.mjs +9 -9
- package/assets/docs/tree/who-answers.doc.mjs +119 -0
- package/assets/docs/tree/write-the-template-file.doc.mjs +5 -5
- package/assets/docs/working-with-ai.doc.mjs +23 -9
- 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 +29 -26
- package/authoring/doctypes/component/type.ts +15 -5
- 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 +9 -9
- package/authoring/doctypes/template/template.doc.mjs +2 -2
- 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 +1 -0
- package/authoring/integration/integration.doc.mjs +22 -5
- package/authoring/integration/parse.test.mjs +11 -0
- package/authoring/integration/schema.d.mts +14 -3
- package/authoring/integration/schema.mjs +33 -2
- package/authoring/integration/type.ts +8 -0
- package/clients/cli/bin/astryx.mjs +20 -3
- package/clients/cli/cli-command.test.mjs +166 -0
- package/clients/cli/commands/blog.doc.mjs +1 -0
- package/clients/cli/commands/build-theme.batch-report.test.mjs +14 -2
- package/clients/cli/commands/build-theme.font-warning.test.mjs +3 -3
- package/clients/cli/commands/build-theme.mjs +25 -12
- 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/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 +1 -0
- package/clients/cli/commands/docs.mjs +49 -19
- package/clients/cli/commands/docs.test.mjs +2 -2
- package/clients/cli/commands/doctor-integration-components.doc.mjs +7 -3
- 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 +13 -2
- package/clients/cli/commands/doctor-integration.test.mjs +52 -4
- package/clients/cli/commands/doctor.doc.mjs +12 -2
- package/clients/cli/commands/doctor.mjs +102 -7
- package/clients/cli/commands/doctor.test.mjs +10 -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/init.behavior.test.mjs +5 -0
- package/clients/cli/commands/init.doc.mjs +29 -3
- 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 +10 -2
- package/clients/cli/commands/integration-check.test.mjs +175 -1
- 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.mjs +15 -9
- package/clients/cli/commands/json-contract.test.mjs +11 -2
- package/clients/cli/commands/manifest.doc.mjs +1 -0
- package/clients/cli/commands/outside-project.test.mjs +774 -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 +102 -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/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 +1 -0
- 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/upgrade.config-ordering.test.mjs +2 -1
- package/clients/cli/commands/upgrade.doc.mjs +22 -1
- 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.older-cli.test.mjs +160 -0
- package/clients/cli/index.mjs +111 -16
- package/clients/cli/lib/cli-error.mjs +4 -1
- package/clients/cli/lib/component-format.test.mjs +1 -1
- package/clients/cli/lib/define-command.mjs +2 -2
- 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 +25 -0
- package/foundation/agent-docs/agent-doc-state.d.mts +35 -6
- package/foundation/agent-docs/agent-doc-state.mjs +66 -6
- package/foundation/agent-docs/agent-docs.d.mts +4 -3
- package/foundation/agent-docs/agent-docs.mjs +11 -9
- package/foundation/agent-docs/computer-agent-text.d.mts +133 -0
- package/foundation/agent-docs/computer-agent-text.mjs +623 -0
- package/foundation/agent-docs/computer-agent-text.test.mjs +602 -0
- package/foundation/config/project.d.mts +35 -3
- package/foundation/config/project.mjs +145 -8
- package/foundation/config/project.test.mjs +66 -0
- package/foundation/config/theme-state.mjs +5 -4
- package/foundation/discovery/authoring-self-docs.mjs +1 -1
- package/foundation/discovery/cli-self-docs.mjs +20 -3
- package/foundation/discovery/cli-self-docs.test.mjs +3 -2
- package/foundation/discovery/component-replacement.mjs +2 -1
- 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 +1 -1
- package/foundation/discovery/doc-types.mjs +15 -8
- package/foundation/discovery/doc-types.test.mjs +94 -2
- package/foundation/discovery/docs-discovery.d.mts +7 -0
- package/foundation/discovery/docs-discovery.mjs +26 -2
- package/foundation/discovery/project-typescript.d.mts +11 -2
- package/foundation/discovery/project-typescript.mjs +32 -4
- package/foundation/discovery/prop-drift.d.mts +26 -7
- package/foundation/discovery/prop-drift.mjs +173 -8
- package/foundation/discovery/prop-drift.test.mjs +120 -2
- package/foundation/discovery/runner-allowlist.d.mts +40 -0
- package/foundation/discovery/runner-allowlist.mjs +53 -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-needs.mjs +5 -2
- package/foundation/discovery/theme-imports.mjs +8 -4
- package/foundation/discovery/theme-imports.test.mjs +1 -1
- package/foundation/discovery/type-text.mjs +1 -1
- package/foundation/discovery/type-text.test.mjs +1 -1
- package/foundation/doc-compiler/doc-loads.test.mjs +42 -2
- package/foundation/doc-compiler/inputs.mjs +4 -1
- package/foundation/doc-compiler/links.d.mts +32 -0
- package/foundation/doc-compiler/links.mjs +163 -26
- package/foundation/doc-compiler/links.test.mjs +97 -4
- package/foundation/doc-compiler/read.d.mts +1 -1
- package/foundation/doc-compiler/tree.mjs +30 -1
- package/foundation/doc-compiler/tree.test.mjs +8 -1
- 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 +57 -1
- package/foundation/fs/paths.mjs +131 -3
- package/foundation/fs/paths.test.mjs +10 -1
- package/foundation/integrations/computer-integrations.d.mts +78 -0
- package/foundation/integrations/computer-integrations.mjs +316 -0
- package/foundation/integrations/computer-integrations.test.mjs +292 -0
- package/foundation/integrations/contribution-inventory.d.mts +11 -0
- package/foundation/integrations/contribution-inventory.mjs +50 -2
- package/foundation/integrations/integration-warnings.mjs +3 -2
- package/foundation/integrations/integration-warnings.test.mjs +8 -9
- package/foundation/integrations/integrations.d.mts +25 -1
- package/foundation/integrations/integrations.mjs +46 -3
- package/foundation/integrations/issue.ts +6 -0
- package/foundation/integrations/validate-contributions.d.mts +2 -0
- package/foundation/integrations/validate-contributions.mjs +41 -1
- 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 +920 -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 +259 -0
- package/foundation/release/global-state.mjs +472 -0
- package/foundation/release/global-state.test.mjs +381 -0
- package/foundation/release/handoff.d.mts +60 -0
- package/foundation/release/handoff.e2e.test.mjs +278 -0
- package/foundation/release/handoff.mjs +357 -0
- package/foundation/release/lock-lease.d.mts +23 -0
- package/foundation/release/lock-lease.mjs +80 -0
- package/foundation/release/notices.d.mts +253 -0
- package/foundation/release/notices.mjs +596 -0
- package/foundation/release/notices.test.mjs +565 -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 +149 -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 +17 -11
- package/foundation/response/response-types.doc.test.mjs +46 -0
- package/foundation/response/response.doc.mjs +3 -3
- package/foundation/xle/browser-imports.test.mjs +74 -0
- package/package.json +11 -11
- package/scripts/postinstall.mjs +24 -5
- /package/assets/codemods/transforms/{next → v0.7.2}/__tests__/migrate-list-edge-compensation-to-edge.test.mjs +0 -0
- /package/assets/codemods/transforms/{next → v0.7.2}/migrate-list-edge-compensation-to-edge.mjs +0 -0
|
@@ -7,6 +7,7 @@ import * as path from 'node:path';
|
|
|
7
7
|
import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
|
|
8
8
|
import {Project} from '../../foundation/config/project.mjs';
|
|
9
9
|
import {
|
|
10
|
+
ASK_DESTINATION_MESSAGE,
|
|
10
11
|
GAP_REPORT_CATEGORIES,
|
|
11
12
|
PUBLIC_CONFIRMATION_MESSAGE,
|
|
12
13
|
collectGapReportHandlers,
|
|
@@ -1022,6 +1023,238 @@ console.log('https://github.com/acme/widgets/issues/42');
|
|
|
1022
1023
|
});
|
|
1023
1024
|
});
|
|
1024
1025
|
|
|
1026
|
+
describe('gapReport destinations and --to', () => {
|
|
1027
|
+
/** A shared internal handler that records each call in a marker file. */
|
|
1028
|
+
function addSharedHandler() {
|
|
1029
|
+
const marker = path.join(projectDir, 'shared-called');
|
|
1030
|
+
addIntegration({
|
|
1031
|
+
name: '@test/shared',
|
|
1032
|
+
audience: 'internal',
|
|
1033
|
+
handleBody: `(await import('node:fs')).writeFileSync(${JSON.stringify(marker)}, 'x'); return {status: 'filed', message: 'shared'};`,
|
|
1034
|
+
});
|
|
1035
|
+
return marker;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
function addWidgets(issuesUrl = 'https://github.com/acme/widgets/issues') {
|
|
1039
|
+
addIntegration({name: '@test/widgets', handler: false, issuesUrl});
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
it('keeps the default route and lists the destinations with the ask line', async () => {
|
|
1043
|
+
const marker = addSharedHandler();
|
|
1044
|
+
addWidgets();
|
|
1045
|
+
configure(['@test/shared', '@test/widgets']);
|
|
1046
|
+
const argsFile = stubGh();
|
|
1047
|
+
|
|
1048
|
+
const result = await gapReport('General', {
|
|
1049
|
+
...reportOptions,
|
|
1050
|
+
confirmPublic: true,
|
|
1051
|
+
cwd: projectDir,
|
|
1052
|
+
});
|
|
1053
|
+
|
|
1054
|
+
expect(result.data.deliveries).toEqual([
|
|
1055
|
+
expect.objectContaining({handler: '@test/shared', status: 'filed'}),
|
|
1056
|
+
]);
|
|
1057
|
+
expect(fs.existsSync(marker)).toBe(true);
|
|
1058
|
+
expect(fs.existsSync(argsFile)).toBe(false);
|
|
1059
|
+
expect(result.data.destinations).toEqual([
|
|
1060
|
+
{to: null, default: true, issuesUrl: null},
|
|
1061
|
+
{
|
|
1062
|
+
to: '@test/widgets',
|
|
1063
|
+
default: false,
|
|
1064
|
+
issuesUrl: 'https://github.com/acme/widgets/issues',
|
|
1065
|
+
},
|
|
1066
|
+
]);
|
|
1067
|
+
expect(result.data.ask).toBe(ASK_DESTINATION_MESSAGE);
|
|
1068
|
+
expect(ASK_DESTINATION_MESSAGE).toMatch(/ask the person/i);
|
|
1069
|
+
});
|
|
1070
|
+
|
|
1071
|
+
it('lists no destinations when no integration names an issuesUrl', async () => {
|
|
1072
|
+
addSharedHandler();
|
|
1073
|
+
configure(['@test/shared']);
|
|
1074
|
+
|
|
1075
|
+
const result = await gapReport('General', {
|
|
1076
|
+
...reportOptions,
|
|
1077
|
+
cwd: projectDir,
|
|
1078
|
+
});
|
|
1079
|
+
|
|
1080
|
+
expect(result.data).not.toHaveProperty('destinations');
|
|
1081
|
+
expect(result.data).not.toHaveProperty('ask');
|
|
1082
|
+
});
|
|
1083
|
+
|
|
1084
|
+
it('files with the chosen integration GitHub issuesUrl only with consent, and runs no handler', async () => {
|
|
1085
|
+
const marker = addSharedHandler();
|
|
1086
|
+
addWidgets();
|
|
1087
|
+
configure(['@test/shared', '@test/widgets']);
|
|
1088
|
+
const argsFile = stubGh();
|
|
1089
|
+
|
|
1090
|
+
const pending = await gapReport('General', {
|
|
1091
|
+
...reportOptions,
|
|
1092
|
+
to: '@test/widgets',
|
|
1093
|
+
cwd: projectDir,
|
|
1094
|
+
});
|
|
1095
|
+
expect(pending.data.deliveries).toEqual([
|
|
1096
|
+
{
|
|
1097
|
+
handlerType: 'fallback',
|
|
1098
|
+
handler: 'github',
|
|
1099
|
+
audience: 'public',
|
|
1100
|
+
status: 'consent_required',
|
|
1101
|
+
url: null,
|
|
1102
|
+
message: PUBLIC_CONFIRMATION_MESSAGE,
|
|
1103
|
+
},
|
|
1104
|
+
]);
|
|
1105
|
+
expect(pending.data.issuesUrl).toBe(
|
|
1106
|
+
'https://github.com/acme/widgets/issues',
|
|
1107
|
+
);
|
|
1108
|
+
expect(pending.data).not.toHaveProperty('destinations');
|
|
1109
|
+
expect(fs.existsSync(argsFile)).toBe(false);
|
|
1110
|
+
|
|
1111
|
+
const filed = await gapReport('General', {
|
|
1112
|
+
...reportOptions,
|
|
1113
|
+
to: '@test/widgets',
|
|
1114
|
+
confirmPublic: true,
|
|
1115
|
+
cwd: projectDir,
|
|
1116
|
+
});
|
|
1117
|
+
expect(filed.data.deliveries).toHaveLength(1);
|
|
1118
|
+
expect(filed.data.deliveries[0]).toMatchObject({
|
|
1119
|
+
handlerType: 'fallback',
|
|
1120
|
+
handler: 'github',
|
|
1121
|
+
status: 'filed',
|
|
1122
|
+
});
|
|
1123
|
+
const args = JSON.parse(fs.readFileSync(argsFile, 'utf8'));
|
|
1124
|
+
expect(args.slice(0, 4)).toEqual([
|
|
1125
|
+
'issue',
|
|
1126
|
+
'create',
|
|
1127
|
+
'--repo',
|
|
1128
|
+
'acme/widgets',
|
|
1129
|
+
]);
|
|
1130
|
+
expect(fs.existsSync(marker)).toBe(false);
|
|
1131
|
+
});
|
|
1132
|
+
|
|
1133
|
+
it('routes a chosen non-GitHub issuesUrl as routed_only', async () => {
|
|
1134
|
+
addSharedHandler();
|
|
1135
|
+
addWidgets('https://tracker.example/widgets');
|
|
1136
|
+
configure(['@test/shared', '@test/widgets']);
|
|
1137
|
+
|
|
1138
|
+
const result = await gapReport('General', {
|
|
1139
|
+
...reportOptions,
|
|
1140
|
+
to: '@test/widgets',
|
|
1141
|
+
cwd: projectDir,
|
|
1142
|
+
});
|
|
1143
|
+
|
|
1144
|
+
expect(result.data.deliveries).toEqual([
|
|
1145
|
+
expect.objectContaining({
|
|
1146
|
+
handlerType: 'fallback',
|
|
1147
|
+
handler: 'issuesUrl',
|
|
1148
|
+
status: 'routed_only',
|
|
1149
|
+
url: 'https://tracker.example/widgets',
|
|
1150
|
+
}),
|
|
1151
|
+
]);
|
|
1152
|
+
expect(result.data.status).toBe('routed_only');
|
|
1153
|
+
});
|
|
1154
|
+
|
|
1155
|
+
it.each([
|
|
1156
|
+
['a package that is not loaded', '@test/nope'],
|
|
1157
|
+
['a loaded integration without an issuesUrl', '@test/shared'],
|
|
1158
|
+
])(
|
|
1159
|
+
'refuses --to naming %s, lists the choices, and sends nothing',
|
|
1160
|
+
async (_label, to) => {
|
|
1161
|
+
const marker = addSharedHandler();
|
|
1162
|
+
addWidgets();
|
|
1163
|
+
configure(['@test/shared', '@test/widgets']);
|
|
1164
|
+
|
|
1165
|
+
await expect(
|
|
1166
|
+
gapReport('General', {...reportOptions, to, cwd: projectDir}),
|
|
1167
|
+
).rejects.toMatchObject({
|
|
1168
|
+
code: 'ERR_UNKNOWN_PACKAGE',
|
|
1169
|
+
suggestions: [
|
|
1170
|
+
{
|
|
1171
|
+
name: '@test/widgets',
|
|
1172
|
+
reason: 'https://github.com/acme/widgets/issues',
|
|
1173
|
+
},
|
|
1174
|
+
],
|
|
1175
|
+
});
|
|
1176
|
+
expect(fs.existsSync(marker)).toBe(false);
|
|
1177
|
+
},
|
|
1178
|
+
);
|
|
1179
|
+
|
|
1180
|
+
it.each([
|
|
1181
|
+
['an empty value', ''],
|
|
1182
|
+
['a blank value', ' '],
|
|
1183
|
+
['an over-long value', `@test/${'a'.repeat(300)}`],
|
|
1184
|
+
])('refuses %s for --to with the destination list', async (_label, to) => {
|
|
1185
|
+
const marker = addSharedHandler();
|
|
1186
|
+
addWidgets();
|
|
1187
|
+
configure(['@test/shared', '@test/widgets']);
|
|
1188
|
+
|
|
1189
|
+
await expect(
|
|
1190
|
+
gapReport('General', {...reportOptions, to, cwd: projectDir}),
|
|
1191
|
+
).rejects.toMatchObject({
|
|
1192
|
+
code: 'ERR_UNKNOWN_PACKAGE',
|
|
1193
|
+
suggestions: [{name: '@test/widgets'}],
|
|
1194
|
+
});
|
|
1195
|
+
expect(fs.existsSync(marker)).toBe(false);
|
|
1196
|
+
});
|
|
1197
|
+
|
|
1198
|
+
it('treats to: null as absent', async () => {
|
|
1199
|
+
const marker = addSharedHandler();
|
|
1200
|
+
addWidgets();
|
|
1201
|
+
configure(['@test/shared', '@test/widgets']);
|
|
1202
|
+
|
|
1203
|
+
const result = await gapReport('General', {
|
|
1204
|
+
...reportOptions,
|
|
1205
|
+
to: /** @type {any} */ (null),
|
|
1206
|
+
cwd: projectDir,
|
|
1207
|
+
});
|
|
1208
|
+
|
|
1209
|
+
expect(result.data.deliveries).toHaveLength(1);
|
|
1210
|
+
expect(fs.existsSync(marker)).toBe(true);
|
|
1211
|
+
expect(result.data.destinations).toHaveLength(2);
|
|
1212
|
+
});
|
|
1213
|
+
|
|
1214
|
+
it('lists the destinations with the categories', async () => {
|
|
1215
|
+
addSharedHandler();
|
|
1216
|
+
addWidgets();
|
|
1217
|
+
configure(['@test/shared', '@test/widgets']);
|
|
1218
|
+
|
|
1219
|
+
const listed = await gapReport(undefined, {
|
|
1220
|
+
listCategories: true,
|
|
1221
|
+
cwd: projectDir,
|
|
1222
|
+
});
|
|
1223
|
+
|
|
1224
|
+
expect(listed.data).toEqual(GAP_REPORT_CATEGORIES);
|
|
1225
|
+
expect(listed.meta).toEqual({
|
|
1226
|
+
destinations: [
|
|
1227
|
+
{to: null, default: true, issuesUrl: null},
|
|
1228
|
+
{
|
|
1229
|
+
to: '@test/widgets',
|
|
1230
|
+
default: false,
|
|
1231
|
+
issuesUrl: 'https://github.com/acme/widgets/issues',
|
|
1232
|
+
},
|
|
1233
|
+
],
|
|
1234
|
+
ask: ASK_DESTINATION_MESSAGE,
|
|
1235
|
+
});
|
|
1236
|
+
});
|
|
1237
|
+
|
|
1238
|
+
it('adds no meta to the categories when there is only the default', async () => {
|
|
1239
|
+
configure([]);
|
|
1240
|
+
const listed = await gapReport(undefined, {
|
|
1241
|
+
listCategories: true,
|
|
1242
|
+
cwd: projectDir,
|
|
1243
|
+
});
|
|
1244
|
+
expect(listed).not.toHaveProperty('meta');
|
|
1245
|
+
});
|
|
1246
|
+
|
|
1247
|
+
it('refuses --to with --list-categories', async () => {
|
|
1248
|
+
await expect(
|
|
1249
|
+
gapReport(undefined, {
|
|
1250
|
+
listCategories: true,
|
|
1251
|
+
to: '@test/widgets',
|
|
1252
|
+
cwd: projectDir,
|
|
1253
|
+
}),
|
|
1254
|
+
).rejects.toMatchObject({code: 'ERR_INVALID_ARGUMENT'});
|
|
1255
|
+
});
|
|
1256
|
+
});
|
|
1257
|
+
|
|
1025
1258
|
describe('gapReport target selection', () => {
|
|
1026
1259
|
it('routes to the unique component owner', async () => {
|
|
1027
1260
|
addIntegration({
|
|
@@ -35,10 +35,42 @@ export type GapReportOptions = {
|
|
|
35
35
|
* Return the category vocabulary without routing or writing.
|
|
36
36
|
*/
|
|
37
37
|
listCategories?: boolean | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* A destination the person chose: a loaded integration
|
|
40
|
+
* whose manifest names an issues URL. The report goes only there.
|
|
41
|
+
*/
|
|
42
|
+
to?: string | undefined;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Where a report can go. The default entry (`to: null`) is the configured
|
|
46
|
+
* handlers, or with none the owning package's issues URL.
|
|
47
|
+
*/
|
|
48
|
+
export type GapReportDestination = {
|
|
49
|
+
/**
|
|
50
|
+
* The value to pass as `to`; null for the default.
|
|
51
|
+
*/
|
|
52
|
+
to: string | null;
|
|
53
|
+
/**
|
|
54
|
+
* Whether this is the default destination.
|
|
55
|
+
*/
|
|
56
|
+
default: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* The integration's issues URL; null for the
|
|
59
|
+
* default.
|
|
60
|
+
*/
|
|
61
|
+
issuesUrl: string | null;
|
|
38
62
|
};
|
|
39
63
|
export type GapReportCategoriesResponse = {
|
|
40
64
|
type: "gap-report.categories";
|
|
41
65
|
data: GapReportCategoryEntry[];
|
|
66
|
+
/**
|
|
67
|
+
* Present when a destination besides the default exists: every destination,
|
|
68
|
+
* and the line telling an agent to ask the person.
|
|
69
|
+
*/
|
|
70
|
+
meta?: {
|
|
71
|
+
destinations: GapReportDestination[];
|
|
72
|
+
ask: string;
|
|
73
|
+
} | undefined;
|
|
42
74
|
};
|
|
43
75
|
export type GapReportAggregateStatus = "filed" | "partial" | "failed" | "routed_only" | "consent_required" | "skipped";
|
|
44
76
|
export type GapReportDeliveryStatus = "filed" | "routed_only" | "skipped" | "failed" | "consent_required";
|
|
@@ -81,6 +113,15 @@ export type GapReportReceipt = {
|
|
|
81
113
|
* Count of handlers that routed only.
|
|
82
114
|
*/
|
|
83
115
|
routedOnlyCount: number;
|
|
116
|
+
/**
|
|
117
|
+
* For a run without `to`,
|
|
118
|
+
* when a destination besides the default exists: every destination.
|
|
119
|
+
*/
|
|
120
|
+
destinations?: GapReportDestination[] | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* With `destinations`: ask the person where to file.
|
|
123
|
+
*/
|
|
124
|
+
ask?: string | undefined;
|
|
84
125
|
};
|
|
85
126
|
export type GapReportReceiptResponse = {
|
|
86
127
|
type: "gap-report.file";
|
|
@@ -23,12 +23,27 @@
|
|
|
23
23
|
* @property {string} [package] Explicit owner package for ambiguous routes.
|
|
24
24
|
* @property {boolean} [confirmPublic] Explicit consent for public handlers or GitHub issue creation.
|
|
25
25
|
* @property {boolean} [listCategories] Return the category vocabulary without routing or writing.
|
|
26
|
+
* @property {string} [to] A destination the person chose: a loaded integration
|
|
27
|
+
* whose manifest names an issues URL. The report goes only there.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Where a report can go. The default entry (`to: null`) is the configured
|
|
32
|
+
* handlers, or with none the owning package's issues URL.
|
|
33
|
+
* @typedef {object} GapReportDestination
|
|
34
|
+
* @property {string|null} to The value to pass as `to`; null for the default.
|
|
35
|
+
* @property {boolean} default Whether this is the default destination.
|
|
36
|
+
* @property {string|null} issuesUrl The integration's issues URL; null for the
|
|
37
|
+
* default.
|
|
26
38
|
*/
|
|
27
39
|
|
|
28
40
|
/**
|
|
29
41
|
* @typedef {object} GapReportCategoriesResponse
|
|
30
42
|
* @property {'gap-report.categories'} type
|
|
31
43
|
* @property {GapReportCategoryEntry[]} data
|
|
44
|
+
* @property {{destinations: GapReportDestination[], ask: string}} [meta]
|
|
45
|
+
* Present when a destination besides the default exists: every destination,
|
|
46
|
+
* and the line telling an agent to ask the person.
|
|
32
47
|
*/
|
|
33
48
|
|
|
34
49
|
/**
|
|
@@ -58,6 +73,9 @@
|
|
|
58
73
|
* @property {GapReportDelivery[]} deliveries Ordered handler outcomes.
|
|
59
74
|
* @property {number} filedCount Count of handlers that filed the report.
|
|
60
75
|
* @property {number} routedOnlyCount Count of handlers that routed only.
|
|
76
|
+
* @property {GapReportDestination[]} [destinations] For a run without `to`,
|
|
77
|
+
* when a destination besides the default exists: every destination.
|
|
78
|
+
* @property {string} [ask] With `destinations`: ask the person where to file.
|
|
61
79
|
*/
|
|
62
80
|
|
|
63
81
|
/**
|
package/api/hook/_adapter.mjs
CHANGED
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
* @position api/hook/_adapter.mjs — shared by ./list, ./detail, ./detail/params
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import {requireCoreDir} from '../../foundation/fs/paths.mjs';
|
|
18
18
|
import {
|
|
19
19
|
findHookDoc,
|
|
20
20
|
getAllHookNames,
|
|
21
21
|
} from '../../foundation/discovery/hook-discovery.mjs';
|
|
22
22
|
import {loadDocs} from '../../foundation/discovery/component-loader.mjs';
|
|
23
23
|
import {levenshteinDistance} from '../../foundation/text/string-utils.mjs';
|
|
24
|
-
import {AstryxError} from '../error.mjs';
|
|
24
|
+
import {AstryxError, coreDirOrThrow} from '../error.mjs';
|
|
25
25
|
import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
|
|
26
26
|
|
|
27
27
|
/** The package that owns Core's components, hooks, and codemods. */
|
|
@@ -34,15 +34,7 @@ export {CORE_PROVIDER_ID as CORE_PACKAGE} from '../../foundation/identity/provid
|
|
|
34
34
|
* @returns {string} Absolute path to the core package directory.
|
|
35
35
|
*/
|
|
36
36
|
export function resolveCoreDir(cwd) {
|
|
37
|
-
|
|
38
|
-
if (!coreDir) {
|
|
39
|
-
throw new AstryxError(
|
|
40
|
-
'Could not find @astryxdesign/core package',
|
|
41
|
-
undefined,
|
|
42
|
-
ERROR_CODES.ERR_CORE_NOT_FOUND,
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
return coreDir;
|
|
37
|
+
return coreDirOrThrow(requireCoreDir, cwd);
|
|
46
38
|
}
|
|
47
39
|
|
|
48
40
|
/**
|
package/api/hook/hook.doc.mjs
CHANGED
|
@@ -90,6 +90,10 @@ export const doc = {
|
|
|
90
90
|
code: 'ERR_CORE_NOT_FOUND',
|
|
91
91
|
when: '@astryxdesign/core cannot be resolved from cwd',
|
|
92
92
|
},
|
|
93
|
+
{
|
|
94
|
+
code: 'ERR_VERSIONS_UNAVAILABLE',
|
|
95
|
+
when: 'outside a project, or in a project with nothing installed, the Core of the release that answers is not beside it or cached, and cannot be installed into the per-user cache (offline, a registry without it, or an unwritable cache)',
|
|
96
|
+
},
|
|
93
97
|
{
|
|
94
98
|
code: 'ERR_UNKNOWN_CATEGORY',
|
|
95
99
|
when: 'options.category is not a string or matches no known category',
|
package/api/hook/list/list.d.mts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
export function list({ cwd, category, detail, zh, lang, }?: {
|
|
14
14
|
cwd?: string | undefined;
|
|
15
15
|
category?: string | undefined;
|
|
16
|
-
detail?: "
|
|
16
|
+
detail?: "names" | "compact" | "full" | "brief" | undefined;
|
|
17
17
|
zh?: boolean | undefined;
|
|
18
18
|
lang?: string | null | undefined;
|
|
19
19
|
}): Promise<import("../hook.type.mjs").HookListResponse>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// @generated by scripts/sync-api-types.mjs from the JSDoc in api/**/*.mjs.
|
|
2
|
+
// DO NOT EDIT — run `pnpm sync:api-types` to regenerate.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Write or refresh the computer-level agent text, or remove it, and record
|
|
6
|
+
* the setting and the links Astryx made; after a write, record the release
|
|
7
|
+
* that wrote it.
|
|
8
|
+
* @param {{remove: boolean}} options
|
|
9
|
+
* @returns {{home: string, command: string, files: import('./init.type.mjs').InitUserFile[], cliOnSearchPath: boolean}}
|
|
10
|
+
*/
|
|
11
|
+
export function applyComputerAgentText({ remove }: {
|
|
12
|
+
remove: boolean;
|
|
13
|
+
}): {
|
|
14
|
+
home: string;
|
|
15
|
+
command: string;
|
|
16
|
+
files: import("./init.type.mjs").InitUserFile[];
|
|
17
|
+
cliOnSearchPath: boolean;
|
|
18
|
+
};
|
|
19
|
+
import { COMPUTER_COMMAND } from '../../foundation/agent-docs/computer-agent-text.mjs';
|
|
20
|
+
import { COMPUTER_INSTALL_STEP } from '../../foundation/agent-docs/computer-agent-text.mjs';
|
|
21
|
+
import { displayHomePath } from '../../foundation/agent-docs/computer-agent-text.mjs';
|
|
22
|
+
export { COMPUTER_COMMAND, COMPUTER_INSTALL_STEP, displayHomePath };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Environment adapter for `init --user`: the home folder, the settings
|
|
5
|
+
* file, the per-user state, and the search path (spec AST-081 FR7, FR8;
|
|
6
|
+
* architecture:cli-surface INV21).
|
|
7
|
+
*
|
|
8
|
+
* @input the home folder, the settings file, the search path
|
|
9
|
+
* @output the computer-level agent text written or removed, with the setting
|
|
10
|
+
* and the links recorded
|
|
11
|
+
* @position packages/cli/api/init — imported by the user leaf only
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import {
|
|
16
|
+
COMPUTER_COMMAND,
|
|
17
|
+
COMPUTER_INSTALL_STEP,
|
|
18
|
+
astryxOnSearchPath,
|
|
19
|
+
computerAgentCommand,
|
|
20
|
+
displayHomePath,
|
|
21
|
+
removeComputerAgentText,
|
|
22
|
+
writeComputerAgentText,
|
|
23
|
+
} from '../../foundation/agent-docs/computer-agent-text.mjs';
|
|
24
|
+
import {
|
|
25
|
+
computerAgentTextSettings,
|
|
26
|
+
recordComputerAgentTextSettings,
|
|
27
|
+
} from '../../foundation/env/user-settings.mjs';
|
|
28
|
+
import {recordAgentTextWritten} from '../../foundation/release/global-state.mjs';
|
|
29
|
+
import {cliVersion} from '../../foundation/release/run-context.mjs';
|
|
30
|
+
|
|
31
|
+
export {COMPUTER_COMMAND, COMPUTER_INSTALL_STEP, displayHomePath};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Write or refresh the computer-level agent text, or remove it, and record
|
|
35
|
+
* the setting and the links Astryx made; after a write, record the release
|
|
36
|
+
* that wrote it.
|
|
37
|
+
* @param {{remove: boolean}} options
|
|
38
|
+
* @returns {{home: string, command: string, files: import('./init.type.mjs').InitUserFile[], cliOnSearchPath: boolean}}
|
|
39
|
+
*/
|
|
40
|
+
export function applyComputerAgentText({remove}) {
|
|
41
|
+
const home = os.homedir();
|
|
42
|
+
const command = computerAgentCommand();
|
|
43
|
+
const recorded = computerAgentTextSettings().links;
|
|
44
|
+
/** @type {import('./init.type.mjs').InitUserFile[]} */
|
|
45
|
+
let files;
|
|
46
|
+
if (remove) {
|
|
47
|
+
files = removeComputerAgentText({home, links: recorded});
|
|
48
|
+
recordComputerAgentTextSettings({install: false, links: []});
|
|
49
|
+
} else {
|
|
50
|
+
const written = writeComputerAgentText({home, command});
|
|
51
|
+
files = written.rows;
|
|
52
|
+
recordComputerAgentTextSettings({
|
|
53
|
+
install: true,
|
|
54
|
+
links: [...new Set([...recorded, ...written.links])],
|
|
55
|
+
});
|
|
56
|
+
recordAgentTextWritten(cliVersion());
|
|
57
|
+
}
|
|
58
|
+
return {home, command, files, cliOnSearchPath: astryxOnSearchPath()};
|
|
59
|
+
}
|
package/api/init/init.d.mts
CHANGED
|
@@ -9,19 +9,21 @@
|
|
|
9
9
|
* @typedef {import('./init.type.mjs').InitRunData} InitRunData
|
|
10
10
|
*/
|
|
11
11
|
/**
|
|
12
|
-
* Run the non-interactive init flow. Dispatches to the
|
|
13
|
-
* `--
|
|
14
|
-
*
|
|
12
|
+
* Run the non-interactive init flow. Dispatches to the user leaf when
|
|
13
|
+
* `--user` is set (it writes, or with `--remove-agents` removes, the
|
|
14
|
+
* computer-level agent text and nothing in the folder), to the remove leaf
|
|
15
|
+
* when `--remove-agents` is set, otherwise to the install (run) leaf, and
|
|
16
|
+
* returns that leaf's receipt. Progress is emitted through `logger` (silent by
|
|
15
17
|
* default); unknown feature or template names throw AstryxError with a stable
|
|
16
18
|
* code.
|
|
17
19
|
*
|
|
18
20
|
* @param {InitOptions} [options]
|
|
19
21
|
* @param {{cwd?: string}} [ctx]
|
|
20
|
-
* @returns {Promise<import('./init.type.mjs').InitRunResponse | import('./init.type.mjs').InitRemoveResponse>}
|
|
22
|
+
* @returns {Promise<import('./init.type.mjs').InitRunResponse | import('./init.type.mjs').InitRemoveResponse | import('./init.type.mjs').InitUserResponse>}
|
|
21
23
|
*/
|
|
22
24
|
export function init(options?: InitOptions, { cwd }?: {
|
|
23
25
|
cwd?: string;
|
|
24
|
-
}): Promise<import("./init.type.mjs").InitRunResponse | import("./init.type.mjs").InitRemoveResponse>;
|
|
26
|
+
}): Promise<import("./init.type.mjs").InitRunResponse | import("./init.type.mjs").InitRemoveResponse | import("./init.type.mjs").InitUserResponse>;
|
|
25
27
|
export { getNextSteps } from "./run/run.mjs";
|
|
26
28
|
/**
|
|
27
29
|
* Re-exported types so callers can keep referencing them off the init barrel
|
package/api/init/init.doc.mjs
CHANGED
|
@@ -21,10 +21,14 @@ export const doc = {
|
|
|
21
21
|
'agent-docs cheat sheet, including guidance from configured integrations, and ' +
|
|
22
22
|
"prints getting-started guidance; `features` / `all` print only the chosen features' " +
|
|
23
23
|
'guidance instead (the theme feature also writes the annotated theme template). ' +
|
|
24
|
-
'With `removeAgents` it removes the managed agent-docs block instead of installing.'
|
|
24
|
+
'With `removeAgents` it removes the managed agent-docs block instead of installing. ' +
|
|
25
|
+
'Outside a project it writes the same files but prints no getting-started steps and no step that adds a theme to an app, since those set up a project the folder does not have. ' +
|
|
26
|
+
"With `user` it sets up the computer instead of the folder: it writes the computer-level agent text, one skill file at `~/.agents/skills/astryx/SKILL.md`, 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), with a managed copy for Continue, whose scanner skips links,, telling agents anywhere on the computer that Astryx is there and when to use it; with `user` and `removeAgents` it removes the file and the links it made and records that the text is turned off. " +
|
|
27
|
+
'The CLI installed for the computer refreshes the file in the background after each upgrade; package install scripts, project setup, and upgrade never write it.' +
|
|
28
|
+
" In global mode: with `cwd` outside a project, it writes the agent docs and prints no getting-started steps; `user` writes only the agent guide for the computer, in the home folder, and touches nothing in `cwd`. See {@link namespace:global} and {@link generic:computer-agent-guide}.",
|
|
25
29
|
importPath: '@astryxdesign/cli/api',
|
|
26
30
|
signature:
|
|
27
|
-
'init(options?: InitOptions, ctx?: {cwd?: string}): Promise<InitRunResponse | InitRemoveResponse>',
|
|
31
|
+
'init(options?: InitOptions, ctx?: {cwd?: string}): Promise<InitRunResponse | InitRemoveResponse | InitUserResponse>',
|
|
28
32
|
keywords: ['init', 'setup', 'install', 'scaffold', 'agents', 'bootstrap'],
|
|
29
33
|
params: [
|
|
30
34
|
{
|
|
@@ -41,13 +45,24 @@ export const doc = {
|
|
|
41
45
|
{
|
|
42
46
|
name: 'options.removeAgents',
|
|
43
47
|
type: 'boolean',
|
|
44
|
-
description:
|
|
48
|
+
description:
|
|
49
|
+
'Remove the managed agent-docs block instead of installing. With `user`, remove the computer-level agent text instead.',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'options.user',
|
|
53
|
+
type: 'boolean',
|
|
54
|
+
description:
|
|
55
|
+
"Write or refresh the computer-level agent text instead of setting up `ctx.cwd`: one skill file at `~/.agents/skills/astryx/SKILL.md` in the current user's home folder, linked (a folder symlink with a relative target, a junction on Windows, or a copy where neither can be made) into `~/.claude/skills/astryx`, and into the skills folder of Kiro, Windsurf, Letta, Xcode's coding assistant, and `~/.config/agents/skills` when that folder exists; Continue, whose scanner skips links, gets a managed copy, refreshed with the file. " +
|
|
56
|
+
'The text uses the `astryx` command, or the command of the host that started the run; an integration\'s `cliCommand` never applies. ' +
|
|
57
|
+
'Records the links it made, or with `removeAgents` that the text is turned off, in `astryx/settings.json` in the per-user configuration folder. ' +
|
|
58
|
+
'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. When no `astryx` command on the computer runs the Astryx CLI, the text is still written and the receipt carries a warning to install the CLI for the computer (`npm i -g @astryxdesign/cli`). ' +
|
|
59
|
+
'Cannot be combined with `features`, `all`, `agent`, or `agentDocsPath`.',
|
|
45
60
|
},
|
|
46
61
|
{
|
|
47
62
|
name: 'options.agent',
|
|
48
63
|
type: 'string',
|
|
49
64
|
description:
|
|
50
|
-
'Agent preset: claude, cursor, codex, hermes, muse, all. Used only when the agents feature runs.',
|
|
65
|
+
'Agent preset: claude, cursor, codex, hermes, muse, all. Used only when the agents feature runs. Refused with `user`.',
|
|
51
66
|
},
|
|
52
67
|
{
|
|
53
68
|
name: 'options.agentDocsPath',
|
|
@@ -71,22 +86,27 @@ export const doc = {
|
|
|
71
86
|
{
|
|
72
87
|
type: 'init.run',
|
|
73
88
|
description:
|
|
74
|
-
'The install receipt: the `mode` (`default` | `features`), the features run, agent-doc files written, any soft docsError, the theme-template outcome (`created` | `skipped` | `failed`) plus its path, the page-template outcome (`workflow` | `created` | `skipped`) plus its path, and whether the next-steps were emitted.',
|
|
89
|
+
'The install receipt: the `mode` (`default` | `features`), the features run, agent-doc files written, any soft docsError, the theme-template outcome (`created` | `skipped` | `failed`) plus its path, the page-template outcome (`workflow` | `created` | `skipped`) plus its path, and whether the next-steps were emitted (never outside a project).',
|
|
75
90
|
},
|
|
76
91
|
{
|
|
77
92
|
type: 'init.remove',
|
|
78
93
|
description:
|
|
79
94
|
'The removal receipt, returned when `removeAgents` is set: `data.removed` is true when a managed agent-docs block was found and removed, and false when there was none to remove.',
|
|
80
95
|
},
|
|
96
|
+
{
|
|
97
|
+
type: 'init.user',
|
|
98
|
+
description:
|
|
99
|
+
'The computer-level agent text receipt, returned when `user` is set: `data.files`, one `{path, action, reason?}` per path acted on (`~/.agents/skills/astryx/SKILL.md`, then each link to its folder, such as `~/.claude/skills/astryx`; action `written` | `linked` | `unchanged` | `removed` | `absent` | `kept`; `reason` on `kept`: `edited` | `not-astryx`), `data.command` (the command the text names), and `data.warnings`.',
|
|
100
|
+
},
|
|
81
101
|
],
|
|
82
102
|
throws: [
|
|
83
103
|
{
|
|
84
104
|
code: 'ERR_INVALID_ARGUMENT',
|
|
85
|
-
|
|
105
|
+
when: '--remove-agents is combined with --features, --all, --agent, or --agent-docs-path; --user is combined with --features, --all, --agent, or --agent-docs-path; or --all is combined with --features',
|
|
86
106
|
},
|
|
87
107
|
{
|
|
88
108
|
code: 'ERR_UNKNOWN_AGENT',
|
|
89
|
-
|
|
109
|
+
when: 'the agents feature runs (default mode, features includes agents, or all) and `agent` is not one of claude, cursor, codex, hermes, muse, all',
|
|
90
110
|
},
|
|
91
111
|
{
|
|
92
112
|
code: 'ERR_UNKNOWN_FEATURE',
|
|
@@ -109,6 +129,7 @@ export const doc = {
|
|
|
109
129
|
{label: 'Default setup', code: 'const r = await init();'},
|
|
110
130
|
{label: 'All features', code: 'await init({all: true});'},
|
|
111
131
|
{label: 'Remove agent docs', code: 'await init({removeAgents: true});'},
|
|
132
|
+
{label: 'Agent text for the whole computer', code: 'const r = await init({user: true});\nfor (const w of r.data.warnings) console.warn(w);'},
|
|
112
133
|
],
|
|
113
134
|
command: 'init',
|
|
114
135
|
related: ['doctor', 'upgrade', 'build', 'themeTemplate'],
|
package/api/init/init.mjs
CHANGED
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
* install path (agent-docs, theme +
|
|
11
11
|
* page-building guidance, template)
|
|
12
12
|
* - `init.remove` (remove/remove.mjs) — the `--remove-agents` path
|
|
13
|
+
* - `init.user` (user/user.mjs) — the `--user` path: the
|
|
14
|
+
* computer-level agent text, written
|
|
15
|
+
* or (with `--remove-agents`) removed
|
|
13
16
|
*
|
|
14
17
|
* This module also re-exports the leaf symbols the CLI + tests import by name
|
|
15
18
|
* (`getNextSteps`) so api/index.mjs, the command handler
|
|
@@ -18,6 +21,7 @@
|
|
|
18
21
|
|
|
19
22
|
import {run} from './run/run.mjs';
|
|
20
23
|
import {remove} from './remove/remove.mjs';
|
|
24
|
+
import {user} from './user/user.mjs';
|
|
21
25
|
import {AstryxError} from '../error.mjs';
|
|
22
26
|
import {ERROR_CODES} from '../../foundation/response/error-codes.mjs';
|
|
23
27
|
|
|
@@ -32,17 +36,37 @@ export {getNextSteps} from './run/run.mjs';
|
|
|
32
36
|
*/
|
|
33
37
|
|
|
34
38
|
/**
|
|
35
|
-
* Run the non-interactive init flow. Dispatches to the
|
|
36
|
-
* `--
|
|
37
|
-
*
|
|
39
|
+
* Run the non-interactive init flow. Dispatches to the user leaf when
|
|
40
|
+
* `--user` is set (it writes, or with `--remove-agents` removes, the
|
|
41
|
+
* computer-level agent text and nothing in the folder), to the remove leaf
|
|
42
|
+
* when `--remove-agents` is set, otherwise to the install (run) leaf, and
|
|
43
|
+
* returns that leaf's receipt. Progress is emitted through `logger` (silent by
|
|
38
44
|
* default); unknown feature or template names throw AstryxError with a stable
|
|
39
45
|
* code.
|
|
40
46
|
*
|
|
41
47
|
* @param {InitOptions} [options]
|
|
42
48
|
* @param {{cwd?: string}} [ctx]
|
|
43
|
-
* @returns {Promise<import('./init.type.mjs').InitRunResponse | import('./init.type.mjs').InitRemoveResponse>}
|
|
49
|
+
* @returns {Promise<import('./init.type.mjs').InitRunResponse | import('./init.type.mjs').InitRemoveResponse | import('./init.type.mjs').InitUserResponse>}
|
|
44
50
|
*/
|
|
45
51
|
export async function init(options = {}, {cwd = process.cwd()} = {}) {
|
|
52
|
+
if (options.user) {
|
|
53
|
+
// Its own path: fixed files in the home folder, never the project
|
|
54
|
+
// agent-docs resolution, so it works the same in every folder.
|
|
55
|
+
const refused = [
|
|
56
|
+
options.features ? '--features' : null,
|
|
57
|
+
options.all ? '--all' : null,
|
|
58
|
+
options.agentDocsPath ? '--agent-docs-path' : null,
|
|
59
|
+
options.agent ? '--agent' : null,
|
|
60
|
+
].filter(Boolean);
|
|
61
|
+
if (refused.length > 0) {
|
|
62
|
+
throw new AstryxError(
|
|
63
|
+
`\`--user\` cannot be combined with ${refused.join(', ')}: it writes one skill file for every agent on the computer, linked into the folders agents read, with no features, agents, or path to choose.`,
|
|
64
|
+
undefined,
|
|
65
|
+
ERROR_CODES.ERR_INVALID_ARGUMENT,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return user({remove: Boolean(options.removeAgents)});
|
|
69
|
+
}
|
|
46
70
|
if (options.removeAgents) {
|
|
47
71
|
const ignored = [
|
|
48
72
|
options.features ? '--features' : null,
|