@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,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replay a recorded snapshot as if it had just been observed (#1266, #1279).
|
|
3
|
+
*
|
|
4
|
+
* Shared by `chant search --at` and `chant graph --at`. A snapshot already holds
|
|
5
|
+
* what an observation is — resources with their physical ids and attributes,
|
|
6
|
+
* and since #1266 the relationships between them — so turning it back into
|
|
7
|
+
* `LiveObservation[]` lets a replay rejoin the live path at `buildLiveGraphIr`.
|
|
8
|
+
* Every fold, overlay and edge reconstruction below that point is shared, and
|
|
9
|
+
* nothing downstream needs to know which source it got.
|
|
10
|
+
*
|
|
11
|
+
* That sharing is the reason this is a module rather than a helper inside one
|
|
12
|
+
* command: `graph` had no `--at` at all, so anyone wanting the raw IR of a
|
|
13
|
+
* recorded estate had to reach for the live endpoint, and a snapshot could
|
|
14
|
+
* answer most questions but never all of them.
|
|
15
|
+
*/
|
|
16
|
+
import { readEnvironmentSnapshots } from "./git.js";
|
|
17
|
+
import { unqualifiedKey } from "./identity.js";
|
|
18
|
+
/**
|
|
19
|
+
* Rebuild observations from a recorded snapshot (#1266).
|
|
20
|
+
*
|
|
21
|
+
* A snapshot already holds what an observation is: resources with their
|
|
22
|
+
* physical ids and attributes, and — since #1266 — the relationships between
|
|
23
|
+
* them. Turning it back into `LiveObservation[]` means the replay rejoins the
|
|
24
|
+
* live path at `buildLiveGraphIr`, and every fold, overlay and query below that
|
|
25
|
+
* is shared. Nothing downstream needs to know which source it got.
|
|
26
|
+
*
|
|
27
|
+
* `latest` is the only ref for now. A specific commit is the natural extension
|
|
28
|
+
* and the storage already supports it (`readSnapshotAt`), but "answer from what
|
|
29
|
+
* is recorded" is the question worth settling first.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Whether this environment has a recording, without reading one.
|
|
33
|
+
*
|
|
34
|
+
* Used to turn "the estate could not be read" into "the estate could not be
|
|
35
|
+
* read, and you already have a recording of it". Cheap and best-effort: a
|
|
36
|
+
* failure here means the caller says the plain version of the message, never
|
|
37
|
+
* that the command fails.
|
|
38
|
+
*/
|
|
39
|
+
export async function hasSnapshot(environment) {
|
|
40
|
+
try {
|
|
41
|
+
return (await readEnvironmentSnapshots(environment)).size > 0;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export async function replaySnapshots(environment, ref, scopedStacks) {
|
|
48
|
+
if (ref !== "latest" && ref !== "true") {
|
|
49
|
+
return {
|
|
50
|
+
error: `chant search --at only accepts "latest" for now, got "${ref}"`,
|
|
51
|
+
hint: "a specific snapshot commit is not wired up yet",
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const stored = await readEnvironmentSnapshots(environment);
|
|
55
|
+
if (stored.size === 0) {
|
|
56
|
+
return {
|
|
57
|
+
error: `No snapshots found for environment "${environment}"`,
|
|
58
|
+
hint: `Record one first: chant lifecycle snapshot ${environment}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const observations = [];
|
|
62
|
+
let commit = "";
|
|
63
|
+
let timestamp = "";
|
|
64
|
+
// "deep" when ANY recorded lexicon read that deep — a consumer comparing
|
|
65
|
+
// against this replay (#1268) needs to know a richer record exists, even
|
|
66
|
+
// though a replay itself only ever turns `resources` back into identity.
|
|
67
|
+
let depth = "identity";
|
|
68
|
+
// Ambient and dependency resources are keyed by physical id and are
|
|
69
|
+
// account-level: the default security group three stacks each recorded is one
|
|
70
|
+
// group, not three. Managed resources are stack-qualified below and cannot
|
|
71
|
+
// collide, so only the unqualified ones need this.
|
|
72
|
+
//
|
|
73
|
+
// "Account-level" is the part that needed qualifying (#1416): a resource that
|
|
74
|
+
// records a region is regional, and two regions' copies are two resources
|
|
75
|
+
// however equal their ids look. `unqualifiedKey` keys those by region, so the
|
|
76
|
+
// set below still collapses one region's resource seen from two stacks and no
|
|
77
|
+
// longer collapses two regions'.
|
|
78
|
+
const seenUnqualified = new Set();
|
|
79
|
+
// One recorded stack is one region, so there is nothing to merge and nothing
|
|
80
|
+
// to disambiguate — its ids stay exactly what they were recorded as, which is
|
|
81
|
+
// also what `chant search --live` gives that project.
|
|
82
|
+
const merging = stored.size > 1;
|
|
83
|
+
// A stack's snapshot could only exclude what THAT stack manages, so a stack
|
|
84
|
+
// declaring no security groups reported the neighbouring stack's as ambient.
|
|
85
|
+
// The union is only knowable here, with every snapshot in hand.
|
|
86
|
+
const managedPhysicalIds = new Set();
|
|
87
|
+
// Where a managed resource ends up, by physical id. A duplicate is dropped
|
|
88
|
+
// below rather than rendered twice, and anything that pointed at the
|
|
89
|
+
// duplicate has to be re-pointed at the survivor — dropping the node alone
|
|
90
|
+
// would take its edges with it, since `buildLiveGraphIr` discards an edge
|
|
91
|
+
// whose endpoints were not both observed.
|
|
92
|
+
const managedKeyOf = new Map();
|
|
93
|
+
for (const content of stored.values()) {
|
|
94
|
+
const snap = JSON.parse(content);
|
|
95
|
+
const snapStack = snap.stack;
|
|
96
|
+
const snapQualifies = snapStack !== undefined && scopedStacks.has(snapStack);
|
|
97
|
+
for (const [id, meta] of Object.entries(snap.resources ?? {})) {
|
|
98
|
+
if (!meta.ambient && !meta.referencedBy?.length && meta.physicalId) {
|
|
99
|
+
managedPhysicalIds.add(meta.physicalId);
|
|
100
|
+
managedKeyOf.set(meta.physicalId, snapQualifies ? `${snapStack}::${id}` : id);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (const [key, content] of stored) {
|
|
105
|
+
const snapshot = JSON.parse(content);
|
|
106
|
+
// The storage key is `<stack>__<lexicon>` for a multi-stack project; the
|
|
107
|
+
// snapshot carries its own lexicon, which is the one to trust.
|
|
108
|
+
const lexicon = snapshot.lexicon ?? key;
|
|
109
|
+
// A scoped stack's ids are qualified `${stack}::${id}` on the live path
|
|
110
|
+
// (#1162), because the same bare LogicalResourceId exists in every region's
|
|
111
|
+
// stack. A snapshot stores them bare, so a replay has to re-apply the same
|
|
112
|
+
// rule — otherwise `server` from us-west-1 and `server` from us-west-2
|
|
113
|
+
// collide, and none of them join the declared canvas, which qualifies.
|
|
114
|
+
const stack = snapshot.stack;
|
|
115
|
+
const qualify = stack !== undefined && scopedStacks.has(stack);
|
|
116
|
+
// Dependencies (#1273) and ambient resources (#1278) are keyed by physical
|
|
117
|
+
// id and are NOT stack-qualified: the default VPC's route table is one
|
|
118
|
+
// resource however many stacks route through it, and qualifying it would
|
|
119
|
+
// split it per stack and break the edges into it.
|
|
120
|
+
const unqualifiedByNature = (meta) => Boolean(meta.ambient) || Boolean(meta.referencedBy && meta.referencedBy.length > 0);
|
|
121
|
+
// Region qualification (#1416) applies to exactly those, and never to a
|
|
122
|
+
// managed resource: an unscoped project's declared canvas joins on bare
|
|
123
|
+
// ids, so re-keying `web` to `us-east-1::web` would unjoin it from its own
|
|
124
|
+
// declaration.
|
|
125
|
+
const keyOf = (id, meta) => {
|
|
126
|
+
if (unqualifiedByNature(meta))
|
|
127
|
+
return merging ? unqualifiedKey(id, meta) : id;
|
|
128
|
+
return qualify ? `${stack}::${id}` : id;
|
|
129
|
+
};
|
|
130
|
+
const resources = {};
|
|
131
|
+
// Duplicates dropped here, and where they went, so edges can follow.
|
|
132
|
+
const merged = new Map();
|
|
133
|
+
for (const [id, meta] of Object.entries(snapshot.resources ?? {})) {
|
|
134
|
+
const key = keyOf(id, meta);
|
|
135
|
+
if (!qualify || unqualifiedByNature(meta)) {
|
|
136
|
+
// Ambient means "nothing manages this", and being referenced means "the
|
|
137
|
+
// estate reaches this" — neither stops it being managed. When a stack
|
|
138
|
+
// manages the same physical resource, this entry is that resource seen
|
|
139
|
+
// from outside, and rendering both inflates any count over it.
|
|
140
|
+
//
|
|
141
|
+
// The dependency half of that was missing, and it was not cosmetic: a
|
|
142
|
+
// subnet declared by its stack was also recorded as `subnet-9af06b90`
|
|
143
|
+
// with `referencedBy`, so an estate with 13 subnets replayed as 16 and
|
|
144
|
+
// "which subnets have no network interfaces" answered 11 where the
|
|
145
|
+
// truth was 8. The three extra were occupied subnets whose second copy
|
|
146
|
+
// had no interface pointing at it — a duplicate reads as empty, because
|
|
147
|
+
// the edges resolved to the other one.
|
|
148
|
+
const duplicate = Boolean(meta.ambient) || Boolean(meta.referencedBy && meta.referencedBy.length > 0);
|
|
149
|
+
if (duplicate && meta.physicalId && managedPhysicalIds.has(meta.physicalId)) {
|
|
150
|
+
const survivor = managedKeyOf.get(meta.physicalId);
|
|
151
|
+
if (survivor && survivor !== key)
|
|
152
|
+
merged.set(id, survivor);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// Unqualified: one resource per key, so first sighting wins and the
|
|
156
|
+
// rest are the same resource seen again from another stack's snapshot.
|
|
157
|
+
// The key carries the region when there is one, so "the same resource"
|
|
158
|
+
// no longer spans regions.
|
|
159
|
+
if (seenUnqualified.has(key))
|
|
160
|
+
continue;
|
|
161
|
+
seenUnqualified.add(key);
|
|
162
|
+
}
|
|
163
|
+
resources[key] = meta;
|
|
164
|
+
}
|
|
165
|
+
const known = new Set(Object.keys(snapshot.resources ?? {}));
|
|
166
|
+
const requalify = (id) => {
|
|
167
|
+
// A dropped duplicate's edges belong to the resource that survived it.
|
|
168
|
+
const survivor = merged.get(id);
|
|
169
|
+
if (survivor)
|
|
170
|
+
return survivor;
|
|
171
|
+
const meta = (snapshot.resources ?? {})[id];
|
|
172
|
+
return known.has(id) && meta ? keyOf(id, meta) : id;
|
|
173
|
+
};
|
|
174
|
+
const edges = (snapshot.edges ?? []).map((e) => ({ ...e, from: requalify(e.from), to: requalify(e.to) }));
|
|
175
|
+
observations.push({
|
|
176
|
+
lexicon,
|
|
177
|
+
resources,
|
|
178
|
+
...(edges.length > 0 ? { edges } : {}),
|
|
179
|
+
...(snapshot.stackExports && Object.keys(snapshot.stackExports).length > 0
|
|
180
|
+
? { stackExports: snapshot.stackExports }
|
|
181
|
+
: {}),
|
|
182
|
+
});
|
|
183
|
+
commit || (commit = snapshot.commit ?? "");
|
|
184
|
+
// Report the OLDEST timestamp across stacks: a caller asking how stale this
|
|
185
|
+
// answer is wants the weakest link, not the freshest one.
|
|
186
|
+
if (!timestamp || (snapshot.timestamp && snapshot.timestamp < timestamp)) {
|
|
187
|
+
timestamp = snapshot.timestamp ?? timestamp;
|
|
188
|
+
}
|
|
189
|
+
if (snapshot.depth === "deep")
|
|
190
|
+
depth = "deep";
|
|
191
|
+
}
|
|
192
|
+
return { observations, commit, timestamp, depth };
|
|
193
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lifecycle rollback (#873) — open a PR that restores the source to a prior git
|
|
3
|
+
* revision. Rollback = make an env match a past state of the declared source; the
|
|
4
|
+
* PR's diff *is* the rollback delta. No cloud mutation here — a human merges, then
|
|
5
|
+
* the existing gated apply rolls the env back.
|
|
6
|
+
*
|
|
7
|
+
* Runs entirely in an isolated `git worktree` (like {@link ./affected}), so the
|
|
8
|
+
* caller's working branch/tree is never touched — important because the consumer
|
|
9
|
+
* (behold) serves a live checkout.
|
|
10
|
+
*/
|
|
11
|
+
import { execFile } from "node:child_process";
|
|
12
|
+
import { promisify } from "node:util";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { ghHostEnv } from "../op/activities/gh-host.js";
|
|
16
|
+
import { restPullRequestForge } from "../op/activities/forge-pull-request.js";
|
|
17
|
+
const execFileAsync = promisify(execFile);
|
|
18
|
+
/** Branch name for a rollback PR. Pure. */
|
|
19
|
+
export function rollbackBranchName(env, shortRef) {
|
|
20
|
+
return `chant/rollback-${env ?? "src"}-${shortRef}`;
|
|
21
|
+
}
|
|
22
|
+
/** PR title for a rollback. Pure. */
|
|
23
|
+
export function rollbackTitle(env, ref) {
|
|
24
|
+
return `rollback ${env ? env + " " : ""}source to ${ref}`;
|
|
25
|
+
}
|
|
26
|
+
/** PR body — explains that merging + applying completes the rollback. Pure. */
|
|
27
|
+
export function rollbackBody(env, ref, sourceDir) {
|
|
28
|
+
const target = env ? `the ${env} environment` : "the environment";
|
|
29
|
+
return (`Restores \`${sourceDir}\` to its state at \`${ref}\`.\n\n` +
|
|
30
|
+
`The diff below is the rollback delta. Merge this PR, then apply (Sync) to roll ${target} back — ` +
|
|
31
|
+
`a destructive apply still passes through its approval gate. No cloud change was made by opening this PR.`);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Open a rollback PR restoring `sourceDir` to `ref`. Isolated worktree; the
|
|
35
|
+
* caller's branch is untouched. Throws on an unknown ref or a git/gh failure.
|
|
36
|
+
*
|
|
37
|
+
* `dryRun` computes the same delta and returns it as a diff without pushing a
|
|
38
|
+
* branch or opening a PR, leaving the repository exactly as it found it.
|
|
39
|
+
*
|
|
40
|
+
* That mode exists because the PR path needs a GitHub remote and an
|
|
41
|
+
* authenticated `gh` — reasonable for the operator flow this was built for
|
|
42
|
+
* (#873), and impossible for a hermetic acceptance run. chant#1208's CC
|
|
43
|
+
* round-trip has to demonstrate rollback offline, on an emulator, with no
|
|
44
|
+
* remote in the picture; without this it could only assert the `noop` case,
|
|
45
|
+
* which exercises none of the interesting work.
|
|
46
|
+
*/
|
|
47
|
+
export async function rollbackToRevision(opts) {
|
|
48
|
+
const { ref, env, sourceDir, cwd, dryRun } = opts;
|
|
49
|
+
const git = (args, wd) => execFileAsync("git", args, { cwd: wd });
|
|
50
|
+
const repoRoot = (await git(["rev-parse", "--show-toplevel"], cwd)).stdout.trim();
|
|
51
|
+
// Verify the ref resolves to a commit (throws with a clear message otherwise).
|
|
52
|
+
await execFileAsync("git", ["rev-parse", "--verify", `${ref}^{commit}`], { cwd: repoRoot });
|
|
53
|
+
const shortRef = (await git(["rev-parse", "--short", ref], repoRoot)).stdout.trim();
|
|
54
|
+
const branch = rollbackBranchName(env, shortRef);
|
|
55
|
+
const wt = join(tmpdir(), `chant-rollback-${shortRef}-${process.pid}`);
|
|
56
|
+
await git(["worktree", "add", wt, "-b", branch, "HEAD"], repoRoot);
|
|
57
|
+
try {
|
|
58
|
+
// Restore the source tree to the target revision (stages the changes).
|
|
59
|
+
//
|
|
60
|
+
// `git checkout <ref> -- <dir>` alone is a PER-PATH checkout, not a tree
|
|
61
|
+
// replacement: it restores the paths that exist at `ref` and leaves
|
|
62
|
+
// everything else untouched, so a file added since `ref` survives. That
|
|
63
|
+
// made rollback report "nothing to roll back" whenever the only difference
|
|
64
|
+
// was added files (#1327) — which is exactly what a reconcile produces,
|
|
65
|
+
// since `chant import --from <env>` writes NEW files rather than editing
|
|
66
|
+
// the authored ones. Clearing the directory first makes this a real
|
|
67
|
+
// restore, so the deletions show up in the delta.
|
|
68
|
+
await git(["rm", "-rq", "--ignore-unmatch", "--", sourceDir], wt);
|
|
69
|
+
await git(["checkout", ref, "--", sourceDir], wt);
|
|
70
|
+
const staged = (await git(["status", "--porcelain", "--", sourceDir], wt)).stdout.trim();
|
|
71
|
+
if (!staged)
|
|
72
|
+
return { noop: true };
|
|
73
|
+
// The delta, before committing: `git diff` against the index shows exactly
|
|
74
|
+
// what restoring the source to `ref` changes. A dry run stops here.
|
|
75
|
+
if (dryRun) {
|
|
76
|
+
const { stdout } = await git(["diff", "--cached", "--", sourceDir], wt);
|
|
77
|
+
return { noop: false, branch, diff: stdout };
|
|
78
|
+
}
|
|
79
|
+
await git(["commit", "-m", rollbackTitle(env, ref)], wt);
|
|
80
|
+
await git(["push", "-u", "origin", branch], wt);
|
|
81
|
+
// `gh pr` speaks GraphQL, which Forgejo does not serve: a Forgejo or
|
|
82
|
+
// GitLab job opens the pull request over REST (#3798).
|
|
83
|
+
const forge = await restPullRequestForge(process.env, { cwd: wt });
|
|
84
|
+
if (forge) {
|
|
85
|
+
const pr = await forge.openPullRequest({ head: branch, title: rollbackTitle(env, ref), body: rollbackBody(env, ref, sourceDir) });
|
|
86
|
+
return { noop: false, branch, prUrl: pr.url ?? "" };
|
|
87
|
+
}
|
|
88
|
+
// `gh pr create` names no host: tell it the one `origin` is on, or the
|
|
89
|
+
// CI job's forge, so a GitHub Enterprise Server checkout is not sent to
|
|
90
|
+
// github.com (#3780).
|
|
91
|
+
const { stdout } = await execFileAsync("gh", ["pr", "create", "--title", rollbackTitle(env, ref), "--body", rollbackBody(env, ref, sourceDir), "--head", branch], { cwd: wt, env: await ghHostEnv(process.env, wt) });
|
|
92
|
+
return { noop: false, branch, prUrl: stdout.trim() };
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
await git(["worktree", "remove", "--force", wt], repoRoot).catch(() => { });
|
|
96
|
+
// Removing the worktree leaves its branch behind. For the PR path that is
|
|
97
|
+
// correct — the branch is the PR. A dry run must leave nothing, or a repo
|
|
98
|
+
// accumulates a `chant/rollback-*` branch per inspection.
|
|
99
|
+
if (dryRun)
|
|
100
|
+
await git(["branch", "-D", branch], repoRoot).catch(() => { });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Op run ledger (#2118, epic #2114) — one immutable record per Op run, on the
|
|
3
|
+
* `chant/lifecycle` orphan branch, modelled on `./converge-ledger.ts` down to
|
|
4
|
+
* the CAS-retry loop and the "skip a malformed line, count it" reader.
|
|
5
|
+
*
|
|
6
|
+
* ## Why an Op run leaves a record at all
|
|
7
|
+
*
|
|
8
|
+
* `OpConfig` used to carry `searchAttributes`, and the generated orchestrator
|
|
9
|
+
* code upserted `Phase`, `Drift`, `Approver` and `RollbackFailed` into them as
|
|
10
|
+
* it ran. Those are not properties of the declaration — they are facts about
|
|
11
|
+
* one run, and they only existed while a cluster held the run's history. Ops
|
|
12
|
+
* now run on whatever runtime `chant run --on`
|
|
13
|
+
* selects (#2121), including the plain in-process one, so the outcome has to
|
|
14
|
+
* be durable somewhere chant owns. Here. What stayed on the declaration is
|
|
15
|
+
* `OpConfig.labels`, the discovery half of the same field, and it is copied
|
|
16
|
+
* onto every record so a reader can filter runs the way it filters
|
|
17
|
+
* declarations.
|
|
18
|
+
*
|
|
19
|
+
* The record shape itself lives in `../op/runtime.ts`, beside the provider
|
|
20
|
+
* contract that reads it back: this is the ledger, not the vocabulary.
|
|
21
|
+
*
|
|
22
|
+
* ## Storage
|
|
23
|
+
*
|
|
24
|
+
* `<env>/runs__<op>.jsonl`, beside `<env>/converge.jsonl`. The `runs__`
|
|
25
|
+
* prefix folds what would read as a `runs/` subdirectory into one path
|
|
26
|
+
* segment: `writeBlobToPath` (./git.ts) builds the orphan branch's tree with
|
|
27
|
+
* `git mktree` over a flat `<env>/<file>` layout, and mktree rejects a slash
|
|
28
|
+
* in an entry name outright, so a genuine third level would mean rewriting
|
|
29
|
+
* that function's tree assembly. `__` is the same separator `./git.ts`'s
|
|
30
|
+
* `snapshotKey` already uses to fold a stack name into a flat blob name.
|
|
31
|
+
*
|
|
32
|
+
* Per-op rather than one file per env because a run ledger's reader almost
|
|
33
|
+
* always wants one op's history (`chant run <op>`'s own record, the local
|
|
34
|
+
* runtime's `status`/`log`), and an env with a busy op should not make every
|
|
35
|
+
* other op's read proportional to it.
|
|
36
|
+
*/
|
|
37
|
+
import { randomUUID } from "node:crypto";
|
|
38
|
+
import { sortedJsonReplacer } from "../utils.js";
|
|
39
|
+
import { readBlobFromPath, readPathSha, readBlobBySha, writeBlobToPath, RefCASConflictError } from "./git.js";
|
|
40
|
+
/** Prefix folding the per-op run ledgers into one flat name under `<env>/`. See the module doc. */
|
|
41
|
+
const PREFIX = "runs__";
|
|
42
|
+
/** Read-modify-append retry budget, same shape and reasoning as `appendConvergeRecord`'s. */
|
|
43
|
+
const APPEND_RETRY_ATTEMPTS = 5;
|
|
44
|
+
/** The env a run records against when its Op declares no `labels.Env`. */
|
|
45
|
+
export const DEFAULT_RUN_ENV = "local";
|
|
46
|
+
function fileFor(op) {
|
|
47
|
+
return `${PREFIX}${op}.jsonl`;
|
|
48
|
+
}
|
|
49
|
+
/** The env a run records against: the Op's own `labels.Env`, else {@link DEFAULT_RUN_ENV}. */
|
|
50
|
+
export function runEnvOf(config) {
|
|
51
|
+
return config.labels?.Env ?? DEFAULT_RUN_ENV;
|
|
52
|
+
}
|
|
53
|
+
function phaseStatus(steps) {
|
|
54
|
+
if (steps.some((s) => s.status === "fail"))
|
|
55
|
+
return "fail";
|
|
56
|
+
if (steps.length > 0 && steps.every((s) => s.status === "skipped"))
|
|
57
|
+
return "skipped";
|
|
58
|
+
return "ok";
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Fold a run's step records into the ledger shape, pure — no clock, no git.
|
|
62
|
+
* `started`/`ended` are supplied by the caller for the same reason
|
|
63
|
+
* `ConvergeTickRecord.timestamp` is: library code here never calls
|
|
64
|
+
* `Date.now()` itself.
|
|
65
|
+
*
|
|
66
|
+
* Phases are grouped by `StepRecord.phase` in first-seen order, which is
|
|
67
|
+
* execution order for the sequential path and the authored order for a
|
|
68
|
+
* parallel one. A compensation (`onFailure`) phase appears after the phase
|
|
69
|
+
* that failed, exactly where the executor emitted its records.
|
|
70
|
+
*/
|
|
71
|
+
export function buildRunRecord(config, records, times) {
|
|
72
|
+
const phases = [];
|
|
73
|
+
const byName = new Map();
|
|
74
|
+
const outcomes = {};
|
|
75
|
+
for (const record of records) {
|
|
76
|
+
let phase = byName.get(record.phase);
|
|
77
|
+
if (!phase) {
|
|
78
|
+
phase = { name: record.phase, status: "ok", steps: [] };
|
|
79
|
+
byName.set(record.phase, phase);
|
|
80
|
+
phases.push(phase);
|
|
81
|
+
}
|
|
82
|
+
phase.steps.push({
|
|
83
|
+
fn: record.fn,
|
|
84
|
+
status: record.status,
|
|
85
|
+
durationMs: record.durationMs,
|
|
86
|
+
...(record.outcome ? { outcome: record.outcome } : {}),
|
|
87
|
+
...(record.approval ? { approval: record.approval } : {}),
|
|
88
|
+
...(record.error !== undefined ? { error: record.error } : {}),
|
|
89
|
+
...(record.refusal !== undefined ? { refusal: record.refusal } : {}),
|
|
90
|
+
...(record.point ? { point: record.point } : {}),
|
|
91
|
+
...(record.gate ? { gate: record.gate } : {}),
|
|
92
|
+
});
|
|
93
|
+
if (record.outcome)
|
|
94
|
+
outcomes[record.outcome.name] = record.outcome.value;
|
|
95
|
+
}
|
|
96
|
+
for (const phase of phases) {
|
|
97
|
+
phase.status = phaseStatus(phase.steps);
|
|
98
|
+
const ms = times.phaseDurations?.[phase.name];
|
|
99
|
+
if (ms !== undefined)
|
|
100
|
+
phase.durationMs = ms;
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
...(times.id !== undefined ? { id: times.id } : {}),
|
|
104
|
+
op: config.name,
|
|
105
|
+
env: runEnvOf(config),
|
|
106
|
+
started: times.started,
|
|
107
|
+
ended: times.ended,
|
|
108
|
+
status: times.status,
|
|
109
|
+
labels: { ...(config.labels ?? {}) },
|
|
110
|
+
outcomes,
|
|
111
|
+
phases,
|
|
112
|
+
...(times.gate ? { gate: times.gate } : {}),
|
|
113
|
+
...(times.point ? { point: times.point } : {}),
|
|
114
|
+
...(times.steward ? { steward: times.steward } : {}),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Append one immutable run record. Does not push to the remote — call
|
|
119
|
+
* `pushLifecycle` (./git.ts) afterward, the two-step shape every ledger here
|
|
120
|
+
* uses.
|
|
121
|
+
*
|
|
122
|
+
* Mints `record.id` when the input carries none, and retries the whole
|
|
123
|
+
* read-modify-write on `RefCASConflictError` re-reading fresh each attempt —
|
|
124
|
+
* see `appendConvergeRecord`'s doc for why both of those live in the append
|
|
125
|
+
* function rather than in its callers.
|
|
126
|
+
*/
|
|
127
|
+
export async function appendRunRecord(input, opts) {
|
|
128
|
+
const record = { version: 1, ...input, id: input.id ?? randomUUID() };
|
|
129
|
+
const json = JSON.stringify(record, sortedJsonReplacer);
|
|
130
|
+
const filename = fileFor(record.op);
|
|
131
|
+
let lastErr;
|
|
132
|
+
for (let attempt = 1; attempt <= APPEND_RETRY_ATTEMPTS; attempt++) {
|
|
133
|
+
try {
|
|
134
|
+
const priorSha = await readPathSha(record.env, filename, opts);
|
|
135
|
+
const existing = priorSha ? await readBlobBySha(priorSha, opts) : null;
|
|
136
|
+
const content = `${existing ? `${existing.replace(/\n$/, "")}\n` : ""}${json}\n`;
|
|
137
|
+
const commit = await writeBlobToPath(record.env, filename, content, `Op run record: ${record.op}`, {
|
|
138
|
+
...opts,
|
|
139
|
+
expectPriorPathSha: priorSha,
|
|
140
|
+
});
|
|
141
|
+
return { commit, record };
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
if (!(err instanceof RefCASConflictError))
|
|
145
|
+
throw err;
|
|
146
|
+
lastErr = err;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw lastErr;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Read every run record for `op` in `environment`, oldest first. Malformed
|
|
153
|
+
* lines are skipped and counted, never thrown on — a hand-edited or truncated
|
|
154
|
+
* ledger degrades to a shorter history, the stance every ledger here takes.
|
|
155
|
+
*/
|
|
156
|
+
export async function readRunLedger(environment, op, opts) {
|
|
157
|
+
const content = await readBlobFromPath(environment, fileFor(op), opts);
|
|
158
|
+
if (!content)
|
|
159
|
+
return { records: [], malformed: 0 };
|
|
160
|
+
const lines = content.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
161
|
+
const records = [];
|
|
162
|
+
let malformed = 0;
|
|
163
|
+
for (const line of lines) {
|
|
164
|
+
try {
|
|
165
|
+
const parsed = JSON.parse(line);
|
|
166
|
+
if (parsed.version !== 1 ||
|
|
167
|
+
typeof parsed.op !== "string" ||
|
|
168
|
+
typeof parsed.env !== "string" ||
|
|
169
|
+
typeof parsed.started !== "string" ||
|
|
170
|
+
typeof parsed.ended !== "string" ||
|
|
171
|
+
typeof parsed.status !== "string" ||
|
|
172
|
+
!Array.isArray(parsed.phases)) {
|
|
173
|
+
malformed++;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
records.push(parsed);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
malformed++;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return { records, malformed };
|
|
183
|
+
}
|