@intentius/chant 0.13.1 → 0.15.0
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/dist/audit/catalog.d.ts +45 -5
- package/dist/audit/catalog.d.ts.map +1 -1
- package/dist/audit/proof.d.ts +3 -0
- package/dist/audit/proof.d.ts.map +1 -1
- package/dist/audit/report-model.d.ts +4 -1
- package/dist/audit/report-model.d.ts.map +1 -1
- package/dist/audit/report.d.ts +3 -0
- package/dist/audit/report.d.ts.map +1 -1
- package/dist/audit/rules-doc.d.ts +8 -2
- package/dist/audit/rules-doc.d.ts.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/lexicon-rolling-upgrade.d.ts +37 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.d.ts.map +1 -0
- package/dist/cli/commands/lexicon-surface-diff.d.ts +48 -0
- package/dist/cli/commands/lexicon-surface-diff.d.ts.map +1 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/pinned-upgrade.d.ts +41 -0
- package/dist/cli/commands/pinned-upgrade.d.ts.map +1 -0
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/components.d.ts +39 -0
- package/dist/cli/handlers/components.d.ts.map +1 -0
- package/dist/cli/handlers/dev.d.ts +3 -0
- package/dist/cli/handlers/dev.d.ts.map +1 -1
- package/dist/cli/handlers/graph.d.ts +4 -2
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/misc.d.ts.map +1 -1
- package/dist/cli/handlers/run.d.ts +49 -0
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +35 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/fetch.d.ts +22 -0
- package/dist/codegen/fetch.d.ts.map +1 -1
- package/dist/codegen/lexicon-regen.d.ts +110 -0
- package/dist/codegen/lexicon-regen.d.ts.map +1 -0
- package/dist/codegen/pinned-upgrade.d.ts +153 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -0
- package/dist/codegen/rolling-upgrade.d.ts +138 -0
- package/dist/codegen/rolling-upgrade.d.ts.map +1 -0
- package/dist/codegen/surface-snapshot.d.ts +173 -0
- package/dist/codegen/surface-snapshot.d.ts.map +1 -0
- package/dist/codegen/version-bump.d.ts +21 -0
- package/dist/codegen/version-bump.d.ts.map +1 -0
- package/dist/components/auto-release.d.ts +93 -0
- package/dist/components/auto-release.d.ts.map +1 -0
- package/dist/components/builders.d.ts +37 -0
- package/dist/components/builders.d.ts.map +1 -0
- package/dist/components/capability-plugin-loader.d.ts +111 -0
- package/dist/components/capability-plugin-loader.d.ts.map +1 -0
- package/dist/components/capability-plugin-schema.d.ts +24 -0
- package/dist/components/capability-plugin-schema.d.ts.map +1 -0
- package/dist/components/capability-plugin.d.ts +85 -0
- package/dist/components/capability-plugin.d.ts.map +1 -0
- package/dist/components/capability.d.ts +89 -0
- package/dist/components/capability.d.ts.map +1 -0
- package/dist/components/cli-support.d.ts +204 -0
- package/dist/components/cli-support.d.ts.map +1 -0
- package/dist/components/component.d.ts +179 -0
- package/dist/components/component.d.ts.map +1 -0
- package/dist/components/config-defaults.d.ts +41 -0
- package/dist/components/config-defaults.d.ts.map +1 -0
- package/dist/components/discover.d.ts +60 -0
- package/dist/components/discover.d.ts.map +1 -0
- package/dist/components/driver-output.d.ts +20 -0
- package/dist/components/driver-output.d.ts.map +1 -0
- package/dist/components/driver.d.ts +209 -0
- package/dist/components/driver.d.ts.map +1 -0
- package/dist/components/index.d.ts +22 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/manifest-persistence.d.ts +79 -0
- package/dist/components/manifest-persistence.d.ts.map +1 -0
- package/dist/components/pilots/alb-ecs.pilot.d.ts +27 -0
- package/dist/components/pilots/alb-ecs.pilot.d.ts.map +1 -0
- package/dist/components/pilots/dynamodb.pilot.d.ts +22 -0
- package/dist/components/pilots/dynamodb.pilot.d.ts.map +1 -0
- package/dist/components/pilots/jar-emr.pilot.d.ts +37 -0
- package/dist/components/pilots/jar-emr.pilot.d.ts.map +1 -0
- package/dist/components/pilots/lambda.pilot.d.ts +35 -0
- package/dist/components/pilots/lambda.pilot.d.ts.map +1 -0
- package/dist/components/pilots/neo4j-fanout.pilot.d.ts +17 -0
- package/dist/components/pilots/neo4j-fanout.pilot.d.ts.map +1 -0
- package/dist/components/pilots/project.d.ts +13 -0
- package/dist/components/pilots/project.d.ts.map +1 -0
- package/dist/components/presets/ecs-fargate.d.ts +59 -0
- package/dist/components/presets/ecs-fargate.d.ts.map +1 -0
- package/dist/components/presets/index.d.ts +29 -0
- package/dist/components/presets/index.d.ts.map +1 -0
- package/dist/components/presets/lambda.d.ts +35 -0
- package/dist/components/presets/lambda.d.ts.map +1 -0
- package/dist/components/presets/single-host-compose.d.ts +43 -0
- package/dist/components/presets/single-host-compose.d.ts.map +1 -0
- package/dist/components/registry.d.ts +29 -0
- package/dist/components/registry.d.ts.map +1 -0
- package/dist/components/starter-plugin.d.ts +51 -0
- package/dist/components/starter-plugin.d.ts.map +1 -0
- package/dist/components/temporal-codegen-loader.d.ts +27 -0
- package/dist/components/temporal-codegen-loader.d.ts.map +1 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts +35 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.d.ts.map +1 -0
- package/dist/components/verbs/__tests__/mock-process-runner.d.ts +45 -0
- package/dist/components/verbs/__tests__/mock-process-runner.d.ts.map +1 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts +33 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.d.ts.map +1 -0
- package/dist/components/verbs/bom-writer.d.ts +155 -0
- package/dist/components/verbs/bom-writer.d.ts.map +1 -0
- package/dist/components/verbs/build-archive.d.ts +205 -0
- package/dist/components/verbs/build-archive.d.ts.map +1 -0
- package/dist/components/verbs/build.d.ts +150 -0
- package/dist/components/verbs/build.d.ts.map +1 -0
- package/dist/components/verbs/cloud-executor.d.ts +88 -0
- package/dist/components/verbs/cloud-executor.d.ts.map +1 -0
- package/dist/components/verbs/component-bom.d.ts +103 -0
- package/dist/components/verbs/component-bom.d.ts.map +1 -0
- package/dist/components/verbs/index.d.ts +49 -0
- package/dist/components/verbs/index.d.ts.map +1 -0
- package/dist/components/verbs/license-policy.d.ts +56 -0
- package/dist/components/verbs/license-policy.d.ts.map +1 -0
- package/dist/components/verbs/lockfile-sbom-generator.d.ts +81 -0
- package/dist/components/verbs/lockfile-sbom-generator.d.ts.map +1 -0
- package/dist/components/verbs/process-runner.d.ts +64 -0
- package/dist/components/verbs/process-runner.d.ts.map +1 -0
- package/dist/components/verbs/reproducibility.d.ts +80 -0
- package/dist/components/verbs/reproducibility.d.ts.map +1 -0
- package/dist/components/verbs/sbom-generator.d.ts +157 -0
- package/dist/components/verbs/sbom-generator.d.ts.map +1 -0
- package/dist/components/verbs/sbom.d.ts +79 -0
- package/dist/components/verbs/sbom.d.ts.map +1 -0
- package/dist/components/verbs/shell.d.ts +35 -0
- package/dist/components/verbs/shell.d.ts.map +1 -0
- package/dist/components/verbs/sign.d.ts +222 -0
- package/dist/components/verbs/sign.d.ts.map +1 -0
- package/dist/components/verbs/stub.d.ts +18 -0
- package/dist/components/verbs/stub.d.ts.map +1 -0
- package/dist/components/verbs/tool-sbom-generator.d.ts +51 -0
- package/dist/components/verbs/tool-sbom-generator.d.ts.map +1 -0
- package/dist/components/verbs/verify.d.ts +106 -0
- package/dist/components/verbs/verify.d.ts.map +1 -0
- package/dist/components/verbs/vex.d.ts +65 -0
- package/dist/components/verbs/vex.d.ts.map +1 -0
- package/dist/components/verbs/vuln-gate.d.ts +91 -0
- package/dist/components/verbs/vuln-gate.d.ts.map +1 -0
- package/dist/components/verbs/vuln-scan.d.ts +116 -0
- package/dist/components/verbs/vuln-scan.d.ts.map +1 -0
- package/dist/components/verbs/wait-verify.d.ts +85 -0
- package/dist/components/verbs/wait-verify.d.ts.map +1 -0
- package/dist/config.d.ts +205 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/lexicon.d.ts +78 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/build-ledger-store.d.ts +121 -0
- package/dist/lifecycle/build-ledger-store.d.ts.map +1 -0
- package/dist/lifecycle/build-ledger.d.ts +225 -0
- package/dist/lifecycle/build-ledger.d.ts.map +1 -0
- package/dist/lifecycle/git.d.ts +84 -0
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lifecycle/index.d.ts +5 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/oras-referrer-lookup.d.ts +41 -0
- package/dist/lifecycle/oras-referrer-lookup.d.ts.map +1 -0
- package/dist/lifecycle/release-ledger.d.ts +122 -0
- package/dist/lifecycle/release-ledger.d.ts.map +1 -0
- package/dist/lifecycle/status.d.ts +150 -0
- package/dist/lifecycle/status.d.ts.map +1 -0
- package/dist/lint/component-checks.d.ts +95 -0
- package/dist/lint/component-checks.d.ts.map +1 -0
- package/dist/lint/engine.d.ts +23 -0
- package/dist/lint/engine.d.ts.map +1 -1
- package/dist/lint/presets/strict.json +8 -1
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts +3 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts +3 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.d.ts.map +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts +4 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts +20 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts +28 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts +39 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +37 -0
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts +43 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts +22 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.d.ts.map +1 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts +33 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.d.ts.map +1 -0
- package/dist/lint/rules/comp/index.d.ts +18 -0
- package/dist/lint/rules/comp/index.d.ts.map +1 -0
- package/dist/lint/rules/comp/support.d.ts +71 -0
- package/dist/lint/rules/comp/support.d.ts.map +1 -0
- package/dist/lsp/lexicon-providers.d.ts.map +1 -1
- package/dist/op/activity-registry.d.ts +11 -6
- package/dist/op/activity-registry.d.ts.map +1 -1
- package/dist/op/activity-runtime.d.ts +24 -0
- package/dist/op/activity-runtime.d.ts.map +1 -0
- package/dist/op/builders.d.ts +56 -0
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/index.d.ts +2 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/ownership.d.ts +20 -14
- package/dist/ownership.d.ts.map +1 -1
- package/package.json +14 -1
- package/src/audit/catalog.test.ts +74 -22
- package/src/audit/catalog.ts +74 -471
- package/src/audit/proof.ts +4 -2
- package/src/audit/report-html.test.ts +14 -7
- package/src/audit/report-model.ts +20 -9
- package/src/audit/report.test.ts +36 -13
- package/src/audit/report.ts +2 -0
- package/src/audit/rules-doc.test.ts +8 -6
- package/src/audit/rules-doc.ts +13 -5
- package/src/cli/commands/audit.ts +23 -18
- package/src/cli/commands/component-lint.test.ts +158 -0
- package/src/cli/commands/doctor.test.ts +116 -2
- package/src/cli/commands/doctor.ts +46 -0
- package/src/cli/commands/lexicon-rolling-upgrade.ts +198 -0
- package/src/cli/commands/lexicon-surface-diff.test.ts +104 -0
- package/src/cli/commands/lexicon-surface-diff.ts +185 -0
- package/src/cli/commands/lint.ts +142 -1
- package/src/cli/commands/pinned-upgrade.ts +204 -0
- package/src/cli/handlers/build.ts +58 -1
- package/src/cli/handlers/components.test.ts +504 -0
- package/src/cli/handlers/components.ts +404 -0
- package/src/cli/handlers/dev.ts +60 -1
- package/src/cli/handlers/graph.ts +47 -2
- package/src/cli/handlers/misc.ts +45 -1
- package/src/cli/handlers/run.test.ts +967 -3
- package/src/cli/handlers/run.ts +618 -11
- package/src/cli/main.test.ts +66 -0
- package/src/cli/main.ts +105 -2
- package/src/cli/registry.ts +35 -0
- package/src/codegen/fetch.test.ts +84 -3
- package/src/codegen/fetch.ts +76 -2
- package/src/codegen/lexicon-regen.test.ts +298 -0
- package/src/codegen/lexicon-regen.ts +545 -0
- package/src/codegen/pinned-upgrade.test.ts +399 -0
- package/src/codegen/pinned-upgrade.ts +423 -0
- package/src/codegen/rolling-upgrade.test.ts +333 -0
- package/src/codegen/rolling-upgrade.ts +320 -0
- package/src/codegen/surface-snapshot.test.ts +461 -0
- package/src/codegen/surface-snapshot.ts +546 -0
- package/src/codegen/version-bump.test.ts +47 -0
- package/src/codegen/version-bump.ts +39 -0
- package/src/components/README.md +130 -0
- package/src/components/SPRAWL-VALIDATION.md +181 -0
- package/src/components/__fixtures__/alb-ecs-service.json +51 -0
- package/src/components/__fixtures__/dynamodb-infra.json +32 -0
- package/src/components/__fixtures__/emr-job-consumer.json +26 -0
- package/src/components/__fixtures__/jar-lib-producer.json +16 -0
- package/src/components/__fixtures__/lambda-image-processor.json +28 -0
- package/src/components/__fixtures__/neo4j-fanout.json +34 -0
- package/src/components/__fixtures__/single-host-compose.json +29 -0
- package/src/components/auto-release.test.ts +217 -0
- package/src/components/auto-release.ts +216 -0
- package/src/components/builders.test.ts +45 -0
- package/src/components/builders.ts +71 -0
- package/src/components/capability-plugin-loader.ts +218 -0
- package/src/components/capability-plugin-schema.ts +56 -0
- package/src/components/capability-plugin.test.ts +235 -0
- package/src/components/capability-plugin.ts +108 -0
- package/src/components/capability.ts +117 -0
- package/src/components/cli-support.test.ts +579 -0
- package/src/components/cli-support.ts +481 -0
- package/src/components/component-schema.test.ts +265 -0
- package/src/components/component.schema.json +235 -0
- package/src/components/component.test.ts +251 -0
- package/src/components/component.ts +255 -0
- package/src/components/config-defaults.test.ts +263 -0
- package/src/components/config-defaults.ts +145 -0
- package/src/components/discover.test.ts +352 -0
- package/src/components/discover.ts +167 -0
- package/src/components/driver-output.ts +71 -0
- package/src/components/driver.test.ts +638 -0
- package/src/components/driver.ts +690 -0
- package/src/components/index.ts +113 -0
- package/src/components/manifest-persistence.test.ts +152 -0
- package/src/components/manifest-persistence.ts +164 -0
- package/src/components/pilots/README.md +33 -0
- package/src/components/pilots/alb-ecs.pilot.ts +63 -0
- package/src/components/pilots/dynamodb.pilot.ts +59 -0
- package/src/components/pilots/jar-emr.pilot.ts +69 -0
- package/src/components/pilots/lambda.pilot.ts +55 -0
- package/src/components/pilots/neo4j-fanout.pilot.ts +92 -0
- package/src/components/pilots/pilots-lint-clean.test.ts +78 -0
- package/src/components/pilots/pilots.test.ts +126 -0
- package/src/components/pilots/project.ts +13 -0
- package/src/components/presets/comp007-reduction.test.ts +122 -0
- package/src/components/presets/ecs-fargate.test.ts +84 -0
- package/src/components/presets/ecs-fargate.ts +103 -0
- package/src/components/presets/index.ts +32 -0
- package/src/components/presets/lambda.test.ts +35 -0
- package/src/components/presets/lambda.ts +53 -0
- package/src/components/presets/single-host-compose.test.ts +65 -0
- package/src/components/presets/single-host-compose.ts +64 -0
- package/src/components/registry.test.ts +112 -0
- package/src/components/registry.ts +37 -0
- package/src/components/starter-plugin.ts +105 -0
- package/src/components/temporal-codegen-loader.ts +41 -0
- package/src/components/verbs/__fixtures__/package-lock.json +45 -0
- package/src/components/verbs/__fixtures__/pom.xml +37 -0
- package/src/components/verbs/__fixtures__/schemas/cyclonedx-1.5.schema.json +3800 -0
- package/src/components/verbs/__fixtures__/schemas/cyclonedx-spdx-license.schema.json +621 -0
- package/src/components/verbs/__fixtures__/schemas/jsf-0.82.schema.json +240 -0
- package/src/components/verbs/__fixtures__/schemas/spdx-2.3.schema.json +740 -0
- package/src/components/verbs/__tests__/mock-cloud-executor.ts +102 -0
- package/src/components/verbs/__tests__/mock-process-runner.ts +79 -0
- package/src/components/verbs/__tests__/mock-sbom-generator.ts +85 -0
- package/src/components/verbs/bom-writer.test.ts +331 -0
- package/src/components/verbs/bom-writer.ts +386 -0
- package/src/components/verbs/build-archive.test.ts +251 -0
- package/src/components/verbs/build-archive.ts +296 -0
- package/src/components/verbs/build.test.ts +222 -0
- package/src/components/verbs/build.ts +252 -0
- package/src/components/verbs/cloud-executor.ts +181 -0
- package/src/components/verbs/component-bom.test.ts +219 -0
- package/src/components/verbs/component-bom.ts +189 -0
- package/src/components/verbs/index.ts +49 -0
- package/src/components/verbs/license-policy.ts +115 -0
- package/src/components/verbs/lockfile-sbom-generator.test.ts +195 -0
- package/src/components/verbs/lockfile-sbom-generator.ts +236 -0
- package/src/components/verbs/process-runner.test.ts +79 -0
- package/src/components/verbs/process-runner.ts +113 -0
- package/src/components/verbs/reproducibility.test.ts +24 -0
- package/src/components/verbs/reproducibility.ts +100 -0
- package/src/components/verbs/sbom-generator.test.ts +96 -0
- package/src/components/verbs/sbom-generator.ts +209 -0
- package/src/components/verbs/sbom.test.ts +184 -0
- package/src/components/verbs/sbom.ts +152 -0
- package/src/components/verbs/shell.test.ts +36 -0
- package/src/components/verbs/shell.ts +51 -0
- package/src/components/verbs/sign.test.ts +210 -0
- package/src/components/verbs/sign.ts +350 -0
- package/src/components/verbs/stub.ts +34 -0
- package/src/components/verbs/tool-sbom-generator.test.ts +194 -0
- package/src/components/verbs/tool-sbom-generator.ts +192 -0
- package/src/components/verbs/verify.test.ts +159 -0
- package/src/components/verbs/verify.ts +179 -0
- package/src/components/verbs/vex.ts +182 -0
- package/src/components/verbs/vuln-gate.test.ts +201 -0
- package/src/components/verbs/vuln-gate.ts +170 -0
- package/src/components/verbs/vuln-scan.test.ts +145 -0
- package/src/components/verbs/vuln-scan.ts +266 -0
- package/src/components/verbs/wait-verify.test.ts +111 -0
- package/src/components/verbs/wait-verify.ts +171 -0
- package/src/config.test.ts +74 -1
- package/src/config.ts +219 -0
- package/src/index.ts +32 -0
- package/src/lexicon.ts +88 -0
- package/src/lifecycle/build-ledger-store.test.ts +217 -0
- package/src/lifecycle/build-ledger-store.ts +165 -0
- package/src/lifecycle/build-ledger.test.ts +349 -0
- package/src/lifecycle/build-ledger.ts +305 -0
- package/src/lifecycle/git.test.ts +118 -0
- package/src/lifecycle/git.ts +149 -14
- package/src/lifecycle/index.ts +5 -0
- package/src/lifecycle/oras-referrer-lookup.test.ts +116 -0
- package/src/lifecycle/oras-referrer-lookup.ts +110 -0
- package/src/lifecycle/release-ledger.test.ts +209 -0
- package/src/lifecycle/release-ledger.ts +185 -0
- package/src/lifecycle/status.test.ts +330 -0
- package/src/lifecycle/status.ts +278 -0
- package/src/lint/component-checks.ts +148 -0
- package/src/lint/config.test.ts +21 -0
- package/src/lint/engine.ts +11 -2
- package/src/lint/presets/relaxed.json +8 -1
- package/src/lint/presets/strict.json +8 -1
- package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.ts +9 -0
- package/src/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.ts +9 -0
- package/src/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.ts +11 -0
- package/src/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.ts +13 -0
- package/src/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.ts +11 -0
- package/src/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.ts +27 -0
- package/src/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.ts +23 -0
- package/src/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.ts +19 -0
- package/src/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.ts +20 -0
- package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +23 -0
- package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.ts +14 -0
- package/src/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.ts +18 -0
- package/src/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.ts +10 -0
- package/src/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.ts +14 -0
- package/src/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.ts +13 -0
- package/src/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.ts +13 -0
- package/src/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.ts +12 -0
- package/src/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.ts +18 -0
- package/src/lint/rules/comp/comp.test.ts +378 -0
- package/src/lint/rules/comp/comp001-publishes-never-applies.ts +78 -0
- package/src/lint/rules/comp/comp002-dangling-wiring-ref.ts +94 -0
- package/src/lint/rules/comp/comp003-mutating-no-rollback.ts +115 -0
- package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +66 -0
- package/src/lint/rules/comp/comp005-capability-kind-is-noun.ts +113 -0
- package/src/lint/rules/comp/comp006-shell-needs-reason.ts +55 -0
- package/src/lint/rules/comp/comp007-composition-sprawl.ts +71 -0
- package/src/lint/rules/comp/index.ts +37 -0
- package/src/lint/rules/comp/support.ts +173 -0
- package/src/lsp/lexicon-providers.test.ts +55 -0
- package/src/lsp/lexicon-providers.ts +13 -3
- package/src/op/activity-registry.test.ts +38 -0
- package/src/op/activity-registry.ts +31 -12
- package/src/op/activity-runtime.ts +73 -0
- package/src/op/builders.ts +92 -0
- package/src/op/index.ts +3 -1
- package/src/ownership.test.ts +24 -26
- package/src/ownership.ts +26 -38
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-facing helpers over component discovery (#560, epic #551) — kept
|
|
3
|
+
* separate from ../cli/commands/{list,describe}.ts and
|
|
4
|
+
* ../cli/handlers/graph.ts so those files stay thin dispatchers and the
|
|
5
|
+
* component-specific report shaping lives alongside the rest of the
|
|
6
|
+
* component subsystem, the same way ../op/discover.ts's results are shaped
|
|
7
|
+
* inline by its own CLI callers rather than a `cli` folder inside `op/`.
|
|
8
|
+
*
|
|
9
|
+
* Surfaces components in the three places the issue asks for:
|
|
10
|
+
* - `chant list --components` — inventory (mirrors `ListEntity`/`listCommand`).
|
|
11
|
+
* - `chant describe <name> --components` — one component's full JSON contract
|
|
12
|
+
* projection (mirrors `describeCommand`'s effective-config view).
|
|
13
|
+
* - `chant graph --components` — dependency order/waves from `dependsOn`
|
|
14
|
+
* (mirrors `computeStackGraph`/`runStackGraph`, but reuses
|
|
15
|
+
* `resolveComponentGraph` from ../driver.ts since a component's `dependsOn`
|
|
16
|
+
* is already a flat name list — no AttrRef-style inference needed).
|
|
17
|
+
* - `chant build --components --generate gitlab` — generate mode (#563):
|
|
18
|
+
* synthesize CI YAML from the same discovered declarations instead of
|
|
19
|
+
* running them, via `generateGitlabPipeline` (../generate-gitlab.ts).
|
|
20
|
+
* - `chant run --components <name|all>` — interpret mode (#585): dispatch
|
|
21
|
+
* discovered component(s) through the interpret `driver.ts` on the local
|
|
22
|
+
* executor, the CLI entrypoint the driver (#556) never had.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { discoverComponents } from "./discover";
|
|
26
|
+
import { projectToJson, type Archetype } from "./component";
|
|
27
|
+
import {
|
|
28
|
+
resolveComponentGraph,
|
|
29
|
+
runInterpretDriver,
|
|
30
|
+
runComponentDeploy,
|
|
31
|
+
UnknownDependencyError,
|
|
32
|
+
DependencyCycleError,
|
|
33
|
+
DriverGateUnsupportedError,
|
|
34
|
+
DriverRunFailure,
|
|
35
|
+
type DriverComponent,
|
|
36
|
+
type DriverPhase,
|
|
37
|
+
type DriverRunResult,
|
|
38
|
+
} from "./driver";
|
|
39
|
+
import { isLexiconPlugin, type LexiconPlugin, type ComponentPipelineOptions } from "../lexicon";
|
|
40
|
+
import { buildCapabilityRegistry } from "./capability-plugin-loader";
|
|
41
|
+
import type { CapabilityRegistry } from "./capability";
|
|
42
|
+
import { applyConfigDefaults } from "./config-defaults";
|
|
43
|
+
import { loadChantConfig, type ChantConfig } from "../config";
|
|
44
|
+
|
|
45
|
+
/** One component in `chant list --components` output. */
|
|
46
|
+
export interface ListedComponent {
|
|
47
|
+
name: string;
|
|
48
|
+
archetype: Archetype;
|
|
49
|
+
dependsOn: string[];
|
|
50
|
+
hasBuild: boolean;
|
|
51
|
+
phases: string[];
|
|
52
|
+
filePath: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface ListComponentsResult {
|
|
56
|
+
success: boolean;
|
|
57
|
+
components: ListedComponent[];
|
|
58
|
+
errors: string[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Discover components under `path` and shape them for `chant list --components`. */
|
|
62
|
+
export async function listComponents(path: string): Promise<ListComponentsResult> {
|
|
63
|
+
const result = await discoverComponents(path);
|
|
64
|
+
if (result.errors.length > 0) {
|
|
65
|
+
return { success: false, components: [], errors: result.errors.map((e) => e.message) };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const components: ListedComponent[] = [...result.components.values()]
|
|
69
|
+
.map(({ component, filePath }) => {
|
|
70
|
+
const projected = projectToJson(component) as { archetype: Archetype };
|
|
71
|
+
return {
|
|
72
|
+
name: component.name,
|
|
73
|
+
archetype: projected.archetype,
|
|
74
|
+
dependsOn: component.dependsOn,
|
|
75
|
+
hasBuild: component.build !== undefined,
|
|
76
|
+
phases: component.deploy.map((p) => p.phase),
|
|
77
|
+
filePath,
|
|
78
|
+
};
|
|
79
|
+
})
|
|
80
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
81
|
+
|
|
82
|
+
return { success: true, components, errors: [] };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** One component's full JSON contract projection, for `chant describe <name> --components`. */
|
|
86
|
+
export interface DescribedComponent {
|
|
87
|
+
name: string;
|
|
88
|
+
filePath: string;
|
|
89
|
+
/** The component's JSON contract projection (validates against component.schema.json). */
|
|
90
|
+
json: unknown;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface DescribeComponentResult {
|
|
94
|
+
success: boolean;
|
|
95
|
+
component: string;
|
|
96
|
+
described?: DescribedComponent;
|
|
97
|
+
output: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Find and project one named component, for `chant describe <name> --components`. */
|
|
101
|
+
export async function describeComponent(path: string, name: string): Promise<DescribeComponentResult> {
|
|
102
|
+
const result = await discoverComponents(path);
|
|
103
|
+
if (result.errors.length > 0) {
|
|
104
|
+
return { success: false, component: name, output: result.errors.map((e) => e.message).join("\n") };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const found = result.components.get(name);
|
|
108
|
+
if (!found) {
|
|
109
|
+
const known = [...result.components.keys()].sort().join(", ");
|
|
110
|
+
return {
|
|
111
|
+
success: false,
|
|
112
|
+
component: name,
|
|
113
|
+
output: `No component "${name}" found.\nKnown components: ${known || "(none)"}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const json = projectToJson(found.component);
|
|
118
|
+
return {
|
|
119
|
+
success: true,
|
|
120
|
+
component: name,
|
|
121
|
+
described: { name, filePath: found.filePath, json },
|
|
122
|
+
output: "",
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Dependency order/waves for `chant graph --components`, from every discovered component's `dependsOn`. */
|
|
127
|
+
export interface ComponentGraphResult {
|
|
128
|
+
success: boolean;
|
|
129
|
+
order: string[];
|
|
130
|
+
waves: string[][];
|
|
131
|
+
edges: Array<{ from: string; to: string }>;
|
|
132
|
+
error?: string;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Compute the components' dependency graph under `path`, for `chant graph --components`. */
|
|
136
|
+
export async function computeComponentGraph(path: string): Promise<ComponentGraphResult> {
|
|
137
|
+
const result = await discoverComponents(path);
|
|
138
|
+
if (result.errors.length > 0) {
|
|
139
|
+
return { success: false, order: [], waves: [], edges: [], error: result.errors.map((e) => e.message).join("\n") };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const driverComponents: DriverComponent[] = [...result.components.values()].map(({ component }) => ({
|
|
143
|
+
name: component.name,
|
|
144
|
+
dependsOn: component.dependsOn,
|
|
145
|
+
deploy: component.deploy,
|
|
146
|
+
}));
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
const { order, waves } = resolveComponentGraph(driverComponents);
|
|
150
|
+
const edges: Array<{ from: string; to: string }> = [];
|
|
151
|
+
for (const c of driverComponents) {
|
|
152
|
+
for (const dep of c.dependsOn ?? []) edges.push({ from: c.name, to: dep });
|
|
153
|
+
}
|
|
154
|
+
return { success: true, order, waves, edges };
|
|
155
|
+
} catch (err) {
|
|
156
|
+
if (err instanceof UnknownDependencyError || err instanceof DependencyCycleError) {
|
|
157
|
+
return { success: false, order: [], waves: [], edges: [], error: err.message };
|
|
158
|
+
}
|
|
159
|
+
throw err;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** A generate-mode target lexicon name — any lexicon whose plugin implements `generateComponentPipeline` (currently gitlab; github/forgejo as they add it). */
|
|
164
|
+
export type GenerateLexicon = string;
|
|
165
|
+
|
|
166
|
+
/** Result of `chant build --components --generate <lexicon>`. */
|
|
167
|
+
export interface GenerateComponentsResult {
|
|
168
|
+
success: boolean;
|
|
169
|
+
/** The synthesized CI YAML, when `success` is true. */
|
|
170
|
+
yaml?: string;
|
|
171
|
+
/** Wave-ordered stage names (one entry per wave). */
|
|
172
|
+
stages?: string[];
|
|
173
|
+
/** Every generated job, for a machine-readable view (`--format json`). */
|
|
174
|
+
jobs?: Array<{ jobName: string; component: string; stage: string; needs: string[] }>;
|
|
175
|
+
error?: string;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Load a lexicon's plugin (`@intentius/chant-lexicon-<name>`) to reach its
|
|
180
|
+
* `generateComponentPipeline`. Tolerant: returns null when the package can't be
|
|
181
|
+
* resolved. Mirrors the lexicon-borne loading the capability + upstream-pin
|
|
182
|
+
* seams use, kept here so `components` doesn't depend on the `cli` plugin loader.
|
|
183
|
+
*/
|
|
184
|
+
async function loadLexiconPlugin(name: string): Promise<LexiconPlugin | null> {
|
|
185
|
+
let mod: Record<string, unknown>;
|
|
186
|
+
try {
|
|
187
|
+
mod = (await import(`@intentius/chant-lexicon-${name}`)) as Record<string, unknown>;
|
|
188
|
+
} catch {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
for (const value of Object.values(mod)) {
|
|
192
|
+
if (isLexiconPlugin(value)) return value;
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Generate mode (#563): discover every `Component` under `path` and
|
|
199
|
+
* synthesize a thin CI pipeline for `lexicon` that triggers each component's
|
|
200
|
+
* own composition in dependency order/waves — the same `resolveComponentGraph`
|
|
201
|
+
* order `chant graph --components`/the interpret driver use. No deploy logic
|
|
202
|
+
* is inlined into the generated YAML; a cross-cutting change goes through
|
|
203
|
+
* `options`, never per component. The CI-specific synthesis is contributed by
|
|
204
|
+
* the target lexicon's `generateComponentPipeline` (#688); core owns only the
|
|
205
|
+
* generic discovery + graph.
|
|
206
|
+
*/
|
|
207
|
+
export async function generateComponentsPipeline(
|
|
208
|
+
path: string,
|
|
209
|
+
lexicon: GenerateLexicon,
|
|
210
|
+
options?: ComponentPipelineOptions,
|
|
211
|
+
): Promise<GenerateComponentsResult> {
|
|
212
|
+
const plugin = await loadLexiconPlugin(lexicon);
|
|
213
|
+
if (!plugin?.generateComponentPipeline) {
|
|
214
|
+
return {
|
|
215
|
+
success: false,
|
|
216
|
+
error: `Lexicon "${lexicon}" does not support generate mode (no generateComponentPipeline). GitLab is supported today; GitHub/Forgejo as they add it.`,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const result = await discoverComponents(path);
|
|
221
|
+
if (result.errors.length > 0) {
|
|
222
|
+
return { success: false, error: result.errors.map((e) => e.message).join("\n") };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const driverComponents: DriverComponent[] = [...result.components.values()].map(({ component }) => ({
|
|
226
|
+
name: component.name,
|
|
227
|
+
dependsOn: component.dependsOn,
|
|
228
|
+
deploy: component.deploy,
|
|
229
|
+
}));
|
|
230
|
+
|
|
231
|
+
try {
|
|
232
|
+
const { yaml, stages, jobs } = plugin.generateComponentPipeline(driverComponents, options);
|
|
233
|
+
return { success: true, yaml, stages, jobs };
|
|
234
|
+
} catch (err) {
|
|
235
|
+
if (err instanceof UnknownDependencyError || err instanceof DependencyCycleError) {
|
|
236
|
+
return { success: false, error: err.message };
|
|
237
|
+
}
|
|
238
|
+
throw err;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// ── Interpret mode: `chant run --components <name|all>` (#585) ──────────────
|
|
243
|
+
|
|
244
|
+
/** Convert a discovered `Component` to the driver's leaner `DriverComponent` shape (name/dependsOn/deploy/rollback — the only fields the driver reads). */
|
|
245
|
+
function toDriverComponent(component: { name: string; dependsOn: string[]; deploy: DriverPhase[]; rollback?: DriverPhase[] }): DriverComponent {
|
|
246
|
+
return {
|
|
247
|
+
name: component.name,
|
|
248
|
+
dependsOn: component.dependsOn,
|
|
249
|
+
deploy: component.deploy,
|
|
250
|
+
...(component.rollback ? { rollback: component.rollback } : {}),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Find the first `gate` step anywhere in a component's `deploy`/`rollback`
|
|
256
|
+
* composition (including nested fan-out phases), mirroring
|
|
257
|
+
* `../op/local-executor.ts`'s `findGate`. Used as a pre-flight check so
|
|
258
|
+
* `chant run --components` fails before any step runs — matching
|
|
259
|
+
* `runOpLocal`'s behavior for Ops — rather than only failing mid-run when the
|
|
260
|
+
* driver itself reaches the gated phase (`DriverGateUnsupportedError`).
|
|
261
|
+
*/
|
|
262
|
+
export function findComponentGate(component: DriverComponent): { signalName: string } | undefined {
|
|
263
|
+
const search = (phases: DriverPhase[] | undefined): { signalName: string } | undefined => {
|
|
264
|
+
for (const phaseDef of phases ?? []) {
|
|
265
|
+
for (const entry of phaseDef.steps) {
|
|
266
|
+
if ((entry as { kind?: unknown }).kind === "gate") {
|
|
267
|
+
return entry as unknown as { signalName: string };
|
|
268
|
+
}
|
|
269
|
+
if (typeof (entry as DriverPhase).phase === "string" && Array.isArray((entry as DriverPhase).steps)) {
|
|
270
|
+
const nested = search([entry as DriverPhase]);
|
|
271
|
+
if (nested) return nested;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const fromOnFailure = search(phaseDef.onFailure);
|
|
275
|
+
if (fromOnFailure) return fromOnFailure;
|
|
276
|
+
}
|
|
277
|
+
return undefined;
|
|
278
|
+
};
|
|
279
|
+
return search(component.deploy) ?? search(component.rollback);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/** Options for `runComponents` (backs `chant run --components <name|all> [--env <env>]`). */
|
|
283
|
+
export interface RunComponentsOptions {
|
|
284
|
+
/** Target environment name, threaded into every capability's `DeployContext.env` (default: "local"). */
|
|
285
|
+
env?: string;
|
|
286
|
+
/** Additional capability plugin package names to load on top of the built-in starter set (see `buildCapabilityRegistry`). */
|
|
287
|
+
capabilityPlugins?: string[];
|
|
288
|
+
/**
|
|
289
|
+
* Pre-built registry to dispatch through, bypassing `buildCapabilityRegistry`
|
|
290
|
+
* entirely. Real callers (the CLI handler) should leave this unset; it exists
|
|
291
|
+
* so tests can inject a registry wired to a `MockCloudExecutor` (mirroring
|
|
292
|
+
* `../components/pilots/pilots-e2e.test.ts`'s `buildRegistry`) instead of the
|
|
293
|
+
* default starter set, whose non-pilot verbs are still typed stubs that throw
|
|
294
|
+
* `CapabilityNotImplementedError` (see `./verbs/stub.ts`).
|
|
295
|
+
*/
|
|
296
|
+
registry?: CapabilityRegistry;
|
|
297
|
+
/**
|
|
298
|
+
* Pre-loaded project config to resolve `sbom`/`signing`/`vulnPolicy`
|
|
299
|
+
* defaults from (#629), bypassing `loadChantConfig` entirely. Real callers
|
|
300
|
+
* (the CLI handler) should leave this unset — `runComponents` loads
|
|
301
|
+
* `chant.config.ts`/`chant.config.json` from `path` itself; this exists so
|
|
302
|
+
* tests can inject a config object directly, the same escape hatch
|
|
303
|
+
* `registry` above provides for the capability registry.
|
|
304
|
+
*/
|
|
305
|
+
config?: ChantConfig;
|
|
306
|
+
/**
|
|
307
|
+
* Cross-component/cross-stack outputs to seed the run with — keyed by
|
|
308
|
+
* component name, the same shape `DriverRunResult.componentOutputs` produces.
|
|
309
|
+
* The CLI populates this from `--seed-outputs` files (an upstream CI job's
|
|
310
|
+
* dumped outputs), so a single-component run in a downstream job can resolve
|
|
311
|
+
* `stackOutput()`/`@<name>.publish.*` references to a component that already
|
|
312
|
+
* ran elsewhere. Merged with, and overridden by, outputs this run produces.
|
|
313
|
+
*/
|
|
314
|
+
componentOutputs?: Record<string, Record<string, unknown>>;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/** Result of `chant run --components <name|all>`. */
|
|
318
|
+
export interface RunComponentsResult {
|
|
319
|
+
success: boolean;
|
|
320
|
+
/** The driver's run result, when the run reached the driver (even on a failed component). */
|
|
321
|
+
run?: DriverRunResult;
|
|
322
|
+
/** Component names actually dispatched to the driver, in run order. */
|
|
323
|
+
selected: string[];
|
|
324
|
+
error?: string;
|
|
325
|
+
/** Set when a selected component (or one of its `deploy`/`rollback` phases) contains a `gate` the local executor cannot run. */
|
|
326
|
+
gateUnsupported?: { component: string; signalName: string };
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Run one named component, or every discovered component (`selector ===
|
|
331
|
+
* "all"`), through the interpret driver (`../components/driver.ts`) on the
|
|
332
|
+
* local in-process executor — the CLI entrypoint the driver never had (#585,
|
|
333
|
+
* follow-up to #556). Discovers the full component set first, then either:
|
|
334
|
+
* - `selector === "all"`: resolves the whole set's dependency order/waves
|
|
335
|
+
* and dispatches every component through `runInterpretDriver`, matching
|
|
336
|
+
* what the generated orchestrator Op will eventually do — the same
|
|
337
|
+
* order `chant graph --components` reports.
|
|
338
|
+
* - a single name: dispatches just that component via `runComponentDeploy`,
|
|
339
|
+
* without requiring the rest of its `dependsOn` graph to be present in
|
|
340
|
+
* this invocation. This mirrors generate mode's per-job invocation model
|
|
341
|
+
* (`generate-gitlab.ts`) — each CI job triggers exactly one component, and
|
|
342
|
+
* cross-job/cross-wave ordering is the CI DAG's (`needs:`) job, not this
|
|
343
|
+
* command's; requiring the full graph here would make `chant run
|
|
344
|
+
* --components <name>` fail for any component whose `dependsOn` names
|
|
345
|
+
* infra outside the discovered set (e.g. a shared stack, per the
|
|
346
|
+
* `search-service` pilot), which is exactly the common case.
|
|
347
|
+
*
|
|
348
|
+
* Pre-flights every selected component for a `gate` step and fails before any
|
|
349
|
+
* step runs (`gateUnsupported`), matching `runOpLocal`'s pre-flight
|
|
350
|
+
* `findGate` check for Ops — gated components need a durable (Temporal)
|
|
351
|
+
* backend, which is out of scope here (issue #585 scopes Temporal-backed
|
|
352
|
+
* component execution to what already exists for Ops; the epic tracks
|
|
353
|
+
* graduating a gated component to `--temporal` separately).
|
|
354
|
+
*/
|
|
355
|
+
/** Result of resolving a `<name|all>` selector against discovered components — shared by the local (`runComponents`) and durable (Temporal codegen, #589) entrypoints. */
|
|
356
|
+
export interface ResolvedComponentTargets {
|
|
357
|
+
success: boolean;
|
|
358
|
+
targets: DriverComponent[];
|
|
359
|
+
error?: string;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Discover every component under `path` and resolve `selector` (`"all"` or a
|
|
364
|
+
* single component name) to the `DriverComponent`(s) to run, with no gate
|
|
365
|
+
* check and no dispatch — just discovery + selection, factored out of
|
|
366
|
+
* `runComponents` so the durable Temporal entrypoint (`chant run --components
|
|
367
|
+
* <name> --temporal`, #589) can reuse the exact same selection semantics
|
|
368
|
+
* without also inheriting the local executor's pre-flight gate rejection
|
|
369
|
+
* (gates are exactly what the durable path exists to support).
|
|
370
|
+
*/
|
|
371
|
+
export async function resolveComponentTargets(path: string, selector: string): Promise<ResolvedComponentTargets> {
|
|
372
|
+
const result = await discoverComponents(path);
|
|
373
|
+
if (result.errors.length > 0) {
|
|
374
|
+
return { success: false, targets: [], error: result.errors.map((e) => e.message).join("\n") };
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
const all = [...result.components.values()].map(({ component }) => toDriverComponent(component));
|
|
378
|
+
|
|
379
|
+
if (selector === "all") {
|
|
380
|
+
return { success: true, targets: all };
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const found = all.find((c) => c.name === selector);
|
|
384
|
+
if (!found) {
|
|
385
|
+
const known = all.map((c) => c.name).sort().join(", ");
|
|
386
|
+
return {
|
|
387
|
+
success: false,
|
|
388
|
+
targets: [],
|
|
389
|
+
error: `Component "${selector}" not found.${known ? ` Known components: ${known}` : " No components discovered."}`,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
return { success: true, targets: [found] };
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export async function runComponents(
|
|
396
|
+
path: string,
|
|
397
|
+
selector: string,
|
|
398
|
+
options: RunComponentsOptions = {},
|
|
399
|
+
): Promise<RunComponentsResult> {
|
|
400
|
+
const resolved = await resolveComponentTargets(path, selector);
|
|
401
|
+
if (!resolved.success) {
|
|
402
|
+
return { success: false, selected: [], error: resolved.error };
|
|
403
|
+
}
|
|
404
|
+
const targets = resolved.targets;
|
|
405
|
+
|
|
406
|
+
for (const component of targets) {
|
|
407
|
+
const gate = findComponentGate(component);
|
|
408
|
+
if (gate) {
|
|
409
|
+
return {
|
|
410
|
+
success: false,
|
|
411
|
+
selected: targets.map((c) => c.name),
|
|
412
|
+
gateUnsupported: { component: component.name, signalName: gate.signalName },
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// (#629) Resolve `chant.config.ts`'s `sbom`/`signing`/`vulnPolicy` sections
|
|
418
|
+
// and fill their defaults into every recognized step (`generate-sbom`,
|
|
419
|
+
// `sign`/`attest-provenance`, `verify`, `vuln-gate`) that didn't already
|
|
420
|
+
// specify the value itself, BEFORE dispatching to the driver — the driver
|
|
421
|
+
// itself stays capability-agnostic and never reads project config (see
|
|
422
|
+
// ./config-defaults.ts's module doc). Loaded up front here (rather than just
|
|
423
|
+
// before `applyConfigDefaults`) so the same config drives which capability
|
|
424
|
+
// plugins the registry loads: a component's cloud leaves (e.g. `cfn-deploy`)
|
|
425
|
+
// are contributed by the project's active lexicons (`config.lexicons`), not
|
|
426
|
+
// baked into core — see ./capability-plugin-loader.ts.
|
|
427
|
+
const { config } = options.config ? { config: options.config } : await loadChantConfig(path);
|
|
428
|
+
const registry: CapabilityRegistry =
|
|
429
|
+
options.registry ??
|
|
430
|
+
(await buildCapabilityRegistry({
|
|
431
|
+
plugins: options.capabilityPlugins ?? config.capabilities,
|
|
432
|
+
lexicons: config.lexicons,
|
|
433
|
+
}));
|
|
434
|
+
const env = options.env ?? "local";
|
|
435
|
+
const selected = targets.map((c) => c.name);
|
|
436
|
+
const resolvedTargets = targets.map((component) => applyConfigDefaults(component, config));
|
|
437
|
+
// Cross-component/cross-stack outputs to resolve references against. Seeded
|
|
438
|
+
// from a caller (a downstream CI job passing an upstream job's dumped
|
|
439
|
+
// outputs via `--seed-outputs`); grows as this run's components complete.
|
|
440
|
+
const seedOutputs = options.componentOutputs ?? {};
|
|
441
|
+
|
|
442
|
+
try {
|
|
443
|
+
if (selector === "all") {
|
|
444
|
+
const run = await runInterpretDriver(resolvedTargets, registry, { env, componentOutputs: seedOutputs });
|
|
445
|
+
return { success: true, run, selected };
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Single-component invocation: run just this component, bypassing
|
|
449
|
+
// whole-graph `dependsOn` resolution (see docstring above). The seeded
|
|
450
|
+
// outputs stand in for the dependency components that ran in earlier jobs,
|
|
451
|
+
// so a single-component run still resolves their `stackOutput()`/publish
|
|
452
|
+
// references. `runComponentDeploy` mutates this map with this component's
|
|
453
|
+
// own outputs, which `run.componentOutputs` then exposes for `--dump-outputs`.
|
|
454
|
+
const componentOutputs = { ...seedOutputs };
|
|
455
|
+
const componentResult = await runComponentDeploy(resolvedTargets[0], { env, component: resolvedTargets[0].name }, registry, componentOutputs);
|
|
456
|
+
const run: DriverRunResult = {
|
|
457
|
+
order: selected,
|
|
458
|
+
waves: [selected],
|
|
459
|
+
results: [componentResult],
|
|
460
|
+
ok: componentResult.ok,
|
|
461
|
+
failedComponent: componentResult.ok ? undefined : componentResult.component,
|
|
462
|
+
componentOutputs,
|
|
463
|
+
};
|
|
464
|
+
return { success: componentResult.ok, run, selected };
|
|
465
|
+
} catch (err) {
|
|
466
|
+
if (err instanceof DriverRunFailure) {
|
|
467
|
+
return { success: false, run: err.result, selected, error: err.message };
|
|
468
|
+
}
|
|
469
|
+
if (err instanceof DriverGateUnsupportedError) {
|
|
470
|
+
return {
|
|
471
|
+
success: false,
|
|
472
|
+
selected,
|
|
473
|
+
gateUnsupported: { component: err.component, signalName: err.signalName },
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
if (err instanceof UnknownDependencyError || err instanceof DependencyCycleError) {
|
|
477
|
+
return { success: false, selected, error: err.message };
|
|
478
|
+
}
|
|
479
|
+
throw err;
|
|
480
|
+
}
|
|
481
|
+
}
|