@intentius/chant 0.124.13 → 0.124.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/lexicon-module.ts +3 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +1 -1
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fold provenance (#2161) — which composite parameter produced which emitted field.
|
|
3
|
+
*
|
|
4
|
+
* A composite is the one lossy thing chant emits. It takes a few typed
|
|
5
|
+
* arguments and expands to several resources, so a return leg that regenerates
|
|
6
|
+
* source from live produces flat typed resources and the composite is gone. The
|
|
7
|
+
* projection is not invertible from its output alone, which is the view-update
|
|
8
|
+
* problem landing on chant's record.
|
|
9
|
+
*
|
|
10
|
+
* chant can answer it where a general generator cannot, and for one reason: the
|
|
11
|
+
* evaluated subset is restricted on purpose. `discovery/fold-import.ts` already
|
|
12
|
+
* interprets an admissible factory body rather than calling it, so the
|
|
13
|
+
* expression each member property was WRITTEN as is in hand at build time. The
|
|
14
|
+
* same pass records where the field came from, in `discovery/param-deps.ts`'s
|
|
15
|
+
* {@link import("./discovery/param-deps.js").collectCompositeOrigins}.
|
|
16
|
+
*
|
|
17
|
+
* ## Four answers, and the fourth is a real one
|
|
18
|
+
*
|
|
19
|
+
* Every emitted path gets one of {@link FoldFieldOrigin}'s four kinds. Three of
|
|
20
|
+
* them are findings; `unknown` is the fourth, and it is a legal answer rather
|
|
21
|
+
* than a gap. A build that expanded a composite without interpreting its body
|
|
22
|
+
* (the run path, a factory outside the admissible subset, a sandboxed child
|
|
23
|
+
* whose provenance did not survive the wire) knows the field came from a
|
|
24
|
+
* composite and cannot say which parameter. Recording that is the whole point:
|
|
25
|
+
* an unknown must never fall through to `direct`, because `direct` licenses
|
|
26
|
+
* editing the field in the user's source and an unattributed composite field is
|
|
27
|
+
* exactly the case where that produces a flattened resource.
|
|
28
|
+
*
|
|
29
|
+
* `direct` is claimed only where the build has a provenance record AND that
|
|
30
|
+
* record says no composite expanded the entity. Absence of a record is
|
|
31
|
+
* `unknown`, never `direct`.
|
|
32
|
+
*
|
|
33
|
+
* ## Beside the output, never in it
|
|
34
|
+
*
|
|
35
|
+
* The record is build metadata, not declared configuration, and it must not
|
|
36
|
+
* reach the document an applier writes. It rides two channels, both outside the
|
|
37
|
+
* apply-bound document, and neither is a new mechanism:
|
|
38
|
+
*
|
|
39
|
+
* - per entity, the non-enumerable symbol-keyed side channel `./provenance.ts`
|
|
40
|
+
* already owns, invisible to every serializer and to every spread;
|
|
41
|
+
* - per build, {@link import("./build.js").BuildResult.foldProvenance}, a sibling
|
|
42
|
+
* of `buildParams` and `lexiconVersions`.
|
|
43
|
+
*
|
|
44
|
+
* Nothing is added to `SerializeContext`. That is the same posture
|
|
45
|
+
* `./effect-receipt.ts` takes at the same seam, one notch stricter: a receipt
|
|
46
|
+
* rides `SerializeContext.receipts` so a lexicon MAY render it outside
|
|
47
|
+
* `Resources`, whereas provenance has no rendering and is simply never handed
|
|
48
|
+
* to a serializer at all. `fold-provenance-exclusion.test.ts` drives a real
|
|
49
|
+
* build through a spy serializer and a mock applier to hold that line.
|
|
50
|
+
*
|
|
51
|
+
* ## The return leg
|
|
52
|
+
*
|
|
53
|
+
* {@link resolveDriftedField} is the consumer. #2160 has already ruled out the
|
|
54
|
+
* fields nobody declared, so a drifted field reaching it is one source actually
|
|
55
|
+
* declared, and the origin decides what may be proposed:
|
|
56
|
+
*
|
|
57
|
+
* - a composite parameter: propose changing that parameter, naming the file,
|
|
58
|
+
* the composite call and the parameter path. One line, composite intact.
|
|
59
|
+
* - a literal the composite fixes: refuse by name. The choice is to
|
|
60
|
+
* parameterize the field or stop using the composite there, and neither is
|
|
61
|
+
* something chant may pick.
|
|
62
|
+
* - a direct declaration: today's behaviour, unchanged.
|
|
63
|
+
* - unknown: today's behaviour, and say that is what happened.
|
|
64
|
+
*
|
|
65
|
+
* Proposing is as far as this goes. Rewriting a parameter in the user's source
|
|
66
|
+
* is a source-edit problem (the generator half of `chant import` emits whole
|
|
67
|
+
* files and nothing maps a property path back to a location in a `.ts` file),
|
|
68
|
+
* so a proposal here is a described action: it names the file, the composite
|
|
69
|
+
* call and the parameter path, and performs no edit.
|
|
70
|
+
*/
|
|
71
|
+
import { isResourceDeclarable } from "./declarable.js";
|
|
72
|
+
import { relative, isAbsolute } from "node:path";
|
|
73
|
+
import { originOfPath, } from "./provenance.js";
|
|
74
|
+
/** True for an ordinary `{}`, false for an array, a class instance, an `AttrRef`. */
|
|
75
|
+
function isPlainObject(value) {
|
|
76
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
77
|
+
return false;
|
|
78
|
+
const proto = Object.getPrototypeOf(value);
|
|
79
|
+
return proto === Object.prototype || proto === null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Every property path an entity's `props` emits, in `EntityProvenance.paths`'
|
|
83
|
+
* grammar: dotted names only, plain objects descended into, everything else
|
|
84
|
+
* attributed whole at its own path.
|
|
85
|
+
*
|
|
86
|
+
* Arrays are deliberately not indexed. An index-shaped key would not survive an
|
|
87
|
+
* element moving, and the recorder that produces origins cannot index either,
|
|
88
|
+
* so indexing here would manufacture paths nothing can ever attribute. The diff
|
|
89
|
+
* addresses array elements with `[#key]`/`[n]` and `originOfPath` resolves
|
|
90
|
+
* those against the dotted key that covers them, which is the join between the
|
|
91
|
+
* two grammars.
|
|
92
|
+
*
|
|
93
|
+
* An empty object is a value, and a leaf. An `undefined` value is not emitted
|
|
94
|
+
* and yields no path.
|
|
95
|
+
*/
|
|
96
|
+
export function emittedFieldPaths(props) {
|
|
97
|
+
const out = [];
|
|
98
|
+
const walk = (value, prefix) => {
|
|
99
|
+
if (value === undefined)
|
|
100
|
+
return;
|
|
101
|
+
if (isPlainObject(value)) {
|
|
102
|
+
const keys = Object.keys(value).sort();
|
|
103
|
+
if (keys.length === 0) {
|
|
104
|
+
if (prefix)
|
|
105
|
+
out.push(prefix);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
for (const key of keys)
|
|
109
|
+
walk(value[key], prefix ? `${prefix}.${key}` : key);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (prefix)
|
|
113
|
+
out.push(prefix);
|
|
114
|
+
};
|
|
115
|
+
walk(props, "");
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The four-way answer for one path, from the recorded {@link PathOrigin} and
|
|
120
|
+
* the entity's own provenance.
|
|
121
|
+
*
|
|
122
|
+
* `origin` is what {@link originOfPath} resolved for the path, so a coarse key
|
|
123
|
+
* recorded at an ancestor governs a leaf, exactly as it does everywhere else.
|
|
124
|
+
*/
|
|
125
|
+
export function classifyFieldOrigin(origin, provenance) {
|
|
126
|
+
if (!provenance)
|
|
127
|
+
return { kind: "unknown", reason: "no-provenance" };
|
|
128
|
+
const instance = provenance.compositeInstance;
|
|
129
|
+
const call = provenance.compositeCall;
|
|
130
|
+
switch (origin?.kind) {
|
|
131
|
+
case "composite-parameter":
|
|
132
|
+
return {
|
|
133
|
+
kind: "composite-parameter",
|
|
134
|
+
composite: origin.composite,
|
|
135
|
+
...(instance ? { instance } : {}),
|
|
136
|
+
parameters: [...origin.parameters],
|
|
137
|
+
...(call ? { call: { ...call } } : {}),
|
|
138
|
+
...(origin.arguments ? { arguments: origin.arguments.map((a) => ({ ...a })) } : {}),
|
|
139
|
+
};
|
|
140
|
+
case "composite-literal":
|
|
141
|
+
return {
|
|
142
|
+
kind: "composite-literal",
|
|
143
|
+
composite: origin.composite,
|
|
144
|
+
...(instance ? { instance } : {}),
|
|
145
|
+
...(call ? { call: { ...call } } : {}),
|
|
146
|
+
};
|
|
147
|
+
case "composite":
|
|
148
|
+
// The coarse kind: a composite expanded this, and nothing said which
|
|
149
|
+
// parameter. Not a parameter, not a fixed literal, and above all not a
|
|
150
|
+
// direct declaration.
|
|
151
|
+
return { kind: "unknown", reason: "composite-not-interpreted" };
|
|
152
|
+
case "authored":
|
|
153
|
+
// chant#3608 — `authored` is the file's own root record, and it reaches
|
|
154
|
+
// a path only when nothing finer did. On an entity a composite wrote (a
|
|
155
|
+
// member destructured from a composite the fold invoked) that means the
|
|
156
|
+
// fold could not attribute the path, which is `unknown`, never `direct`.
|
|
157
|
+
return provenance.composite
|
|
158
|
+
? { kind: "unknown", reason: "composite-not-interpreted" }
|
|
159
|
+
: { kind: "direct" };
|
|
160
|
+
case "host":
|
|
161
|
+
// INTENTIUS/typescript-as-data#248 — host code produced the value, so
|
|
162
|
+
// editing the declaration edits a call, not the value it returned.
|
|
163
|
+
return { kind: "unknown", reason: origin.reason };
|
|
164
|
+
case "build-param":
|
|
165
|
+
// A build parameter governs the expression the AUTHOR wrote in their own
|
|
166
|
+
// source, so the declaration is still theirs to edit.
|
|
167
|
+
return { kind: "direct" };
|
|
168
|
+
case undefined:
|
|
169
|
+
return provenance.composite
|
|
170
|
+
? { kind: "unknown", reason: "composite-not-interpreted" }
|
|
171
|
+
: { kind: "direct" };
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** One entity's fold provenance, or `undefined` when it emits no properties at all. */
|
|
175
|
+
export function foldProvenanceOfEntity(entity, provenance) {
|
|
176
|
+
if (!isResourceDeclarable(entity))
|
|
177
|
+
return undefined;
|
|
178
|
+
const paths = emittedFieldPaths(entity.props);
|
|
179
|
+
if (paths.length === 0)
|
|
180
|
+
return undefined;
|
|
181
|
+
const fields = {};
|
|
182
|
+
for (const path of paths) {
|
|
183
|
+
fields[path] = classifyFieldOrigin(originOfPath(provenance?.paths, path), provenance);
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
...(provenance?.sourceFile ? { sourceFile: provenance.sourceFile } : {}),
|
|
187
|
+
...(provenance?.composite ? { composite: provenance.composite } : {}),
|
|
188
|
+
...(provenance?.compositeInstance ? { instance: provenance.compositeInstance } : {}),
|
|
189
|
+
...(provenance?.compositeCall ? { compositeCall: { ...provenance.compositeCall } } : {}),
|
|
190
|
+
fields,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* A whole build's fold provenance.
|
|
195
|
+
*
|
|
196
|
+
* `provenanceOf` is injected rather than read off the entity here so the same
|
|
197
|
+
* function serves a build (where it is `getProvenance`) and a test with a
|
|
198
|
+
* hand-written record. Entities with no properties are absent; sorted, because
|
|
199
|
+
* a build's outputs are compared byte for byte.
|
|
200
|
+
*/
|
|
201
|
+
export function foldProvenanceOfEntities(entities, provenanceOf) {
|
|
202
|
+
const out = {};
|
|
203
|
+
for (const name of [...entities.keys()].sort()) {
|
|
204
|
+
const entity = entities.get(name);
|
|
205
|
+
const record = foldProvenanceOfEntity(entity, provenanceOf(entity));
|
|
206
|
+
if (record)
|
|
207
|
+
out[name] = record;
|
|
208
|
+
}
|
|
209
|
+
return out;
|
|
210
|
+
}
|
|
211
|
+
/** One-line rendering of a field origin, for a report. */
|
|
212
|
+
export function describeFoldFieldOrigin(origin) {
|
|
213
|
+
switch (origin.kind) {
|
|
214
|
+
case "composite-parameter":
|
|
215
|
+
return `parameter ${origin.parameters.join(", ")} of ${compositeCall(origin.composite, origin.instance)}`;
|
|
216
|
+
case "composite-literal":
|
|
217
|
+
return `fixed by ${compositeCall(origin.composite, origin.instance)}`;
|
|
218
|
+
case "direct":
|
|
219
|
+
return "declared directly";
|
|
220
|
+
case "unknown":
|
|
221
|
+
return `origin unknown (${unknownOriginText(origin.reason)})`;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/** Why an origin could not be determined, in words a report can print. */
|
|
225
|
+
export function unknownOriginText(reason) {
|
|
226
|
+
switch (reason) {
|
|
227
|
+
case "composite-not-interpreted":
|
|
228
|
+
return "expanded by a composite whose factory this build did not interpret";
|
|
229
|
+
case "no-provenance":
|
|
230
|
+
return "this build recorded no provenance for the entity";
|
|
231
|
+
case "host-call":
|
|
232
|
+
return "the value is what a host call returned";
|
|
233
|
+
case "host-value":
|
|
234
|
+
return "the value is one a host package exports";
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/** `AutoscaledService composite call \`api\``, or just the composite when the call has no name. */
|
|
238
|
+
function compositeCall(composite, instance) {
|
|
239
|
+
return instance ? `the \`${instance}\` call of composite ${composite}` : `composite ${composite}`;
|
|
240
|
+
}
|
|
241
|
+
/** A file as a report prints it: relative to `root` when it is inside it, otherwise as recorded. */
|
|
242
|
+
function displayFile(file, root) {
|
|
243
|
+
if (!root || !isAbsolute(file))
|
|
244
|
+
return file;
|
|
245
|
+
const rel = relative(root, file);
|
|
246
|
+
return rel && !rel.startsWith("..") && !isAbsolute(rel) ? rel : file;
|
|
247
|
+
}
|
|
248
|
+
/** `src/app.ts:12`, relative to `root` when it is inside it. */
|
|
249
|
+
export function formatSourceLocation(location, root) {
|
|
250
|
+
return `${displayFile(location.file, root)}:${location.line}`;
|
|
251
|
+
}
|
|
252
|
+
/** ` in src/app.infra.ts`, or nothing when the build recorded no file. */
|
|
253
|
+
function inFile(sourceFile, root) {
|
|
254
|
+
return sourceFile ? ` in ${displayFile(sourceFile, root)}` : "";
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* The composite call as the author wrote the arguments that govern a field:
|
|
258
|
+
* `WebApp({ replicas: 3 })`, or `WebApp({ iam: { path: "/service/" } })` for a
|
|
259
|
+
* nested parameter. Only arguments actually written at the call appear; when
|
|
260
|
+
* none is, the call is shown as `WebApp(...)`.
|
|
261
|
+
*/
|
|
262
|
+
export function describeCompositeArguments(composite, locations) {
|
|
263
|
+
const written = locations.filter((a) => a.text !== undefined);
|
|
264
|
+
if (written.length === 0)
|
|
265
|
+
return `${composite}(...)`;
|
|
266
|
+
const parts = written.map((a) => {
|
|
267
|
+
const outer = a.parameter.split(".").slice(0, -1);
|
|
268
|
+
return outer.reduceRight((inner, key) => `${key}: { ${inner} }`, a.text);
|
|
269
|
+
});
|
|
270
|
+
return `${composite}({ ${parts.join(", ")} })`;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Where a composite-parameter field was set, as `at src/app.ts:12`: the first
|
|
274
|
+
* argument written at the call, else the call, else the declaring file.
|
|
275
|
+
*/
|
|
276
|
+
function parameterSite(origin, sourceFile, root) {
|
|
277
|
+
const written = origin.arguments?.find((a) => a.text !== undefined);
|
|
278
|
+
const location = written ?? origin.call ?? origin.arguments?.[0];
|
|
279
|
+
if (location)
|
|
280
|
+
return ` at ${formatSourceLocation(location, root)}`;
|
|
281
|
+
return inFile(sourceFile, root);
|
|
282
|
+
}
|
|
283
|
+
/** ` at src/app.ts:10` for the composite call, else the declaring file. */
|
|
284
|
+
function callSite(call, sourceFile, root) {
|
|
285
|
+
return call ? ` at ${formatSourceLocation(call, root)}` : inFile(sourceFile, root);
|
|
286
|
+
}
|
|
287
|
+
/** A value as a report prints it. */
|
|
288
|
+
function renderValue(value) {
|
|
289
|
+
if (value === undefined)
|
|
290
|
+
return "unset";
|
|
291
|
+
try {
|
|
292
|
+
return JSON.stringify(value) ?? String(value);
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return String(value);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Classify one drifted field by its origin.
|
|
300
|
+
*
|
|
301
|
+
* The caller has already established this is drift in #2160's sense: a path
|
|
302
|
+
* source declared, whose live value moved. Undeclared fields are held
|
|
303
|
+
* elsewhere and never reach here, so the only question left is which of the
|
|
304
|
+
* four origins produced the field.
|
|
305
|
+
*
|
|
306
|
+
* `entityType` names the resource in the summary line, and `root` (the
|
|
307
|
+
* project directory) makes the file names in it relative. Both are optional;
|
|
308
|
+
* without them the summary uses the entity name alone and absolute files.
|
|
309
|
+
*/
|
|
310
|
+
export function resolveDriftedField(input) {
|
|
311
|
+
const origin = classifyFieldOrigin(input.origin, input.provenance);
|
|
312
|
+
const sourceFile = input.provenance?.sourceFile;
|
|
313
|
+
const root = input.root;
|
|
314
|
+
const move = `${renderValue(input.declared)} to ${renderValue(input.live)}`;
|
|
315
|
+
const subject = `${input.path} on ${input.entityType ? `${input.entityType} ` : ""}${input.entity}`;
|
|
316
|
+
const summary = (() => {
|
|
317
|
+
switch (origin.kind) {
|
|
318
|
+
case "composite-parameter":
|
|
319
|
+
return (`${subject} comes from ${describeCompositeArguments(origin.composite, origin.arguments ?? [])}` +
|
|
320
|
+
`${parameterSite(origin, sourceFile, root)}` +
|
|
321
|
+
(origin.arguments?.some((a) => a.text !== undefined)
|
|
322
|
+
? ""
|
|
323
|
+
: ` (parameter ${origin.parameters.join(", ")}, not written at the call)`));
|
|
324
|
+
case "composite-literal":
|
|
325
|
+
return (`${subject} is fixed inside composite ${origin.composite}; ` +
|
|
326
|
+
`no argument to the call${callSite(origin.call, sourceFile, root)} moves it`);
|
|
327
|
+
case "direct":
|
|
328
|
+
return `${subject} is declared directly${inFile(sourceFile, root)}`;
|
|
329
|
+
case "unknown":
|
|
330
|
+
return `${subject} has an unknown origin: ${unknownOriginText(origin.reason)}`;
|
|
331
|
+
}
|
|
332
|
+
})();
|
|
333
|
+
const resolution = (() => {
|
|
334
|
+
switch (origin.kind) {
|
|
335
|
+
case "composite-parameter": {
|
|
336
|
+
const parameters = origin.parameters;
|
|
337
|
+
return {
|
|
338
|
+
kind: "propose-parameter",
|
|
339
|
+
composite: origin.composite,
|
|
340
|
+
...(origin.instance ? { instance: origin.instance } : {}),
|
|
341
|
+
...(sourceFile ? { sourceFile } : {}),
|
|
342
|
+
parameters: [...parameters],
|
|
343
|
+
description: `change ${parameters.length === 1 ? "parameter" : "parameters"} ` +
|
|
344
|
+
`${parameters.map((p) => `\`${p}\``).join(", ")} of ` +
|
|
345
|
+
`${compositeCall(origin.composite, origin.instance)}${parameterSite(origin, sourceFile, root)} ` +
|
|
346
|
+
`so \`${input.path}\` moves from ${move}. The composite stays.`,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
case "composite-literal":
|
|
350
|
+
return {
|
|
351
|
+
kind: "refuse-fixed",
|
|
352
|
+
composite: origin.composite,
|
|
353
|
+
...(origin.instance ? { instance: origin.instance } : {}),
|
|
354
|
+
...(sourceFile ? { sourceFile } : {}),
|
|
355
|
+
description: `refused: \`${input.path}\` is fixed by ${compositeCall(origin.composite, origin.instance)}` +
|
|
356
|
+
`${callSite(origin.call, sourceFile, root)}, so no argument at the call site moves it. ` +
|
|
357
|
+
`Parameterize the field in composite ${origin.composite}, or stop using the composite here.`,
|
|
358
|
+
};
|
|
359
|
+
case "direct":
|
|
360
|
+
return {
|
|
361
|
+
kind: "edit-declaration",
|
|
362
|
+
...(sourceFile ? { sourceFile } : {}),
|
|
363
|
+
description: `change the declared value of \`${input.path}\`${inFile(sourceFile, root)} from ${move}.`,
|
|
364
|
+
};
|
|
365
|
+
case "unknown":
|
|
366
|
+
return {
|
|
367
|
+
kind: "fall-back",
|
|
368
|
+
reason: origin.reason,
|
|
369
|
+
...(sourceFile ? { sourceFile } : {}),
|
|
370
|
+
description: `origin unknown (${unknownOriginText(origin.reason)}), so falling back to changing the ` +
|
|
371
|
+
`declared value of \`${input.path}\`${inFile(sourceFile, root)} from ${move}.`,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
})();
|
|
375
|
+
return {
|
|
376
|
+
entity: input.entity,
|
|
377
|
+
path: input.path,
|
|
378
|
+
...("declared" in input ? { declared: input.declared } : {}),
|
|
379
|
+
...("live" in input ? { live: input.live } : {}),
|
|
380
|
+
origin,
|
|
381
|
+
summary,
|
|
382
|
+
resolution,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Every drifted field in a deep diff, classified.
|
|
387
|
+
*
|
|
388
|
+
* Reads `drifted` only. `unclaimed` is somebody else's field and
|
|
389
|
+
* `accepted` is a difference the baseline holds back, and neither may become an
|
|
390
|
+
* update, so neither is offered a resolution.
|
|
391
|
+
*
|
|
392
|
+
* A drift row of kind `absent` has no live value: the field is declared and the
|
|
393
|
+
* cloud does not have it. That is still drift on a declared path, and the same
|
|
394
|
+
* four origins decide what may be proposed about it.
|
|
395
|
+
*/
|
|
396
|
+
export function resolveDeepDrift(drifted, provenanceOf, options = {}) {
|
|
397
|
+
const out = [];
|
|
398
|
+
for (const entity of drifted) {
|
|
399
|
+
const provenance = provenanceOf(entity.name);
|
|
400
|
+
for (const change of entity.changes) {
|
|
401
|
+
out.push(resolveDriftedField({
|
|
402
|
+
entity: entity.name,
|
|
403
|
+
entityType: entity.type,
|
|
404
|
+
path: change.path,
|
|
405
|
+
...("declared" in change ? { declared: change.declared } : {}),
|
|
406
|
+
...("live" in change ? { live: change.live } : {}),
|
|
407
|
+
...(change.origin ? { origin: change.origin } : {}),
|
|
408
|
+
...(provenance ? { provenance } : {}),
|
|
409
|
+
...(options.root ? { root: options.root } : {}),
|
|
410
|
+
}));
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return out;
|
|
414
|
+
}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A gate's decision for a plan digest, and the seal check it needs, for a
|
|
3
|
+
* tool that runs from one bundled file (#3763, decision #3756).
|
|
4
|
+
*
|
|
5
|
+
* `@intentius/chant/gate-decision` holds what a tool needs to decide a
|
|
6
|
+
* plan-bound gate the way chant's own wave gate does (`chant run wave`,
|
|
7
|
+
* `./op/op-waves-run.ts`) under each approval mode:
|
|
8
|
+
*
|
|
9
|
+
* - `ledger`: an approval of this digest on `chant/lifecycle`, newer than the
|
|
10
|
+
* gate's newest pending fact ({@link decideGateApproval}).
|
|
11
|
+
* - `sealed`: the same, counting only an approval whose seal verifies for its
|
|
12
|
+
* approver against the signers file at base ({@link gateSignersAt},
|
|
13
|
+
* {@link gateSealRefusal}). The seal is checked with node:crypto, so the job
|
|
14
|
+
* needs no ssh-keygen.
|
|
15
|
+
* - `pr-review`: the same as `ledger`, or else the merged pull request's
|
|
16
|
+
* approving review, when its head planned this digest
|
|
17
|
+
* ({@link reviewApproval}).
|
|
18
|
+
*
|
|
19
|
+
* A gate the declaration at base names under `identity.gates` counts only a
|
|
20
|
+
* sealed approval from its class: {@link identityGateAdmissionAt} reads that
|
|
21
|
+
* rule from a bare clone at base and judges by `admitApprover`, the function
|
|
22
|
+
* chant's `gateAdmission` judges by (#3862); pass its `refuses` to
|
|
23
|
+
* {@link decideGateApproval}.
|
|
24
|
+
*
|
|
25
|
+
* With `spend` (#3784), an approval a wave already applied under is spent and
|
|
26
|
+
* counts for nothing, as terragucci's wave gate has it: the caller hands in
|
|
27
|
+
* the lines of `_gates/<op>/applied.jsonl` ({@link parseAppliedGateLines}).
|
|
28
|
+
*
|
|
29
|
+
* The module reads the ledger lines and the review it is handed; reading
|
|
30
|
+
* them is the caller's. It imports no TypeScript, esbuild, zod, lint, fold or
|
|
31
|
+
* codegen module, and none of chant's git ledger code, which
|
|
32
|
+
* `gate-decision-bundle.test.ts` holds it to. Its rules are chant's own:
|
|
33
|
+
* `./lifecycle/gate-ledger-select.ts` is what `evaluateGate` decides by, and
|
|
34
|
+
* `gate-decision.test.ts` decides the same ledgers both ways.
|
|
35
|
+
*/
|
|
36
|
+
import { spawnSync } from "node:child_process";
|
|
37
|
+
import { isPendingGateExpired, latestPendingGate, latestResolutionForPlan, } from "./lifecycle/gate-ledger-select.js";
|
|
38
|
+
import { samePlanDigest } from "./lifecycle/plan-digest.js";
|
|
39
|
+
import { isApprovalSpent } from "./lifecycle/gate-applied.js";
|
|
40
|
+
import { gateSealRefusal } from "./workspace/trust/gate-seal.js";
|
|
41
|
+
import { DEFAULT_SIGNERS_PATH, TRUST_CONFIG_PATH, parseAllowedSigners, trustConfigProblems, } from "./workspace/trust/trust-files.js";
|
|
42
|
+
import { parseJsonText } from "./workspace/jsonc.js";
|
|
43
|
+
import { CORE_CLASSES, admitApprover } from "./workspace/identity-gate-rule.js";
|
|
44
|
+
export { GATE_APPROVAL_SOURCES } from "./op/op-waves.js";
|
|
45
|
+
export { isPendingGateExpired, latestPendingGate, latestResolutionForPlan, latestResolutionSince, } from "./lifecycle/gate-ledger-select.js";
|
|
46
|
+
export { GATE_SEAL_NAMESPACE, gateSealPayload, gateSealRefusal, sshKeyFingerprint, verifySshSignatureWith, } from "./workspace/trust/gate-seal.js";
|
|
47
|
+
export { DEFAULT_SIGNERS_PATH, TRUST_CONFIG_PATH, parseAllowedSigners, trustConfigProblems, } from "./workspace/trust/trust-files.js";
|
|
48
|
+
export { CORE_CLASSES, admitApprover, grantedClasses, } from "./workspace/identity-gate-rule.js";
|
|
49
|
+
export { appliedGateApplies, appliedGatePath, isApprovalSpent, parseAppliedGateLines, } from "./lifecycle/gate-applied.js";
|
|
50
|
+
// ── reading at base ──────────────────────────────────────────────────────
|
|
51
|
+
function git(repo, args) {
|
|
52
|
+
return spawnSync("git", args, { cwd: repo, encoding: "utf-8" });
|
|
53
|
+
}
|
|
54
|
+
/** A file's text at `base`, or undefined when `base` holds no file at `path`. */
|
|
55
|
+
function showAt(repo, base, path) {
|
|
56
|
+
const r = git(repo, ["cat-file", "blob", `${base}:${path}`]);
|
|
57
|
+
return r.status === 0 ? r.stdout : undefined;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The commit a gate's rule is read at when the default branch applies its
|
|
61
|
+
* own commit: the first parent of HEAD, the branch as it stood before the
|
|
62
|
+
* merge, so a merge that adds a signer or drops a gate does not judge its own
|
|
63
|
+
* apply. A shallow checkout fetches that one commit from `origin`. A root
|
|
64
|
+
* commit has no parent and is its own base. Throws when it cannot be read.
|
|
65
|
+
*/
|
|
66
|
+
export function baseCommit(repo) {
|
|
67
|
+
const head = git(repo, ["rev-parse", "--verify", "-q", "HEAD^{commit}"]);
|
|
68
|
+
const sha = head.stdout.trim();
|
|
69
|
+
if (head.status !== 0 || !sha)
|
|
70
|
+
throw new Error(`${repo} has no commit checked out, so the gate cannot be decided`);
|
|
71
|
+
// The commit object's first `parent` line: a shallow clone keeps it even when it lacks the parent itself.
|
|
72
|
+
const header = git(repo, ["cat-file", "commit", sha]).stdout.split("\n\n")[0] ?? "";
|
|
73
|
+
const parent = /^parent ([0-9a-f]{40,64})$/m.exec(header)?.[1];
|
|
74
|
+
if (!parent)
|
|
75
|
+
return sha;
|
|
76
|
+
const has = () => git(repo, ["cat-file", "-e", `${parent}^{commit}`]).status === 0;
|
|
77
|
+
if (!has())
|
|
78
|
+
git(repo, ["fetch", "-q", "--depth=1", "origin", parent]);
|
|
79
|
+
if (!has())
|
|
80
|
+
throw new Error(`cannot fetch ${parent.slice(0, 12)}, the commit before this one, so the gate cannot be decided`);
|
|
81
|
+
return parent;
|
|
82
|
+
}
|
|
83
|
+
/** The signers and role grants at `base`, as chant's trust policy reads them. */
|
|
84
|
+
function trustAt(repo, base) {
|
|
85
|
+
const off = (problems) => ({ signers: { base, signersPath: DEFAULT_SIGNERS_PATH, active: false, signers: [], problems }, roles: {} });
|
|
86
|
+
const configText = showAt(repo, base, TRUST_CONFIG_PATH);
|
|
87
|
+
let signersPath = DEFAULT_SIGNERS_PATH;
|
|
88
|
+
let roles = {};
|
|
89
|
+
if (configText !== undefined) {
|
|
90
|
+
let raw;
|
|
91
|
+
try {
|
|
92
|
+
raw = JSON.parse(configText);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return off([`${TRUST_CONFIG_PATH} is not JSON: ${err instanceof Error ? err.message : String(err)}`]);
|
|
96
|
+
}
|
|
97
|
+
const problems = trustConfigProblems(raw);
|
|
98
|
+
if (problems.length > 0)
|
|
99
|
+
return off([`${TRUST_CONFIG_PATH} is invalid: ${problems.join("; ")}`]);
|
|
100
|
+
signersPath = raw.signers ?? DEFAULT_SIGNERS_PATH;
|
|
101
|
+
roles = raw.roles ?? {};
|
|
102
|
+
}
|
|
103
|
+
const text = showAt(repo, base, signersPath);
|
|
104
|
+
return { signers: { base, signersPath, active: text !== undefined, signers: text === undefined ? [] : parseAllowedSigners(text).signers, problems: [] }, roles };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The signers at `base`: the file `.chant/trust.json` names there, else
|
|
108
|
+
* `.chant/allowed_signers`, read as chant's trust policy reads it. A
|
|
109
|
+
* trust.json that is not valid (`trustConfigProblems`) turns attestation
|
|
110
|
+
* off, as it does in chant, so a sealed gate passes nothing. `base` is a
|
|
111
|
+
* commit the repository holds, such as {@link baseCommit}'s answer.
|
|
112
|
+
*/
|
|
113
|
+
export function gateSignersAt(repo, base) {
|
|
114
|
+
return trustAt(repo, base).signers;
|
|
115
|
+
}
|
|
116
|
+
/** The declaration at `base`, parsed, or null when there is none. Throws when it cannot be parsed. */
|
|
117
|
+
function declarationAt(repo, base) {
|
|
118
|
+
for (const file of ["chant.workspace.json", "chant.workspace.jsonc"]) {
|
|
119
|
+
const text = showAt(repo, base, file);
|
|
120
|
+
if (text === undefined)
|
|
121
|
+
continue;
|
|
122
|
+
const parsed = parseJsonText(text, { jsonc: file.endsWith(".jsonc") });
|
|
123
|
+
if (!parsed.ok)
|
|
124
|
+
throw new Error(`${file} at base is not valid JSON (${parsed.message}), so the gate cannot be decided`);
|
|
125
|
+
return { file, value: parsed.value };
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
function identityGatesOf(declaration) {
|
|
130
|
+
const gates = declaration?.identity?.gates ?? {};
|
|
131
|
+
return Object.entries(gates).map(([gate, entry]) => ({ gate, class: typeof entry?.class === "string" ? entry.class : null }));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The gates `chant.workspace.json` (or `.jsonc`) at `base` names under
|
|
135
|
+
* `identity.gates`: each counts only a sealed approval, from its class when
|
|
136
|
+
* it names one. {@link identityGateAdmissionAt} judges an approval by one.
|
|
137
|
+
* Empty when there is no declaration at base. Throws when the declaration
|
|
138
|
+
* there cannot be parsed, since the gate cannot be decided.
|
|
139
|
+
*/
|
|
140
|
+
export function identityGatesAt(repo, base) {
|
|
141
|
+
const declaration = declarationAt(repo, base);
|
|
142
|
+
return declaration === null ? [] : identityGatesOf(declaration.value);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The `identity.gates` rule for `gate` at `base`, or null when the
|
|
146
|
+
* declaration there names none: what chant's `gateAdmission(cwd, gate, base)`
|
|
147
|
+
* answers, read from a bare clone. An approval counts when its seal verifies
|
|
148
|
+
* for its approver against the signers at base and, when the gate names a
|
|
149
|
+
* class, the role grants in `.chant/trust.json` at base put the approver in
|
|
150
|
+
* it. Both judge with the same function ({@link admitApprover}).
|
|
151
|
+
*
|
|
152
|
+
* The classes are the four core ones, then `classes`, the domain classes the
|
|
153
|
+
* caller read from the pinned packages (`./workspace-principals`), in pin
|
|
154
|
+
* order. This reader loads no package. A gate whose class is in neither
|
|
155
|
+
* refuses every approval, and when the declaration at base pins anything the
|
|
156
|
+
* reason says the pins were not read, since one of them may supply it.
|
|
157
|
+
* Throws when the declaration at base cannot be parsed.
|
|
158
|
+
*/
|
|
159
|
+
export function identityGateAdmissionAt(repo, base, gate, opts = {}) {
|
|
160
|
+
const declaration = declarationAt(repo, base);
|
|
161
|
+
const requirement = declaration === null ? undefined : identityGatesOf(declaration.value).find((g) => g.gate === gate);
|
|
162
|
+
if (!requirement)
|
|
163
|
+
return null;
|
|
164
|
+
const { signers, roles } = trustAt(repo, base);
|
|
165
|
+
const pins = declaration.value.pins;
|
|
166
|
+
const rule = {
|
|
167
|
+
gate,
|
|
168
|
+
class: requirement.class,
|
|
169
|
+
signers,
|
|
170
|
+
roles,
|
|
171
|
+
classes: [...CORE_CLASSES, ...(opts.classes ?? [])],
|
|
172
|
+
...(Array.isArray(pins) && pins.length > 0
|
|
173
|
+
? { unknownClass: `is not a core class, and this reader does not load the classes the pinned packages in ${declaration.file} at base supply` }
|
|
174
|
+
: {}),
|
|
175
|
+
};
|
|
176
|
+
return { requirement, refuses: (a) => admitApprover(rule, a) };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Whether the merged pull request's review approves `digest` (#3684): a
|
|
180
|
+
* writer other than its author approved its head, and the head planned this
|
|
181
|
+
* digest (`headDigest`, from the plans `chant run wave --record-plans`
|
|
182
|
+
* recorded for the head; undefined when none were). Reading the review and
|
|
183
|
+
* the plans is the caller's; under `pr-review` the caller records the
|
|
184
|
+
* approval on the ledger when this approves.
|
|
185
|
+
*/
|
|
186
|
+
export function reviewApproval(merged, headDigest, digest) {
|
|
187
|
+
const seen = { pr: merged.pr, head: merged.head, ...(merged.url ? { url: merged.url } : {}) };
|
|
188
|
+
if (merged.approvers.length === 0) {
|
|
189
|
+
const why = merged.refused.length > 0 ? merged.refused.join("; ") : "nobody approved it";
|
|
190
|
+
return { approved: false, review: { ...seen, reason: `no writer other than its author approved the head of #${merged.pr}: ${why}` } };
|
|
191
|
+
}
|
|
192
|
+
if (headDigest === undefined) {
|
|
193
|
+
return {
|
|
194
|
+
approved: false,
|
|
195
|
+
review: { ...seen, approvers: merged.approvers, reason: `no plans are recorded for the head ${merged.head.slice(0, 12)} of #${merged.pr} (its pipeline runs \`chant run wave --record-plans\`)` },
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
if (headDigest !== digest) {
|
|
199
|
+
return {
|
|
200
|
+
approved: false,
|
|
201
|
+
review: { ...seen, approvers: merged.approvers, reason: `the plan moved after the review: the head planned ${headDigest}, and the merge plans ${digest}` },
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
return { approved: true, review: { ...seen, approvers: merged.approvers } };
|
|
205
|
+
}
|
|
206
|
+
const EPOCH = new Date(0).toISOString();
|
|
207
|
+
/**
|
|
208
|
+
* Decide a plan-bound gate against its ledger lines, as chant's wave gate
|
|
209
|
+
* does: an approval counts when it names this gate and digest (and
|
|
210
|
+
* environment, when set), is newer than the gate's newest pending fact, and
|
|
211
|
+
* passes the mode's rule: any under `ledger` and `pr-review`, a verified seal
|
|
212
|
+
* under `sealed`. With none, `pr-review` takes the review's answer. Writes
|
|
213
|
+
* nothing: recording a pending fact, or the review's approval, is the
|
|
214
|
+
* caller's.
|
|
215
|
+
*/
|
|
216
|
+
export function decideGateApproval(input) {
|
|
217
|
+
const { gate, planDigest, environment: env } = input;
|
|
218
|
+
const mode = input.mode ?? "ledger";
|
|
219
|
+
const pending = env === undefined ? input.ledger.pending : input.ledger.pending.filter((p) => p.environment === env);
|
|
220
|
+
const mine = (env === undefined ? input.ledger.resolutions : input.ledger.resolutions.filter((r) => r.environment === undefined || r.environment === env)).filter((r) => r.gate === gate);
|
|
221
|
+
const sealed = mode === "sealed";
|
|
222
|
+
const noSigners = { base: null, signersPath: DEFAULT_SIGNERS_PATH, active: false, signers: [], problems: ["no signers were read for this sealed gate"] };
|
|
223
|
+
const why = (r) => input.refuses?.(r) ?? (sealed ? gateSealRefusal(input.signers ?? noSigners, r) : null);
|
|
224
|
+
const standingFact = latestPendingGate(pending, gate);
|
|
225
|
+
const since = standingFact?.timestamp ?? EPOCH;
|
|
226
|
+
const counted = [];
|
|
227
|
+
const uncounted = [];
|
|
228
|
+
let spent;
|
|
229
|
+
for (const r of mine) {
|
|
230
|
+
if (input.spend && isApprovalSpent(input.ledger.applied ?? [], r)) {
|
|
231
|
+
if (new Date(r.timestamp).getTime() >= new Date(since).getTime() && (!spent || new Date(r.timestamp).getTime() >= new Date(spent.timestamp).getTime()))
|
|
232
|
+
spent = r;
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
const reason = why(r);
|
|
236
|
+
if (reason === null)
|
|
237
|
+
counted.push(r);
|
|
238
|
+
else if (samePlanDigest(r.planDigest, planDigest) && new Date(r.timestamp).getTime() >= new Date(since).getTime())
|
|
239
|
+
uncounted.push({ resolution: r, reason });
|
|
240
|
+
}
|
|
241
|
+
const found = latestResolutionForPlan(counted, gate, since, planDigest);
|
|
242
|
+
if (found.resolution)
|
|
243
|
+
return { status: "approved", via: "ledger", resolution: found.resolution };
|
|
244
|
+
const reviewSpent = input.spend === true && input.review?.approved === true &&
|
|
245
|
+
isApprovalSpent(input.ledger.applied ?? [], { gate, planDigest, review: { ...(input.review.review.head ? { head: input.review.review.head } : {}) } });
|
|
246
|
+
if (mode === "pr-review" && input.review?.approved && !reviewSpent)
|
|
247
|
+
return { status: "approved", via: "pr-review", review: input.review.review };
|
|
248
|
+
const now = input.now ?? new Date().toISOString();
|
|
249
|
+
const standing = standingFact && !isPendingGateExpired(standingFact, now) && samePlanDigest(standingFact.planDigest, planDigest) ? standingFact : undefined;
|
|
250
|
+
return {
|
|
251
|
+
status: "waiting",
|
|
252
|
+
...(standing ? { standing } : {}),
|
|
253
|
+
...(found.mismatched ? { mismatched: found.mismatched } : {}),
|
|
254
|
+
uncounted: uncounted.sort((a, b) => new Date(a.resolution.timestamp).getTime() - new Date(b.resolution.timestamp).getTime()),
|
|
255
|
+
...(mode === "pr-review" && input.review
|
|
256
|
+
? { review: reviewSpent ? { ...input.review.review, reason: `a wave already applied this digest under the review of ${input.review.review.head?.slice(0, 12) ?? "its head"}, so the review is spent` } : input.review.review }
|
|
257
|
+
: {}),
|
|
258
|
+
...(spent ? { spent } : {}),
|
|
259
|
+
};
|
|
260
|
+
}
|