@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,375 @@
|
|
|
1
|
+
import { build as buildProject } from "../build.js";
|
|
2
|
+
import { resolve as resolvePath } from "node:path";
|
|
3
|
+
import { mergeObservations, normalizeObservation, unobservedAll, formatUnobserved, } from "../observation.js";
|
|
4
|
+
import { zeroResourcesWarning } from "../live-endpoint.js";
|
|
5
|
+
import { unqualifiedKey } from "./identity.js";
|
|
6
|
+
import { isObservableDeclarable } from "../declarable.js";
|
|
7
|
+
/**
|
|
8
|
+
* Re-key a normalized observation's entities by `${stack}::${id}` (#1162) so a
|
|
9
|
+
* bare LogicalResourceId shared across stacks (e.g. `vpc`) stays unambiguous
|
|
10
|
+
* once the per-stack results are merged. The declared canvas qualifies the same
|
|
11
|
+
* way (`buildDeclaredPerStack`), so the overlay join lines up. Applies to both
|
|
12
|
+
* the OBSERVED-PRESENT and NOT-OBSERVED maps of the tri-state (#1089).
|
|
13
|
+
*/
|
|
14
|
+
function qualifyObservation(obs, stackName) {
|
|
15
|
+
const q = (m) => Object.fromEntries(Object.entries(m).map(([k, v]) => [`${stackName}::${k}`, v]));
|
|
16
|
+
return {
|
|
17
|
+
resources: q(obs.resources),
|
|
18
|
+
unobserved: q(obs.unobserved),
|
|
19
|
+
queried: q(obs.queried),
|
|
20
|
+
// Which read answered (#2267) is per entity, so it re-keys with them.
|
|
21
|
+
sources: q(obs.sources),
|
|
22
|
+
notes: obs.notes,
|
|
23
|
+
// Exports are already keyed by stack (#1279); nothing to qualify.
|
|
24
|
+
...(obs.stackExports ? { stackExports: obs.stackExports } : {}),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Query every plugin that implements `describeResources` for its resources in
|
|
29
|
+
* `environment`. `owned` (default true for the managed-only diagram, epic #776)
|
|
30
|
+
* restricts to resources carrying chant's ownership marker; a lexicon with no
|
|
31
|
+
* marker channel logs and returns everything (its own contract). Plugins that
|
|
32
|
+
* throw are collected into `errors` — one failing lexicon never sinks the whole
|
|
33
|
+
* graph — and every entity they were asked about is recorded as NOT-OBSERVED
|
|
34
|
+
* (`read-failed`, #1089) rather than dropped, so a failed read is visibly a
|
|
35
|
+
* hole instead of a silent absence.
|
|
36
|
+
*
|
|
37
|
+
* `stacks` (#57) is for a multi-stack, per-component project, where there is no
|
|
38
|
+
* single stack named after the environment — AWS's single-stack convention
|
|
39
|
+
* (`lexicons/aws/src/plugin.ts`'s `describeResources`, absent an explicit
|
|
40
|
+
* `stack`) queries a stack that simply doesn't exist there,
|
|
41
|
+
* so the single-call path always observes zero nodes. When `stacks` is
|
|
42
|
+
* present and non-empty, each observing plugin's `describeResources` is
|
|
43
|
+
* called once per stack and the returned observations are merged. A stack entry
|
|
44
|
+
* may be a bare name or `{ name, region?, src? }` (#1162): `src` is built
|
|
45
|
+
* SCOPED so the deployed BARE LogicalResourceIds match (the whole-project build
|
|
46
|
+
* disambiguates colliding names to `UsWest1Src…`, which the live ids never
|
|
47
|
+
* carry), and a scoped stack's observed ids are qualified `${stack}::${id}` so
|
|
48
|
+
* the same bare id in two stacks stays distinct. A bare-string stack keeps its
|
|
49
|
+
* bare ids and the tri-state merge (#57). When `stacks` is absent or empty, behavior is
|
|
50
|
+
* exactly the single call of before (no `stack` key at all), so a single-stack
|
|
51
|
+
* project is unaffected.
|
|
52
|
+
*/
|
|
53
|
+
export async function observeResources(environment, plugins, buildResult, opts) {
|
|
54
|
+
var _a;
|
|
55
|
+
const owned = opts?.owned ?? true;
|
|
56
|
+
const stacks = (opts?.stacks ?? []).map((st) => (typeof st === "string" ? { name: st } : st));
|
|
57
|
+
const includeAmbient = opts?.ambient ?? false;
|
|
58
|
+
// A stack's `src` (multi-stack, #1162) is built SCOPED to recover that stack's
|
|
59
|
+
// BARE entity names — the names it actually deploys. Matching deployed bare
|
|
60
|
+
// LogicalResourceIds against the whole-project build's DISAMBIGUATED names
|
|
61
|
+
// (UsWest1Src…) misses every colliding resource. Cached per src.
|
|
62
|
+
const serializers = plugins.map((p) => p.serializer);
|
|
63
|
+
const scopedBuildCache = new Map();
|
|
64
|
+
const scopedBuild = async (src) => {
|
|
65
|
+
const key = resolvePath(src);
|
|
66
|
+
let r = scopedBuildCache.get(key);
|
|
67
|
+
if (!r) {
|
|
68
|
+
r = await buildProject(key, serializers);
|
|
69
|
+
scopedBuildCache.set(key, r);
|
|
70
|
+
}
|
|
71
|
+
return r;
|
|
72
|
+
};
|
|
73
|
+
const observations = [];
|
|
74
|
+
const warnings = [];
|
|
75
|
+
const errors = [];
|
|
76
|
+
const notes = [];
|
|
77
|
+
for (const plugin of plugins) {
|
|
78
|
+
if (!plugin.describeResources)
|
|
79
|
+
continue;
|
|
80
|
+
// Serialized build output + declared entities for this lexicon — the scope
|
|
81
|
+
// describeResources needs to know what to look for.
|
|
82
|
+
const rawOutput = buildResult.outputs.get(plugin.name);
|
|
83
|
+
const buildOutput = rawOutput === undefined
|
|
84
|
+
? ""
|
|
85
|
+
: typeof rawOutput === "string"
|
|
86
|
+
? rawOutput
|
|
87
|
+
: rawOutput.primary;
|
|
88
|
+
const entityNames = [];
|
|
89
|
+
const entities = new Map();
|
|
90
|
+
for (const [name, entity] of buildResult.entities) {
|
|
91
|
+
if (entity.lexicon !== plugin.name)
|
|
92
|
+
continue;
|
|
93
|
+
// Only resource declarables have a live counterpart to observe. Outputs,
|
|
94
|
+
// parameters and serializer directives (gcp's `defaultAnnotations`) are
|
|
95
|
+
// build-time inputs — declared, but with nothing in any cloud to compare
|
|
96
|
+
// against, so keeping them in the universe makes every diff report a
|
|
97
|
+
// hole (or worse, a deletion) for a resource that cannot exist. A
|
|
98
|
+
// property-kind declarable is read as part of the resource holding it,
|
|
99
|
+
// never on its own (#3001).
|
|
100
|
+
if (!isObservableDeclarable(entity))
|
|
101
|
+
continue;
|
|
102
|
+
entityNames.push(name);
|
|
103
|
+
entities.set(name, {
|
|
104
|
+
entityType: entity.entityType,
|
|
105
|
+
props: (entity.props != null ? entity.props : {}),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
let observed;
|
|
110
|
+
if (stacks.length > 0) {
|
|
111
|
+
const parts = [];
|
|
112
|
+
for (const stack of stacks) {
|
|
113
|
+
// Use this stack's scoped build (bare entity names) when it has a src,
|
|
114
|
+
// so describeResources matches the deployed bare LogicalResourceIds.
|
|
115
|
+
let stackEntityNames = entityNames;
|
|
116
|
+
let stackBuildOutput = buildOutput;
|
|
117
|
+
let stackEntities = entities;
|
|
118
|
+
if (stack.src) {
|
|
119
|
+
const sb = await scopedBuild(stack.src);
|
|
120
|
+
stackEntityNames = [];
|
|
121
|
+
stackEntities = new Map();
|
|
122
|
+
for (const [name, entity] of sb.entities) {
|
|
123
|
+
if (entity.lexicon !== plugin.name || !isObservableDeclarable(entity))
|
|
124
|
+
continue;
|
|
125
|
+
stackEntityNames.push(name);
|
|
126
|
+
stackEntities.set(name, {
|
|
127
|
+
entityType: entity.entityType,
|
|
128
|
+
props: (entity.props != null ? entity.props : {}),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const raw = sb.outputs.get(plugin.name);
|
|
132
|
+
stackBuildOutput = raw === undefined ? "" : typeof raw === "string" ? raw : raw.primary;
|
|
133
|
+
}
|
|
134
|
+
const norm = normalizeObservation(await plugin.describeResources({
|
|
135
|
+
environment,
|
|
136
|
+
buildOutput: stackBuildOutput,
|
|
137
|
+
entityNames: stackEntityNames,
|
|
138
|
+
entities: stackEntities,
|
|
139
|
+
owned,
|
|
140
|
+
stack: stack.name,
|
|
141
|
+
region: stack.region,
|
|
142
|
+
...(opts?.namespace ? { namespace: opts.namespace } : {}),
|
|
143
|
+
}));
|
|
144
|
+
// Qualify ids by stack ONLY for a scoped (`src`) stack (#1162): that
|
|
145
|
+
// is the multi-region case where the SAME bare LogicalResourceId
|
|
146
|
+
// (e.g. `vpc`) exists in every stack, so a bare union would collide.
|
|
147
|
+
// A bare-string stack (#57) has unique per-component ids and is asked
|
|
148
|
+
// the whole-project entity set, so it keeps the bare-id tri-state
|
|
149
|
+
// merge (present > not-observed > absent) that behold and other
|
|
150
|
+
// consumers read.
|
|
151
|
+
parts.push(stack.src ? qualifyObservation(norm, stack.name) : norm);
|
|
152
|
+
}
|
|
153
|
+
observed = mergeObservations(parts);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
observed = normalizeObservation(await plugin.describeResources({
|
|
157
|
+
environment,
|
|
158
|
+
buildOutput,
|
|
159
|
+
entityNames,
|
|
160
|
+
entities,
|
|
161
|
+
owned,
|
|
162
|
+
...(opts?.namespace ? { namespace: opts.namespace } : {}),
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
// Run-level notices (#1265): one line per distinct note per run,
|
|
166
|
+
// whatever the stack count. `mergeObservations` already folded the
|
|
167
|
+
// per-stack copies; this folds across lexicons.
|
|
168
|
+
for (const note of observed.notes) {
|
|
169
|
+
const line = `[${plugin.name}] ${note}`;
|
|
170
|
+
if (!notes.includes(line))
|
|
171
|
+
notes.push(line);
|
|
172
|
+
}
|
|
173
|
+
// What the estate depends on but does not declare (#1273). Read after the
|
|
174
|
+
// managed resources, because the declared observation is the closure's
|
|
175
|
+
// roots — there is nothing to reference out from until it exists.
|
|
176
|
+
const dependencies = await collectDependencies(plugin, {
|
|
177
|
+
environment,
|
|
178
|
+
entities,
|
|
179
|
+
observed: observed.resources,
|
|
180
|
+
stacks,
|
|
181
|
+
});
|
|
182
|
+
for (const message of dependencies.warnings)
|
|
183
|
+
warnings.push(message);
|
|
184
|
+
// Resources of a managed kind that nothing declares or references (#1278).
|
|
185
|
+
// Bounded by what this lexicon's declared entities actually are, so a
|
|
186
|
+
// project managing security groups is not made to enumerate the account.
|
|
187
|
+
const ambient = includeAmbient
|
|
188
|
+
? await collectAmbient(plugin, {
|
|
189
|
+
environment,
|
|
190
|
+
kinds: [...new Set([...entities.values()].map((e) => e.entityType))],
|
|
191
|
+
observed: observed.resources,
|
|
192
|
+
stacks,
|
|
193
|
+
warnings,
|
|
194
|
+
})
|
|
195
|
+
: {};
|
|
196
|
+
// A resource can be reached as a dependency AND enumerated as ambient —
|
|
197
|
+
// the default VPC an instance sits in is both. It is one resource, and
|
|
198
|
+
// the dependency entry is the one carrying `referencedBy`, so it wins.
|
|
199
|
+
// Matched on physical id rather than on key, because ambient keys carry a
|
|
200
|
+
// region (#1416) and dependency keys do not, so the keys no longer
|
|
201
|
+
// collide even when the resource is the same one.
|
|
202
|
+
const dependedOn = new Set(Object.values(dependencies.resources)
|
|
203
|
+
.map((m) => m.physicalId)
|
|
204
|
+
.filter((id) => typeof id === "string"));
|
|
205
|
+
for (const [id, meta] of Object.entries(ambient)) {
|
|
206
|
+
if (meta.physicalId && dependedOn.has(meta.physicalId))
|
|
207
|
+
continue;
|
|
208
|
+
(_a = dependencies.resources)[id] ?? (_a[id] = meta);
|
|
209
|
+
}
|
|
210
|
+
pushObservation(observations, warnings, plugin.name, observed, environment, entityNames.length, dependencies);
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
// A thrown read is the whole-lexicon failure: every declared entity is
|
|
214
|
+
// NOT-OBSERVED, not absent (#1089). Emitting nothing here is what made a
|
|
215
|
+
// failed read look like "none of these exist" to every consumer.
|
|
216
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
217
|
+
errors.push(`${plugin.name}: ${message}`);
|
|
218
|
+
pushObservation(observations, warnings, plugin.name, {
|
|
219
|
+
resources: {},
|
|
220
|
+
unobserved: unobservedAll(entityNames, "read-failed", message, entities),
|
|
221
|
+
queried: {},
|
|
222
|
+
sources: {},
|
|
223
|
+
notes: [],
|
|
224
|
+
}, environment, entityNames.length);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return { observations, warnings, errors, notes };
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* The subset of an observation belonging to one stack.
|
|
231
|
+
*
|
|
232
|
+
* A scoped stack's ids are qualified `${stack}::${id}` (#1162), so the prefix is
|
|
233
|
+
* the whole test. An unqualified observation — single-stack, or a bare-string
|
|
234
|
+
* stack sharing one id space — has no way to be split and is returned whole,
|
|
235
|
+
* which is what it already was.
|
|
236
|
+
*/
|
|
237
|
+
function scopeToStack(resources, stack) {
|
|
238
|
+
if (!stack)
|
|
239
|
+
return resources;
|
|
240
|
+
const prefix = `${stack}::`;
|
|
241
|
+
const scoped = Object.fromEntries(Object.entries(resources)
|
|
242
|
+
.filter(([id]) => id.startsWith(prefix))
|
|
243
|
+
.map(([id, meta]) => [id, meta]));
|
|
244
|
+
// No qualified ids at all means this observation was never stack-scoped.
|
|
245
|
+
return Object.keys(scoped).length > 0 ? scoped : resources;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Ask a lexicon what exists of the kinds it manages, beyond what is declared
|
|
249
|
+
* (#1278). Once per stack for the region, merged by physical id — the same
|
|
250
|
+
* ambient resource seen from two stacks is one resource.
|
|
251
|
+
*
|
|
252
|
+
* "The same" is per region (#1416). Two stacks in one region reporting the
|
|
253
|
+
* account's default security group is one group; two regions' default security
|
|
254
|
+
* groups are two, whatever their ids look like, so the merge key carries the
|
|
255
|
+
* region a resource records itself in.
|
|
256
|
+
*/
|
|
257
|
+
export async function collectAmbient(plugin, opts) {
|
|
258
|
+
var _a;
|
|
259
|
+
if (!plugin.observeAmbient || opts.kinds.length === 0)
|
|
260
|
+
return {};
|
|
261
|
+
const found = {};
|
|
262
|
+
const refs = opts.stacks.length > 0 ? opts.stacks : [{ name: undefined, region: undefined }];
|
|
263
|
+
// Only a merge needs region-qualified keys, and one ref is not a merge. This
|
|
264
|
+
// is what keeps a single-region project's ids exactly what they were, and a
|
|
265
|
+
// recorded snapshot — always one stack, so always one ref — bare.
|
|
266
|
+
const merging = refs.length > 1;
|
|
267
|
+
for (const ref of refs) {
|
|
268
|
+
try {
|
|
269
|
+
const part = await plugin.observeAmbient({
|
|
270
|
+
environment: opts.environment,
|
|
271
|
+
kinds: opts.kinds,
|
|
272
|
+
observed: opts.observed,
|
|
273
|
+
...(ref.name ? { stack: ref.name } : {}),
|
|
274
|
+
...(ref.region ? { region: ref.region } : {}),
|
|
275
|
+
});
|
|
276
|
+
for (const [id, meta] of Object.entries(part)) {
|
|
277
|
+
found[_a = merging ? unqualifiedKey(id, meta) : id] ?? (found[_a] = meta);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
opts.warnings.push(`${plugin.name}: ambient resources not read${ref.name ? ` for stack "${ref.name}"` : ""} — ${err instanceof Error ? err.message : String(err)}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return found;
|
|
285
|
+
}
|
|
286
|
+
const NO_DEPENDENCIES = { resources: {}, edges: [], warnings: [] };
|
|
287
|
+
/**
|
|
288
|
+
* Ask a lexicon what its declared estate references but does not manage (#1273).
|
|
289
|
+
*
|
|
290
|
+
* Called once per stack, because the closure roots and the region differ per
|
|
291
|
+
* stack, and merged by key. Dependencies are keyed by physical id and are
|
|
292
|
+
* deliberately NOT stack-qualified: the account's default VPC route table is the
|
|
293
|
+
* same resource whichever stack routes through it, and qualifying it would
|
|
294
|
+
* produce one node per referrer and an edge to each.
|
|
295
|
+
*
|
|
296
|
+
* Best-effort. A lexicon that does not implement the hook, or one whose read
|
|
297
|
+
* fails, contributes nothing — the managed observation is already complete and
|
|
298
|
+
* useful on its own, and failing it because an ambient dependency could not be
|
|
299
|
+
* read would trade a whole answer for a partial one.
|
|
300
|
+
*/
|
|
301
|
+
export async function collectDependencies(plugin, opts) {
|
|
302
|
+
if (!plugin.observeDependencies)
|
|
303
|
+
return NO_DEPENDENCIES;
|
|
304
|
+
const resources = {};
|
|
305
|
+
const edges = [];
|
|
306
|
+
const warnings = [];
|
|
307
|
+
const refs = opts.stacks.length > 0 ? opts.stacks : [{ name: undefined, region: undefined }];
|
|
308
|
+
for (const ref of refs) {
|
|
309
|
+
// Only this stack's resources are the closure's roots. Handing a lexicon
|
|
310
|
+
// the whole estate makes it resolve out from resources that live somewhere
|
|
311
|
+
// else — for AWS that means `describe-instances` in one region with another
|
|
312
|
+
// region's instance ids, which fails outright with InvalidInstanceID and
|
|
313
|
+
// takes the whole read down with it.
|
|
314
|
+
const roots = scopeToStack(opts.observed, ref.name);
|
|
315
|
+
if (Object.keys(roots).length === 0)
|
|
316
|
+
continue;
|
|
317
|
+
try {
|
|
318
|
+
const found = await plugin.observeDependencies({
|
|
319
|
+
environment: opts.environment,
|
|
320
|
+
entities: opts.entities,
|
|
321
|
+
observed: roots,
|
|
322
|
+
...(ref.name ? { stack: ref.name } : {}),
|
|
323
|
+
...(ref.region ? { region: ref.region } : {}),
|
|
324
|
+
});
|
|
325
|
+
for (const [id, meta] of Object.entries(found.resources)) {
|
|
326
|
+
// Merge referrers rather than overwrite: two stacks routing through the
|
|
327
|
+
// same table is one node reached twice, and the reason it is here is
|
|
328
|
+
// both of them.
|
|
329
|
+
const existing = resources[id];
|
|
330
|
+
resources[id] = existing
|
|
331
|
+
? { ...existing, referencedBy: [...new Set([...(existing.referencedBy ?? []), ...(meta.referencedBy ?? [])])] }
|
|
332
|
+
: meta;
|
|
333
|
+
}
|
|
334
|
+
edges.push(...(found.edges ?? []));
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
338
|
+
warnings.push(`${plugin.name}: dependencies not read${ref.name ? ` for stack "${ref.name}"` : ""} — ${message}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return { resources, edges, warnings };
|
|
342
|
+
}
|
|
343
|
+
/** Record one lexicon's observation, warning once per unobserved entity. */
|
|
344
|
+
function pushObservation(observations, warnings, lexicon, observed, environment, declaredCount, dependencies = NO_DEPENDENCIES) {
|
|
345
|
+
const hasResources = Object.keys(observed.resources).length > 0;
|
|
346
|
+
const unobservedNames = Object.keys(observed.unobserved);
|
|
347
|
+
for (const name of unobservedNames) {
|
|
348
|
+
warnings.push(`${lexicon}: not observed — ${formatUnobserved(name, observed.unobserved[name])}`);
|
|
349
|
+
}
|
|
350
|
+
if (!hasResources && unobservedNames.length === 0) {
|
|
351
|
+
// #1166 — this is exactly the "wrong endpoint" shape (AWS's
|
|
352
|
+
// stackDoesNotExist branch returns an empty map with no #1089 hole): a
|
|
353
|
+
// declared entity list with nothing observed and nothing explained.
|
|
354
|
+
// Previously this fell straight through with neither an observation nor a
|
|
355
|
+
// warning — silently indistinguishable from "nothing is deployed yet".
|
|
356
|
+
const notice = zeroResourcesWarning(lexicon, environment, declaredCount, observed);
|
|
357
|
+
if (notice)
|
|
358
|
+
warnings.push(notice);
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
// Dependencies ride alongside the managed resources so they become nodes, and
|
|
362
|
+
// carry `referencedBy` so every consumer can still tell the two apart.
|
|
363
|
+
const hasDependencies = Object.keys(dependencies.resources).length > 0;
|
|
364
|
+
observations.push({
|
|
365
|
+
lexicon,
|
|
366
|
+
resources: hasDependencies
|
|
367
|
+
? { ...observed.resources, ...dependencies.resources }
|
|
368
|
+
: observed.resources,
|
|
369
|
+
...(unobservedNames.length > 0 ? { unobserved: observed.unobserved } : {}),
|
|
370
|
+
...(dependencies.edges.length > 0 ? { edges: dependencies.edges } : {}),
|
|
371
|
+
...(observed.stackExports && Object.keys(observed.stackExports).length > 0
|
|
372
|
+
? { stackExports: observed.stackExports }
|
|
373
|
+
: {}),
|
|
374
|
+
});
|
|
375
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real `ReferrerLookup` backend (#610, epic #551 follow-up to #568's
|
|
3
|
+
* `ReferrerLookup` interface). Shells out to `oras discover --format json
|
|
4
|
+
* <digest>` — the OCI distribution spec's referrers API, as exposed by the
|
|
5
|
+
* `oras` CLI — through the same injectable `ProcessRunner`
|
|
6
|
+
* (../components/verbs/process-runner.ts) the deep-scan `SbomGenerator`
|
|
7
|
+
* backend (../components/verbs/tool-sbom-generator.ts) and `publish-image`'s
|
|
8
|
+
* referrer-attach step share, mirroring ../components/verbs/cloud-executor.ts's
|
|
9
|
+
* `CloudExecutor` pattern once more: production code shells out, tests inject
|
|
10
|
+
* a `MockProcessRunner` and never touch a real registry/`oras` binary.
|
|
11
|
+
*
|
|
12
|
+
* Not the process-wide default: ./build-ledger.ts's `noopReferrerLookup`
|
|
13
|
+
* remains that (reports no referrers, no network, no registry credentials
|
|
14
|
+
* required) for exactly the reason `notImplementedSbomGenerator` and
|
|
15
|
+
* `SbomGenerator`'s hermetic backend aren't `sbom-generator.ts`'s default
|
|
16
|
+
* either — a project opts into the real registry-backed lookup explicitly
|
|
17
|
+
* (`buildLedgerEntries(manifest, createOrasReferrerLookup())`) rather than
|
|
18
|
+
* every previously-network-free build-ledger query silently starting to hit
|
|
19
|
+
* a registry.
|
|
20
|
+
*/
|
|
21
|
+
import { defaultProcessRunner, q, requireTool, } from "../components/verbs/process-runner.js";
|
|
22
|
+
/**
|
|
23
|
+
* Classify one oras-reported referrer manifest into a `ReferrerKind`, keyed
|
|
24
|
+
* off its `artifactType`/media type — the same three kinds
|
|
25
|
+
* ../components/verbs/build-ledger.ts's `Referrer.kind` already models
|
|
26
|
+
* (`sbom`, `provenance`, `signature`). An unrecognized artifact type is
|
|
27
|
+
* skipped (returns `undefined`) rather than guessed at, since a wrong
|
|
28
|
+
* classification (e.g. reporting a signature as an SBOM) would be worse than
|
|
29
|
+
* omitting it — the caller only ever sees referrers this module is confident
|
|
30
|
+
* about.
|
|
31
|
+
*/
|
|
32
|
+
function classify(descriptor) {
|
|
33
|
+
const type = (descriptor.artifactType ?? descriptor.mediaType ?? "").toLowerCase();
|
|
34
|
+
if (type.includes("spdx") || type.includes("cyclonedx") || type.includes("sbom"))
|
|
35
|
+
return "sbom";
|
|
36
|
+
if (type.includes("in-toto") || type.includes("provenance") || type.includes("slsa"))
|
|
37
|
+
return "provenance";
|
|
38
|
+
if (type.includes("cosign") || type.includes("signature") || type.includes("sig."))
|
|
39
|
+
return "signature";
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build a real `ReferrerLookup` backed by `oras discover`. `discover(digest)`
|
|
44
|
+
* runs `oras discover --format json <repo>@<digest>` and maps every returned
|
|
45
|
+
* manifest into a `Referrer`, classified by `classify` above. Returns `[]`
|
|
46
|
+
* (never throws) when `oras` reports no referrers for a digest — an image
|
|
47
|
+
* with no attached SBOM/provenance/signature is a normal outcome, not an
|
|
48
|
+
* error. Throws `ToolNotAvailableError`
|
|
49
|
+
* (../components/verbs/process-runner.ts) if `oras` itself is not installed,
|
|
50
|
+
* so a misconfigured environment fails loudly rather than silently reporting
|
|
51
|
+
* "no referrers" for every digest.
|
|
52
|
+
*/
|
|
53
|
+
export function createOrasReferrerLookup(options) {
|
|
54
|
+
const runner = options.runner ?? defaultProcessRunner();
|
|
55
|
+
return {
|
|
56
|
+
async discover(digest) {
|
|
57
|
+
await requireTool(runner, "oras", `discover OCI referrers for ${options.repo}@${digest}`);
|
|
58
|
+
const ref = `${options.repo.replace(/\/+$/, "")}@${digest}`;
|
|
59
|
+
const { stdout } = await runner.run(`oras discover --format json ${q(ref)}`);
|
|
60
|
+
let parsed;
|
|
61
|
+
try {
|
|
62
|
+
parsed = JSON.parse(stdout);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return []; // no referrers / unexpected output shape — degrade to "none known", never throw on a parse hiccup.
|
|
66
|
+
}
|
|
67
|
+
const referrers = [];
|
|
68
|
+
for (const descriptor of parsed.manifests ?? []) {
|
|
69
|
+
const kind = classify(descriptor);
|
|
70
|
+
if (!kind)
|
|
71
|
+
continue;
|
|
72
|
+
referrers.push({
|
|
73
|
+
kind,
|
|
74
|
+
mediaType: descriptor.artifactType ?? descriptor.mediaType,
|
|
75
|
+
digest: descriptor.digest,
|
|
76
|
+
location: `${options.repo}@${descriptor.digest}`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return referrers;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The override gate's lines on `chant/lifecycle` (#3760): read the denials,
|
|
3
|
+
* overrides and applied records, record a denial, and record that a run
|
|
4
|
+
* applied under an override, which spends it. The decision is
|
|
5
|
+
* `../override-gate.ts`'s, which bundles without this module's git code.
|
|
6
|
+
*
|
|
7
|
+
* Denials and overrides share `_gates/policy-override.jsonl` with the
|
|
8
|
+
* ordinary gate line shapes, so `chant approve`, `chant operator status` and
|
|
9
|
+
* the audit reader read them as they read any gate. Applied records live in
|
|
10
|
+
* `_gates/policy-override/applied.jsonl`, which no gate reader lists.
|
|
11
|
+
*/
|
|
12
|
+
import { sortedJsonReplacer } from "../utils.js";
|
|
13
|
+
import { appendPendingGate, readGateLedger } from "./gate-ledger.js";
|
|
14
|
+
import { readBlobBySha, readBlobFromPath, readPathSha, RefCASConflictError, writeBlobToPath } from "./git.js";
|
|
15
|
+
import { OVERRIDE_OP, parseAppliedOverrides, overridePending, } from "../override-gate.js";
|
|
16
|
+
const APPLIED_DIR = `_gates/${OVERRIDE_OP}`;
|
|
17
|
+
const APPLIED_FILE = "applied.jsonl";
|
|
18
|
+
const APPEND_RETRY_ATTEMPTS = 5;
|
|
19
|
+
/** The override ledger and its applied records, oldest first. Empty when nothing is recorded. */
|
|
20
|
+
export async function readOverrideLedger(opts) {
|
|
21
|
+
const { resolutions, pending } = await readGateLedger(OVERRIDE_OP, opts);
|
|
22
|
+
const text = await readBlobFromPath(APPLIED_DIR, APPLIED_FILE, opts);
|
|
23
|
+
return { resolutions, pending, applied: text ? parseAppliedOverrides(text) : [] };
|
|
24
|
+
}
|
|
25
|
+
/** Append a denial's pending fact ({@link overridePending}). Does not push. */
|
|
26
|
+
export async function recordOverrideDenial(input, opts) {
|
|
27
|
+
const { version: _v, kind: _k, ...rest } = overridePending(input);
|
|
28
|
+
const { commit, record } = await appendPendingGate(rest, opts);
|
|
29
|
+
return { commit, record: record };
|
|
30
|
+
}
|
|
31
|
+
/** Append applied records, spending the overrides they name. Write them before applying; a write that fails should stop the run. Does not push. */
|
|
32
|
+
export async function recordOverridesApplied(records, opts) {
|
|
33
|
+
if (records.length === 0)
|
|
34
|
+
return undefined;
|
|
35
|
+
const lines = records.map((r) => JSON.stringify(r, sortedJsonReplacer)).join("\n");
|
|
36
|
+
let lastErr;
|
|
37
|
+
for (let attempt = 1; attempt <= APPEND_RETRY_ATTEMPTS; attempt++) {
|
|
38
|
+
try {
|
|
39
|
+
const priorSha = await readPathSha(APPLIED_DIR, APPLIED_FILE, opts);
|
|
40
|
+
const existing = priorSha ? await readBlobBySha(priorSha, opts) : null;
|
|
41
|
+
const content = `${existing ? `${existing.replace(/\n$/, "")}\n` : ""}${lines}\n`;
|
|
42
|
+
return await writeBlobToPath(APPLIED_DIR, APPLIED_FILE, content, `Applied under override: ${records.map((r) => r.gate).join(", ")}`, {
|
|
43
|
+
...opts,
|
|
44
|
+
expectPriorPathSha: priorSha,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (!(err instanceof RefCASConflictError))
|
|
49
|
+
throw err;
|
|
50
|
+
lastErr = err;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw lastErr;
|
|
54
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan identity for a gate (#2300, measured on INTENTIUS/choudoufu#1026).
|
|
3
|
+
*
|
|
4
|
+
* A gate resolution used to carry the op, the gate, the approver and a
|
|
5
|
+
* timestamp, and nothing about what was approved. Approve, edit the root,
|
|
6
|
+
* re-run, and the second run re-planned and applied: the resolution had
|
|
7
|
+
* authorised the *next run* of that op rather than the plan the approver
|
|
8
|
+
* read. This module is the missing half — one string that identifies a plan,
|
|
9
|
+
* written onto the pending fact the run records, onto the resolution `chant
|
|
10
|
+
* approve` appends, and compared by {@link latestResolutionForPlan} when a
|
|
11
|
+
* later run decides the gate.
|
|
12
|
+
*
|
|
13
|
+
* ## What a digest covers
|
|
14
|
+
*
|
|
15
|
+
* The change set, and only the change set: what a run proposes to create,
|
|
16
|
+
* update, replace or destroy, at which addresses, with which values. Two
|
|
17
|
+
* plans share a digest exactly when applying either one would do the same
|
|
18
|
+
* thing to the estate.
|
|
19
|
+
*
|
|
20
|
+
* ## What it deliberately does not cover
|
|
21
|
+
*
|
|
22
|
+
* - **When the plan was taken.** A plan file's own `timestamp`, and the
|
|
23
|
+
* resolution's. Re-planning an unchanged root a minute later must produce
|
|
24
|
+
* the same digest, or every approval would expire on the clock rather than
|
|
25
|
+
* on the content.
|
|
26
|
+
* - **Which run took it.** `runId`, the CI job number, the workflow attempt.
|
|
27
|
+
* Approving a plan and re-running the workflow is the whole loop; binding
|
|
28
|
+
* the run id would make the approval unusable by the run that consumes it.
|
|
29
|
+
* - **The tool that produced it.** The terraform/choudoufu version, the plan
|
|
30
|
+
* file's binary bytes and its path on disk. The digest is taken over the
|
|
31
|
+
* `show -json` rendering rather than the file, so a plan-format bump does
|
|
32
|
+
* not read as a changed plan.
|
|
33
|
+
* - **Who approved it, or where.** `resolvedBy`, `note`, `url` — those
|
|
34
|
+
* describe the approval, not the plan.
|
|
35
|
+
*
|
|
36
|
+
* The identity is therefore a claim about consequence, not about provenance.
|
|
37
|
+
* That is the claim an approver is actually making.
|
|
38
|
+
*/
|
|
39
|
+
import { canonicalJson } from "../effect-receipt.js";
|
|
40
|
+
import { contentDigest } from "../content-digest.js";
|
|
41
|
+
/** The hash a plan digest is taken with. */
|
|
42
|
+
export const PLAN_DIGEST_ALGORITHM = "sha256";
|
|
43
|
+
/**
|
|
44
|
+
* The version prefix a plan digest is written with since #2547: `jcs1` names
|
|
45
|
+
* the input form (the RFC 8785 canonical JSON of `{ kind, subject }`, see
|
|
46
|
+
* `canonicalJson` in ../effect-receipt.ts) and `sha256` the hash. A later
|
|
47
|
+
* input form gets a new prefix, so a digest always says how it was made.
|
|
48
|
+
*/
|
|
49
|
+
export const PLAN_DIGEST_PREFIX = "jcs1-sha256:";
|
|
50
|
+
/** The bare prefix every digest written before #2547 carries. Still read, never written for a plan. */
|
|
51
|
+
export const LEGACY_PLAN_DIGEST_PREFIX = "sha256:";
|
|
52
|
+
/** Shape of a well-formed digest: either prefix, then 64 lowercase hex characters. */
|
|
53
|
+
const PLAN_DIGEST_PATTERN = /^(?:jcs1-)?sha256:([0-9a-f]{64})$/;
|
|
54
|
+
/**
|
|
55
|
+
* Hash a plan's change set into a stable identity.
|
|
56
|
+
*
|
|
57
|
+
* `kind` names the shape `subject` is in (`"terraform-plan"`,
|
|
58
|
+
* `"lifecycle-diff"`), and is hashed alongside it so two different kinds of
|
|
59
|
+
* plan can never collide into the same digest by coincidence — a gate bound
|
|
60
|
+
* to a terraform plan must not be satisfiable by a lifecycle diff that
|
|
61
|
+
* happened to serialize identically.
|
|
62
|
+
*
|
|
63
|
+
* `subject` is put in canonical form by `canonicalJson` (../effect-receipt.ts)
|
|
64
|
+
* and hashed by `contentDigest` (../content-digest.ts), so object key order,
|
|
65
|
+
* which neither terraform's JSON writer nor `JSON.parse` guarantees across
|
|
66
|
+
* versions, does not change the answer. It is the caller's job to
|
|
67
|
+
* hand in a projection that already excludes the volatile fields this
|
|
68
|
+
* module's doc comment lists.
|
|
69
|
+
*
|
|
70
|
+
* The result is `jcs1-sha256:<hex>` (#2547). Before that it was
|
|
71
|
+
* `sha256:<hex>` over the same bytes, so the hex is unchanged and
|
|
72
|
+
* {@link samePlanDigest} treats the two spellings as one digest: a gate
|
|
73
|
+
* recorded under the old prefix still matches the plan it was approved for.
|
|
74
|
+
*/
|
|
75
|
+
export function computePlanDigest(kind, subject) {
|
|
76
|
+
return PLAN_DIGEST_PREFIX + contentDigest(canonicalJson({ kind, subject })).slice(LEGACY_PLAN_DIGEST_PREFIX.length);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Whether `raw` is a digest this code produced, in either prefix. Used at the
|
|
80
|
+
* `chant approve --plan` boundary, so a typo, a truncated copy-paste or a plan
|
|
81
|
+
* *file* path is refused before it is written into an immutable resolution
|
|
82
|
+
* that would then never match anything.
|
|
83
|
+
*/
|
|
84
|
+
export function isPlanDigest(raw) {
|
|
85
|
+
return typeof raw === "string" && PLAN_DIGEST_PATTERN.test(raw);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Whether two recorded or computed plan digests name the same plan. Two
|
|
89
|
+
* well-formed plan digests are the same when their hex is, whichever prefix
|
|
90
|
+
* each carries (read both, write new, #2547). Anything else, such as a
|
|
91
|
+
* release plan's own digest, is the same only when the strings are equal.
|
|
92
|
+
*/
|
|
93
|
+
export function samePlanDigest(a, b) {
|
|
94
|
+
if (a === b)
|
|
95
|
+
return true;
|
|
96
|
+
if (a === undefined || b === undefined)
|
|
97
|
+
return false;
|
|
98
|
+
const x = PLAN_DIGEST_PATTERN.exec(a);
|
|
99
|
+
const y = PLAN_DIGEST_PATTERN.exec(b);
|
|
100
|
+
return x !== null && y !== null && x[1] === y[1];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A digest as it reads in a message, and the one place that decides how an
|
|
104
|
+
* absent one reads. Records written before #2300 carry no digest at all, and
|
|
105
|
+
* "(none — recorded before plan-bound gates)" is what a refusal has to say
|
|
106
|
+
* about them instead of printing `undefined`.
|
|
107
|
+
*/
|
|
108
|
+
export function describePlanDigest(digest) {
|
|
109
|
+
return digest ?? "(none — recorded before plan-bound gates)";
|
|
110
|
+
}
|