@intentius/chant 0.57.0 → 0.58.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 +51 -1
- package/dist/audit/catalog.d.ts.map +1 -1
- package/dist/audit/core.d.ts +20 -1
- package/dist/audit/core.d.ts.map +1 -1
- package/dist/audit/discover.d.ts +14 -8
- package/dist/audit/discover.d.ts.map +1 -1
- package/dist/audit/lineage.d.ts +10 -0
- package/dist/audit/lineage.d.ts.map +1 -0
- package/dist/audit/prior-art.d.ts +385 -0
- package/dist/audit/prior-art.d.ts.map +1 -0
- package/dist/audit/proof.d.ts +16 -0
- package/dist/audit/proof.d.ts.map +1 -1
- package/dist/audit/report-html.d.ts.map +1 -1
- package/dist/audit/report-model.d.ts +8 -1
- package/dist/audit/report-model.d.ts.map +1 -1
- package/dist/audit/report.d.ts.map +1 -1
- package/dist/audit/rules-doc.d.ts +3 -0
- package/dist/audit/rules-doc.d.ts.map +1 -1
- package/dist/audit/secrets.d.ts +15 -0
- package/dist/audit/secrets.d.ts.map +1 -1
- package/dist/audit/terraform-state.d.ts +46 -0
- package/dist/audit/terraform-state.d.ts.map +1 -0
- package/dist/build.d.ts +17 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/claimed-fields.d.ts +161 -0
- package/dist/claimed-fields.d.ts.map +1 -0
- package/dist/cli/build-params-cli.d.ts +2 -2
- package/dist/cli/command-group.d.ts +14 -0
- package/dist/cli/command-group.d.ts.map +1 -1
- package/dist/cli/commands/audit.d.ts +17 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-docs.d.ts +1 -1
- package/dist/cli/commands/check-lexicon-examples.d.ts +16 -6
- package/dist/cli/commands/check-lexicon-examples.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/codegen.d.ts +1 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon/templates/project.d.ts +7 -0
- package/dist/cli/commands/init-lexicon/templates/project.d.ts.map +1 -1
- package/dist/cli/commands/init-lexicon.d.ts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/onboard.d.ts +2 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -1
- package/dist/cli/handlers/build.d.ts.map +1 -1
- package/dist/cli/handlers/lifecycle.d.ts.map +1 -1
- package/dist/cli/handlers/operator.d.ts +82 -16
- package/dist/cli/handlers/operator.d.ts.map +1 -1
- package/dist/cli/handlers/run.d.ts +49 -42
- package/dist/cli/handlers/run.d.ts.map +1 -1
- package/dist/cli/main.d.ts +28 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/mcp/op-tools.d.ts +16 -1
- package/dist/cli/mcp/op-tools.d.ts.map +1 -1
- package/dist/cli/mcp/resource-handlers.d.ts.map +1 -1
- package/dist/cli/mcp/resources/context.d.ts.map +1 -1
- package/dist/cli/registry.d.ts +26 -9
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/codegen/generate-post-synth-barrel.d.ts +1 -1
- package/dist/components/auto-release.d.ts +10 -20
- package/dist/components/auto-release.d.ts.map +1 -1
- package/dist/components/capability.d.ts +4 -4
- package/dist/components/cli-support.d.ts +20 -21
- package/dist/components/cli-support.d.ts.map +1 -1
- package/dist/components/component.d.ts +3 -3
- package/dist/components/component.d.ts.map +1 -1
- package/dist/components/driver-output.d.ts.map +1 -1
- package/dist/components/driver.d.ts +66 -36
- package/dist/components/driver.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/manifest-persistence.d.ts +1 -9
- package/dist/components/manifest-persistence.d.ts.map +1 -1
- package/dist/components/run-progress.d.ts +6 -6
- package/dist/components/run-progress.d.ts.map +1 -1
- package/dist/components/verbs/run-agent.d.ts +9 -15
- package/dist/components/verbs/run-agent.d.ts.map +1 -1
- package/dist/components/verbs/verify.d.ts +2 -2
- package/dist/deep-observation.d.ts +17 -0
- package/dist/deep-observation.d.ts.map +1 -1
- package/dist/discovery/files.d.ts +4 -4
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/param-deps.d.ts +33 -0
- package/dist/discovery/param-deps.d.ts.map +1 -1
- package/dist/discovery/sandbox/bundle.d.ts.map +1 -1
- package/dist/discovery/sandbox/config-wire.d.ts +2 -2
- package/dist/fold/foldable-helpers.d.ts +5 -1
- package/dist/fold/foldable-helpers.d.ts.map +1 -1
- package/dist/fold-provenance.d.ts +236 -0
- package/dist/fold-provenance.d.ts.map +1 -0
- package/dist/graph-ops.d.ts +1 -1
- package/dist/held-elsewhere.d.ts +85 -0
- package/dist/held-elsewhere.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/kubectl-context.d.ts +3 -3
- package/dist/lexicon-config.d.ts +4 -4
- package/dist/lexicon-plugin-helpers.d.ts +1 -1
- package/dist/lexicon.d.ts +104 -14
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/lifecycle/change-set.d.ts +13 -0
- package/dist/lifecycle/change-set.d.ts.map +1 -1
- package/dist/lifecycle/deep-diff.d.ts +133 -6
- package/dist/lifecycle/deep-diff.d.ts.map +1 -1
- package/dist/lifecycle/deep-observe.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.d.ts +71 -3
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/index.d.ts +1 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/release-ledger.d.ts +2 -2
- package/dist/lifecycle/run-ledger.d.ts +53 -0
- package/dist/lifecycle/run-ledger.d.ts.map +1 -0
- package/dist/lifecycle/symptoms.d.ts +3 -3
- package/dist/lifecycle/symptoms.d.ts.map +1 -1
- package/dist/lint/config.d.ts +81 -2
- package/dist/lint/config.d.ts.map +1 -1
- package/dist/lint/post-synth.d.ts +55 -2
- package/dist/lint/post-synth.d.ts.map +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.d.ts.map +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts +1 -1
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.d.ts.map +1 -1
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts +44 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.d.ts.map +1 -0
- package/dist/lint/rules/comp/index.d.ts +1 -1
- package/dist/lint/rules/comp/index.d.ts.map +1 -1
- package/dist/lint/rules/op/index.d.ts +16 -0
- package/dist/lint/rules/op/index.d.ts.map +1 -0
- package/dist/lint/rules/op/ops012-activity-contract.d.ts +27 -0
- package/dist/lint/rules/op/ops012-activity-contract.d.ts.map +1 -0
- package/dist/lint/rules/op/ops013-step-output-ref.d.ts +61 -0
- package/dist/lint/rules/op/ops013-step-output-ref.d.ts.map +1 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts +55 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.d.ts.map +1 -0
- package/dist/lint/rules/op/support.d.ts +12 -0
- package/dist/lint/rules/op/support.d.ts.map +1 -0
- package/dist/lint/suppressions.d.ts +108 -0
- package/dist/lint/suppressions.d.ts.map +1 -0
- package/dist/live-endpoint.d.ts +1 -1
- package/dist/op/activities/activity-contracts.d.ts +54 -0
- package/dist/op/activities/activity-contracts.d.ts.map +1 -0
- package/dist/op/activities/apply.d.ts +262 -0
- package/dist/op/activities/apply.d.ts.map +1 -0
- package/dist/op/activities/build.d.ts +13 -0
- package/dist/op/activities/build.d.ts.map +1 -0
- package/dist/op/activities/converge.d.ts +110 -0
- package/dist/op/activities/converge.d.ts.map +1 -0
- package/dist/op/activities/env-teardown.d.ts +76 -0
- package/dist/op/activities/env-teardown.d.ts.map +1 -0
- package/dist/op/activities/guard-validate.d.ts +64 -0
- package/dist/op/activities/guard-validate.d.ts.map +1 -0
- package/dist/op/activities/http-check.d.ts +34 -0
- package/dist/op/activities/http-check.d.ts.map +1 -0
- package/dist/op/activities/index.d.ts +31 -0
- package/dist/op/activities/index.d.ts.map +1 -0
- package/dist/op/activities/lexicon-upgrade.d.ts +182 -0
- package/dist/op/activities/lexicon-upgrade.d.ts.map +1 -0
- package/dist/op/activities/lifecycle.d.ts +42 -0
- package/dist/op/activities/lifecycle.d.ts.map +1 -0
- package/dist/op/activities/pipeline-audit.d.ts +84 -0
- package/dist/op/activities/pipeline-audit.d.ts.map +1 -0
- package/dist/op/activities/policy.d.ts +17 -0
- package/dist/op/activities/policy.d.ts.map +1 -0
- package/dist/op/activities/reconcile.d.ts +89 -0
- package/dist/op/activities/reconcile.d.ts.map +1 -0
- package/dist/op/activities/shell.d.ts +13 -0
- package/dist/op/activities/shell.d.ts.map +1 -0
- package/dist/op/activities/teardown.d.ts +10 -0
- package/dist/op/activities/teardown.d.ts.map +1 -0
- package/dist/op/activities/util.d.ts +7 -0
- package/dist/op/activities/util.d.ts.map +1 -0
- package/dist/op/activities/wait.d.ts +28 -0
- package/dist/op/activities/wait.d.ts.map +1 -0
- package/dist/op/activities/workflow-audit.d.ts +92 -0
- package/dist/op/activities/workflow-audit.d.ts.map +1 -0
- package/dist/op/activity-contract-registry.d.ts +76 -0
- package/dist/op/activity-contract-registry.d.ts.map +1 -0
- package/dist/op/activity-contract.d.ts +25 -18
- package/dist/op/activity-contract.d.ts.map +1 -1
- package/dist/op/activity-failure.d.ts +28 -0
- package/dist/op/activity-failure.d.ts.map +1 -0
- package/dist/op/activity-profiles.d.ts +118 -0
- package/dist/op/activity-profiles.d.ts.map +1 -0
- package/dist/op/activity-registry.d.ts +22 -38
- package/dist/op/activity-registry.d.ts.map +1 -1
- package/dist/op/activity-runtime.d.ts +3 -14
- package/dist/op/activity-runtime.d.ts.map +1 -1
- package/dist/op/builders.d.ts +84 -29
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/composites/apply-op.d.ts +113 -0
- package/dist/op/composites/apply-op.d.ts.map +1 -0
- package/dist/op/composites/converge-op.d.ts +120 -0
- package/dist/op/composites/converge-op.d.ts.map +1 -0
- package/dist/op/composites/index.d.ts +26 -0
- package/dist/op/composites/index.d.ts.map +1 -0
- package/dist/op/composites/lexicon-upgrade-op.d.ts +78 -0
- package/dist/op/composites/lexicon-upgrade-op.d.ts.map +1 -0
- package/dist/op/composites/pipeline-audit-op.d.ts +50 -0
- package/dist/op/composites/pipeline-audit-op.d.ts.map +1 -0
- package/dist/op/composites/reconcile-op.d.ts +57 -0
- package/dist/op/composites/reconcile-op.d.ts.map +1 -0
- package/dist/op/composites/watch-op.d.ts +60 -0
- package/dist/op/composites/watch-op.d.ts.map +1 -0
- package/dist/op/composites/workflow-audit-op.d.ts +57 -0
- package/dist/op/composites/workflow-audit-op.d.ts.map +1 -0
- package/dist/op/converge-rule.d.ts +12 -10
- package/dist/op/converge-rule.d.ts.map +1 -1
- package/dist/op/cron.d.ts +51 -0
- package/dist/op/cron.d.ts.map +1 -0
- package/dist/op/discover.d.ts +9 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/duration.d.ts +11 -0
- package/dist/op/duration.d.ts.map +1 -0
- package/dist/op/emulator-lifecycle.d.ts.map +1 -1
- package/dist/op/gate.d.ts +90 -0
- package/dist/op/gate.d.ts.map +1 -0
- package/dist/op/generate-pipeline.d.ts +9 -0
- package/dist/op/generate-pipeline.d.ts.map +1 -1
- package/dist/op/index.d.ts +23 -7
- package/dist/op/index.d.ts.map +1 -1
- package/dist/op/local-executor.d.ts +114 -28
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-output.d.ts +11 -1
- package/dist/op/local-output.d.ts.map +1 -1
- package/dist/op/op-ir.d.ts +184 -0
- package/dist/op/op-ir.d.ts.map +1 -0
- package/dist/op/op-verb-class.d.ts +10 -2
- package/dist/op/op-verb-class.d.ts.map +1 -1
- package/dist/op/operator.d.ts +30 -5
- package/dist/op/operator.d.ts.map +1 -1
- package/dist/op/receipt-store.d.ts +1 -1
- package/dist/op/receipt-store.d.ts.map +1 -1
- package/dist/op/resource.d.ts +15 -1
- package/dist/op/resource.d.ts.map +1 -1
- package/dist/op/runtime.d.ts +200 -0
- package/dist/op/runtime.d.ts.map +1 -0
- package/dist/op/runtimes/local.d.ts +29 -0
- package/dist/op/runtimes/local.d.ts.map +1 -0
- package/dist/op/step-output-ref.d.ts +15 -13
- package/dist/op/step-output-ref.d.ts.map +1 -1
- package/dist/op/types.d.ts +79 -27
- package/dist/op/types.d.ts.map +1 -1
- package/dist/ownership.d.ts +1 -1
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -1
- package/dist/serializer-walker.d.ts.map +1 -1
- package/package.json +6 -1
- package/src/audit/catalog.test.ts +79 -3
- package/src/audit/catalog.ts +111 -13
- package/src/audit/core.test.ts +26 -0
- package/src/audit/core.ts +61 -17
- package/src/audit/discover.test.ts +39 -0
- package/src/audit/discover.ts +91 -15
- package/src/audit/lineage.ts +100 -0
- package/src/audit/prior-art.ts +153 -0
- package/src/audit/proof.test.ts +67 -0
- package/src/audit/proof.ts +70 -0
- package/src/audit/report-html.ts +9 -4
- package/src/audit/report-model.ts +16 -2
- package/src/audit/report.test.ts +33 -0
- package/src/audit/report.ts +5 -3
- package/src/audit/rules-doc.test.ts +34 -2
- package/src/audit/rules-doc.ts +82 -9
- package/src/audit/secrets.ts +15 -3
- package/src/audit/terraform-state.test.ts +144 -0
- package/src/audit/terraform-state.ts +131 -0
- package/src/build.ts +31 -1
- package/src/claimed-fields.test.ts +145 -0
- package/src/claimed-fields.ts +208 -0
- package/src/cli/build-params-cli.ts +2 -2
- package/src/cli/command-group.ts +14 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/.terraform/providers/lock.txt +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/main.tf +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/modules/foo/main.tf +1 -0
- package/src/cli/commands/__fixtures__/audit-terraform/infra/variables.tf +3 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/package.json +13 -4
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/docs-cli.ts +4 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/codegen/package.ts +1 -0
- package/src/cli/commands/__fixtures__/init-lexicon-output/src/package-cli.ts +21 -0
- package/src/cli/commands/__snapshots__/init-lexicon.test.ts.snap +1 -0
- package/src/cli/commands/audit.test.ts +189 -11
- package/src/cli/commands/audit.ts +73 -27
- package/src/cli/commands/build.test.ts +292 -9
- package/src/cli/commands/build.ts +156 -24
- package/src/cli/commands/check-lexicon-docs.ts +1 -1
- package/src/cli/commands/check-lexicon-examples.test.ts +29 -1
- package/src/cli/commands/check-lexicon-examples.ts +42 -10
- package/src/cli/commands/init-lexicon/templates/codegen.ts +9 -0
- package/src/cli/commands/init-lexicon/templates/project.ts +44 -4
- package/src/cli/commands/init-lexicon.test.ts +97 -2
- package/src/cli/commands/init-lexicon.ts +4 -2
- package/src/cli/commands/init.test.ts +35 -1
- package/src/cli/commands/init.ts +14 -3
- package/src/cli/commands/lint.test.ts +48 -0
- package/src/cli/commands/lint.ts +123 -0
- package/src/cli/commands/onboard.test.ts +75 -0
- package/src/cli/commands/onboard.ts +54 -23
- package/src/cli/handlers/build.test.ts +81 -1
- package/src/cli/handlers/build.ts +15 -1
- package/src/cli/handlers/graph.test.ts +3 -3
- package/src/cli/handlers/lifecycle.test.ts +195 -12
- package/src/cli/handlers/lifecycle.ts +123 -6
- package/src/cli/handlers/misc.ts +1 -1
- package/src/cli/handlers/operator.test.ts +183 -11
- package/src/cli/handlers/operator.ts +260 -55
- package/src/cli/handlers/run.test.ts +431 -1287
- package/src/cli/handlers/run.ts +365 -915
- package/src/cli/main.test.ts +23 -15
- package/src/cli/main.ts +88 -33
- package/src/cli/mcp/op-tools.ts +147 -88
- package/src/cli/mcp/resource-handlers.ts +10 -37
- package/src/cli/mcp/resources/context.ts +11 -12
- package/src/cli/mcp/server.test.ts +25 -27
- package/src/cli/mcp/server.ts +2 -2
- package/src/cli/registry.ts +26 -9
- package/src/codegen/docs.ts +1 -1
- package/src/codegen/generate-post-synth-barrel.test.ts +1 -1
- package/src/codegen/generate-post-synth-barrel.ts +1 -1
- package/src/components/README.md +3 -2
- package/src/components/auto-release.test.ts +4 -20
- package/src/components/auto-release.ts +17 -42
- package/src/components/capability.ts +4 -4
- package/src/components/cli-support.test.ts +10 -5
- package/src/components/cli-support.ts +52 -44
- package/src/components/component.schema.json +2 -2
- package/src/components/component.ts +3 -3
- package/src/components/driver-output.ts +14 -2
- package/src/components/driver.test.ts +92 -22
- package/src/components/driver.ts +193 -83
- package/src/components/index.ts +1 -6
- package/src/components/manifest-persistence.test.ts +2 -20
- package/src/components/manifest-persistence.ts +4 -24
- package/src/components/pilots/pilots-lint-clean.test.ts +11 -10
- package/src/components/run-progress.ts +6 -6
- package/src/components/verbs/run-agent.ts +11 -17
- package/src/components/verbs/verify.ts +2 -2
- package/src/deep-observation.test.ts +75 -0
- package/src/deep-observation.ts +48 -0
- package/src/discovery/collect.test.ts +3 -3
- package/src/discovery/files.ts +4 -4
- package/src/discovery/fold-import.ts +105 -2
- package/src/discovery/param-deps.test.ts +112 -1
- package/src/discovery/param-deps.ts +193 -0
- package/src/discovery/sandbox/bundle.ts +15 -1
- package/src/discovery/sandbox/config-wire.test.ts +2 -2
- package/src/discovery/sandbox/config-wire.ts +2 -2
- package/src/fold/fold.test.ts +56 -0
- package/src/fold/foldable-helpers.ts +81 -1
- package/src/fold-provenance-exclusion.test.ts +186 -0
- package/src/fold-provenance.test.ts +495 -0
- package/src/fold-provenance.ts +441 -0
- package/src/graph-ops.test.ts +2 -2
- package/src/graph-ops.ts +1 -1
- package/src/held-elsewhere.test.ts +102 -0
- package/src/held-elsewhere.ts +114 -0
- package/src/index.ts +3 -0
- package/src/kubectl-context.ts +3 -3
- package/src/lexicon-config.test.ts +5 -5
- package/src/lexicon-config.ts +4 -4
- package/src/lexicon-plugin-helpers.ts +1 -1
- package/src/lexicon.ts +120 -14
- package/src/lifecycle/change-set.test.ts +49 -0
- package/src/lifecycle/change-set.ts +67 -0
- package/src/lifecycle/converge-ledger.ts +1 -1
- package/src/lifecycle/deep-diff.test.ts +267 -14
- package/src/lifecycle/deep-diff.ts +217 -14
- package/src/lifecycle/deep-observe.test.ts +3 -1
- package/src/lifecycle/deep-observe.ts +16 -6
- package/src/lifecycle/gate-ledger.test.ts +74 -2
- package/src/lifecycle/gate-ledger.ts +143 -36
- package/src/lifecycle/index.ts +1 -0
- package/src/lifecycle/release-ledger.ts +2 -2
- package/src/lifecycle/run-ledger.test.ts +268 -0
- package/src/lifecycle/run-ledger.ts +201 -0
- package/src/lifecycle/symptoms.ts +3 -3
- package/src/lint/config.test.ts +82 -1
- package/src/lint/config.ts +112 -3
- package/src/lint/policy.test.ts +1 -1
- package/src/lint/post-synth.test.ts +31 -0
- package/src/lint/post-synth.ts +54 -1
- package/src/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.ts +2 -2
- package/src/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.ts +1 -1
- package/src/lint/rules/comp/comp.test.ts +1 -1
- package/src/lint/rules/comp/comp004-gate-needs-durable-runtime.ts +74 -0
- package/src/lint/rules/comp/index.ts +3 -3
- package/src/lint/rules/op/index.ts +23 -0
- package/src/lint/rules/op/ops012-activity-contract.test.ts +161 -0
- package/src/lint/rules/op/ops012-activity-contract.ts +64 -0
- package/src/lint/rules/op/ops013-step-output-ref.test.ts +237 -0
- package/src/lint/rules/op/ops013-step-output-ref.ts +98 -0
- package/src/lint/rules/op/ops014-converge-rule-refusals.test.ts +263 -0
- package/src/lint/rules/op/ops014-converge-rule-refusals.ts +179 -0
- package/src/lint/rules/op/support.ts +11 -0
- package/src/lint/suppressions.test.ts +163 -0
- package/src/lint/suppressions.ts +204 -0
- package/src/live-endpoint.ts +1 -1
- package/src/op/activities/activity-contracts.ts +66 -0
- package/src/op/activities/apply.test.ts +567 -0
- package/src/op/activities/apply.ts +662 -0
- package/src/op/activities/build.ts +26 -0
- package/src/op/activities/converge.test.ts +330 -0
- package/src/op/activities/converge.ts +449 -0
- package/src/op/activities/env-teardown.test.ts +187 -0
- package/src/op/activities/env-teardown.ts +171 -0
- package/src/op/activities/guard-validate.test.ts +139 -0
- package/src/op/activities/guard-validate.ts +223 -0
- package/src/op/activities/http-check.test.ts +48 -0
- package/src/op/activities/http-check.ts +55 -0
- package/src/op/activities/index.ts +119 -0
- package/src/op/activities/lexicon-upgrade.test.ts +492 -0
- package/src/op/activities/lexicon-upgrade.ts +673 -0
- package/src/op/activities/lifecycle.ts +85 -0
- package/src/op/activities/pipeline-audit.test.ts +67 -0
- package/src/op/activities/pipeline-audit.ts +201 -0
- package/src/op/activities/policy.test.ts +19 -0
- package/src/op/activities/policy.ts +37 -0
- package/src/op/activities/reconcile.test.ts +81 -0
- package/src/op/activities/reconcile.ts +187 -0
- package/src/op/activities/shell.ts +26 -0
- package/src/op/activities/teardown.ts +22 -0
- package/src/op/activities/util.ts +6 -0
- package/src/op/activities/wait.ts +69 -0
- package/src/op/activities/workflow-audit.test.ts +90 -0
- package/src/op/activities/workflow-audit.ts +203 -0
- package/src/op/activity-contract-registry.test.ts +98 -0
- package/src/op/activity-contract-registry.ts +114 -0
- package/src/op/activity-contract.test.ts +1 -1
- package/src/op/activity-contract.ts +37 -33
- package/src/op/activity-failure.ts +34 -0
- package/src/op/activity-profiles.test.ts +56 -0
- package/src/op/activity-profiles.ts +116 -0
- package/src/op/activity-registry.test.ts +37 -28
- package/src/op/activity-registry.ts +27 -56
- package/src/op/activity-runtime.ts +3 -47
- package/src/op/builders-exports.test.ts +0 -49
- package/src/op/builders-typed.test.ts +164 -0
- package/src/op/builders.ts +123 -39
- package/src/op/composites/apply-op.ts +208 -0
- package/src/op/composites/composites.test.ts +366 -0
- package/src/op/composites/converge-op.test.ts +168 -0
- package/src/op/composites/converge-op.ts +214 -0
- package/src/op/composites/index.ts +26 -0
- package/src/op/composites/lexicon-upgrade-op.test.ts +68 -0
- package/src/op/composites/lexicon-upgrade-op.ts +134 -0
- package/src/op/composites/pipeline-audit-op.test.ts +25 -0
- package/src/op/composites/pipeline-audit-op.ts +78 -0
- package/src/op/composites/reconcile-op.test.ts +51 -0
- package/src/op/composites/reconcile-op.ts +107 -0
- package/src/op/composites/watch-op.ts +108 -0
- package/src/op/composites/workflow-audit-op.test.ts +25 -0
- package/src/op/composites/workflow-audit-op.ts +88 -0
- package/src/op/converge-rule.ts +12 -10
- package/src/op/cron.test.ts +128 -0
- package/src/op/cron.ts +149 -0
- package/src/op/discover-root.test.ts +105 -1
- package/src/op/discover.test.ts +6 -2
- package/src/op/discover.ts +84 -16
- package/src/op/duration.ts +21 -0
- package/src/op/effect-step.test.ts +26 -11
- package/src/op/emulator-lifecycle.ts +1 -2
- package/src/op/gate.ts +155 -0
- package/src/op/generate-pipeline.test.ts +65 -3
- package/src/op/generate-pipeline.ts +19 -2
- package/src/op/index.ts +39 -6
- package/src/op/local-executor.test.ts +163 -34
- package/src/op/local-executor.ts +370 -102
- package/src/op/local-output.test.ts +95 -11
- package/src/op/local-output.ts +33 -4
- package/src/op/op-ir.test.ts +281 -0
- package/src/op/op-ir.ts +417 -0
- package/src/op/op-verb-class.ts +19 -5
- package/src/op/op.test.ts +26 -5
- package/src/op/operator.test.ts +175 -6
- package/src/op/operator.ts +63 -16
- package/src/op/receipt-store.ts +1 -1
- package/src/op/resource.ts +20 -2
- package/src/op/runtime.ts +203 -0
- package/src/op/runtimes/local.test.ts +181 -0
- package/src/op/runtimes/local.ts +212 -0
- package/src/op/step-output-ref.ts +15 -13
- package/src/op/types.ts +84 -24
- package/src/ownership.ts +1 -1
- package/src/provenance.test.ts +6 -0
- package/src/provenance.ts +21 -1
- package/src/serializer-walker.test.ts +42 -0
- package/src/serializer-walker.ts +21 -2
- package/dist/cli/handlers/op-progress.d.ts +0 -90
- package/dist/cli/handlers/op-progress.d.ts.map +0 -1
- package/dist/cli/handlers/run-client.d.ts +0 -127
- package/dist/cli/handlers/run-client.d.ts.map +0 -1
- package/dist/cli/handlers/run-report.d.ts +0 -5
- package/dist/cli/handlers/run-report.d.ts.map +0 -1
- package/dist/components/temporal-codegen-loader.d.ts +0 -27
- package/dist/components/temporal-codegen-loader.d.ts.map +0 -1
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts +0 -37
- package/dist/lint/rules/comp/comp004-gate-needs-temporal.d.ts.map +0 -1
- package/src/cli/handlers/op-progress.test.ts +0 -268
- package/src/cli/handlers/op-progress.ts +0 -248
- package/src/cli/handlers/run-client.test.ts +0 -82
- package/src/cli/handlers/run-client.ts +0 -219
- package/src/cli/handlers/run-report.test.ts +0 -62
- package/src/cli/handlers/run-report.ts +0 -122
- package/src/components/temporal-codegen-loader.ts +0 -41
- package/src/lint/rules/comp/comp004-gate-needs-temporal.ts +0 -66
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/** Subset of WorkerProfile fields used by `chant run`. */
|
|
2
|
-
export interface WorkerProfile {
|
|
3
|
-
address: string;
|
|
4
|
-
namespace: string;
|
|
5
|
-
taskQueue: string;
|
|
6
|
-
tls?: boolean | { serverNameOverride?: string };
|
|
7
|
-
apiKey?: string | { env: string };
|
|
8
|
-
autoStart?: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface TemporalClientModule {
|
|
12
|
-
Connection: {
|
|
13
|
-
connect(opts: Record<string, unknown>): Promise<unknown>;
|
|
14
|
-
};
|
|
15
|
-
Client: new (opts: Record<string, unknown>) => TemporalClientHandle;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface TemporalClientHandle {
|
|
19
|
-
workflow: {
|
|
20
|
-
start(workflowFn: unknown, opts: Record<string, unknown>): Promise<WorkflowHandleRaw>;
|
|
21
|
-
getHandle(workflowId: string): WorkflowHandleRaw;
|
|
22
|
-
list(opts?: Record<string, unknown>): AsyncIterable<WorkflowExecutionInfo>;
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface WorkflowHandleRaw {
|
|
27
|
-
workflowId: string;
|
|
28
|
-
firstExecutionRunId?: string;
|
|
29
|
-
result(): Promise<unknown>;
|
|
30
|
-
describe(): Promise<WorkflowExecutionDescription>;
|
|
31
|
-
fetchHistory(): Promise<WorkflowHistoryRaw>;
|
|
32
|
-
signal(signalName: string, ...args: unknown[]): Promise<void>;
|
|
33
|
-
query<T = unknown>(queryName: string, ...args: unknown[]): Promise<T>;
|
|
34
|
-
cancel(): Promise<void>;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface WorkflowExecutionDescription {
|
|
38
|
-
workflowId: string;
|
|
39
|
-
runId: string;
|
|
40
|
-
status: { name: string };
|
|
41
|
-
startTime: Date;
|
|
42
|
-
closeTime?: Date;
|
|
43
|
-
taskQueue: string;
|
|
44
|
-
type: { name: string };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface WorkflowExecutionInfo {
|
|
48
|
-
workflowId: string;
|
|
49
|
-
runId: string;
|
|
50
|
-
type: { name: string };
|
|
51
|
-
status: { name: string };
|
|
52
|
-
startTime: Date;
|
|
53
|
-
closeTime?: Date;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface WorkflowHistoryRaw {
|
|
57
|
-
events?: HistoryEvent[];
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* `eventType` is the short PascalCase form (`"ActivityTaskScheduled"`, not
|
|
62
|
-
* the wire enum's `"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED"`) and `eventId`/
|
|
63
|
-
* `scheduledEventId` are decimal strings — the shape {@link fetchNormalizedHistory}
|
|
64
|
-
* produces, not `WorkflowHandleRaw.fetchHistory()`'s own raw return value.
|
|
65
|
-
*/
|
|
66
|
-
export interface HistoryEvent {
|
|
67
|
-
eventId?: string;
|
|
68
|
-
eventType?: string;
|
|
69
|
-
eventTime?: Date;
|
|
70
|
-
activityTaskCompletedEventAttributes?: { scheduledEventId?: string };
|
|
71
|
-
activityTaskScheduledEventAttributes?: { activityId?: string; activityType?: { name?: string } };
|
|
72
|
-
activityTaskFailedEventAttributes?: { scheduledEventId?: string; failure?: { message?: string } };
|
|
73
|
-
workflowExecutionCompletedEventAttributes?: unknown;
|
|
74
|
-
workflowExecutionFailedEventAttributes?: { failure?: { message?: string } };
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* `WorkflowHandleRaw.fetchHistory()` returns the Temporal wire proto
|
|
79
|
-
* untouched: `eventType` is the numeric enum, `eventId`/`scheduledEventId`
|
|
80
|
-
* are `Long` instances, `eventTime` is a `{seconds, nanos}` protobuf
|
|
81
|
-
* Timestamp — none of them comparable or constructible the way the rest of
|
|
82
|
-
* this file (and run-report.ts, op-progress.ts) needs. The proto message's
|
|
83
|
-
* own `toJSON()` is what turns enums into their string name and `Long`s into
|
|
84
|
-
* decimal strings, so a JSON round-trip is the normalization step; only
|
|
85
|
-
* `eventTime` then needs a further Timestamp-to-Date conversion.
|
|
86
|
-
*/
|
|
87
|
-
export async function fetchNormalizedHistory(handle: WorkflowHandleRaw): Promise<WorkflowHistoryRaw> {
|
|
88
|
-
const raw = (await handle.fetchHistory()) as unknown as { events?: unknown[] };
|
|
89
|
-
const events = JSON.parse(JSON.stringify(raw.events ?? [])) as Array<Record<string, unknown>>;
|
|
90
|
-
return { events: events.map(normalizeHistoryEvent) };
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** `"EVENT_TYPE_ACTIVITY_TASK_SCHEDULED"` → `"ActivityTaskScheduled"`. A value that isn't ALL_CAPS_WITH_UNDERSCORES (e.g. already-short test fixture data) passes through unchanged, so normalizing twice is a no-op. */
|
|
94
|
-
function shortEventType(raw: unknown): string | undefined {
|
|
95
|
-
if (typeof raw !== "string" || raw.length === 0) return undefined;
|
|
96
|
-
if (!/^[A-Z][A-Z0-9_]*$/.test(raw)) return raw;
|
|
97
|
-
const stripped = raw.startsWith("EVENT_TYPE_") ? raw.slice("EVENT_TYPE_".length) : raw;
|
|
98
|
-
return stripped
|
|
99
|
-
.split("_")
|
|
100
|
-
.filter(Boolean)
|
|
101
|
-
.map((w) => w[0] + w.slice(1).toLowerCase())
|
|
102
|
-
.join("");
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** Accepts a protobuf `{seconds, nanos}` Timestamp (its `seconds` a decimal string post-JSON-round-trip), an ISO string (already-normalized test fixture data, or the same value normalized twice), or a `Date`. */
|
|
106
|
-
function protoTimestampToDate(ts: unknown): Date | undefined {
|
|
107
|
-
if (!ts) return undefined;
|
|
108
|
-
if (ts instanceof Date) return ts;
|
|
109
|
-
if (typeof ts === "string") {
|
|
110
|
-
const d = new Date(ts);
|
|
111
|
-
return Number.isNaN(d.getTime()) ? undefined : d;
|
|
112
|
-
}
|
|
113
|
-
if (typeof ts !== "object") return undefined;
|
|
114
|
-
const seconds = Number((ts as { seconds?: unknown }).seconds);
|
|
115
|
-
const nanos = Number((ts as { nanos?: unknown }).nanos ?? 0);
|
|
116
|
-
if (!Number.isFinite(seconds)) return undefined;
|
|
117
|
-
return new Date(seconds * 1000 + Math.floor(nanos / 1e6));
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/** `undefined`/`null` stays `undefined`; anything else (a decimal string post-JSON-round-trip, or a bare number/Long from an un-round-tripped test fixture) becomes a string — `scheduledEventId` is joined against `eventId` as a Map key, and a number `7` and a string `"7"` are different keys. */
|
|
121
|
-
function idString(v: unknown): string | undefined {
|
|
122
|
-
return v === undefined || v === null ? undefined : String(v);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function normalizeHistoryEvent(raw: Record<string, unknown>): HistoryEvent {
|
|
126
|
-
const scheduled = raw.activityTaskScheduledEventAttributes as
|
|
127
|
-
| { activityId?: unknown; activityType?: { name?: string } }
|
|
128
|
-
| undefined;
|
|
129
|
-
const completed = raw.activityTaskCompletedEventAttributes as { scheduledEventId?: unknown } | undefined;
|
|
130
|
-
const failed = raw.activityTaskFailedEventAttributes as
|
|
131
|
-
| { scheduledEventId?: unknown; failure?: { message?: string } }
|
|
132
|
-
| undefined;
|
|
133
|
-
|
|
134
|
-
return {
|
|
135
|
-
eventId: idString(raw.eventId),
|
|
136
|
-
eventType: shortEventType(raw.eventType),
|
|
137
|
-
eventTime: protoTimestampToDate(raw.eventTime),
|
|
138
|
-
...(scheduled
|
|
139
|
-
? { activityTaskScheduledEventAttributes: { activityId: idString(scheduled.activityId), activityType: scheduled.activityType } }
|
|
140
|
-
: {}),
|
|
141
|
-
...(completed
|
|
142
|
-
? { activityTaskCompletedEventAttributes: { scheduledEventId: idString(completed.scheduledEventId) } }
|
|
143
|
-
: {}),
|
|
144
|
-
...(failed
|
|
145
|
-
? { activityTaskFailedEventAttributes: { scheduledEventId: idString(failed.scheduledEventId), failure: failed.failure } }
|
|
146
|
-
: {}),
|
|
147
|
-
workflowExecutionCompletedEventAttributes: raw.workflowExecutionCompletedEventAttributes,
|
|
148
|
-
workflowExecutionFailedEventAttributes: raw.workflowExecutionFailedEventAttributes as HistoryEvent["workflowExecutionFailedEventAttributes"],
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Dynamically import @temporalio/client from the user's project node_modules.
|
|
154
|
-
* Fails with a helpful message if not installed.
|
|
155
|
-
*/
|
|
156
|
-
export async function loadTemporalClient(): Promise<TemporalClientModule> {
|
|
157
|
-
try {
|
|
158
|
-
// Use variable to prevent tsc from statically resolving the optional dep
|
|
159
|
-
const mod = "@temporalio/client";
|
|
160
|
-
return await import(mod) as unknown as TemporalClientModule;
|
|
161
|
-
} catch {
|
|
162
|
-
throw new Error(
|
|
163
|
-
'@temporalio/client is not installed. Run: npm install @temporalio/client',
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Build a Temporal Connection.connect() options object from a worker profile.
|
|
170
|
-
*/
|
|
171
|
-
export function connectionOptions(profile: WorkerProfile): Record<string, unknown> {
|
|
172
|
-
const apiKey =
|
|
173
|
-
typeof profile.apiKey === "object" && profile.apiKey !== null
|
|
174
|
-
? process.env[(profile.apiKey as { env: string }).env]
|
|
175
|
-
: (profile.apiKey as string | undefined);
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
address: profile.address,
|
|
179
|
-
...(profile.tls && {
|
|
180
|
-
tls: typeof profile.tls === "object" ? profile.tls : {},
|
|
181
|
-
metadata: apiKey ? { Authorization: `Bearer ${apiKey}` } : {},
|
|
182
|
-
}),
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Deterministic workflow ID for an Op — allows status/signal/cancel/log
|
|
188
|
-
* without storing run IDs locally.
|
|
189
|
-
*/
|
|
190
|
-
export function resolveWorkflowId(opName: string): string {
|
|
191
|
-
return `chant-op-${opName}`;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Resolve a named profile from the chant config.
|
|
196
|
-
* Falls back to defaultProfile then "local".
|
|
197
|
-
*/
|
|
198
|
-
export function resolveProfile(
|
|
199
|
-
config: Record<string, unknown>,
|
|
200
|
-
profileName?: string,
|
|
201
|
-
): WorkerProfile {
|
|
202
|
-
// #1344 — the temporal lexicon declares this namespace and core validates it
|
|
203
|
-
// at load, so this reads a checked value rather than asserting one.
|
|
204
|
-
const temporal = (config as { temporal?: Record<string, unknown> }).temporal;
|
|
205
|
-
if (!temporal?.profiles) {
|
|
206
|
-
throw new Error(
|
|
207
|
-
'No temporal.profiles found in chant.config.ts. Add a profile to use `chant run`.',
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
const profiles = temporal.profiles as Record<string, WorkerProfile>;
|
|
211
|
-
const name = profileName ?? (temporal.defaultProfile as string | undefined) ?? "local";
|
|
212
|
-
const profile = profiles[name];
|
|
213
|
-
if (!profile) {
|
|
214
|
-
throw new Error(
|
|
215
|
-
`Temporal profile "${name}" not found. Available: ${Object.keys(profiles).join(", ")}`,
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
return profile;
|
|
219
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from "vitest";
|
|
2
|
-
import { generateReport } from "./run-report";
|
|
3
|
-
import type { OpConfig } from "../../op/types";
|
|
4
|
-
import type { WorkflowExecutionDescription, WorkflowHistoryRaw, HistoryEvent } from "./run-client";
|
|
5
|
-
|
|
6
|
-
function scheduled(eventId: string, fn: string): HistoryEvent {
|
|
7
|
-
return {
|
|
8
|
-
eventId,
|
|
9
|
-
eventType: "ActivityTaskScheduled",
|
|
10
|
-
eventTime: new Date(0),
|
|
11
|
-
activityTaskScheduledEventAttributes: { activityId: eventId, activityType: { name: fn } },
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
function completed(scheduledEventId: string): HistoryEvent {
|
|
15
|
-
return {
|
|
16
|
-
eventType: "ActivityTaskCompleted",
|
|
17
|
-
eventTime: new Date(1000),
|
|
18
|
-
activityTaskCompletedEventAttributes: { scheduledEventId },
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const desc: WorkflowExecutionDescription = {
|
|
23
|
-
workflowId: "wf", runId: "r1", status: { name: "COMPLETED" },
|
|
24
|
-
startTime: new Date(0), closeTime: new Date(2000), taskQueue: "q", type: { name: "opWorkflow" },
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
describe("generateReport", () => {
|
|
28
|
-
test("two steps calling the same activity each get their own row (no last-wins collision, chant #1676)", () => {
|
|
29
|
-
const config: OpConfig = {
|
|
30
|
-
name: "op", overview: "o",
|
|
31
|
-
phases: [{ name: "P1", steps: [{ kind: "activity", fn: "dup" }, { kind: "activity", fn: "dup" }] }],
|
|
32
|
-
};
|
|
33
|
-
const history: WorkflowHistoryRaw = {
|
|
34
|
-
events: [scheduled("1", "dup"), completed("1"), scheduled("2", "dup"), completed("2")],
|
|
35
|
-
};
|
|
36
|
-
const md = generateReport("op", config, desc, history);
|
|
37
|
-
// Both rows present — the prior fn-name join would have produced one
|
|
38
|
-
// row for "dup" (the second scheduled event overwriting the first).
|
|
39
|
-
const dupRows = md.split("\n").filter((line) => line.includes("| P1 | dup |"));
|
|
40
|
-
expect(dupRows).toHaveLength(2);
|
|
41
|
-
expect(dupRows.every((line) => line.includes("✓ completed"))).toBe(true);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test("a declared step with no matching history is reported skipped, not a phantom 'running' row", () => {
|
|
45
|
-
const config: OpConfig = {
|
|
46
|
-
name: "op", overview: "o",
|
|
47
|
-
phases: [
|
|
48
|
-
{ name: "P1", steps: [{ kind: "activity", fn: "a" }] },
|
|
49
|
-
{ name: "P2", steps: [{ kind: "activity", fn: "b" }] },
|
|
50
|
-
],
|
|
51
|
-
onFailure: [{ name: "C1", steps: [{ kind: "activity", fn: "comp" }] }],
|
|
52
|
-
};
|
|
53
|
-
const history: WorkflowHistoryRaw = { events: [scheduled("1", "a"), completed("1"), scheduled("2", "b"), completed("2")] };
|
|
54
|
-
const md = generateReport("op", config, desc, history);
|
|
55
|
-
expect(md).toContain("| P1 | a | 1.0s | ✓ completed |");
|
|
56
|
-
expect(md).toContain("| P2 | b | 1.0s | ✓ completed |");
|
|
57
|
-
// The timeline table is scoped to config.phases only (unchanged from
|
|
58
|
-
// before this fix) — onFailure phases never appear in it regardless of
|
|
59
|
-
// whether they ran.
|
|
60
|
-
expect(md).not.toContain("C1");
|
|
61
|
-
});
|
|
62
|
-
});
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { join, dirname } from "node:path";
|
|
3
|
-
import type { OpConfig } from "../../op/types";
|
|
4
|
-
import type { WorkflowExecutionDescription, WorkflowHistoryRaw, HistoryEvent } from "./run-client";
|
|
5
|
-
import { extractStepRecords } from "./op-progress";
|
|
6
|
-
|
|
7
|
-
interface ActivityRecord {
|
|
8
|
-
name: string;
|
|
9
|
-
durationMs?: number;
|
|
10
|
-
status: "completed" | "failed" | "skipped";
|
|
11
|
-
error?: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
interface PhaseRecord {
|
|
15
|
-
name: string;
|
|
16
|
-
activities: ActivityRecord[];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function formatDuration(ms: number): string {
|
|
20
|
-
if (ms < 1000) return `${ms}ms`;
|
|
21
|
-
if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
|
|
22
|
-
const mins = Math.floor(ms / 60_000);
|
|
23
|
-
const secs = Math.round((ms % 60_000) / 1000);
|
|
24
|
-
return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Group `extractStepRecords`' flat, declared-order step list back into
|
|
29
|
-
* per-phase rows for the markdown table. `final` (a closed workflow has
|
|
30
|
-
* every settled step it's ever going to have) decides whether an unmatched
|
|
31
|
-
* declared step is reported "skipped" or simply omitted for now — see
|
|
32
|
-
* `extractStepRecords`'s own doc.
|
|
33
|
-
*/
|
|
34
|
-
function extractPhaseRecords(config: OpConfig, history: WorkflowHistoryRaw, final: boolean): PhaseRecord[] {
|
|
35
|
-
const byPhase = new Map<string, ActivityRecord[]>();
|
|
36
|
-
for (const phase of config.phases) byPhase.set(phase.name, []);
|
|
37
|
-
|
|
38
|
-
for (const step of extractStepRecords(config, history, { final })) {
|
|
39
|
-
const status = step.status === "ok" ? "completed" : step.status === "fail" ? "failed" : "skipped";
|
|
40
|
-
const list = byPhase.get(step.phase) ?? (byPhase.set(step.phase, []), byPhase.get(step.phase)!);
|
|
41
|
-
list.push({ name: step.fn, durationMs: step.durationMs, status, ...(step.error ? { error: step.error } : {}) });
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return config.phases.map((phase) => ({ name: phase.name, activities: byPhase.get(phase.name) ?? [] }));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function generateReport(
|
|
48
|
-
opName: string,
|
|
49
|
-
config: OpConfig,
|
|
50
|
-
description: WorkflowExecutionDescription,
|
|
51
|
-
history: WorkflowHistoryRaw,
|
|
52
|
-
): string {
|
|
53
|
-
const lines: string[] = [];
|
|
54
|
-
|
|
55
|
-
const status = description.status.name;
|
|
56
|
-
const startTime = description.startTime;
|
|
57
|
-
const closeTime = description.closeTime;
|
|
58
|
-
const durationMs = closeTime ? closeTime.getTime() - startTime.getTime() : undefined;
|
|
59
|
-
|
|
60
|
-
lines.push(`# Deployment Report: ${opName}`);
|
|
61
|
-
lines.push("");
|
|
62
|
-
lines.push("## Overview");
|
|
63
|
-
lines.push("");
|
|
64
|
-
lines.push(`| Field | Value |`);
|
|
65
|
-
lines.push(`|---|---|`);
|
|
66
|
-
lines.push(`| Op | ${opName} |`);
|
|
67
|
-
lines.push(`| Overview | ${config.overview} |`);
|
|
68
|
-
lines.push(`| Status | **${status}** |`);
|
|
69
|
-
lines.push(`| Workflow ID | ${description.workflowId} |`);
|
|
70
|
-
lines.push(`| Run ID | ${description.runId} |`);
|
|
71
|
-
lines.push(`| Start | ${startTime.toISOString()} |`);
|
|
72
|
-
if (closeTime) lines.push(`| End | ${closeTime.toISOString()} |`);
|
|
73
|
-
if (durationMs !== undefined) lines.push(`| Duration | ${formatDuration(durationMs)} |`);
|
|
74
|
-
lines.push("");
|
|
75
|
-
|
|
76
|
-
lines.push("## Timeline");
|
|
77
|
-
lines.push("");
|
|
78
|
-
lines.push("| Phase | Activity | Duration | Status |");
|
|
79
|
-
lines.push("|---|---|---|---|");
|
|
80
|
-
|
|
81
|
-
const phases = extractPhaseRecords(config, history, Boolean(closeTime));
|
|
82
|
-
for (const phase of phases) {
|
|
83
|
-
if (phase.activities.length === 0) {
|
|
84
|
-
lines.push(`| ${phase.name} | — | — | — |`);
|
|
85
|
-
}
|
|
86
|
-
for (const act of phase.activities) {
|
|
87
|
-
const dur = act.durationMs !== undefined ? formatDuration(act.durationMs) : "—";
|
|
88
|
-
const statusEmoji = act.status === "completed" ? "✓" : act.status === "failed" ? "✗" : "○";
|
|
89
|
-
lines.push(`| ${phase.name} | ${act.name} | ${dur} | ${statusEmoji} ${act.status} |`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
lines.push("");
|
|
93
|
-
|
|
94
|
-
// Errors section
|
|
95
|
-
const failedEvents = (history.events ?? []).filter(
|
|
96
|
-
(e): e is HistoryEvent & Required<Pick<HistoryEvent, "activityTaskFailedEventAttributes">> =>
|
|
97
|
-
e.eventType === "ActivityTaskFailed" && !!e.activityTaskFailedEventAttributes,
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
if (failedEvents.length > 0) {
|
|
101
|
-
lines.push("## Errors");
|
|
102
|
-
lines.push("");
|
|
103
|
-
for (const event of failedEvents) {
|
|
104
|
-
const msg = event.activityTaskFailedEventAttributes?.failure?.message ?? "unknown";
|
|
105
|
-
lines.push(`- ${msg}`);
|
|
106
|
-
}
|
|
107
|
-
lines.push("");
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
lines.push(`---`);
|
|
111
|
-
lines.push(`*Generated by chant at ${new Date().toISOString()}*`);
|
|
112
|
-
lines.push("");
|
|
113
|
-
|
|
114
|
-
return lines.join("\n");
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export function writeReport(opName: string, markdown: string): string {
|
|
118
|
-
const outPath = join("dist", `${opName}-report.md`);
|
|
119
|
-
mkdirSync(dirname(outPath), { recursive: true });
|
|
120
|
-
writeFileSync(outPath, markdown, "utf-8");
|
|
121
|
-
return outPath;
|
|
122
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dynamic loader for the durable component → Temporal codegen (#589, epic
|
|
3
|
-
* #551 §5/§8). The actual `serializeComponent` generator lives in
|
|
4
|
-
* `@intentius/chant-lexicon-temporal` (`src/component-op/serializer.ts`),
|
|
5
|
-
* mirroring `Temporal::Op` codegen — core never statically depends on the
|
|
6
|
-
* Temporal lexicon, the same boundary `../op/activity-registry.ts`'s
|
|
7
|
-
* `loadActivities`/`loadProfiles` already keep for Op activities.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { DriverComponent } from "./driver";
|
|
11
|
-
|
|
12
|
-
/** Target environment (and env-config) baked into the generated workflow at compile time — see `serializeComponent`'s docstring in the Temporal lexicon for why this can't be resolved at workflow-run time instead. */
|
|
13
|
-
export interface ComponentTemporalCodegenOptions {
|
|
14
|
-
env?: string;
|
|
15
|
-
vars?: Record<string, unknown>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface ComponentTemporalCodegen {
|
|
19
|
-
/** Serialize one component into `{ "components/<name>/workflow.ts": "...", ... }`. */
|
|
20
|
-
serializeComponent(component: DriverComponent, options?: ComponentTemporalCodegenOptions): Record<string, string>;
|
|
21
|
-
/** Deterministic workflow function name for a component (mirrors the generated `export async function <fn>()`). */
|
|
22
|
-
componentWorkflowFnName(componentName: string): string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Dynamically import the Temporal lexicon's component codegen. Throws a
|
|
27
|
-
* friendly error if the lexicon is not installed — the durable component
|
|
28
|
-
* path needs the generator even though discovery/local execution never do.
|
|
29
|
-
*/
|
|
30
|
-
export async function loadComponentTemporalCodegen(): Promise<ComponentTemporalCodegen> {
|
|
31
|
-
try {
|
|
32
|
-
// Variable specifier so tsc does not statically resolve the optional dep.
|
|
33
|
-
const spec = "@intentius/chant-lexicon-temporal/component-op/serializer";
|
|
34
|
-
return (await import(spec)) as unknown as ComponentTemporalCodegen;
|
|
35
|
-
} catch (err) {
|
|
36
|
-
throw new Error(
|
|
37
|
-
"no durable component codegen available — install `@intentius/chant-lexicon-temporal` " +
|
|
38
|
-
`to run components with --temporal (${err instanceof Error ? err.message : String(err)})`,
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* COMP004: gate-needs-temporal
|
|
3
|
-
*
|
|
4
|
-
* Flags a `gate` step anywhere in a component's composition — a durable,
|
|
5
|
-
* human-approval wait that cannot run on the local in-process executor (see
|
|
6
|
-
* ../../../components/driver.ts's `DriverGateUnsupportedError` and
|
|
7
|
-
* docs/components/orchestration.mdx's "Temporal is optional" aside: "gates ...
|
|
8
|
-
* require the durable (Temporal) execution backend").
|
|
9
|
-
*
|
|
10
|
-
* The component contract has no per-component backend/executor field (the
|
|
11
|
-
* backend is chosen per *run*, via `chant run --temporal`, per epic #551 §8 —
|
|
12
|
-
* intentionally not part of the declaration, so the same component graduates
|
|
13
|
-
* to Temporal without changing its definition). That means lint cannot tell,
|
|
14
|
-
* from the declaration alone, whether a given `gate` will actually run under
|
|
15
|
-
* Temporal when this component is deployed — every `gate` is a standing
|
|
16
|
-
* "this component needs the durable backend" fact worth surfacing, not a
|
|
17
|
-
* mistake to silently allow. Acknowledge it explicitly with a **file-level**
|
|
18
|
-
* disable directive once the durable backend is genuinely intended (see
|
|
19
|
-
* lint-rules/disable-directives.mdx) — a COMP* diagnostic carries no real
|
|
20
|
-
* line/column (it is reported for the whole component; see
|
|
21
|
-
* ../../component-checks.ts), so only the file-level `chant-disable` form is
|
|
22
|
-
* honored for these rules — `-line`/`-next-line` do not suppress a COMP*
|
|
23
|
-
* diagnostic (see ../../../cli/commands/lint.ts's
|
|
24
|
-
* `runComponentCheckDiagnostics`):
|
|
25
|
-
*
|
|
26
|
-
* ```ts
|
|
27
|
-
* // chant-disable COMP004 -- graduates to --temporal for the human approval wait
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
|
-
* Triggers on: any `gate` step in `deploy`/`rollback` with no matching
|
|
31
|
-
* file-level disable directive.
|
|
32
|
-
* OK: a component with no `gate` steps at all, or a `gate` whose file-level
|
|
33
|
-
* disable directive documents the Temporal graduation.
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
import type { ComponentCheck, ComponentCheckContext, ComponentCheckDiagnostic } from "../../component-checks";
|
|
37
|
-
import { walkComponent } from "./support";
|
|
38
|
-
|
|
39
|
-
export const comp004GateNeedsTemporalRule: ComponentCheck = {
|
|
40
|
-
id: "COMP004",
|
|
41
|
-
severity: "error",
|
|
42
|
-
category: "correctness",
|
|
43
|
-
description: "A gate step requires the durable (Temporal) execution backend — it cannot run on the local executor",
|
|
44
|
-
check(ctx: ComponentCheckContext): ComponentCheckDiagnostic[] {
|
|
45
|
-
const diagnostics: ComponentCheckDiagnostic[] = [];
|
|
46
|
-
|
|
47
|
-
for (const [name, { component, filePath }] of ctx.components) {
|
|
48
|
-
const { gates } = walkComponent(component);
|
|
49
|
-
for (const { gate, phaseName } of gates) {
|
|
50
|
-
diagnostics.push({
|
|
51
|
-
checkId: "COMP004",
|
|
52
|
-
severity: "error",
|
|
53
|
-
component: name,
|
|
54
|
-
file: filePath,
|
|
55
|
-
message:
|
|
56
|
-
`Component "${name}": gate "${gate.signalName}" (phase "${phaseName}") requires the durable (Temporal) ` +
|
|
57
|
-
`execution backend — it cannot run on the local in-process executor. If this component is meant to run ` +
|
|
58
|
-
`with "chant run --temporal", suppress with a file-level "// chant-disable COMP004 -- <reason>" comment ` +
|
|
59
|
-
`anywhere in this file to document that intent explicitly.`,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return diagnostics;
|
|
65
|
-
},
|
|
66
|
-
};
|