@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,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrangler config audit (#446) — a config format the audit engine could not
|
|
3
|
+
* parse at all before this: `wrangler.toml`, Cloudflare Workers' native
|
|
4
|
+
* declarative deploy file (routes, bindings, vars, observability). Fitting,
|
|
5
|
+
* since chant's own hosted audit path targets the same Workers runtime.
|
|
6
|
+
*
|
|
7
|
+
* Follows `secrets.ts`'s precedent for a format the issue says should ship
|
|
8
|
+
* "only a detector and a set of checks — no authoring surface, no output
|
|
9
|
+
* serializer": no lexicon plugin, no `AuditInput`/`classifyFiles` involvement,
|
|
10
|
+
* no npm package to install. `auditWranglerConfigs` scans the raw candidate
|
|
11
|
+
* files directly (the detector is `isWranglerConfigPath`) and is called
|
|
12
|
+
* alongside `scanForSecrets` from the CLI. `wrangler.toml` is also NOT the
|
|
13
|
+
* `fly` lexicon's `.fly` (this repo already has a `fly` lexicon covering the
|
|
14
|
+
* Machines/flaps REST API with its own `FLY0xx` ids) — this module owns a
|
|
15
|
+
* disjoint namespace (`WRG0xx`) and `AuditFinding.lexicon = "wrangler"`.
|
|
16
|
+
*
|
|
17
|
+
* Pure: no fs, no network, no Node-only global — Workers-safe (epic #350).
|
|
18
|
+
*/
|
|
19
|
+
import { parseTOML, TomlParseError } from "../toml.js";
|
|
20
|
+
/** Detector: does this path look like a Wrangler config? (native TOML only — see module doc.) */
|
|
21
|
+
export function isWranglerConfigPath(path) {
|
|
22
|
+
const base = path.split("/").pop() ?? path;
|
|
23
|
+
return base === "wrangler.toml";
|
|
24
|
+
}
|
|
25
|
+
function isRecord(v) {
|
|
26
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
27
|
+
}
|
|
28
|
+
function asArray(v) {
|
|
29
|
+
return Array.isArray(v) ? v : [];
|
|
30
|
+
}
|
|
31
|
+
function scopesOf(doc) {
|
|
32
|
+
const scopes = [{ name: "top-level", isTopLevel: true, config: doc }];
|
|
33
|
+
const env = doc.env;
|
|
34
|
+
if (isRecord(env)) {
|
|
35
|
+
for (const [name, cfg] of Object.entries(env)) {
|
|
36
|
+
if (isRecord(cfg))
|
|
37
|
+
scopes.push({ name, isTopLevel: false, config: cfg });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return scopes;
|
|
41
|
+
}
|
|
42
|
+
const PROD_NAME_RE = /^(prod|production|live)$/i;
|
|
43
|
+
const NON_PROD_NAME_RE = /^(dev|development|staging|stage|preview|test|testing|sandbox|local)$/i;
|
|
44
|
+
/** Best-effort 1-based line number of the first line containing `needle`, or undefined. */
|
|
45
|
+
function lineOf(content, needle) {
|
|
46
|
+
if (!needle)
|
|
47
|
+
return undefined;
|
|
48
|
+
const idx = content.indexOf(needle);
|
|
49
|
+
if (idx === -1)
|
|
50
|
+
return undefined;
|
|
51
|
+
return content.slice(0, idx).split("\n").length;
|
|
52
|
+
}
|
|
53
|
+
// ── WRG001: workers_dev in a production-named environment ──────────────────
|
|
54
|
+
function checkWorkersDevInProd(file, doc) {
|
|
55
|
+
const out = [];
|
|
56
|
+
for (const scope of scopesOf(doc)) {
|
|
57
|
+
if (!PROD_NAME_RE.test(scope.name))
|
|
58
|
+
continue;
|
|
59
|
+
if (scope.config.workers_dev !== true)
|
|
60
|
+
continue;
|
|
61
|
+
out.push({
|
|
62
|
+
checkId: "WRG001",
|
|
63
|
+
severity: "warning",
|
|
64
|
+
message: `Environment "${scope.name}" sets workers_dev = true — the Worker is reachable on the public *.workers.dev subdomain, bypassing whatever access control a custom domain/zone would provide.`,
|
|
65
|
+
file: file.path,
|
|
66
|
+
lexicon: "wrangler",
|
|
67
|
+
entity: scope.name,
|
|
68
|
+
line: lineOf(file.content, "workers_dev"),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
// ── WRG002: sensitive-named key stored in [vars] instead of a secret ───────
|
|
74
|
+
const SENSITIVE_VAR_RE = /(SECRET|TOKEN|API[_-]?KEY|PASSWORD|PASSWD|PRIVATE[_-]?KEY|ACCESS[_-]?KEY|CLIENT[_-]?SECRET|\bAUTH\b)/i;
|
|
75
|
+
function checkSecretShapedVars(file, doc) {
|
|
76
|
+
const out = [];
|
|
77
|
+
for (const scope of scopesOf(doc)) {
|
|
78
|
+
const vars = scope.config.vars;
|
|
79
|
+
if (!isRecord(vars))
|
|
80
|
+
continue;
|
|
81
|
+
for (const key of Object.keys(vars)) {
|
|
82
|
+
if (!SENSITIVE_VAR_RE.test(key))
|
|
83
|
+
continue;
|
|
84
|
+
out.push({
|
|
85
|
+
checkId: "WRG002",
|
|
86
|
+
severity: "error",
|
|
87
|
+
message: `"${key}" in [vars] (${scope.name}) looks like a credential name. Plaintext vars are committed to source and visible via 'wrangler dev'/the dashboard — use 'wrangler secret put ${key}' instead.`,
|
|
88
|
+
file: file.path,
|
|
89
|
+
lexicon: "wrangler",
|
|
90
|
+
entity: key,
|
|
91
|
+
line: lineOf(file.content, key),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
// ── WRG003: observability explicitly disabled ───────────────────────────────
|
|
98
|
+
function checkObservabilityDisabled(file, doc) {
|
|
99
|
+
const out = [];
|
|
100
|
+
for (const scope of scopesOf(doc)) {
|
|
101
|
+
const obs = scope.config.observability;
|
|
102
|
+
if (!isRecord(obs))
|
|
103
|
+
continue;
|
|
104
|
+
if (obs.enabled !== false)
|
|
105
|
+
continue;
|
|
106
|
+
out.push({
|
|
107
|
+
checkId: "WRG003",
|
|
108
|
+
severity: "info",
|
|
109
|
+
message: `Environment "${scope.name}" explicitly disables observability (observability.enabled = false) — no Workers Logs are recorded for this deployment, which will slow down or block incident investigation.`,
|
|
110
|
+
file: file.path,
|
|
111
|
+
lexicon: "wrangler",
|
|
112
|
+
entity: scope.name,
|
|
113
|
+
line: lineOf(file.content, "observability"),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
// ── WRG004: an account-wide wildcard route (unrestricted ingress) ──────────
|
|
119
|
+
function routePatterns(config) {
|
|
120
|
+
const patterns = [];
|
|
121
|
+
for (const r of asArray(config.routes)) {
|
|
122
|
+
if (typeof r === "string")
|
|
123
|
+
patterns.push(r);
|
|
124
|
+
else if (isRecord(r) && typeof r.pattern === "string")
|
|
125
|
+
patterns.push(r.pattern);
|
|
126
|
+
}
|
|
127
|
+
if (typeof config.route === "string")
|
|
128
|
+
patterns.push(config.route);
|
|
129
|
+
return patterns;
|
|
130
|
+
}
|
|
131
|
+
/** A route pattern with no host scoping at all — matches every zone in the account, not just one. */
|
|
132
|
+
function isAccountWildcard(pattern) {
|
|
133
|
+
const p = pattern.trim();
|
|
134
|
+
return p === "*" || p === "*/*";
|
|
135
|
+
}
|
|
136
|
+
function checkWildcardRoute(file, doc) {
|
|
137
|
+
const out = [];
|
|
138
|
+
for (const scope of scopesOf(doc)) {
|
|
139
|
+
for (const pattern of routePatterns(scope.config)) {
|
|
140
|
+
if (!isAccountWildcard(pattern))
|
|
141
|
+
continue;
|
|
142
|
+
out.push({
|
|
143
|
+
checkId: "WRG004",
|
|
144
|
+
severity: "error",
|
|
145
|
+
message: `Environment "${scope.name}" declares route "${pattern}" — an unscoped wildcard that matches every zone/path on the account, not one domain. Scope it to a specific zone (e.g. "example.com/*").`,
|
|
146
|
+
file: file.path,
|
|
147
|
+
lexicon: "wrangler",
|
|
148
|
+
entity: scope.name,
|
|
149
|
+
line: lineOf(file.content, pattern),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
const BINDING_KINDS = [
|
|
156
|
+
{ key: "kv_namespaces", idField: "id" },
|
|
157
|
+
{ key: "r2_buckets", idField: "bucket_name" },
|
|
158
|
+
{ key: "d1_databases", idField: "database_id" },
|
|
159
|
+
];
|
|
160
|
+
function checkCrossEnvSharedResource(file, doc) {
|
|
161
|
+
const out = [];
|
|
162
|
+
const scopes = scopesOf(doc);
|
|
163
|
+
// The top-level scope is the default deploy target (`wrangler deploy` with
|
|
164
|
+
// no `--env`) — treated as "production" only when the file also declares at
|
|
165
|
+
// least one dev/staging-like env, so a single-environment file (top-level
|
|
166
|
+
// only) never trips this on itself.
|
|
167
|
+
const hasNonProdEnv = scopes.some((s) => !s.isTopLevel && NON_PROD_NAME_RE.test(s.name));
|
|
168
|
+
const prodScopeNames = new Set(scopes.filter((s) => (s.isTopLevel && hasNonProdEnv) || PROD_NAME_RE.test(s.name)).map((s) => s.name));
|
|
169
|
+
const nonProdScopes = scopes.filter((s) => NON_PROD_NAME_RE.test(s.name));
|
|
170
|
+
if (prodScopeNames.size === 0 || nonProdScopes.length === 0)
|
|
171
|
+
return out;
|
|
172
|
+
for (const { key, idField } of BINDING_KINDS) {
|
|
173
|
+
// id -> set of scope names that declare a binding with that id
|
|
174
|
+
const byId = new Map();
|
|
175
|
+
for (const scope of scopes) {
|
|
176
|
+
for (const binding of asArray(scope.config[key])) {
|
|
177
|
+
if (!isRecord(binding))
|
|
178
|
+
continue;
|
|
179
|
+
const id = binding[idField];
|
|
180
|
+
if (typeof id !== "string" || id === "")
|
|
181
|
+
continue;
|
|
182
|
+
const owners = byId.get(id) ?? new Set();
|
|
183
|
+
owners.add(scope.name);
|
|
184
|
+
byId.set(id, owners);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
for (const [id, owners] of byId) {
|
|
188
|
+
const prodOwner = [...owners].find((n) => prodScopeNames.has(n));
|
|
189
|
+
const nonProdOwner = [...owners].find((n) => NON_PROD_NAME_RE.test(n));
|
|
190
|
+
if (!prodOwner || !nonProdOwner)
|
|
191
|
+
continue;
|
|
192
|
+
out.push({
|
|
193
|
+
checkId: "WRG005",
|
|
194
|
+
severity: "error",
|
|
195
|
+
message: `"${nonProdOwner}" and "${prodOwner}" both bind ${key} ${idField}="${id}" — the non-production environment has full read/write access to the production data store instead of its own copy.`,
|
|
196
|
+
file: file.path,
|
|
197
|
+
lexicon: "wrangler",
|
|
198
|
+
entity: `${key}:${id}`,
|
|
199
|
+
line: lineOf(file.content, id),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
// ── WRG006: static assets/site served from the project root ────────────────
|
|
206
|
+
const ROOT_DIR_RE = /^\.?\/?$/;
|
|
207
|
+
function checkAssetsServeRoot(file, doc) {
|
|
208
|
+
const out = [];
|
|
209
|
+
for (const scope of scopesOf(doc)) {
|
|
210
|
+
const candidates = [];
|
|
211
|
+
if (isRecord(scope.config.site))
|
|
212
|
+
candidates.push({ table: "site", field: "bucket", value: scope.config.site.bucket });
|
|
213
|
+
if (isRecord(scope.config.assets))
|
|
214
|
+
candidates.push({ table: "assets", field: "directory", value: scope.config.assets.directory });
|
|
215
|
+
for (const c of candidates) {
|
|
216
|
+
if (typeof c.value !== "string" || !ROOT_DIR_RE.test(c.value))
|
|
217
|
+
continue;
|
|
218
|
+
out.push({
|
|
219
|
+
checkId: "WRG006",
|
|
220
|
+
severity: "warning",
|
|
221
|
+
message: `Environment "${scope.name}" sets [${c.table}].${c.field} = "${c.value}" — the project root is served as public static assets, including any files not meant to be public (config, source maps, .git).`,
|
|
222
|
+
file: file.path,
|
|
223
|
+
lexicon: "wrangler",
|
|
224
|
+
entity: scope.name,
|
|
225
|
+
line: lineOf(file.content, c.field),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
const CHECKS = [
|
|
232
|
+
checkWorkersDevInProd,
|
|
233
|
+
checkSecretShapedVars,
|
|
234
|
+
checkObservabilityDisabled,
|
|
235
|
+
checkWildcardRoute,
|
|
236
|
+
checkCrossEnvSharedResource,
|
|
237
|
+
checkAssetsServeRoot,
|
|
238
|
+
];
|
|
239
|
+
/**
|
|
240
|
+
* Audit every `wrangler.toml` in `files`. Pure with respect to the filesystem
|
|
241
|
+
* and network. A file that fails to parse contributes no findings — the audit
|
|
242
|
+
* contract is "runs against any repo," never a crash on odd/partial config.
|
|
243
|
+
*/
|
|
244
|
+
export function auditWranglerConfigs(files) {
|
|
245
|
+
const findings = [];
|
|
246
|
+
for (const file of files) {
|
|
247
|
+
if (!isWranglerConfigPath(file.path))
|
|
248
|
+
continue;
|
|
249
|
+
let doc;
|
|
250
|
+
try {
|
|
251
|
+
doc = parseTOML(file.content);
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
if (err instanceof TomlParseError)
|
|
255
|
+
continue;
|
|
256
|
+
throw err;
|
|
257
|
+
}
|
|
258
|
+
for (const check of CHECKS)
|
|
259
|
+
findings.push(...check(file, doc));
|
|
260
|
+
}
|
|
261
|
+
return findings;
|
|
262
|
+
}
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The predicted delta between two behaviour results, and how it is shown
|
|
3
|
+
* (#2358, contract #2356).
|
|
4
|
+
*
|
|
5
|
+
* `behaviour.ts` ships the invariant and deliberately not the presentation:
|
|
6
|
+
* {@link compareFigures} says on which axes two figures fail to be a delta of
|
|
7
|
+
* like things, and binds every consumer to mark such a pair wherever it is
|
|
8
|
+
* shown. This module is the consumer. It takes the base side and the head
|
|
9
|
+
* side of a pull request as two {@link BehaviourResult}s and produces one
|
|
10
|
+
* finding, under four rules that are the contract's and #2358's rather than
|
|
11
|
+
* this file's:
|
|
12
|
+
*
|
|
13
|
+
* 1. A whole-run refusal on either side is a finding that says **no
|
|
14
|
+
* prediction**, with the refusal's own text and remedy. Never a delta and
|
|
15
|
+
* never a partial one: the five refusal causes are the engine being
|
|
16
|
+
* absent, unreachable, out of credit, over quota, or a credential in the
|
|
17
|
+
* request, and none of them is a statement about the estate.
|
|
18
|
+
* 2. A delta is computed only over entities predicted on **both** sides. An
|
|
19
|
+
* entity declined on either side — `unpredicted`, whatever the reason —
|
|
20
|
+
* is a row in the finding saying so, not an absent row and not a zero. An
|
|
21
|
+
* estate that gained an unmapped kind between the two runs did not gain a
|
|
22
|
+
* cost, and a finding that read it as one would be the faked number the
|
|
23
|
+
* epic forbids.
|
|
24
|
+
* 3. Before any two figures are differenced, {@link compareFigures} runs. A
|
|
25
|
+
* non-empty mismatch set means the pair is **marked** with every label in
|
|
26
|
+
* it, in {@link FIGURE_MISMATCHES}' display order, and no number is
|
|
27
|
+
* subtracted. `modeled` minus `validated` is not a change in the estate.
|
|
28
|
+
* 4. Every figure shown carries its provenance — engine, version, tolerance,
|
|
29
|
+
* basis — and a rate is rendered as a rate: so much per hour, at the
|
|
30
|
+
* stated traffic level, never an amount.
|
|
31
|
+
*
|
|
32
|
+
* Resilience has a fifth rule, from #2360's third comment: a verdict is
|
|
33
|
+
* computed over the graph the engine was handed, and the declared path hands
|
|
34
|
+
* over reference edges with no containment. When either side's
|
|
35
|
+
* `meta.edgeCoverage` is `partial` or `unknown`, the two verdicts were reached
|
|
36
|
+
* over graphs of different completeness, and the finding shows each side's
|
|
37
|
+
* verdict and says why they are not compared rather than drawing an arrow
|
|
38
|
+
* between them.
|
|
39
|
+
*
|
|
40
|
+
* Pure: no I/O, no clock, no environment. The Op activity that posts the
|
|
41
|
+
* result (`./op/activities/predict-behaviour.ts`) is where the sides come
|
|
42
|
+
* from.
|
|
43
|
+
*/
|
|
44
|
+
import { FIGURE_MISMATCHES, compareFigures, isBehaviourRefusalReport, isBehaviourResult, isBehaviourUnpredictedReason, renderBehaviourRefusal, validateBehaviourBlock, validateEdgeCoverage, } from "./behaviour.js";
|
|
45
|
+
/* -------------------------------------------------------------------------- */
|
|
46
|
+
/* Validating a result on arrival */
|
|
47
|
+
/* -------------------------------------------------------------------------- */
|
|
48
|
+
/**
|
|
49
|
+
* Hold a {@link BehaviourResult} to the contract, on arrival.
|
|
50
|
+
*
|
|
51
|
+
* `behaviourReport` checks a report as the ordinary route builds it, and its
|
|
52
|
+
* own doc says plainly that this is a check and not a proof: the report type
|
|
53
|
+
* is a plain interface, `isBehaviourResult` accepts a hand-built one, and a
|
|
54
|
+
* lexicon calling the builder with `entityNames: Object.keys(entities)`
|
|
55
|
+
* self-certifies. A consumer that needs the guarantee runs this instead, with
|
|
56
|
+
* the names it asked about, and the two consumers that need it are the delta
|
|
57
|
+
* (each side arrives from a plugin) and a scenario's fixture (the block
|
|
58
|
+
* arrives from JSON on disk).
|
|
59
|
+
*
|
|
60
|
+
* Throws, naming what is wrong. The refusals are the builder's, applied to a
|
|
61
|
+
* result rather than to its parts: an entity in neither map or in both, a
|
|
62
|
+
* figure for a name nobody asked about, a block priced at a level the run did
|
|
63
|
+
* not ask for, an unpredicted reason outside the closed set, an edge-coverage
|
|
64
|
+
* claim that names no gap, and any block failing `validateBehaviourBlock`. A
|
|
65
|
+
* refusal arm is held to having a legal cause and a non-empty reason and
|
|
66
|
+
* remedy, since those two strings are what a consumer prints.
|
|
67
|
+
*/
|
|
68
|
+
export function validateBehaviourResult(result, askedFor) {
|
|
69
|
+
if (!isBehaviourResult(result)) {
|
|
70
|
+
throw new Error("behaviour result is neither a report nor a refusal: expected `behaviour: \"v1\"` with either " +
|
|
71
|
+
"`refusal` or both `meta` and `entities`.");
|
|
72
|
+
}
|
|
73
|
+
if (isBehaviourRefusalReport(result)) {
|
|
74
|
+
const r = result.refusal;
|
|
75
|
+
if (!isBehaviourUnpredictedReason(r.cause)) {
|
|
76
|
+
throw new Error(`behaviour refusal carries the cause ${JSON.stringify(r.cause)}, which is not a legal reason.`);
|
|
77
|
+
}
|
|
78
|
+
if (typeof r.reason !== "string" || r.reason.trim() === "") {
|
|
79
|
+
throw new Error("behaviour refusal states no reason — the sentence a consumer prints is missing.");
|
|
80
|
+
}
|
|
81
|
+
if (typeof r.remedy !== "string" || r.remedy.trim() === "") {
|
|
82
|
+
throw new Error("behaviour refusal states no remedy — a refusal exists to be acted on.");
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
const report = result;
|
|
87
|
+
validateEdgeCoverage(report.meta.edgeCoverage);
|
|
88
|
+
if (typeof report.meta.at?.traffic !== "string" || report.meta.at.traffic.trim() === "") {
|
|
89
|
+
throw new Error("behaviour report states no traffic level in meta.at — a figure without its question is a bill in waiting.");
|
|
90
|
+
}
|
|
91
|
+
const asked = new Set(askedFor);
|
|
92
|
+
const unpredicted = report.unpredicted ?? {};
|
|
93
|
+
const holes = new Set(Object.keys(unpredicted));
|
|
94
|
+
for (const name of Object.keys(report.entities)) {
|
|
95
|
+
if (holes.has(name))
|
|
96
|
+
throw new Error(`behaviour report names "${name}" as both predicted and unpredicted.`);
|
|
97
|
+
if (!asked.has(name)) {
|
|
98
|
+
throw new Error(`behaviour report carries a figure for "${name}", which was not asked about.`);
|
|
99
|
+
}
|
|
100
|
+
validateBehaviourBlock(name, report.entities[name]);
|
|
101
|
+
if (report.entities[name].at.traffic !== report.meta.at.traffic) {
|
|
102
|
+
throw new Error(`behaviour report priced "${name}" at ${JSON.stringify(report.entities[name].at.traffic)} in a run ` +
|
|
103
|
+
`whose meta.at.traffic is ${JSON.stringify(report.meta.at.traffic)}.`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const name of holes) {
|
|
107
|
+
if (!asked.has(name))
|
|
108
|
+
throw new Error(`behaviour report names "${name}" unpredicted, and it was not asked about.`);
|
|
109
|
+
if (!isBehaviourUnpredictedReason(unpredicted[name]?.reason)) {
|
|
110
|
+
throw new Error(`behaviour report gives "${name}" the reason ${JSON.stringify(unpredicted[name]?.reason)}, which is not a legal one.`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const missing = askedFor.filter((name) => !Object.prototype.hasOwnProperty.call(report.entities, name) && !holes.has(name));
|
|
114
|
+
if (missing.length > 0) {
|
|
115
|
+
throw new Error(`behaviour report gives no verdict at all for ${missing.map((n) => `"${n}"`).join(", ")}. Every entity ` +
|
|
116
|
+
"asked about lands in `entities` or in `unpredicted`; there is no third position.");
|
|
117
|
+
}
|
|
118
|
+
return report;
|
|
119
|
+
}
|
|
120
|
+
/** Code-unit order, so two runs on two machines sort the rows the same way. */
|
|
121
|
+
function byCodeUnit(a, b) {
|
|
122
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
123
|
+
}
|
|
124
|
+
function has(map, key) {
|
|
125
|
+
return map !== undefined && Object.prototype.hasOwnProperty.call(map, key);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Compute the delta. Pure, and never subtracts two figures it has not first
|
|
129
|
+
* put through {@link compareFigures}.
|
|
130
|
+
*/
|
|
131
|
+
export function behaviourDelta(base, head) {
|
|
132
|
+
const baseRefused = isBehaviourRefusalReport(base.result);
|
|
133
|
+
const headRefused = isBehaviourRefusalReport(head.result);
|
|
134
|
+
if (baseRefused || headRefused) {
|
|
135
|
+
return {
|
|
136
|
+
kind: "no-prediction",
|
|
137
|
+
base: {
|
|
138
|
+
label: base.label,
|
|
139
|
+
...(base.ref ? { ref: base.ref } : {}),
|
|
140
|
+
...(baseRefused ? { refusal: base.result.refusal } : {}),
|
|
141
|
+
},
|
|
142
|
+
head: {
|
|
143
|
+
label: head.label,
|
|
144
|
+
...(head.ref ? { ref: head.ref } : {}),
|
|
145
|
+
...(headRefused ? { refusal: head.result.refusal } : {}),
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const b = base.result;
|
|
150
|
+
const h = head.result;
|
|
151
|
+
const names = new Set([
|
|
152
|
+
...Object.keys(b.entities),
|
|
153
|
+
...Object.keys(b.unpredicted ?? {}),
|
|
154
|
+
...Object.keys(h.entities),
|
|
155
|
+
...Object.keys(h.unpredicted ?? {}),
|
|
156
|
+
]);
|
|
157
|
+
const rows = [];
|
|
158
|
+
const sumsByCurrency = new Map();
|
|
159
|
+
for (const name of [...names].sort(byCodeUnit)) {
|
|
160
|
+
const baseFigure = has(b.entities, name) ? b.entities[name] : undefined;
|
|
161
|
+
const headFigure = has(h.entities, name) ? h.entities[name] : undefined;
|
|
162
|
+
const baseDeclined = has(b.unpredicted, name) ? b.unpredicted[name] : undefined;
|
|
163
|
+
const headDeclined = has(h.unpredicted, name) ? h.unpredicted[name] : undefined;
|
|
164
|
+
const type = baseDeclined?.type ?? headDeclined?.type;
|
|
165
|
+
const row = {
|
|
166
|
+
name,
|
|
167
|
+
...(type ? { type } : {}),
|
|
168
|
+
kind: "comparable",
|
|
169
|
+
...(baseFigure ? { base: baseFigure } : {}),
|
|
170
|
+
...(headFigure ? { head: headFigure } : {}),
|
|
171
|
+
...(baseDeclined ? { baseDeclined } : {}),
|
|
172
|
+
...(headDeclined ? { headDeclined } : {}),
|
|
173
|
+
};
|
|
174
|
+
if (baseDeclined || headDeclined) {
|
|
175
|
+
// Rule 2. A decline on either side is a row, and the row carries no
|
|
176
|
+
// difference — whatever the other side priced, there is nothing to
|
|
177
|
+
// difference it against.
|
|
178
|
+
row.kind = "declined";
|
|
179
|
+
}
|
|
180
|
+
else if (baseFigure && headFigure) {
|
|
181
|
+
// Rule 3. Every axis, not the first; the set is the contract's.
|
|
182
|
+
const found = compareFigures(baseFigure, headFigure);
|
|
183
|
+
if (found.size > 0) {
|
|
184
|
+
row.kind = "marked";
|
|
185
|
+
row.mismatches = FIGURE_MISMATCHES.filter((m) => found.has(m));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
row.kind = "comparable";
|
|
189
|
+
row.deltaPerHour = headFigure.cost.perHour - baseFigure.cost.perHour;
|
|
190
|
+
row.currency = headFigure.cost.currency;
|
|
191
|
+
const sum = sumsByCurrency.get(row.currency) ?? { currency: row.currency, perHour: 0, pairs: 0 };
|
|
192
|
+
sum.perHour += row.deltaPerHour;
|
|
193
|
+
sum.pairs += 1;
|
|
194
|
+
sumsByCurrency.set(row.currency, sum);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else if (baseFigure) {
|
|
198
|
+
row.kind = "only-base";
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
row.kind = "only-head";
|
|
202
|
+
}
|
|
203
|
+
rows.push(row);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
kind: "delta",
|
|
207
|
+
base: { label: base.label, ...(base.ref ? { ref: base.ref } : {}), meta: b.meta },
|
|
208
|
+
head: { label: head.label, ...(head.ref ? { ref: head.ref } : {}), meta: h.meta },
|
|
209
|
+
rows,
|
|
210
|
+
sums: [...sumsByCurrency.values()].sort((x, y) => byCodeUnit(x.currency, y.currency)),
|
|
211
|
+
resilienceComparable: b.meta.edgeCoverage.verdict === "complete" && h.meta.edgeCoverage.verdict === "complete",
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Four significant fractional digits at most, trailing zeros dropped. A rate
|
|
216
|
+
* of `0.272` renders as `0.272`, of `3` as `3`, and of `0.00230000001` as
|
|
217
|
+
* `0.0023`. No locale: the finding is the same bytes on every runner.
|
|
218
|
+
*/
|
|
219
|
+
export function formatPerHour(n) {
|
|
220
|
+
const fixed = n.toFixed(4);
|
|
221
|
+
return fixed.includes(".") ? fixed.replace(/0+$/, "").replace(/\.$/, "") : fixed;
|
|
222
|
+
}
|
|
223
|
+
/** A rate as a rate: `0.272 USD/hour`, never an amount. */
|
|
224
|
+
export function renderRate(rate) {
|
|
225
|
+
return `${formatPerHour(rate.perHour)} ${rate.currency}/hour`;
|
|
226
|
+
}
|
|
227
|
+
/** A signed difference, `+0.4 USD/hour`, `-0.1 USD/hour`, `0 USD/hour`. */
|
|
228
|
+
function renderDelta(perHour, currency) {
|
|
229
|
+
const sign = perHour > 0 ? "+" : "";
|
|
230
|
+
return `${sign}${formatPerHour(perHour)} ${currency}/hour`;
|
|
231
|
+
}
|
|
232
|
+
/** `acme-sim 1.4.2 · ±15% · modeled` — the four provenance fields, always together. */
|
|
233
|
+
export function renderProvenance(p) {
|
|
234
|
+
return `${p.engine} ${p.version} · ${p.tolerance} · ${p.basis}`;
|
|
235
|
+
}
|
|
236
|
+
function renderCoverage(c) {
|
|
237
|
+
const gaps = [];
|
|
238
|
+
if (c.unresolvedKinds && c.unresolvedKinds.length > 0)
|
|
239
|
+
gaps.push(`unresolved kinds: ${c.unresolvedKinds.join(", ")}`);
|
|
240
|
+
if (c.dangling && c.dangling.length > 0)
|
|
241
|
+
gaps.push(`${c.dangling.length} dangling reference(s)`);
|
|
242
|
+
if (c.containmentEdges && c.containmentEdges.length > 0)
|
|
243
|
+
gaps.push(`${c.containmentEdges.length} containment edge(s)`);
|
|
244
|
+
return gaps.length > 0 ? `${c.verdict} (${gaps.join("; ")})` : c.verdict;
|
|
245
|
+
}
|
|
246
|
+
function renderAxis(name, before, after) {
|
|
247
|
+
const b = before === undefined ? "—" : formatPerHour(before);
|
|
248
|
+
const a = after === undefined ? "—" : formatPerHour(after);
|
|
249
|
+
return `${name} ${b} → ${a}`;
|
|
250
|
+
}
|
|
251
|
+
function renderHeadroom(base, head) {
|
|
252
|
+
const b = (base?.headroom ?? {});
|
|
253
|
+
const h = (head?.headroom ?? {});
|
|
254
|
+
return [renderAxis("cpu", b.cpu, h.cpu), renderAxis("latency", b.latency, h.latency)].join(" · ");
|
|
255
|
+
}
|
|
256
|
+
function renderVerdict(f) {
|
|
257
|
+
return f ? `${f.resilience.verdict} (${f.resilience.failure})` : "—";
|
|
258
|
+
}
|
|
259
|
+
function renderResilience(row, comparable) {
|
|
260
|
+
const { base, head } = row;
|
|
261
|
+
if (!base || !head)
|
|
262
|
+
return base ? `base ${renderVerdict(base)}` : head ? `head ${renderVerdict(head)}` : "—";
|
|
263
|
+
if (comparable && base.resilience.failure === head.resilience.failure) {
|
|
264
|
+
const arrow = base.resilience.verdict === head.resilience.verdict ? "=" : "→";
|
|
265
|
+
return `${base.resilience.verdict} ${arrow} ${head.resilience.verdict} (${base.resilience.failure})`;
|
|
266
|
+
}
|
|
267
|
+
return `base ${renderVerdict(base)}; head ${renderVerdict(head)}`;
|
|
268
|
+
}
|
|
269
|
+
function renderRowProvenance(row) {
|
|
270
|
+
const { base, head } = row;
|
|
271
|
+
if (base && head) {
|
|
272
|
+
const b = renderProvenance(base.provenance);
|
|
273
|
+
const h = renderProvenance(head.provenance);
|
|
274
|
+
return b === h ? b : `base: ${b}; head: ${h}`;
|
|
275
|
+
}
|
|
276
|
+
return base ? renderProvenance(base.provenance) : head ? renderProvenance(head.provenance) : "—";
|
|
277
|
+
}
|
|
278
|
+
function cell(s) {
|
|
279
|
+
return s.replace(/\|/g, "\\|").replace(/\r?\n/g, " ");
|
|
280
|
+
}
|
|
281
|
+
function figureCell(f, declined) {
|
|
282
|
+
if (declined)
|
|
283
|
+
return `declined: ${declined.reason}`;
|
|
284
|
+
if (f)
|
|
285
|
+
return renderRate(f.cost);
|
|
286
|
+
return "—";
|
|
287
|
+
}
|
|
288
|
+
function deltaCell(row) {
|
|
289
|
+
switch (row.kind) {
|
|
290
|
+
case "comparable":
|
|
291
|
+
return renderDelta(row.deltaPerHour, row.currency);
|
|
292
|
+
case "marked":
|
|
293
|
+
return `marked: ${(row.mismatches ?? []).join(", ")}`;
|
|
294
|
+
case "declined":
|
|
295
|
+
return "no delta (declined)";
|
|
296
|
+
case "only-base":
|
|
297
|
+
return "removed";
|
|
298
|
+
case "only-head":
|
|
299
|
+
return "added";
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* The finding as Markdown, for a pull-request comment or a merge-request
|
|
304
|
+
* note. Deterministic for a given delta.
|
|
305
|
+
*
|
|
306
|
+
* The first paragraph says what the numbers are, before any of them appear:
|
|
307
|
+
* a modeled rate for one hypothetical hour, at the level the run was asked
|
|
308
|
+
* for, from a named engine at a stated tolerance. The paragraph is not
|
|
309
|
+
* decoration; it is rule 1 of the contract applied to prose.
|
|
310
|
+
*/
|
|
311
|
+
export function renderBehaviourFinding(delta, ctx) {
|
|
312
|
+
const lines = [];
|
|
313
|
+
if (delta.kind === "no-prediction") {
|
|
314
|
+
lines.push(`## Predicted behaviour for \`${ctx.env}\` — no prediction (Op \`${ctx.op}\`)`, "");
|
|
315
|
+
lines.push("No delta is shown and no figure is guessed locally. A prediction refused on one side is not a " +
|
|
316
|
+
"prediction of zero on that side, so there is nothing to difference the other side against.", "");
|
|
317
|
+
for (const side of [delta.base, delta.head]) {
|
|
318
|
+
if (!side.refusal)
|
|
319
|
+
continue;
|
|
320
|
+
const title = side.ref ? `${side.label} (${side.ref})` : side.label;
|
|
321
|
+
lines.push(`**${title}**`, "", "```", renderBehaviourRefusal(side.refusal, { color: false }), "```", "");
|
|
322
|
+
}
|
|
323
|
+
return lines.join("\n").trimEnd() + "\n";
|
|
324
|
+
}
|
|
325
|
+
const traffic = delta.head.meta.at.traffic;
|
|
326
|
+
lines.push(`## Predicted behaviour for \`${ctx.env}\` at \`${traffic}\` (Op \`${ctx.op}\`)`, "");
|
|
327
|
+
lines.push("A prediction, not a measurement. Every figure below is one engine's modeled rate for one hypothetical " +
|
|
328
|
+
"hour at the stated traffic level, shown with that engine's name, version, stated tolerance and basis " +
|
|
329
|
+
"(`modeled` from list prices, or `validated`). Nothing here is an amount owed for an hour that happened.", "");
|
|
330
|
+
lines.push("| Side | Predicted from | Engine | Traffic level | Edge coverage | Engine's own estate total |");
|
|
331
|
+
lines.push("|---|---|---|---|---|---|");
|
|
332
|
+
for (const side of [delta.base, delta.head]) {
|
|
333
|
+
const total = side.meta.total ? renderRate(side.meta.total) : "not stated";
|
|
334
|
+
lines.push(`| ${side.label} | ${cell(side.ref ?? "—")} | ${cell(`${side.meta.engine} ${side.meta.version}`)} | ` +
|
|
335
|
+
`${cell(side.meta.at.traffic)} | ${cell(renderCoverage(side.meta.edgeCoverage))} | ${total} |`);
|
|
336
|
+
}
|
|
337
|
+
lines.push("");
|
|
338
|
+
if (delta.base.meta.at.traffic !== delta.head.meta.at.traffic) {
|
|
339
|
+
lines.push(`The two sides were predicted at different traffic levels (\`${delta.base.meta.at.traffic}\` and ` +
|
|
340
|
+
`\`${delta.head.meta.at.traffic}\`), so every pair below is marked \`mixed-level\` and none is differenced.`, "");
|
|
341
|
+
}
|
|
342
|
+
if (!delta.resilienceComparable) {
|
|
343
|
+
lines.push("Resilience verdicts are shown per side and **not compared**: edge coverage is " +
|
|
344
|
+
`\`${delta.base.meta.edgeCoverage.verdict}\` on ${delta.base.label} and ` +
|
|
345
|
+
`\`${delta.head.meta.edgeCoverage.verdict}\` on ${delta.head.label}, so the two verdicts were computed ` +
|
|
346
|
+
"over graphs of different completeness, and a difference between them is not a difference in the estate.", "");
|
|
347
|
+
}
|
|
348
|
+
lines.push("| Entity | Type | " +
|
|
349
|
+
`${delta.base.label} | ${delta.head.label} | Delta per hour | Headroom (${delta.base.label} → ${delta.head.label}) | ` +
|
|
350
|
+
"Resilience | Provenance |");
|
|
351
|
+
lines.push("|---|---|---|---|---|---|---|---|");
|
|
352
|
+
for (const row of delta.rows) {
|
|
353
|
+
lines.push(`| ${cell(row.name)} | ${cell(row.type ?? "")} | ${cell(figureCell(row.base, row.baseDeclined))} | ` +
|
|
354
|
+
`${cell(figureCell(row.head, row.headDeclined))} | ${cell(deltaCell(row))} | ` +
|
|
355
|
+
`${cell(renderHeadroom(row.base, row.head))} | ${cell(renderResilience(row, delta.resilienceComparable))} | ` +
|
|
356
|
+
`${cell(renderRowProvenance(row))} |`);
|
|
357
|
+
}
|
|
358
|
+
lines.push("");
|
|
359
|
+
const marked = delta.rows.filter((r) => r.kind === "marked").length;
|
|
360
|
+
const declined = delta.rows.filter((r) => r.kind === "declined").length;
|
|
361
|
+
const oneSided = delta.rows.filter((r) => r.kind === "only-base" || r.kind === "only-head").length;
|
|
362
|
+
if (delta.sums.length > 0) {
|
|
363
|
+
for (const sum of delta.sums) {
|
|
364
|
+
lines.push(`Sum of the comparable deltas: **${renderDelta(sum.perHour, sum.currency)}** over ${sum.pairs} pair(s). ` +
|
|
365
|
+
"This is chant's own arithmetic over the comparable rows above and not an engine figure; it excludes " +
|
|
366
|
+
`${marked} marked pair(s), ${declined} declined entit${declined === 1 ? "y" : "ies"} and ${oneSided} ` +
|
|
367
|
+
"entit" + (oneSided === 1 ? "y" : "ies") + " present on one side only.");
|
|
368
|
+
}
|
|
369
|
+
lines.push("");
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
lines.push("No pair is comparable, so no delta is summed.", "");
|
|
373
|
+
}
|
|
374
|
+
const declinedRows = delta.rows.filter((r) => r.kind === "declined");
|
|
375
|
+
if (declinedRows.length > 0) {
|
|
376
|
+
lines.push("### Declined entities", "");
|
|
377
|
+
lines.push("An entity the engine could not price is reported, not priced at nothing. It carries no delta on either " +
|
|
378
|
+
"side; the reason is the lexicon's own.", "");
|
|
379
|
+
for (const row of declinedRows) {
|
|
380
|
+
for (const [label, d] of [
|
|
381
|
+
[delta.base.label, row.baseDeclined],
|
|
382
|
+
[delta.head.label, row.headDeclined],
|
|
383
|
+
]) {
|
|
384
|
+
if (!d)
|
|
385
|
+
continue;
|
|
386
|
+
lines.push(`- \`${row.name}\` on ${label}: \`${d.reason}\`${d.detail ? ` — ${d.detail}` : ""}`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
lines.push("");
|
|
390
|
+
}
|
|
391
|
+
const hints = delta.rows.filter((r) => r.head?.rightSize);
|
|
392
|
+
if (hints.length > 0) {
|
|
393
|
+
lines.push(`### Right-size hints on ${delta.head.label}`, "");
|
|
394
|
+
for (const row of hints) {
|
|
395
|
+
const rs = row.head.rightSize;
|
|
396
|
+
lines.push(`- \`${row.name}\`: ${rs.suggestion}${rs.reason ? ` — ${rs.reason}` : ""}`);
|
|
397
|
+
}
|
|
398
|
+
lines.push("");
|
|
399
|
+
}
|
|
400
|
+
return lines.join("\n").trimEnd() + "\n";
|
|
401
|
+
}
|