@intentius/chant 0.124.12 → 0.124.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +36 -6
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +5 -30
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant approve policy-override <subject> --rule <id>... --reason <text>`
|
|
3
|
+
* (#3760): record a person's override of the denial a run recorded for
|
|
4
|
+
* `subject`. The override is an approval of the denial's override digest
|
|
5
|
+
* (`../../override-gate.ts`), with the reason as its note, written by the
|
|
6
|
+
* same `recordGateApproval` every `chant approve` uses, so `--sign`,
|
|
7
|
+
* `--actor`, `--relayed-by` and `--url` work as they do there.
|
|
8
|
+
*
|
|
9
|
+
* It names the rules it overrides, which must be exactly the rules the denial
|
|
10
|
+
* recorded: the approver says what they are letting through. Whether the
|
|
11
|
+
* override counts is decided by the run, against the overriders and signers
|
|
12
|
+
* at base; this command only warns when the checkout's own overriders file
|
|
13
|
+
* would not count it. A product that keeps its overriders in its own config
|
|
14
|
+
* sets `CHANT_OVERRIDERS_FROM` (to where it reads them, e.g. `policy.override
|
|
15
|
+
* in terragucci.config.ts`), and the checkout check is skipped (#3824).
|
|
16
|
+
*/
|
|
17
|
+
import { currentGateOrigin, isModelAuthored } from "../../lifecycle/gate-origin.js";
|
|
18
|
+
import { requireLifecycleLedger } from "../../lifecycle/git.js";
|
|
19
|
+
import { readOverrideLedger } from "../../lifecycle/override-ledger.js";
|
|
20
|
+
import { samePlanDigest } from "../../lifecycle/plan-digest.js";
|
|
21
|
+
import { OVERRIDE_OP, OVERRIDERS_PATH, overrideCommand, overridersAt, recordedDenials, sortedRules } from "../../override-gate.js";
|
|
22
|
+
import { formatError, formatInfo, formatWarning } from "../format.js";
|
|
23
|
+
import { recordGateApproval } from "./operator.js";
|
|
24
|
+
const norm = (s) => s.normalize("NFKC").trim().toLowerCase();
|
|
25
|
+
export async function runOverrideApprove(ctx) {
|
|
26
|
+
const subject = ctx.args.extraPositional;
|
|
27
|
+
const usage = overrideCommand(subject, ctx.args.rules?.length ? ctx.args.rules : ["<id>"]);
|
|
28
|
+
if (ctx.args.reason !== undefined && ctx.args.note !== undefined && ctx.args.reason.trim() !== ctx.args.note.trim()) {
|
|
29
|
+
console.error(formatError({ message: "Give the override's reason once: --reason <text> (--note is the same field)", hint: usage }));
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
const reason = (ctx.args.reason ?? ctx.args.note)?.trim();
|
|
33
|
+
const rules = sortedRules(ctx.args.rules ?? []);
|
|
34
|
+
if (rules.length === 0) {
|
|
35
|
+
console.error(formatError({ message: `An override names each rule it overrides with --rule <id>`, hint: usage }));
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
if (!reason) {
|
|
39
|
+
console.error(formatError({ message: `An override needs --reason <text>: why this plan goes out although the policy denies it`, hint: usage }));
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
if (ctx.args.agent || isModelAuthored(currentGateOrigin())) {
|
|
43
|
+
console.error(formatError({ message: `An override is a person's: it is never recorded by an agent or over MCP or ACP`, hint: `${usage}, at a shell.` }));
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
await requireLifecycleLedger();
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error(formatError({ message: `Cannot record the override: ${err instanceof Error ? err.message : String(err)}` }));
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
const ledger = await readOverrideLedger();
|
|
54
|
+
const denials = recordedDenials(ledger.pending);
|
|
55
|
+
const denial = denials.find((d) => d.gate === subject);
|
|
56
|
+
if (!denial) {
|
|
57
|
+
console.error(formatError({
|
|
58
|
+
message: `No denial of ${subject} is recorded on ${OVERRIDE_OP}` + (denials.length ? `; denied: ${denials.map((d) => d.gate).join(", ")}` : ""),
|
|
59
|
+
hint: "A run records one when its policy denies the plan. An override answers that denial, for that plan.",
|
|
60
|
+
}));
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
if (denial.rules.join("\n") !== rules.join("\n")) {
|
|
64
|
+
console.error(formatError({
|
|
65
|
+
message: `${subject} was denied by ${denial.rules.join(", ") || "no rule it named"}; an override names exactly those rules, and --rule gave ${rules.join(", ")}`,
|
|
66
|
+
hint: overrideCommand(subject, denial.rules),
|
|
67
|
+
}));
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
if (ctx.args.plan !== undefined && !samePlanDigest(ctx.args.plan, denial.plan) && !samePlanDigest(ctx.args.plan, denial.planDigest)) {
|
|
71
|
+
console.error(formatError({
|
|
72
|
+
message: `--plan ${ctx.args.plan} is not the plan denied for ${subject}: the newest denial is of ${denial.plan || denial.planDigest}`,
|
|
73
|
+
hint: "Run the plan again, or override the denial that stands.",
|
|
74
|
+
}));
|
|
75
|
+
return 1;
|
|
76
|
+
}
|
|
77
|
+
const outcome = await recordGateApproval(OVERRIDE_OP, subject, {
|
|
78
|
+
actor: ctx.args.approver ?? ctx.args.actor,
|
|
79
|
+
note: reason,
|
|
80
|
+
url: ctx.args.url,
|
|
81
|
+
plan: denial.planDigest,
|
|
82
|
+
allowSameOrigin: ctx.args.allowSameOrigin,
|
|
83
|
+
...(ctx.args.roles ? { roles: ctx.args.roles } : {}),
|
|
84
|
+
...(ctx.args.sign !== undefined ? { sign: ctx.args.sign } : {}),
|
|
85
|
+
...(ctx.args.relayedBy !== undefined ? { relayedBy: ctx.args.relayedBy } : {}),
|
|
86
|
+
});
|
|
87
|
+
if (!outcome.ok)
|
|
88
|
+
return 1;
|
|
89
|
+
console.error(formatInfo(`This overrides the denial of ${subject} by ${rules.join(", ")} for the plan ${denial.plan || denial.planDigest}. ` +
|
|
90
|
+
`The next run that plans it applies it once; a plan that moves, or rules that change, need their own override.`));
|
|
91
|
+
const from = process.env.CHANT_OVERRIDERS_FROM?.trim();
|
|
92
|
+
if (from)
|
|
93
|
+
return 0;
|
|
94
|
+
const here = overridersAt(process.cwd(), "HEAD");
|
|
95
|
+
if (!here.active) {
|
|
96
|
+
console.error(formatWarning({ message: `This checkout has no ${OVERRIDERS_PATH}: unless the run reads its overriders from elsewhere at base, no override counts (a tool that does sets CHANT_OVERRIDERS_FROM to say so)` }));
|
|
97
|
+
}
|
|
98
|
+
else if (!here.principals.map(norm).includes(norm(outcome.record.resolvedBy))) {
|
|
99
|
+
console.error(formatWarning({ message: `${outcome.record.resolvedBy} is not in ${OVERRIDERS_PATH} here (${here.principals.join(", ") || "nobody"}), so a run that reads it at base does not count this override` }));
|
|
100
|
+
}
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant components pr-plan` and `chant components pr-apply` (#3183): the
|
|
3
|
+
* pull-request loop the generated CI runs.
|
|
4
|
+
*
|
|
5
|
+
* ```
|
|
6
|
+
* chant components pr-plan --base <ref> --pr <n> --env <env> [--forge github|gitlab|forgejo]
|
|
7
|
+
* chant approve pr-<n> pr-apply --plan <digest> --approver github:<login> --sign
|
|
8
|
+
* chant components pr-apply --base <ref> --env <env> [--pr <n>] [--forge <kind>] [--require-review] [--resume <file>]
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Both measure the change from the merge base of `--base` and `HEAD`, select
|
|
12
|
+
* the components it reaches and the ones that depend on them (the fan-out's
|
|
13
|
+
* derivation, #2417), and plan every member before anything applies
|
|
14
|
+
* (`../../components/pr-run.ts`). pr-plan writes the report and the note and
|
|
15
|
+
* applies nothing; it reads the gate ledger and writes nothing to it, since
|
|
16
|
+
* it runs the pull request's own code. pr-apply plans the same members on
|
|
17
|
+
* the merged commit, decides the gate against the digest it gets, and
|
|
18
|
+
* applies only when an approval stands for that digest. A moved plan stops
|
|
19
|
+
* it with both digests named and nothing applied (exit 3).
|
|
20
|
+
*
|
|
21
|
+
* `--resume <file>` (#3464) finishes an apply that failed partway, the way
|
|
22
|
+
* `components fan-out --resume` does (#2417, #3049). The apply writes the
|
|
23
|
+
* attempt record as each component settles: the change set the gate
|
|
24
|
+
* approved and the components that applied. Repeated on the same commit
|
|
25
|
+
* with the same record, it plans only what is left, checks each member
|
|
26
|
+
* against the approved set (`resumePrSet`) and, when all are covered and the
|
|
27
|
+
* approval still stands, applies the rest without a fresh approval. When
|
|
28
|
+
* they are not covered it says why and runs as it would without a record.
|
|
29
|
+
*
|
|
30
|
+
* Every run writes `pr-plan.json` or `pr-apply.json` (`pr-report.schema.json`),
|
|
31
|
+
* `change-set.json` and `pr-note.md` under `--output` (default `.chant/pr`). *
|
|
32
|
+
* `--member <name>` (#3465) runs a workspace member's loop: the member's
|
|
33
|
+
* generated pipeline passes it from the member's directory. The gate is
|
|
34
|
+
* recorded under `pr-<n>-<member>`, and the note and the statuses carry the
|
|
35
|
+
* member's name, so each member's loop on one pull request stands apart.
|
|
36
|
+
* The name must be the member that owns the current directory.
|
|
37
|
+
*/
|
|
38
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
39
|
+
import { join, resolve } from "node:path";
|
|
40
|
+
import { loadChantConfig, resolveAutoReleaseDisabled } from "../../config.js";
|
|
41
|
+
import { resolveCommit, resolveMergeBase } from "../../components/changed-files.js";
|
|
42
|
+
import { deriveFanOut, fanOutRegistry } from "../../components/fan-out-support.js";
|
|
43
|
+
import { applyPrSet, approvalOf, approversWithoutReview, decidePrGate, planPrSet, prReport, readOnlyLedger, resumePrSet, } from "../../components/pr-run.js";
|
|
44
|
+
import { readFanOutAttempt, writeFanOutAttempt } from "../../components/fan-out-record.js";
|
|
45
|
+
import { samePlanDigest } from "../../lifecycle/plan-digest.js";
|
|
46
|
+
import { gitGateLedgerPort } from "../../op/gate.js";
|
|
47
|
+
import { describePlanChanged, PR_APPLY_GATE, prApproveCommand, prNoteMarker, prOp, prStatusDescription, prStatusContext, prStatusState, renderPrNote, } from "../../pr-loop.js";
|
|
48
|
+
import { FORGE_KINDS, forgeFromEnv, forgePrincipalOf } from "../../pr-forge.js";
|
|
49
|
+
import { GITHUB_COMMENT_LIMIT, GITLAB_NOTE_LIMIT } from "../../plan-summary.js";
|
|
50
|
+
import { resolveCliBuildParams, parseParamFlags } from "../build-params-cli.js";
|
|
51
|
+
import { formatError, formatInfo, formatSuccess, formatWarning } from "../format.js";
|
|
52
|
+
import { findWorkspaceRoot } from "../../project-root.js";
|
|
53
|
+
import { resolveChangedUnits } from "./fan-out.js";
|
|
54
|
+
import { GATED_EXIT_CODE, recordAutoReleasesForRun } from "./run.js";
|
|
55
|
+
/** Where the reports land unless `--output` says. */
|
|
56
|
+
export const PR_REPORT_DIR = ".chant/pr";
|
|
57
|
+
const fail = (message, hint) => {
|
|
58
|
+
console.error(formatError({ message, ...(hint ? { hint } : {}) }));
|
|
59
|
+
return 1;
|
|
60
|
+
};
|
|
61
|
+
/** Everything both stages share: the change and the derivation. Each stage plans the members itself. */
|
|
62
|
+
async function prepare(ctx, stage) {
|
|
63
|
+
const { args } = ctx;
|
|
64
|
+
const projectPath = resolve(".");
|
|
65
|
+
const { config } = await loadChantConfig(projectPath).catch(() => ({ config: {} }));
|
|
66
|
+
const paramsResolution = resolveCliBuildParams(config.buildParams, {
|
|
67
|
+
cli: parseParamFlags(args.param),
|
|
68
|
+
paramsFile: args.paramsFile,
|
|
69
|
+
verbose: args.verbose,
|
|
70
|
+
});
|
|
71
|
+
if (!paramsResolution.success) {
|
|
72
|
+
for (const message of paramsResolution.errors)
|
|
73
|
+
console.error(message);
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
76
|
+
if (!args.base) {
|
|
77
|
+
return fail(`pr-${stage} needs the commit the change is measured from: --base <ref>`, stage === "plan" ? "On a pull request, the target branch's commit." : "On a push, the commit before it.");
|
|
78
|
+
}
|
|
79
|
+
if (args.fromAffected)
|
|
80
|
+
return fail(`pr-${stage} derives the change itself; drop --from-affected`);
|
|
81
|
+
let member;
|
|
82
|
+
if (args.members?.length) {
|
|
83
|
+
const checked = await checkMember(projectPath, args.members);
|
|
84
|
+
if (typeof checked !== "string")
|
|
85
|
+
return fail(checked.error, checked.hint);
|
|
86
|
+
member = checked;
|
|
87
|
+
}
|
|
88
|
+
if (args.forge !== undefined && !FORGE_KINDS.includes(args.forge)) {
|
|
89
|
+
return fail(`--forge ${args.forge} is not one of ${FORGE_KINDS.join(", ")}`);
|
|
90
|
+
}
|
|
91
|
+
let forge;
|
|
92
|
+
if (args.forge) {
|
|
93
|
+
try {
|
|
94
|
+
forge = forgeFromEnv(args.forge);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
return fail(err instanceof Error ? err.message : String(err));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
let base;
|
|
101
|
+
let head;
|
|
102
|
+
try {
|
|
103
|
+
head = await resolveCommit(projectPath, args.head ?? "HEAD");
|
|
104
|
+
base = await resolveMergeBase(projectPath, args.base, head);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
return fail(err instanceof Error ? err.message : String(err));
|
|
108
|
+
}
|
|
109
|
+
const signal = await resolveChangedUnits(ctx, config, { base, stacksOnly: true });
|
|
110
|
+
if ("error" in signal)
|
|
111
|
+
return fail(signal.error, signal.hint);
|
|
112
|
+
let derived;
|
|
113
|
+
try {
|
|
114
|
+
derived = await deriveFanOut({
|
|
115
|
+
path: projectPath,
|
|
116
|
+
units: signal.units,
|
|
117
|
+
sandbox: args.sandbox,
|
|
118
|
+
buildParams: paramsResolution.provenance,
|
|
119
|
+
config,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return fail(err instanceof Error ? err.message : String(err));
|
|
124
|
+
}
|
|
125
|
+
if (!derived.success)
|
|
126
|
+
return fail(derived.error ?? "Could not discover components");
|
|
127
|
+
const seededOutputs = {};
|
|
128
|
+
for (const file of args.seedOutputs ?? []) {
|
|
129
|
+
try {
|
|
130
|
+
Object.assign(seededOutputs, JSON.parse(readFileSync(resolve(file), "utf8")));
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
return fail(`--seed-outputs: could not read "${file}": ${err instanceof Error ? err.message : String(err)}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const env = args.env ?? "local";
|
|
137
|
+
const registry = await fanOutRegistry(projectPath, config);
|
|
138
|
+
return {
|
|
139
|
+
config,
|
|
140
|
+
env,
|
|
141
|
+
...(member ? { member } : {}),
|
|
142
|
+
base,
|
|
143
|
+
head,
|
|
144
|
+
gate: args.gate ?? PR_APPLY_GATE,
|
|
145
|
+
...(forge ? { forge } : {}),
|
|
146
|
+
components: derived.components,
|
|
147
|
+
plan: derived.plan,
|
|
148
|
+
signal: derived.signal,
|
|
149
|
+
registry,
|
|
150
|
+
seededOutputs,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* The one `--member` name, checked against the workspace member that owns
|
|
155
|
+
* `projectPath`: a pipeline copied into another member would otherwise
|
|
156
|
+
* record its gate under the wrong name.
|
|
157
|
+
*/
|
|
158
|
+
async function checkMember(projectPath, names) {
|
|
159
|
+
if (names.length !== 1)
|
|
160
|
+
return { error: `pr-plan and pr-apply take one --member, not ${names.join(", ")}` };
|
|
161
|
+
const name = names[0];
|
|
162
|
+
const found = findWorkspaceRoot(projectPath);
|
|
163
|
+
if (!found)
|
|
164
|
+
return { error: `--member ${name}: no chant.workspace.json above ${projectPath}`, hint: "Drop --member outside a workspace." };
|
|
165
|
+
const { resolveMemberContext } = await import("../../workspace/member-pipeline.js");
|
|
166
|
+
let owner;
|
|
167
|
+
try {
|
|
168
|
+
owner = resolveMemberContext(projectPath, found)?.member.name;
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
172
|
+
}
|
|
173
|
+
if (owner !== name) {
|
|
174
|
+
return {
|
|
175
|
+
error: `--member ${name}: ${owner ? `this directory belongs to member ${owner}` : "no workspace member owns this directory"}`,
|
|
176
|
+
hint: "Run the command in the member's directory, the way its generated pipeline does.",
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
return name;
|
|
180
|
+
}
|
|
181
|
+
/** Plan every member the derivation selects. */
|
|
182
|
+
function planAll(p) {
|
|
183
|
+
return planPrSet({ components: p.components, plan: p.plan, registry: p.registry, env: p.env, seededOutputs: p.seededOutputs });
|
|
184
|
+
}
|
|
185
|
+
/** Write the report, the change set and the note; print the note's path. */
|
|
186
|
+
function writeOutputs(ctx, report, note) {
|
|
187
|
+
const dir = resolve(ctx.args.output ?? PR_REPORT_DIR);
|
|
188
|
+
mkdirSync(dir, { recursive: true });
|
|
189
|
+
writeFileSync(join(dir, `pr-${report.stage}.json`), JSON.stringify(report, null, 2) + "\n");
|
|
190
|
+
writeFileSync(join(dir, "change-set.json"), JSON.stringify(report.changeSet, null, 2) + "\n");
|
|
191
|
+
writeFileSync(join(dir, "pr-note.md"), note);
|
|
192
|
+
}
|
|
193
|
+
/** Post the note and the stage's status. A forge that refuses is a warning: the stage's outcome stands. */
|
|
194
|
+
async function publish(forge, report, note) {
|
|
195
|
+
if (!forge)
|
|
196
|
+
return;
|
|
197
|
+
const status = {
|
|
198
|
+
context: prStatusContext(report.stage, report.member),
|
|
199
|
+
state: prStatusState(report),
|
|
200
|
+
description: prStatusDescription(report),
|
|
201
|
+
...(forge.runUrl ? { url: forge.runUrl } : {}),
|
|
202
|
+
};
|
|
203
|
+
try {
|
|
204
|
+
await forge.setStatus(report.head, status);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
console.error(formatWarning({ message: `could not set the ${status.context} status: ${err instanceof Error ? err.message : String(err)}` }));
|
|
208
|
+
}
|
|
209
|
+
if (report.pr === null)
|
|
210
|
+
return;
|
|
211
|
+
// A member the change does not reach has nothing to say: one note per
|
|
212
|
+
// member would put a line on every pull request for each member it skips.
|
|
213
|
+
if (report.member && report.status === "nothing")
|
|
214
|
+
return;
|
|
215
|
+
try {
|
|
216
|
+
await forge.upsertNote(report.pr, prNoteMarker(report.env, report.member), note);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
console.error(formatWarning({ message: `could not post the note on #${report.pr}: ${err instanceof Error ? err.message : String(err)}` }));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function noteFor(report, forge) {
|
|
223
|
+
return renderPrNote(report, {
|
|
224
|
+
limit: forge?.kind === "gitlab" ? GITLAB_NOTE_LIMIT : GITHUB_COMMENT_LIMIT,
|
|
225
|
+
approver: forge ? forgePrincipalOf(forge.kind, forge.host, "<your-login>") : "<you>",
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function printMembers(report) {
|
|
229
|
+
for (const m of report.members) {
|
|
230
|
+
const c = m.counts;
|
|
231
|
+
console.error(` ${m.member.padEnd(20)} ${m.status.padEnd(12)} create ${c.create} update ${c.update} replace ${c.replace} delete ${c.delete}${m.error ? ` ${m.error}` : ""}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async function finish(ctx, p, report) {
|
|
235
|
+
const note = noteFor(report, p.forge);
|
|
236
|
+
writeOutputs(ctx, report, note);
|
|
237
|
+
await publish(p.forge, report, note);
|
|
238
|
+
if (ctx.args.json)
|
|
239
|
+
console.log(JSON.stringify(report, null, 2));
|
|
240
|
+
}
|
|
241
|
+
/** chant components pr-plan --base <ref> --pr <n> [--env <env>] [--gate <name>] [--forge <kind>] [--output <dir>] [--json] */
|
|
242
|
+
export async function runComponentsPrPlan(ctx) {
|
|
243
|
+
if (ctx.args.pr === undefined) {
|
|
244
|
+
return fail("pr-plan needs the pull or merge request: --pr <n>", "Its approval is recorded under op pr-<n>, so one pull request's approval never answers another's.");
|
|
245
|
+
}
|
|
246
|
+
const p = await prepare(ctx, "plan");
|
|
247
|
+
if (typeof p === "number")
|
|
248
|
+
return p;
|
|
249
|
+
const set = await planAll(p);
|
|
250
|
+
const op = prOp(ctx.args.pr, p.member);
|
|
251
|
+
let approval = { status: "pending" };
|
|
252
|
+
if (p.plan.order.length > 0) {
|
|
253
|
+
try {
|
|
254
|
+
approval = approvalOf(await decidePrGate(readOnlyLedger(gitGateLedgerPort()), { op, gate: p.gate, digest: set.doc.digest }));
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
console.error(formatWarning({ message: `could not read the gate ledger, so the approval reads as pending: ${err instanceof Error ? err.message : String(err)}` }));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const status = p.plan.order.length === 0 ? "nothing" : set.failed ? "plan-failed" : "planned";
|
|
261
|
+
const report = prReport({
|
|
262
|
+
stage: "plan",
|
|
263
|
+
pr: ctx.args.pr,
|
|
264
|
+
env: p.env,
|
|
265
|
+
...(p.member ? { member: p.member } : {}),
|
|
266
|
+
base: p.base,
|
|
267
|
+
head: p.head,
|
|
268
|
+
op,
|
|
269
|
+
gate: p.gate,
|
|
270
|
+
plan: p.plan,
|
|
271
|
+
signal: p.signal,
|
|
272
|
+
set,
|
|
273
|
+
approval,
|
|
274
|
+
status,
|
|
275
|
+
});
|
|
276
|
+
await finish(ctx, p, report);
|
|
277
|
+
console.error(formatInfo(`pr-plan: ${report.members.length} member(s), ${status}`));
|
|
278
|
+
printMembers(report);
|
|
279
|
+
if (status === "planned") {
|
|
280
|
+
console.error(formatInfo(`plan : ${report.digest}`));
|
|
281
|
+
console.error(formatInfo(approval.status === "approved" ? `approved by ${(approval.approvedBy ?? []).join(", ")}` : `approve : ${prApproveCommand(report)}`));
|
|
282
|
+
}
|
|
283
|
+
return status === "plan-failed" ? 1 : 0;
|
|
284
|
+
}
|
|
285
|
+
/** chant components pr-apply --base <ref> [--pr <n>] [--env <env>] [--gate <name>] [--forge <kind>] [--require-review] [--output <dir>] [--json] */
|
|
286
|
+
export async function runComponentsPrApply(ctx) {
|
|
287
|
+
const { args } = ctx;
|
|
288
|
+
if (args.requireReview && !args.forge)
|
|
289
|
+
return fail("--require-review reads the pull request's reviews, so it needs --forge <kind>");
|
|
290
|
+
const p = await prepare(ctx, "apply");
|
|
291
|
+
if (typeof p === "number")
|
|
292
|
+
return p;
|
|
293
|
+
let pr = args.pr ?? null;
|
|
294
|
+
if (pr === null && p.forge && p.plan.order.length > 0) {
|
|
295
|
+
try {
|
|
296
|
+
pr = await p.forge.pullRequestFor(p.head);
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
return fail(`could not ask ${p.forge.kind} which pull request merged ${p.head}: ${err instanceof Error ? err.message : String(err)}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
const op = pr === null ? "pr-unknown" : prOp(pr, p.member);
|
|
303
|
+
// `--resume` (#3464): an earlier attempt at this change on this commit
|
|
304
|
+
// applied part of an approved set. When the members left are covered by
|
|
305
|
+
// it and its approval still stands, finish it under that approval.
|
|
306
|
+
const resumePath = args.resume ? resolve(args.resume) : undefined;
|
|
307
|
+
let attempt;
|
|
308
|
+
if (resumePath) {
|
|
309
|
+
try {
|
|
310
|
+
attempt = readFanOutAttempt(resumePath);
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
return fail(`--resume: could not read "${args.resume}": ${err instanceof Error ? err.message : String(err)}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
const resumed = pr !== null && p.plan.order.length > 0 && attempt ? await tryResume(p, attempt, args.resume, op) : undefined;
|
|
317
|
+
const set = resumed?.set ?? (await planAll(p));
|
|
318
|
+
const base = { stage: "apply", pr, env: p.env, ...(p.member ? { member: p.member } : {}), base: p.base, head: p.head, op, gate: p.gate, plan: p.plan, signal: p.signal, set };
|
|
319
|
+
const stop = async (report, code) => {
|
|
320
|
+
await finish(ctx, p, report);
|
|
321
|
+
console.error((code === 0 ? formatInfo : (m) => formatWarning({ message: m }))(`pr-apply: ${report.status}${report.refusal ? ` (${report.refusal})` : ""}`));
|
|
322
|
+
if (report.message)
|
|
323
|
+
console.error(report.message);
|
|
324
|
+
printMembers(report);
|
|
325
|
+
return code;
|
|
326
|
+
};
|
|
327
|
+
if (p.plan.order.length === 0) {
|
|
328
|
+
return stop(prReport({ ...base, approval: { status: "pending" }, status: "nothing" }), 0);
|
|
329
|
+
}
|
|
330
|
+
if (pr === null) {
|
|
331
|
+
return stop(prReport({
|
|
332
|
+
...base,
|
|
333
|
+
approval: { status: "pending" },
|
|
334
|
+
status: "refused",
|
|
335
|
+
refusal: "no-pull-request",
|
|
336
|
+
message: `No pull request merged ${p.head}, so no approval answers for this change. Nothing was applied. Pass --pr <n>, or land the change through a pull request.`,
|
|
337
|
+
}), GATED_EXIT_CODE);
|
|
338
|
+
}
|
|
339
|
+
if (set.failed) {
|
|
340
|
+
return stop(prReport({
|
|
341
|
+
...base,
|
|
342
|
+
approval: { status: "pending" },
|
|
343
|
+
status: "plan-failed",
|
|
344
|
+
message: "A member failed to plan, so there is no plan to compare with the approved one. Nothing was applied.",
|
|
345
|
+
}), 1);
|
|
346
|
+
}
|
|
347
|
+
let approval;
|
|
348
|
+
if (resumed) {
|
|
349
|
+
approval = resumed.approval;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
const check = await decidePrGate(gitGateLedgerPort(), {
|
|
353
|
+
op,
|
|
354
|
+
gate: p.gate,
|
|
355
|
+
digest: set.doc.digest,
|
|
356
|
+
description: `pull request #${pr}: ${p.plan.order.join(", ")}`,
|
|
357
|
+
});
|
|
358
|
+
approval = approvalOf(check);
|
|
359
|
+
if (!check.satisfied) {
|
|
360
|
+
const partial = { ...base, approval, status: "refused" };
|
|
361
|
+
const report = approval.status === "changed"
|
|
362
|
+
? prReport({ ...partial, refusal: "plan-changed", message: describePlanChanged({ op, gate: p.gate, digest: set.doc.digest, approval }) })
|
|
363
|
+
: prReport({
|
|
364
|
+
...partial,
|
|
365
|
+
refusal: "not-approved",
|
|
366
|
+
message: `No approval stands for this plan, so nothing was applied. Approve it: ${prApproveCommand({ op, gate: p.gate, digest: set.doc.digest })}; then run the apply again.`,
|
|
367
|
+
});
|
|
368
|
+
return stop(report, GATED_EXIT_CODE);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (args.requireReview && p.forge) {
|
|
372
|
+
let reviewers;
|
|
373
|
+
try {
|
|
374
|
+
reviewers = (await p.forge.approvers(pr)).map((login) => p.forge.principalOf(login));
|
|
375
|
+
}
|
|
376
|
+
catch (err) {
|
|
377
|
+
return fail(`could not read the reviews of #${pr}: ${err instanceof Error ? err.message : String(err)}`);
|
|
378
|
+
}
|
|
379
|
+
const strangers = approversWithoutReview(approval.approvedBy ?? [], reviewers);
|
|
380
|
+
if (strangers.length > 0) {
|
|
381
|
+
return stop(prReport({
|
|
382
|
+
...base,
|
|
383
|
+
approval,
|
|
384
|
+
status: "refused",
|
|
385
|
+
refusal: "not-a-reviewer",
|
|
386
|
+
message: `The plan is approved by ${strangers.join(", ")}, who ${strangers.length === 1 ? "has" : "have"} no approving review on #${pr}` +
|
|
387
|
+
` (approving reviews: ${reviewers.join(", ") || "none"}). Nothing was applied. ` +
|
|
388
|
+
`An approval counts when it names the reviewer the way the forge does: ${p.forge.principalOf("<login>")}.`,
|
|
389
|
+
}), GATED_EXIT_CODE);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// The record is written before the first component runs and again as each
|
|
393
|
+
// one settles, so a run killed partway still knows what applied.
|
|
394
|
+
const prior = resumed ? { completed: resumed.completed, outputs: resumed.outputs } : { completed: [], outputs: {} };
|
|
395
|
+
const completedSoFar = new Set(prior.completed);
|
|
396
|
+
const failedSoFar = [];
|
|
397
|
+
const outputsSoFar = { ...prior.outputs };
|
|
398
|
+
const record = {
|
|
399
|
+
op,
|
|
400
|
+
gate: p.gate,
|
|
401
|
+
head: p.head,
|
|
402
|
+
digest: set.doc.digest,
|
|
403
|
+
approvedBy: approval.approvedBy ?? [],
|
|
404
|
+
members: set.members,
|
|
405
|
+
changeSet: set.doc,
|
|
406
|
+
planOutputs: set.outputs,
|
|
407
|
+
};
|
|
408
|
+
const recordAttempt = () => {
|
|
409
|
+
if (!resumePath)
|
|
410
|
+
return;
|
|
411
|
+
writeFanOutAttempt(resumePath, {
|
|
412
|
+
digest: p.plan.digest,
|
|
413
|
+
completed: [...completedSoFar].sort(),
|
|
414
|
+
failed: [...failedSoFar].sort(),
|
|
415
|
+
outputs: outputsSoFar,
|
|
416
|
+
prApply: record,
|
|
417
|
+
});
|
|
418
|
+
};
|
|
419
|
+
recordAttempt();
|
|
420
|
+
const applied = await applyPrSet({
|
|
421
|
+
components: p.components,
|
|
422
|
+
plan: resumed?.plan ?? p.plan,
|
|
423
|
+
registry: p.registry,
|
|
424
|
+
env: p.env,
|
|
425
|
+
set,
|
|
426
|
+
...(resumed ? { resumed: prior } : {}),
|
|
427
|
+
...(resumePath
|
|
428
|
+
? {
|
|
429
|
+
onComponentSettled: (settled, outputs) => {
|
|
430
|
+
if (settled.status === "ok") {
|
|
431
|
+
completedSoFar.add(settled.component);
|
|
432
|
+
if (outputs)
|
|
433
|
+
outputsSoFar[settled.component] = outputs;
|
|
434
|
+
}
|
|
435
|
+
else if (settled.status === "fail") {
|
|
436
|
+
failedSoFar.push(settled.component);
|
|
437
|
+
}
|
|
438
|
+
recordAttempt();
|
|
439
|
+
},
|
|
440
|
+
}
|
|
441
|
+
: {}),
|
|
442
|
+
});
|
|
443
|
+
recordAttempt();
|
|
444
|
+
await recordAutoReleasesForRun(applied.run.results, p.env, `${op}-${Date.now()}`, resolveAutoReleaseDisabled(p.config, args.noReleaseRecord));
|
|
445
|
+
const report = prReport({
|
|
446
|
+
...base,
|
|
447
|
+
approval,
|
|
448
|
+
status: applied.status,
|
|
449
|
+
members: applied.members,
|
|
450
|
+
...(resumed ? { resumed: resumed.completed } : {}),
|
|
451
|
+
});
|
|
452
|
+
const code = await stop(report, applied.status === "applied" ? 0 : 1);
|
|
453
|
+
if (applied.status === "applied")
|
|
454
|
+
console.error(formatSuccess(`applied the plan ${report.digest} approved by ${(approval.approvedBy ?? []).join(", ")}`));
|
|
455
|
+
return code;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Whether `attempt` finishes here (#3464). It carries only when it was made
|
|
459
|
+
* by an apply of this pull request's gate, on this commit, for this
|
|
460
|
+
* derivation; when its approval still stands; and when every member left is
|
|
461
|
+
* covered by the approved set. Otherwise it says why on stderr and the apply
|
|
462
|
+
* runs as it would with no record.
|
|
463
|
+
*/
|
|
464
|
+
async function tryResume(p, attempt, file, op) {
|
|
465
|
+
const skip = (why) => {
|
|
466
|
+
console.error(formatWarning({ message: `--resume: "${file}" does not carry: ${why}`, hint: "Every member is planned again, and the plan needs an approval of its own." }));
|
|
467
|
+
return undefined;
|
|
468
|
+
};
|
|
469
|
+
const record = attempt.prApply;
|
|
470
|
+
if (!record)
|
|
471
|
+
return skip("it was not written by pr-apply");
|
|
472
|
+
if (record.op !== op || record.gate !== p.gate)
|
|
473
|
+
return skip(`it records ${record.op} ${record.gate}, not ${op} ${p.gate}`);
|
|
474
|
+
if (record.head !== p.head)
|
|
475
|
+
return skip(`it records an apply of ${record.head.slice(0, 12)}, not ${p.head.slice(0, 12)}`);
|
|
476
|
+
if (!samePlanDigest(attempt.digest, p.plan.digest))
|
|
477
|
+
return skip("the change selects other components than it did");
|
|
478
|
+
if (attempt.completed.length === 0)
|
|
479
|
+
return undefined;
|
|
480
|
+
let check;
|
|
481
|
+
try {
|
|
482
|
+
check = await decidePrGate(readOnlyLedger(gitGateLedgerPort()), { op, gate: p.gate, digest: record.digest });
|
|
483
|
+
}
|
|
484
|
+
catch (err) {
|
|
485
|
+
return skip(`could not read the gate ledger: ${err instanceof Error ? err.message : String(err)}`);
|
|
486
|
+
}
|
|
487
|
+
if (!check.satisfied)
|
|
488
|
+
return skip(`no approval stands for the plan it applied (${record.digest}) any more`);
|
|
489
|
+
const outputs = Object.fromEntries(Object.entries(attempt.outputs).filter(([name]) => attempt.completed.includes(name)));
|
|
490
|
+
const resumed = await resumePrSet({
|
|
491
|
+
components: p.components,
|
|
492
|
+
plan: p.plan,
|
|
493
|
+
registry: p.registry,
|
|
494
|
+
env: p.env,
|
|
495
|
+
seededOutputs: p.seededOutputs,
|
|
496
|
+
record,
|
|
497
|
+
completed: attempt.completed,
|
|
498
|
+
});
|
|
499
|
+
if (!resumed.ok)
|
|
500
|
+
return skip(`what is left is not what was approved. ${resumed.reasons.join("; ")}`);
|
|
501
|
+
console.error(formatInfo(`resume : ${attempt.completed.join(", ")} applied in an earlier attempt; applying ${resumed.plan.order.join(", ") || "nothing more"} under the approval of ${record.digest}`));
|
|
502
|
+
return { plan: resumed.plan, set: resumed.set, approval: approvalOf(check), completed: attempt.completed, outputs };
|
|
503
|
+
}
|