@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,130 @@
|
|
|
1
|
+
# Component contract schema
|
|
2
|
+
|
|
3
|
+
`component.schema.json` is the portable JSON Schema (draft 2020-12) for the
|
|
4
|
+
**Component contract** described in the
|
|
5
|
+
[Components docs](../../../../docs/src/content/docs/components/) —
|
|
6
|
+
specifically
|
|
7
|
+
[`component-contract.mdx`](../../../../docs/src/content/docs/components/component-contract.mdx)
|
|
8
|
+
(fields, archetypes, the JSON projection) and
|
|
9
|
+
[`composition-and-wiring.mdx`](../../../../docs/src/content/docs/components/composition-and-wiring.mdx)
|
|
10
|
+
(the phase grammar, fan-out, and wiring reference forms). Those docs are
|
|
11
|
+
authoritative over this schema's prose; the schema is authoritative over the
|
|
12
|
+
document *shape*.
|
|
13
|
+
|
|
14
|
+
## This schema is the substrate, not a chant-only type
|
|
15
|
+
|
|
16
|
+
A component is declarative data. chant's TypeScript authoring form (`Component`,
|
|
17
|
+
`phase()`, capability builders, etc. — tracked separately, see #551 "Chant-native
|
|
18
|
+
plugin" phase) is one typed frontend that **projects to** this JSON document. A
|
|
19
|
+
non-chant or legacy component can hand-write this JSON directly and be driven
|
|
20
|
+
by the same generic orchestrator, with no chant authoring step required. Making
|
|
21
|
+
the contract a portable spec rather than a runtime-only object is what keeps
|
|
22
|
+
walk-away cost low: nothing about participating in the release model requires
|
|
23
|
+
adopting chant.
|
|
24
|
+
|
|
25
|
+
## What it models
|
|
26
|
+
|
|
27
|
+
- **Identity and ordering** — `name`, `dependsOn` (ordering only, resolved by
|
|
28
|
+
`chant graph --stacks`, no logic).
|
|
29
|
+
- **Live name mapping** — `liveNames` (#598), optional: the live lexicon
|
|
30
|
+
entity/resource name(s) this component owns, when they differ from `name`.
|
|
31
|
+
`chant components status --live` (`../lifecycle/status.ts`) joins the
|
|
32
|
+
release ledger against live evidence by name; `liveNames` lets that join
|
|
33
|
+
work for a component whose own name isn't the entity/resource name it
|
|
34
|
+
deploys, falling back to `name` itself when omitted. See
|
|
35
|
+
docs/src/content/docs/components/observability.mdx.
|
|
36
|
+
- **The three archetypes** — service (build → publish → apply → verify),
|
|
37
|
+
infra (apply → verify, no build), and producer/library (build → publish
|
|
38
|
+
only, no service apply). `deploy` being a plain composition is what makes
|
|
39
|
+
build-only and apply-only shapes first-class rather than special cases.
|
|
40
|
+
- **The composition grammar** — `deploy` is an ordered list of `Phase`s;
|
|
41
|
+
phases carry `steps` (capability invocations), an optional `parallel` flag,
|
|
42
|
+
and an optional `onFailure` for saga-style compensation. A step may itself
|
|
43
|
+
be a nested `Phase`, which is how fan-out (e.g. a Neo4j cluster seeding one
|
|
44
|
+
node then rolling through the rest) is expressed as composition rather than
|
|
45
|
+
orchestrator knowledge.
|
|
46
|
+
- **Gates** — a distinct step shape (`kind: "gate"`, `signalName`) for a
|
|
47
|
+
durable, human-approval wait.
|
|
48
|
+
- **Wiring reference forms**, all resolved by the graph, never by orchestrator
|
|
49
|
+
code:
|
|
50
|
+
- `$env.<path>` — environment config (e.g. `$env.registry`).
|
|
51
|
+
- `@<Phase>.<field>` — a prior step's output within the same component
|
|
52
|
+
(e.g. `@Publish.digest`).
|
|
53
|
+
- `@<component>.publish.uri|digest|key` — another component's published
|
|
54
|
+
artifact output (e.g. `@jar-lib.publish.uri`); the referenced component
|
|
55
|
+
must appear in `dependsOn`.
|
|
56
|
+
- `{ "stackOutput": { "stack", "name" } }` — a cross-stack
|
|
57
|
+
CloudFormation/ARM/... output, the JSON-side equivalent of the
|
|
58
|
+
TypeScript `stackOutput()` mechanism.
|
|
59
|
+
|
|
60
|
+
Capability-specific step properties (beyond the cross-cutting wiring-typed
|
|
61
|
+
ones like `imageRef`/`jar`/`revision`/`inputs`) are intentionally left open
|
|
62
|
+
(`additionalProperties: true` on `Step`). The capability interface and its
|
|
63
|
+
per-verb input/output types are the subject of a separate spec (#554); this
|
|
64
|
+
schema only needs every capability invocation to be representable as
|
|
65
|
+
`{ kind, ...params }`.
|
|
66
|
+
|
|
67
|
+
## Versioning
|
|
68
|
+
|
|
69
|
+
- `$id` is stable: `https://intentius.io/chant/schemas/component/v1/component.schema.json`.
|
|
70
|
+
A breaking change to the contract gets a new `v2` path; this file does not
|
|
71
|
+
change shape incompatibly in place.
|
|
72
|
+
- `contractVersion` (currently pinned to `"1.0.0"`) is the document-level
|
|
73
|
+
version field a hand-written component can assert against.
|
|
74
|
+
|
|
75
|
+
## Fixtures and tests
|
|
76
|
+
|
|
77
|
+
`__fixtures__/` holds real components drawn from the epic (#551): an ALB/ECS
|
|
78
|
+
service, a DynamoDB table, a Neo4j fan-out cluster, a JAR producer and its EMR
|
|
79
|
+
consumer, a single-host Docker Compose service, and (#558) a container-image
|
|
80
|
+
Lambda function. `component-schema.test.ts` validates every fixture against
|
|
81
|
+
`component.schema.json` with [ajv](https://ajv.js.org/) (`ajv/dist/2020` — the
|
|
82
|
+
draft 2020-12 build) and exercises the schema's negative cases (missing
|
|
83
|
+
required fields, malformed wiring references, an invalid archetype, a gate
|
|
84
|
+
missing `signalName`, and so on).
|
|
85
|
+
|
|
86
|
+
## Typed authoring form (`component.ts`, #560)
|
|
87
|
+
|
|
88
|
+
`component.ts` is the real typed `Component` authoring frontend the docs
|
|
89
|
+
describe: `Component`, `Phase`, `Step`, `Gate`, `BuildSpec`, `Wiring` mirror
|
|
90
|
+
this schema's `$defs` field-for-field, plus the `phase()`/`gate()`/
|
|
91
|
+
`stackOutput()` builders and `projectToJson()` (the mechanical TS → JSON
|
|
92
|
+
projection, filling in `archetype` via `inferArchetype` when a component
|
|
93
|
+
doesn't set one explicitly — see the archetype table above). It supersedes
|
|
94
|
+
the Phase 1 stopgap `pilots/authoring-shape.ts` (deleted), which explicitly
|
|
95
|
+
deferred the real API to this issue.
|
|
96
|
+
|
|
97
|
+
## Discovery (`discover.ts`, #560)
|
|
98
|
+
|
|
99
|
+
`discoverComponents(path)` finds every `Component` declared under a
|
|
100
|
+
directory, mirroring chant's existing declarable discovery
|
|
101
|
+
(`../discovery/index.ts`) as closely as a structurally distinct type allows,
|
|
102
|
+
and borrowing its file-suffix convention from Op discovery
|
|
103
|
+
(`../op/discover.ts`'s `*.op.ts`): any `.component.ts` file (excluding
|
|
104
|
+
`.test.component.ts`/`.spec.component.ts`) is scanned, every export
|
|
105
|
+
satisfying `isComponent` is collected (any export name, not just `default`,
|
|
106
|
+
so one file may declare several related components), and a duplicate
|
|
107
|
+
`component.name` across files is a discovery error — the same duplicate-name
|
|
108
|
+
discipline `collectEntities`/`discoverOps` already apply to resources/Ops.
|
|
109
|
+
`*.component.ts` was chosen over reusing the generic `.ts` + `Declarable`
|
|
110
|
+
marker convention because a `Component` has no `lexicon`/`entityType` shape
|
|
111
|
+
to tag; see `discover.ts`'s docstring for the full reasoning.
|
|
112
|
+
|
|
113
|
+
## Pilots
|
|
114
|
+
|
|
115
|
+
`pilots/` (#555) authors three of those fixtures — the ALB/ECS service, the
|
|
116
|
+
DynamoDB table, and the Neo4j fan-out cluster — a second way: as TypeScript
|
|
117
|
+
authored against `component.ts`, composed from the real capability verbs in
|
|
118
|
+
`verbs/`. Each pilot's JSON projection is asserted equal to its
|
|
119
|
+
`__fixtures__/*.json` counterpart, so the fixture stays the one authoritative
|
|
120
|
+
JSON document; see `pilots/README.md` for the axis-by-axis mapping (build vs
|
|
121
|
+
no-build, single vs fan-out, sticky vs simple apply, cross-stack wiring, auto
|
|
122
|
+
vs no rollback).
|
|
123
|
+
|
|
124
|
+
`pilots/lambda.pilot.ts` (#558) adds a fourth component the same way — a
|
|
125
|
+
container-image Lambda function — to validate the sprawl metric holds beyond
|
|
126
|
+
the three pilots that were picked specifically to prove it. See
|
|
127
|
+
[`SPRAWL-VALIDATION.md`](./SPRAWL-VALIDATION.md) for the full write-up: the
|
|
128
|
+
before/after against the ALB/ECS pipeline's `describe-stacks | jq` glue, and
|
|
129
|
+
the per-component scorecard (new pipelines / driver edits / declarations /
|
|
130
|
+
capabilities) the epic's "definition of done" asks for.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Sprawl metric validation (#558, epic #551)
|
|
2
|
+
|
|
3
|
+
This validates the sprawl metric epic #551 defines as its "definition of
|
|
4
|
+
done" against the three real pilots (#555) plus a fourth, deliberately
|
|
5
|
+
different component added here. Everything below runs through the one
|
|
6
|
+
generic `runInterpretDriver` (#556, [`../driver.ts`](./driver.ts)), unchanged.
|
|
7
|
+
|
|
8
|
+
## The metric, from #551
|
|
9
|
+
|
|
10
|
+
> - Typical new component: 0 new pipelines, 0 orchestrator edits, 0 new capabilities, 1 declaration.
|
|
11
|
+
> - Genuinely novel component: 0 pipelines, 0 orchestrator edits, at most 1 new capability (then reusable), 1 declaration.
|
|
12
|
+
> - Cross-cutting change: 1 capability edited, 0 components touched.
|
|
13
|
+
> - The generic orchestrator contains zero per-component code (no `if component.name === ...`).
|
|
14
|
+
> - Three of our most-different real components run through one driver with no per-component driver code.
|
|
15
|
+
|
|
16
|
+
## Before / after: the ALB/ECS pipeline glue this replaces
|
|
17
|
+
|
|
18
|
+
The component model's whole reason for existing is visible in one concrete
|
|
19
|
+
diff. [`examples/gitlab-aws-alb-api/src/pipeline.ts`](../../../../../examples/gitlab-aws-alb-api/src/pipeline.ts)
|
|
20
|
+
hand-rolls a `deployService` job that shells out to CloudFormation and greps
|
|
21
|
+
its own infra stack's outputs before it can deploy:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
// before — examples/gitlab-aws-alb-api/src/pipeline.ts (deployService job)
|
|
25
|
+
`OUTPUTS=$(aws cloudformation describe-stacks --stack-name ${INFRA_STACK} --query 'Stacks[0].Outputs' --output json)`,
|
|
26
|
+
`PARAMS=$(echo "$OUTPUTS" | jq -r '[(.[] | select(.OutputKey == "ClusterArn") | "clusterArn=" + .OutputValue), (.[] | select(.OutputKey == "ListenerArn") | "listenerArn=" + .OutputValue), ...] | join(" ")')`,
|
|
27
|
+
`IMAGE_URI=$(echo "$OUTPUTS" | jq -r '.[] | select(.OutputKey == "ApiRepoUri") | .OutputValue'):${CI_COMMIT_REF_SLUG}`,
|
|
28
|
+
`aws cloudformation deploy --template-file templates/template.json --stack-name ${STACK_NAME} ... --parameter-overrides $PARAMS image=$IMAGE_URI`,
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
That `describe-stacks | jq` line is bespoke per pipeline: every component that
|
|
32
|
+
imports another stack's outputs re-derives its own grep. The component-native
|
|
33
|
+
replacement ([`pilots/alb-ecs.pilot.ts`](./pilots/alb-ecs.pilot.ts)) expresses
|
|
34
|
+
the same import as typed cross-stack wiring, resolved by the graph rather than
|
|
35
|
+
scripted in the pipeline:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
// after — pilots/alb-ecs.pilot.ts
|
|
39
|
+
const sharedAlbOutputs = {
|
|
40
|
+
listenerArn: { stackOutput: { stack: "shared-alb", name: "ListenerArn" } },
|
|
41
|
+
clusterArn: { stackOutput: { stack: "shared-alb", name: "ClusterArn" } },
|
|
42
|
+
subnets: { stackOutput: { stack: "shared-alb", name: "Subnets" } },
|
|
43
|
+
};
|
|
44
|
+
// ...
|
|
45
|
+
{ kind: "cfn-deploy", template: "archive:search.template.json", imageRef: "@Publish.digest", inputs: sharedAlbOutputs }
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
No `describe-stacks`, no `jq`, no shell string-building. `dependsOn:
|
|
49
|
+
["shared-alb"]` plus three `stackOutput()` references replace the whole glue
|
|
50
|
+
block; `docker build`/`docker push` become the `docker-build`/`publish-image`
|
|
51
|
+
capabilities the driver dispatches to. [`driver.test.ts`](./driver.test.ts)
|
|
52
|
+
and [`pilots/pilots-e2e.test.ts`](./pilots/pilots-e2e.test.ts) exercise this
|
|
53
|
+
exact wiring end to end against a mock `CloudExecutor` — `cfn-deploy`
|
|
54
|
+
resolves the `stackOutput` reference itself; no orchestrator code parses a
|
|
55
|
+
CloudFormation output.
|
|
56
|
+
|
|
57
|
+
## The three pilots, unchanged, through the one driver
|
|
58
|
+
|
|
59
|
+
[`driver.test.ts`](./driver.test.ts)'s `"runs the three pilots through one
|
|
60
|
+
driver instance with zero per-component driver code (sprawl metric)"` test
|
|
61
|
+
(pre-existing from #556/#557, still green) and
|
|
62
|
+
[`pilots-e2e.test.ts`](./pilots/pilots-e2e.test.ts)'s first `describe` block
|
|
63
|
+
run Neo4j fan-out, DynamoDB (sticky apply), and ALB/ECS (cross-stack, build)
|
|
64
|
+
through the same `runInterpretDriver` call, dispatching to the real,
|
|
65
|
+
`MockCloudExecutor`-backed capability implementations from #557
|
|
66
|
+
(`docker-build`, `publish-image`, `cfn-deploy`, `ecs-update-service`,
|
|
67
|
+
`code-deploy`, `wait-for-stack`, `wait-steady-state`, `wait-cluster-healthy`).
|
|
68
|
+
Nothing in [`driver.ts`](./driver.ts) branches on which of the three is
|
|
69
|
+
running — dispatch is purely by step `kind` via `CapabilityRegistry.resolve`.
|
|
70
|
+
|
|
71
|
+
## The fourth component: image-processor-lambda
|
|
72
|
+
|
|
73
|
+
To validate the metric holds beyond the three pilots that were picked
|
|
74
|
+
specifically to prove it, this issue adds a fourth, deliberately different
|
|
75
|
+
component: [`pilots/lambda.pilot.ts`](./pilots/lambda.pilot.ts) /
|
|
76
|
+
[`__fixtures__/lambda-image-processor.json`](./__fixtures__/lambda-image-processor.json),
|
|
77
|
+
a container-image AWS Lambda function (`image-processor-lambda`).
|
|
78
|
+
|
|
79
|
+
It was picked over the single-host docker-compose fixture
|
|
80
|
+
([`__fixtures__/single-host-compose.json`](./__fixtures__/single-host-compose.json))
|
|
81
|
+
specifically because compose would have needed four still-stubbed
|
|
82
|
+
capabilities at once (`load-image-on-host`, `copy-to-host`, `remote-exec`,
|
|
83
|
+
`wait-endpoint`) to actually run — busting the "at most 1 new capability"
|
|
84
|
+
bound before it even started. Lambda needed exactly one.
|
|
85
|
+
|
|
86
|
+
What makes it genuinely different from the three pilots, not a shape
|
|
87
|
+
variation of ALB/ECS:
|
|
88
|
+
|
|
89
|
+
- **No CloudFormation at all in its apply step.** Every one of the three
|
|
90
|
+
pilots (and `shared-alb`) applies via `cfn-deploy`. `image-processor-lambda`
|
|
91
|
+
is the first component in the validation set whose Apply phase contains no
|
|
92
|
+
`cfn-deploy` — it calls `UpdateFunctionCode` / `PublishVersion` /
|
|
93
|
+
`UpdateAlias` directly against the function.
|
|
94
|
+
- **Alias-based promotion, not a stack changeset.** Verification/rollback
|
|
95
|
+
reason about an alias pointer (`live` -> version N), not a stack status or a
|
|
96
|
+
service's running/desired task count.
|
|
97
|
+
|
|
98
|
+
What it reuses unchanged (zero new capabilities here): `docker-build` and
|
|
99
|
+
`publish-image` — a container-image Lambda's build/publish story is
|
|
100
|
+
byte-identical to ALB/ECS's (build an image, promote it by digest into the
|
|
101
|
+
registry); the same `@Publish.uri` prior-step wiring form every pilot already
|
|
102
|
+
uses carries the image reference into the apply step.
|
|
103
|
+
|
|
104
|
+
### The one new capability: `lambda-deploy`
|
|
105
|
+
|
|
106
|
+
[`verbs/apply.ts`](./verbs/apply.ts)'s `createLambdaDeployCapability` is the
|
|
107
|
+
only new leaf this component required, built the same way #557 built the
|
|
108
|
+
other real leaves: typed input/output, an injectable `CloudExecutor`
|
|
109
|
+
(extended with a `lambda` client — [`verbs/cloud-executor.ts`](./verbs/cloud-executor.ts)),
|
|
110
|
+
a real shell-out implementation for production, and a `MockCloudExecutor`
|
|
111
|
+
implementation ([`verbs/__tests__/mock-cloud-executor.ts`](./verbs/__tests__/mock-cloud-executor.ts))
|
|
112
|
+
for tests. It declares a `rollback` (repoint the alias back to whatever
|
|
113
|
+
version it pointed at before this step ran) — the same best-effort,
|
|
114
|
+
capability-level compensation style `ecs-update-service` uses, since Lambda
|
|
115
|
+
has no native automatic rollback for a code update the way CodeFormation/
|
|
116
|
+
CodeDeploy do.
|
|
117
|
+
|
|
118
|
+
No other verb was touched or added. `driver.ts` was not edited.
|
|
119
|
+
|
|
120
|
+
### Proof it runs through the same driver
|
|
121
|
+
|
|
122
|
+
[`driver.test.ts`](./driver.test.ts)'s `"runs all four components ... through
|
|
123
|
+
one driver instance with zero per-component driver code (sprawl metric,
|
|
124
|
+
extended)"` test and [`pilots-e2e.test.ts`](./pilots/pilots-e2e.test.ts)'s
|
|
125
|
+
second `describe`-block test run all five components (`shared-alb`,
|
|
126
|
+
`orders-table`, `neo4j-cluster`, `search-service`, `image-processor-lambda`)
|
|
127
|
+
through one `runInterpretDriver` call, dispatching `image-processor-lambda`'s
|
|
128
|
+
steps to the real `lambda-deploy` capability against a shared
|
|
129
|
+
`MockCloudExecutor` — no live AWS.
|
|
130
|
+
|
|
131
|
+
## Scorecard
|
|
132
|
+
|
|
133
|
+
| Component | New pipelines | Driver edits | New declarations | New capabilities | Reused capabilities |
|
|
134
|
+
|---|---|---|---|---|---|
|
|
135
|
+
| Neo4j fan-out (#555) | 0 | 0 | 1 | 0 (#557 implemented the pilot set together) | `cfn-deploy`, `code-deploy`, `wait-cluster-healthy` |
|
|
136
|
+
| DynamoDB (#555) | 0 | 0 | 1 | 0 | `cfn-deploy`, `wait-for-stack` |
|
|
137
|
+
| ALB/ECS (#555) | 0 | 0 | 1 | 0 | `docker-build`, `publish-image`, `cfn-deploy`, `ecs-update-service`, `wait-steady-state` |
|
|
138
|
+
| **image-processor-lambda (#558, this issue)** | **0** | **0** | **1** | **1** (`lambda-deploy`) | `docker-build`, `publish-image` |
|
|
139
|
+
|
|
140
|
+
Read row-by-row against the metric: every component is one declaration, zero
|
|
141
|
+
new pipelines, zero driver edits. The fourth component needed exactly one new
|
|
142
|
+
capability — inside the "genuinely novel: at most 1" bound, not the
|
|
143
|
+
"typical: 0" bound the three original pilots hit, which is the honest result
|
|
144
|
+
for a component that introduces a capability family (Lambda code deploy) none
|
|
145
|
+
of the three pilots exercised.
|
|
146
|
+
|
|
147
|
+
## Blockers found: none
|
|
148
|
+
|
|
149
|
+
No case forced a per-component branch in `driver.ts`. `driver.ts` was not
|
|
150
|
+
modified by this issue — every dispatch (`runCapabilityStep`, `runPhase`,
|
|
151
|
+
`resolveWiring`) already operates purely on the generic
|
|
152
|
+
`Component`/`Phase`/`Step` shapes and the `kind` string, with no branch naming
|
|
153
|
+
a specific component or capability. The fourth component's differences (no
|
|
154
|
+
`cfn-deploy` in Apply, alias-based promotion) required a new *capability*,
|
|
155
|
+
which is exactly where the epic says new behavior should land — never a new
|
|
156
|
+
capability *forced a driver change* to accommodate it.
|
|
157
|
+
|
|
158
|
+
If a future component needs multiple new capabilities at once (as
|
|
159
|
+
single-host compose would — four stubs), that is not by itself a driver
|
|
160
|
+
special-case; it just means that component was not the cheapest pick for a
|
|
161
|
+
minimal walkthrough. `load-image-on-host` / `copy-to-host` / `remote-exec` /
|
|
162
|
+
`wait-endpoint` remain typed stubs (`../capability.ts`'s "no cloud
|
|
163
|
+
implementation yet" contract) — implementing them is future capability work,
|
|
164
|
+
out of scope for this validation issue, and does not block the metric: the
|
|
165
|
+
schema/fixture already validates that composition
|
|
166
|
+
([`component-schema.test.ts`](./component-schema.test.ts)), only the cloud
|
|
167
|
+
leaves are unimplemented.
|
|
168
|
+
|
|
169
|
+
## Assumptions
|
|
170
|
+
|
|
171
|
+
- `lambda-deploy`'s `codeRef` carries a container image URI (this issue's
|
|
172
|
+
chosen shape), not a zip/S3 key — `zip-package` stays a stub, so a
|
|
173
|
+
zip-packaged Lambda was not in scope; a container-image Lambda was the
|
|
174
|
+
cheaper, still-genuinely-novel choice.
|
|
175
|
+
- `health-gate` in the Lambda pilot's Verify phase remains a typed stub (as it
|
|
176
|
+
already was for the ALB/ECS pilot) — verifying this issue is about apply
|
|
177
|
+
dispatch (`lambda-deploy`), not the wait/verify family.
|
|
178
|
+
- The Lambda pilot has no component-level `rollback` field (unlike ALB/ECS):
|
|
179
|
+
`lambda-deploy`'s own capability-level rollback (restore the alias) is
|
|
180
|
+
sufficient here, so no explicit compensation phase was added to the
|
|
181
|
+
declaration.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
3
|
+
"contractVersion": "1.0.0",
|
|
4
|
+
"name": "search-service",
|
|
5
|
+
"archetype": "service",
|
|
6
|
+
"dependsOn": ["shared-alb"],
|
|
7
|
+
"build": { "kind": "docker-build", "context": ".", "into": "archive" },
|
|
8
|
+
"deploy": [
|
|
9
|
+
{
|
|
10
|
+
"phase": "Publish",
|
|
11
|
+
"steps": [
|
|
12
|
+
{ "kind": "publish-image", "from": "archive", "to": "$env.registry" }
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"phase": "Apply",
|
|
17
|
+
"steps": [
|
|
18
|
+
{
|
|
19
|
+
"kind": "cfn-deploy",
|
|
20
|
+
"template": "archive:search.template.json",
|
|
21
|
+
"imageRef": "@Publish.digest",
|
|
22
|
+
"inputs": {
|
|
23
|
+
"listenerArn": { "stackOutput": { "stack": "shared-alb", "name": "ListenerArn" } },
|
|
24
|
+
"clusterArn": { "stackOutput": { "stack": "shared-alb", "name": "ClusterArn" } },
|
|
25
|
+
"subnets": { "stackOutput": { "stack": "shared-alb", "name": "Subnets" } }
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"kind": "ecs-update-service",
|
|
30
|
+
"cluster": "$env.cluster",
|
|
31
|
+
"service": "search"
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"phase": "Verify",
|
|
37
|
+
"steps": [
|
|
38
|
+
{ "kind": "wait-steady-state", "service": "search" },
|
|
39
|
+
{ "kind": "health-gate", "path": "/healthz" }
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"rollback": [
|
|
44
|
+
{
|
|
45
|
+
"phase": "Rollback",
|
|
46
|
+
"steps": [
|
|
47
|
+
{ "kind": "rollback-previous", "service": "search", "cluster": "$env.cluster" }
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
3
|
+
"contractVersion": "1.0.0",
|
|
4
|
+
"name": "orders-table",
|
|
5
|
+
"archetype": "infra",
|
|
6
|
+
"dependsOn": [],
|
|
7
|
+
"deploy": [
|
|
8
|
+
{
|
|
9
|
+
"phase": "Apply",
|
|
10
|
+
"steps": [
|
|
11
|
+
{
|
|
12
|
+
"kind": "cfn-deploy",
|
|
13
|
+
"template": "archive:orders-table.template.json",
|
|
14
|
+
"onReplace": "block",
|
|
15
|
+
"stageGsi": true
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"phase": "Verify",
|
|
21
|
+
"parallel": true,
|
|
22
|
+
"steps": [
|
|
23
|
+
{ "kind": "wait-for-stack", "stack": "orders-table" },
|
|
24
|
+
{
|
|
25
|
+
"kind": "run-migration",
|
|
26
|
+
"script": "archive:migrations/backfill-gsi.sql",
|
|
27
|
+
"noRollback": "GSI backfill is forward-only; undoing it needs a second, hand-written migration, not automatic compensation"
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
3
|
+
"contractVersion": "1.0.0",
|
|
4
|
+
"name": "emr-job",
|
|
5
|
+
"archetype": "infra",
|
|
6
|
+
"dependsOn": ["jar-lib"],
|
|
7
|
+
"deploy": [
|
|
8
|
+
{
|
|
9
|
+
"phase": "Submit",
|
|
10
|
+
"steps": [
|
|
11
|
+
{
|
|
12
|
+
"kind": "emr-start-job-run",
|
|
13
|
+
"jar": "@jar-lib.publish.uri",
|
|
14
|
+
"args": ["--input", "$env.inputPath", "--output", "$env.outputPath"],
|
|
15
|
+
"noRollback": "a submitted job run has no automatic undo; cancelling it does not revert data it already wrote"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"phase": "Verify",
|
|
21
|
+
"steps": [
|
|
22
|
+
{ "kind": "wait-job", "runId": "@Submit.runId" }
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
3
|
+
"contractVersion": "1.0.0",
|
|
4
|
+
"name": "jar-lib",
|
|
5
|
+
"archetype": "producer-library",
|
|
6
|
+
"dependsOn": [],
|
|
7
|
+
"build": { "kind": "jvm-build", "context": ".", "into": "archive" },
|
|
8
|
+
"deploy": [
|
|
9
|
+
{
|
|
10
|
+
"phase": "Publish",
|
|
11
|
+
"steps": [
|
|
12
|
+
{ "kind": "publish-artifact", "from": "archive", "to": "$env.s3" }
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
3
|
+
"contractVersion": "1.0.0",
|
|
4
|
+
"name": "image-processor-lambda",
|
|
5
|
+
"archetype": "service",
|
|
6
|
+
"dependsOn": [],
|
|
7
|
+
"build": { "kind": "docker-build", "context": ".", "into": "archive" },
|
|
8
|
+
"deploy": [
|
|
9
|
+
{
|
|
10
|
+
"phase": "Publish",
|
|
11
|
+
"steps": [
|
|
12
|
+
{ "kind": "publish-image", "from": "archive", "to": "$env.registry" }
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"phase": "Apply",
|
|
17
|
+
"steps": [
|
|
18
|
+
{ "kind": "lambda-deploy", "functionName": "image-processor", "codeRef": "@Publish.uri", "alias": "live" }
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"phase": "Verify",
|
|
23
|
+
"steps": [
|
|
24
|
+
{ "kind": "health-gate", "path": "@Apply.functionArn" }
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
3
|
+
"contractVersion": "1.0.0",
|
|
4
|
+
"name": "neo4j-cluster",
|
|
5
|
+
"archetype": "infra",
|
|
6
|
+
"dependsOn": [],
|
|
7
|
+
"deploy": [
|
|
8
|
+
{
|
|
9
|
+
"phase": "Seed",
|
|
10
|
+
"steps": [
|
|
11
|
+
{ "kind": "cfn-deploy", "template": "archive:neo4j-az0-0.template.json" },
|
|
12
|
+
{ "kind": "code-deploy", "instance": 0, "revision": "@Seed.templateUri" },
|
|
13
|
+
{ "kind": "wait-cluster-healthy", "size": 1 }
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"phase": "Node 1",
|
|
18
|
+
"steps": [
|
|
19
|
+
{ "kind": "gate", "signalName": "approve-neo4j-node-1", "description": "Confirm the seed node is healthy before rolling to node 1", "timeout": "24h" },
|
|
20
|
+
{ "kind": "cfn-deploy", "template": "archive:neo4j-1.template.json" },
|
|
21
|
+
{ "kind": "code-deploy", "instance": 1, "revision": "@Seed.templateUri" },
|
|
22
|
+
{ "kind": "wait-cluster-healthy", "quorum": true }
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"phase": "Node 2",
|
|
27
|
+
"steps": [
|
|
28
|
+
{ "kind": "cfn-deploy", "template": "archive:neo4j-2.template.json" },
|
|
29
|
+
{ "kind": "code-deploy", "instance": 2, "revision": "@Seed.templateUri" },
|
|
30
|
+
{ "kind": "wait-cluster-healthy", "quorum": true }
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://intentius.io/chant/schemas/component/v1/component.schema.json",
|
|
3
|
+
"contractVersion": "1.0.0",
|
|
4
|
+
"name": "monitoring-host",
|
|
5
|
+
"archetype": "service",
|
|
6
|
+
"dependsOn": [],
|
|
7
|
+
"build": { "kind": "docker-build", "context": ".", "into": "archive" },
|
|
8
|
+
"deploy": [
|
|
9
|
+
{
|
|
10
|
+
"phase": "Publish",
|
|
11
|
+
"steps": [
|
|
12
|
+
{ "kind": "load-image-on-host", "from": "archive", "host": "$env.host" }
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"phase": "Apply",
|
|
17
|
+
"steps": [
|
|
18
|
+
{ "kind": "copy-to-host", "from": "archive:compose.yaml", "to": "/opt/monitoring/compose.yaml", "host": "$env.host" },
|
|
19
|
+
{ "kind": "remote-exec", "host": "$env.host", "command": "docker compose -f /opt/monitoring/compose.yaml up -d" }
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"phase": "Verify",
|
|
24
|
+
"steps": [
|
|
25
|
+
{ "kind": "wait-endpoint", "host": "$env.host", "path": "/-/healthy", "port": 9090 }
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|