@intentius/chant 0.124.13 → 0.124.15
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.d.ts +6 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +669 -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.d.ts +24 -2
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +361 -0
- package/dist/child-project.js +21 -0
- package/dist/ci-jobs.d.ts +227 -0
- package/dist/ci-jobs.d.ts.map +1 -0
- package/dist/ci-jobs.js +448 -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.d.ts.map +1 -1
- package/dist/components/pr-pipeline.js +135 -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.d.ts +10 -2
- package/dist/composite.d.ts.map +1 -1
- package/dist/composite.js +313 -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.d.ts +2 -1
- package/dist/discovery/collect.d.ts.map +1 -1
- package/dist/discovery/collect.js +223 -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 +4073 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/host-composite.d.ts +35 -0
- package/dist/discovery/host-composite.d.ts.map +1 -0
- package/dist/discovery/host-composite.js +93 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- 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 +20 -9
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +313 -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.d.ts +69 -2
- package/dist/lifecycle/gate-audit.d.ts.map +1 -1
- package/dist/lifecycle/gate-audit.js +415 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +24 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +201 -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.d.ts +1 -1
- 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.d.ts +8 -3
- package/dist/op/activities/change-set.d.ts.map +1 -1
- package/dist/op/activities/change-set.js +67 -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.d.ts +28 -16
- package/dist/op/activities/reconcile.d.ts.map +1 -1
- package/dist/op/activities/reconcile.js +1011 -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.d.ts +1 -1
- package/dist/op/builders.d.ts.map +1 -1
- 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.d.ts +7 -0
- package/dist/workspace/__fixtures__/contract-repo.d.ts.map +1 -1
- package/dist/workspace/__fixtures__/contract-repo.js +119 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.d.ts +1 -1
- package/dist/workspace/__fixtures__/sessions.d.ts.map +1 -1
- 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 +462 -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.d.ts +3 -1
- package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
- package/dist/workspace/ci-green-workflow.js +202 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/class-data.d.ts +84 -0
- package/dist/workspace/class-data.d.ts.map +1 -0
- package/dist/workspace/class-data.js +238 -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.d.ts +3 -7
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +553 -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 +4 -11
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +162 -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/build.ts +8 -0
- package/src/change-set.test.ts +48 -0
- package/src/change-set.ts +52 -2
- package/src/ci-jobs.test.ts +49 -0
- package/src/ci-jobs.ts +515 -0
- 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/pr-pipeline.ts +3 -2
- package/src/components/sandbox/driver.ts +3 -1
- package/src/composite.ts +15 -3
- package/src/config-import.ts +3 -0
- package/src/discovery/collect.ts +15 -1
- package/src/discovery/fold-build-parity.test.ts +71 -0
- package/src/discovery/fold-import.ts +25 -127
- package/src/discovery/fold-project-provenance.test.ts +21 -4
- package/src/discovery/host-composite.ts +101 -0
- package/src/discovery/import.ts +2 -0
- package/src/discovery/index.ts +11 -1
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +5 -4
- package/src/gate-decision-identity.test.ts +59 -6
- package/src/gate-decision.ts +81 -21
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-audit.test.ts +55 -1
- package/src/lifecycle/gate-audit.ts +116 -3
- package/src/lifecycle/gate-ledger.test.ts +20 -1
- package/src/lifecycle/gate-ledger.ts +33 -1
- 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/activities/activity-contracts.ts +1 -1
- package/src/op/activities/change-set.ts +11 -3
- package/src/op/activities/lexicon-upgrade.test.ts +2 -0
- package/src/op/activities/reconcile.test.ts +62 -2
- package/src/op/activities/reconcile.ts +46 -22
- package/src/op/builders.ts +1 -1
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-run.ts +4 -3
- package/src/op/op-waves.test.ts +2 -0
- package/src/op/work-lease-run.test.ts +12 -4
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/__fixtures__/contract-repo.ts +17 -1
- package/src/workspace/__fixtures__/sessions.ts +3 -3
- package/src/workspace/change-set.schema.json +5 -3
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/ci-green-workflow.test.ts +4 -4
- package/src/workspace/ci-green-workflow.ts +5 -2
- package/src/workspace/class-data.test.ts +64 -0
- package/src/workspace/class-data.ts +236 -0
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/kinds.ts +7 -36
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +12 -95
- package/src/workspace/records-formats.test.ts +7 -2
- package/src/workspace/records-sessions-write.test.ts +3 -3
- package/src/workspace/status-contract.e2e.test.ts +37 -0
- package/src/workspace/status-contract.test.ts +23 -21
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How far behind an emulator's pinned image is (#1345, generalizing #808 T2).
|
|
3
|
+
*
|
|
4
|
+
* This began as `lexicons/fly/src/emulator-freshness.ts`, checking fly's two
|
|
5
|
+
* pins against their GitHub releases. The other three emulators — Floci for aws,
|
|
6
|
+
* floci-az, floci-gcp — ran `:latest`, so there was nothing to be behind and
|
|
7
|
+
* nothing to check: an image could change underneath a passing local test suite
|
|
8
|
+
* with no record in the repo of what moved.
|
|
9
|
+
*
|
|
10
|
+
* With the pin and its upstream declared on {@link EmulatorSpec}, the check
|
|
11
|
+
* covers every emulator any lexicon ships, and a new one is included by
|
|
12
|
+
* declaring `upstream` rather than by editing a list here.
|
|
13
|
+
*
|
|
14
|
+
* Advisory, never gating. Per the bump policy (#808) a pin moves when a
|
|
15
|
+
* consuming test needs the newer emulator, not because a release happened.
|
|
16
|
+
*/
|
|
17
|
+
/** The version tag of an image ref (`ghcr.io/x/mudflaps:0.3.1` → `0.3.1`). */
|
|
18
|
+
export function parseVersion(image) {
|
|
19
|
+
const lastColon = image.lastIndexOf(":");
|
|
20
|
+
const lastSlash = image.lastIndexOf("/");
|
|
21
|
+
// A registry port (`localhost:5000/x`) is not a tag.
|
|
22
|
+
if (lastColon < 0 || lastColon < lastSlash)
|
|
23
|
+
return "";
|
|
24
|
+
return image.slice(lastColon + 1).replace(/^v/, "");
|
|
25
|
+
}
|
|
26
|
+
function toParts(version) {
|
|
27
|
+
return version.replace(/^v/, "").split(".").map((n) => parseInt(n, 10) || 0);
|
|
28
|
+
}
|
|
29
|
+
/** Compare pinned against latest as dotted numeric versions. */
|
|
30
|
+
export function compare(name, pinned, latest) {
|
|
31
|
+
const p = toParts(pinned);
|
|
32
|
+
const l = toParts(latest);
|
|
33
|
+
let behind = false;
|
|
34
|
+
for (let i = 0; i < Math.max(p.length, l.length); i++) {
|
|
35
|
+
const a = p[i] ?? 0;
|
|
36
|
+
const b = l[i] ?? 0;
|
|
37
|
+
if (b > a) {
|
|
38
|
+
behind = true;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
if (b < a)
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
return { name, pinned: pinned.replace(/^v/, ""), latest: latest.replace(/^v/, ""), behind };
|
|
45
|
+
}
|
|
46
|
+
/** The latest release tag for a repo, via the GitHub REST API. */
|
|
47
|
+
export async function latestRelease(repo, fetchImpl = fetch) {
|
|
48
|
+
const headers = { Accept: "application/vnd.github+json" };
|
|
49
|
+
if (process.env.GITHUB_TOKEN)
|
|
50
|
+
headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
|
|
51
|
+
const res = await fetchImpl(`https://api.github.com/repos/${repo}/releases/latest`, { headers });
|
|
52
|
+
if (!res.ok)
|
|
53
|
+
throw new Error(`releases/latest ${repo}: HTTP ${res.status}`);
|
|
54
|
+
const body = (await res.json());
|
|
55
|
+
if (!body.tag_name)
|
|
56
|
+
throw new Error(`releases/latest ${repo}: no tag_name`);
|
|
57
|
+
return body.tag_name;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check every spec that declares an upstream. A spec without one is skipped
|
|
61
|
+
* rather than reported — an emulator built from a local image has no release
|
|
62
|
+
* feed to be behind.
|
|
63
|
+
*/
|
|
64
|
+
export async function checkFreshness(specs, fetchImpl = fetch) {
|
|
65
|
+
const pinned = specs.filter((s) => s.upstream?.repo && parseVersion(s.image));
|
|
66
|
+
return Promise.all(pinned.map(async (s) => compare(s.name, parseVersion(s.image), await latestRelease(s.upstream.repo, fetchImpl))));
|
|
67
|
+
}
|
|
68
|
+
/** One-line human summary of a result. */
|
|
69
|
+
export function formatResult(r) {
|
|
70
|
+
return r.behind
|
|
71
|
+
? `⚠ ${r.name}: pinned ${r.pinned}, latest ${r.latest} — behind`
|
|
72
|
+
: `✓ ${r.name}: pinned ${r.pinned} is current (latest ${r.latest})`;
|
|
73
|
+
}
|
|
74
|
+
/** Emulator images that carry no version tag — `:latest` or none at all. */
|
|
75
|
+
export function unpinned(specs) {
|
|
76
|
+
return specs.filter((s) => {
|
|
77
|
+
const version = parseVersion(s.image);
|
|
78
|
+
return version === "" || version === "latest";
|
|
79
|
+
});
|
|
80
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { exec, execFile } from "node:child_process";
|
|
2
|
+
import { connect } from "node:net";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { sleep } from "./activity-runtime.js";
|
|
5
|
+
const execAsync = promisify(exec);
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
/**
|
|
8
|
+
* True when something accepts TCP connections on 127.0.0.1:`port` (#3673).
|
|
9
|
+
* `up` asks before `docker run`: a native server there would take every
|
|
10
|
+
* `localhost` connection meant for the emulator.
|
|
11
|
+
*/
|
|
12
|
+
export function hostPortInUse(port, timeoutMs = 1000) {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
const socket = connect({ host: "127.0.0.1", port });
|
|
15
|
+
const done = (inUse) => {
|
|
16
|
+
socket.destroy();
|
|
17
|
+
resolve(inUse);
|
|
18
|
+
};
|
|
19
|
+
socket.setTimeout(timeoutMs, () => done(false));
|
|
20
|
+
socket.once("connect", () => done(true));
|
|
21
|
+
socket.once("error", () => done(false));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse `docker port <name> <port>/tcp` output (`0.0.0.0:5432`, `[::]:5432`,
|
|
26
|
+
* one per line). Lines that do not parse are dropped.
|
|
27
|
+
*/
|
|
28
|
+
export function parsePublishedAddresses(stdout) {
|
|
29
|
+
const out = [];
|
|
30
|
+
for (const line of stdout.split("\n")) {
|
|
31
|
+
const match = /^\s*(?:\[([^\]]+)\]|([^\s:]+)):(\d+)\s*$/.exec(line);
|
|
32
|
+
if (match)
|
|
33
|
+
out.push({ ip: (match[1] ?? match[2]), port: Number(match[3]) });
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The hosts a client on this machine dials to reach a published address,
|
|
39
|
+
* `localhost` first: a wildcard bind (`0.0.0.0`, `::`) answers on the
|
|
40
|
+
* loopback of its family, and a specific IP only on itself.
|
|
41
|
+
*/
|
|
42
|
+
export function clientHosts(addresses) {
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
const hosts = [];
|
|
45
|
+
const add = (host, port) => {
|
|
46
|
+
const key = `${host}:${port}`;
|
|
47
|
+
if (seen.has(key))
|
|
48
|
+
return;
|
|
49
|
+
seen.add(key);
|
|
50
|
+
hosts.push({ host, port });
|
|
51
|
+
};
|
|
52
|
+
for (const { ip, port } of addresses) {
|
|
53
|
+
if (ip === "0.0.0.0" || ip === "127.0.0.1")
|
|
54
|
+
add("localhost", port);
|
|
55
|
+
}
|
|
56
|
+
for (const { ip, port } of addresses) {
|
|
57
|
+
if (ip === "::" || ip === "::1")
|
|
58
|
+
add("[::1]", port);
|
|
59
|
+
else if (ip !== "0.0.0.0" && ip !== "127.0.0.1")
|
|
60
|
+
add(ip.includes(":") ? `[${ip}]` : ip, port);
|
|
61
|
+
}
|
|
62
|
+
return hosts;
|
|
63
|
+
}
|
|
64
|
+
/** `endpoint` with its host replaced by `host` (`localhost` stays as written). */
|
|
65
|
+
export function endpointOnHost(endpoint, host) {
|
|
66
|
+
if (host === "localhost")
|
|
67
|
+
return endpoint;
|
|
68
|
+
const url = new URL(endpoint);
|
|
69
|
+
url.hostname = host;
|
|
70
|
+
return url.toString().replace(/\/$/, endpoint.endsWith("/") ? "/" : "");
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Pick the endpoint of a reused container that reaches it (the identity read
|
|
74
|
+
* inside the container matches the one read through the endpoint), trying
|
|
75
|
+
* {@link clientHosts} in order. `notes` says when `localhost` reaches another
|
|
76
|
+
* server and a different address had to be used; `error` says when none of
|
|
77
|
+
* them reaches the emulator.
|
|
78
|
+
*/
|
|
79
|
+
export async function pickReachableEndpoint(opts) {
|
|
80
|
+
const { name, hosts, identity, inside } = opts;
|
|
81
|
+
const misses = [];
|
|
82
|
+
for (const { host, port } of hosts) {
|
|
83
|
+
const ep = endpointOnHost(opts.endpoint(port), host);
|
|
84
|
+
try {
|
|
85
|
+
const answered = await identity.probe(ep);
|
|
86
|
+
if (answered.id.trim() === inside) {
|
|
87
|
+
const notes = misses.length
|
|
88
|
+
? [`emulator "${name}": ${misses.join("; ")}. The emulator answers on ${ep}; use that address.`]
|
|
89
|
+
: [];
|
|
90
|
+
return { endpoint: ep, notes };
|
|
91
|
+
}
|
|
92
|
+
misses.push(`${host}:${port} reaches another ${identity.server} (${answered.label}), not the emulator`);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
const why = err instanceof Error ? err.message : String(err);
|
|
96
|
+
misses.push(`${host}:${port} does not answer as the emulator (${why})`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const tried = misses.length ? `: ${misses.join("; ")}` : "";
|
|
100
|
+
return { error: `emulator "${name}" runs, but no address it publishes reaches it${tried}. ${opts.hint}` };
|
|
101
|
+
}
|
|
102
|
+
/** Every emulator a plugin declares, normalized to a list. */
|
|
103
|
+
export function emulatorsOf(declaration) {
|
|
104
|
+
if (!declaration)
|
|
105
|
+
return [];
|
|
106
|
+
return Array.isArray(declaration) ? declaration : [declaration];
|
|
107
|
+
}
|
|
108
|
+
/** Sentinel that cannot collide with a real endpoint or a credential value. */
|
|
109
|
+
const ENDPOINT_PROBE = "chant-endpoint-probe://0";
|
|
110
|
+
/**
|
|
111
|
+
* The env vars whose value *is* the endpoint, as opposed to the credentials and
|
|
112
|
+
* region an emulator also needs (#1345).
|
|
113
|
+
*
|
|
114
|
+
* Derived by asking `env()` for a sentinel and keeping the keys that carry it,
|
|
115
|
+
* so a lexicon states the mapping once in the place it already states it. The
|
|
116
|
+
* alternative — `LEXICON_ENDPOINT_ENV_VAR`, a hand-maintained map in core — held
|
|
117
|
+
* two of the four lexicons that have one, and its module doc asserted azure had
|
|
118
|
+
* none while `describe-resources.ts` read `AZURE_ENDPOINT_URL` on every call.
|
|
119
|
+
*/
|
|
120
|
+
export function endpointEnvVars(capability) {
|
|
121
|
+
return Object.entries(capability.env(ENDPOINT_PROBE))
|
|
122
|
+
.filter(([, value]) => value === ENDPOINT_PROBE)
|
|
123
|
+
.map(([key]) => key);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Build a Docker-lifecycle for a local emulator: an idempotent `up` (reuse a
|
|
127
|
+
* running container, else `docker run`, then poll health until ready), a `down`
|
|
128
|
+
* (`docker rm -f`), and the pure command builders each per-cloud wrapper exposes
|
|
129
|
+
* for testing. Removes the near-duplication across the per-lexicon `floci*.ts`
|
|
130
|
+
* wrappers — a new cloud is a spec, not a copy.
|
|
131
|
+
*/
|
|
132
|
+
export function emulatorLifecycle(spec) {
|
|
133
|
+
const ready = spec.ready ?? (() => true);
|
|
134
|
+
if (spec.healthPath === undefined && !spec.readyCommand?.length) {
|
|
135
|
+
throw new Error(`emulator "${spec.name}" declares neither a healthPath nor a readyCommand, so nothing can tell when it is ready`);
|
|
136
|
+
}
|
|
137
|
+
const runCommand = (args = {}) => {
|
|
138
|
+
const name = args.name ?? spec.name;
|
|
139
|
+
const port = args.port ?? spec.containerPort;
|
|
140
|
+
const image = args.image ?? spec.image;
|
|
141
|
+
return [
|
|
142
|
+
"docker", "run", "-d", "--rm", "--name", name, "-p", `${port}:${spec.containerPort}`,
|
|
143
|
+
...(spec.runArgs ?? []), ...(args.extraArgs ?? []), image,
|
|
144
|
+
].join(" ");
|
|
145
|
+
};
|
|
146
|
+
const existsCommand = (name) => `docker ps -q -f name=${name}`;
|
|
147
|
+
const rmCommand = (name) => `docker rm -f ${name}`;
|
|
148
|
+
const healthUrl = (port) => `http://localhost:${port}${spec.healthPath ?? ""}`;
|
|
149
|
+
const endpoint = (port) => (spec.endpoint ? spec.endpoint(port) : `http://localhost:${port}`);
|
|
150
|
+
const readyExecCommand = (name) => spec.readyCommand?.length ? ["docker", "exec", name, ...spec.readyCommand].join(" ") : undefined;
|
|
151
|
+
/** One readiness probe: the in-container command when declared, else the HTTP health path. */
|
|
152
|
+
async function probe(name, port, signal, host = "localhost") {
|
|
153
|
+
const command = readyExecCommand(name);
|
|
154
|
+
if (command) {
|
|
155
|
+
try {
|
|
156
|
+
await execAsync(command, { signal });
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const res = await fetch(endpointOnHost(healthUrl(port), host), { signal });
|
|
165
|
+
return res.ok && ready(await res.text());
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Not up yet (connection refused / non-2xx) — retry.
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function up(args = {}, signal) {
|
|
173
|
+
const name = args.name ?? spec.name;
|
|
174
|
+
const port = args.port ?? spec.containerPort;
|
|
175
|
+
const timeoutMs = args.timeoutMs ?? 60000;
|
|
176
|
+
const intervalMs = args.intervalMs ?? 2000;
|
|
177
|
+
let running = false;
|
|
178
|
+
try {
|
|
179
|
+
const { stdout } = await execAsync(existsCommand(name), { signal });
|
|
180
|
+
running = Boolean(stdout.trim());
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// `docker ps` failed — assume not running and try to start it.
|
|
184
|
+
}
|
|
185
|
+
// A reused container publishes what it was started with, which need not
|
|
186
|
+
// be `port` on localhost: read it from Docker rather than assume it.
|
|
187
|
+
let hosts = [{ host: "localhost", port }];
|
|
188
|
+
if (running) {
|
|
189
|
+
// Progress → stderr, so a `--json` consumer (chant emulator, behold) reads
|
|
190
|
+
// clean JSON on stdout. runOp/Op activities capture both streams regardless.
|
|
191
|
+
console.error(`emulator container "${name}" already running — reusing`);
|
|
192
|
+
let published = [];
|
|
193
|
+
try {
|
|
194
|
+
const { stdout } = await execFileAsync("docker", ["port", name, `${spec.containerPort}/tcp`], { signal });
|
|
195
|
+
published = parsePublishedAddresses(stdout);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// `docker port` fails when nothing is published.
|
|
199
|
+
}
|
|
200
|
+
if (published.length === 0) {
|
|
201
|
+
throw new Error(`emulator "${name}" runs, but publishes no host port for ${spec.containerPort}, so nothing on this machine reaches it. ` +
|
|
202
|
+
`Run \`chant emulator down\`, then \`chant emulator up\`.`);
|
|
203
|
+
}
|
|
204
|
+
hosts = clientHosts(published);
|
|
205
|
+
if (args.port !== undefined && !hosts.some((h) => h.port === args.port)) {
|
|
206
|
+
console.error(`emulator "${name}" was started on host port ${hosts[0].port}, not ${args.port}; reusing it there. ` +
|
|
207
|
+
`Run \`chant emulator down\` first to move it.`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
if (await hostPortInUse(port)) {
|
|
212
|
+
throw new Error(`emulator "${name}": 127.0.0.1:${port} is already held by another process, so localhost:${port} would not reach the emulator. ` +
|
|
213
|
+
`Stop that process, or publish the emulator on another port (chant emulator up --port ${spec.containerPort}=<free port>).`);
|
|
214
|
+
}
|
|
215
|
+
await execAsync(runCommand({ ...args, name, port }), { signal });
|
|
216
|
+
}
|
|
217
|
+
const deadline = Date.now() + timeoutMs;
|
|
218
|
+
let ok = false;
|
|
219
|
+
while (Date.now() < deadline) {
|
|
220
|
+
if (signal?.aborted)
|
|
221
|
+
throw new Error(`emulator "${name}" wait aborted`);
|
|
222
|
+
for (const h of hosts) {
|
|
223
|
+
if (await probe(name, h.port, signal, h.host)) {
|
|
224
|
+
ok = true;
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (ok)
|
|
229
|
+
break;
|
|
230
|
+
await sleep(intervalMs, signal);
|
|
231
|
+
}
|
|
232
|
+
if (!ok) {
|
|
233
|
+
throw new Error(`emulator "${name}" did not become ready within ${timeoutMs}ms`);
|
|
234
|
+
}
|
|
235
|
+
let ep = endpointOnHost(endpoint(hosts[0].port), hosts[0].host);
|
|
236
|
+
if (running && spec.identity) {
|
|
237
|
+
let inside;
|
|
238
|
+
try {
|
|
239
|
+
inside = (await execFileAsync("docker", ["exec", name, ...spec.identity.command], { signal })).stdout.trim();
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// The container cannot answer for itself; nothing to compare against.
|
|
243
|
+
}
|
|
244
|
+
if (inside) {
|
|
245
|
+
const picked = await pickReachableEndpoint({
|
|
246
|
+
name, hosts, endpoint, identity: spec.identity, inside,
|
|
247
|
+
hint: `Stop the other server, or run \`chant emulator down\`, then \`chant emulator up --port ${spec.containerPort}=<free port>\`.`,
|
|
248
|
+
});
|
|
249
|
+
if ("error" in picked)
|
|
250
|
+
throw new Error(picked.error);
|
|
251
|
+
for (const note of picked.notes)
|
|
252
|
+
console.error(note);
|
|
253
|
+
ep = picked.endpoint;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
console.error(`emulator "${name}" ready on ${ep}`);
|
|
257
|
+
return { endpoint: ep };
|
|
258
|
+
}
|
|
259
|
+
async function down(args = {}, signal) {
|
|
260
|
+
const name = args.name ?? spec.name;
|
|
261
|
+
try {
|
|
262
|
+
await execAsync(rmCommand(name), { signal });
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
// Already removed (`--rm` on exit, or never started) — treat as success.
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return { runCommand, existsCommand, rmCommand, healthUrl, readyExecCommand, endpoint, up, down };
|
|
269
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The factory reference Op (#3406, ws-087): the factory's rules declared in
|
|
3
|
+
* core, and an orchestrator's execution plugged in through hooks.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* // ops/factory.op.ts
|
|
7
|
+
* export default factoryOp({
|
|
8
|
+
* builder: "node box/ops/factory/builder.mjs",
|
|
9
|
+
* });
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* One run is one build of one work item, under that item's lease, in a
|
|
13
|
+
* worktree on `chant/work/<item>`:
|
|
14
|
+
*
|
|
15
|
+
* Pick factoryPick: the buildable items, in order; the lease claims the first nobody holds
|
|
16
|
+
* Ask factoryAsk: the tier (the item's own, or the slice-tier point) and, for an ask, the
|
|
17
|
+
* understand point; an open question stops the run waiting
|
|
18
|
+
* Build factoryBuild: the `builder` hook, unless understand said not to build
|
|
19
|
+
* Check factoryCheck: the `check` hook, or the box's `factory.check`, with its evidence
|
|
20
|
+
* Record factoryRecord: done, dropped, redraft, ask or not_done, which the lease's release
|
|
21
|
+
* takes; a not_done attempt is kept at refs/chant/kept/<item>/<token> by the run
|
|
22
|
+
*
|
|
23
|
+
* The hooks are commands, run with no shell in the worktree:
|
|
24
|
+
*
|
|
25
|
+
* - `builder` (required): how a builder runs, such as Claude Code in the box
|
|
26
|
+
* or a `fountainRun` wrapper. It gets FACTORY_ITEM, FACTORY_TIER,
|
|
27
|
+
* FACTORY_TOKEN, FACTORY_HOLDER, FACTORY_WORKTREE and FACTORY_CONTEXT, edits
|
|
28
|
+
* the worktree, and exits 0 when it finished. It may print a last JSON line
|
|
29
|
+
* `{ "reverted": [paths] }` when its guard put changes back.
|
|
30
|
+
* - `context` (optional): passed to the builder as FACTORY_CONTEXT, the prompt
|
|
31
|
+
* and context bundle the orchestrator assembles.
|
|
32
|
+
* - `check` (optional): the verdict command; the box block's `factory.check`
|
|
33
|
+
* when left out. An infra profile names a plan or `chant lint` here.
|
|
34
|
+
*
|
|
35
|
+
* Publishing a done item is the box's publisher (ws-088), run later by a
|
|
36
|
+
* person or a surface with `chant workspace box publish`; it is not a step.
|
|
37
|
+
*/
|
|
38
|
+
import { Op, phase, activity, shell } from "./builders.js";
|
|
39
|
+
import { stepOutput } from "./step-output-ref.js";
|
|
40
|
+
import { workLeaseOutput } from "./work-lease-run.js";
|
|
41
|
+
/** The Op's configuration, for a steward that lists it or a test that runs it. */
|
|
42
|
+
export function factoryOpConfig(options) {
|
|
43
|
+
if (!options || typeof options.builder !== "string" || options.builder.trim() === "") {
|
|
44
|
+
throw new Error("factoryOp needs a builder: the command that runs a builder in the run's worktree");
|
|
45
|
+
}
|
|
46
|
+
const lease = workLeaseOutput();
|
|
47
|
+
const kind = options.kind !== undefined ? { kind: options.kind } : {};
|
|
48
|
+
const at = options.cwd !== undefined ? { cwd: options.cwd } : {};
|
|
49
|
+
return {
|
|
50
|
+
name: options.name ?? "factory",
|
|
51
|
+
overview: "Build the next buildable work item under its lease: pick, ask, build, check and record, by the factory's rules (#3406, ws-087)",
|
|
52
|
+
workLease: {
|
|
53
|
+
item: stepOutput("pick", "candidates"),
|
|
54
|
+
outcome: stepOutput("record", "outcome"),
|
|
55
|
+
...kind,
|
|
56
|
+
...(options.ttl !== undefined ? { ttl: options.ttl } : {}),
|
|
57
|
+
},
|
|
58
|
+
changesCheckout: true,
|
|
59
|
+
...(options.schedule ? { schedule: options.schedule } : {}),
|
|
60
|
+
phases: [
|
|
61
|
+
...(options.prepare !== undefined ? [phase("Prepare", [shell(options.prepare, { ...(options.cwd !== undefined ? { cwd: options.cwd } : {}), id: "prepare" })])] : []),
|
|
62
|
+
phase("Pick", [activity("factoryPick", { ...kind, ...at }, { profile: "fastIdempotent", id: "pick" })]),
|
|
63
|
+
phase("Ask", [activity("factoryAsk", { lease, ...kind, ...at, ...(options.backends ? { backends: options.backends } : {}) }, { profile: "fastIdempotent", id: "ask" })]),
|
|
64
|
+
phase("Build", [
|
|
65
|
+
activity("factoryBuild", { lease, ...at, ask: stepOutput("ask"), builder: options.builder, ...(options.context !== undefined ? { context: options.context } : {}) }, { profile: "atMostOnce", id: "build", timeout: options.buildTimeout ?? "2h" }),
|
|
66
|
+
]),
|
|
67
|
+
phase("Check", [activity("factoryCheck", { lease, ...at, build: stepOutput("build"), ...(options.check !== undefined ? { check: options.check } : {}) }, { profile: "atMostOnce", id: "check" })]),
|
|
68
|
+
phase("Record", [activity("factoryRecord", { lease, ...at, ask: stepOutput("ask"), build: stepOutput("build"), check: stepOutput("check"), ...(options.after !== undefined ? { after: options.after } : {}) }, { profile: "atMostOnce", id: "record" })]),
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** The factory reference Op, as an `*.op.ts` file exports it. */
|
|
73
|
+
export function factoryOp(options) {
|
|
74
|
+
return Op(factoryOpConfig(options));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The steward's ready step for the factory Op (#382): the keys of the work buildable now, for
|
|
78
|
+
* `declareSteward({ beside: [{ op: factory, ready: factoryReady({ cwd }) }] })`. `also` names a
|
|
79
|
+
* command printing a JSON list of more keys, for work the pick can't see yet.
|
|
80
|
+
*/
|
|
81
|
+
export function factoryReady(options = {}) {
|
|
82
|
+
return activity("factoryReady", { ...options }, { profile: "fastIdempotent" });
|
|
83
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate approval policy as data (#2508).
|
|
3
|
+
*
|
|
4
|
+
* A gate used to pass on one recorded approval. This module lets a gate say
|
|
5
|
+
* more than that, as data that survives into the build output:
|
|
6
|
+
*
|
|
7
|
+
* - `quorum`: how many distinct human approvers the gate needs, and
|
|
8
|
+
* optionally which roles count toward it.
|
|
9
|
+
* - `policy`: a policy set a lexicon rendered (the cedar lexicon's
|
|
10
|
+
* `gatePolicy()`), evaluated for each approval as a `PassGate` request.
|
|
11
|
+
* - `mode`: `"log-only"` records the policy's decision next to the approval
|
|
12
|
+
* and lets only the quorum bind. `"enforce"` lets a permit pass the gate on
|
|
13
|
+
* its own, which is how an agent principal passes a low-risk plan.
|
|
14
|
+
* - `context`: plan attributes handed to the policy (risk labels, changed
|
|
15
|
+
* paths), resolved at run time like a gate's `plan`. A gate whose `plan`
|
|
16
|
+
* names a step that returned a change set also gets `context.plan`, that
|
|
17
|
+
* change set's summary (#3182, `./gate-plan-context.ts`).
|
|
18
|
+
*
|
|
19
|
+
* Core does not know Cedar. A {@link GatePolicyRef} names the lexicon that
|
|
20
|
+
* made it, and {@link loadGatePolicyEvaluator} imports that lexicon's
|
|
21
|
+
* `gate-policy` module by the same `@intentius/chant-lexicon-<name>/...`
|
|
22
|
+
* convention the activity registry uses (`./activity-registry.ts`).
|
|
23
|
+
*
|
|
24
|
+
* The policy is evaluated when an approval is recorded (`chant approve`),
|
|
25
|
+
* because that is the moment the approver is known. The decision is written
|
|
26
|
+
* on the resolution with the policy's version, and a run counts a recorded
|
|
27
|
+
* permit only while the gate still declares that same version. Editing the
|
|
28
|
+
* policy invalidates every permit recorded under the old one, the way a new
|
|
29
|
+
* plan invalidates every approval recorded for the old plan (#2300). The
|
|
30
|
+
* decision also records the digest of the context it was asked about, and a
|
|
31
|
+
* permit counts only while the run resolves that same context (#3774).
|
|
32
|
+
*
|
|
33
|
+
* The trust boundary is unchanged from `../lifecycle/gate-ledger.ts`: a
|
|
34
|
+
* resolution is a local fact, not a signed one, and roles on it are what the
|
|
35
|
+
* approver claimed.
|
|
36
|
+
*/
|
|
37
|
+
import { createHash } from "node:crypto";
|
|
38
|
+
import { lexiconModulePath, importLexiconPackage } from "../lexicon-module.js";
|
|
39
|
+
import { isStepOutputRef } from "./step-output-ref.js";
|
|
40
|
+
import { GATE_PLAN_CONTEXT_KEY } from "./gate-plan-context.js";
|
|
41
|
+
export const GATE_APPROVAL_MODES = ["log-only", "enforce"];
|
|
42
|
+
/** The version of a gate policy: `sha256:` and the hex digest of its text. A lexicon's helper stamps it, and OPS015 checks it still matches. */
|
|
43
|
+
export function gatePolicyVersion(text) {
|
|
44
|
+
return `sha256:${createHash("sha256").update(text).digest("hex")}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The digest of a gate's resolved approval context (#3774): `sha256:` and the
|
|
48
|
+
* hex digest of its JSON with keys sorted at every level. No context and an
|
|
49
|
+
* empty one digest the same.
|
|
50
|
+
*/
|
|
51
|
+
export function gateContextDigest(context) {
|
|
52
|
+
return `sha256:${createHash("sha256").update(JSON.stringify(context ?? {}, sortedKeys)).digest("hex")}`;
|
|
53
|
+
}
|
|
54
|
+
function sortedKeys(_key, value) {
|
|
55
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
56
|
+
return Object.fromEntries(Object.entries(value).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
export function isGatePolicyRef(value) {
|
|
61
|
+
if (typeof value !== "object" || value === null)
|
|
62
|
+
return false;
|
|
63
|
+
const v = value;
|
|
64
|
+
return (v.kind === "gate-policy" &&
|
|
65
|
+
typeof v.lexicon === "string" && v.lexicon !== "" &&
|
|
66
|
+
typeof v.name === "string" && v.name !== "" &&
|
|
67
|
+
typeof v.version === "string" && v.version !== "" &&
|
|
68
|
+
typeof v.text === "string" && v.text.trim() !== "");
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Everything wrong with an `approval` block, one line each. The `gate()`
|
|
72
|
+
* builder throws on the first; OPS015 reports all of them over the build
|
|
73
|
+
* output, where a block could have been written without the builder.
|
|
74
|
+
*/
|
|
75
|
+
export function gateApprovalProblems(approval) {
|
|
76
|
+
if (typeof approval !== "object" || approval === null || Array.isArray(approval)) {
|
|
77
|
+
return ["`approval` must be an object"];
|
|
78
|
+
}
|
|
79
|
+
const a = approval;
|
|
80
|
+
const problems = [];
|
|
81
|
+
if (a.quorum !== undefined) {
|
|
82
|
+
const q = a.quorum;
|
|
83
|
+
if (typeof q !== "object" || q === null) {
|
|
84
|
+
problems.push("`approval.quorum` must be an object");
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
if (typeof q.count !== "number" || !Number.isInteger(q.count) || q.count < 1) {
|
|
88
|
+
problems.push("`approval.quorum.count` must be an integer of at least 1");
|
|
89
|
+
}
|
|
90
|
+
if (q.roles !== undefined) {
|
|
91
|
+
if (!Array.isArray(q.roles) || q.roles.length === 0 || q.roles.some((r) => typeof r !== "string" || r === "")) {
|
|
92
|
+
problems.push("`approval.quorum.roles` must be a non-empty list of role names");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (a.policy !== undefined) {
|
|
98
|
+
if (!isGatePolicyRef(a.policy)) {
|
|
99
|
+
problems.push("`approval.policy` does not resolve to a gate policy set. Build it with the lexicon's helper, " +
|
|
100
|
+
"for example `gatePolicy(\"ship\", policies)` from @intentius/chant-lexicon-cedar");
|
|
101
|
+
}
|
|
102
|
+
else if (a.policy.version !== gatePolicyVersion(a.policy.text)) {
|
|
103
|
+
problems.push(`\`approval.policy\` "${a.policy.name}" has a version that is not the digest of its text, ` +
|
|
104
|
+
"so a recorded decision could not be traced to the rule that made it");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (a.mode !== undefined && !GATE_APPROVAL_MODES.includes(a.mode)) {
|
|
108
|
+
problems.push(`\`approval.mode\` must be one of ${GATE_APPROVAL_MODES.map((m) => `"${m}"`).join(", ")}`);
|
|
109
|
+
}
|
|
110
|
+
if (a.mode === "enforce" && a.policy === undefined) {
|
|
111
|
+
problems.push("`approval.mode: \"enforce\"` needs an `approval.policy` to enforce");
|
|
112
|
+
}
|
|
113
|
+
if (a.context !== undefined) {
|
|
114
|
+
if (typeof a.context !== "object" || a.context === null || Array.isArray(a.context)) {
|
|
115
|
+
problems.push("`approval.context` must be an object of plan attributes");
|
|
116
|
+
}
|
|
117
|
+
else if (a.policy === undefined) {
|
|
118
|
+
problems.push("`approval.context` is only read by a policy, and this gate declares none");
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
for (const [key, value] of Object.entries(a.context)) {
|
|
122
|
+
if (key === GATE_PLAN_CONTEXT_KEY) {
|
|
123
|
+
problems.push(`\`approval.context.${key}\` is reserved: the run fills it with the plan's change-set summary (#3182) ` +
|
|
124
|
+
"when the gate's `plan` names the step that planned it");
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!isContextValue(value)) {
|
|
128
|
+
problems.push(`\`approval.context.${key}\` must be a string, number, boolean, list of strings, or a step output reference`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return problems;
|
|
134
|
+
}
|
|
135
|
+
function isContextValue(value) {
|
|
136
|
+
if (typeof value === "string" || typeof value === "boolean")
|
|
137
|
+
return true;
|
|
138
|
+
if (typeof value === "number")
|
|
139
|
+
return Number.isFinite(value);
|
|
140
|
+
if (Array.isArray(value))
|
|
141
|
+
return value.every((v) => typeof v === "string");
|
|
142
|
+
return isStepOutputRef(value);
|
|
143
|
+
}
|
|
144
|
+
/** Import `lexicon`'s evaluator. Throws a message that names the package when it is not installed or exports none. */
|
|
145
|
+
export async function loadGatePolicyEvaluator(lexicon) {
|
|
146
|
+
// chant #2520 — a lexicon declared by module path exports its evaluator from that module.
|
|
147
|
+
const spec = lexiconModulePath(lexicon) ?? `@intentius/chant-lexicon-${lexicon}/gate-policy`;
|
|
148
|
+
let mod;
|
|
149
|
+
try {
|
|
150
|
+
mod = (await importLexiconPackage(spec));
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
throw new Error(`the gate's policy is evaluated by ${spec}, which could not be loaded: ` +
|
|
154
|
+
(err instanceof Error ? err.message : String(err)));
|
|
155
|
+
}
|
|
156
|
+
if (typeof mod.evaluateGatePolicy !== "function") {
|
|
157
|
+
throw new Error(`${spec} exports no evaluateGatePolicy function`);
|
|
158
|
+
}
|
|
159
|
+
return mod;
|
|
160
|
+
}
|
|
161
|
+
/** The request a policy is asked about one approval. */
|
|
162
|
+
export function gatePolicyRequest(input) {
|
|
163
|
+
return {
|
|
164
|
+
principal: { kind: input.approver.kind, name: input.resolvedBy, roles: input.approver.roles ?? [] },
|
|
165
|
+
action: "PassGate",
|
|
166
|
+
resource: { op: input.op, gate: input.gate },
|
|
167
|
+
context: {
|
|
168
|
+
...(input.context ?? {}),
|
|
169
|
+
...(input.planDigest !== undefined ? { planDigest: input.planDigest } : {}),
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|