@intentius/chant 0.124.13 → 0.124.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +669 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.d.ts +24 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +361 -0
- package/dist/child-project.js +21 -0
- package/dist/ci-jobs.d.ts +227 -0
- package/dist/ci-jobs.d.ts.map +1 -0
- package/dist/ci-jobs.js +448 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +135 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.d.ts +10 -2
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +313 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.d.ts +2 -1
- package/dist/discovery/collect.d.ts.map +1 -1
- package/dist/discovery/collect.js +223 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4073 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/host-composite.d.ts +35 -0
- package/dist/discovery/host-composite.d.ts.map +1 -0
- package/dist/discovery/host-composite.js +93 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +20 -9
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +313 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.d.ts +69 -2
- package/dist/lifecycle/gate-audit.d.ts.map +1 -1
- package/dist/lifecycle/gate-audit.js +415 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +24 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +201 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.d.ts +1 -1
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.d.ts +8 -3
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +67 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.d.ts +28 -16
- package/dist/op/activities/reconcile.d.ts.map +1 -1
- package/dist/op/activities/reconcile.js +1011 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.d.ts +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts +7 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.js +119 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +462 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.d.ts +3 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +202 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/class-data.d.ts +84 -0
- package/dist/workspace/class-data.d.ts.map +1 -0
- package/dist/workspace/class-data.js +238 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.d.ts +3 -7
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +553 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +4 -11
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +162 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/build.ts +8 -0
- package/src/change-set.test.ts +48 -0
- package/src/change-set.ts +52 -2
- package/src/ci-jobs.test.ts +49 -0
- package/src/ci-jobs.ts +515 -0
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/pr-pipeline.ts +3 -2
- package/src/components/sandbox/driver.ts +3 -1
- package/src/composite.ts +15 -3
- package/src/config-import.ts +3 -0
- package/src/discovery/collect.ts +15 -1
- package/src/discovery/fold-build-parity.test.ts +71 -0
- package/src/discovery/fold-import.ts +25 -127
- package/src/discovery/fold-project-provenance.test.ts +21 -4
- package/src/discovery/host-composite.ts +101 -0
- package/src/discovery/import.ts +2 -0
- package/src/discovery/index.ts +11 -1
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +5 -4
- package/src/gate-decision-identity.test.ts +59 -6
- package/src/gate-decision.ts +81 -21
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-audit.test.ts +55 -1
- package/src/lifecycle/gate-audit.ts +116 -3
- package/src/lifecycle/gate-ledger.test.ts +20 -1
- package/src/lifecycle/gate-ledger.ts +33 -1
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +11 -3
- package/src/op/activities/lexicon-upgrade.test.ts +2 -0
- package/src/op/activities/reconcile.test.ts +62 -2
- package/src/op/activities/reconcile.ts +46 -22
- package/src/op/builders.ts +1 -1
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-run.ts +4 -3
- package/src/op/op-waves.test.ts +2 -0
- package/src/op/work-lease-run.test.ts +12 -4
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/__fixtures__/contract-repo.ts +17 -1
- package/src/workspace/__fixtures__/sessions.ts +3 -3
- package/src/workspace/change-set.schema.json +5 -3
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/ci-green-workflow.test.ts +4 -4
- package/src/workspace/ci-green-workflow.ts +5 -2
- package/src/workspace/class-data.test.ts +64 -0
- package/src/workspace/class-data.ts +236 -0
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +7 -36
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +12 -95
- package/src/workspace/records-formats.test.ts +7 -2
- package/src/workspace/records-sessions-write.test.ts +3 -3
- package/src/workspace/status-contract.e2e.test.ts +37 -0
- package/src/workspace/status-contract.test.ts +23 -21
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderers for a derived fan-out (#2420) — the printed derivation #2417's
|
|
3
|
+
* proof list asks for and nothing produced.
|
|
4
|
+
*
|
|
5
|
+
* `./driver-output.ts` is the precedent and the shape is deliberately the
|
|
6
|
+
* same: a human renderer that logs to stderr, a JSON renderer that owns
|
|
7
|
+
* stdout and writes nothing else, both over the types the model already
|
|
8
|
+
* returns (`./fan-out.ts`'s `FanOutPlan`, `./fan-out-run.ts`'s
|
|
9
|
+
* `FanOutRunResult`). No new fields are computed here. A renderer that had to
|
|
10
|
+
* derive something to print it would be deriving it twice.
|
|
11
|
+
*
|
|
12
|
+
* ## What gets printed, and why each line is not optional
|
|
13
|
+
*
|
|
14
|
+
* A fan-out that applies the right components without saying why it picked
|
|
15
|
+
* them reads exactly like one that fanned out to everything, which is the
|
|
16
|
+
* failure #2417's precision decision exists to prevent. So:
|
|
17
|
+
*
|
|
18
|
+
* - **the waves**, because the claim is that the order was derived from the
|
|
19
|
+
* source rather than declared, and a flat list cannot show that
|
|
20
|
+
* - **every component that is not running, with its reason** — `unaffected`,
|
|
21
|
+
* `indeterminate`, `already-applied`, `blocked` — because "absent from the
|
|
22
|
+
* list" and "deliberately held back" look identical otherwise
|
|
23
|
+
* - **`indeterminate` on its own line**, because it is the third outcome and a
|
|
24
|
+
* two-state render would quietly drop it into one of the other two
|
|
25
|
+
* - **`seeds`**, because those values are being taken on trust from a run that
|
|
26
|
+
* happened earlier and somewhere else
|
|
27
|
+
* - **the `digest`, verbatim and unabbreviated**, because it is the string
|
|
28
|
+
* `chant approve --plan` takes. Truncating it for width would make the line
|
|
29
|
+
* unusable for the one job it has.
|
|
30
|
+
*/
|
|
31
|
+
import { waveGateName } from "../gated-waves.js";
|
|
32
|
+
const stderr = (line) => process.stderr.write(line + "\n");
|
|
33
|
+
const stdout = (line) => process.stdout.write(line + "\n");
|
|
34
|
+
/** `unaffected` → `unaffected`; `blocked` also names the failure it was reached from. */
|
|
35
|
+
function reasonOf(skip) {
|
|
36
|
+
return skip.reason === "blocked" && skip.blockedBy
|
|
37
|
+
? `blocked by "${skip.blockedBy}"`
|
|
38
|
+
: skip.reason;
|
|
39
|
+
}
|
|
40
|
+
/** Longest component name in `skips`, for a column that lines up without padding every render. */
|
|
41
|
+
function widestName(skips) {
|
|
42
|
+
return skips.reduce((w, s) => Math.max(w, s.component.length), 0);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The derivation itself: the waves, what is not running and why, what is
|
|
46
|
+
* seeded, and the digest an approval binds to.
|
|
47
|
+
*
|
|
48
|
+
* This is the whole output of a plan-only invocation and the header of a run,
|
|
49
|
+
* so it is one function rather than two nearly identical ones.
|
|
50
|
+
*/
|
|
51
|
+
export function renderFanOutPlan(plan, options = {}) {
|
|
52
|
+
const write = options.write ?? stderr;
|
|
53
|
+
// Three outcomes, never two (#2417). The counts come first because they are
|
|
54
|
+
// the claim the rest of the block substantiates.
|
|
55
|
+
const unaffected = plan.skipped.filter((s) => s.reason === "unaffected").length;
|
|
56
|
+
const held = plan.skipped.filter((s) => s.reason === "already-applied" || s.reason === "blocked").length;
|
|
57
|
+
write(`fan-out: ${plan.order.length} selected, ${unaffected} unaffected, ` +
|
|
58
|
+
`${plan.indeterminate.length} indeterminate` +
|
|
59
|
+
(held > 0 ? `, ${held} held back` : ""));
|
|
60
|
+
if (plan.order.length === 0) {
|
|
61
|
+
write(" nothing to run");
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
for (const [index, wave] of plan.waves.entries()) {
|
|
65
|
+
const gated = options.waveGate ? ` (gate ${waveGateName(options.waveGate.gate, index + 1)})` : "";
|
|
66
|
+
write(` wave ${index + 1}: ${wave.join(", ")}${gated}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (plan.seeds.length > 0) {
|
|
70
|
+
write(` seeded from an earlier run: ${plan.seeds.join(", ")}`);
|
|
71
|
+
}
|
|
72
|
+
if (plan.skipped.length > 0) {
|
|
73
|
+
write(` not running (${plan.skipped.length}):`);
|
|
74
|
+
const width = widestName(plan.skipped);
|
|
75
|
+
for (const skip of plan.skipped) {
|
|
76
|
+
write(` ${skip.component.padEnd(width)} ${reasonOf(skip)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (plan.indeterminate.length > 0) {
|
|
80
|
+
// Named separately from the `indeterminate` rows above because the two say
|
|
81
|
+
// different things: those rows are "not selected", this line is "a source
|
|
82
|
+
// diff could not judge it and the walk never reached it either", which is
|
|
83
|
+
// the one outcome nobody should read as a decision.
|
|
84
|
+
write(` a source diff cannot judge these, and the walk did not reach them: ` +
|
|
85
|
+
plan.indeterminate.join(", "));
|
|
86
|
+
}
|
|
87
|
+
// Verbatim: this is the string `chant approve --plan` takes.
|
|
88
|
+
write(` plan: ${plan.digest}`);
|
|
89
|
+
if (options.gate) {
|
|
90
|
+
write(` approve: chant approve ${options.gate.op} ${options.gate.gate} --plan ${plan.digest}`);
|
|
91
|
+
}
|
|
92
|
+
if (options.waveGate) {
|
|
93
|
+
write(` each wave is planned when it is reached, and its gate binds that wave's set digest`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** One line per wave a gated-wave run reached (#3049): its digest, members and where it got to. */
|
|
97
|
+
function renderWaves(waves, write) {
|
|
98
|
+
for (const wave of waves) {
|
|
99
|
+
const state = wave.status === "applied"
|
|
100
|
+
? `applied, approved by ${wave.approvedBy ?? "unknown"}`
|
|
101
|
+
: wave.status === "gated"
|
|
102
|
+
? wave.approved
|
|
103
|
+
? "stopped: the set changed after it was approved"
|
|
104
|
+
: "waiting for approval"
|
|
105
|
+
: "failed";
|
|
106
|
+
write(`wave ${wave.wave} (${wave.gate}): ${state}`);
|
|
107
|
+
if (wave.digest)
|
|
108
|
+
write(` set digest: ${wave.digest}`);
|
|
109
|
+
for (const member of wave.members)
|
|
110
|
+
write(` ${member.member} ${member.planDigest}`);
|
|
111
|
+
if (wave.approved)
|
|
112
|
+
write(` approved digest: ${wave.approved}`);
|
|
113
|
+
for (const f of wave.failed ?? [])
|
|
114
|
+
write(` ${f.component} failed${f.error ? `: ${f.error}` : ""}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* A dispatched fan-out: the derivation that ran, then what it did.
|
|
119
|
+
*
|
|
120
|
+
* `result.plan` is the plan as dispatched, so on a resume this prints the
|
|
121
|
+
* narrowed one, with everything an earlier attempt finished listed as
|
|
122
|
+
* `already-applied`. That is the point of printing the plan off the result
|
|
123
|
+
* rather than off whatever the caller derived.
|
|
124
|
+
*/
|
|
125
|
+
export function renderFanOutHuman(result, options = {}) {
|
|
126
|
+
const write = options.write ?? stderr;
|
|
127
|
+
renderFanOutPlan(result.plan, { ...options, write });
|
|
128
|
+
if (result.waves)
|
|
129
|
+
renderWaves(result.waves, write);
|
|
130
|
+
if (result.status === "gated" && result.waves) {
|
|
131
|
+
const at = result.waves[result.waves.length - 1];
|
|
132
|
+
write(`gated at wave ${at?.wave ?? "?"}: ${result.completed.length} applied before it, ` +
|
|
133
|
+
`nothing in it or after it ran.`);
|
|
134
|
+
if (result.gate?.expiresAt)
|
|
135
|
+
write(` expires: ${result.gate.expiresAt}`);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (result.status === "gated") {
|
|
139
|
+
const gate = result.gate;
|
|
140
|
+
write(`gated: nothing ran. ${gate ? `Waiting on "${gate.gate}" on "${gate.op}".` : "Waiting on an approval."}`);
|
|
141
|
+
if (gate?.expiresAt)
|
|
142
|
+
write(` expires: ${gate.expiresAt}`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (result.completed.length > 0)
|
|
146
|
+
write(`applied: ${result.completed.join(", ")}`);
|
|
147
|
+
if (result.failed.length > 0)
|
|
148
|
+
write(`failed: ${result.failed.join(", ")}`);
|
|
149
|
+
for (const blocked of result.blocked) {
|
|
150
|
+
write(` ${blocked.component}: ${reasonOf(blocked)}, so it never ran`);
|
|
151
|
+
}
|
|
152
|
+
const counts = `${result.completed.length} applied, ${result.failed.length} failed, ` +
|
|
153
|
+
`${result.blocked.length} blocked`;
|
|
154
|
+
write(result.status === "ok" ? `fan-out completed: ${counts}` : `fan-out failed: ${counts}`);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The plan or the run result as JSON on stdout, and nothing else on stdout.
|
|
158
|
+
*
|
|
159
|
+
* One function for both because the run result carries the plan under `plan`,
|
|
160
|
+
* so a consumer discriminates on that key rather than on a flag it was told
|
|
161
|
+
* about out of band.
|
|
162
|
+
*/
|
|
163
|
+
export function renderFanOutJson(payload, write = stdout) {
|
|
164
|
+
write(JSON.stringify(payload));
|
|
165
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fan-out attempt record (`--resume`, #2420, #2417, #3049): what an
|
|
3
|
+
* attempt left behind and what the next one reads.
|
|
4
|
+
*
|
|
5
|
+
* It lives here rather than in the CLI handler so a caller that runs a wave
|
|
6
|
+
* per CI job (#3183) reads and writes the same file without importing the
|
|
7
|
+
* command.
|
|
8
|
+
*
|
|
9
|
+
* The digest is stored alongside the progress because progress is only
|
|
10
|
+
* meaningful for the plan it was made against. A fan-out derived from different
|
|
11
|
+
* source is a different fan-out, and carrying "cluster-a already applied" into
|
|
12
|
+
* it would be a claim about work nobody did.
|
|
13
|
+
*
|
|
14
|
+
* `outputs` holds what each completed component exposed. A component left to
|
|
15
|
+
* run may read one of them through `stackOutput()`, and without the record the
|
|
16
|
+
* re-run would resolve that reference to nothing unless somebody supplied the
|
|
17
|
+
* value by hand with `--seed-outputs`.
|
|
18
|
+
*
|
|
19
|
+
* `waves`, for a gated-wave fan-out, holds one entry per wave reached: its set
|
|
20
|
+
* digest, its members, its gate and where it got to. A resumed attempt plans
|
|
21
|
+
* a wave afresh rather than trusting this, since the point of the gate is the
|
|
22
|
+
* plan now. The entries are for whoever reads the record, the plan report
|
|
23
|
+
* (#3349) among them.
|
|
24
|
+
*
|
|
25
|
+
* `carried` holds what a step asked to keep for its member (#3459). It rides
|
|
26
|
+
* in the record rather than beside it because the record is the one file a
|
|
27
|
+
* per-wave CI job hands to the next.
|
|
28
|
+
*/
|
|
29
|
+
import { dirname } from "node:path";
|
|
30
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
31
|
+
import { readWaveRecords } from "../gated-waves.js";
|
|
32
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
33
|
+
const isStringArray = (value) => Array.isArray(value) && value.every((v) => typeof v === "string");
|
|
34
|
+
/** The `prApply` entry, when it has every field a resume needs. Anything else reads as no entry. */
|
|
35
|
+
function readPrApplyRecord(value) {
|
|
36
|
+
if (!isRecord(value))
|
|
37
|
+
return undefined;
|
|
38
|
+
const { op, gate, head, digest, approvedBy, members, changeSet, planOutputs } = value;
|
|
39
|
+
if (typeof op !== "string" || typeof gate !== "string" || typeof head !== "string" || typeof digest !== "string")
|
|
40
|
+
return undefined;
|
|
41
|
+
if (!isStringArray(approvedBy) || !Array.isArray(members) || !members.every(isRecord))
|
|
42
|
+
return undefined;
|
|
43
|
+
if (!isRecord(changeSet) || changeSet.digest !== digest || !Array.isArray(changeSet.members) || !Array.isArray(changeSet.entries))
|
|
44
|
+
return undefined;
|
|
45
|
+
const outputs = {};
|
|
46
|
+
if (isRecord(planOutputs)) {
|
|
47
|
+
for (const [name, v] of Object.entries(planOutputs))
|
|
48
|
+
if (isRecord(v))
|
|
49
|
+
outputs[name] = v;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
op,
|
|
53
|
+
gate,
|
|
54
|
+
head,
|
|
55
|
+
digest,
|
|
56
|
+
approvedBy,
|
|
57
|
+
members: members,
|
|
58
|
+
changeSet: changeSet,
|
|
59
|
+
planOutputs: outputs,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Read an attempt record, or `undefined` when there is none yet. Throws on a file that is not JSON. */
|
|
63
|
+
export function readFanOutAttempt(path) {
|
|
64
|
+
if (!existsSync(path))
|
|
65
|
+
return undefined;
|
|
66
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
67
|
+
const outputs = {};
|
|
68
|
+
if (isRecord(parsed.outputs)) {
|
|
69
|
+
for (const [name, value] of Object.entries(parsed.outputs))
|
|
70
|
+
if (isRecord(value))
|
|
71
|
+
outputs[name] = value;
|
|
72
|
+
}
|
|
73
|
+
const waves = readWaveRecords(parsed.waves);
|
|
74
|
+
const prApply = readPrApplyRecord(parsed.prApply);
|
|
75
|
+
return {
|
|
76
|
+
digest: typeof parsed.digest === "string" ? parsed.digest : "",
|
|
77
|
+
completed: Array.isArray(parsed.completed) ? parsed.completed.filter((n) => typeof n === "string") : [],
|
|
78
|
+
failed: Array.isArray(parsed.failed) ? parsed.failed.filter((n) => typeof n === "string") : [],
|
|
79
|
+
outputs,
|
|
80
|
+
...(waves.length > 0 ? { waves } : {}),
|
|
81
|
+
...(isRecord(parsed.carried) && Object.keys(parsed.carried).length > 0 ? { carried: parsed.carried } : {}),
|
|
82
|
+
...(prApply ? { prApply } : {}),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Written through a temporary file and a rename, so a process killed during the
|
|
87
|
+
* write leaves the previous record whole rather than half a JSON document.
|
|
88
|
+
*/
|
|
89
|
+
export function writeFanOutAttempt(path, attempt) {
|
|
90
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
91
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
92
|
+
writeFileSync(temporary, JSON.stringify(attempt, null, 2) + "\n");
|
|
93
|
+
renameSync(temporary, path);
|
|
94
|
+
}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run a derived fan-out (#2417).
|
|
3
|
+
*
|
|
4
|
+
* `./fan-out.ts` decides who runs and in what order; this dispatches it. The
|
|
5
|
+
* two are separate because the deciding is worth testing without a cloud, and
|
|
6
|
+
* because the same plan is what one approval is bound to.
|
|
7
|
+
*
|
|
8
|
+
* ## Why not `runInterpretDriver`
|
|
9
|
+
*
|
|
10
|
+
* That runner stops the whole run at the first failed component, which is the
|
|
11
|
+
* right default for `chant run --components all`: there, the user asked for
|
|
12
|
+
* everything, and a failure means the estate is in a state nobody described.
|
|
13
|
+
*
|
|
14
|
+
* A fan-out is the case where that default throws away the point. The order was
|
|
15
|
+
* derived from the source, so a branch sharing no edge with the failure is
|
|
16
|
+
* *known* to be independent rather than assumed to be. Stopping it buys nothing
|
|
17
|
+
* and costs a second approval to finish. So this runner skips the failed
|
|
18
|
+
* component's subtree and lets the rest of the wave plan proceed.
|
|
19
|
+
*
|
|
20
|
+
* Neither runner's behaviour changes the other's: `runInterpretDriver` is
|
|
21
|
+
* untouched.
|
|
22
|
+
*
|
|
23
|
+
* ## One approval, not one per component
|
|
24
|
+
*
|
|
25
|
+
* The gate is evaluated once, before the first wave, bound to the plan's digest
|
|
26
|
+
* through the same `planDigest` mechanism #2300 gave gates. Twenty components
|
|
27
|
+
* behind one fan-out is one approval, and re-deriving the same fan-out does not
|
|
28
|
+
* expire it. A component's *own* authored gates still decide per component —
|
|
29
|
+
* this adds a gate over the set, it does not remove the ones inside it.
|
|
30
|
+
*
|
|
31
|
+
* ## Or one approval per wave
|
|
32
|
+
*
|
|
33
|
+
* `waveGate` (#3049) is the other mode. Each wave is planned once the waves
|
|
34
|
+
* before it applied, and its gate binds that wave's set digest
|
|
35
|
+
* (`../gated-waves.ts`). See {@link runGatedWaves}.
|
|
36
|
+
*/
|
|
37
|
+
import { deployContext, runComponentDeploy, } from "./driver.js";
|
|
38
|
+
import { downstreamWithin, remainingFanOut } from "./fan-out.js";
|
|
39
|
+
import { evaluateGate, gitGateLedgerPort } from "../op/gate.js";
|
|
40
|
+
import { planWaveComponent } from "./wave-plan.js";
|
|
41
|
+
import { waveGateName, waveSetDigest } from "../gated-waves.js";
|
|
42
|
+
/** Thrown when `FanOutWaveGate.only` names a wave whose predecessors have not all applied. */
|
|
43
|
+
export class EarlierWaveNotAppliedError extends Error {
|
|
44
|
+
constructor(wave, earlier, components) {
|
|
45
|
+
super(`wave ${wave} cannot run yet: wave ${earlier} has not applied (${components.join(", ")}). ` +
|
|
46
|
+
`Run wave ${earlier} first, with the same --resume record.`);
|
|
47
|
+
this.wave = wave;
|
|
48
|
+
this.earlier = earlier;
|
|
49
|
+
this.components = components;
|
|
50
|
+
this.name = "EarlierWaveNotAppliedError";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Dispatch a fan-out plan.
|
|
55
|
+
*
|
|
56
|
+
* Resolves rather than throws on a failed component: a fan-out's partial
|
|
57
|
+
* outcome is the interesting one, and the caller needs `completed` to resume.
|
|
58
|
+
*/
|
|
59
|
+
export async function runFanOut(plan, components, registry, options) {
|
|
60
|
+
const byName = new Map(components.map((c) => [c.name, c]));
|
|
61
|
+
const gates = {
|
|
62
|
+
port: options.gates ?? gitGateLedgerPort(),
|
|
63
|
+
...(options.now ? { now: options.now } : {}),
|
|
64
|
+
};
|
|
65
|
+
const componentOutputs = { ...(options.componentOutputs ?? {}) };
|
|
66
|
+
// Resume first, so the gate is decided against the work that is actually left
|
|
67
|
+
// and a re-run does not re-approve. The digest is carried, not recomputed.
|
|
68
|
+
const active = options.progress ? remainingFanOut(plan, components, options.progress) : plan;
|
|
69
|
+
if (options.gate && options.waveGate) {
|
|
70
|
+
throw new Error("a fan-out takes one gate over the set or one gate per wave, not both");
|
|
71
|
+
}
|
|
72
|
+
if (options.waveGate && options.plans) {
|
|
73
|
+
throw new Error("a gated-wave fan-out plans each wave itself, so it takes no plans made beforehand");
|
|
74
|
+
}
|
|
75
|
+
if (options.waveGate) {
|
|
76
|
+
return runGatedWaves(plan, active, components, registry, options, options.waveGate, gates, componentOutputs);
|
|
77
|
+
}
|
|
78
|
+
if (options.gate) {
|
|
79
|
+
const check = await evaluateGate(gates.port, {
|
|
80
|
+
op: options.gate.op,
|
|
81
|
+
gate: options.gate.gate,
|
|
82
|
+
planDigest: active.digest,
|
|
83
|
+
...(options.gate.description ? { description: options.gate.description } : {}),
|
|
84
|
+
...(options.gate.timeout ? { timeout: options.gate.timeout } : {}),
|
|
85
|
+
...(options.now ? { now: options.now } : {}),
|
|
86
|
+
});
|
|
87
|
+
if (!check.satisfied) {
|
|
88
|
+
// Nothing ran, so nothing is half-applied and there is nothing to
|
|
89
|
+
// compensate. A gate is a fact, not a failure.
|
|
90
|
+
return {
|
|
91
|
+
plan: active,
|
|
92
|
+
status: "gated",
|
|
93
|
+
results: [],
|
|
94
|
+
completed: [],
|
|
95
|
+
failed: [],
|
|
96
|
+
blocked: [],
|
|
97
|
+
componentOutputs,
|
|
98
|
+
gate: check.pending,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const results = [];
|
|
103
|
+
const completed = [];
|
|
104
|
+
const failed = [];
|
|
105
|
+
const blockedBy = new Map();
|
|
106
|
+
let gatedFact;
|
|
107
|
+
const inPlan = new Set(active.order);
|
|
108
|
+
/** Skip everything downstream of `root`, blaming `root` rather than the nearest edge. */
|
|
109
|
+
const markBlocked = (root) => {
|
|
110
|
+
for (const [component, by] of downstreamWithin(components, inPlan, [root])) {
|
|
111
|
+
if (blockedBy.has(component) || failed.includes(component))
|
|
112
|
+
continue;
|
|
113
|
+
blockedBy.set(component, by);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
options.onProgress?.({ type: "run-start", waves: active.waves });
|
|
117
|
+
for (const [waveIndex, wave] of active.waves.entries()) {
|
|
118
|
+
const waveNum = waveIndex + 1;
|
|
119
|
+
// A component whose upstream failed in an earlier wave is not dispatched.
|
|
120
|
+
const runnable = wave.filter((name) => inPlan.has(name) && !blockedBy.has(name));
|
|
121
|
+
if (runnable.length === 0)
|
|
122
|
+
continue;
|
|
123
|
+
options.onProgress?.({ type: "wave-start", wave: waveNum, components: runnable });
|
|
124
|
+
const waveResults = await Promise.all(runnable.map(async (name) => {
|
|
125
|
+
options.onProgress?.({ type: "component-start", wave: waveNum, component: name });
|
|
126
|
+
const planned = options.plans?.[name];
|
|
127
|
+
const result = await runComponentDeploy(byName.get(name), { ...fanOutContext(options, name), ...(planned && Object.keys(planned).length > 0 ? { plans: planned } : {}) }, registry, componentOutputs, options.onProgress, gates);
|
|
128
|
+
options.onProgress?.({
|
|
129
|
+
type: "component-done",
|
|
130
|
+
wave: waveNum,
|
|
131
|
+
component: name,
|
|
132
|
+
status: result.status === "fail" ? "failed" : result.status,
|
|
133
|
+
});
|
|
134
|
+
options.onComponentSettled?.(result, componentOutputs[name]);
|
|
135
|
+
return result;
|
|
136
|
+
}));
|
|
137
|
+
results.push(...waveResults);
|
|
138
|
+
for (const result of waveResults) {
|
|
139
|
+
if (result.status === "ok") {
|
|
140
|
+
completed.push(result.component);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (result.status === "fail") {
|
|
144
|
+
failed.push(result.component);
|
|
145
|
+
markBlocked(result.component);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
// A component of its own stopped at one of its authored gates. Its
|
|
149
|
+
// dependents cannot run either, for the same reason a failure's cannot:
|
|
150
|
+
// the value they would read has not landed.
|
|
151
|
+
gatedFact ?? (gatedFact = result.gate);
|
|
152
|
+
markBlocked(result.component);
|
|
153
|
+
}
|
|
154
|
+
const waveFailed = waveResults.some((r) => r.status === "fail");
|
|
155
|
+
options.onProgress?.({
|
|
156
|
+
type: "wave-done",
|
|
157
|
+
wave: waveNum,
|
|
158
|
+
status: waveFailed ? "failed" : waveResults.some((r) => r.status === "gated") ? "gated" : "ok",
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const blocked = [...blockedBy.entries()]
|
|
162
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
163
|
+
.map(([component, by]) => ({ component, reason: "blocked", blockedBy: by }));
|
|
164
|
+
// A failure outranks a gate: something is actually broken, and reporting the
|
|
165
|
+
// run as "waiting on a human" would hide it. Same precedence the driver uses.
|
|
166
|
+
const status = failed.length > 0 ? "fail" : gatedFact ? "gated" : "ok";
|
|
167
|
+
options.onProgress?.({ type: "run-done", status: status === "fail" ? "failed" : status });
|
|
168
|
+
return {
|
|
169
|
+
plan: active,
|
|
170
|
+
status,
|
|
171
|
+
results,
|
|
172
|
+
completed: [...completed].sort(),
|
|
173
|
+
failed: [...failed].sort(),
|
|
174
|
+
blocked,
|
|
175
|
+
componentOutputs,
|
|
176
|
+
...(gatedFact ? { gate: gatedFact } : {}),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** The run's `deployContext`, with the carried state and the carry callback (#3459) when the caller gave them. */
|
|
180
|
+
function fanOutContext(options, component) {
|
|
181
|
+
return {
|
|
182
|
+
...deployContext(options, component),
|
|
183
|
+
...(options.carried && Object.keys(options.carried).length > 0 ? { carried: options.carried } : {}),
|
|
184
|
+
...(options.onCarry ? { carry: options.onCarry } : {}),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/** A plan failure as a component result, so it reads like any other failed component. */
|
|
188
|
+
function planFailure(component, error) {
|
|
189
|
+
return {
|
|
190
|
+
component,
|
|
191
|
+
ok: false,
|
|
192
|
+
status: "fail",
|
|
193
|
+
records: [{ component, phase: "Plan", kind: "plan", status: "fail", durationMs: 0, error }],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* The per-wave mode (#3049). Waves keep the numbers the derivation gave them,
|
|
198
|
+
* so on a resumed attempt wave 3 is still wave 3 and its gate, and the
|
|
199
|
+
* approval recorded for it, are the same ones.
|
|
200
|
+
*
|
|
201
|
+
* For each wave with work left: plan its components against the outputs
|
|
202
|
+
* earlier waves wrote, take the set digest of what was planned, and decide
|
|
203
|
+
* `waveGateName(gate, n)` against it. Approved, the wave runs, each
|
|
204
|
+
* component applying the plans its steps just made. Not approved, the run
|
|
205
|
+
* stops there with nothing in that wave or after it applied. An approval
|
|
206
|
+
* that stands for another digest (the set changed since someone approved
|
|
207
|
+
* it) is the same stop, and the record names both digests.
|
|
208
|
+
*
|
|
209
|
+
* A component that fails to plan or to apply blocks its own dependents and
|
|
210
|
+
* nothing else, as in the whole-set mode.
|
|
211
|
+
*/
|
|
212
|
+
async function runGatedWaves(plan, active, components, registry, options, waveGate, gates, componentOutputs) {
|
|
213
|
+
const byName = new Map(components.map((c) => [c.name, c]));
|
|
214
|
+
const left = new Set(active.order);
|
|
215
|
+
const planComponent = waveGate.planComponent ??
|
|
216
|
+
((component, ctx, outputs) => planWaveComponent(component, registry, ctx, outputs));
|
|
217
|
+
const results = [];
|
|
218
|
+
const completed = [];
|
|
219
|
+
const failed = [];
|
|
220
|
+
const blockedBy = new Map();
|
|
221
|
+
const waves = [];
|
|
222
|
+
let gatedFact;
|
|
223
|
+
const markBlocked = (root) => {
|
|
224
|
+
for (const [component, by] of downstreamWithin(components, left, [root])) {
|
|
225
|
+
if (blockedBy.has(component) || failed.includes(component))
|
|
226
|
+
continue;
|
|
227
|
+
blockedBy.set(component, by);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
options.onProgress?.({ type: "run-start", waves: plan.waves });
|
|
231
|
+
for (const [waveIndex, wave] of plan.waves.entries()) {
|
|
232
|
+
const waveNum = waveIndex + 1;
|
|
233
|
+
const runnable = wave.filter((name) => left.has(name) && !blockedBy.has(name));
|
|
234
|
+
if (waveGate.only !== undefined && waveNum < waveGate.only) {
|
|
235
|
+
if (runnable.length > 0)
|
|
236
|
+
throw new EarlierWaveNotAppliedError(waveGate.only, waveNum, runnable);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (waveGate.only !== undefined && waveNum > waveGate.only)
|
|
240
|
+
break;
|
|
241
|
+
if (runnable.length === 0)
|
|
242
|
+
continue;
|
|
243
|
+
const gateName = waveGateName(waveGate.gate, waveNum);
|
|
244
|
+
const contexts = new Map(runnable.map((name) => [name, fanOutContext(options, name)]));
|
|
245
|
+
const planned = await Promise.all(runnable.map((name) => planComponent(byName.get(name), contexts.get(name), componentOutputs)));
|
|
246
|
+
const members = [];
|
|
247
|
+
const plansFor = new Map();
|
|
248
|
+
const waveFailures = [];
|
|
249
|
+
for (const p of planned) {
|
|
250
|
+
if ("error" in p) {
|
|
251
|
+
waveFailures.push({ component: p.component, error: p.error });
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
members.push(...p.members);
|
|
255
|
+
plansFor.set(p.component, p.plans);
|
|
256
|
+
}
|
|
257
|
+
let digest;
|
|
258
|
+
try {
|
|
259
|
+
// A wave where nothing planned has no set, and so no digest.
|
|
260
|
+
digest = members.length > 0 ? waveSetDigest(members) : "";
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
// Two components planning the same root: there is no one plan for it.
|
|
264
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
265
|
+
for (const name of plansFor.keys())
|
|
266
|
+
waveFailures.push({ component: name, error });
|
|
267
|
+
plansFor.clear();
|
|
268
|
+
digest = "";
|
|
269
|
+
}
|
|
270
|
+
for (const f of waveFailures) {
|
|
271
|
+
failed.push(f.component);
|
|
272
|
+
results.push(planFailure(f.component, f.error ?? "plan failed"));
|
|
273
|
+
markBlocked(f.component);
|
|
274
|
+
}
|
|
275
|
+
const toRun = runnable.filter((name) => plansFor.has(name));
|
|
276
|
+
const record = {
|
|
277
|
+
wave: waveNum,
|
|
278
|
+
op: waveGate.op,
|
|
279
|
+
gate: gateName,
|
|
280
|
+
components: [...runnable].sort(),
|
|
281
|
+
digest,
|
|
282
|
+
members: [...members].sort((a, b) => a.member.localeCompare(b.member)),
|
|
283
|
+
status: "failed",
|
|
284
|
+
...(waveFailures.length > 0 ? { failed: waveFailures } : {}),
|
|
285
|
+
};
|
|
286
|
+
if (toRun.length === 0) {
|
|
287
|
+
waves.push(record);
|
|
288
|
+
options.onWaveSettled?.(record);
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
const check = await evaluateGate(gates.port, {
|
|
292
|
+
op: waveGate.op,
|
|
293
|
+
gate: gateName,
|
|
294
|
+
planDigest: digest,
|
|
295
|
+
description: waveGate.description ?? `wave ${waveNum} of ${plan.waves.length}: ${toRun.join(", ")}`,
|
|
296
|
+
...(waveGate.timeout ? { timeout: waveGate.timeout } : {}),
|
|
297
|
+
...(options.now ? { now: options.now } : {}),
|
|
298
|
+
});
|
|
299
|
+
if (!check.satisfied) {
|
|
300
|
+
// Nothing in this wave ran, and no later wave is planned: its plan
|
|
301
|
+
// would read outputs this wave has not written.
|
|
302
|
+
const stopped = {
|
|
303
|
+
...record,
|
|
304
|
+
status: "gated",
|
|
305
|
+
...(check.mismatch?.approved ? { approved: check.mismatch.approved } : {}),
|
|
306
|
+
};
|
|
307
|
+
waves.push(stopped);
|
|
308
|
+
options.onWaveSettled?.(stopped);
|
|
309
|
+
gatedFact = check.pending;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
options.onProgress?.({ type: "wave-start", wave: waveNum, components: toRun });
|
|
313
|
+
const waveResults = await Promise.all(toRun.map(async (name) => {
|
|
314
|
+
options.onProgress?.({ type: "component-start", wave: waveNum, component: name });
|
|
315
|
+
const plans = plansFor.get(name);
|
|
316
|
+
const ctx = { ...contexts.get(name), ...(Object.keys(plans).length > 0 ? { plans } : {}) };
|
|
317
|
+
const result = await runComponentDeploy(byName.get(name), ctx, registry, componentOutputs, options.onProgress, gates);
|
|
318
|
+
options.onProgress?.({
|
|
319
|
+
type: "component-done",
|
|
320
|
+
wave: waveNum,
|
|
321
|
+
component: name,
|
|
322
|
+
status: result.status === "fail" ? "failed" : result.status,
|
|
323
|
+
});
|
|
324
|
+
options.onComponentSettled?.(result, componentOutputs[name]);
|
|
325
|
+
return result;
|
|
326
|
+
}));
|
|
327
|
+
results.push(...waveResults);
|
|
328
|
+
for (const result of waveResults) {
|
|
329
|
+
if (result.status === "ok") {
|
|
330
|
+
completed.push(result.component);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
if (result.status === "fail") {
|
|
334
|
+
failed.push(result.component);
|
|
335
|
+
waveFailures.push({ component: result.component });
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
gatedFact ?? (gatedFact = result.gate);
|
|
339
|
+
}
|
|
340
|
+
markBlocked(result.component);
|
|
341
|
+
}
|
|
342
|
+
const settled = {
|
|
343
|
+
...record,
|
|
344
|
+
status: waveFailures.length > 0 ? "failed" : "applied",
|
|
345
|
+
approvedBy: check.resolution.resolvedBy,
|
|
346
|
+
...(waveFailures.length > 0 ? { failed: waveFailures } : {}),
|
|
347
|
+
};
|
|
348
|
+
waves.push(settled);
|
|
349
|
+
options.onWaveSettled?.(settled);
|
|
350
|
+
options.onProgress?.({
|
|
351
|
+
type: "wave-done",
|
|
352
|
+
wave: waveNum,
|
|
353
|
+
status: waveFailures.length > 0 ? "failed" : waveResults.some((r) => r.status === "gated") ? "gated" : "ok",
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
const blocked = [...blockedBy.entries()]
|
|
357
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
358
|
+
.map(([component, by]) => ({ component, reason: "blocked", blockedBy: by }));
|
|
359
|
+
const status = failed.length > 0 ? "fail" : gatedFact ? "gated" : "ok";
|
|
360
|
+
options.onProgress?.({ type: "run-done", status: status === "fail" ? "failed" : status });
|
|
361
|
+
return {
|
|
362
|
+
// The derivation's waves, not the narrowed re-layering: their numbers name the gates.
|
|
363
|
+
plan: { ...active, waves: plan.waves },
|
|
364
|
+
status,
|
|
365
|
+
results,
|
|
366
|
+
completed: [...completed].sort(),
|
|
367
|
+
failed: [...failed].sort(),
|
|
368
|
+
blocked,
|
|
369
|
+
componentOutputs,
|
|
370
|
+
...(gatedFact ? { gate: gatedFact } : {}),
|
|
371
|
+
waves,
|
|
372
|
+
};
|
|
373
|
+
}
|