@intentius/chant 0.124.13 → 0.124.14
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.js +668 -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.js +312 -0
- package/dist/child-project.js +21 -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.js +134 -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.js +305 -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.js +208 -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 +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- 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.js +260 -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.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.js +193 -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.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.js +64 -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.js +997 -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.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.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.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- 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 +460 -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.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -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.js +587 -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.js +245 -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/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/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/lexicon-module.ts +3 -0
- 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/discover.ts +3 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +1 -1
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wake gate between a substrate's change signal and `chant operator`'s
|
|
3
|
+
* sleep (#1981, epic #1487).
|
|
4
|
+
*
|
|
5
|
+
* A lexicon that implements `subscribeChanges` (`../lexicon.ts`) can say
|
|
6
|
+
* "something moved". This module is everything the loop does with that: it
|
|
7
|
+
* shortens the current sleep, at most once per floor. It is deliberately the
|
|
8
|
+
* only place a signal touches, so the rule that a signal is a trigger and
|
|
9
|
+
* never a fact is a property of the code rather than a convention. Nothing
|
|
10
|
+
* here has a parameter, a return value or a field that could carry what
|
|
11
|
+
* changed.
|
|
12
|
+
*
|
|
13
|
+
* ## Backpressure: the floor
|
|
14
|
+
*
|
|
15
|
+
* A watch on a busy namespace is not a trickle. A rollout, a Job sweep or a
|
|
16
|
+
* controller resyncing its whole world produces hundreds of events in a
|
|
17
|
+
* second, and each one is a truthful "something moved". Waking a tick per
|
|
18
|
+
* event would turn a convergence loop into a load generator pointed at the
|
|
19
|
+
* cluster it is meant to be watching.
|
|
20
|
+
*
|
|
21
|
+
* So the gate coalesces. Signals are collapsed into a single pending flag, and
|
|
22
|
+
* a pending flag wakes the sleep no earlier than {@link
|
|
23
|
+
* ChangeSignalGateOptions.floorMs} after the last round *started*. A storm of
|
|
24
|
+
* a thousand signals inside one floor window costs exactly one early wake, and
|
|
25
|
+
* a substrate that never stops sending settles into ticking on the floor
|
|
26
|
+
* rather than on the interval, which is the fastest the loop is ever allowed
|
|
27
|
+
* to run.
|
|
28
|
+
*
|
|
29
|
+
* The floor is measured from the start of the last round, not from the last
|
|
30
|
+
* signal, so a steady stream can never push the wake further out (that would
|
|
31
|
+
* be a debounce, and a debounce starves: the busier the cluster, the later the
|
|
32
|
+
* tick). Measuring from the round start makes the guarantee a rate limit,
|
|
33
|
+
* never more than one signal-driven tick per floor, which is the property the
|
|
34
|
+
* loop actually needs.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* The shortest gap between two rounds a change signal may produce. Signals
|
|
38
|
+
* arriving inside this window of the last round's start are coalesced into one
|
|
39
|
+
* wake at the end of it.
|
|
40
|
+
*
|
|
41
|
+
* Five seconds: long enough that a rollout's event storm costs one tick rather
|
|
42
|
+
* than dozens, short enough that "wakes within a second or so of a change"
|
|
43
|
+
* holds for the quiet case a signal exists for. The timer
|
|
44
|
+
* (`DEFAULT_OPERATOR_INTERVAL_MS`, 60s) is unchanged and remains the ceiling.
|
|
45
|
+
*/
|
|
46
|
+
export const DEFAULT_SIGNAL_FLOOR_MS = 5000;
|
|
47
|
+
export function createChangeSignalGate(options = {}) {
|
|
48
|
+
const floorMs = options.floorMs ?? DEFAULT_SIGNAL_FLOOR_MS;
|
|
49
|
+
const now = options.now ?? (() => Date.now());
|
|
50
|
+
let pending = false;
|
|
51
|
+
let lastRoundAt = now();
|
|
52
|
+
let signalCount = 0;
|
|
53
|
+
let wakeCount = 0;
|
|
54
|
+
/** Set only while a `wait` is in flight. */
|
|
55
|
+
let arm;
|
|
56
|
+
return {
|
|
57
|
+
get signalCount() {
|
|
58
|
+
return signalCount;
|
|
59
|
+
},
|
|
60
|
+
get wakeCount() {
|
|
61
|
+
return wakeCount;
|
|
62
|
+
},
|
|
63
|
+
signal() {
|
|
64
|
+
signalCount++;
|
|
65
|
+
pending = true;
|
|
66
|
+
arm?.();
|
|
67
|
+
},
|
|
68
|
+
roundStarted() {
|
|
69
|
+
lastRoundAt = now();
|
|
70
|
+
pending = false;
|
|
71
|
+
},
|
|
72
|
+
wait(intervalMs, abortSignal) {
|
|
73
|
+
return new Promise((resolve) => {
|
|
74
|
+
if (abortSignal?.aborted)
|
|
75
|
+
return resolve("aborted");
|
|
76
|
+
let settled = false;
|
|
77
|
+
let floorTimer;
|
|
78
|
+
const finish = (reason) => {
|
|
79
|
+
if (settled)
|
|
80
|
+
return;
|
|
81
|
+
settled = true;
|
|
82
|
+
clearTimeout(intervalTimer);
|
|
83
|
+
if (floorTimer)
|
|
84
|
+
clearTimeout(floorTimer);
|
|
85
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
86
|
+
arm = undefined;
|
|
87
|
+
if (reason === "signal")
|
|
88
|
+
wakeCount++;
|
|
89
|
+
resolve(reason);
|
|
90
|
+
};
|
|
91
|
+
const intervalTimer = setTimeout(() => finish("timer"), intervalMs);
|
|
92
|
+
const onAbort = () => finish("aborted");
|
|
93
|
+
abortSignal?.addEventListener("abort", onAbort, { once: true });
|
|
94
|
+
// A pending signal wakes the sleep the moment the floor has passed,
|
|
95
|
+
// and not one moment earlier. `remaining` is measured from the last
|
|
96
|
+
// round's start, so repeated signals inside the window collapse onto
|
|
97
|
+
// the same deadline instead of pushing it out.
|
|
98
|
+
const consider = () => {
|
|
99
|
+
if (settled || !pending)
|
|
100
|
+
return;
|
|
101
|
+
const remaining = lastRoundAt + floorMs - now();
|
|
102
|
+
if (remaining <= 0)
|
|
103
|
+
return finish("signal");
|
|
104
|
+
if (floorTimer)
|
|
105
|
+
return; // already waiting out this window
|
|
106
|
+
floorTimer = setTimeout(() => {
|
|
107
|
+
floorTimer = undefined;
|
|
108
|
+
consider();
|
|
109
|
+
}, remaining);
|
|
110
|
+
};
|
|
111
|
+
arm = consider;
|
|
112
|
+
// A signal that arrived between rounds, while nothing was sleeping,
|
|
113
|
+
// is honoured here rather than lost.
|
|
114
|
+
consider();
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ApplyOp composite — the code → cloud workflow as an Op.
|
|
3
|
+
*
|
|
4
|
+
* Compute the plan, then apply via the target's native mechanism. Authority
|
|
5
|
+
* stays with the platform (the CloudFormation stack, the Kubernetes API
|
|
6
|
+
* server, the ARM resource group) — chant never hosts a state file.
|
|
7
|
+
*
|
|
8
|
+
* Phases: build → plan → [approve] → apply. Deletes ride the native
|
|
9
|
+
* prune path, whose bound is per target: the ownership marker on `kubectl`,
|
|
10
|
+
* the ownership tag on `arm` (chant #1448 — previously `--mode Complete`, which
|
|
11
|
+
* removed resources chant never applied), the ownership label on `gcp`
|
|
12
|
+
* (chant #1449), the metadata marker (machines) and managed app
|
|
13
|
+
* (volumes/ips/certs/secrets) on `fly` (chant #1449), the ownership labels on
|
|
14
|
+
* `grafana` (chant #3011), the comment marker on `clickhouse` (chant #3208)
|
|
15
|
+
* and `postgres` (chant #3280), the declared ruler namespaces on `ruler`
|
|
16
|
+
* (chant #3372),
|
|
17
|
+
* and the stack itself on `cloudformation`, which a
|
|
18
|
+
* resource CFN did not create is not in. All of
|
|
19
|
+
* them are owned-only. See {@link DeleteMode}.
|
|
20
|
+
*
|
|
21
|
+
* A gate is a fact, not a wait (#2119): the local executor reads the gate
|
|
22
|
+
* ledger, and a run that finds no resolution ends `gated` with the `chant
|
|
23
|
+
* approve <op> <gate>` line to run. Approve, run again, and the same Op
|
|
24
|
+
* converges — no durable workflow engine is involved.
|
|
25
|
+
*
|
|
26
|
+
* The gate binds the plan (#2300). The Plan phase's `lifecycleDiff` publishes
|
|
27
|
+
* a digest of its change set, the gate step references it, and a resolution
|
|
28
|
+
* counts only for that digest. Approve, change the declared source, re-run,
|
|
29
|
+
* and the run stops again with both digests named rather than applying a
|
|
30
|
+
* change set the approver never saw.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // additive, local executor
|
|
35
|
+
* export const { op } = ApplyOp({ name: "prod-apply", env: "prod", target: "kubectl" });
|
|
36
|
+
*
|
|
37
|
+
* // gated destructive apply — `chant approve prod-apply approve-apply`, then re-run
|
|
38
|
+
* export const { op } = ApplyOp({
|
|
39
|
+
* name: "prod-apply",
|
|
40
|
+
* env: "prod",
|
|
41
|
+
* target: "kubectl",
|
|
42
|
+
* delete: "gated",
|
|
43
|
+
* gate: { gate: "approve-apply", description: "Approve prod apply with deletes" },
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* // the gate asks the prod-apply decision point (#3170): answered with
|
|
47
|
+
* // `chant workspace points answer <id>`, then re-run
|
|
48
|
+
* export const { op } = ApplyOp({
|
|
49
|
+
* name: "prod-apply",
|
|
50
|
+
* env: "prod",
|
|
51
|
+
* target: "kubectl",
|
|
52
|
+
* gate: { gate: "approve-apply", point: "prod-apply" },
|
|
53
|
+
* });
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* @see #112 — stateless-authoritative state model + live import
|
|
57
|
+
*/
|
|
58
|
+
import { Op, phase, activity, gate } from "../builders.js";
|
|
59
|
+
import { stepOutput } from "../step-output-ref.js";
|
|
60
|
+
import { gateName } from "../gate-name.js";
|
|
61
|
+
import { defaultOutput, hasNativeRollback } from "../activities/apply.js";
|
|
62
|
+
export function ApplyOp(config) {
|
|
63
|
+
const target = config.target ?? "kubectl";
|
|
64
|
+
const output = config.output ?? defaultOutput(target);
|
|
65
|
+
const deleteMode = config.delete ?? "never";
|
|
66
|
+
const gated = deleteMode === "gated" || config.effects === "gated" || config.gate !== undefined;
|
|
67
|
+
const phases = [
|
|
68
|
+
phase("Build", [activity("chantBuild", { path: config.path ?? "." })]),
|
|
69
|
+
phase("Plan", [
|
|
70
|
+
{
|
|
71
|
+
kind: "activity",
|
|
72
|
+
// #2300: the gate below references this step's digest, and a
|
|
73
|
+
// reference needs an id. `plan` rather than `diff`, because what the
|
|
74
|
+
// Approve phase binds to is the plan this step produced.
|
|
75
|
+
id: "plan",
|
|
76
|
+
fn: "lifecycleDiff",
|
|
77
|
+
args: { env: config.env, live: true },
|
|
78
|
+
outcomeAttribute: { name: "Drift", from: "drifted" },
|
|
79
|
+
},
|
|
80
|
+
]),
|
|
81
|
+
];
|
|
82
|
+
if (gated) {
|
|
83
|
+
phases.push(phase("Approve", [
|
|
84
|
+
gate(gateName(config.gate ?? {}) || `approve-${config.name}`, {
|
|
85
|
+
...(config.gate?.timeout ? { timeout: config.gate.timeout } : {}),
|
|
86
|
+
// #2300: the approval is for the change set the Plan phase just
|
|
87
|
+
// produced. Edit the source between approving and re-running and
|
|
88
|
+
// the gate refuses, naming the approved digest and the planned one,
|
|
89
|
+
// instead of applying what nobody read.
|
|
90
|
+
plan: stepOutput("plan", "planDigest"),
|
|
91
|
+
...(config.gate?.point !== undefined ? { point: config.gate.point } : {}),
|
|
92
|
+
description: config.gate?.description ??
|
|
93
|
+
`Approve apply to ${config.env} (delete mode: ${deleteMode}` +
|
|
94
|
+
`${config.effects === "gated" ? ", effects: gated" : ""})`,
|
|
95
|
+
}),
|
|
96
|
+
]));
|
|
97
|
+
}
|
|
98
|
+
phases.push(phase("Apply", [
|
|
99
|
+
activity("nativeApply", {
|
|
100
|
+
target,
|
|
101
|
+
env: config.env,
|
|
102
|
+
output,
|
|
103
|
+
deleteMode,
|
|
104
|
+
// Only present when the author asked for it, so an Op that does not
|
|
105
|
+
// mention conflicts serializes exactly as it always has.
|
|
106
|
+
...(config.forceConflicts !== undefined ? { forceConflicts: config.forceConflicts } : {}),
|
|
107
|
+
}, "longInfra"),
|
|
108
|
+
]));
|
|
109
|
+
// Compensation is total or refused (#1449). A rollback path is either the
|
|
110
|
+
// target's mapped native rollback (cloudformation's rollbackStack) or an
|
|
111
|
+
// explicit command; without one there is nothing a Rollback phase could run,
|
|
112
|
+
// so asking for one is refused here — at build time, with the op named —
|
|
113
|
+
// rather than surfacing as a warn when the rollback is already needed.
|
|
114
|
+
const compensateCommand = typeof config.compensate === "object" ? config.compensate.command : undefined;
|
|
115
|
+
const rollbackAvailable = hasNativeRollback(target) || compensateCommand !== undefined;
|
|
116
|
+
if (config.compensate !== undefined && config.compensate !== false && !rollbackAvailable) {
|
|
117
|
+
throw new Error(`ApplyOp "${config.name}": compensate is enabled, but target "${target}" has no automatic ` +
|
|
118
|
+
`rollback — the mapped ones are cloudformation's rollbackStack and the ruler's previous-group re-apply. Either supply ` +
|
|
119
|
+
`compensate: { command: "..." } with a rollback of your own, or set compensate: false.`);
|
|
120
|
+
}
|
|
121
|
+
// Compensation defaults on for destructive applies — a partial failure should
|
|
122
|
+
// unwind rather than leave the cloud half-applied — but only where a rollback
|
|
123
|
+
// path exists; a destructive apply on a rollback-less target gets no
|
|
124
|
+
// compensation phase rather than one that could only warn.
|
|
125
|
+
const compensateDefault = deleteMode !== "never" && rollbackAvailable;
|
|
126
|
+
const compensateEnabled = config.compensate === undefined ? compensateDefault : config.compensate !== false;
|
|
127
|
+
const op = Op({
|
|
128
|
+
name: config.name,
|
|
129
|
+
overview: `Apply declared source to the ${config.env} environment (code → cloud)`,
|
|
130
|
+
labels: {
|
|
131
|
+
Apply: "true",
|
|
132
|
+
Env: config.env,
|
|
133
|
+
},
|
|
134
|
+
phases,
|
|
135
|
+
...(compensateEnabled
|
|
136
|
+
? {
|
|
137
|
+
onFailure: [
|
|
138
|
+
phase("Rollback", [
|
|
139
|
+
activity("compensateApply", {
|
|
140
|
+
target,
|
|
141
|
+
env: config.env,
|
|
142
|
+
...(target === "ruler" ? { output } : {}),
|
|
143
|
+
...(compensateCommand ? { command: compensateCommand } : {}),
|
|
144
|
+
}),
|
|
145
|
+
]),
|
|
146
|
+
],
|
|
147
|
+
}
|
|
148
|
+
: {}),
|
|
149
|
+
});
|
|
150
|
+
return { op };
|
|
151
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BehaviourOp composite — the predicted delta of a pull request as a review
|
|
3
|
+
* finding (#2358, epic #2355).
|
|
4
|
+
*
|
|
5
|
+
* One phase, one step: `behaviourFinding` predicts the declared estate on the
|
|
6
|
+
* pull request's head and on its base branch, differences the two under the
|
|
7
|
+
* contract's rules, and posts the finding in `comment` mode on the pull
|
|
8
|
+
* request (GitHub, Forgejo) or as a note on the merge request (GitLab) that
|
|
9
|
+
* triggered the run. There is no `schedule` here and there never will be: the
|
|
10
|
+
* cadence is the pull request, and the trigger lives on the `ScheduledOpSpec`
|
|
11
|
+
* handed to `generateOpsPipeline` (`{ kind: "pull_request" }`), the way
|
|
12
|
+
* `TerraformWatchOp`'s does.
|
|
13
|
+
*
|
|
14
|
+
* `findingMode: "report"` returns the body without posting, for a `chant run`
|
|
15
|
+
* on a developer's machine with `base` named by hand.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* export const { op } = BehaviourOp({
|
|
20
|
+
* name: "pr-behaviour",
|
|
21
|
+
* env: "prod",
|
|
22
|
+
* traffic: "1000 rps, p99",
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import { Op, phase } from "../builders.js";
|
|
27
|
+
export function BehaviourOp(config) {
|
|
28
|
+
const mode = config.findingMode ?? "comment";
|
|
29
|
+
const args = {
|
|
30
|
+
environment: config.env,
|
|
31
|
+
traffic: config.traffic,
|
|
32
|
+
// `op` names this Op in the marker the sticky comment is found by (#2319).
|
|
33
|
+
op: config.name,
|
|
34
|
+
mode,
|
|
35
|
+
...(config.base ? { base: config.base } : {}),
|
|
36
|
+
...(config.stack ? { stack: config.stack } : {}),
|
|
37
|
+
...(config.region ? { region: config.region } : {}),
|
|
38
|
+
...(config.scope?.owned !== undefined ? { owned: config.scope.owned } : {}),
|
|
39
|
+
};
|
|
40
|
+
const op = Op({
|
|
41
|
+
name: config.name,
|
|
42
|
+
overview: `Predict the ${config.env} estate's behaviour at "${config.traffic}" against the base branch`,
|
|
43
|
+
labels: {
|
|
44
|
+
Behaviour: "true",
|
|
45
|
+
Env: config.env,
|
|
46
|
+
},
|
|
47
|
+
phases: [
|
|
48
|
+
phase("Predict", [
|
|
49
|
+
{
|
|
50
|
+
kind: "activity",
|
|
51
|
+
fn: "behaviourFinding",
|
|
52
|
+
args: { ...args },
|
|
53
|
+
// The finding's headline is the posted comment, and whether either
|
|
54
|
+
// side refused: a refusal is a finding that says "no prediction",
|
|
55
|
+
// and a reader of the run ledger should see that without opening it.
|
|
56
|
+
outcomeAttribute: [
|
|
57
|
+
{ name: "Refused", from: "refused" },
|
|
58
|
+
...(mode === "comment" ? [{ name: "Comment", from: "commentUrl" }] : []),
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
]),
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
return { op };
|
|
65
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConvergeOp composite (#1484, epic #1487 feature 1) — the executable
|
|
3
|
+
* runbook. Observe, classify against a typed rule table, dispatch to
|
|
4
|
+
* declared ops within a per-tick budget, record, rest. Peer to `WatchOp` /
|
|
5
|
+
* `ReconcileOp` / `ApplyOp` — same `{ op }` shape, with the cadence on the
|
|
6
|
+
* Op itself (#2120).
|
|
7
|
+
*
|
|
8
|
+
* Phases: `Observe` (snapshot + a quick live diff, exactly `WatchOp`'s own
|
|
9
|
+
* shape, for the `Drift` outcome and per-phase visibility) ->
|
|
10
|
+
* `Converge` (one `convergeTick` activity call —
|
|
11
|
+
* ../activities/converge.ts — that does classify + dispatch + record;
|
|
12
|
+
* see that module's doc for why this can't be split into further static
|
|
13
|
+
* phases). `Observe`'s drift signal threads into `Converge`'s args via a
|
|
14
|
+
* step-output reference (#1290), not a search-attribute round-trip.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { ConvergeOp, eq, gt, run, report, when } from "@intentius/chant/op";
|
|
19
|
+
* import type { ConvergeSymptom } from "@intentius/chant/lifecycle/symptoms";
|
|
20
|
+
*
|
|
21
|
+
* export const { op } = ConvergeOp({
|
|
22
|
+
* name: "fountain-converge",
|
|
23
|
+
* env: "staging",
|
|
24
|
+
* dial: "apply",
|
|
25
|
+
* schedule: "*\/10 * * * *",
|
|
26
|
+
* rules: [
|
|
27
|
+
* when<ConvergeSymptom>(eq("status", "drifted"), run("fountain-apply"), {
|
|
28
|
+
* id: "drift-apply",
|
|
29
|
+
* why: "Live config drifted from declared source; re-apply converges it back.",
|
|
30
|
+
* }),
|
|
31
|
+
* when<ConvergeSymptom>(gt("adoptCount", 0), report("unowned resources present"), {
|
|
32
|
+
* id: "adopt-report",
|
|
33
|
+
* why: "An unowned resource is reported for a human to review — never auto-claimed.",
|
|
34
|
+
* }),
|
|
35
|
+
* when<ConvergeSymptom>(eq("status", "unknown"), report("environment could not be fully observed"), {
|
|
36
|
+
* id: "unknown-report",
|
|
37
|
+
* why: "unknown never remediates — a partial read is a hole to report, not a guess to act on.",
|
|
38
|
+
* }),
|
|
39
|
+
* ],
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @see #1484, #1487
|
|
44
|
+
*/
|
|
45
|
+
import { Op, phase, activity } from "../builders.js";
|
|
46
|
+
import { stepOutput } from "../step-output-ref.js";
|
|
47
|
+
import { isWellFormedPredicate, duplicateRuleIds } from "../converge-rule.js";
|
|
48
|
+
import { CONVERGE_SYMPTOM_FIELDS, RESOURCE_SYMPTOM_FIELDS } from "../../lifecycle/symptoms.js";
|
|
49
|
+
export function ConvergeOp(config) {
|
|
50
|
+
const dial = config.dial ?? "observe";
|
|
51
|
+
const budget = config.budget ?? 3;
|
|
52
|
+
const observer = config.observe !== undefined ? config.observe : undefined;
|
|
53
|
+
const fields = observer ? RESOURCE_SYMPTOM_FIELDS : CONVERGE_SYMPTOM_FIELDS;
|
|
54
|
+
// ── Build-time refusals (#1484) ─────────────────────────────────────────
|
|
55
|
+
// Thrown here, at Op-construction time — the same "refuse in the factory,
|
|
56
|
+
// named, before anything runs" shape ApplyOp's `compensate` check already
|
|
57
|
+
// uses. Cross-Op refusals that need the *whole* discovered graph (an
|
|
58
|
+
// unknown op referenced by `run()`, a mutating/destructive dispatch target
|
|
59
|
+
// whose own verb class the dial disallows) can't be checked here — a
|
|
60
|
+
// sibling `*.op.ts` file's Op may not exist yet at the moment this factory
|
|
61
|
+
// runs — and are instead OPS014's job
|
|
62
|
+
// (../../lint/rules/op/ops014-converge-rule-refusals.ts), which runs after
|
|
63
|
+
// the whole project is resolved.
|
|
64
|
+
if (config.rules.length === 0) {
|
|
65
|
+
throw new Error(`ConvergeOp "${config.name}": at least one rule is required — an empty table has nothing to converge.`);
|
|
66
|
+
}
|
|
67
|
+
const dupes = duplicateRuleIds(config.rules);
|
|
68
|
+
if (dupes.length > 0) {
|
|
69
|
+
throw new Error(`ConvergeOp "${config.name}": duplicate rule id(s) [${dupes.join(", ")}] — flap-damping counters are keyed by id, so ids must be unique.`);
|
|
70
|
+
}
|
|
71
|
+
if (!Number.isInteger(budget) || budget < 0) {
|
|
72
|
+
throw new Error(`ConvergeOp "${config.name}": budget must be a non-negative integer, got ${budget}`);
|
|
73
|
+
}
|
|
74
|
+
for (const rule of config.rules) {
|
|
75
|
+
if (!rule.why || rule.why.trim().length === 0) {
|
|
76
|
+
// Belt-and-suspenders: when() already refuses this, but a rule table
|
|
77
|
+
// assembled by hand (bypassing when()) reaches here too.
|
|
78
|
+
throw new Error(`ConvergeOp "${config.name}", rule "${rule.id}": every rule must carry its why — refused at build.`);
|
|
79
|
+
}
|
|
80
|
+
if (!isWellFormedPredicate(rule.when, fields)) {
|
|
81
|
+
throw new Error(`ConvergeOp "${config.name}", rule "${rule.id}": predicate is outside the evaluable subset — build it from ` +
|
|
82
|
+
`eq/neq/gt/gte/lt/lte/truthy/falsy/allOf/anyOf over a field ${observer ? "ResourceSymptom" : "ConvergeSymptom"} actually produces.`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (observer && observer.kind !== "activity") {
|
|
86
|
+
throw new Error(`ConvergeOp "${config.name}": observe must be an activity step, such as shell() or spriteServicesObserve()`);
|
|
87
|
+
}
|
|
88
|
+
const labels = { Converge: "true", Env: config.env, Dial: dial, ...(observer ? { Observe: "step" } : {}) };
|
|
89
|
+
const schedule = config.schedule ? { schedule: { cron: config.schedule, overlap: "skip" } } : {};
|
|
90
|
+
if (observer) {
|
|
91
|
+
// #2778: the observer step is the Observe phase, and its whole result is
|
|
92
|
+
// the tick's observation.
|
|
93
|
+
const observeStep = { ...observer, id: observer.id ?? "observe" };
|
|
94
|
+
const tickStep = activity("convergeTick", { opName: config.name, env: config.env, dial, budget, rules: config.rules, observed: stepOutput(observeStep.id) }, "longInfra");
|
|
95
|
+
tickStep.outcomeAttribute = { name: "Remediated", from: "remediated" };
|
|
96
|
+
const op = Op({
|
|
97
|
+
name: config.name,
|
|
98
|
+
overview: `Converge ${config.env}'s observed resources toward their declaration (dial: ${dial})`,
|
|
99
|
+
labels,
|
|
100
|
+
...schedule,
|
|
101
|
+
phases: [phase("Observe", [observeStep]), phase("Converge", [tickStep])],
|
|
102
|
+
});
|
|
103
|
+
return { op };
|
|
104
|
+
}
|
|
105
|
+
const live = config.live ?? true;
|
|
106
|
+
const snapshotStep = activity("lifecycleSnapshot", { env: config.env }, { id: "snapshot" });
|
|
107
|
+
const diffStep = activity("lifecycleDiff", { env: config.env, live }, { id: "diff", profile: "fastIdempotent" });
|
|
108
|
+
diffStep.outcomeAttribute = { name: "Drift", from: "drifted" };
|
|
109
|
+
// convergeTick's args are the rule table itself — too shaped (recursive
|
|
110
|
+
// predicates, a discriminated action union) for a hand-mirrored zod
|
|
111
|
+
// contract to earn its keep, the same "deliberately partial" call
|
|
112
|
+
// activity-contracts.ts already makes for kubectlApply/helmInstall's
|
|
113
|
+
// multi-field args. OPS012 skips an uncontracted `fn`, not flags it — see
|
|
114
|
+
// that module's doc. The `preflightDrift` step-output reference below is
|
|
115
|
+
// still fully validated: OPS013's producer-side checks only need
|
|
116
|
+
// `lifecycleDiff`'s own contract, which is registered.
|
|
117
|
+
const tickStep = activity("convergeTick", {
|
|
118
|
+
opName: config.name,
|
|
119
|
+
env: config.env,
|
|
120
|
+
dial,
|
|
121
|
+
budget,
|
|
122
|
+
rules: config.rules,
|
|
123
|
+
preflightDrift: diffStep.out.drifted,
|
|
124
|
+
}, "longInfra");
|
|
125
|
+
tickStep.outcomeAttribute = { name: "Remediated", from: "remediated" };
|
|
126
|
+
const op = Op({
|
|
127
|
+
name: config.name,
|
|
128
|
+
overview: `Converge the ${config.env} environment toward its declaration (dial: ${dial})`,
|
|
129
|
+
labels,
|
|
130
|
+
// Overlap (#1484 acceptance criterion: "skip-and-report when a prior
|
|
131
|
+
// remediation is in flight ... never queue"). `"skip"` is the only value
|
|
132
|
+
// `OpSchedule` has, and it means exactly that: a fire arriving while the
|
|
133
|
+
// previous tick still runs is dropped rather than queued or run
|
|
134
|
+
// alongside. There is no per-tick "in flight" ledger record for the
|
|
135
|
+
// skipped fire to produce — nothing ran, so nothing observed, classified,
|
|
136
|
+
// or dispatched.
|
|
137
|
+
...schedule,
|
|
138
|
+
phases: [phase("Observe", [snapshotStep, diffStep]), phase("Converge", [tickStep])],
|
|
139
|
+
});
|
|
140
|
+
return { op };
|
|
141
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Op composites (#2120) — the named verbs an operator authors instead of
|
|
3
|
+
* hand-writing phases: watch, reconcile, apply, converge, and the three audit
|
|
4
|
+
* runners.
|
|
5
|
+
*
|
|
6
|
+
* They lived in a hosting lexicon while a cadence meant a scheduler resource;
|
|
7
|
+
* now that the cadence is `OpConfig.schedule` they are runtime-neutral, each
|
|
8
|
+
* returns `{ op }`, and nothing here imports a hosting lexicon. A project that
|
|
9
|
+
* wants a real scheduler resource pairs one with the Op by hand (the pattern
|
|
10
|
+
* `lexicons/cedar/src/dogwood/replay-op.ts` documents).
|
|
11
|
+
*/
|
|
12
|
+
export { WatchOp } from "./watch-op.js";
|
|
13
|
+
export { ReconcileOp } from "./reconcile-op.js";
|
|
14
|
+
export { ApplyOp } from "./apply-op.js";
|
|
15
|
+
export { ConvergeOp } from "./converge-op.js";
|
|
16
|
+
export { WorkflowAuditOp } from "./workflow-audit-op.js";
|
|
17
|
+
export { PipelineAuditOp } from "./pipeline-audit-op.js";
|
|
18
|
+
export { LexiconUpgradeOp, IN_SCOPE_LEXICONS } from "./lexicon-upgrade-op.js";
|
|
19
|
+
export { BehaviourOp } from "./behaviour-op.js";
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LexiconUpgradeOp composite — the runner that dogfoods chant to keep each
|
|
3
|
+
* in-scope lexicon current with its upstream spec (#527, epic #523).
|
|
4
|
+
*
|
|
5
|
+
* The shared tooling (#524) does the regen + surface-diff; the pinned (#525)
|
|
6
|
+
* and rolling (#526) pipelines do the detection. This Op wires them into an
|
|
7
|
+
* audit-style operational layer, modeled on `WorkflowAuditOp` / `PipelineAuditOp`:
|
|
8
|
+
* phases detect → run the right check for the lexicon → surface-diff → finding.
|
|
9
|
+
*
|
|
10
|
+
* It runs one-shot on the **local Op executor** via `chant run` — nothing
|
|
11
|
+
* durable is required for an upgrade check (the scheduled CI runner is the
|
|
12
|
+
* trigger). A `schedule` may still be supplied for continuous re-check; it
|
|
13
|
+
* lands on the Op itself (#2120).
|
|
14
|
+
*
|
|
15
|
+
* Lexicon classification (which check the activity dispatches to):
|
|
16
|
+
* ROLLING {aws, azure, github, fly} → checkRollingUpgrade
|
|
17
|
+
* PINNED any other lexicon whose plugin declares `upstreamPin`
|
|
18
|
+
* (k8s, k3s, gcp, docker, gitlab, cedar, sql, ...) → checkPinnedUpgrade
|
|
19
|
+
* The pinned set is discovered from the plugin at run time, the way `chant dev
|
|
20
|
+
* pinned-upgrade` does. A pin that moves with other constants (`alsoMoves`, as
|
|
21
|
+
* sql's version plus digest) is report-only. helm / forgejo are excluded: no
|
|
22
|
+
* upstream spec.
|
|
23
|
+
*
|
|
24
|
+
* Finding-modes mirror ReconcileOp: `report` (default, no external services)
|
|
25
|
+
* | `issue` | `pull-request`. For the epic goal, `pull-request` opens/updates a
|
|
26
|
+
* long-lived branch per lexicon.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* // one-shot, local executor, report only
|
|
31
|
+
* export const { op } = LexiconUpgradeOp({ lexicon: "aws" });
|
|
32
|
+
*
|
|
33
|
+
* // weekly, opening a PR when an upgrade is ready
|
|
34
|
+
* export const { op } = LexiconUpgradeOp({
|
|
35
|
+
* lexicon: "k8s",
|
|
36
|
+
* schedule: "0 6 * * 1",
|
|
37
|
+
* onFinding: "pull-request",
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @see #524 — shared regen-validate + surface-diff tooling.
|
|
42
|
+
* @see #525 — pinned-version bump pipeline.
|
|
43
|
+
* @see #526 — rolling-spec drift pipeline.
|
|
44
|
+
*/
|
|
45
|
+
import { Op, phase } from "../builders.js";
|
|
46
|
+
/**
|
|
47
|
+
* The lexicons known to be in scope. This is not a gate: a lexicon that declares
|
|
48
|
+
* `upstreamPin` is dispatched without being listed. helm / forgejo are excluded
|
|
49
|
+
* (no upstream spec).
|
|
50
|
+
*/
|
|
51
|
+
export const IN_SCOPE_LEXICONS = [
|
|
52
|
+
"k8s",
|
|
53
|
+
"k3s",
|
|
54
|
+
"sql",
|
|
55
|
+
"gcp",
|
|
56
|
+
"docker",
|
|
57
|
+
"gitlab",
|
|
58
|
+
"aws",
|
|
59
|
+
"azure",
|
|
60
|
+
"github",
|
|
61
|
+
"fly",
|
|
62
|
+
"cedar",
|
|
63
|
+
];
|
|
64
|
+
const EXCLUDED_LEXICONS = new Set(["helm", "forgejo"]);
|
|
65
|
+
/**
|
|
66
|
+
* Build a LexiconUpgradeOp for one lexicon. Rejects the lexicons with no
|
|
67
|
+
* upstream spec at construction time. Whether any other name declares a pin is
|
|
68
|
+
* only known by loading its plugin, so the activity checks that at run time and
|
|
69
|
+
* fails with a clear message for a name that has none.
|
|
70
|
+
*/
|
|
71
|
+
export function LexiconUpgradeOp(config) {
|
|
72
|
+
if (EXCLUDED_LEXICONS.has(config.lexicon)) {
|
|
73
|
+
throw new Error(`LexiconUpgradeOp: "${config.lexicon}" is not in scope. ` +
|
|
74
|
+
`Known lexicons: ${IN_SCOPE_LEXICONS.join(", ")}, and any lexicon declaring upstreamPin ` +
|
|
75
|
+
`(helm, forgejo have no upstream spec).`);
|
|
76
|
+
}
|
|
77
|
+
const name = config.name ?? `${config.lexicon}-upgrade`;
|
|
78
|
+
const onFinding = config.onFinding ?? "report";
|
|
79
|
+
const op = Op({
|
|
80
|
+
name,
|
|
81
|
+
overview: "Detect a newer upstream spec for the lexicon, regen + validate, and surface the API-surface delta",
|
|
82
|
+
labels: {
|
|
83
|
+
Upgrade: "true",
|
|
84
|
+
Lexicon: config.lexicon,
|
|
85
|
+
},
|
|
86
|
+
...(config.schedule ? { schedule: { cron: config.schedule, overlap: "skip" } } : {}),
|
|
87
|
+
phases: [
|
|
88
|
+
phase("Upgrade", [
|
|
89
|
+
{
|
|
90
|
+
kind: "activity",
|
|
91
|
+
fn: "lexiconUpgrade",
|
|
92
|
+
args: {
|
|
93
|
+
lexicon: config.lexicon,
|
|
94
|
+
...(config.lexiconDir ? { lexiconDir: config.lexiconDir } : {}),
|
|
95
|
+
...(config.pin ? { pin: config.pin } : {}),
|
|
96
|
+
mode: onFinding,
|
|
97
|
+
},
|
|
98
|
+
// Surface whether a PR-worthy upgrade was found as the run's
|
|
99
|
+
// `HasUpgrade` outcome on the run ledger, so a reader can pick out
|
|
100
|
+
// the lexicons with an upgrade ready.
|
|
101
|
+
outcomeAttribute: { name: "HasUpgrade", from: "hasUpgrade" },
|
|
102
|
+
},
|
|
103
|
+
]),
|
|
104
|
+
],
|
|
105
|
+
});
|
|
106
|
+
return { op };
|
|
107
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PipelineAuditOp composite — the live include/component audit of GitLab
|
|
3
|
+
* pipelines as a chant Op with an optional schedule (#303).
|
|
4
|
+
*
|
|
5
|
+
* The gitlab post-synth checks (#297) own everything answerable from the
|
|
6
|
+
* deterministic build. This Op owns *only* the checks that require live
|
|
7
|
+
* resolution against a moving upstream truth — a pinned component/include ref
|
|
8
|
+
* that no longer resolves, an archived or moved upstream project, or a new
|
|
9
|
+
* advisory covering a component/image in use. It sits at **observe** on the
|
|
10
|
+
* lifecycle dial, with a finding-mode (`report | issue | merge-request`) as the
|
|
11
|
+
* **reconcile** step — for GitLab the PR mode is a merge request.
|
|
12
|
+
*
|
|
13
|
+
* Runs one-shot on the local Op executor via `chant run`; a `schedule` puts
|
|
14
|
+
* the cadence on the Op itself (#2120).
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* export const { op } = PipelineAuditOp({
|
|
19
|
+
* name: "pipeline-audit",
|
|
20
|
+
* schedule: "0 6 * * *",
|
|
21
|
+
* onFinding: "merge-request",
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @see #297 — the deterministic counterpart this freshens.
|
|
26
|
+
*/
|
|
27
|
+
import { Op, phase } from "../builders.js";
|
|
28
|
+
export function PipelineAuditOp(config) {
|
|
29
|
+
const onFinding = config.onFinding ?? "report";
|
|
30
|
+
const op = Op({
|
|
31
|
+
name: config.name,
|
|
32
|
+
overview: "Resolve pipeline include/component/image references against live upstreams and report drift",
|
|
33
|
+
labels: {
|
|
34
|
+
Audit: "true",
|
|
35
|
+
Surface: "gitlab-pipeline",
|
|
36
|
+
},
|
|
37
|
+
...(config.schedule ? { schedule: { cron: config.schedule, overlap: "skip" } } : {}),
|
|
38
|
+
phases: [
|
|
39
|
+
phase("Audit", [
|
|
40
|
+
{
|
|
41
|
+
kind: "activity",
|
|
42
|
+
fn: "pipelineSupplyChainAudit",
|
|
43
|
+
args: { pipelineFile: config.pipelineFile ?? ".gitlab-ci.yml", mode: onFinding },
|
|
44
|
+
outcomeAttribute: { name: "Findings", from: "findings" },
|
|
45
|
+
},
|
|
46
|
+
]),
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
return { op };
|
|
50
|
+
}
|