@intentius/chant 0.124.13 → 0.124.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +3 -0
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/lexicon-module.ts +3 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +1 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
import { isPropertyKindNew } from "./property-kind.js";
|
|
3
|
+
function isCapitalized(name) {
|
|
4
|
+
return name.length > 0 && name[0] === name[0].toUpperCase() && name[0] !== name[0].toLowerCase();
|
|
5
|
+
}
|
|
6
|
+
function getNewExpressionClassName(expr) {
|
|
7
|
+
if (ts.isIdentifier(expr.expression)) {
|
|
8
|
+
return expr.expression.text;
|
|
9
|
+
}
|
|
10
|
+
if (ts.isPropertyAccessExpression(expr.expression)) {
|
|
11
|
+
return expr.expression.name.text;
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Names of this file's top-level consts initialised with a property-kind `new`. */
|
|
16
|
+
function collectPropertyKindConsts(context) {
|
|
17
|
+
const names = new Set();
|
|
18
|
+
for (const stmt of context.sourceFile.statements) {
|
|
19
|
+
if (!ts.isVariableStatement(stmt))
|
|
20
|
+
continue;
|
|
21
|
+
for (const decl of stmt.declarationList.declarations) {
|
|
22
|
+
if (ts.isIdentifier(decl.name) &&
|
|
23
|
+
decl.initializer &&
|
|
24
|
+
ts.isNewExpression(decl.initializer) &&
|
|
25
|
+
isPropertyKindNew(decl.initializer, context)) {
|
|
26
|
+
names.add(decl.name.text);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return names;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* True when the constructor arguments hold a property-kind declarable,
|
|
34
|
+
* either inline (`panels: [new Row(…)]`) or through a const from
|
|
35
|
+
* `propertyConsts` (`panels: [red]`).
|
|
36
|
+
*/
|
|
37
|
+
function holdsPropertyKind(expr, context, propertyConsts) {
|
|
38
|
+
let found = false;
|
|
39
|
+
function visit(node) {
|
|
40
|
+
if (found)
|
|
41
|
+
return;
|
|
42
|
+
if (ts.isNewExpression(node) && isPropertyKindNew(node, context)) {
|
|
43
|
+
found = true;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (ts.isIdentifier(node) && propertyConsts.has(node.text)) {
|
|
47
|
+
found = true;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
ts.forEachChild(node, visit);
|
|
51
|
+
}
|
|
52
|
+
for (const arg of expr.arguments ?? [])
|
|
53
|
+
visit(arg);
|
|
54
|
+
return found;
|
|
55
|
+
}
|
|
56
|
+
function collectExportedDeclarables(context) {
|
|
57
|
+
const declarables = [];
|
|
58
|
+
const sourceFile = context.sourceFile;
|
|
59
|
+
const propertyConsts = collectPropertyKindConsts(context);
|
|
60
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
61
|
+
if (!ts.isVariableStatement(node))
|
|
62
|
+
return;
|
|
63
|
+
// Must have export modifier
|
|
64
|
+
const hasExport = node.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
65
|
+
if (!hasExport)
|
|
66
|
+
return;
|
|
67
|
+
for (const decl of node.declarationList.declarations) {
|
|
68
|
+
if (!ts.isIdentifier(decl.name))
|
|
69
|
+
continue;
|
|
70
|
+
if (!decl.initializer)
|
|
71
|
+
continue;
|
|
72
|
+
// Must be a new expression with a capitalized name
|
|
73
|
+
if (!ts.isNewExpression(decl.initializer))
|
|
74
|
+
continue;
|
|
75
|
+
const className = getNewExpressionClassName(decl.initializer);
|
|
76
|
+
if (!className || !isCapitalized(className))
|
|
77
|
+
continue;
|
|
78
|
+
// Parameters are inherently cross-file (declared in params.ts, consumed via Ref() elsewhere)
|
|
79
|
+
if (className === "Parameter")
|
|
80
|
+
continue;
|
|
81
|
+
// chant #2957: a property-kind declarable is part of a resource, and a
|
|
82
|
+
// resource holding one is the root that emits it.
|
|
83
|
+
if (isPropertyKindNew(decl.initializer, context))
|
|
84
|
+
continue;
|
|
85
|
+
if (holdsPropertyKind(decl.initializer, context, propertyConsts))
|
|
86
|
+
continue;
|
|
87
|
+
declarables.push({
|
|
88
|
+
name: decl.name.text,
|
|
89
|
+
node,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return declarables;
|
|
94
|
+
}
|
|
95
|
+
function collectReferences(name, sourceFile, declarationNode) {
|
|
96
|
+
let found = false;
|
|
97
|
+
function visit(node) {
|
|
98
|
+
if (found)
|
|
99
|
+
return;
|
|
100
|
+
// Skip the declaration itself
|
|
101
|
+
if (node === declarationNode)
|
|
102
|
+
return;
|
|
103
|
+
if (ts.isIdentifier(node) && node.text === name) {
|
|
104
|
+
// Make sure this isn't the declaration's own name
|
|
105
|
+
const parent = node.parent;
|
|
106
|
+
if (parent && ts.isVariableDeclaration(parent) && parent.name === node) {
|
|
107
|
+
// This is the declaration itself, skip
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
found = true;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
ts.forEachChild(node, visit);
|
|
115
|
+
}
|
|
116
|
+
visit(sourceFile);
|
|
117
|
+
return found;
|
|
118
|
+
}
|
|
119
|
+
export const noUnusedDeclarableRule = {
|
|
120
|
+
id: "COR004",
|
|
121
|
+
severity: "warning",
|
|
122
|
+
category: "correctness",
|
|
123
|
+
description: "Detects exported declarables that are never referenced in the same file",
|
|
124
|
+
check(context) {
|
|
125
|
+
const diagnostics = [];
|
|
126
|
+
const declarables = collectExportedDeclarables(context);
|
|
127
|
+
for (const decl of declarables) {
|
|
128
|
+
if (!collectReferences(decl.name, context.sourceFile, decl.node)) {
|
|
129
|
+
const { line, character } = context.sourceFile.getLineAndCharacterOfPosition(decl.node.getStart(context.sourceFile));
|
|
130
|
+
diagnostics.push({
|
|
131
|
+
file: context.filePath,
|
|
132
|
+
line: line + 1,
|
|
133
|
+
column: character + 1,
|
|
134
|
+
ruleId: "COR004",
|
|
135
|
+
severity: "warning",
|
|
136
|
+
message: `Exported declarable '${decl.name}' is never referenced in this file — it may be dead infrastructure code.`,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return diagnostics;
|
|
141
|
+
},
|
|
142
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OPS* Op-model post-synth checks (#2122, epic #2114 sub-issue 6) — ported
|
|
3
|
+
* from a hosting lexicon's own TMP012/TMP013/TMP014. Registered as core-owned
|
|
4
|
+
* post-synth checks (`coreOpChecks`, mirroring `../../receipt-checks.ts`'s
|
|
5
|
+
* `coreReceiptChecks`) so they run over the FULL build result regardless of
|
|
6
|
+
* which lexicons are configured — an Op is recognized by entity type
|
|
7
|
+
* (`../../../op/resource.ts`'s `OpResource`), not by which lexicon declared
|
|
8
|
+
* it. SYS010 (#2828) joined them when the `decide` activity moved into core:
|
|
9
|
+
* it reads the decide steps, and the `decide.backends` the caller passes.
|
|
10
|
+
*/
|
|
11
|
+
import { ops012 } from "./ops012-activity-contract.js";
|
|
12
|
+
import { ops013 } from "./ops013-step-output-ref.js";
|
|
13
|
+
import { ops014 } from "./ops014-converge-rule-refusals.js";
|
|
14
|
+
import { ops015 } from "./ops015-gate-approval.js";
|
|
15
|
+
import { sys010Check } from "./sys010-key-over-plain-http.js";
|
|
16
|
+
export { ops012 } from "./ops012-activity-contract.js";
|
|
17
|
+
export { ops013 } from "./ops013-step-output-ref.js";
|
|
18
|
+
export { ops014 } from "./ops014-converge-rule-refusals.js";
|
|
19
|
+
export { ops015 } from "./ops015-gate-approval.js";
|
|
20
|
+
export { sys010, sys010Check } from "./sys010-key-over-plain-http.js";
|
|
21
|
+
/**
|
|
22
|
+
* Core's own post-synth checks over the Op model: OPS012, OPS013, OPS014,
|
|
23
|
+
* OPS015, and SYS010 over the `decide` steps and the configured decide
|
|
24
|
+
* backends.
|
|
25
|
+
*/
|
|
26
|
+
export function coreOpChecks(opts = {}) {
|
|
27
|
+
return [ops012, ops013, ops014, ops015, sys010Check(opts.decideBackends)];
|
|
28
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OPS012: activity step args/outcomeAttribute must match the activity's
|
|
3
|
+
* declared contract (chant #1288 Stage 1; moved from a hosting lexicon's own
|
|
4
|
+
* TMP012 to core in #2122, epic #2114 sub-issue 6, so it fires on every
|
|
5
|
+
* project that declares an Op, not only one with that lexicon configured).
|
|
6
|
+
*
|
|
7
|
+
* Validates every Op entity's steps against core's own base-activity
|
|
8
|
+
* contracts (`../../../op/activities/activity-contracts.ts`, #2117), using
|
|
9
|
+
* the generic walk in `@intentius/chant/op`'s `validateActivitySteps`. A step
|
|
10
|
+
* whose `fn` has no registered contract here is skipped — most activities
|
|
11
|
+
* don't have one yet; see that module's doc for why that's the intended,
|
|
12
|
+
* non-breaking default.
|
|
13
|
+
*
|
|
14
|
+
* Cross-lexicon (chant #2101): an Op step may call an activity any
|
|
15
|
+
* configured lexicon contributes (`terraformPlan`, `k3sInstall`,
|
|
16
|
+
* `flyApply`), and since this check became core-owned it fires on every
|
|
17
|
+
* project that declares an Op. `ctx.activityContracts` carries the contracts
|
|
18
|
+
* every configured lexicon declared, resolved by `loadActivityContracts`
|
|
19
|
+
* (`../../../op/activity-contract-registry.ts`) the same way
|
|
20
|
+
* `loadActivities` resolves the implementations, and is merged over the
|
|
21
|
+
* static table below. A context that carries none — a hand-built one in a
|
|
22
|
+
* test, a caller that has not loaded any — falls back to that table alone,
|
|
23
|
+
* exactly as before.
|
|
24
|
+
*/
|
|
25
|
+
import { validateActivitySteps, mergeActivityContracts } from "../../../op/index.js";
|
|
26
|
+
import * as contracts from "../../../op/activities/activity-contracts.js";
|
|
27
|
+
import { isOpEntity } from "./support.js";
|
|
28
|
+
const CONTRACTS = new Map(Object.values(contracts).map((c) => [c.name, c]));
|
|
29
|
+
export const ops012 = {
|
|
30
|
+
id: "OPS012",
|
|
31
|
+
description: "Activity step args and outcomeAttribute.from must match the activity's declared contract",
|
|
32
|
+
check(ctx) {
|
|
33
|
+
const diagnostics = [];
|
|
34
|
+
const activeContracts = mergeActivityContracts(CONTRACTS, ctx.activityContracts);
|
|
35
|
+
for (const [entityKey, entity] of ctx.entities) {
|
|
36
|
+
if (!isOpEntity(entity))
|
|
37
|
+
continue;
|
|
38
|
+
const rec = entity;
|
|
39
|
+
const props = (entity.props ?? {});
|
|
40
|
+
if (typeof props.name !== "string" || !Array.isArray(props.phases))
|
|
41
|
+
continue;
|
|
42
|
+
for (const issue of validateActivitySteps(props, activeContracts)) {
|
|
43
|
+
diagnostics.push({
|
|
44
|
+
checkId: "OPS012",
|
|
45
|
+
severity: "error",
|
|
46
|
+
message: `Op "${issue.opName}", phase "${issue.phase}", step "${issue.fn}": ${issue.message}`,
|
|
47
|
+
entity: entityKey,
|
|
48
|
+
lexicon: typeof rec.lexicon === "string" ? rec.lexicon : undefined,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return diagnostics;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OPS013: a step-output reference (`stepOutput()`/`activity().out`, chant
|
|
3
|
+
* #1290) must name a step that precedes it, in scope (main `phases`, not
|
|
4
|
+
* `onFailure` or nested inside an `EffectStep`), with a registered
|
|
5
|
+
* `ActivityContract` whose `returns` schema the referenced path resolves
|
|
6
|
+
* against. Moved from a hosting lexicon's own TMP013 to core in #2122 (epic
|
|
7
|
+
* #2114 sub-issue 6), so it fires on every project that declares an Op — a
|
|
8
|
+
* project on the local runtime with no lexicons configured included.
|
|
9
|
+
*
|
|
10
|
+
* Same shape as OPS012 (`./ops012-activity-contract.ts`): the generic walk
|
|
11
|
+
* lives in `@intentius/chant/op`'s `validateStepOutputRefs`, over the same
|
|
12
|
+
* contract map this file builds from core's own base-activity contracts
|
|
13
|
+
* (`../../../op/activities/activity-contracts.ts`, #2117). A producer
|
|
14
|
+
* step whose `fn` has no registered contract is flagged (unlike OPS012's
|
|
15
|
+
* args/outcomeAttribute checks, which skip an unregistered `fn` — a
|
|
16
|
+
* reference has nothing to validate against without one, so it can't be
|
|
17
|
+
* silently allowed the way an unchecked arg can). The purely structural half
|
|
18
|
+
* of this check (an unknown step id, or a reference into a later phase) is
|
|
19
|
+
* independent of the contract map's contents entirely — no lexicon needs to
|
|
20
|
+
* be configured, and no activity needs a registered contract at all, for it
|
|
21
|
+
* to fire.
|
|
22
|
+
*
|
|
23
|
+
* Cross-lexicon (chant #2101): an Op step may call an activity any
|
|
24
|
+
* configured lexicon contributes (`terraformPlan`, `k3sInstall`,
|
|
25
|
+
* `flyApply`), and since this check became core-owned it fires on every
|
|
26
|
+
* project that declares an Op. `ctx.activityContracts` carries the contracts
|
|
27
|
+
* every configured lexicon declared, resolved by `loadActivityContracts`
|
|
28
|
+
* (`../../../op/activity-contract-registry.ts`) the same way
|
|
29
|
+
* `loadActivities` resolves the implementations, and is merged over the
|
|
30
|
+
* static table below. A context that carries none — a hand-built one in a
|
|
31
|
+
* test, a caller that has not loaded any — falls back to that table alone,
|
|
32
|
+
* exactly as before.
|
|
33
|
+
*
|
|
34
|
+
* That merge is what makes this rule usable at all on an Op whose steps are
|
|
35
|
+
* a lexicon's: before it, `terraformPlan` feeding `terraformApply` failed
|
|
36
|
+
* `chant build` for the absence of a contract the terraform lexicon does in
|
|
37
|
+
* fact declare, which is why both terraform examples carrying an Op kept it
|
|
38
|
+
* outside `src/` where the example-build harness could not see it.
|
|
39
|
+
*
|
|
40
|
+
* This check is what makes it safe for a lexicon's own serializer to compile
|
|
41
|
+
* every reference it finds unconditionally: `chant build` blocks file output
|
|
42
|
+
* while an error-severity post-synth finding stands, so generated code
|
|
43
|
+
* referencing an unresolved step never reaches disk (a lexicon's own Op
|
|
44
|
+
* serializer also runs the scope-only subset of this check directly —
|
|
45
|
+
* `validateStepOutputRefScope` — as defense-in-depth, chant #1950 pre-merge
|
|
46
|
+
* review finding 2).
|
|
47
|
+
*
|
|
48
|
+
* Cross-contract type compatibility (chant #1950 pre-merge review, finding
|
|
49
|
+
* 3): this rule also compares a producer's declared return type at `path`
|
|
50
|
+
* against the consumer's declared arg type at the same position
|
|
51
|
+
* (`string`/`number`/`boolean`/`object`/`array` only) and flags a mismatch —
|
|
52
|
+
* a string-returning path feeding a number-typed arg, for example.
|
|
53
|
+
* Deliberately shallow: a union, enum, literal, `z.any()`/`z.unknown()`, a
|
|
54
|
+
* transform, or a reference sitting inside an array in `args` all bail
|
|
55
|
+
* silently rather than being reasoned about. See `@intentius/chant/op`'s
|
|
56
|
+
* `step-output-ref.ts` module doc for the full writeup of what this catches
|
|
57
|
+
* and what it defers (to #1288 Stage 2).
|
|
58
|
+
*/
|
|
59
|
+
import { validateStepOutputRefs, mergeActivityContracts } from "../../../op/index.js";
|
|
60
|
+
import * as contracts from "../../../op/activities/activity-contracts.js";
|
|
61
|
+
import { isOpEntity } from "./support.js";
|
|
62
|
+
const CONTRACTS = new Map(Object.values(contracts).map((c) => [c.name, c]));
|
|
63
|
+
export const ops013 = {
|
|
64
|
+
id: "OPS013",
|
|
65
|
+
description: "A step-output reference must name an in-scope, preceding, contract-validated producer step",
|
|
66
|
+
check(ctx) {
|
|
67
|
+
const diagnostics = [];
|
|
68
|
+
const activeContracts = mergeActivityContracts(CONTRACTS, ctx.activityContracts);
|
|
69
|
+
for (const [entityKey, entity] of ctx.entities) {
|
|
70
|
+
if (!isOpEntity(entity))
|
|
71
|
+
continue;
|
|
72
|
+
const rec = entity;
|
|
73
|
+
const props = (entity.props ?? {});
|
|
74
|
+
if (typeof props.name !== "string" || !Array.isArray(props.phases))
|
|
75
|
+
continue;
|
|
76
|
+
for (const issue of validateStepOutputRefs(props, activeContracts)) {
|
|
77
|
+
diagnostics.push({
|
|
78
|
+
checkId: "OPS013",
|
|
79
|
+
severity: "error",
|
|
80
|
+
message: `Op "${issue.opName}", phase "${issue.phase}", step "${issue.fn}": ${issue.message}`,
|
|
81
|
+
entity: entityKey,
|
|
82
|
+
lexicon: typeof rec.lexicon === "string" ? rec.lexicon : undefined,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return diagnostics;
|
|
87
|
+
},
|
|
88
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { classifyOpVerbClass, isWellFormedPredicate, predicateReferencesField } from "../../../op/index.js";
|
|
2
|
+
import { CONVERGE_SYMPTOM_FIELDS, RESOURCE_SYMPTOM_FIELDS } from "../../../lifecycle/symptoms.js";
|
|
3
|
+
import { isOpEntity } from "./support.js";
|
|
4
|
+
function looksLikeOpProps(props) {
|
|
5
|
+
return typeof props.name === "string" && Array.isArray(props.phases);
|
|
6
|
+
}
|
|
7
|
+
/** Read a ConvergeOp's rule table back off its `convergeTick` step's `args.rules`. `undefined` if this doesn't look like a ConvergeOp-shaped Op (defensive — never crashes the build over an unexpected shape). */
|
|
8
|
+
function findConvergeRules(props) {
|
|
9
|
+
for (const phase of props.phases) {
|
|
10
|
+
for (const step of phase.steps) {
|
|
11
|
+
if (step.kind === "activity" && step.fn === "convergeTick") {
|
|
12
|
+
const rules = step.args?.rules;
|
|
13
|
+
// #2778: a ConvergeOp with an observer step passes its result as
|
|
14
|
+
// `observed`, and its rules read a ResourceSymptom.
|
|
15
|
+
const fields = step.args?.observed !== undefined ? RESOURCE_SYMPTOM_FIELDS : CONVERGE_SYMPTOM_FIELDS;
|
|
16
|
+
return Array.isArray(rules) ? { rules: rules, fields } : undefined;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
export const ops014 = {
|
|
23
|
+
id: "OPS014",
|
|
24
|
+
description: "A ConvergeOp rule table: run() must name a declared Op, a mutating dispatch requires dial apply (reconcile opens a PR in a future version, not implemented in v1), a destructive dispatch is refused outright in v1 (a converge tick is unattended and a destructive dispatch needs approval before it's attempted, not a gate consulted after the tick already committed to it), an adoptCount-reading rule may not dispatch a mutation, and every rule must carry its why",
|
|
25
|
+
check(ctx) {
|
|
26
|
+
const diagnostics = [];
|
|
27
|
+
const opsByName = new Map();
|
|
28
|
+
for (const entity of ctx.entities.values()) {
|
|
29
|
+
if (!isOpEntity(entity))
|
|
30
|
+
continue;
|
|
31
|
+
const rawProps = (entity.props ?? {});
|
|
32
|
+
if (!looksLikeOpProps(rawProps))
|
|
33
|
+
continue;
|
|
34
|
+
const opProps = rawProps;
|
|
35
|
+
opsByName.set(opProps.name, opProps);
|
|
36
|
+
}
|
|
37
|
+
for (const [entityKey, entity] of ctx.entities) {
|
|
38
|
+
if (!isOpEntity(entity))
|
|
39
|
+
continue;
|
|
40
|
+
const rec = entity;
|
|
41
|
+
const rawProps = (entity.props ?? {});
|
|
42
|
+
if (!looksLikeOpProps(rawProps))
|
|
43
|
+
continue;
|
|
44
|
+
const props = rawProps;
|
|
45
|
+
if (props.labels?.Converge !== "true")
|
|
46
|
+
continue;
|
|
47
|
+
const dial = props.labels?.Dial ?? "observe";
|
|
48
|
+
const found = findConvergeRules(props);
|
|
49
|
+
if (!found)
|
|
50
|
+
continue;
|
|
51
|
+
const { rules, fields } = found;
|
|
52
|
+
for (const rule of rules) {
|
|
53
|
+
const label = typeof rule?.id === "string" ? rule.id : "(unnamed rule)";
|
|
54
|
+
const push = (message) => {
|
|
55
|
+
diagnostics.push({
|
|
56
|
+
checkId: "OPS014",
|
|
57
|
+
severity: "error",
|
|
58
|
+
message: `ConvergeOp "${props.name}", rule "${label}": ${message}`,
|
|
59
|
+
entity: entityKey,
|
|
60
|
+
lexicon: typeof rec.lexicon === "string" ? rec.lexicon : undefined,
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
if (typeof rule?.why !== "string" || rule.why.trim().length === 0) {
|
|
64
|
+
push("every rule must carry its why — refused at build");
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (!isWellFormedPredicate(rule.when, fields)) {
|
|
68
|
+
push("predicate is outside the evaluable subset (build it from eq/neq/gt/gte/lt/lte/truthy/falsy/allOf/anyOf over a known symptom field)");
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (!rule.then || rule.then.kind !== "run")
|
|
72
|
+
continue;
|
|
73
|
+
const targetName = rule.then.op;
|
|
74
|
+
const target = opsByName.get(targetName);
|
|
75
|
+
if (!target) {
|
|
76
|
+
push(`references unknown op "${targetName}" — no declared Op has that name`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const verbClass = classifyOpVerbClass(target);
|
|
80
|
+
// Mutating: the issue's Autonomy table gives `reconcile` "open PR",
|
|
81
|
+
// not "run directly" — building that channel is out of v1 scope
|
|
82
|
+
// (epic #1487's onDrift-channel open question), so only `apply`
|
|
83
|
+
// (the dial the issue's table marks "run, gated per op") may free-run
|
|
84
|
+
// a mutating dispatch. Refusing this at build is the honest
|
|
85
|
+
// alternative to silently escalating `reconcile`'s authority to
|
|
86
|
+
// match `apply`.
|
|
87
|
+
if (verbClass === "mutating" && dial !== "apply") {
|
|
88
|
+
const escalationNote = dial === "reconcile"
|
|
89
|
+
? ` — the issue's table answer for "reconcile" is "open PR", which v1 does not implement (see epic #1487's onDrift-channel open question); this Op would otherwise silently run a mutation "reconcile" was never granted`
|
|
90
|
+
: "";
|
|
91
|
+
push(`dispatches "${targetName}" (mutating), but dial "${dial}" only permits a mutating dispatch under "apply"${escalationNote} — report instead, or raise the dial to "apply"`);
|
|
92
|
+
}
|
|
93
|
+
// Destructive: refused outright, regardless of dial or gate. A
|
|
94
|
+
// converge tick runs unattended on a schedule — nothing is watching
|
|
95
|
+
// it fire — so a destructive dispatch needs a human's approval
|
|
96
|
+
// *before* it is attempted, not a gate the tick consults only after
|
|
97
|
+
// it has already committed to running the op. `run()` has no way to
|
|
98
|
+
// ask first, so the target is refused rather than dispatched.
|
|
99
|
+
if (verbClass === "destructive") {
|
|
100
|
+
push(`dispatches "${targetName}" (destructive) — destructive run() targets are refused in v1 under any dial: a converge tick is unattended, and a destructive dispatch needs a human's approval before it is attempted, not a gate consulted after the tick has already committed to running it. Destructive remediation via ConvergeOp arrives once a tick can ask for that approval before it dispatches — until then, remediate manually via a gated ApplyOp/ReconcileOp run.`);
|
|
101
|
+
}
|
|
102
|
+
// Adopt safety: enforced, not just documented. A rule that reads
|
|
103
|
+
// `adoptCount` — the "unowned resource" signal — has no honest
|
|
104
|
+
// reason to dispatch a mutation; the only sanctioned action for that
|
|
105
|
+
// signal is `report()`. (A destructive target already gets refused
|
|
106
|
+
// above regardless of what its predicate reads.)
|
|
107
|
+
if (verbClass === "mutating" && predicateReferencesField(rule.when, "adoptCount")) {
|
|
108
|
+
push(`predicate reads "adoptCount" but dispatches "${targetName}" (mutating) — an unowned resource is reported, never auto-claimed by a dispatched mutation; use report() for a rule that reads the adopt signal`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return diagnostics;
|
|
113
|
+
},
|
|
114
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { gateApprovalProblems } from "../../../op/gate-approval.js";
|
|
2
|
+
import { gateName } from "../../../op/gate-name.js";
|
|
3
|
+
import { isOpEntity } from "./support.js";
|
|
4
|
+
function* gateSteps(phases) {
|
|
5
|
+
for (const phase of phases ?? []) {
|
|
6
|
+
for (const step of phase.steps ?? []) {
|
|
7
|
+
if (step.kind === "gate")
|
|
8
|
+
yield step;
|
|
9
|
+
else if (step.kind === "effect") {
|
|
10
|
+
for (const nested of step.steps ?? [])
|
|
11
|
+
if (nested.kind === "gate")
|
|
12
|
+
yield nested;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export const ops015 = {
|
|
18
|
+
id: "OPS015",
|
|
19
|
+
description: "A gate's approval block is well formed: quorum count at least 1, roles named, mode log-only or enforce, enforce has a policy, and policy resolves to a gate policy set whose version is the digest of its text",
|
|
20
|
+
check(ctx) {
|
|
21
|
+
const diagnostics = [];
|
|
22
|
+
for (const [entityKey, entity] of ctx.entities) {
|
|
23
|
+
if (!isOpEntity(entity))
|
|
24
|
+
continue;
|
|
25
|
+
const rec = entity;
|
|
26
|
+
const props = (entity.props ?? {});
|
|
27
|
+
if (!Array.isArray(props.phases))
|
|
28
|
+
continue;
|
|
29
|
+
for (const step of [...gateSteps(props.phases), ...gateSteps(props.onFailure)]) {
|
|
30
|
+
if (step.approval === undefined)
|
|
31
|
+
continue;
|
|
32
|
+
for (const problem of gateApprovalProblems(step.approval)) {
|
|
33
|
+
diagnostics.push({
|
|
34
|
+
checkId: "OPS015",
|
|
35
|
+
severity: "error",
|
|
36
|
+
message: `Op "${props.name}", gate "${gateName(step)}": ${problem}`,
|
|
37
|
+
entity: entityKey,
|
|
38
|
+
lexicon: typeof rec.lexicon === "string" ? rec.lexicon : undefined,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return diagnostics;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared support for the OPS* Op-model post-synth checks (#2122, epic #2114
|
|
3
|
+
* sub-issue 6) — OPS012 (`./ops012-activity-contract.ts`), OPS013
|
|
4
|
+
* (`./ops013-step-output-ref.ts`) and OPS014
|
|
5
|
+
* (`./ops014-converge-rule-refusals.ts`), ported here from a hosting
|
|
6
|
+
* lexicon's own TMP012/TMP013/TMP014.
|
|
7
|
+
*
|
|
8
|
+
* Op-entity recognition is core's own `isOpEntity` (`../../../op/resource.ts`,
|
|
9
|
+
* #2118) — re-exported here so every OPS* check imports it from one place.
|
|
10
|
+
*/
|
|
11
|
+
export { isOpEntity } from "../../../op/resource.js";
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SYS010: a `decide` backend sends its key over plain HTTP (#2740, core's
|
|
3
|
+
* since #2828).
|
|
4
|
+
*
|
|
5
|
+
* A backend in `decide.backends` in chant.config, or in a `decide` step's own
|
|
6
|
+
* `backends`, may have a key and an `http://` URL. The bearer key then crosses
|
|
7
|
+
* the network in clear text. A loopback address (127.0.0.1, ::1, localhost)
|
|
8
|
+
* is exempt, since that is where a local server such as `von serve` or the
|
|
9
|
+
* stub runs, and where a broker that is itself the endpoint listens.
|
|
10
|
+
*
|
|
11
|
+
* The steps are read off the Op entities, which covers a step written with
|
|
12
|
+
* the `decide` builder and one written with `activity("decide", ...)`. The
|
|
13
|
+
* configured backends are not entities: `chant build` and `chant lint` read
|
|
14
|
+
* them from the project's config and hand them to {@link sys010Check}. The id
|
|
15
|
+
* keeps the SYS prefix it had in the systemone lexicon.
|
|
16
|
+
*/
|
|
17
|
+
import { isOpEntity } from "./support.js";
|
|
18
|
+
const LOOPBACK = new Set(["127.0.0.1", "localhost", "[::1]", "::1"]);
|
|
19
|
+
function* decideSteps(phases) {
|
|
20
|
+
for (const phase of phases ?? []) {
|
|
21
|
+
for (const step of phase.steps ?? []) {
|
|
22
|
+
if (step.kind === "activity" && step.fn === "decide")
|
|
23
|
+
yield step;
|
|
24
|
+
else if (step.kind === "effect") {
|
|
25
|
+
for (const nested of step.steps ?? [])
|
|
26
|
+
if (nested.kind === "activity" && nested.fn === "decide")
|
|
27
|
+
yield nested;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** The host of an http:// URL that is not loopback, or undefined. */
|
|
33
|
+
export function plainRemoteHost(url) {
|
|
34
|
+
if (typeof url !== "string")
|
|
35
|
+
return undefined;
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = new URL(url);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
if (parsed.protocol !== "http:")
|
|
44
|
+
return undefined;
|
|
45
|
+
return LOOPBACK.has(parsed.hostname) ? undefined : parsed.hostname;
|
|
46
|
+
}
|
|
47
|
+
const DESCRIPTION = "A decide backend sends its key over plain HTTP to a host that is not loopback";
|
|
48
|
+
/**
|
|
49
|
+
* SYS010 over the Op entities and, when given, the backends configured in
|
|
50
|
+
* `decide.backends`. A configured backend's diagnostic names it as the entity
|
|
51
|
+
* `decide.backends.<name>`.
|
|
52
|
+
*/
|
|
53
|
+
export function sys010Check(configured) {
|
|
54
|
+
return {
|
|
55
|
+
id: "SYS010",
|
|
56
|
+
description: DESCRIPTION,
|
|
57
|
+
check(ctx) {
|
|
58
|
+
const diagnostics = [];
|
|
59
|
+
for (const [name, b] of Object.entries(configured ?? {})) {
|
|
60
|
+
const host = b?.key !== undefined ? plainRemoteHost(b.url) : undefined;
|
|
61
|
+
if (!host)
|
|
62
|
+
continue;
|
|
63
|
+
diagnostics.push({
|
|
64
|
+
checkId: "SYS010",
|
|
65
|
+
severity: "error",
|
|
66
|
+
message: `decide.backends.${name} sends its key over http:// to ${host}; use https://, or a loopback broker`,
|
|
67
|
+
entity: `decide.backends.${name}`,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
for (const [entityKey, entity] of ctx.entities) {
|
|
71
|
+
if (!isOpEntity(entity))
|
|
72
|
+
continue;
|
|
73
|
+
const rec = entity;
|
|
74
|
+
const props = (entity.props ?? {});
|
|
75
|
+
for (const step of [...decideSteps(props.phases), ...decideSteps(props.onFailure)]) {
|
|
76
|
+
const backends = step.args?.backends;
|
|
77
|
+
if (backends === null || typeof backends !== "object")
|
|
78
|
+
continue;
|
|
79
|
+
for (const [name, b] of Object.entries(backends)) {
|
|
80
|
+
if (b?.key === undefined)
|
|
81
|
+
continue;
|
|
82
|
+
const host = plainRemoteHost(b.url);
|
|
83
|
+
if (!host)
|
|
84
|
+
continue;
|
|
85
|
+
diagnostics.push({
|
|
86
|
+
checkId: "SYS010",
|
|
87
|
+
severity: "error",
|
|
88
|
+
message: `Op "${props.name}", decide ${JSON.stringify(step.args.point)}: backend ${name} sends its key over http:// to ${host}; use https://, or a loopback broker`,
|
|
89
|
+
entity: entityKey,
|
|
90
|
+
lexicon: typeof rec.lexicon === "string" ? rec.lexicon : undefined,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return diagnostics;
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** SYS010 over the Op entities alone, with no configured backends. */
|
|
100
|
+
export const sys010 = sys010Check();
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as ts from "typescript";
|
|
2
|
+
/**
|
|
3
|
+
* Property-kind declarables for the COR001, COR004 and COR009 heuristics
|
|
4
|
+
* (chant #2957).
|
|
5
|
+
*
|
|
6
|
+
* Those three rules were written for cloud resources, where every `new X(…)`
|
|
7
|
+
* is something the build emits. A property-kind declarable (`createProperty`)
|
|
8
|
+
* is not: it only exists inside the resource that holds it, like a Grafana
|
|
9
|
+
* panel inside its dashboard. The active lexicons name their property-kind
|
|
10
|
+
* classes through `LexiconPlugin.propertyClassNames()`, and `runLint` puts
|
|
11
|
+
* them on `LintContext.propertyClasses`. Without that set (a unit test, or a
|
|
12
|
+
* lexicon that declares none) nothing is property-kind and the rules behave
|
|
13
|
+
* as they always have.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Map each locally bound import name to the name it was exported under, so
|
|
17
|
+
* `import { TimeSeriesPanel as Series }` still resolves `new Series(…)`.
|
|
18
|
+
*/
|
|
19
|
+
function importAliases(sourceFile) {
|
|
20
|
+
const aliases = new Map();
|
|
21
|
+
for (const stmt of sourceFile.statements) {
|
|
22
|
+
if (!ts.isImportDeclaration(stmt))
|
|
23
|
+
continue;
|
|
24
|
+
const bindings = stmt.importClause?.namedBindings;
|
|
25
|
+
if (!bindings || !ts.isNamedImports(bindings))
|
|
26
|
+
continue;
|
|
27
|
+
for (const el of bindings.elements) {
|
|
28
|
+
if (el.propertyName)
|
|
29
|
+
aliases.set(el.name.text, el.propertyName.text);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return aliases;
|
|
33
|
+
}
|
|
34
|
+
const aliasCache = new WeakMap();
|
|
35
|
+
/** The exported class name a `new` expression constructs, if it has one. */
|
|
36
|
+
export function constructedClassName(node, sourceFile) {
|
|
37
|
+
const expr = node.expression;
|
|
38
|
+
if (ts.isPropertyAccessExpression(expr))
|
|
39
|
+
return expr.name.text;
|
|
40
|
+
if (!ts.isIdentifier(expr))
|
|
41
|
+
return undefined;
|
|
42
|
+
let aliases = aliasCache.get(sourceFile);
|
|
43
|
+
if (!aliases) {
|
|
44
|
+
aliases = importAliases(sourceFile);
|
|
45
|
+
aliasCache.set(sourceFile, aliases);
|
|
46
|
+
}
|
|
47
|
+
return aliases.get(expr.text) ?? expr.text;
|
|
48
|
+
}
|
|
49
|
+
/** True when `node` constructs a class an active lexicon declares property-kind. */
|
|
50
|
+
export function isPropertyKindNew(node, context) {
|
|
51
|
+
const classes = context.propertyClasses;
|
|
52
|
+
if (!classes || classes.size === 0)
|
|
53
|
+
return false;
|
|
54
|
+
const name = constructedClassName(node, context.sourceFile);
|
|
55
|
+
return name !== undefined && classes.has(name);
|
|
56
|
+
}
|