@intentius/chant 0.124.12 → 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.d.ts +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- 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.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- 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.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.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.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- 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.d.ts +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- 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 +36 -6
- 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/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -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/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -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/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- 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 +5 -30
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/** Every level, most disruptive last — also the guard core validates a lexicon's answer against. */
|
|
2
|
+
export const DISRUPTION_LEVELS = [
|
|
3
|
+
"in-place",
|
|
4
|
+
"rolling",
|
|
5
|
+
"replace",
|
|
6
|
+
"destroy",
|
|
7
|
+
"unknown",
|
|
8
|
+
];
|
|
9
|
+
/** Ordering for "the worst thing in this plan", with `unknown` above every confident verdict. */
|
|
10
|
+
const DISRUPTION_RANK = {
|
|
11
|
+
"in-place": 0,
|
|
12
|
+
rolling: 1,
|
|
13
|
+
replace: 2,
|
|
14
|
+
destroy: 3,
|
|
15
|
+
unknown: 4,
|
|
16
|
+
};
|
|
17
|
+
/** The verdict every fallback path produces. */
|
|
18
|
+
export function unknownDisruption(detail) {
|
|
19
|
+
return { disruption: "unknown", detail };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Annotate one lexicon's change set with a disruption verdict per `update`.
|
|
23
|
+
*
|
|
24
|
+
* Only `update` entries are asked about: every other action already carries its
|
|
25
|
+
* blast radius in the action itself. Called once per lexicon, before the plan
|
|
26
|
+
* merges the change sets, so `classify` is always the lexicon that produced the
|
|
27
|
+
* entries — the only party that can map its own observation's attribute paths
|
|
28
|
+
* back onto spec properties.
|
|
29
|
+
*
|
|
30
|
+
* Returns a new change set; the input is not mutated.
|
|
31
|
+
*/
|
|
32
|
+
export async function annotateDisruption(cs, environment, classify) {
|
|
33
|
+
const updates = cs.entries.filter((e) => e.action === "update");
|
|
34
|
+
if (updates.length === 0)
|
|
35
|
+
return cs;
|
|
36
|
+
const who = updates[0].lexicon ? `the ${updates[0].lexicon} lexicon` : "this lexicon";
|
|
37
|
+
let verdicts = {};
|
|
38
|
+
let fallback;
|
|
39
|
+
if (!classify) {
|
|
40
|
+
fallback = `${who} does not classify disruption — replacement semantics are spec knowledge it has not published`;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
try {
|
|
44
|
+
verdicts = (await classify({
|
|
45
|
+
environment,
|
|
46
|
+
changes: updates.map((e) => ({
|
|
47
|
+
name: e.name,
|
|
48
|
+
...(e.type ? { type: e.type } : {}),
|
|
49
|
+
deltas: e.deltas ?? [],
|
|
50
|
+
})),
|
|
51
|
+
})) ?? {};
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
// A broken classifier is not evidence of anything. It must not be able to
|
|
55
|
+
// leave a confident verdict behind, and it must not fail the plan either.
|
|
56
|
+
verdicts = {};
|
|
57
|
+
fallback = `${who}'s disruption classifier failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const entries = cs.entries.map((e) => {
|
|
61
|
+
if (e.action !== "update")
|
|
62
|
+
return e;
|
|
63
|
+
const verdict = resolveVerdict(verdicts[e.name], fallback, who);
|
|
64
|
+
const annotated = {
|
|
65
|
+
...e,
|
|
66
|
+
disruption: verdict.disruption,
|
|
67
|
+
...(verdict.because && verdict.because.length > 0 ? { disruptionBecause: verdict.because } : {}),
|
|
68
|
+
...(verdict.detail ? { disruptionDetail: verdict.detail } : {}),
|
|
69
|
+
};
|
|
70
|
+
return annotated;
|
|
71
|
+
});
|
|
72
|
+
return { ...cs, entries };
|
|
73
|
+
}
|
|
74
|
+
function resolveVerdict(verdict, fallback, who) {
|
|
75
|
+
if (fallback)
|
|
76
|
+
return unknownDisruption(fallback);
|
|
77
|
+
if (!verdict)
|
|
78
|
+
return unknownDisruption(`${who} returned no verdict for this change`);
|
|
79
|
+
if (!DISRUPTION_LEVELS.includes(verdict.disruption)) {
|
|
80
|
+
return unknownDisruption(`${who} returned "${String(verdict.disruption)}", which is not a disruption level`);
|
|
81
|
+
}
|
|
82
|
+
return verdict;
|
|
83
|
+
}
|
|
84
|
+
/** Count `update` entries per level. Entries with no verdict at all are not counted. */
|
|
85
|
+
export function summarizeDisruption(cs) {
|
|
86
|
+
const counts = {
|
|
87
|
+
"in-place": 0,
|
|
88
|
+
rolling: 0,
|
|
89
|
+
replace: 0,
|
|
90
|
+
destroy: 0,
|
|
91
|
+
unknown: 0,
|
|
92
|
+
};
|
|
93
|
+
for (const e of cs.entries) {
|
|
94
|
+
if (e.action === "update" && e.disruption)
|
|
95
|
+
counts[e.disruption]++;
|
|
96
|
+
}
|
|
97
|
+
return counts;
|
|
98
|
+
}
|
|
99
|
+
/** The most disruptive verdict in the set, or undefined when nothing was classified. */
|
|
100
|
+
export function worstDisruption(cs) {
|
|
101
|
+
let worst;
|
|
102
|
+
for (const e of cs.entries) {
|
|
103
|
+
if (e.action !== "update" || !e.disruption)
|
|
104
|
+
continue;
|
|
105
|
+
if (!worst || DISRUPTION_RANK[e.disruption] > DISRUPTION_RANK[worst])
|
|
106
|
+
worst = e.disruption;
|
|
107
|
+
}
|
|
108
|
+
return worst;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Warnings a plan should print on stderr — so a `--json` or `--report gitlab-mr`
|
|
112
|
+
* consumer, whose shape has no column for disruption, still hears about the
|
|
113
|
+
* expensive rows. Same discipline as the unobserved warning (#1089).
|
|
114
|
+
*/
|
|
115
|
+
export function disruptionNotices(cs) {
|
|
116
|
+
const counts = summarizeDisruption(cs);
|
|
117
|
+
const notices = [];
|
|
118
|
+
const replacing = counts.replace + counts.destroy;
|
|
119
|
+
if (replacing > 0) {
|
|
120
|
+
notices.push(`${replacing} update(s) replace the resource rather than mutating it in place` +
|
|
121
|
+
(counts.destroy > 0
|
|
122
|
+
? `, ${counts.destroy} of them by deleting it first — that window has nothing in it.`
|
|
123
|
+
: "."));
|
|
124
|
+
}
|
|
125
|
+
if (counts.unknown > 0) {
|
|
126
|
+
notices.push(`${counts.unknown} update(s) could not be classified — no lexicon could say whether applying them replaces the resource. Unknown is not "in place".`);
|
|
127
|
+
}
|
|
128
|
+
return notices;
|
|
129
|
+
}
|
|
130
|
+
/** Render one entry's verdict for the human plan, or "" when there is none. */
|
|
131
|
+
export function renderDisruption(entry) {
|
|
132
|
+
if (!entry.disruption)
|
|
133
|
+
return "";
|
|
134
|
+
return ` — ${entry.disruption}${entry.disruptionDetail ? `: ${entry.disruptionDetail}` : ""}`;
|
|
135
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The approvals a wave applied under, and the rule that spends them (#3784).
|
|
3
|
+
*
|
|
4
|
+
* terragucci's wave gate writes one line to `_gates/<op>/applied.jsonl` on
|
|
5
|
+
* `chant/lifecycle` before a wave applies under an approval: the gate, the
|
|
6
|
+
* digest, and the approval's own timestamp. From then on that approval is
|
|
7
|
+
* spent. It does not let the same digest through again, and it no longer
|
|
8
|
+
* stands as the approval of another digest either. Op waves write the same
|
|
9
|
+
* line, in the same file, when their spec sets `approvals.spend`, and
|
|
10
|
+
* `decideGateApproval` (`../gate-decision.ts`) and `evaluateGate`
|
|
11
|
+
* (`../op/gate.ts`) take the lines to leave spent approvals out.
|
|
12
|
+
*
|
|
13
|
+
* The file sits in a directory under `_gates/`, so the readers of
|
|
14
|
+
* `_gates/<op>.jsonl` never see its lines. {@link appliedGateApplies} hands
|
|
15
|
+
* them to `gate-audit` as applies, each tied to the approval it ran under.
|
|
16
|
+
*
|
|
17
|
+
* Pure: no git, no clock, no file. It bundles into `@intentius/chant/gate-decision`.
|
|
18
|
+
*/
|
|
19
|
+
import { samePlanDigest } from "./plan-digest.js";
|
|
20
|
+
/** Where the applied lines of `op` live on `chant/lifecycle`: the directory and the file, as `writeBlobToPath` takes them. */
|
|
21
|
+
export function appliedGatePath(op) {
|
|
22
|
+
return { dir: `_gates/${op}`, file: "applied.jsonl" };
|
|
23
|
+
}
|
|
24
|
+
/** The applied lines of an `applied.jsonl` file, oldest first. A line that is not one is skipped. */
|
|
25
|
+
export function parseAppliedGateLines(text) {
|
|
26
|
+
const out = [];
|
|
27
|
+
for (const line of text.split("\n").map((l) => l.trim()).filter(Boolean)) {
|
|
28
|
+
let r;
|
|
29
|
+
try {
|
|
30
|
+
r = JSON.parse(line);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (r?.version === 1 && r.kind === "applied" && typeof r.op === "string" && typeof r.gate === "string" &&
|
|
36
|
+
typeof r.planDigest === "string" && typeof r.approvedAt === "string" && typeof r.timestamp === "string") {
|
|
37
|
+
out.push({ approvedBy: "", ...r });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
const time = (iso) => new Date(iso).getTime();
|
|
43
|
+
/**
|
|
44
|
+
* Every line of an `applied.jsonl` file a resume reads (#3858): the
|
|
45
|
+
* `applied` and `changes` lines, and the `finished` lines that say how an
|
|
46
|
+
* apply ended. Oldest first; a line that is none of them is skipped.
|
|
47
|
+
*/
|
|
48
|
+
export function parseAppliedGateFile(text) {
|
|
49
|
+
const applied = [];
|
|
50
|
+
const finished = [];
|
|
51
|
+
for (const line of text.split("\n").map((l) => l.trim()).filter(Boolean)) {
|
|
52
|
+
let r;
|
|
53
|
+
try {
|
|
54
|
+
r = JSON.parse(line);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (r?.version !== 1 || typeof r.gate !== "string" || typeof r.planDigest !== "string" || typeof r.timestamp !== "string")
|
|
60
|
+
continue;
|
|
61
|
+
if ((r.kind === "applied" || r.kind === "changes") && typeof r.approvedAt === "string") {
|
|
62
|
+
applied.push({ op: "", approvedBy: "", ...r });
|
|
63
|
+
}
|
|
64
|
+
else if (r.kind === "finished" && typeof r.applied === "string" && (r.result === "applied" || r.result === "failed")) {
|
|
65
|
+
finished.push({ op: "", ...r });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { applied, finished };
|
|
69
|
+
}
|
|
70
|
+
/** The finished line for the apply `line` names, or undefined while it has none. */
|
|
71
|
+
export function finishedApply(finished, line) {
|
|
72
|
+
return finished.find((f) => f.gate === line.gate && samePlanDigest(f.planDigest, line.planDigest) && time(f.applied) === time(line.timestamp));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Whether an approval is spent: a wave applied under an approval of the same
|
|
76
|
+
* gate and digest made at or after it. One that names no digest is never
|
|
77
|
+
* spent. With `review`, an approval that came from a pull request's review
|
|
78
|
+
* is spent too when a wave applied this digest under a review of the same
|
|
79
|
+
* head, so the review cannot be recorded again to pass the digest twice. A
|
|
80
|
+
* review not yet recorded has no `timestamp`.
|
|
81
|
+
*/
|
|
82
|
+
export function isApprovalSpent(applied, approval) {
|
|
83
|
+
const digest = approval.planDigest;
|
|
84
|
+
if (digest === undefined)
|
|
85
|
+
return false;
|
|
86
|
+
return applied.some((a) => a.gate === approval.gate &&
|
|
87
|
+
samePlanDigest(a.planDigest, digest) &&
|
|
88
|
+
((approval.timestamp !== undefined && time(a.approvedAt) >= time(approval.timestamp)) ||
|
|
89
|
+
(approval.review?.head !== undefined && a.review?.head === approval.review.head)));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The applied lines as `gate-audit` applies: each an `applied` entry tied to
|
|
93
|
+
* the approval it ran under. `ref` names the file, `_gates/<op>/applied.jsonl`
|
|
94
|
+
* by default; each line's index is appended so ids stay stable.
|
|
95
|
+
*/
|
|
96
|
+
export function appliedGateApplies(records, ref) {
|
|
97
|
+
return records.map((r, i) => ({
|
|
98
|
+
ref: `${ref ?? `_gates/${r.op}/applied.jsonl`}#${i + 1}`,
|
|
99
|
+
at: r.timestamp,
|
|
100
|
+
gate: r.gate,
|
|
101
|
+
op: r.op,
|
|
102
|
+
digest: r.planDigest,
|
|
103
|
+
approval: "required",
|
|
104
|
+
detail: {
|
|
105
|
+
approvedAt: r.approvedAt,
|
|
106
|
+
approvedBy: r.approvedBy,
|
|
107
|
+
...(r.wave ? { wave: r.wave } : {}),
|
|
108
|
+
...(r.review ? { review: r.review } : {}),
|
|
109
|
+
...(r.runId ? { runId: r.runId } : {}),
|
|
110
|
+
...(r.commit ? { commit: r.commit } : {}),
|
|
111
|
+
},
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An audit trail from the gate ledger (#3764, decision #3756). Pure: ledger
|
|
3
|
+
* lines (and, if the product has them, the applies that ran under a gate) go
|
|
4
|
+
* in; typed entries and the gaps they show come out. It reads no git, no
|
|
5
|
+
* clock and no file, so it bundles into a product's single CI file
|
|
6
|
+
* (`gate-audit-bundle.test.ts` holds the import graph).
|
|
7
|
+
*
|
|
8
|
+
* Both products derived this themselves: terragucci's `report/audit.ts` and
|
|
9
|
+
* SQL Yodeler's `report/audit.ts` each parse `_gates/<op>.jsonl`. Storage
|
|
10
|
+
* (an append-only record, a bucket, a history table) and rendering stay with
|
|
11
|
+
* them.
|
|
12
|
+
*
|
|
13
|
+
* ## Entries
|
|
14
|
+
*
|
|
15
|
+
* | kind | source line |
|
|
16
|
+
* |----------------------|------------------------------------------------------------------|
|
|
17
|
+
* | `approval-requested` | a pending fact of a gate that is not an override |
|
|
18
|
+
* | `approved` | a resolution of such a gate (seal, approver, review, relay) |
|
|
19
|
+
* | `override-requested` | a pending fact of an override gate: a denial that waits |
|
|
20
|
+
* | `override-recorded` | a resolution of an override gate (reason in `note`) |
|
|
21
|
+
* | `revoked` | a resolution a commit removed from the file (`subject` says which) |
|
|
22
|
+
* | `applied` | an apply the caller passes in, with the approval it ran under |
|
|
23
|
+
* | `override-spent` | an override an apply the caller passes in cites |
|
|
24
|
+
*
|
|
25
|
+
* An override gate is, by default, any gate of the op `policy-override`
|
|
26
|
+
* (terragucci writes one gate per root) or named `override-<rule>` (SQL
|
|
27
|
+
* Yodeler's `yodel override`). chant's override gate (#3760,
|
|
28
|
+
* `../override-gate.ts`) records under the op `policy-override`, so the
|
|
29
|
+
* default reads it, and its `overrideAuditApplies` turns applied records into
|
|
30
|
+
* applies that cite the override they spent. {@link GateAuditOptions.isOverride}
|
|
31
|
+
* replaces the rule. Anything a line carries beyond the typed fields is kept in
|
|
32
|
+
* `detail`, and `kind` is checked against {@link GATE_AUDIT_KINDS} only by
|
|
33
|
+
* the type, never by the reader.
|
|
34
|
+
*
|
|
35
|
+
* ## Gaps
|
|
36
|
+
*
|
|
37
|
+
* - `approval-without-request`: a resolution with no pending fact of its gate
|
|
38
|
+
* before it (or none for its digest). Overrides are exempt: both products
|
|
39
|
+
* may record one without a denial on file.
|
|
40
|
+
* - `unsealed`: an approval or override with neither a seal nor a pull
|
|
41
|
+
* request review, where {@link GateAuditOptions.sealed} says the gate needs
|
|
42
|
+
* one.
|
|
43
|
+
* - `approval`: an apply with a digest that no approval of its gate holds
|
|
44
|
+
* for that digest, recorded at or before the apply. Needs `approval:
|
|
45
|
+
* "not-required"` to be waived, as a baseline or a policy that asked for
|
|
46
|
+
* no approval does.
|
|
47
|
+
* - `override`: an apply cites an override that no line holds.
|
|
48
|
+
* - `malformed-line`: a line that is not a gate record. Its content is lost
|
|
49
|
+
* to the trail, so it is said.
|
|
50
|
+
*
|
|
51
|
+
* ## Sources and ids
|
|
52
|
+
*
|
|
53
|
+
* Every ledger entry's `source` names the line it came from: `path`, `line`
|
|
54
|
+
* (the line's own `line` when given, which {@link gateLedgerLines} fills
|
|
55
|
+
* with the file's line number, else its 1-based place in `ledger.lines`),
|
|
56
|
+
* and `text`, exactly as passed in, when the line was given as text. When the
|
|
57
|
+
* line came from {@link gateLedgerLinesFromLog}, `source.author` is the
|
|
58
|
+
* author of the commit that added it (or, for a revocation, removed it), and
|
|
59
|
+
* resolutions also carry it as `committedBy`. Under `approval: ledger` that
|
|
60
|
+
* is the only check on who pushed an approval: anyone who can push may write
|
|
61
|
+
* any `resolvedBy`.
|
|
62
|
+
*
|
|
63
|
+
* The default `id` is a digest over the source and the record. A product
|
|
64
|
+
* that already holds ids of its own (an append-only record whose ids
|
|
65
|
+
* customers keep) passes {@link GateAuditOptions.id}, which gets each entry
|
|
66
|
+
* with its default id and returns the id to use. `under` links follow it.
|
|
67
|
+
*
|
|
68
|
+
* ## Seal and review
|
|
69
|
+
*
|
|
70
|
+
* `seal` names how the approval came to be: `review` when the line came
|
|
71
|
+
* through a forge review (`via: "pr-review"`, or a `review` field), else
|
|
72
|
+
* `sealed` when it carries an ssh seal, else `unsigned`. A pull request
|
|
73
|
+
* approval that `chant approve` also sealed is still `review`: the review is
|
|
74
|
+
* what authorised it, and the seal attests who wrote the line. That fact is
|
|
75
|
+
* kept apart as `sealed: true` with its `signer`, on any entry whose line
|
|
76
|
+
* holds a seal. terragucci classifies the same way.
|
|
77
|
+
*/
|
|
78
|
+
import { canonicalJson } from "../effect-receipt.js";
|
|
79
|
+
import { contentDigest } from "../content-digest.js";
|
|
80
|
+
import { samePlanDigest } from "./plan-digest.js";
|
|
81
|
+
export const GATE_AUDIT_KINDS = [
|
|
82
|
+
"approval-requested",
|
|
83
|
+
"approved",
|
|
84
|
+
"override-requested",
|
|
85
|
+
"override-recorded",
|
|
86
|
+
"revoked",
|
|
87
|
+
"applied",
|
|
88
|
+
"override-spent",
|
|
89
|
+
];
|
|
90
|
+
export const POLICY_OVERRIDE_OP = "policy-override";
|
|
91
|
+
/** The default {@link GateAuditOptions.isOverride}. */
|
|
92
|
+
export function isOverrideGate(op, gate) {
|
|
93
|
+
return op === POLICY_OVERRIDE_OP || gate.startsWith("override-");
|
|
94
|
+
}
|
|
95
|
+
const KNOWN = new Set([
|
|
96
|
+
"version", "kind", "op", "gate", "resolvedBy", "relayedBy", "timestamp", "note", "url", "planDigest", "environment",
|
|
97
|
+
"approver", "seal", "review", "runId", "expiresAt", "description", "wave", "rules", "pr", "head", "reviewers",
|
|
98
|
+
]);
|
|
99
|
+
const waveOf = (v) => {
|
|
100
|
+
const w = v;
|
|
101
|
+
return w && typeof w === "object" && typeof w.number === "number" && typeof w.name === "string" ? { number: w.number, name: w.name, ...(typeof w.op === "string" ? { op: w.op } : {}) } : undefined;
|
|
102
|
+
};
|
|
103
|
+
const str = (v) => (typeof v === "string" && v !== "" ? v : undefined);
|
|
104
|
+
const strings = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === "string") : undefined);
|
|
105
|
+
const time = (iso) => Date.parse(iso) || 0;
|
|
106
|
+
function rowOf(line) {
|
|
107
|
+
let v = line.record;
|
|
108
|
+
if (v === undefined && line.text !== undefined) {
|
|
109
|
+
try {
|
|
110
|
+
v = JSON.parse(line.text);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return v && typeof v === "object" && !Array.isArray(v) ? v : undefined;
|
|
117
|
+
}
|
|
118
|
+
function sealOf(r) {
|
|
119
|
+
const s = r.seal;
|
|
120
|
+
const signed = s && s.signature ? { sealed: true, ...(str(s.signer) ? { signer: str(s.signer) } : {}) } : undefined;
|
|
121
|
+
if (r.review || r.via === "pr-review")
|
|
122
|
+
return { seal: "review", ...signed };
|
|
123
|
+
return signed ? { seal: "sealed", ...signed } : { seal: "unsigned" };
|
|
124
|
+
}
|
|
125
|
+
function reviewOf(r) {
|
|
126
|
+
const rv = (r.review ?? undefined);
|
|
127
|
+
const pr = typeof rv?.pr === "number" ? rv.pr : typeof r.pr === "number" ? r.pr : undefined;
|
|
128
|
+
const head = str(rv?.head) ?? str(r.head);
|
|
129
|
+
const approvers = strings(rv?.approvers) ?? strings(r.reviewers);
|
|
130
|
+
if (pr === undefined && head === undefined && approvers === undefined)
|
|
131
|
+
return undefined;
|
|
132
|
+
return { ...(pr !== undefined ? { pr } : {}), ...(head ? { head } : {}), ...(approvers ? { approvers } : {}) };
|
|
133
|
+
}
|
|
134
|
+
function approverOf(r) {
|
|
135
|
+
const a = r.approver;
|
|
136
|
+
if (!a || typeof a.kind !== "string")
|
|
137
|
+
return undefined;
|
|
138
|
+
const roles = strings(a.roles);
|
|
139
|
+
return { kind: a.kind, ...(roles ? { roles } : {}) };
|
|
140
|
+
}
|
|
141
|
+
const drop = (o) => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined));
|
|
142
|
+
const idOf = (...parts) => contentDigest(canonicalJson(parts));
|
|
143
|
+
/** Whether two digests, either absent, can be the same plan: absent matches anything, as an old line records none. */
|
|
144
|
+
const compatible = (a, b) => a === undefined || b === undefined || samePlanDigest(a, b);
|
|
145
|
+
/** The entries `input` adds up to, oldest first, and the gaps they show. */
|
|
146
|
+
export function deriveGateAudit(input) {
|
|
147
|
+
const isOverride = input.isOverride ?? isOverrideGate;
|
|
148
|
+
const rekey = input.id;
|
|
149
|
+
const keyed = (e) => (rekey ? { ...e, id: rekey(e) } : e);
|
|
150
|
+
const entries = [];
|
|
151
|
+
const gaps = [];
|
|
152
|
+
for (const ledger of input.ledgers) {
|
|
153
|
+
const path = ledger.path ?? `_gates/${ledger.op}.jsonl`;
|
|
154
|
+
const parsed = [];
|
|
155
|
+
for (const [i, line] of ledger.lines.entries()) {
|
|
156
|
+
const r = rowOf(line);
|
|
157
|
+
const pending = r?.kind === "pending";
|
|
158
|
+
const ok = r && r.version === 1 && typeof r.gate === "string" && typeof r.timestamp === "string" && (pending || typeof r.resolvedBy === "string");
|
|
159
|
+
if (!r || !ok) {
|
|
160
|
+
gaps.push({ kind: "malformed-line", op: ledger.op, detail: `${path} holds a line that is not a gate record${line.commit ? ` (commit ${line.commit})` : ""}: ${(line.text ?? JSON.stringify(line.record) ?? "").slice(0, 80)}` });
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
parsed.push({ line, n: line.line ?? i + 1, r, pending });
|
|
164
|
+
}
|
|
165
|
+
// Each denial an override answers: the newest pending fact of its gate and digest.
|
|
166
|
+
const denials = new Map();
|
|
167
|
+
const requests = [];
|
|
168
|
+
for (const p of parsed) {
|
|
169
|
+
if (!p.pending || p.line.removed)
|
|
170
|
+
continue;
|
|
171
|
+
const digest = str(p.r.planDigest);
|
|
172
|
+
denials.set(`${String(p.r.gate)}\n${digest ?? ""}`, p.r);
|
|
173
|
+
requests.push({ op: ledger.op, gate: String(p.r.gate), at: time(String(p.r.timestamp)), ...(digest ? { digest } : {}), ...(str(p.r.environment) ? { environment: str(p.r.environment) } : {}) });
|
|
174
|
+
}
|
|
175
|
+
for (const { line, n, r, pending } of parsed) {
|
|
176
|
+
const gate = String(r.gate);
|
|
177
|
+
const override = isOverride(ledger.op, gate);
|
|
178
|
+
const removed = line.removed;
|
|
179
|
+
if (pending && removed)
|
|
180
|
+
continue;
|
|
181
|
+
const digest = str(r.planDigest);
|
|
182
|
+
const author = removed ?? line.added;
|
|
183
|
+
const source = {
|
|
184
|
+
path,
|
|
185
|
+
op: ledger.op,
|
|
186
|
+
line: n,
|
|
187
|
+
...(line.text !== undefined ? { text: line.text } : {}),
|
|
188
|
+
...(line.commit ? { commit: line.commit } : {}),
|
|
189
|
+
...(author ? { author } : {}),
|
|
190
|
+
change: removed ? "removed" : "added",
|
|
191
|
+
};
|
|
192
|
+
const id = idOf(removed ? "removed" : "ledger", path, line.commit ?? null, r);
|
|
193
|
+
const extra = Object.fromEntries(Object.entries(r).filter(([k]) => !KNOWN.has(k)));
|
|
194
|
+
const base = { id, gate, op: ledger.op, ...(digest ? { digest } : {}), source };
|
|
195
|
+
if (pending) {
|
|
196
|
+
entries.push(keyed({
|
|
197
|
+
...base,
|
|
198
|
+
kind: override ? "override-requested" : "approval-requested",
|
|
199
|
+
at: String(r.timestamp),
|
|
200
|
+
...drop({ runId: str(r.runId), expiresAt: str(r.expiresAt), description: str(r.description), url: str(r.url), rules: strings(r.rules), wave: waveOf(r.wave) }),
|
|
201
|
+
detail: extra,
|
|
202
|
+
}));
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const { seal, sealed, signer } = sealOf(r);
|
|
206
|
+
if (removed) {
|
|
207
|
+
entries.push(keyed({
|
|
208
|
+
...base,
|
|
209
|
+
kind: "revoked",
|
|
210
|
+
at: removed.at,
|
|
211
|
+
...(removed.by ? { by: removed.by } : {}),
|
|
212
|
+
subject: override ? "override" : "approval",
|
|
213
|
+
seal,
|
|
214
|
+
...(sealed ? { sealed } : {}),
|
|
215
|
+
detail: { ...extra, approvedBy: r.resolvedBy, approvedAt: r.timestamp, ...(signer ? { signer } : {}) },
|
|
216
|
+
}));
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const denial = override ? denials.get(`${gate}\n${digest ?? ""}`) : undefined;
|
|
220
|
+
const rules = strings(denial?.rules) ?? (override && gate.startsWith("override-") ? [gate.slice("override-".length)] : undefined);
|
|
221
|
+
const entry = keyed({
|
|
222
|
+
...base,
|
|
223
|
+
kind: override ? "override-recorded" : "approved",
|
|
224
|
+
at: String(r.timestamp),
|
|
225
|
+
by: String(r.resolvedBy),
|
|
226
|
+
seal,
|
|
227
|
+
...drop({ sealed, signer, committedBy: line.added?.by, relayedBy: str(r.relayedBy), approver: approverOf(r), note: str(r.note), url: str(r.url), review: reviewOf(r), rules }),
|
|
228
|
+
detail: extra,
|
|
229
|
+
});
|
|
230
|
+
entries.push(entry);
|
|
231
|
+
if (!override) {
|
|
232
|
+
const at = time(entry.at);
|
|
233
|
+
const env = str(r.environment);
|
|
234
|
+
const asked = requests.some((q) => q.gate === gate && q.at <= at && compatible(q.digest, digest) && (q.environment === undefined || env === undefined || q.environment === env));
|
|
235
|
+
if (!asked) {
|
|
236
|
+
gaps.push({ kind: "approval-without-request", op: ledger.op, gate, ...(digest ? { digest } : {}), detail: `${path} holds an approval of ${gate} by ${entry.by} at ${entry.at} with no pending fact of that gate${digest ? " and digest" : ""} before it` });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (seal === "unsigned" && input.sealed?.(ledger.op, gate)) {
|
|
240
|
+
gaps.push({ kind: "unsealed", op: ledger.op, gate, ...(digest ? { digest } : {}), detail: `${path} holds ${override ? "an override" : "an approval"} of ${gate} by ${entry.by} at ${entry.at} with no seal and no review, and the gate needs one` });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const held = entries.filter((e) => e.kind === "approved" || e.kind === "override-recorded");
|
|
245
|
+
for (const a of input.applies ?? []) {
|
|
246
|
+
const base = { gate: a.gate, ...(a.op ? { op: a.op } : {}), ...(a.digest ? { digest: a.digest } : {}), source: { path: a.ref, ...(a.op ? { op: a.op } : {}), change: "apply" } };
|
|
247
|
+
const at = time(a.at);
|
|
248
|
+
const find = (kind, gate, digest, before) => held
|
|
249
|
+
.filter((e) => e.kind === kind && e.gate === gate && (a.op === undefined || e.op === a.op) && (digest === undefined ? true : e.digest !== undefined && samePlanDigest(e.digest, digest)) && (!before || time(e.at) <= at))
|
|
250
|
+
.sort((x, y) => time(y.at) - time(x.at))[0];
|
|
251
|
+
const approval = a.digest !== undefined && a.approval !== "not-required" ? find("approved", a.gate, a.digest, true) : undefined;
|
|
252
|
+
if (a.digest !== undefined && a.approval !== "not-required" && !approval) {
|
|
253
|
+
gaps.push({ kind: "approval", ...(a.op ? { op: a.op } : {}), gate: a.gate, digest: a.digest, detail: `${a.ref} applied under ${a.digest}, but the ledger holds no approval of ${a.gate} for that digest before ${a.at}` });
|
|
254
|
+
}
|
|
255
|
+
entries.push(keyed({
|
|
256
|
+
...base,
|
|
257
|
+
id: idOf("apply", a.ref, a.at, a.gate, a.digest ?? null),
|
|
258
|
+
kind: "applied",
|
|
259
|
+
at: a.at,
|
|
260
|
+
...(a.by ? { by: a.by } : {}),
|
|
261
|
+
...(approval ? { under: approval.id } : {}),
|
|
262
|
+
detail: { ...(a.detail ?? {}), approval: a.approval ?? "required" },
|
|
263
|
+
}));
|
|
264
|
+
for (const o of a.overrides ?? []) {
|
|
265
|
+
const recorded = find("override-recorded", o.gate, o.digest, false);
|
|
266
|
+
if (!recorded) {
|
|
267
|
+
gaps.push({ kind: "override", ...(a.op ? { op: a.op } : {}), gate: o.gate, ...(o.digest ? { digest: o.digest } : {}), detail: `${a.ref} cites the override ${o.gate}${o.digest ? ` for ${o.digest}` : ""}, but the ledger holds none` });
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
entries.push(keyed({
|
|
271
|
+
...base,
|
|
272
|
+
id: idOf("spent", a.ref, a.at, recorded.id),
|
|
273
|
+
kind: "override-spent",
|
|
274
|
+
gate: o.gate,
|
|
275
|
+
at: a.at,
|
|
276
|
+
...(recorded.by ? { by: recorded.by } : {}),
|
|
277
|
+
...(recorded.digest ? { digest: recorded.digest } : {}),
|
|
278
|
+
under: recorded.id,
|
|
279
|
+
detail: {},
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
entries.sort((x, y) => time(x.at) - time(y.at));
|
|
284
|
+
return { entries, gaps };
|
|
285
|
+
}
|
|
286
|
+
/** The lines of one ledger file's text, all added, each with its line number. Blank lines are skipped. */
|
|
287
|
+
export function gateLedgerLines(content) {
|
|
288
|
+
return content.split("\n").flatMap((l, i) => (l.trim() ? [{ text: l.trim(), line: i + 1 }] : []));
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* The lines each commit added to and removed from a ledger file, oldest first,
|
|
292
|
+
* from `git log -p --unified=0 --no-renames` written with
|
|
293
|
+
* `--format=%x1e%H%x1f%an%x1f%aI` over the file (append `%x1f%ae` for the
|
|
294
|
+
* author's email). The caller runs git; this reads the text. Each line keeps
|
|
295
|
+
* its commit and that commit's date and author, as `added` or `removed`. A
|
|
296
|
+
* line removed and added again in one commit (a newline fixed at the end of
|
|
297
|
+
* the file) is neither. A removed line is what {@link deriveGateAudit}
|
|
298
|
+
* reports as a revocation.
|
|
299
|
+
*/
|
|
300
|
+
export function gateLedgerLinesFromLog(log) {
|
|
301
|
+
const out = [];
|
|
302
|
+
for (const block of log.split("\x1e").slice(1)) {
|
|
303
|
+
const [head = "", ...rest] = block.split("\n");
|
|
304
|
+
const [commit = "", author = "", date = "", email = ""] = head.split("\x1f");
|
|
305
|
+
const net = new Map();
|
|
306
|
+
const order = [];
|
|
307
|
+
for (const l of rest) {
|
|
308
|
+
const sign = l[0];
|
|
309
|
+
if ((sign !== "+" && sign !== "-") || l[1] !== "{")
|
|
310
|
+
continue;
|
|
311
|
+
const text = l.slice(1).trim();
|
|
312
|
+
if (!net.has(text))
|
|
313
|
+
order.push(text);
|
|
314
|
+
net.set(text, (net.get(text) ?? 0) + (sign === "+" ? 1 : -1));
|
|
315
|
+
}
|
|
316
|
+
const when = Date.parse(date.trim());
|
|
317
|
+
const at = Number.isNaN(when) ? date.trim() : new Date(when).toISOString();
|
|
318
|
+
const by = { at, ...(author ? { by: author } : {}), ...(email.trim() ? { email: email.trim() } : {}) };
|
|
319
|
+
for (const text of order) {
|
|
320
|
+
const n = net.get(text);
|
|
321
|
+
for (let i = 0; i < Math.abs(n); i++) {
|
|
322
|
+
out.push({ text, commit: commit.trim(), ...(n > 0 ? { added: { ...by } } : { removed: { ...by } }) });
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return out;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* The thin reader: each op's ledger through a {@link GateLedgerPort} (the git
|
|
330
|
+
* port, or the in-memory one in a test), as input for {@link deriveGateAudit}.
|
|
331
|
+
* The port holds the file as it stands, so nothing here is revoked; add
|
|
332
|
+
* history through {@link gateLedgerLinesFromLog} for that.
|
|
333
|
+
*/
|
|
334
|
+
export async function readGateAuditLedgers(port, ops) {
|
|
335
|
+
const out = [];
|
|
336
|
+
for (const op of ops) {
|
|
337
|
+
const { resolutions, pending } = await port.read(op);
|
|
338
|
+
out.push({ op, lines: [...pending, ...resolutions].map((record) => ({ record })) });
|
|
339
|
+
}
|
|
340
|
+
return out;
|
|
341
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rules a gate is decided by, over gate ledger lines already read (#2119,
|
|
3
|
+
* #2300): the pending fact a resolution must be newer than, and the
|
|
4
|
+
* resolution that answers a gate for a plan. They read no git, so
|
|
5
|
+
* `@intentius/chant/gate-decision` bundles them without the ledger's git
|
|
6
|
+
* code (#3763). `./gate-ledger.ts` re-exports them.
|
|
7
|
+
*/
|
|
8
|
+
import { samePlanDigest } from "./plan-digest.js";
|
|
9
|
+
/** Whether a pending fact has aged out of relevance at `nowIso`. */
|
|
10
|
+
export function isPendingGateExpired(record, nowIso) {
|
|
11
|
+
return new Date(record.expiresAt).getTime() <= new Date(nowIso).getTime();
|
|
12
|
+
}
|
|
13
|
+
/** The most recent pending fact for `gate`, expired or not — the anchor {@link latestResolutionSince} measures a resolution against. `undefined` when the gate has never been recorded pending. */
|
|
14
|
+
export function latestPendingGate(records, gate) {
|
|
15
|
+
let latest;
|
|
16
|
+
for (const r of records) {
|
|
17
|
+
if (r.gate !== gate)
|
|
18
|
+
continue;
|
|
19
|
+
if (!latest || new Date(r.timestamp).getTime() >= new Date(latest.timestamp).getTime())
|
|
20
|
+
latest = r;
|
|
21
|
+
}
|
|
22
|
+
return latest;
|
|
23
|
+
}
|
|
24
|
+
/** The most recent resolution for `gate` recorded after `sinceIso` (a gated tick's own timestamp) — what `chant operator status` uses to tell a resolved gate from a still-pending one. `undefined` when no such resolution exists. */
|
|
25
|
+
export function latestResolutionSince(records, gate, sinceIso) {
|
|
26
|
+
const since = new Date(sinceIso).getTime();
|
|
27
|
+
let latest;
|
|
28
|
+
for (const r of records) {
|
|
29
|
+
if (r.gate !== gate)
|
|
30
|
+
continue;
|
|
31
|
+
if (new Date(r.timestamp).getTime() < since)
|
|
32
|
+
continue;
|
|
33
|
+
if (!latest || new Date(r.timestamp).getTime() >= new Date(latest.timestamp).getTime())
|
|
34
|
+
latest = r;
|
|
35
|
+
}
|
|
36
|
+
return latest;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The resolution that answers `gate` for the plan `planDigest` identifies
|
|
40
|
+
* (#2300).
|
|
41
|
+
*
|
|
42
|
+
* The criterion is the digest; recency is only the tiebreak between several
|
|
43
|
+
* resolutions that all match it. That inversion is the whole point of the
|
|
44
|
+
* issue: {@link latestResolutionSince} asks "is there a newer approval",
|
|
45
|
+
* which a run answers yes to no matter what has changed since, and this asks
|
|
46
|
+
* "is there an approval of *this*".
|
|
47
|
+
*
|
|
48
|
+
* - `planDigest` `undefined` — the gate binds no plan (an Op `gate` step
|
|
49
|
+
* authored with no `plan`). Falls straight through to
|
|
50
|
+
* {@link latestResolutionSince}: gates that never claimed to bind a plan
|
|
51
|
+
* behave exactly as they did before #2300.
|
|
52
|
+
* - A resolution whose `planDigest` equals `planDigest` answers the gate.
|
|
53
|
+
* - A resolution for a different plan does not, and comes back as
|
|
54
|
+
* `mismatched` so the caller can name both digests.
|
|
55
|
+
* - A resolution with no `planDigest` at all — every record written before
|
|
56
|
+
* #2300 — does not either, and comes back as `mismatched` with an absent
|
|
57
|
+
* `planDigest`. This is the safe reading of the migration: such a record
|
|
58
|
+
* proves someone approved something, and nothing about what. Accepting it
|
|
59
|
+
* once would silently apply the very change this check exists to catch, on
|
|
60
|
+
* exactly the estates that have been running longest. The cost is one
|
|
61
|
+
* further `chant approve` per gate after the upgrade, which the refusal
|
|
62
|
+
* says out loud.
|
|
63
|
+
*/
|
|
64
|
+
export function latestResolutionForPlan(records, gate, sinceIso, planDigest) {
|
|
65
|
+
if (planDigest === undefined) {
|
|
66
|
+
const resolution = latestResolutionSince(records, gate, sinceIso);
|
|
67
|
+
return resolution ? { resolution } : {};
|
|
68
|
+
}
|
|
69
|
+
const since = new Date(sinceIso).getTime();
|
|
70
|
+
let matched;
|
|
71
|
+
let mismatched;
|
|
72
|
+
for (const r of records) {
|
|
73
|
+
if (r.gate !== gate)
|
|
74
|
+
continue;
|
|
75
|
+
if (new Date(r.timestamp).getTime() < since)
|
|
76
|
+
continue;
|
|
77
|
+
const newest = (best) => !best || new Date(r.timestamp).getTime() >= new Date(best.timestamp).getTime();
|
|
78
|
+
if (samePlanDigest(r.planDigest, planDigest)) {
|
|
79
|
+
if (newest(matched))
|
|
80
|
+
matched = r;
|
|
81
|
+
}
|
|
82
|
+
else if (newest(mismatched)) {
|
|
83
|
+
mismatched = r;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (matched)
|
|
87
|
+
return { resolution: matched };
|
|
88
|
+
return mismatched ? { mismatched } : {};
|
|
89
|
+
}
|