@intentius/chant 0.13.0 → 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/fetch.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/fetch.test.ts +112 -8
- package/src/audit/fetch.ts +53 -8
- 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,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates the Component JSON Schema (draft 2020-12) itself, plus every
|
|
3
|
+
* fixture under __fixtures__/ against it.
|
|
4
|
+
*
|
|
5
|
+
* The schema is the portable contract described in
|
|
6
|
+
* docs/src/content/docs/components/component-contract.mdx and
|
|
7
|
+
* composition-and-wiring.mdx — see #551 (epic) and #553 (this schema).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { describe, expect, it } from "vitest";
|
|
13
|
+
import Ajv2020 from "ajv/dist/2020";
|
|
14
|
+
import componentSchema from "./component.schema.json";
|
|
15
|
+
|
|
16
|
+
const FIXTURES_DIR = join(import.meta.dirname, "__fixtures__");
|
|
17
|
+
|
|
18
|
+
function loadFixtures(): Array<{ name: string; data: unknown }> {
|
|
19
|
+
return readdirSync(FIXTURES_DIR)
|
|
20
|
+
.filter((f) => f.endsWith(".json"))
|
|
21
|
+
.sort()
|
|
22
|
+
.map((name) => ({
|
|
23
|
+
name,
|
|
24
|
+
data: JSON.parse(readFileSync(join(FIXTURES_DIR, name), "utf-8")),
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe("Component JSON Schema", () => {
|
|
29
|
+
const ajv = new Ajv2020({ strict: true, allErrors: true });
|
|
30
|
+
const validate = ajv.compile(componentSchema);
|
|
31
|
+
|
|
32
|
+
it("is itself a valid draft 2020-12 schema document", () => {
|
|
33
|
+
expect(componentSchema.$schema).toBe("https://json-schema.org/draft/2020-12/schema");
|
|
34
|
+
expect(ajv.validateSchema(componentSchema)).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("has a stable $id and a contract version", () => {
|
|
38
|
+
expect(componentSchema.$id).toBe(
|
|
39
|
+
"https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
40
|
+
);
|
|
41
|
+
expect(componentSchema.properties.contractVersion.const).toBe("1.0.0");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const fixtures = loadFixtures();
|
|
45
|
+
|
|
46
|
+
it("finds fixtures to validate", () => {
|
|
47
|
+
expect(fixtures.length).toBeGreaterThanOrEqual(4);
|
|
48
|
+
expect(fixtures.length).toBeLessThanOrEqual(7);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it.each(fixtures.map((f) => [f.name, f.data] as const))(
|
|
52
|
+
"fixture %s validates against the schema",
|
|
53
|
+
(name, data) => {
|
|
54
|
+
const valid = validate(data);
|
|
55
|
+
if (!valid) {
|
|
56
|
+
throw new Error(`${name} failed schema validation: ${ajv.errorsText(validate.errors)}`);
|
|
57
|
+
}
|
|
58
|
+
expect(valid).toBe(true);
|
|
59
|
+
},
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
it("rejects a component missing the required `deploy` field", () => {
|
|
63
|
+
const invalid = { name: "broken", dependsOn: [] };
|
|
64
|
+
expect(validate(invalid)).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("rejects a component name that is not kebab-case", () => {
|
|
68
|
+
const invalid = { name: "Not_Kebab", dependsOn: [], deploy: [{ phase: "Apply", steps: [{ kind: "shell" }] }] };
|
|
69
|
+
expect(validate(invalid)).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("rejects an unknown top-level field (additionalProperties: false)", () => {
|
|
73
|
+
const invalid = {
|
|
74
|
+
name: "x",
|
|
75
|
+
dependsOn: [],
|
|
76
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "shell" }] }],
|
|
77
|
+
notAField: true,
|
|
78
|
+
};
|
|
79
|
+
expect(validate(invalid)).toBe(false);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("accepts a producer-library component whose deploy is publish-only", () => {
|
|
83
|
+
const producer = {
|
|
84
|
+
name: "jar-lib",
|
|
85
|
+
archetype: "producer-library",
|
|
86
|
+
dependsOn: [],
|
|
87
|
+
build: { kind: "jvm-build" },
|
|
88
|
+
deploy: [{ phase: "Publish", steps: [{ kind: "publish-artifact", from: "archive", to: "$env.s3" }] }],
|
|
89
|
+
};
|
|
90
|
+
expect(validate(producer)).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("accepts an infra component with no build", () => {
|
|
94
|
+
const infra = {
|
|
95
|
+
name: "table",
|
|
96
|
+
archetype: "infra",
|
|
97
|
+
dependsOn: [],
|
|
98
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "cfn-deploy", template: "t.json" }] }],
|
|
99
|
+
};
|
|
100
|
+
expect(validate(infra)).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("accepts an optional liveNames mapping (#598)", () => {
|
|
104
|
+
const withLiveNames = {
|
|
105
|
+
name: "search-svc",
|
|
106
|
+
archetype: "service",
|
|
107
|
+
dependsOn: [],
|
|
108
|
+
liveNames: ["search-service-v2"],
|
|
109
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "cfn-deploy", template: "t.json" }] }],
|
|
110
|
+
};
|
|
111
|
+
expect(validate(withLiveNames)).toBe(true);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("accepts several liveNames for a component that owns multiple live entities (#598)", () => {
|
|
115
|
+
const fanOutLiveNames = {
|
|
116
|
+
name: "neo4j-cluster",
|
|
117
|
+
archetype: "infra",
|
|
118
|
+
dependsOn: [],
|
|
119
|
+
liveNames: ["cluster-node-1", "cluster-node-2"],
|
|
120
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "cfn-deploy", template: "t.json" }] }],
|
|
121
|
+
};
|
|
122
|
+
expect(validate(fanOutLiveNames)).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it("omitting liveNames still validates (backward-compatible default)", () => {
|
|
126
|
+
const noLiveNames = {
|
|
127
|
+
name: "table",
|
|
128
|
+
archetype: "infra",
|
|
129
|
+
dependsOn: [],
|
|
130
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "cfn-deploy", template: "t.json" }] }],
|
|
131
|
+
};
|
|
132
|
+
expect(validate(noLiveNames)).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it("rejects an empty liveNames array (minItems: 1)", () => {
|
|
136
|
+
const invalid = {
|
|
137
|
+
name: "table",
|
|
138
|
+
archetype: "infra",
|
|
139
|
+
dependsOn: [],
|
|
140
|
+
liveNames: [],
|
|
141
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "cfn-deploy", template: "t.json" }] }],
|
|
142
|
+
};
|
|
143
|
+
expect(validate(invalid)).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("rejects an invalid archetype value", () => {
|
|
147
|
+
const invalid = {
|
|
148
|
+
name: "x",
|
|
149
|
+
archetype: "worker",
|
|
150
|
+
dependsOn: [],
|
|
151
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "shell" }] }],
|
|
152
|
+
};
|
|
153
|
+
expect(validate(invalid)).toBe(false);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("accepts a gate step inside a phase", () => {
|
|
157
|
+
const withGate = {
|
|
158
|
+
name: "gated",
|
|
159
|
+
dependsOn: [],
|
|
160
|
+
deploy: [
|
|
161
|
+
{
|
|
162
|
+
phase: "Approve",
|
|
163
|
+
steps: [{ kind: "gate", signalName: "approve-gated", description: "confirm", timeout: "24h" }],
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
expect(validate(withGate)).toBe(true);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("rejects a gate step missing signalName", () => {
|
|
171
|
+
const invalid = {
|
|
172
|
+
name: "gated",
|
|
173
|
+
dependsOn: [],
|
|
174
|
+
deploy: [{ phase: "Approve", steps: [{ kind: "gate" }] }],
|
|
175
|
+
};
|
|
176
|
+
expect(validate(invalid)).toBe(false);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it("accepts a stackOutput cross-stack reference", () => {
|
|
180
|
+
const withStackOutput = {
|
|
181
|
+
name: "svc",
|
|
182
|
+
dependsOn: ["shared-alb"],
|
|
183
|
+
deploy: [
|
|
184
|
+
{
|
|
185
|
+
phase: "Apply",
|
|
186
|
+
steps: [
|
|
187
|
+
{
|
|
188
|
+
kind: "cfn-deploy",
|
|
189
|
+
inputs: { listenerArn: { stackOutput: { stack: "shared-alb", name: "ListenerArn" } } },
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
};
|
|
195
|
+
expect(validate(withStackOutput)).toBe(true);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it("accepts a fan-out phase nesting a mini-composition", () => {
|
|
199
|
+
const fanOut = {
|
|
200
|
+
name: "cluster",
|
|
201
|
+
dependsOn: [],
|
|
202
|
+
deploy: [
|
|
203
|
+
{
|
|
204
|
+
phase: "Rolling",
|
|
205
|
+
steps: [
|
|
206
|
+
{ phase: "Node 1", steps: [{ kind: "cfn-deploy", template: "t.json" }] },
|
|
207
|
+
{ phase: "Node 2", steps: [{ kind: "cfn-deploy", template: "t.json" }] },
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
};
|
|
212
|
+
expect(validate(fanOut)).toBe(true);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("accepts parallel steps within a phase", () => {
|
|
216
|
+
const parallelPhase = {
|
|
217
|
+
name: "svc",
|
|
218
|
+
dependsOn: [],
|
|
219
|
+
deploy: [
|
|
220
|
+
{
|
|
221
|
+
phase: "Verify",
|
|
222
|
+
parallel: true,
|
|
223
|
+
steps: [{ kind: "wait-for-stack", stack: "a" }, { kind: "wait-endpoint", url: "b" }],
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
};
|
|
227
|
+
expect(validate(parallelPhase)).toBe(true);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
describe("wiring reference forms", () => {
|
|
231
|
+
function componentWith(imageRef: unknown) {
|
|
232
|
+
return {
|
|
233
|
+
name: "svc",
|
|
234
|
+
dependsOn: [],
|
|
235
|
+
deploy: [{ phase: "Apply", steps: [{ kind: "cfn-deploy", imageRef }] }],
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
it("accepts a prior-step reference (@Phase.field)", () => {
|
|
240
|
+
expect(validate(componentWith("@Publish.digest"))).toBe(true);
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
it("accepts a cross-component artifact reference (@component.publish.uri|digest|key)", () => {
|
|
244
|
+
expect(validate(componentWith("@jar-lib.publish.uri"))).toBe(true);
|
|
245
|
+
expect(validate(componentWith("@jar-lib.publish.digest"))).toBe(true);
|
|
246
|
+
expect(validate(componentWith("@jar-lib.publish.key"))).toBe(true);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("accepts an $env.* reference", () => {
|
|
250
|
+
expect(validate(componentWith("$env.registry"))).toBe(true);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it("accepts a plain literal string with no reference sigil", () => {
|
|
254
|
+
expect(validate(componentWith("sha256:abc123"))).toBe(true);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it("rejects a cross-component reference to an unrecognized artifact field", () => {
|
|
258
|
+
expect(validate(componentWith("@jar-lib.publish.nonsense"))).toBe(false);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it("rejects a malformed @ reference with no dotted path", () => {
|
|
262
|
+
expect(validate(componentWith("@justaname"))).toBe(false);
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
});
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
4
|
+
"title": "Component",
|
|
5
|
+
"description": "The portable JSON contract for a chant component — a releasable unit (service, infra, or producer/library) declared as data. This document is the substrate: chant's TypeScript authoring form projects to it, and a non-chant or legacy component may hand-write it directly. See docs/src/content/docs/components/component-contract.mdx and composition-and-wiring.mdx, which are authoritative over this schema.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["name", "dependsOn", "deploy"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Optional self-reference to this schema's $id, for editor tooling and validators."
|
|
13
|
+
},
|
|
14
|
+
"contractVersion": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"const": "1.0.0",
|
|
17
|
+
"description": "Version of the Component contract this document conforms to. Versioned independently of chant's own release train."
|
|
18
|
+
},
|
|
19
|
+
"name": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"minLength": 1,
|
|
22
|
+
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
|
|
23
|
+
"description": "Kebab-case component identifier, unique within the project. Used as the node name in the dependency graph and as the `@<component>` prefix in cross-component wiring references."
|
|
24
|
+
},
|
|
25
|
+
"dependsOn": {
|
|
26
|
+
"type": "array",
|
|
27
|
+
"description": "Other component names that must complete before this one runs. Ordering only — no logic. Resolved by `chant graph --stacks` into order and parallel-safe waves.",
|
|
28
|
+
"items": { "type": "string", "minLength": 1 },
|
|
29
|
+
"default": []
|
|
30
|
+
},
|
|
31
|
+
"build": { "$ref": "#/$defs/BuildSpec" },
|
|
32
|
+
"deploy": {
|
|
33
|
+
"type": "array",
|
|
34
|
+
"description": "The component's own composition over shared capabilities: an ordered list of phases. verify and rollback fall out of the capabilities used (e.g. a Verify phase, or a capability's own compensation) rather than being separate top-level fields.",
|
|
35
|
+
"items": { "$ref": "#/$defs/Phase" },
|
|
36
|
+
"minItems": 1
|
|
37
|
+
},
|
|
38
|
+
"verify": {
|
|
39
|
+
"type": "array",
|
|
40
|
+
"description": "Optional standalone verify phases, for components that separate verification from the main deploy composition (e.g. re-run as a health check outside a deploy). Most components instead include a Verify phase inline in `deploy`.",
|
|
41
|
+
"items": { "$ref": "#/$defs/Phase" }
|
|
42
|
+
},
|
|
43
|
+
"rollback": {
|
|
44
|
+
"type": "array",
|
|
45
|
+
"description": "Optional explicit compensation phases, executed in reverse order on terminal failure of `deploy` (a saga). Equivalent in shape to an Op's `onFailure`. Most rollback instead falls out of per-step `rollback`/compensation declared by the capabilities used; this field is for a component-level override or an escape-hatch capability with no native compensation.",
|
|
46
|
+
"items": { "$ref": "#/$defs/Phase" }
|
|
47
|
+
},
|
|
48
|
+
"archetype": {
|
|
49
|
+
"$ref": "#/$defs/Archetype",
|
|
50
|
+
"description": "Optional explicit archetype hint. When omitted, the archetype is inferred structurally from which phases/capability families are present (see the archetype table in component-contract.mdx)."
|
|
51
|
+
},
|
|
52
|
+
"liveNames": {
|
|
53
|
+
"type": "array",
|
|
54
|
+
"description": "Optional: the live lexicon entity/resource name(s) this component owns, when they differ from `name` (#598). `chant components status --live` reconciles the release ledger against live evidence by joining on this name; omitted entirely (the default), the join falls back to `name` itself with no behavior change. A component that owns several live entities (e.g. a fan-out cluster with one stack per node) may list them all.",
|
|
55
|
+
"items": { "type": "string", "minLength": 1 },
|
|
56
|
+
"minItems": 1
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"$defs": {
|
|
60
|
+
"Archetype": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"enum": ["service", "infra", "producer-library"],
|
|
63
|
+
"description": "The three first-class shapes `deploy` can take. service: build -> publish -> apply -> verify (e.g. an ECS service behind an ALB). infra: apply -> verify, no build (e.g. a DynamoDB table, an EMR cluster). producer-library: build -> publish only, no service apply — emits an artifact other components consume (e.g. a JAR published to S3 for EMR)."
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
"BuildSpec": {
|
|
67
|
+
"type": "object",
|
|
68
|
+
"description": "Optional: source -> BuildArchive. Omitted entirely for config-only / infra components that apply existing templates with no build step.",
|
|
69
|
+
"required": ["kind"],
|
|
70
|
+
"properties": {
|
|
71
|
+
"kind": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"minLength": 1,
|
|
74
|
+
"description": "Build capability verb, keyed by artifact type, e.g. \"docker-build\", \"zip-package\", \"jvm-build\". Not a closed enum — the capability registry is a plugin registry."
|
|
75
|
+
},
|
|
76
|
+
"context": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"description": "Build context path (e.g. a Docker build context directory)."
|
|
79
|
+
},
|
|
80
|
+
"into": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"const": "archive",
|
|
83
|
+
"description": "Build output always lands in the self-contained BuildArchive; this field documents that destination explicitly in the JSON projection."
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"additionalProperties": true
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
"Phase": {
|
|
90
|
+
"type": "object",
|
|
91
|
+
"description": "One named phase of a deploy composition, run in order relative to sibling phases. Steps within a phase run sequentially unless `parallel` is set.",
|
|
92
|
+
"required": ["phase", "steps"],
|
|
93
|
+
"additionalProperties": false,
|
|
94
|
+
"properties": {
|
|
95
|
+
"phase": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"minLength": 1,
|
|
98
|
+
"description": "Phase display name (e.g. \"Publish\", \"Apply\", \"Verify\", \"Seed\", \"Node 1\"). Also the namespace prior-step wiring references key off (`@Phase.field`)."
|
|
99
|
+
},
|
|
100
|
+
"steps": {
|
|
101
|
+
"type": "array",
|
|
102
|
+
"description": "Ordered steps in this phase. A step may itself be a Step (a capability invocation), a Gate, or a nested Phase — a fan-out unit is itself a mini-composition (see composition-and-wiring.mdx).",
|
|
103
|
+
"items": {
|
|
104
|
+
"anyOf": [
|
|
105
|
+
{ "$ref": "#/$defs/Step" },
|
|
106
|
+
{ "$ref": "#/$defs/Gate" },
|
|
107
|
+
{ "$ref": "#/$defs/Phase" }
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"minItems": 1
|
|
111
|
+
},
|
|
112
|
+
"parallel": {
|
|
113
|
+
"type": "boolean",
|
|
114
|
+
"default": false,
|
|
115
|
+
"description": "Run all steps in this phase concurrently instead of sequentially."
|
|
116
|
+
},
|
|
117
|
+
"onFailure": {
|
|
118
|
+
"type": "array",
|
|
119
|
+
"description": "Compensation phases for this phase, executed in reverse order on failure (saga rollback). Capabilities that declare their own compensation get this for free; this field is for an explicit override.",
|
|
120
|
+
"items": { "$ref": "#/$defs/Phase" }
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
"Step": {
|
|
126
|
+
"type": "object",
|
|
127
|
+
"description": "A single capability invocation — the leaf unit of a composition. `kind` selects the capability (a verb, e.g. \"cfn-deploy\", \"publish-image\", \"ecs-update-service\"); the remaining properties are that capability's typed input. Capability-specific properties are open (the capability interface itself is out of scope for this schema — see #554); the handful of cross-cutting properties below are typed as WiringValue because they commonly carry a reference rather than a literal. `kind: \"gate\"` is reserved for the Gate step shape below, not a capability.",
|
|
128
|
+
"required": ["kind"],
|
|
129
|
+
"additionalProperties": true,
|
|
130
|
+
"properties": {
|
|
131
|
+
"kind": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"minLength": 1,
|
|
134
|
+
"not": { "const": "gate" },
|
|
135
|
+
"description": "Capability verb this step dispatches to, e.g. \"docker-build\", \"publish-image\", \"cfn-deploy\", \"ecs-update-service\", \"emr-start-job-run\", \"code-deploy\", \"wait-steady-state\", \"health-gate\", \"shell\". Not a closed enum — the capability registry is a plugin registry; new verbs are added without changing this schema."
|
|
136
|
+
},
|
|
137
|
+
"imageRef": {
|
|
138
|
+
"$ref": "#/$defs/WiringValue",
|
|
139
|
+
"description": "Reference to a published image digest, typically a prior-step reference like \"@Publish.digest\"."
|
|
140
|
+
},
|
|
141
|
+
"jar": {
|
|
142
|
+
"$ref": "#/$defs/WiringValue",
|
|
143
|
+
"description": "Reference to a published JAR/artifact location, typically a cross-component artifact reference like \"@jar-lib.publish.uri\"."
|
|
144
|
+
},
|
|
145
|
+
"revision": {
|
|
146
|
+
"$ref": "#/$defs/WiringValue",
|
|
147
|
+
"description": "Reference to a published revision/bundle location for host/code-delivery capabilities (e.g. code-deploy)."
|
|
148
|
+
},
|
|
149
|
+
"inputs": {
|
|
150
|
+
"type": "object",
|
|
151
|
+
"description": "Named inputs passed into an apply step, each of which may be a literal or any WiringValue reference — most commonly a stackOutput reference imported from another component's stack.",
|
|
152
|
+
"additionalProperties": { "$ref": "#/$defs/WiringValue" }
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
"Gate": {
|
|
158
|
+
"type": "object",
|
|
159
|
+
"description": "Pauses the composition for an external signal (typically human approval) before continuing. A gate in a component's composition requires the durable (Temporal) execution backend; it cannot run on the local in-process executor.",
|
|
160
|
+
"required": ["kind", "signalName"],
|
|
161
|
+
"additionalProperties": false,
|
|
162
|
+
"properties": {
|
|
163
|
+
"kind": { "type": "string", "const": "gate" },
|
|
164
|
+
"signalName": {
|
|
165
|
+
"type": "string",
|
|
166
|
+
"minLength": 1,
|
|
167
|
+
"description": "Signal name the generated workflow waits for before continuing."
|
|
168
|
+
},
|
|
169
|
+
"timeout": {
|
|
170
|
+
"type": "string",
|
|
171
|
+
"description": "Duration string bounding the wait, e.g. \"48h\". Default: \"48h\"."
|
|
172
|
+
},
|
|
173
|
+
"description": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"description": "Human-readable description of the action required to unblock this gate."
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
"WiringValue": {
|
|
181
|
+
"description": "A string value that is either a literal or one of the three reference forms components use to wire to configuration, prior steps, cross-stack outputs, or cross-component artifacts. All forms are resolved by the graph (`chant graph --stacks`), never by orchestrator code.",
|
|
182
|
+
"oneOf": [
|
|
183
|
+
{ "type": "string", "not": { "pattern": "^(\\$env\\.|@)" } },
|
|
184
|
+
{ "$ref": "#/$defs/EnvReference" },
|
|
185
|
+
{ "$ref": "#/$defs/PriorStepReference" },
|
|
186
|
+
{ "$ref": "#/$defs/ComponentArtifactReference" },
|
|
187
|
+
{ "$ref": "#/$defs/StackOutputReference" }
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
"EnvReference": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"pattern": "^\\$env\\.[A-Za-z0-9_]+(\\.[A-Za-z0-9_]+)*$",
|
|
194
|
+
"description": "Reference to the current deploy environment's config, e.g. \"$env.registry\", \"$env.cluster\"."
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
"PriorStepReference": {
|
|
198
|
+
"type": "string",
|
|
199
|
+
"pattern": "^@[A-Za-z0-9_ ]+\\.[A-Za-z0-9_]+(\\.[A-Za-z0-9_]+)*$",
|
|
200
|
+
"description": "Reference to a prior step's output within the same component, addressed by phase name, e.g. \"@Publish.digest\", \"@Submit.runId\". Does not contain a dot before the phase name, distinguishing it from a cross-component reference (\"@<component>.publish...\")."
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
"ComponentArtifactReference": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"pattern": "^@[a-z0-9]+(-[a-z0-9]+)*\\.publish\\.(uri|digest|key)$",
|
|
206
|
+
"description": "Reference to another component's published artifact output, e.g. \"@jar-lib.publish.uri\", \"@search-service.publish.digest\". The referenced component must appear in this component's dependsOn; the graph resolves the reference into this step, never the orchestrator."
|
|
207
|
+
},
|
|
208
|
+
|
|
209
|
+
"StackOutputReference": {
|
|
210
|
+
"type": "object",
|
|
211
|
+
"description": "Reference to a cross-stack (CloudFormation/ARM/...) output exported by another stack, resolved by the graph the same way `stackOutput()` is resolved in the TypeScript authoring form. Replaces a `describe-stacks | jq` pipeline step.",
|
|
212
|
+
"required": ["stackOutput"],
|
|
213
|
+
"additionalProperties": false,
|
|
214
|
+
"properties": {
|
|
215
|
+
"stackOutput": {
|
|
216
|
+
"type": "object",
|
|
217
|
+
"required": ["stack", "name"],
|
|
218
|
+
"additionalProperties": false,
|
|
219
|
+
"properties": {
|
|
220
|
+
"stack": {
|
|
221
|
+
"type": "string",
|
|
222
|
+
"minLength": 1,
|
|
223
|
+
"description": "Name of the exporting component/stack, e.g. \"shared-alb\"."
|
|
224
|
+
},
|
|
225
|
+
"name": {
|
|
226
|
+
"type": "string",
|
|
227
|
+
"minLength": 1,
|
|
228
|
+
"description": "Name of the exported output, e.g. \"ListenerArn\", \"ClusterArn\"."
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|