@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,172 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://intentius.io/chant/schemas/workspace/write-lock/v1/write-lock.schema.json",
|
|
4
|
+
"title": "chant workspace lock output",
|
|
5
|
+
"description": "What `chant workspace lock [acquire --holder <name> [--ttl <duration>] | release --token <token>]` prints (#3173, ws-089): who holds the working tree's write lock, the token of a batch that took it, or the reason the command did nothing. Every chant write to the working tree (records new, amend, review and close, points ask and answer, box listing set) holds this lock from its first read to its last write. A batch holds it across chant calls: each call runs with CHANT_WRITE_LOCK=<token> and goes ahead without waiting while the token holds it. Readers ignore fields they do not know; a field is only ever added within a version. The error codes are a closed list, each in the one closed list of `reason-codes.ts`.",
|
|
6
|
+
"oneOf": [
|
|
7
|
+
{
|
|
8
|
+
"$ref": "#/$defs/result"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"$ref": "#/$defs/failure"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"$defs": {
|
|
15
|
+
"result": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"description": "Exit code 0.",
|
|
18
|
+
"required": [
|
|
19
|
+
"$schema",
|
|
20
|
+
"contract",
|
|
21
|
+
"chant",
|
|
22
|
+
"verb",
|
|
23
|
+
"path",
|
|
24
|
+
"holder"
|
|
25
|
+
],
|
|
26
|
+
"properties": {
|
|
27
|
+
"$schema": {
|
|
28
|
+
"const": "https://intentius.io/chant/schemas/workspace/write-lock/v1/write-lock.schema.json"
|
|
29
|
+
},
|
|
30
|
+
"contract": {
|
|
31
|
+
"const": 1
|
|
32
|
+
},
|
|
33
|
+
"chant": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"description": "The chant version that printed it."
|
|
36
|
+
},
|
|
37
|
+
"verb": {
|
|
38
|
+
"enum": [
|
|
39
|
+
"status",
|
|
40
|
+
"acquire",
|
|
41
|
+
"release"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"path": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"description": "The lock directory: chant-write.lock in the working tree's git directory, or a directory under the system's temporary directory outside git."
|
|
47
|
+
},
|
|
48
|
+
"holder": {
|
|
49
|
+
"$ref": "#/$defs/holder"
|
|
50
|
+
},
|
|
51
|
+
"token": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"pattern": "^[0-9a-f]{32}$",
|
|
54
|
+
"description": "acquire only: the token each write of the batch runs with, as CHANT_WRITE_LOCK, and lock release takes. Never printed by status."
|
|
55
|
+
},
|
|
56
|
+
"error": false
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"failure": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"description": "Nothing was done. Exit code 1.",
|
|
62
|
+
"required": [
|
|
63
|
+
"$schema",
|
|
64
|
+
"contract",
|
|
65
|
+
"chant",
|
|
66
|
+
"verb",
|
|
67
|
+
"error",
|
|
68
|
+
"holder"
|
|
69
|
+
],
|
|
70
|
+
"properties": {
|
|
71
|
+
"$schema": {
|
|
72
|
+
"const": "https://intentius.io/chant/schemas/workspace/write-lock/v1/write-lock.schema.json"
|
|
73
|
+
},
|
|
74
|
+
"contract": {
|
|
75
|
+
"const": 1
|
|
76
|
+
},
|
|
77
|
+
"chant": {
|
|
78
|
+
"type": "string"
|
|
79
|
+
},
|
|
80
|
+
"verb": {
|
|
81
|
+
"enum": [
|
|
82
|
+
"status",
|
|
83
|
+
"acquire",
|
|
84
|
+
"release"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"error": {
|
|
88
|
+
"type": "object",
|
|
89
|
+
"required": [
|
|
90
|
+
"code",
|
|
91
|
+
"message"
|
|
92
|
+
],
|
|
93
|
+
"properties": {
|
|
94
|
+
"code": {
|
|
95
|
+
"enum": [
|
|
96
|
+
"write-usage-invalid",
|
|
97
|
+
"write-lock-timeout",
|
|
98
|
+
"write-lock-not-held"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"message": {
|
|
102
|
+
"type": "string"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"holder": {
|
|
107
|
+
"$ref": "#/$defs/holder"
|
|
108
|
+
},
|
|
109
|
+
"token": false
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"holder": {
|
|
113
|
+
"description": "Who holds the lock: everything owner.json in the lock directory says but the token.",
|
|
114
|
+
"oneOf": [
|
|
115
|
+
{
|
|
116
|
+
"type": "null"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"type": "object",
|
|
120
|
+
"required": [
|
|
121
|
+
"pid",
|
|
122
|
+
"host",
|
|
123
|
+
"verb",
|
|
124
|
+
"by",
|
|
125
|
+
"agent",
|
|
126
|
+
"acquiredAt",
|
|
127
|
+
"expiresAt"
|
|
128
|
+
],
|
|
129
|
+
"properties": {
|
|
130
|
+
"pid": {
|
|
131
|
+
"type": [
|
|
132
|
+
"integer",
|
|
133
|
+
"null"
|
|
134
|
+
],
|
|
135
|
+
"description": "The process holding it, or null for a batch held across chant calls."
|
|
136
|
+
},
|
|
137
|
+
"host": {
|
|
138
|
+
"type": "string",
|
|
139
|
+
"description": "The host the holder runs on."
|
|
140
|
+
},
|
|
141
|
+
"verb": {
|
|
142
|
+
"type": "string",
|
|
143
|
+
"description": "What holds it: a write command, such as records amend, or batch."
|
|
144
|
+
},
|
|
145
|
+
"by": {
|
|
146
|
+
"type": [
|
|
147
|
+
"string",
|
|
148
|
+
"null"
|
|
149
|
+
],
|
|
150
|
+
"description": "Who the write or batch names: --by, or lock acquire's --holder."
|
|
151
|
+
},
|
|
152
|
+
"agent": {
|
|
153
|
+
"type": [
|
|
154
|
+
"string",
|
|
155
|
+
"null"
|
|
156
|
+
],
|
|
157
|
+
"description": "The agent session (CHANT_AGENT), or null."
|
|
158
|
+
},
|
|
159
|
+
"acquiredAt": {
|
|
160
|
+
"type": "string",
|
|
161
|
+
"description": "When it was taken, as an ISO 8601 time."
|
|
162
|
+
},
|
|
163
|
+
"expiresAt": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"description": "When any writer may break it, as an ISO 8601 time."
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write scope per member and record kind, for each principal class, and the
|
|
3
|
+
* agent sessions bound to the members they name (#2524 D5, D20; #2548;
|
|
4
|
+
* ws-067, ws-101).
|
|
5
|
+
*
|
|
6
|
+
* The declaration's `writeScope` block gives a restricted class the members
|
|
7
|
+
* whose files it may write and the record kinds it may write, with which
|
|
8
|
+
* verbs (`new`, `amend`, `review`, `close`). A class with no entry is not
|
|
9
|
+
* restricted. The declaration's `agents` list names agent sessions, each
|
|
10
|
+
* bound to one member or several (ws-101): a session writes the files of any
|
|
11
|
+
* of its members, and the records of kinds any of them or the workspace
|
|
12
|
+
* declares, as `writeScope.agent` allows. The scope is the union of its
|
|
13
|
+
* members, and `writeScope.agent` can't widen it.
|
|
14
|
+
*
|
|
15
|
+
* Two places apply it, both reading the scope from the base revision so a
|
|
16
|
+
* change can't widen its own scope (#2524 threat model):
|
|
17
|
+
*
|
|
18
|
+
* - The write paths: `chant workspace records new|amend|review|close` and the
|
|
19
|
+
* MCP record tools refuse a write outside the writer's scope with
|
|
20
|
+
* `write-scope-member` or `write-scope-kind`, and an unknown session with
|
|
21
|
+
* `agent-unknown`. The session comes from `CHANT_AGENT`.
|
|
22
|
+
* - The enforcement boundary: `chant workspace check --changes <range>`
|
|
23
|
+
* judges every commit in the range, by its `Chant-Agent` trailer, its
|
|
24
|
+
* attested principal, or its author, and reports each path written outside
|
|
25
|
+
* that writer's scope. Run in CI with an attestation policy, the principal
|
|
26
|
+
* is the signer the policy at base trusts; on a developer machine it is
|
|
27
|
+
* detection only (ws-002).
|
|
28
|
+
*
|
|
29
|
+
* A principal's class comes from the role grants in the trust policy at base,
|
|
30
|
+
* through {@link principalClass} alone (the agent, runner and service roles,
|
|
31
|
+
* then the role each domain class a pinned package supplies names, #3080),
|
|
32
|
+
* or from naming an agent session. Claiming a session only ever narrows what
|
|
33
|
+
* a writer may do, so an unverified `CHANT_AGENT` or trailer is safe to honour.
|
|
34
|
+
*
|
|
35
|
+
* A writeScope key no pinned package supplies fails closed: a writer judged
|
|
36
|
+
* `human` might be in that class, so it is refused with
|
|
37
|
+
* `write-scope-class-unknown` until the plugin is installed at the pinned
|
|
38
|
+
* version or the entry is removed.
|
|
39
|
+
*/
|
|
40
|
+
import { execFileSync } from "node:child_process";
|
|
41
|
+
import { posix, relative, sep } from "node:path";
|
|
42
|
+
import { isDeepStrictEqual } from "node:util";
|
|
43
|
+
// @ts-ignore — picomatch has no types declaration
|
|
44
|
+
import picomatch from "picomatch";
|
|
45
|
+
import { readDeclaration, WorkspaceReadError, } from "./declaration.js";
|
|
46
|
+
import { classesOf, coreClassRegistry, loadClassRegistry, principalClass as classOf, roleGrants, unknownScopeClasses, } from "./principal-classes.js";
|
|
47
|
+
import { parseJsonText } from "./jsonc.js";
|
|
48
|
+
import { memberHolding } from "./record-assets.js";
|
|
49
|
+
import { gitRoot } from "./record-source.js";
|
|
50
|
+
import { normalisePrincipal, parseFrontMatter } from "./records.js";
|
|
51
|
+
import { emptyPolicy } from "./trust/policy.js";
|
|
52
|
+
import { commitProvenance, policyAtBase, resolveBase } from "./trust/provenance.js";
|
|
53
|
+
import { AGENT_TRAILER } from "./trailers.js";
|
|
54
|
+
import { locateWorkspace } from "./which-chant.js";
|
|
55
|
+
/** The environment variable naming the agent session a write is made in. */
|
|
56
|
+
export const AGENT_ENV = "CHANT_AGENT";
|
|
57
|
+
/** The commit trailer naming the agent session a commit was made in, one of chant's trailers (`trailers.ts`). */
|
|
58
|
+
export { AGENT_TRAILER };
|
|
59
|
+
/** Why a write is outside its writer's scope. Closed. */
|
|
60
|
+
export const WRITE_SCOPE_CODES = ["write-scope-member", "write-scope-kind", "write-scope-class-unknown", "agent-unknown"];
|
|
61
|
+
/**
|
|
62
|
+
* What `check --changes` reports a path with: the record-write codes, and a
|
|
63
|
+
* write to a protected path (#3146), which a record write never is. Closed.
|
|
64
|
+
*/
|
|
65
|
+
export const SCOPE_FINDING_CODES = [...WRITE_SCOPE_CODES, "write-scope-protected"];
|
|
66
|
+
export { classesOf, roleGrants };
|
|
67
|
+
/**
|
|
68
|
+
* The class a principal is in: the first of agent, runner and service whose
|
|
69
|
+
* role it holds at base, then the first domain class in `classes` whose role
|
|
70
|
+
* it holds (#3080), or human.
|
|
71
|
+
*/
|
|
72
|
+
export function principalClass(policy, principal, classes = coreClassRegistry()) {
|
|
73
|
+
return classOf(policy, principal, classes);
|
|
74
|
+
}
|
|
75
|
+
export class WriteScopeError extends Error {
|
|
76
|
+
constructor(code, message) {
|
|
77
|
+
super(message);
|
|
78
|
+
this.code = code;
|
|
79
|
+
this.name = "WriteScopeError";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The writer: in the session `agent` names (refused with agent-unknown when
|
|
84
|
+
* the declaration declares none by that name), in the session that lists
|
|
85
|
+
* `principal`, or else in the class `principal`'s roles give it.
|
|
86
|
+
*/
|
|
87
|
+
export function resolveWriter(declaration, policy, given, classes = coreClassRegistry()) {
|
|
88
|
+
const principal = given.principal ?? null;
|
|
89
|
+
const agents = declaration?.agents ?? [];
|
|
90
|
+
if (given.agent !== undefined && given.agent !== null) {
|
|
91
|
+
const agent = agents.find((a) => a.name === given.agent);
|
|
92
|
+
if (!agent) {
|
|
93
|
+
const known = agents.map((a) => a.name).join(", ");
|
|
94
|
+
throw new WriteScopeError("agent-unknown", declaration === null
|
|
95
|
+
? `agent session ${JSON.stringify(given.agent)} is not declared: there is no workspace declaration`
|
|
96
|
+
: `agent session ${JSON.stringify(given.agent)} is not declared: the declaration's agents ${known ? `are ${known}` : "list none"}`);
|
|
97
|
+
}
|
|
98
|
+
return { principal, class: "agent", agent };
|
|
99
|
+
}
|
|
100
|
+
if (principal !== null) {
|
|
101
|
+
const name = normalisePrincipal(principal);
|
|
102
|
+
const agent = agents.find((a) => a.principals.some((p) => normalisePrincipal(p) === name));
|
|
103
|
+
if (agent)
|
|
104
|
+
return { principal, class: "agent", agent };
|
|
105
|
+
}
|
|
106
|
+
return { principal, class: principalClass(policy, principal, classes), agent: null };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Refuse `writer` when the declaration's writeScope names a class `classes`
|
|
110
|
+
* doesn't know and the writer is judged human (#3080): nothing says which
|
|
111
|
+
* role puts a principal in the unknown class, so this writer may be in it.
|
|
112
|
+
* A writer in another class is judged by that class, which comes first.
|
|
113
|
+
*/
|
|
114
|
+
export function unknownClassVerdict(declaration, writer, classes) {
|
|
115
|
+
if (writer.class !== "human")
|
|
116
|
+
return OK;
|
|
117
|
+
const unknown = unknownScopeClasses(declaration?.writeScope ?? null, classes);
|
|
118
|
+
if (unknown.length === 0)
|
|
119
|
+
return OK;
|
|
120
|
+
const list = unknown.map((c) => `writeScope.${c}`).join(", ");
|
|
121
|
+
return {
|
|
122
|
+
ok: false,
|
|
123
|
+
code: "write-scope-class-unknown",
|
|
124
|
+
message: `${who(writer)} may be in ${unknown.length === 1 ? "a class" : "classes"} no pinned package supplies (${list}), so its scope can't be told; install the package that supplies ${unknown.length === 1 ? "it" : "them"} at the pinned version, or remove the entry (known classes: ${classes.names().join(", ")})`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/** The scope that applies to `writer`, or null when its class is not restricted. An agent is always restricted to its members. */
|
|
128
|
+
export function scopeOf(declaration, writer) {
|
|
129
|
+
const entry = declaration?.writeScope?.[writer.class];
|
|
130
|
+
if (writer.class === "agent")
|
|
131
|
+
return { members: null, records: entry?.records ?? null, protected: entry?.protected ?? [], pointer: entry?.pointer ?? "/agents" };
|
|
132
|
+
return entry ?? null;
|
|
133
|
+
}
|
|
134
|
+
const OK = { ok: true };
|
|
135
|
+
function who(writer) {
|
|
136
|
+
if (writer.agent) {
|
|
137
|
+
const bound = writer.agent.members;
|
|
138
|
+
return `agent session ${writer.agent.name}, bound to ${bound.length === 1 ? "member" : "members"} ${bound.join(", ")},`;
|
|
139
|
+
}
|
|
140
|
+
const name = writer.principal !== null ? `${writer.principal} (${writer.class})` : `a ${writer.class} writer`;
|
|
141
|
+
return writer.class === "agent" ? `${name}, which no agent session lists,` : name;
|
|
142
|
+
}
|
|
143
|
+
/** Whether `writer` may write in `member` (null: a path in no member). An agent session may write in any member it is bound to (ws-101). */
|
|
144
|
+
function memberAllowed(writer, scope, member) {
|
|
145
|
+
if (writer.class === "agent")
|
|
146
|
+
return member !== null && (writer.agent?.members.includes(member) ?? false);
|
|
147
|
+
return scope.members === null || (member !== null && scope.members.includes(member));
|
|
148
|
+
}
|
|
149
|
+
/** Whether `writer` may write a record of `kind` with `verb`. A delete is never in a restricted scope. */
|
|
150
|
+
export function judgeRecord(declaration, writer, kind, verb) {
|
|
151
|
+
const scope = scopeOf(declaration, writer);
|
|
152
|
+
if (scope === null)
|
|
153
|
+
return OK;
|
|
154
|
+
// The workspace's own kinds are in every member's reach; a member's kinds only in its own.
|
|
155
|
+
const inReach = kind.declared && kind.member === null ? true : memberAllowed(writer, scope, kind.member);
|
|
156
|
+
if (!inReach) {
|
|
157
|
+
const where = kind.member === null ? "in no member" : `of member ${kind.member}`;
|
|
158
|
+
return {
|
|
159
|
+
ok: false,
|
|
160
|
+
code: "write-scope-member",
|
|
161
|
+
message: `${who(writer)} may not write ${kind.name} records, which are ${where}: ${writer.class === "agent" ? "an agent session writes only the members it is bound to" : `writeScope.${writer.class}.members leaves it out`}`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (verb === "delete") {
|
|
165
|
+
return { ok: false, code: "write-scope-kind", message: `${who(writer)} may not delete a ${kind.name} record: a record is never deleted, and a new one supersedes it` };
|
|
166
|
+
}
|
|
167
|
+
if (scope.records === null)
|
|
168
|
+
return OK;
|
|
169
|
+
const names = [kind.name, ...(kind.declaredName !== null && kind.declaredName !== kind.name ? [kind.declaredName] : [])];
|
|
170
|
+
const verbs = names.flatMap((n) => scope.records[n] ?? []);
|
|
171
|
+
if (verbs.includes(verb))
|
|
172
|
+
return OK;
|
|
173
|
+
return {
|
|
174
|
+
ok: false,
|
|
175
|
+
code: "write-scope-kind",
|
|
176
|
+
message: verbs.length === 0
|
|
177
|
+
? `${who(writer)} may not write ${kind.name} records: writeScope.${writer.class}.records does not list the kind`
|
|
178
|
+
: `${who(writer)} may ${[...new Set(verbs)].join(", ")} ${kind.name} records, and not ${verb} them (writeScope.${writer.class}.records)`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The protected entry of `entries` that covers `path` (#3146, ws-077): one
|
|
183
|
+
* whose glob matches the path or a directory above it. Null when none does.
|
|
184
|
+
*/
|
|
185
|
+
export function protectedEntry(entries, path) {
|
|
186
|
+
if (entries.length === 0)
|
|
187
|
+
return null;
|
|
188
|
+
const parts = path.split("/");
|
|
189
|
+
const prefixes = parts.map((_, i) => parts.slice(0, i + 1).join("/"));
|
|
190
|
+
for (const entry of entries) {
|
|
191
|
+
const match = picomatch(entry.path, { dot: true });
|
|
192
|
+
if (prefixes.some((p) => match(p)))
|
|
193
|
+
return entry;
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
/** What an array item an `except` pointer covers is compared as, so the items after it keep their places. */
|
|
198
|
+
const REMOVED = Symbol("except");
|
|
199
|
+
/** Remove every value `pointer` matches from `value`, in place; a `*` token matches every key or index at its level. */
|
|
200
|
+
function removeAtPointer(value, tokens) {
|
|
201
|
+
if (tokens.length === 0 || value === null || typeof value !== "object")
|
|
202
|
+
return;
|
|
203
|
+
const [head, ...rest] = tokens;
|
|
204
|
+
const container = value;
|
|
205
|
+
const names = head === "*" ? Object.keys(container) : Object.prototype.hasOwnProperty.call(container, head) ? [head] : [];
|
|
206
|
+
for (const name of names) {
|
|
207
|
+
if (rest.length > 0)
|
|
208
|
+
removeAtPointer(container[name], rest);
|
|
209
|
+
else if (Array.isArray(value))
|
|
210
|
+
value[Number(name)] = REMOVED;
|
|
211
|
+
else
|
|
212
|
+
delete container[name];
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Whether JSON text `before` and `after` differ only in what `except`
|
|
217
|
+
* allows: a top-level key, or, for an entry starting with `/`, the values a
|
|
218
|
+
* JSON Pointer matches, where a `*` token matches every key or array index
|
|
219
|
+
* at its level (`/members/*\/box/listing`, #3308). Comments and trailing
|
|
220
|
+
* commas are read, so a `.jsonc` declaration is judged too. False when either
|
|
221
|
+
* is missing or isn't a JSON object.
|
|
222
|
+
*/
|
|
223
|
+
export function onlyKeysChanged(before, after, except) {
|
|
224
|
+
if (before === null || after === null || except.length === 0)
|
|
225
|
+
return false;
|
|
226
|
+
const strip = (text) => {
|
|
227
|
+
const parsed = parseJsonText(text, { jsonc: true });
|
|
228
|
+
if (!parsed.ok)
|
|
229
|
+
return null;
|
|
230
|
+
const value = parsed.value;
|
|
231
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
232
|
+
return null;
|
|
233
|
+
const copy = structuredClone(value);
|
|
234
|
+
for (const entry of except) {
|
|
235
|
+
if (entry.startsWith("/"))
|
|
236
|
+
removeAtPointer(copy, entry.slice(1).split("/").map((t) => t.replace(/~1/g, "/").replace(/~0/g, "~")));
|
|
237
|
+
else
|
|
238
|
+
delete copy[entry];
|
|
239
|
+
}
|
|
240
|
+
return copy;
|
|
241
|
+
};
|
|
242
|
+
const a = strip(before);
|
|
243
|
+
const b = strip(after);
|
|
244
|
+
return a !== null && b !== null && isDeepStrictEqual(a, b);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Whether `writer` may write the file at `path`, from the workspace root:
|
|
248
|
+
* the path is in a member the writer may write, and no protected entry of
|
|
249
|
+
* its scope covers it, unless the entry's `except` allows the change (#3146).
|
|
250
|
+
* Without `change`, a write to a path an `except` entry covers is judged as a
|
|
251
|
+
* change outside the allowed keys.
|
|
252
|
+
*/
|
|
253
|
+
export function judgePath(declaration, writer, path, change) {
|
|
254
|
+
const scope = scopeOf(declaration, writer);
|
|
255
|
+
if (scope === null)
|
|
256
|
+
return OK;
|
|
257
|
+
const member = memberHolding(path, declaration?.members ?? []);
|
|
258
|
+
if (!memberAllowed(writer, scope, member)) {
|
|
259
|
+
const where = member === null ? "is in no member" : `is in member ${member}`;
|
|
260
|
+
return {
|
|
261
|
+
ok: false,
|
|
262
|
+
code: "write-scope-member",
|
|
263
|
+
message: `${who(writer)} may not write ${path}, which ${where}: ${writer.class === "agent" ? "an agent session writes only the members it is bound to" : `writeScope.${writer.class}.members leaves it out`}`,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const guarded = protectedEntry(scope.protected, path);
|
|
267
|
+
if (guarded === null)
|
|
268
|
+
return OK;
|
|
269
|
+
if (guarded.except.length > 0 && change && onlyKeysChanged(change.before(), change.after(), guarded.except))
|
|
270
|
+
return OK;
|
|
271
|
+
const allowance = guarded.except.length > 0 ? `, outside what its except allows (${guarded.except.join(", ")})` : "";
|
|
272
|
+
return {
|
|
273
|
+
ok: false,
|
|
274
|
+
code: "write-scope-protected",
|
|
275
|
+
message: `${who(writer)} may not write ${path}${allowance}: writeScope.${writer.class}.protected lists ${guarded.path}`,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function readAt(cwd, at) {
|
|
279
|
+
try {
|
|
280
|
+
const located = locateWorkspace(cwd, at);
|
|
281
|
+
return { declaration: readDeclaration(located.tree), rootOnDisk: located.rootOnDisk, root: located.root, tree: located.tree };
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
if (err instanceof WorkspaceReadError)
|
|
285
|
+
return null;
|
|
286
|
+
throw err;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* The scope for a write from `cwd`: the declaration and the trust policy at
|
|
291
|
+
* the base revision (`origin/HEAD`, `main` or `master`), so a write can't
|
|
292
|
+
* widen its own scope by editing its copy of the declaration. Without a base,
|
|
293
|
+
* or without a declaration at it, the working tree's declaration. `at` names
|
|
294
|
+
* the base instead, as an op wave's `--base` does (#3841).
|
|
295
|
+
*/
|
|
296
|
+
export function scopeSource(cwd, at) {
|
|
297
|
+
const top = gitRoot(cwd);
|
|
298
|
+
const base = top ? resolveBase(top, at) : null;
|
|
299
|
+
const policy = top && base ? policyAtBase(top, base) : emptyPolicy(null);
|
|
300
|
+
const withClasses = (read) => {
|
|
301
|
+
const { tree, ...rest } = read;
|
|
302
|
+
return { ...rest, classes: loadClassRegistry(read.declaration.pins, read.rootOnDisk, { tree }).registry };
|
|
303
|
+
};
|
|
304
|
+
if (base?.commit) {
|
|
305
|
+
const atBase = readAt(cwd, base.commit);
|
|
306
|
+
if (atBase)
|
|
307
|
+
return { ...withClasses(atBase), from: "base", policy };
|
|
308
|
+
}
|
|
309
|
+
const here = readAt(cwd);
|
|
310
|
+
return here ? { ...withClasses(here), from: "working-tree", policy } : { declaration: null, from: null, rootOnDisk: null, root: null, policy, classes: coreClassRegistry() };
|
|
311
|
+
}
|
|
312
|
+
const toPosix = (p) => (sep === "/" ? p : p.split(sep).join("/"));
|
|
313
|
+
/**
|
|
314
|
+
* The kind a write goes to, as {@link judgeRecord} reads it: the declared
|
|
315
|
+
* entry whose file is `kindFile`, or, for a kind the declaration does not
|
|
316
|
+
* name, the member holding `recordsDir`.
|
|
317
|
+
*/
|
|
318
|
+
export function scopedKind(source, kindName, kindFile, recordsDir) {
|
|
319
|
+
const decl = source.declaration;
|
|
320
|
+
if (!decl || source.rootOnDisk === null)
|
|
321
|
+
return { name: kindName, declaredName: null, member: null, declared: false };
|
|
322
|
+
const path = toPosix(relative(source.rootOnDisk, kindFile));
|
|
323
|
+
const declared = [...decl.records, ...decl.members.flatMap((m) => m.records)].find((r) => r.path === path);
|
|
324
|
+
if (declared)
|
|
325
|
+
return { name: kindName, declaredName: declared.name, member: declared.member, declared: true };
|
|
326
|
+
const dir = toPosix(relative(source.rootOnDisk, recordsDir));
|
|
327
|
+
return { name: kindName, declaredName: null, member: dir.startsWith("..") ? null : memberHolding(dir === "" ? "." : dir, decl.members), declared: false };
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* The agent sessions as `chant workspace agent` and the write paths read
|
|
331
|
+
* them (#3615): the declaration at base, else the working tree's. Null when
|
|
332
|
+
* neither has a declaration. Lighter than {@link scopeSource}: no trust
|
|
333
|
+
* policy and no principal classes.
|
|
334
|
+
*/
|
|
335
|
+
export function declaredSessions(cwd) {
|
|
336
|
+
const top = gitRoot(cwd);
|
|
337
|
+
const base = top ? resolveBase(top) : null;
|
|
338
|
+
if (base?.commit) {
|
|
339
|
+
const atBase = readAt(cwd, base.commit);
|
|
340
|
+
if (atBase)
|
|
341
|
+
return { agents: atBase.declaration.agents, from: "base" };
|
|
342
|
+
}
|
|
343
|
+
const here = readAt(cwd);
|
|
344
|
+
return here ? { agents: here.declaration.agents, from: "working-tree" } : null;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Refuse a record write outside the writer's scope (#2548): throws a
|
|
348
|
+
* {@link WriteScopeError}. `agent` is the session the write names
|
|
349
|
+
* (`CHANT_AGENT`), and `principal` who the write names as its author.
|
|
350
|
+
* Returns what it read at base, for the identity rule (#3163).
|
|
351
|
+
*/
|
|
352
|
+
export function refuseRecordWrite(cwd, write) {
|
|
353
|
+
const source = scopeSource(cwd);
|
|
354
|
+
if (source.declaration === null && (write.agent === undefined || write.agent === null))
|
|
355
|
+
return source;
|
|
356
|
+
const writer = resolveWriter(source.declaration, source.policy, { agent: write.agent, principal: write.principal }, source.classes);
|
|
357
|
+
const unknown = unknownClassVerdict(source.declaration, writer, source.classes);
|
|
358
|
+
if (!unknown.ok)
|
|
359
|
+
throw new WriteScopeError(unknown.code, unknown.message);
|
|
360
|
+
const verdict = judgeRecord(source.declaration, writer, scopedKind(source, write.kindName, write.kindFile, write.recordsDir), write.verb);
|
|
361
|
+
if (!verdict.ok)
|
|
362
|
+
throw new WriteScopeError(verdict.code, verdict.message);
|
|
363
|
+
return source;
|
|
364
|
+
}
|
|
365
|
+
function git(top, args) {
|
|
366
|
+
return execFileSync("git", args, { cwd: top, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 512 * 1024 * 1024 });
|
|
367
|
+
}
|
|
368
|
+
function show(top, rev, path) {
|
|
369
|
+
try {
|
|
370
|
+
return git(top, ["show", `${rev}:${path}`]);
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/** How a commit wrote a record file it modified: review when only the reviews (or a session's verdicts) changed, close when a session moved into a closed state, else amend. */
|
|
377
|
+
function modifiedVerb(top, commit, path, kind) {
|
|
378
|
+
if (kind.format !== "markdown-front-matter")
|
|
379
|
+
return "amend";
|
|
380
|
+
const before = show(top, `${commit}^`, path);
|
|
381
|
+
const after = show(top, commit, path);
|
|
382
|
+
if (before === null || after === null)
|
|
383
|
+
return "amend";
|
|
384
|
+
const a = parseFrontMatter(before);
|
|
385
|
+
const b = parseFrontMatter(after);
|
|
386
|
+
if (!a.ok || !b.ok)
|
|
387
|
+
return "amend";
|
|
388
|
+
const keys = new Set([...Object.keys(a.value), ...Object.keys(b.value)]);
|
|
389
|
+
const changed = [...keys].filter((k) => JSON.stringify(a.value[k]) !== JSON.stringify(b.value[k]));
|
|
390
|
+
if (kind.session) {
|
|
391
|
+
const state = b.value[kind.session.stateField];
|
|
392
|
+
if (typeof state === "string" && kind.session.closed.includes(state) && a.value[kind.session.stateField] !== state)
|
|
393
|
+
return "close";
|
|
394
|
+
if (changed.every((k) => kind.reviewFields.includes(k) || kind.session.fills.includes(k)))
|
|
395
|
+
return "review";
|
|
396
|
+
return "amend";
|
|
397
|
+
}
|
|
398
|
+
return changed.length > 0 && changed.every((k) => kind.reviewFields.includes(k)) ? "review" : "amend";
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Judge every commit in `base..head` against the write scope the declaration
|
|
402
|
+
* at `base` gives (#2548). Returns null when that declaration restricts no
|
|
403
|
+
* one: no writeScope block and no agent session. Merges are skipped; the
|
|
404
|
+
* commits they bring are judged instead.
|
|
405
|
+
*/
|
|
406
|
+
export async function checkWriteScope(q) {
|
|
407
|
+
const { top, base, head, prefix, declaration } = q;
|
|
408
|
+
const classes = q.classes ?? coreClassRegistry();
|
|
409
|
+
if (declaration.writeScope === null && declaration.agents.length === 0)
|
|
410
|
+
return null;
|
|
411
|
+
const policy = policyAtBase(top, { commit: base, from: "flag" });
|
|
412
|
+
const { activeAttestors } = await import("./trust/attestor.js");
|
|
413
|
+
const attestors = await activeAttestors();
|
|
414
|
+
const scoped = (c) => declaration.writeScope?.[c] !== undefined || (c === "agent" && declaration.agents.length > 0);
|
|
415
|
+
const restricted = [...classes.names().filter(scoped), ...unknownScopeClasses(declaration.writeScope, classes)];
|
|
416
|
+
const report = { base, restricted, agents: declaration.agents.map((a) => a.name), commits: [], findings: [] };
|
|
417
|
+
const list = git(top, ["rev-list", "--reverse", "--no-merges", `${base}..${head}`]).split("\n").filter(Boolean);
|
|
418
|
+
for (const commit of list) {
|
|
419
|
+
const [subject, email, trailers] = git(top, ["log", "-1", `--format=%s%x00%ae%x00%(trailers:key=${AGENT_TRAILER},valueonly,separator=%x01)`, commit]).split("\0");
|
|
420
|
+
const named = (trailers ?? "").split("\x01").map((s) => s.trim()).filter(Boolean)[0] ?? null;
|
|
421
|
+
const prov = policy.active ? commitProvenance(top, policy, commit, attestors) : null;
|
|
422
|
+
const attested = prov?.level === "attested" && prov.principal !== undefined;
|
|
423
|
+
const principal = attested ? prov.principal : email.trim();
|
|
424
|
+
const changed = git(top, ["diff-tree", "--no-commit-id", "-r", "--name-status", "--no-renames", "-z", commit])
|
|
425
|
+
.split("\0")
|
|
426
|
+
.filter(Boolean);
|
|
427
|
+
const paths = [];
|
|
428
|
+
for (let i = 0; i + 1 < changed.length; i += 2) {
|
|
429
|
+
const full = changed[i + 1];
|
|
430
|
+
if (prefix !== "" && !full.startsWith(`${prefix}/`))
|
|
431
|
+
continue;
|
|
432
|
+
paths.push({ status: changed[i], path: full });
|
|
433
|
+
}
|
|
434
|
+
let writer;
|
|
435
|
+
try {
|
|
436
|
+
writer = resolveWriter(declaration, policy, { agent: named, principal }, classes);
|
|
437
|
+
}
|
|
438
|
+
catch (err) {
|
|
439
|
+
if (!(err instanceof WriteScopeError))
|
|
440
|
+
throw err;
|
|
441
|
+
report.commits.push({ commit, subject, principal, attested, class: "agent", agent: named, paths: paths.length });
|
|
442
|
+
report.findings.push({ id: `finding:${err.code}:${commit}`, code: err.code, commit, path: null, principal, class: "agent", agent: named, verb: null, message: `${commit.slice(0, 8)} has ${AGENT_TRAILER}: ${named}: ${err.message}` });
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
report.commits.push({ commit, subject, principal, attested, class: writer.class, agent: writer.agent?.name ?? null, paths: paths.length });
|
|
446
|
+
const unknown = unknownClassVerdict(declaration, writer, classes);
|
|
447
|
+
if (!unknown.ok) {
|
|
448
|
+
report.findings.push({ id: `finding:${unknown.code}:${commit}`, code: unknown.code, commit, path: null, principal, class: writer.class, agent: null, verb: null, message: `${commit.slice(0, 8)}: ${unknown.message}` });
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
if (scopeOf(declaration, writer) === null)
|
|
452
|
+
continue;
|
|
453
|
+
for (const p of paths) {
|
|
454
|
+
const inWorkspace = prefix === "" ? p.path : p.path.slice(prefix.length + 1);
|
|
455
|
+
const kind = q.kinds.find((k) => posix.dirname(p.path) === k.dir && k.match.test(posix.basename(p.path)));
|
|
456
|
+
let verb = null;
|
|
457
|
+
let verdict;
|
|
458
|
+
if (kind) {
|
|
459
|
+
verb = p.status === "A" ? "new" : p.status === "D" ? "delete" : modifiedVerb(top, commit, p.path, kind);
|
|
460
|
+
verdict = judgeRecord(declaration, writer, kind.scoped, verb);
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
verdict = judgePath(declaration, writer, inWorkspace, {
|
|
464
|
+
before: () => (p.status === "A" ? null : show(top, `${commit}^`, p.path)),
|
|
465
|
+
after: () => (p.status === "D" ? null : show(top, commit, p.path)),
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
if (verdict.ok)
|
|
469
|
+
continue;
|
|
470
|
+
report.findings.push({
|
|
471
|
+
id: `finding:${verdict.code}:${commit}:${inWorkspace}`,
|
|
472
|
+
code: verdict.code,
|
|
473
|
+
commit,
|
|
474
|
+
path: inWorkspace,
|
|
475
|
+
principal,
|
|
476
|
+
class: writer.class,
|
|
477
|
+
agent: writer.agent?.name ?? null,
|
|
478
|
+
verb,
|
|
479
|
+
message: `${commit.slice(0, 8)} ${p.status === "D" ? "deletes" : p.status === "A" ? "adds" : "changes"} ${inWorkspace}: ${verdict.message}`,
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return report;
|
|
484
|
+
}
|