@intentius/chant 0.102.0 → 0.104.1
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/core.d.ts +2 -0
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/change-set.d.ts +232 -0
- package/dist/change-set.d.ts.map +1 -0
- package/dist/cli/commands/audit.d.ts +7 -0
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/change-set.d.ts +11 -0
- package/dist/cli/handlers/change-set.d.ts.map +1 -0
- package/dist/cli/handlers/fan-out.d.ts +33 -0
- package/dist/cli/handlers/fan-out.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +7 -0
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/pr.d.ts +31 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -0
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/op-tools.d.ts.map +1 -1
- package/dist/cli/mcp/workspace-tools.d.ts +3 -2
- package/dist/cli/mcp/workspace-tools.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +63 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/auto-release.d.ts +16 -0
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/capability.d.ts +53 -0
- package/dist/components/capability.d.ts.map +1 -1
- package/dist/components/changed-files.d.ts +31 -0
- package/dist/components/changed-files.d.ts.map +1 -0
- package/dist/components/cli-support.d.ts +9 -1
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +24 -0
- package/dist/components/component.d.ts.map +1 -1
- package/dist/components/deploy-units.d.ts.map +1 -1
- package/dist/components/driver.d.ts +13 -0
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/fan-out-output.d.ts +6 -0
- package/dist/components/fan-out-output.d.ts.map +1 -1
- package/dist/components/fan-out-record.d.ts +41 -0
- package/dist/components/fan-out-record.d.ts.map +1 -0
- package/dist/components/fan-out-run.d.ts +65 -0
- package/dist/components/fan-out-run.d.ts.map +1 -1
- package/dist/components/fan-out-support.d.ts +2 -0
- package/dist/components/fan-out-support.d.ts.map +1 -1
- package/dist/components/fan-out.d.ts +6 -0
- package/dist/components/fan-out.d.ts.map +1 -1
- package/dist/components/gated-wave-pipeline.d.ts +50 -0
- package/dist/components/gated-wave-pipeline.d.ts.map +1 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/layers.d.ts +25 -0
- package/dist/components/layers.d.ts.map +1 -0
- package/dist/components/pr-pipeline.d.ts +61 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -0
- package/dist/components/pr-run.d.ts +119 -0
- package/dist/components/pr-run.d.ts.map +1 -0
- package/dist/components/promote.d.ts.map +1 -1
- package/dist/components/verbs/shell.d.ts.map +1 -1
- package/dist/components/wave-plan.d.ts +49 -0
- package/dist/components/wave-plan.d.ts.map +1 -0
- package/dist/gated-waves.d.ts +147 -0
- package/dist/gated-waves.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/lexicon.d.ts +48 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +7 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/git.d.ts +46 -1
- package/dist/lifecycle/git.d.ts.map +1 -1
- package/dist/lint/post-synth.d.ts +18 -0
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.d.ts +126 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -1
- package/dist/op/activities/change-set.d.ts +62 -0
- package/dist/op/activities/change-set.d.ts.map +1 -0
- package/dist/op/activities/decide.d.ts +2 -0
- package/dist/op/activities/decide.d.ts.map +1 -1
- package/dist/op/activities/factory.d.ts +137 -0
- package/dist/op/activities/factory.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +4 -0
- package/dist/op/activities/index.d.ts.map +1 -1
- package/dist/op/activity-contract.d.ts.map +1 -1
- package/dist/op/builders.d.ts +11 -0
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/decide-backend.d.ts +5 -1
- package/dist/op/decide-backend.d.ts.map +1 -1
- package/dist/op/decide-read-inputs.d.ts +4 -2
- package/dist/op/decide-read-inputs.d.ts.map +1 -1
- package/dist/op/factory.d.ts +83 -0
- package/dist/op/factory.d.ts.map +1 -0
- package/dist/op/index.d.ts +4 -1
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/op-ir.d.ts +2 -0
- package/dist/op/op-ir.d.ts.map +1 -1
- package/dist/op/op-verb-class.d.ts.map +1 -1
- package/dist/op/types.d.ts +8 -0
- package/dist/op/types.d.ts.map +1 -1
- package/dist/op/work-lease-run.d.ts.map +1 -1
- package/dist/plan-summary.d.ts +207 -0
- package/dist/plan-summary.d.ts.map +1 -0
- package/dist/pr-forge.d.ts +105 -0
- package/dist/pr-forge.d.ts.map +1 -0
- package/dist/pr-loop.d.ts +178 -0
- package/dist/pr-loop.d.ts.map +1 -0
- package/dist/telemetry-attribution.d.ts +31 -0
- package/dist/telemetry-attribution.d.ts.map +1 -1
- package/dist/terraform/hcl2json.d.ts +45 -0
- package/dist/terraform/hcl2json.d.ts.map +1 -0
- package/dist/terraform/parse.d.ts +4 -40
- package/dist/terraform/parse.d.ts.map +1 -1
- package/dist/vendor/js-yaml-load.d.ts +56 -0
- package/dist/vendor/js-yaml-load.d.ts.map +1 -0
- package/dist/workspace/box-cli.d.ts +12 -0
- package/dist/workspace/box-cli.d.ts.map +1 -0
- package/dist/workspace/box-factory.d.ts +27 -3
- package/dist/workspace/box-factory.d.ts.map +1 -1
- package/dist/workspace/box-listing.d.ts +85 -0
- package/dist/workspace/box-listing.d.ts.map +1 -0
- package/dist/workspace/box-publish.d.ts +147 -0
- package/dist/workspace/box-publish.d.ts.map +1 -0
- package/dist/workspace/broker-protocol.d.ts +190 -0
- package/dist/workspace/broker-protocol.d.ts.map +1 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/composites.d.ts +2 -2
- package/dist/workspace/composites.d.ts.map +1 -1
- package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts +17 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.d.ts.map +1 -0
- package/dist/workspace/conformance/broker.d.ts +202 -0
- package/dist/workspace/conformance/broker.d.ts.map +1 -0
- package/dist/workspace/conformance/index.d.ts +2 -1
- package/dist/workspace/conformance/index.d.ts.map +1 -1
- package/dist/workspace/conformance/vitest.d.ts +9 -2
- package/dist/workspace/conformance/vitest.d.ts.map +1 -1
- package/dist/workspace/conformance/writer.d.ts +108 -14
- package/dist/workspace/conformance/writer.d.ts.map +1 -1
- package/dist/workspace/decide.d.ts +126 -12
- package/dist/workspace/decide.d.ts.map +1 -1
- package/dist/workspace/decision-points.schema.json +11 -4
- package/dist/workspace/declaration.d.ts +65 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.schema.json +153 -4
- package/dist/workspace/environments.d.ts +36 -10
- package/dist/workspace/environments.d.ts.map +1 -1
- package/dist/workspace/factory-rules.d.ts +180 -0
- package/dist/workspace/factory-rules.d.ts.map +1 -0
- package/dist/workspace/init.d.ts +21 -0
- package/dist/workspace/init.d.ts.map +1 -1
- package/dist/workspace/intent-cli.d.ts +1 -1
- package/dist/workspace/intent-cli.d.ts.map +1 -1
- package/dist/workspace/intent-record.d.ts +28 -1
- package/dist/workspace/intent-record.d.ts.map +1 -1
- package/dist/workspace/intent.d.ts +102 -5
- package/dist/workspace/intent.d.ts.map +1 -1
- package/dist/workspace/json-edit.d.ts +24 -0
- package/dist/workspace/json-edit.d.ts.map +1 -0
- package/dist/workspace/jsonc.d.ts +11 -0
- package/dist/workspace/jsonc.d.ts.map +1 -1
- package/dist/workspace/kinds.d.ts +48 -0
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/lexicon-symbols.d.ts +29 -0
- package/dist/workspace/lexicon-symbols.d.ts.map +1 -0
- package/dist/workspace/lineage-upgrade.d.ts +31 -2
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/point-answer.schema.json +42 -2
- package/dist/workspace/points-cli.d.ts +10 -3
- package/dist/workspace/points-cli.d.ts.map +1 -1
- package/dist/workspace/points.d.ts +66 -5
- package/dist/workspace/points.d.ts.map +1 -1
- package/dist/workspace/reason-codes.d.ts +33 -4
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/record-sessions.d.ts +5 -7
- package/dist/workspace/record-sessions.d.ts.map +1 -1
- package/dist/workspace/records-cli.d.ts +7 -0
- package/dist/workspace/records-cli.d.ts.map +1 -1
- package/dist/workspace/records-close.d.ts +7 -3
- package/dist/workspace/records-close.d.ts.map +1 -1
- package/dist/workspace/records-write.d.ts +66 -6
- package/dist/workspace/records-write.d.ts.map +1 -1
- package/dist/workspace/records.d.ts +28 -9
- package/dist/workspace/records.d.ts.map +1 -1
- package/dist/workspace/runs-cli.d.ts +138 -6
- package/dist/workspace/runs-cli.d.ts.map +1 -1
- package/dist/workspace/runs.d.ts +132 -11
- package/dist/workspace/runs.d.ts.map +1 -1
- package/dist/workspace/session-kinds.d.ts +1 -1
- package/dist/workspace/session-kinds.d.ts.map +1 -1
- package/dist/workspace/squash.d.ts +80 -0
- package/dist/workspace/squash.d.ts.map +1 -0
- package/dist/workspace/status-gates.d.ts +2 -0
- package/dist/workspace/status-gates.d.ts.map +1 -1
- package/dist/workspace/status.d.ts +54 -0
- package/dist/workspace/status.d.ts.map +1 -1
- package/dist/workspace/symbols.d.ts +16 -5
- package/dist/workspace/symbols.d.ts.map +1 -1
- package/dist/workspace/trust/run-commits.d.ts +46 -0
- package/dist/workspace/trust/run-commits.d.ts.map +1 -0
- package/dist/workspace/trust/run-statement.d.ts +128 -0
- package/dist/workspace/trust/run-statement.d.ts.map +1 -0
- package/dist/workspace/trust/seal.d.ts +6 -1
- package/dist/workspace/trust/seal.d.ts.map +1 -1
- package/dist/workspace/trust/verify-cli.d.ts +1 -1
- package/dist/workspace/trust/verify.d.ts +16 -2
- package/dist/workspace/trust/verify.d.ts.map +1 -1
- package/dist/workspace/wip-cli.d.ts +21 -0
- package/dist/workspace/wip-cli.d.ts.map +1 -0
- package/dist/workspace/wip.d.ts +268 -0
- package/dist/workspace/wip.d.ts.map +1 -0
- package/dist/workspace/work-cli.d.ts.map +1 -1
- package/dist/workspace/work-evidence.d.ts +1 -1
- package/dist/workspace/work-evidence.d.ts.map +1 -1
- package/dist/workspace/work-size.d.ts +55 -0
- package/dist/workspace/work-size.d.ts.map +1 -0
- package/dist/workspace/workspace-kinds.schema.json +122 -0
- package/dist/workspace/write-lock-cli.d.ts +60 -0
- package/dist/workspace/write-lock-cli.d.ts.map +1 -0
- package/dist/workspace/write-lock.d.ts +152 -0
- package/dist/workspace/write-lock.d.ts.map +1 -0
- package/dist/workspace/write-scope.d.ts +6 -2
- package/dist/workspace/write-scope.d.ts.map +1 -1
- package/dist/yaml.d.ts +1 -1
- package/dist/yaml.d.ts.map +1 -1
- package/package.json +6 -1
- package/src/__fixtures__/change-set/lifecycle-plan.floci.json +59 -0
- package/src/__fixtures__/change-set/lifecycle-v1.ts.txt +4 -0
- package/src/__fixtures__/change-set/lifecycle-v2.ts.txt +4 -0
- package/src/__fixtures__/change-set/lifecycle.change-set.golden.json +95 -0
- package/src/__fixtures__/change-set/warden.change-set.golden.json +106 -0
- package/src/__fixtures__/change-set/warden.plan.json +44 -0
- package/src/__fixtures__/plan-summary/normalization-vectors.json +1593 -0
- package/src/__fixtures__/pr-loop/pr-apply-applied.note.golden.md +31 -0
- package/src/__fixtures__/pr-loop/pr-apply-refused.note.golden.md +31 -0
- package/src/__fixtures__/pr-loop/pr-plan.golden.json +127 -0
- package/src/__fixtures__/pr-loop/pr-plan.note.golden.md +37 -0
- package/src/audit/core.test.ts +15 -0
- package/src/audit/core.ts +8 -2
- package/src/audit/discover.test.ts +11 -0
- package/src/audit/discover.ts +7 -2
- package/src/change-set-bundle.test.ts +57 -0
- package/src/change-set.test.ts +215 -0
- package/src/change-set.ts +445 -0
- package/src/cli/commands/audit-opt-in.test.ts +54 -0
- package/src/cli/commands/audit.ts +29 -2
- package/src/cli/commands/build.test.ts +19 -0
- package/src/cli/commands/build.ts +3 -2
- package/src/cli/handlers/build.ts +13 -1
- package/src/cli/handlers/change-set.test.ts +56 -0
- package/src/cli/handlers/change-set.ts +44 -0
- package/src/cli/handlers/fan-out.test.ts +221 -2
- package/src/cli/handlers/fan-out.ts +165 -75
- package/src/cli/handlers/graph.ts +3 -0
- package/src/cli/handlers/operator.test.ts +21 -0
- package/src/cli/handlers/operator.ts +34 -3
- package/src/cli/handlers/pr.ts +373 -0
- package/src/cli/handlers/run.ts +1 -0
- package/src/cli/main.test.ts +20 -0
- package/src/cli/main.ts +185 -23
- package/src/cli/mcp/never-over-mcp.test.ts +101 -0
- package/src/cli/mcp/op-tools.ts +24 -2
- package/src/cli/mcp/workspace-tools.test.ts +1 -1
- package/src/cli/mcp/workspace-tools.ts +34 -6
- package/src/cli/registry.ts +63 -1
- package/src/components/auto-release.ts +1 -1
- package/src/components/capability.ts +55 -0
- package/src/components/changed-files.ts +66 -0
- package/src/components/cli-support.ts +28 -5
- package/src/components/component.schema.json +17 -0
- package/src/components/component.ts +25 -0
- package/src/components/deploy-units.ts +3 -0
- package/src/components/driver.test.ts +52 -0
- package/src/components/driver.ts +31 -13
- package/src/components/fan-out-output.ts +42 -1
- package/src/components/fan-out-record.ts +69 -0
- package/src/components/fan-out-run.test.ts +17 -0
- package/src/components/fan-out-run.ts +304 -1
- package/src/components/fan-out-support.ts +3 -0
- package/src/components/fan-out-waves.test.ts +375 -0
- package/src/components/fan-out.ts +18 -17
- package/src/components/gated-wave-pipeline.ts +82 -0
- package/src/components/index.ts +1 -0
- package/src/components/layers.ts +30 -0
- package/src/components/pr-pipeline.ts +91 -0
- package/src/components/pr-run.test.ts +205 -0
- package/src/components/pr-run.ts +280 -0
- package/src/components/promote.ts +5 -0
- package/src/components/verbs/shell.test.ts +11 -0
- package/src/components/verbs/shell.ts +7 -3
- package/src/components/wave-plan.ts +124 -0
- package/src/discovery/sandbox/bundle.ts +1 -1
- package/src/gated-waves-bundle.test.ts +62 -0
- package/src/gated-waves.test.ts +118 -0
- package/src/gated-waves.ts +240 -0
- package/src/index.ts +1 -0
- package/src/lexicon.ts +51 -0
- package/src/lifecycle/gate-ledger.ts +7 -0
- package/src/lifecycle/git.ts +102 -16
- package/src/lint/post-synth.test.ts +19 -0
- package/src/lint/post-synth.ts +19 -1
- package/src/meta/declared-imports.test.ts +1 -1
- package/src/op/activities/activity-contracts.ts +84 -0
- package/src/op/activities/change-set.ts +114 -0
- package/src/op/activities/decide.ts +3 -0
- package/src/op/activities/factory.ts +675 -0
- package/src/op/activities/index.ts +6 -0
- package/src/op/activity-contract.test.ts +21 -1
- package/src/op/activity-contract.ts +19 -9
- package/src/op/builders.ts +23 -0
- package/src/op/decide-backend.ts +5 -1
- package/src/op/decide-read-inputs.ts +33 -5
- package/src/op/factory.e2e.test.ts +232 -0
- package/src/op/factory.ts +118 -0
- package/src/op/index.ts +9 -1
- package/src/op/op-ir.test.ts +9 -0
- package/src/op/op-ir.ts +4 -0
- package/src/op/op-verb-class.ts +3 -0
- package/src/op/types.ts +8 -0
- package/src/op/work-lease-run.ts +3 -0
- package/src/plan-summary.test.ts +263 -0
- package/src/plan-summary.ts +845 -0
- package/src/pr-forge.test.ts +237 -0
- package/src/pr-forge.ts +332 -0
- package/src/pr-loop-bundle.test.ts +46 -0
- package/src/pr-loop.test.ts +171 -0
- package/src/pr-loop.ts +324 -0
- package/src/telemetry-attribution.test.ts +23 -1
- package/src/telemetry-attribution.ts +51 -0
- package/src/terraform/hcl2json.test.ts +21 -0
- package/src/terraform/hcl2json.ts +81 -0
- package/src/terraform/parse.ts +11 -74
- package/src/vendor/js-yaml-load.test.ts +115 -0
- package/src/vendor/js-yaml-load.ts +1939 -0
- package/src/workspace/__fixtures__/studio-template-84c8b21.json +1 -1
- package/src/workspace/app-kind.test.ts +196 -0
- package/src/workspace/box-cli.ts +113 -0
- package/src/workspace/box-factory.test.ts +4 -1
- package/src/workspace/box-factory.ts +37 -4
- package/src/workspace/box-listing-write.schema.json +204 -0
- package/src/workspace/box-listing.test.ts +234 -0
- package/src/workspace/box-listing.ts +324 -0
- package/src/workspace/box-publish.schema.json +498 -0
- package/src/workspace/box-publish.test.ts +204 -0
- package/src/workspace/box-publish.ts +420 -0
- package/src/workspace/box-ship.test.ts +96 -0
- package/src/workspace/broker-protocol.schema.json +186 -0
- package/src/workspace/broker-protocol.test.ts +122 -0
- package/src/workspace/broker-protocol.ts +317 -0
- package/src/workspace/builder-tiers.test.ts +146 -0
- package/src/workspace/change-set.schema.json +460 -0
- package/src/workspace/chant-migrations.e2e.test.ts +17 -5
- package/src/workspace/checks/boxes.test.ts +3 -0
- package/src/workspace/checks.ts +10 -3
- package/src/workspace/component-environments.test.ts +105 -0
- package/src/workspace/composites.schema.json +23 -4
- package/src/workspace/composites.test.ts +8 -8
- package/src/workspace/composites.ts +13 -2
- package/src/workspace/conformance/__fixture__/decisions/decision.schema.json +2 -2
- package/src/workspace/conformance/__fixtures__/reference-broker.ts +207 -0
- package/src/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +7 -2
- package/src/workspace/conformance/__writer_fixture__/answers/answer.schema.json +42 -2
- package/src/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/src/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/src/workspace/conformance/__writer_fixture__/decisions/points.json +96 -0
- package/src/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/src/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/src/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +14 -8
- package/src/workspace/conformance/__writer_fixture__/sessions/session.schema.json +187 -6
- package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +25 -0
- package/src/workspace/conformance/broker.test.ts +122 -0
- package/src/workspace/conformance/broker.ts +792 -0
- package/src/workspace/conformance/conformance.e2e.test.ts +2 -1
- package/src/workspace/conformance/index.mjs +22 -1
- package/src/workspace/conformance/index.ts +5 -1
- package/src/workspace/conformance/vitest.ts +33 -1
- package/src/workspace/conformance/writer-conformance.e2e.test.ts +49 -3
- package/src/workspace/conformance/writer.test.ts +32 -2
- package/src/workspace/conformance/writer.ts +339 -28
- package/src/workspace/decide.test.ts +208 -4
- package/src/workspace/decide.ts +427 -73
- package/src/workspace/decision-points.schema.json +11 -4
- package/src/workspace/declaration.schema.json +153 -4
- package/src/workspace/declaration.ts +141 -0
- package/src/workspace/environments.ts +66 -14
- package/src/workspace/factory-rules.test.ts +62 -0
- package/src/workspace/factory-rules.ts +218 -0
- package/src/workspace/graph-cli.ts +2 -2
- package/src/workspace/graph.schema.json +67 -0
- package/src/workspace/identity.test.ts +23 -0
- package/src/workspace/init.ts +82 -2
- package/src/workspace/intent-cli.ts +26 -9
- package/src/workspace/intent-patch-id.test.ts +162 -0
- package/src/workspace/intent-record.schema.json +130 -3
- package/src/workspace/intent-record.ts +74 -28
- package/src/workspace/intent-reviews.test.ts +76 -0
- package/src/workspace/intent-squash.test.ts +213 -0
- package/src/workspace/intent-why.test.ts +5 -5
- package/src/workspace/intent.schema.json +234 -4
- package/src/workspace/intent.ts +260 -66
- package/src/workspace/json-edit.test.ts +121 -0
- package/src/workspace/json-edit.ts +142 -0
- package/src/workspace/jsonc.ts +20 -0
- package/src/workspace/kinds.ts +157 -2
- package/src/workspace/lexicon-symbols.test.ts +148 -0
- package/src/workspace/lexicon-symbols.ts +125 -0
- package/src/workspace/lineage-upgrade.test.ts +63 -0
- package/src/workspace/lineage-upgrade.ts +146 -5
- package/src/workspace/plan-summary.schema.json +155 -0
- package/src/workspace/point-answer.schema.json +42 -2
- package/src/workspace/points-cli.ts +42 -16
- package/src/workspace/points-write.schema.json +162 -4
- package/src/workspace/points.schema.json +157 -2
- package/src/workspace/points.test.ts +13 -1
- package/src/workspace/points.ts +118 -12
- package/src/workspace/pr-report.schema.json +95 -0
- package/src/workspace/profiles.test.ts +159 -0
- package/src/workspace/read-contract.test.ts +2 -2
- package/src/workspace/reason-codes.test.ts +13 -1
- package/src/workspace/reason-codes.ts +38 -4
- package/src/workspace/record-sessions.ts +9 -8
- package/src/workspace/records-amend.schema.json +78 -0
- package/src/workspace/records-cli.ts +20 -6
- package/src/workspace/records-close.schema.json +78 -0
- package/src/workspace/records-close.ts +31 -7
- package/src/workspace/records-concurrent.e2e.test.ts +135 -0
- package/src/workspace/records-concurrent.test.ts +145 -0
- package/src/workspace/records-formats.test.ts +46 -10
- package/src/workspace/records-new.schema.json +7 -0
- package/src/workspace/records-review.schema.json +78 -0
- package/src/workspace/records-sessions-write.test.ts +69 -0
- package/src/workspace/records-sessions.test.ts +22 -0
- package/src/workspace/records-write.ts +192 -25
- package/src/workspace/records.schema.json +16 -0
- package/src/workspace/records.ts +50 -9
- package/src/workspace/reference-kinds/app/package.json +10 -0
- package/src/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/src/workspace/run-statement.schema.json +622 -0
- package/src/workspace/runs-cli.ts +343 -14
- package/src/workspace/runs-statement.test.ts +239 -0
- package/src/workspace/runs-write.schema.json +416 -5
- package/src/workspace/runs.schema.json +451 -4
- package/src/workspace/runs.test.ts +39 -0
- package/src/workspace/runs.ts +296 -35
- package/src/workspace/session-kinds.ts +3 -3
- package/src/workspace/squash.ts +198 -0
- package/src/workspace/status-contract.test.ts +5 -2
- package/src/workspace/status-gates.ts +3 -1
- package/src/workspace/status.schema.json +126 -3
- package/src/workspace/status.ts +90 -1
- package/src/workspace/symbols.ts +20 -9
- package/src/workspace/trust/run-commits.ts +115 -0
- package/src/workspace/trust/run-statement.ts +226 -0
- package/src/workspace/trust/seal.ts +8 -2
- package/src/workspace/trust/verify-cli.ts +6 -5
- package/src/workspace/trust/verify.ts +39 -6
- package/src/workspace/wip-cli.ts +97 -0
- package/src/workspace/wip-write.schema.json +504 -0
- package/src/workspace/wip.schema.json +334 -0
- package/src/workspace/wip.test.ts +294 -0
- package/src/workspace/wip.ts +753 -0
- package/src/workspace/work-cli.ts +3 -0
- package/src/workspace/work-evidence.schema.json +3 -0
- package/src/workspace/work-size.test.ts +77 -0
- package/src/workspace/work-size.ts +93 -0
- package/src/workspace/workspace-kinds.schema.json +122 -0
- package/src/workspace/write-lock-cli.ts +131 -0
- package/src/workspace/write-lock.schema.json +172 -0
- package/src/workspace/write-lock.test.ts +189 -0
- package/src/workspace/write-lock.ts +474 -0
- package/src/workspace/write-scope.test.ts +16 -1
- package/src/workspace/write-scope.ts +33 -11
- package/src/yaml.ts +31 -21
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { CHANGE_SET_CONTRACT, CHANGE_SET_SCHEMA_ID, type ChangeSetDocument } from "../../change-set";
|
|
3
|
+
import { GITHUB_COMMENT_LIMIT, groupChangeSet, renderPlanSummaryMarkdown, renderPlanSummaryText } from "../../plan-summary";
|
|
4
|
+
import { formatError } from "../format";
|
|
5
|
+
import type { CommandContext } from "../registry";
|
|
6
|
+
|
|
7
|
+
const USAGE = "chant change-set summary <change-set.json> [--format text|json|markdown] [--limit <chars>]";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* `chant change-set summary <file>` (#3188): the grouped plan summary of a
|
|
11
|
+
* change-set document (`../../change-set.ts`), such as the `document` a
|
|
12
|
+
* `composeChangeSet` step returns. `--format` picks text (default), json
|
|
13
|
+
* (the plan-summary schema) or markdown, an MR or PR note of at most
|
|
14
|
+
* `--limit` characters (default GitHub's comment limit, 65536). Reads one
|
|
15
|
+
* file; no project, no plugins, no network.
|
|
16
|
+
*/
|
|
17
|
+
export async function runChangeSetSummary(ctx: CommandContext): Promise<number> {
|
|
18
|
+
const { args } = ctx;
|
|
19
|
+
const file = args.extraPositional;
|
|
20
|
+
const format = args.json ? "json" : args.format || "text";
|
|
21
|
+
const fail = (message: string): number => {
|
|
22
|
+
console.error(formatError({ message, hint: USAGE }));
|
|
23
|
+
return 1;
|
|
24
|
+
};
|
|
25
|
+
if (!file) return fail("change-set summary needs the change-set document to read");
|
|
26
|
+
if (format !== "text" && format !== "json" && format !== "markdown") return fail(`--format ${format} is not one of text, json or markdown`);
|
|
27
|
+
if (args.limit !== undefined && (!Number.isInteger(args.limit) || args.limit < 200)) return fail("--limit needs a whole number of characters, at least 200");
|
|
28
|
+
|
|
29
|
+
let doc: ChangeSetDocument;
|
|
30
|
+
try {
|
|
31
|
+
doc = JSON.parse(readFileSync(file, "utf-8")) as ChangeSetDocument;
|
|
32
|
+
} catch (err) {
|
|
33
|
+
return fail(`cannot read ${file} as JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
34
|
+
}
|
|
35
|
+
if (doc?.$schema !== CHANGE_SET_SCHEMA_ID || doc.contract !== CHANGE_SET_CONTRACT) {
|
|
36
|
+
return fail(`${file} is not a change-set document: its $schema is not ${CHANGE_SET_SCHEMA_ID} with contract ${CHANGE_SET_CONTRACT}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const summary = groupChangeSet(doc);
|
|
40
|
+
if (format === "json") console.log(JSON.stringify(summary, null, 2));
|
|
41
|
+
else if (format === "markdown") process.stdout.write(renderPlanSummaryMarkdown(summary, { limit: args.limit ?? GITHUB_COMMENT_LIMIT }));
|
|
42
|
+
else process.stdout.write(renderPlanSummaryText(summary));
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import { describe, test, expect, vi, beforeEach, afterEach } from "vitest";
|
|
12
12
|
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
13
|
+
import { readFileSync } from "node:fs";
|
|
13
14
|
import { join } from "node:path";
|
|
14
15
|
import { tmpdir } from "node:os";
|
|
15
16
|
import type { Component } from "../../components/component";
|
|
@@ -75,6 +76,12 @@ const ESTATE = [
|
|
|
75
76
|
|
|
76
77
|
let ran: string[] = [];
|
|
77
78
|
let failing: string[] = [];
|
|
79
|
+
/** What each component's step was handed, after wiring resolved. */
|
|
80
|
+
let inputs: Record<string, Record<string, unknown>> = {};
|
|
81
|
+
/** Stack outputs a component's step returns, as cfn-deploy's `outputs` does. */
|
|
82
|
+
let stepOutputs: Record<string, Record<string, unknown>> = {};
|
|
83
|
+
/** Called as a component's step starts, before it applies. */
|
|
84
|
+
let onStart: (component: string) => void = () => {};
|
|
78
85
|
|
|
79
86
|
function makeArgs(overrides: Partial<ParsedArgs>): ParsedArgs {
|
|
80
87
|
return {
|
|
@@ -101,6 +108,9 @@ beforeEach(() => {
|
|
|
101
108
|
vi.clearAllMocks();
|
|
102
109
|
ran = [];
|
|
103
110
|
failing = [];
|
|
111
|
+
inputs = {};
|
|
112
|
+
stepOutputs = {};
|
|
113
|
+
onStart = () => {};
|
|
104
114
|
gateLedger = memoryGateLedgerPort();
|
|
105
115
|
stderrLines = [];
|
|
106
116
|
stdoutLines = [];
|
|
@@ -129,10 +139,12 @@ beforeEach(() => {
|
|
|
129
139
|
const registry = new CapabilityRegistry();
|
|
130
140
|
registry.register({
|
|
131
141
|
kind: "cfn-deploy",
|
|
132
|
-
async run(runCtx: { component: string }) {
|
|
142
|
+
async run(runCtx: { component: string }, input: Record<string, unknown>) {
|
|
143
|
+
onStart(runCtx.component);
|
|
133
144
|
ran.push(runCtx.component);
|
|
145
|
+
inputs[runCtx.component] = input;
|
|
134
146
|
if (failing.includes(runCtx.component)) throw new Error(`${runCtx.component} failed`);
|
|
135
|
-
return { ok: true };
|
|
147
|
+
return { ok: true, ...(stepOutputs[runCtx.component] ? { outputs: stepOutputs[runCtx.component] } : {}) };
|
|
136
148
|
},
|
|
137
149
|
} as never);
|
|
138
150
|
return Promise.resolve(registry);
|
|
@@ -326,6 +338,76 @@ describe("proof: the re-run prints already-applied for what it skips, and finish
|
|
|
326
338
|
});
|
|
327
339
|
});
|
|
328
340
|
|
|
341
|
+
describe("proof: killed mid-fan-out, a re-run finishes without hand repair", () => {
|
|
342
|
+
test("the record keeps what applied before the kill, and the repeated command runs only the rest", async () => {
|
|
343
|
+
const dir = await mkdtemp(join(tmpdir(), "fan-out-"));
|
|
344
|
+
try {
|
|
345
|
+
const resume = join(dir, "attempt.json");
|
|
346
|
+
// The process dies as app-one starts. Whatever the record says at that
|
|
347
|
+
// instant is all a killed process leaves behind, so that is what the
|
|
348
|
+
// second run is handed.
|
|
349
|
+
let atKill: string | undefined;
|
|
350
|
+
onStart = (name) => {
|
|
351
|
+
if (name === "app-one") atKill = readFileSync(resume, "utf8");
|
|
352
|
+
};
|
|
353
|
+
await runComponentsFanOut(ctx({ base: "main", env: "test", resume }));
|
|
354
|
+
expect(atKill).toBeDefined();
|
|
355
|
+
expect(JSON.parse(atKill!).completed).toEqual(["cluster-a", "cluster-b", "net"]);
|
|
356
|
+
|
|
357
|
+
await writeFile(resume, atKill!);
|
|
358
|
+
ran = [];
|
|
359
|
+
onStart = () => {};
|
|
360
|
+
stderrLines = [];
|
|
361
|
+
expect(await runComponentsFanOut(ctx({ base: "main", env: "test", resume }))).toBe(0);
|
|
362
|
+
expect([...ran].sort()).toEqual(["app-one", "app-three", "app-two"]);
|
|
363
|
+
expect(stderr()).toMatch(/net +already-applied/);
|
|
364
|
+
expect(stderr()).toContain("fan-out completed: 3 applied, 0 failed, 0 blocked");
|
|
365
|
+
} finally {
|
|
366
|
+
await rm(dir, { recursive: true, force: true });
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
test("a component left to run reads a completed dependency's outputs from the record", async () => {
|
|
371
|
+
const wired: Component = {
|
|
372
|
+
name: "cluster-a",
|
|
373
|
+
dependsOn: ["net"],
|
|
374
|
+
deploy: [
|
|
375
|
+
{
|
|
376
|
+
phase: "Apply",
|
|
377
|
+
steps: [{ kind: "cfn-deploy", stack: "cluster-a-stack", inputs: { topic: { stackOutput: { stack: "net", name: "TopicArn" } } } }],
|
|
378
|
+
},
|
|
379
|
+
],
|
|
380
|
+
};
|
|
381
|
+
const estate = ESTATE.map((c) => (c.name === "cluster-a" ? wired : c));
|
|
382
|
+
discoverComponentsMock.mockResolvedValue({
|
|
383
|
+
components: new Map(estate.map((c) => [c.name, { component: c, exportName: c.name, filePath: `${c.name}.component.ts` }])),
|
|
384
|
+
sourceFiles: [],
|
|
385
|
+
errors: [],
|
|
386
|
+
});
|
|
387
|
+
stepOutputs = { net: { TopicArn: "arn:aws:sns:us-east-1:000000000000:net" } };
|
|
388
|
+
|
|
389
|
+
const dir = await mkdtemp(join(tmpdir(), "fan-out-"));
|
|
390
|
+
try {
|
|
391
|
+
const resume = join(dir, "attempt.json");
|
|
392
|
+
failing = ["cluster-a"];
|
|
393
|
+
expect(await runComponentsFanOut(ctx({ base: "main", env: "test", resume }))).toBe(1);
|
|
394
|
+
expect(JSON.parse(await readFile(resume, "utf8")).outputs.net).toEqual(stepOutputs.net);
|
|
395
|
+
|
|
396
|
+
// net does not run again, and nobody passes --seed-outputs.
|
|
397
|
+
ran = [];
|
|
398
|
+
failing = [];
|
|
399
|
+
inputs = {};
|
|
400
|
+
expect(await runComponentsFanOut(ctx({ base: "main", env: "test", resume }))).toBe(0);
|
|
401
|
+
expect(ran).not.toContain("net");
|
|
402
|
+
expect(inputs["cluster-a"]).toEqual(
|
|
403
|
+
expect.objectContaining({ inputs: { topic: "arn:aws:sns:us-east-1:000000000000:net" } }),
|
|
404
|
+
);
|
|
405
|
+
} finally {
|
|
406
|
+
await rm(dir, { recursive: true, force: true });
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
});
|
|
410
|
+
|
|
329
411
|
describe("proof: one approval covers the set, and the printed digest is what approves it", () => {
|
|
330
412
|
test("an unapproved gate stops the whole fan-out before anything runs", async () => {
|
|
331
413
|
const exit = await runComponentsFanOut(ctx({ base: "main", env: "test", gate: "release" }));
|
|
@@ -392,3 +474,140 @@ describe("proof: one approval covers the set, and the printed digest is what app
|
|
|
392
474
|
expect(ran).toEqual([]);
|
|
393
475
|
});
|
|
394
476
|
});
|
|
477
|
+
|
|
478
|
+
describe("gated waves (#3049): one gate per wave, bound to the wave's set digest", () => {
|
|
479
|
+
/** What each root's plan would write. Change one to change a root. */
|
|
480
|
+
let versions: Record<string, string> = {};
|
|
481
|
+
|
|
482
|
+
beforeEach(() => {
|
|
483
|
+
versions = {};
|
|
484
|
+
buildCapabilityRegistryMock.mockImplementation(() => {
|
|
485
|
+
const registry = new CapabilityRegistry();
|
|
486
|
+
registry.register({
|
|
487
|
+
kind: "cfn-deploy",
|
|
488
|
+
async plan(_ctx: unknown, input: { stack: string }) {
|
|
489
|
+
const v = versions[input.stack] ?? "v1";
|
|
490
|
+
return { member: input.stack, planDigest: "jcs1-sha256:" + (v === "v1" ? "1" : "2").repeat(64) };
|
|
491
|
+
},
|
|
492
|
+
async run(runCtx: { component: string }) {
|
|
493
|
+
ran.push(runCtx.component);
|
|
494
|
+
return { ok: true };
|
|
495
|
+
},
|
|
496
|
+
} as never);
|
|
497
|
+
return Promise.resolve(registry);
|
|
498
|
+
});
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
test("wave 1 stops at its own gate, and the record names its digest", async () => {
|
|
502
|
+
const dir = await mkdtemp(join(tmpdir(), "fan-out-waves-"));
|
|
503
|
+
try {
|
|
504
|
+
const record = join(dir, "fan-out.json");
|
|
505
|
+
const exit = await runComponentsFanOut(ctx({ base: "main", env: "test", waveGate: "release", resume: record }));
|
|
506
|
+
expect(exit).toBe(3);
|
|
507
|
+
expect(ran).toEqual([]);
|
|
508
|
+
const pending = gateLedger.appended[0];
|
|
509
|
+
expect(pending.gate).toBe("release-wave-1");
|
|
510
|
+
expect(stderr()).toContain(`approve : chant approve fan-out release-wave-1 --plan ${pending.planDigest}`);
|
|
511
|
+
const saved = JSON.parse(readFileSync(record, "utf8"));
|
|
512
|
+
expect(saved.waves).toMatchObject([{ wave: 1, gate: "release-wave-1", status: "gated", digest: pending.planDigest }]);
|
|
513
|
+
} finally {
|
|
514
|
+
await rm(dir, { recursive: true, force: true });
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
test("approve wave 1, change a root, re-run: it stops naming both digests and applies nothing", async () => {
|
|
519
|
+
const dir = await mkdtemp(join(tmpdir(), "fan-out-waves-"));
|
|
520
|
+
try {
|
|
521
|
+
const record = join(dir, "fan-out.json");
|
|
522
|
+
const run = () => runComponentsFanOut(ctx({ base: "main", env: "test", waveGate: "release", resume: record }));
|
|
523
|
+
await run();
|
|
524
|
+
const approved = gateLedger.appended[0].planDigest!;
|
|
525
|
+
gateLedger = memoryGateLedgerPort({
|
|
526
|
+
pending: [gateLedger.appended[0]],
|
|
527
|
+
resolutions: [
|
|
528
|
+
{
|
|
529
|
+
version: 1,
|
|
530
|
+
kind: "resolution",
|
|
531
|
+
op: "fan-out",
|
|
532
|
+
gate: "release-wave-1",
|
|
533
|
+
resolvedBy: "operator",
|
|
534
|
+
timestamp: new Date(Date.parse(gateLedger.appended[0].timestamp) + 1000).toISOString(),
|
|
535
|
+
planDigest: approved,
|
|
536
|
+
},
|
|
537
|
+
],
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
versions["net-stack"] = "v2";
|
|
541
|
+
stderrLines = [];
|
|
542
|
+
expect(await run()).toBe(3);
|
|
543
|
+
expect(ran).toEqual([]);
|
|
544
|
+
const planned = gateLedger.appended[0].planDigest!;
|
|
545
|
+
expect(planned).not.toBe(approved);
|
|
546
|
+
expect(stderr()).toContain(`approved: ${approved}; planned now: ${planned}`);
|
|
547
|
+
expect(stderr()).toContain("nothing in it was applied");
|
|
548
|
+
const saved = JSON.parse(readFileSync(record, "utf8"));
|
|
549
|
+
expect(saved.waves[0]).toMatchObject({ status: "gated", approved, digest: planned });
|
|
550
|
+
} finally {
|
|
551
|
+
await rm(dir, { recursive: true, force: true });
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
test("an approved wave applies, the run stops at the next wave, and the record carries both", async () => {
|
|
556
|
+
const dir = await mkdtemp(join(tmpdir(), "fan-out-waves-"));
|
|
557
|
+
try {
|
|
558
|
+
const record = join(dir, "fan-out.json");
|
|
559
|
+
const run = () => runComponentsFanOut(ctx({ base: "main", env: "test", waveGate: "release", resume: record }));
|
|
560
|
+
await run();
|
|
561
|
+
const first = gateLedger.appended[0];
|
|
562
|
+
gateLedger = memoryGateLedgerPort({
|
|
563
|
+
pending: [first],
|
|
564
|
+
resolutions: [
|
|
565
|
+
{
|
|
566
|
+
version: 1,
|
|
567
|
+
kind: "resolution",
|
|
568
|
+
op: "fan-out",
|
|
569
|
+
gate: "release-wave-1",
|
|
570
|
+
resolvedBy: "operator",
|
|
571
|
+
timestamp: new Date(Date.parse(first.timestamp) + 1000).toISOString(),
|
|
572
|
+
planDigest: first.planDigest,
|
|
573
|
+
},
|
|
574
|
+
],
|
|
575
|
+
});
|
|
576
|
+
expect(await run()).toBe(3);
|
|
577
|
+
expect(ran).toEqual(["net"]);
|
|
578
|
+
const saved = JSON.parse(readFileSync(record, "utf8"));
|
|
579
|
+
expect(saved.completed).toEqual(["net"]);
|
|
580
|
+
expect(saved.waves.map((w: { wave: number; status: string }) => [w.wave, w.status])).toEqual([
|
|
581
|
+
[1, "applied"],
|
|
582
|
+
[2, "gated"],
|
|
583
|
+
]);
|
|
584
|
+
|
|
585
|
+
// The same command again: wave 1 is not applied a second time.
|
|
586
|
+
ran = [];
|
|
587
|
+
expect(await run()).toBe(3);
|
|
588
|
+
expect(ran).toEqual([]);
|
|
589
|
+
} finally {
|
|
590
|
+
await rm(dir, { recursive: true, force: true });
|
|
591
|
+
}
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
test("--canary puts a component in wave 1, and the dry run names each wave's gate", async () => {
|
|
595
|
+
const exit = await runComponentsFanOut(ctx({ base: "main", dryRun: true, waveGate: "release", canary: ["cluster-b"] }));
|
|
596
|
+
expect(exit).toBe(0);
|
|
597
|
+
expect(stderr()).toContain("wave 1: cluster-b (gate release-wave-1)");
|
|
598
|
+
expect(stderr()).toContain("wave 2: app-three, net (gate release-wave-2)");
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
test("--wave 2 refuses while wave 1 has not applied", async () => {
|
|
602
|
+
const exit = await runComponentsFanOut(ctx({ base: "main", env: "test", waveGate: "release", wave: 2 }));
|
|
603
|
+
expect(exit).toBe(1);
|
|
604
|
+
expect(stderr()).toContain("wave 2 cannot run yet: wave 1 has not applied (net)");
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
test("--gate and --wave-gate together are refused, and --wave needs --wave-gate", async () => {
|
|
608
|
+
expect(await runComponentsFanOut(ctx({ base: "main", gate: "release", waveGate: "release" }))).toBe(1);
|
|
609
|
+
expect(stderr()).toContain("--gate and --wave-gate both name a gate");
|
|
610
|
+
expect(await runComponentsFanOut(ctx({ base: "main", wave: 1 }))).toBe(1);
|
|
611
|
+
expect(stderr()).toContain("--wave runs one wave");
|
|
612
|
+
});
|
|
613
|
+
});
|