@intentius/chant 0.124.13 → 0.124.15
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/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +669 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.d.ts +24 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +361 -0
- package/dist/child-project.js +21 -0
- package/dist/ci-jobs.d.ts +227 -0
- package/dist/ci-jobs.d.ts.map +1 -0
- package/dist/ci-jobs.js +448 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +135 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.d.ts +10 -2
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +313 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.d.ts +2 -1
- package/dist/discovery/collect.d.ts.map +1 -1
- package/dist/discovery/collect.js +223 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4073 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/host-composite.d.ts +35 -0
- package/dist/discovery/host-composite.d.ts.map +1 -0
- package/dist/discovery/host-composite.js +93 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +20 -9
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +313 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.d.ts +69 -2
- package/dist/lifecycle/gate-audit.d.ts.map +1 -1
- package/dist/lifecycle/gate-audit.js +415 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +24 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +201 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.d.ts +1 -1
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.d.ts +8 -3
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +67 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.d.ts +28 -16
- package/dist/op/activities/reconcile.d.ts.map +1 -1
- package/dist/op/activities/reconcile.js +1011 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.d.ts +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.js +119 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +462 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.d.ts +3 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +202 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/class-data.d.ts +84 -0
- package/dist/workspace/class-data.d.ts.map +1 -0
- package/dist/workspace/class-data.js +238 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.d.ts +3 -7
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +553 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +4 -11
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +162 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/build.ts +8 -0
- package/src/change-set.test.ts +48 -0
- package/src/change-set.ts +52 -2
- package/src/ci-jobs.test.ts +49 -0
- package/src/ci-jobs.ts +515 -0
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/pr-pipeline.ts +3 -2
- package/src/components/sandbox/driver.ts +3 -1
- package/src/composite.ts +15 -3
- package/src/config-import.ts +3 -0
- package/src/discovery/collect.ts +15 -1
- package/src/discovery/fold-build-parity.test.ts +71 -0
- package/src/discovery/fold-import.ts +25 -127
- package/src/discovery/fold-project-provenance.test.ts +21 -4
- package/src/discovery/host-composite.ts +101 -0
- package/src/discovery/import.ts +2 -0
- package/src/discovery/index.ts +11 -1
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +5 -4
- package/src/gate-decision-identity.test.ts +59 -6
- package/src/gate-decision.ts +81 -21
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-audit.test.ts +55 -1
- package/src/lifecycle/gate-audit.ts +116 -3
- package/src/lifecycle/gate-ledger.test.ts +20 -1
- package/src/lifecycle/gate-ledger.ts +33 -1
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +11 -3
- package/src/op/activities/lexicon-upgrade.test.ts +2 -0
- package/src/op/activities/reconcile.test.ts +62 -2
- package/src/op/activities/reconcile.ts +46 -22
- package/src/op/builders.ts +1 -1
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-run.ts +4 -3
- package/src/op/op-waves.test.ts +2 -0
- package/src/op/work-lease-run.test.ts +12 -4
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/__fixtures__/contract-repo.ts +17 -1
- package/src/workspace/__fixtures__/sessions.ts +3 -3
- package/src/workspace/change-set.schema.json +5 -3
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/ci-green-workflow.test.ts +4 -4
- package/src/workspace/ci-green-workflow.ts +5 -2
- package/src/workspace/class-data.test.ts +64 -0
- package/src/workspace/class-data.ts +236 -0
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +7 -36
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +12 -95
- package/src/workspace/records-formats.test.ts +7 -2
- package/src/workspace/records-sessions-write.test.ts +3 -3
- package/src/workspace/status-contract.e2e.test.ts +37 -0
- package/src/workspace/status-contract.test.ts +23 -21
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { computePlanDigest } from "../../lifecycle/plan-digest.js";
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
/**
|
|
6
|
+
* Take a chant lifecycle snapshot for the given environment.
|
|
7
|
+
* Uses fastIdempotent profile — 5m timeout, 3 retries.
|
|
8
|
+
*/
|
|
9
|
+
export async function lifecycleSnapshot(args, signal) {
|
|
10
|
+
const { stdout, stderr } = await execAsync(`chant lifecycle snapshot ${args.env}`, { signal });
|
|
11
|
+
if (stdout)
|
|
12
|
+
console.log(stdout);
|
|
13
|
+
if (stderr)
|
|
14
|
+
console.error(stderr);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The change set half of a `chant lifecycle diff` render, canonicalised for
|
|
18
|
+
* digesting (#2300).
|
|
19
|
+
*
|
|
20
|
+
* The diff render is line-oriented: section headers and the resource rows
|
|
21
|
+
* under them. Two runs over an unchanged environment print the same lines, so
|
|
22
|
+
* the lines are the change set. Normalising is deliberately minimal — CRLF to
|
|
23
|
+
* LF, trailing whitespace off each line, blank lines dropped — because
|
|
24
|
+
* anything more aggressive would start discarding rows, and a digest that
|
|
25
|
+
* discards rows is a digest that approves changes nobody saw.
|
|
26
|
+
*
|
|
27
|
+
* Unlike a terraform plan there is no timestamp to strip: the diff render
|
|
28
|
+
* carries none. If one is ever added it has to be dropped here, or every
|
|
29
|
+
* approval would be stale the moment it was written.
|
|
30
|
+
*/
|
|
31
|
+
export function normalizeDiffChangeSet(output) {
|
|
32
|
+
return output
|
|
33
|
+
.replace(/\r\n/g, "\n")
|
|
34
|
+
.split("\n")
|
|
35
|
+
.map((line) => line.replace(/\s+$/, ""))
|
|
36
|
+
.filter((line) => line !== "");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Section headers emitted by `chant lifecycle diff --live` that indicate a
|
|
40
|
+
* non-empty drift category. See packages/core/src/cli/handlers/state.ts.
|
|
41
|
+
*/
|
|
42
|
+
const DRIFT_HEADERS = [
|
|
43
|
+
"MISSING",
|
|
44
|
+
"ORPHAN",
|
|
45
|
+
"DISAPPEARED",
|
|
46
|
+
"DRIFTED",
|
|
47
|
+
// An owned resource whose live properties differ from its declaration (the
|
|
48
|
+
// deep read): a sql table's TTL changed out of band, say (#3642).
|
|
49
|
+
"PROPERTY DRIFT",
|
|
50
|
+
// A change an apply would make that no declared property shows: a
|
|
51
|
+
// privilege granted by hand on a Postgres table (#3706).
|
|
52
|
+
"PENDING",
|
|
53
|
+
"ARTIFACTS ADDED",
|
|
54
|
+
"ARTIFACTS REMOVED",
|
|
55
|
+
"ARTIFACTS CHANGED",
|
|
56
|
+
];
|
|
57
|
+
/** True when a `chant lifecycle diff` render carries any of {@link DRIFT_HEADERS}' sections. */
|
|
58
|
+
export function detectDrift(output) {
|
|
59
|
+
return DRIFT_HEADERS.some((h) => output.includes(`${h} (`) || output.includes(`\n${h}`));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The identity of one `chant lifecycle diff` result (#2300). The environment
|
|
63
|
+
* and the `--live` flag are hashed alongside the change set because they say
|
|
64
|
+
* what the change set is *of*: the same rows against `staging` are not an
|
|
65
|
+
* approval to apply against `prod`.
|
|
66
|
+
*/
|
|
67
|
+
export function lifecycleDiffDigest(args, output) {
|
|
68
|
+
return computePlanDigest("lifecycle-diff", {
|
|
69
|
+
env: args.env,
|
|
70
|
+
live: args.live === true,
|
|
71
|
+
changeSet: normalizeDiffChangeSet(output),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Run `chant lifecycle diff <env>` and return the output + structured drift
|
|
76
|
+
* flag. Read-only; intended for use inside watch/observation Ops.
|
|
77
|
+
* Uses fastIdempotent profile.
|
|
78
|
+
*
|
|
79
|
+
* The `drifted` field is computed by scanning the output for any of the
|
|
80
|
+
* MISSING / ORPHAN / DRIFTED / DISAPPEARED / PROPERTY DRIFT section headers documented in
|
|
81
|
+
* cli/state.mdx. Pair with `outcomeAttribute: { name: "Drift", from: "drifted" }`
|
|
82
|
+
* on a WatchOp activity step to surface drift as the run's `Drift` outcome.
|
|
83
|
+
*
|
|
84
|
+
* A diff that exits non-zero (#3712) fails the step and yields no digest.
|
|
85
|
+
* Its output is an error, not a change set: every failed run printed the
|
|
86
|
+
* same lines, so a digest over them was one an approval matched whatever
|
|
87
|
+
* the declarations had become since.
|
|
88
|
+
*/
|
|
89
|
+
export async function lifecycleDiff(args, signal) {
|
|
90
|
+
const liveFlag = args.live ? " --live" : "";
|
|
91
|
+
const command = `chant lifecycle diff ${args.env}${liveFlag}`;
|
|
92
|
+
let stdout;
|
|
93
|
+
let stderr;
|
|
94
|
+
try {
|
|
95
|
+
({ stdout, stderr } = await execAsync(command, { signal }));
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const e = err;
|
|
99
|
+
const output = `${e.stdout ?? ""}${e.stderr ?? ""}`.trim();
|
|
100
|
+
if (output)
|
|
101
|
+
console.error(output);
|
|
102
|
+
const message = `${command} failed (exit ${String(e.code ?? 1)}); no plan to digest${output ? `:\n${output}` : ""}`;
|
|
103
|
+
throw new Error(message);
|
|
104
|
+
}
|
|
105
|
+
const output = `${stdout}${stderr}`.trim();
|
|
106
|
+
if (output)
|
|
107
|
+
console.log(output);
|
|
108
|
+
return { output, exitCode: 0, drifted: detectDrift(output), planDigest: lifecycleDiffDigest(args, output) };
|
|
109
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pipelineSupplyChainAudit — the live counterpart to the gitlab post-synth
|
|
3
|
+
* include/component/image checks (#297).
|
|
4
|
+
*
|
|
5
|
+
* Some include/component checks can only be answered against a moving external
|
|
6
|
+
* truth: whether a pinned component/include ref still resolves upstream, whether
|
|
7
|
+
* the upstream project was archived or moved, or whether a new advisory now
|
|
8
|
+
* covers a component/image already in use. These change independent of the
|
|
9
|
+
* source, so they cannot live in the deterministic build — this activity owns
|
|
10
|
+
* *only* the checks that require live resolution.
|
|
11
|
+
*
|
|
12
|
+
* Dependency-free and primitives-only: it reads the emitted `.gitlab-ci.yml`
|
|
13
|
+
* (passed as a string) and resolves references through an injectable
|
|
14
|
+
* `GitlabRefResolver`, so `chant run` can schedule it and tests can run
|
|
15
|
+
* it against recorded responses with no live network.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Collect `include:project` (+ ref), `component:` (with @version), and `image:`
|
|
19
|
+
* references from a `.gitlab-ci.yml`.
|
|
20
|
+
*/
|
|
21
|
+
export function collectPipelineRefs(yaml) {
|
|
22
|
+
const out = [];
|
|
23
|
+
// include:\n - project: group/proj\n ref: main
|
|
24
|
+
const projectRe = /-\s+project:\s*['"]?([^\s'"]+)['"]?[\s\S]*?ref:\s*['"]?([^\s'"]+)['"]?/g;
|
|
25
|
+
let m;
|
|
26
|
+
while ((m = projectRe.exec(yaml)) !== null) {
|
|
27
|
+
out.push({ refKind: "include", identifier: m[1], ref: m[2] });
|
|
28
|
+
}
|
|
29
|
+
// - component: host/group/comp@1.0.0
|
|
30
|
+
const componentRe = /-\s+component:\s*['"]?([^\s'"@]+)@([^\s'"]+)['"]?/g;
|
|
31
|
+
while ((m = componentRe.exec(yaml)) !== null) {
|
|
32
|
+
out.push({ refKind: "component", identifier: m[1], ref: m[2] });
|
|
33
|
+
}
|
|
34
|
+
// Images: inline `image: name` or block `image:\n name: ...` (and services).
|
|
35
|
+
const lines = yaml.split("\n");
|
|
36
|
+
const imgSeen = new Set();
|
|
37
|
+
const addImage = (raw) => {
|
|
38
|
+
const image = raw.trim().replace(/^['"]|['"]$/g, "");
|
|
39
|
+
if (!image || image.includes("$") || imgSeen.has(image))
|
|
40
|
+
return;
|
|
41
|
+
imgSeen.add(image);
|
|
42
|
+
const at = image.lastIndexOf("@");
|
|
43
|
+
const colon = image.lastIndexOf(":");
|
|
44
|
+
const ref = at !== -1 ? image.slice(at + 1) : colon > image.lastIndexOf("/") ? image.slice(colon + 1) : "latest";
|
|
45
|
+
out.push({ refKind: "image", identifier: image, ref });
|
|
46
|
+
};
|
|
47
|
+
for (let i = 0; i < lines.length; i++) {
|
|
48
|
+
const inline = lines[i].match(/^\s+image:[ \t]+(\S.*)$/);
|
|
49
|
+
if (inline) {
|
|
50
|
+
addImage(inline[1]);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (/^\s+image:\s*$/.test(lines[i]) || /^\s+-\s+name:[ \t]+(\S.*)$/.test(lines[i])) {
|
|
54
|
+
const svcName = lines[i].match(/^\s+-\s+name:[ \t]+(\S.*)$/);
|
|
55
|
+
if (svcName) {
|
|
56
|
+
addImage(svcName[1]);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const nameLine = lines.slice(i + 1, i + 4).find((l) => /^\s+name:[ \t]+/.test(l));
|
|
60
|
+
if (nameLine)
|
|
61
|
+
addImage(nameLine.replace(/^\s+name:[ \t]+/, ""));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Default resolver: query the GitLab REST API for project existence / archive /
|
|
68
|
+
* move status. Best-effort and resilient — errors yield an "unknown" resolution
|
|
69
|
+
* (exists=true, no findings) rather than a false positive. Component/image
|
|
70
|
+
* advisory lookups are left to a configured resolver.
|
|
71
|
+
*/
|
|
72
|
+
export const defaultGitlabRefResolver = async (kind, identifier) => {
|
|
73
|
+
const unknown = { exists: true, archived: false, advisories: [] };
|
|
74
|
+
if (kind === "image")
|
|
75
|
+
return unknown; // image advisory feeds are resolver-specific
|
|
76
|
+
const host = "https://gitlab.com";
|
|
77
|
+
const project = kind === "component" ? identifier.split("/").slice(1, 3).join("/") : identifier;
|
|
78
|
+
try {
|
|
79
|
+
const resp = await fetch(`${host}/api/v4/projects/${encodeURIComponent(project)}`, {
|
|
80
|
+
headers: process.env.GITLAB_TOKEN ? { "PRIVATE-TOKEN": process.env.GITLAB_TOKEN } : {},
|
|
81
|
+
});
|
|
82
|
+
if (resp.status === 404)
|
|
83
|
+
return { exists: false, archived: false, advisories: [] };
|
|
84
|
+
if (!resp.ok)
|
|
85
|
+
return unknown;
|
|
86
|
+
const p = (await resp.json());
|
|
87
|
+
return { exists: true, archived: !!p.archived, advisories: [] };
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return unknown;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
function renderSummary(findings) {
|
|
94
|
+
if (findings.length === 0)
|
|
95
|
+
return "## Pipeline include/component audit\n\nNo live drift detected against upstream references.\n";
|
|
96
|
+
let out = `## Pipeline include/component audit\n\n${findings.length} finding(s) against live upstream truth:\n\n`;
|
|
97
|
+
out += "| Reference | Ref | Finding | Detail |\n|---|---|---|---|\n";
|
|
98
|
+
for (const f of findings)
|
|
99
|
+
out += `| ${f.identifier} (${f.refKind}) | ${f.ref} | ${f.kind} | ${f.detail} |\n`;
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
async function readFileBestEffort(path) {
|
|
103
|
+
try {
|
|
104
|
+
const { readFile } = await import("node:fs/promises");
|
|
105
|
+
return [await readFile(path, "utf-8")];
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Resolve each include/component/image reference in the emitted pipeline against
|
|
113
|
+
* live upstreams and report drift.
|
|
114
|
+
*/
|
|
115
|
+
export async function pipelineSupplyChainAudit(args) {
|
|
116
|
+
const resolver = args.resolver ?? defaultGitlabRefResolver;
|
|
117
|
+
const mode = args.mode ?? "report";
|
|
118
|
+
let yamls = args.yamls ?? (args.yaml ? [args.yaml] : []);
|
|
119
|
+
if (yamls.length === 0) {
|
|
120
|
+
yamls = await readFileBestEffort(args.pipelineFile ?? ".gitlab-ci.yml");
|
|
121
|
+
}
|
|
122
|
+
const findings = [];
|
|
123
|
+
const seen = new Set();
|
|
124
|
+
for (const yaml of yamls) {
|
|
125
|
+
for (const { refKind, identifier, ref } of collectPipelineRefs(yaml)) {
|
|
126
|
+
const key = `${refKind}:${identifier}@${ref}`;
|
|
127
|
+
if (seen.has(key))
|
|
128
|
+
continue;
|
|
129
|
+
seen.add(key);
|
|
130
|
+
const res = await resolver(refKind, identifier, ref);
|
|
131
|
+
if (!res.exists) {
|
|
132
|
+
findings.push({ kind: "unresolved", refKind, identifier, ref, detail: `${refKind} "${identifier}@${ref}" no longer resolves upstream` });
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (res.archived) {
|
|
136
|
+
findings.push({ kind: "archived", refKind, identifier, ref, detail: `${identifier} has been archived upstream` });
|
|
137
|
+
}
|
|
138
|
+
if (res.movedTo) {
|
|
139
|
+
findings.push({ kind: "moved", refKind, identifier, ref, detail: `${identifier} moved to ${res.movedTo}` });
|
|
140
|
+
}
|
|
141
|
+
for (const adv of res.advisories) {
|
|
142
|
+
findings.push({ kind: "advisory", refKind, identifier, ref, detail: `disclosed advisory ${adv} covers ${identifier}` });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return { mode, findings, summary: renderSummary(findings) };
|
|
147
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { nonRetryableFailure } from "../activity-failure.js";
|
|
2
|
+
import { evaluateProjectPolicies } from "../../lint/policy.js";
|
|
3
|
+
/**
|
|
4
|
+
* Gate an apply on organizational policy: build the project, run its
|
|
5
|
+
* `lint.policies` over the resolved resources, and **block** on any violation.
|
|
6
|
+
* Place it as a step before the apply phase — a violation fails the run
|
|
7
|
+
* (non-retryable; the `policyCheck` profile is single-attempt) so nothing is
|
|
8
|
+
* applied. A clean evaluation passes through.
|
|
9
|
+
*
|
|
10
|
+
* A plain activity on every runtime, not a `gate` step.
|
|
11
|
+
*/
|
|
12
|
+
export async function policyGate(args, _signal) {
|
|
13
|
+
const { violations, suppressed, env } = await evaluateProjectPolicies({ path: args.path ?? ".", env: args.env });
|
|
14
|
+
if (violations.length > 0) {
|
|
15
|
+
const summary = violations
|
|
16
|
+
.map((v) => `[${v.checkId}]${v.entity ? ` ${v.entity}:` : ""} ${v.message}`)
|
|
17
|
+
.join("; ");
|
|
18
|
+
throw nonRetryableFailure(`Organizational policy blocked the apply — ${violations.length} violation(s): ${summary}`, "PolicyViolation");
|
|
19
|
+
}
|
|
20
|
+
// chant #1138 — a check `lint.rules` turned "off" is counted here rather
|
|
21
|
+
// than vanishing silently, mirroring `chant build`'s own suppressed-count line.
|
|
22
|
+
if (suppressed.length > 0) {
|
|
23
|
+
console.log(`[policy] ${suppressed.length} finding(s) suppressed via lint.rules`);
|
|
24
|
+
}
|
|
25
|
+
console.log(`[policy] ${env ? `env=${env}: ` : ""}no violations — apply may proceed`);
|
|
26
|
+
}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `predictBehaviour` activity and the pull-request finding built on it
|
|
3
|
+
* (#2358, epic #2355).
|
|
4
|
+
*
|
|
5
|
+
* Two activities, because they answer two questions:
|
|
6
|
+
*
|
|
7
|
+
* - {@link predictBehaviour} asks the project's predicting lexicon what the
|
|
8
|
+
* declared estate would do at a stated traffic level, and returns the
|
|
9
|
+
* {@link BehaviourResult} as the contract defines it — a report, or a named
|
|
10
|
+
* refusal. It builds the project in-process, assembles the request from the
|
|
11
|
+
* build the way `lifecycle plan` assembles a deep read's, and hands it to
|
|
12
|
+
* the one configured lexicon that implements the fourth observation method.
|
|
13
|
+
* `isBehaviourRefusalReport` is the branch every consumer of its result
|
|
14
|
+
* takes first.
|
|
15
|
+
* - {@link behaviourFinding} runs that prediction twice — once on the
|
|
16
|
+
* checkout the run is in (the pull request's head) and once on the base
|
|
17
|
+
* branch it targets — differences the two under the rules in
|
|
18
|
+
* `../../behaviour-delta.ts`, and posts the finding in `comment` mode
|
|
19
|
+
* through {@link reconcilePr}. Same sticky comment on GitHub and Forgejo,
|
|
20
|
+
* same merge-request note on GitLab, same marker recipe: nothing here
|
|
21
|
+
* posts anything itself.
|
|
22
|
+
*
|
|
23
|
+
* ## The base side is a checkout, not a snapshot
|
|
24
|
+
*
|
|
25
|
+
* The finding is declared-versus-declared: the graph the pull request
|
|
26
|
+
* proposes against the graph its base branch already holds. Both sides are
|
|
27
|
+
* built from source, so the base branch is checked out into a detached git
|
|
28
|
+
* worktree under the repository's own root (module resolution walks up from
|
|
29
|
+
* there to the same `node_modules` the head build uses) and removed again
|
|
30
|
+
* whether the prediction succeeded or not. A shallow CI clone does not carry
|
|
31
|
+
* the base branch, so it is fetched at depth one first — the same reason
|
|
32
|
+
* `converge.ts` fetches `chant/lifecycle` before reading it.
|
|
33
|
+
*
|
|
34
|
+
* The base branch name comes off the run's own event, the way the pull
|
|
35
|
+
* request itself does in `reconcile.ts`: `GITHUB_BASE_REF` on a GitHub
|
|
36
|
+
* Actions or Forgejo Actions `pull_request` job, `CI_MERGE_REQUEST_TARGET_BRANCH_NAME`
|
|
37
|
+
* on a GitLab `merge_request_event` pipeline. A run with neither and no
|
|
38
|
+
* explicit `base` fails by name rather than guessing `main`.
|
|
39
|
+
*
|
|
40
|
+
* ## What the marker names
|
|
41
|
+
*
|
|
42
|
+
* The comment's hidden marker names the Op and the env together
|
|
43
|
+
* ({@link behaviourFindingMarker}), for #2319's reason: a `comment`-mode
|
|
44
|
+
* `reconcilePr` step on the same pull request keys its marker on the env
|
|
45
|
+
* alone, and a behaviour finding over `prod` sharing a marker with a plan
|
|
46
|
+
* finding over `prod` would edit the wrong comment on every push.
|
|
47
|
+
*
|
|
48
|
+
* ## Edge coverage on the declared path
|
|
49
|
+
*
|
|
50
|
+
* `buildGraphIr` produces reference edges and is exhaustive for them. It
|
|
51
|
+
* produces no containment — a subnet's membership of a VPC is not a reference
|
|
52
|
+
* — and #2360's third comment records that nothing on the declared path does
|
|
53
|
+
* yet. So the request never claims `complete`: that would be a true claim
|
|
54
|
+
* about references and a false one about the graph. It cannot honestly claim
|
|
55
|
+
* `partial` either, because `partial` has to name a gap as `dangling` or
|
|
56
|
+
* `unresolvedKinds`, and the gap here is neither — every reference resolved,
|
|
57
|
+
* and the generic builder has no vocabulary for "this kind is a boundary
|
|
58
|
+
* whose containment is missing" (the request fixture names its boundary
|
|
59
|
+
* kinds by hand, which is lexicon knowledge core does not have). An earlier
|
|
60
|
+
* draft named every kind no reference touched, and named a queue nobody
|
|
61
|
+
* references as "unresolved", which it is not. So the claim is `unknown`,
|
|
62
|
+
* which the contract tells a consumer to treat exactly as it treats
|
|
63
|
+
* `partial`, and the finding shows each side's coverage and does not compare
|
|
64
|
+
* resilience verdicts across it — see `renderBehaviourFinding`.
|
|
65
|
+
*/
|
|
66
|
+
import { exec } from "node:child_process";
|
|
67
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
68
|
+
import { join, resolve } from "node:path";
|
|
69
|
+
import { promisify } from "node:util";
|
|
70
|
+
import { isBehaviourRefusalReport, } from "../../behaviour.js";
|
|
71
|
+
import { behaviourDelta, renderBehaviourFinding, validateBehaviourResult, } from "../../behaviour-delta.js";
|
|
72
|
+
import { createBehaviourPredict } from "../../behaviour-predict.js";
|
|
73
|
+
import { markerSlug, reconcilePr, suppliedMarker } from "./reconcile.js";
|
|
74
|
+
const execAsync = promisify(exec);
|
|
75
|
+
function shellQuote(s) {
|
|
76
|
+
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* What the activity says when nothing has contributed coverage rows.
|
|
80
|
+
*
|
|
81
|
+
* Not an error and not a refusal: the prediction runs, every declared entity
|
|
82
|
+
* is withheld as `unknown-type`, and this is what the report's own detail says
|
|
83
|
+
* one level down. Kept as a message rather than a throw because an estate
|
|
84
|
+
* whose lexicons contribute no rows is a real state with a real answer — "no
|
|
85
|
+
* row says what any of these are" — and a throw would turn it into a broken
|
|
86
|
+
* command (#2382).
|
|
87
|
+
*/
|
|
88
|
+
export function noContributedRowsMessage(lexicons) {
|
|
89
|
+
const configured = lexicons.length > 0 ? lexicons.join(", ") : "(none)";
|
|
90
|
+
return ("predictBehaviour has the estate to predict and no coverage rows to read it with: none of the " +
|
|
91
|
+
`configured lexicons (${configured}) contributes \`behaviourKinds\`. Every entity will be reported ` +
|
|
92
|
+
"unpredicted as `unknown-type`. Set CHANT_BEHAVIOUR_ENGINE to the engine's address, and add rows " +
|
|
93
|
+
"in the lexicon that owns the entity types you expect priced.");
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The declared path's honest coverage claim. See the module doc: reference
|
|
97
|
+
* edges are exhaustive and containment is absent, and the contract has a
|
|
98
|
+
* field for a missing reference and none for missing containment, so the
|
|
99
|
+
* claim is `unknown`. Never `complete`, and not `partial` naming a kind the
|
|
100
|
+
* generic builder has no basis to name. A function rather than a constant so
|
|
101
|
+
* the day the declared path produces containment edges (#2360), the claim
|
|
102
|
+
* changes here and nowhere else.
|
|
103
|
+
*/
|
|
104
|
+
export function declaredEdgeCoverage() {
|
|
105
|
+
return { verdict: "unknown" };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Predict the estate declared under `projectPath`. The in-process half of
|
|
109
|
+
* {@link predictBehaviour}, taking the project root explicitly so the
|
|
110
|
+
* finding can run it on the base checkout too.
|
|
111
|
+
*
|
|
112
|
+
* Imports are dynamic so this module carries no load-time edge into the CLI
|
|
113
|
+
* or the build: `cli/plugins` reaches back into the root index, and the
|
|
114
|
+
* activity registry imports this module statically.
|
|
115
|
+
*/
|
|
116
|
+
export async function predictDeclared(projectPath, args) {
|
|
117
|
+
const { loadChantConfigUpward } = await import("../../config.js");
|
|
118
|
+
const { loadPlugins, resolveProjectLexicons } = await import("../../cli/plugins.js");
|
|
119
|
+
const { build } = await import("../../build.js");
|
|
120
|
+
const { buildGraphIr } = await import("../../graph-ir.js");
|
|
121
|
+
const { config } = await loadChantConfigUpward(projectPath);
|
|
122
|
+
const lexicons = await resolveProjectLexicons(projectPath);
|
|
123
|
+
const plugins = (await loadPlugins(lexicons));
|
|
124
|
+
// Rows, not a predictor. Since #2382 core predicts and each lexicon says
|
|
125
|
+
// only what its own entity types mean, so there is nothing to choose between
|
|
126
|
+
// and nothing to refuse when two lexicons both answer — they are additive.
|
|
127
|
+
const kinds = plugins.map((p) => p.behaviourKinds).filter((k) => k !== undefined);
|
|
128
|
+
const sourceDir = resolve(projectPath, config.sourceDir ?? ".");
|
|
129
|
+
const result = await build(sourceDir, plugins.map((p) => p.serializer));
|
|
130
|
+
if (result.errors.length > 0) {
|
|
131
|
+
const messages = result.errors.map((e) => (typeof e === "string" ? e : e.message ?? String(e)));
|
|
132
|
+
throw new Error(`predictBehaviour: the project under ${projectPath} did not build: ${messages.join("; ")}`);
|
|
133
|
+
}
|
|
134
|
+
// Every declared entity with a type. The contributed rows decide what
|
|
135
|
+
// reaches the engine and what is declared unmapped, and they can only decide
|
|
136
|
+
// about what they are handed: filtering here to "resources" would silently
|
|
137
|
+
// drop the kinds the coverage rows exist to name.
|
|
138
|
+
const entities = new Map();
|
|
139
|
+
for (const [name, entity] of result.entities) {
|
|
140
|
+
const declarable = entity;
|
|
141
|
+
if (typeof declarable.entityType !== "string")
|
|
142
|
+
continue;
|
|
143
|
+
entities.set(name, {
|
|
144
|
+
entityType: declarable.entityType,
|
|
145
|
+
props: (declarable.props != null ? declarable.props : {}),
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
const edges = buildGraphIr(result.entities, sourceDir).edges;
|
|
149
|
+
// The build output the other three reads are handed — a string, not a path
|
|
150
|
+
// (cli/handlers/lifecycle.ts). Nothing on this path reads it; the mirror is
|
|
151
|
+
// kept so the four methods take the same shape. With no predicting lexicon
|
|
152
|
+
// to take it from, it is the first output the build produced, or empty.
|
|
153
|
+
const raw = [...result.outputs.values()][0];
|
|
154
|
+
const buildOutput = raw === undefined ? "" : typeof raw === "string" ? raw : raw.primary;
|
|
155
|
+
const options = {
|
|
156
|
+
environment: args.environment,
|
|
157
|
+
buildOutput,
|
|
158
|
+
entityNames: [...entities.keys()],
|
|
159
|
+
entities,
|
|
160
|
+
...(args.stack ? { stack: args.stack } : {}),
|
|
161
|
+
...(args.region ? { region: args.region } : {}),
|
|
162
|
+
...(args.owned !== undefined ? { owned: args.owned } : {}),
|
|
163
|
+
traffic: args.traffic,
|
|
164
|
+
edges,
|
|
165
|
+
edgeCoverage: declaredEdgeCoverage(),
|
|
166
|
+
// This activity builds from `discover` + `build`, never from an account —
|
|
167
|
+
// it is the declared estate by construction, on whichever checkout it runs.
|
|
168
|
+
from: "declared",
|
|
169
|
+
};
|
|
170
|
+
const answer = await createBehaviourPredict({ kinds })(options);
|
|
171
|
+
// On arrival, with the names that were asked — `behaviourReport` checks the
|
|
172
|
+
// ordinary route and says a consumer that needs the guarantee checks again.
|
|
173
|
+
return validateBehaviourResult(answer, options.entityNames);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Predict the declared estate in the working directory at `args.traffic`.
|
|
177
|
+
* Returns the contract's result as it is; a refusal is a result, not a
|
|
178
|
+
* thrown error, and `isBehaviourRefusalReport` is the branch to take first.
|
|
179
|
+
* Uses the `fastIdempotent` profile: the build is offline and the engine call
|
|
180
|
+
* is read-only.
|
|
181
|
+
*/
|
|
182
|
+
export async function predictBehaviour(args) {
|
|
183
|
+
return predictDeclared(resolve("."), args);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* The hidden marker a behaviour finding is found by across re-runs. Keyed on
|
|
187
|
+
* the Op *and* the env, both slugified the same way `reconcilePr`'s markers
|
|
188
|
+
* are, and distinct from both of those by its prefix: a `comment`-mode
|
|
189
|
+
* `reconcilePr` step and this step on one pull request must never match each
|
|
190
|
+
* other's comment.
|
|
191
|
+
*/
|
|
192
|
+
export function behaviourFindingMarker(op, env) {
|
|
193
|
+
return `<!-- chant-behaviour:${markerSlug(op)}/${markerSlug(env)} -->`;
|
|
194
|
+
}
|
|
195
|
+
/** What the finding says when the run names no base branch to predict against. */
|
|
196
|
+
export function noBaseRefMessage() {
|
|
197
|
+
return ("behaviourFinding predicts the pull request's declared estate against its base branch's, and this run " +
|
|
198
|
+
"names no base branch. On GitHub Actions and Forgejo Actions a pull_request event sets GITHUB_BASE_REF; on " +
|
|
199
|
+
"GitLab CI a merge_request_event pipeline sets CI_MERGE_REQUEST_TARGET_BRANCH_NAME. Trigger the Op from " +
|
|
200
|
+
"one of those, or pass `base` with the branch name.");
|
|
201
|
+
}
|
|
202
|
+
/** Where the base branch name comes from, most specific first. Pure — exported for testing. */
|
|
203
|
+
export function baseRefFrom(env, explicit) {
|
|
204
|
+
const fromArgs = explicit?.trim();
|
|
205
|
+
if (fromArgs)
|
|
206
|
+
return fromArgs;
|
|
207
|
+
for (const source of ["GITHUB_BASE_REF", "CI_MERGE_REQUEST_TARGET_BRANCH_NAME"]) {
|
|
208
|
+
const value = env[source]?.trim();
|
|
209
|
+
if (value)
|
|
210
|
+
return value;
|
|
211
|
+
}
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
/** What the head side is called in the finding: the source branch when the run names one, else the short commit. */
|
|
215
|
+
export function headRefFrom(env, shortSha) {
|
|
216
|
+
for (const source of ["GITHUB_HEAD_REF", "CI_MERGE_REQUEST_SOURCE_BRANCH_NAME"]) {
|
|
217
|
+
const value = env[source]?.trim();
|
|
218
|
+
if (value)
|
|
219
|
+
return value;
|
|
220
|
+
}
|
|
221
|
+
return shortSha?.trim() || "head";
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check `base` out into a detached worktree beside the repository. Fetches it
|
|
225
|
+
* at depth one first, because a CI clone carries only the pull request's own
|
|
226
|
+
* ref; a branch already present locally (a full clone, a developer's own
|
|
227
|
+
* checkout) is used as it stands after the fetch fails.
|
|
228
|
+
*/
|
|
229
|
+
export async function checkoutBase(base, signal) {
|
|
230
|
+
const { stdout: rootOut } = await execAsync("git rev-parse --show-toplevel", { signal });
|
|
231
|
+
const { stdout: prefixOut } = await execAsync("git rev-parse --show-prefix", { signal });
|
|
232
|
+
const root = rootOut.trim();
|
|
233
|
+
const prefix = prefixOut.trim();
|
|
234
|
+
let commitish = "FETCH_HEAD";
|
|
235
|
+
try {
|
|
236
|
+
await execAsync(`git fetch --depth=1 origin ${shellQuote(base)}`, { signal });
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// No remote, or no such branch there: a local branch of that name is
|
|
240
|
+
// the only other thing `base` can honestly mean.
|
|
241
|
+
commitish = base;
|
|
242
|
+
}
|
|
243
|
+
const dir = await mkdtemp(join(root, ".chant-behaviour-base-"));
|
|
244
|
+
try {
|
|
245
|
+
await execAsync(`git worktree add --detach ${shellQuote(dir)} ${shellQuote(commitish)}`, { signal });
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
await rm(dir, { recursive: true, force: true });
|
|
249
|
+
throw new Error(`behaviourFinding could not check out base branch ${JSON.stringify(base)}: ${err.message}`);
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
projectPath: prefix ? join(dir, prefix) : dir,
|
|
253
|
+
async cleanup() {
|
|
254
|
+
try {
|
|
255
|
+
await execAsync(`git worktree remove --force ${shellQuote(dir)}`);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
await rm(dir, { recursive: true, force: true });
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
async function defaultShortSha() {
|
|
264
|
+
try {
|
|
265
|
+
const { stdout } = await execAsync("git rev-parse --short HEAD");
|
|
266
|
+
return stdout.trim();
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Build the finding activity, with its four side effects injected so a test
|
|
274
|
+
* can drive the whole thing — predict twice, difference, render, post —
|
|
275
|
+
* against fixtures and a stubbed poster.
|
|
276
|
+
*/
|
|
277
|
+
export function createBehaviourFinding(deps = {}) {
|
|
278
|
+
const predict = deps.predict ?? predictDeclared;
|
|
279
|
+
const checkout = deps.checkout ?? checkoutBase;
|
|
280
|
+
const post = deps.post ?? reconcilePr;
|
|
281
|
+
const env = deps.env ?? process.env;
|
|
282
|
+
const shortSha = deps.shortSha ?? defaultShortSha;
|
|
283
|
+
return async function behaviourFinding(args, signal) {
|
|
284
|
+
const mode = args.mode ?? "comment";
|
|
285
|
+
if (typeof args.op !== "string" || args.op.trim() === "") {
|
|
286
|
+
throw new Error("behaviourFinding needs `op`, the name of the Op this step belongs to: it keys the comment's marker " +
|
|
287
|
+
"together with `environment`, and an env alone is not unique across Ops (#2319).");
|
|
288
|
+
}
|
|
289
|
+
const base = baseRefFrom(env, args.base);
|
|
290
|
+
if (!base)
|
|
291
|
+
throw new Error(noBaseRefMessage());
|
|
292
|
+
const head = headRefFrom(env, await shortSha());
|
|
293
|
+
const predictArgs = {
|
|
294
|
+
environment: args.environment,
|
|
295
|
+
traffic: args.traffic,
|
|
296
|
+
...(args.stack ? { stack: args.stack } : {}),
|
|
297
|
+
...(args.region ? { region: args.region } : {}),
|
|
298
|
+
...(args.owned !== undefined ? { owned: args.owned } : {}),
|
|
299
|
+
};
|
|
300
|
+
// Head first: it is the checkout the run is already in, and a build error
|
|
301
|
+
// there is the pull request's own and should surface before any worktree
|
|
302
|
+
// is created.
|
|
303
|
+
const headResult = await predict(resolve("."), predictArgs);
|
|
304
|
+
const baseCheckout = await checkout(base, signal);
|
|
305
|
+
let baseResult;
|
|
306
|
+
try {
|
|
307
|
+
baseResult = await predict(baseCheckout.projectPath, predictArgs);
|
|
308
|
+
}
|
|
309
|
+
finally {
|
|
310
|
+
await baseCheckout.cleanup();
|
|
311
|
+
}
|
|
312
|
+
const finding = behaviourDelta({ label: "base", ref: base, result: baseResult }, { label: "head", ref: head, result: headResult });
|
|
313
|
+
const summary = renderBehaviourFinding(finding, { env: args.environment, op: args.op });
|
|
314
|
+
const refused = isBehaviourRefusalReport(baseResult) || isBehaviourRefusalReport(headResult);
|
|
315
|
+
const result = { mode, base, head, finding, refused, summary };
|
|
316
|
+
if (mode === "report")
|
|
317
|
+
return result;
|
|
318
|
+
const posted = await post({
|
|
319
|
+
env: args.environment,
|
|
320
|
+
op: args.op,
|
|
321
|
+
mode: "comment",
|
|
322
|
+
marker: suppliedMarker(behaviourFindingMarker(args.op, args.environment)),
|
|
323
|
+
body: summary,
|
|
324
|
+
title: args.title ?? `Predicted behaviour for ${args.environment} at ${args.traffic}`,
|
|
325
|
+
}, signal);
|
|
326
|
+
return {
|
|
327
|
+
...result,
|
|
328
|
+
...(posted.commentUrl ? { commentUrl: posted.commentUrl } : {}),
|
|
329
|
+
...(posted.pullRequest ? { pullRequest: posted.pullRequest } : {}),
|
|
330
|
+
...(posted.mergeRequest ? { mergeRequest: posted.mergeRequest } : {}),
|
|
331
|
+
};
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Predict the pull request's declared estate and its base branch's, and post
|
|
336
|
+
* the delta as one sticky comment on the pull request — or one note on the
|
|
337
|
+
* merge request — that triggered the run. Needs a pull-request-triggered
|
|
338
|
+
* run; fails by name without one, the same way `reconcilePr`'s `comment`
|
|
339
|
+
* mode does, because that is the function that posts.
|
|
340
|
+
*/
|
|
341
|
+
export const behaviourFinding = createBehaviourFinding();
|