@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,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The generated-file checks (#2541, #2524 D14).
|
|
3
|
+
*
|
|
4
|
+
* A member lists the files a command writes in its `generated` entries, each
|
|
5
|
+
* with the command line that writes it and the sources it reads. Core adds
|
|
6
|
+
* the files `chant update` rewrites, `skills/*\/SKILL.md`, as implicit entries
|
|
7
|
+
* of every `chant` member (`../generated-files.ts` holds that list, and the
|
|
8
|
+
* lineage lock classes files from the same list).
|
|
9
|
+
*
|
|
10
|
+
* - `WSP101`: a generated file differs from what its generator writes.
|
|
11
|
+
* - `WSP102`: a declared generated file does not exist.
|
|
12
|
+
* - `WSP103`: a generator could not be run, failed, or wrote nothing.
|
|
13
|
+
* - `WSP104` (info): an entry is kept by hand, with the reason it gives.
|
|
14
|
+
* - `WSP105` (info): an entry was not compared, because its generator runs
|
|
15
|
+
* only on request or its output can't be produced without running code.
|
|
16
|
+
* - `WSP106`: an entry names a source that does not exist.
|
|
17
|
+
*
|
|
18
|
+
* They were WSP081 to WSP086 until #2641 moved them, since the pipeline
|
|
19
|
+
* checks of #2542 hold WSP081 to WSP083.
|
|
20
|
+
*
|
|
21
|
+
* What runs by default is what needs no member code: the file and its
|
|
22
|
+
* sources exist, and each implicit `SKILL.md` matches what the member's
|
|
23
|
+
* lexicons render, with the lexicons read from its config statically.
|
|
24
|
+
* Declared generators are commands that load member code and take seconds
|
|
25
|
+
* each, so they run only when asked ({@link GatherOptions.runGenerators},
|
|
26
|
+
* `chant workspace check --generated`).
|
|
27
|
+
*
|
|
28
|
+
* The checks are a pure function over {@link GeneratedFileFacts};
|
|
29
|
+
* {@link gatherGeneratedFacts} collects those facts from a checkout, and
|
|
30
|
+
* `chant workspace check` gathers them before it runs
|
|
31
|
+
* {@link GENERATED_CHECKS} (#2641).
|
|
32
|
+
*/
|
|
33
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
34
|
+
import { createHash } from "node:crypto";
|
|
35
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
36
|
+
import { tmpdir } from "node:os";
|
|
37
|
+
import { basename, delimiter, dirname, join, relative, resolve, sep } from "node:path";
|
|
38
|
+
import { gitTop } from "../tree.js";
|
|
39
|
+
export const WSP_GENERATED_DRIFT = "WSP101";
|
|
40
|
+
export const WSP_GENERATED_MISSING = "WSP102";
|
|
41
|
+
export const WSP_GENERATOR_FAILED = "WSP103";
|
|
42
|
+
export const WSP_GENERATED_HAND_WRITTEN = "WSP104";
|
|
43
|
+
export const WSP_GENERATED_NOT_COMPARED = "WSP105";
|
|
44
|
+
export const WSP_GENERATED_SOURCE_MISSING = "WSP106";
|
|
45
|
+
const where = (f) => (f.memberDir === "." ? "the workspace root" : f.memberDir);
|
|
46
|
+
function finding(f, id, severity, message) {
|
|
47
|
+
return { id, severity, member: f.member, path: f.path, pointer: f.pointer, message };
|
|
48
|
+
}
|
|
49
|
+
/** Every generated-file finding, in the order of the facts. */
|
|
50
|
+
export function checkGenerated(facts) {
|
|
51
|
+
const out = [];
|
|
52
|
+
for (const f of facts) {
|
|
53
|
+
if (f.handWritten !== null) {
|
|
54
|
+
out.push(finding(f, WSP_GENERATED_HAND_WRITTEN, "info", `${f.path} is kept by hand, so \`${f.generator}\` is not run for it: ${f.handWritten}`));
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
for (const s of f.missingSources) {
|
|
58
|
+
out.push(finding(f, WSP_GENERATED_SOURCE_MISSING, "error", `member ${f.member} lists ${s} as a source of ${f.path}, and ${s} does not exist`));
|
|
59
|
+
}
|
|
60
|
+
if (f.current === null && !f.implicit) {
|
|
61
|
+
out.push(finding(f, WSP_GENERATED_MISSING, "error", `${f.path} does not exist; run \`${f.generator}\` in ${where(f)} and commit the file`));
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const o = f.output;
|
|
65
|
+
if (o.status === "not-run") {
|
|
66
|
+
out.push(finding(f, WSP_GENERATED_NOT_COMPARED, "info", `${f.path} was not compared with its generator's output: ${o.reason}`));
|
|
67
|
+
}
|
|
68
|
+
else if (o.status === "failed") {
|
|
69
|
+
out.push(finding(f, WSP_GENERATOR_FAILED, "error", `\`${f.generator}\` could not regenerate ${f.path}: ${o.message}`));
|
|
70
|
+
}
|
|
71
|
+
else if (f.current !== null && o.sha256 !== f.current) {
|
|
72
|
+
const fix = f.implicit
|
|
73
|
+
? `run \`chant update\` in ${where(f)}, or list the file in member ${f.member}'s generated entries with handWritten and a reason`
|
|
74
|
+
: `run \`${f.generator}\` in ${where(f)} and commit the result, or mark the entry handWritten with a reason`;
|
|
75
|
+
out.push(finding(f, WSP_GENERATED_DRIFT, "error", `${f.path} differs from what \`${f.generator}\` writes; ${fix}`));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
// ── As workspace checks ──────────────────────────────────────────────────────
|
|
81
|
+
function generatedCheck(id, name, severity, description) {
|
|
82
|
+
return {
|
|
83
|
+
id,
|
|
84
|
+
name,
|
|
85
|
+
description,
|
|
86
|
+
severity,
|
|
87
|
+
configurable: true,
|
|
88
|
+
check(ctx) {
|
|
89
|
+
return checkGenerated(ctx.facts?.generated ?? [])
|
|
90
|
+
.filter((f) => f.id === id)
|
|
91
|
+
.map((f) => ({ checkId: id, severity: this.severity, message: f.message, entity: f.member, pointer: f.pointer }));
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** The generated-file checks, which read `ctx.facts.generated`. They find nothing when the facts were not gathered. */
|
|
96
|
+
export const GENERATED_CHECKS = [
|
|
97
|
+
generatedCheck(WSP_GENERATED_DRIFT, "generated-drift", "error", "A generated file is what its generator writes. Declared generators run only with --generated."),
|
|
98
|
+
generatedCheck(WSP_GENERATED_MISSING, "generated-missing", "error", "Every declared generated file exists."),
|
|
99
|
+
generatedCheck(WSP_GENERATOR_FAILED, "generator-failed", "error", "A declared generator runs, exits 0 and writes the file."),
|
|
100
|
+
generatedCheck(WSP_GENERATED_HAND_WRITTEN, "generated-hand-written", "info", "An entry kept by hand is reported with its reason, and its generator is not run."),
|
|
101
|
+
generatedCheck(WSP_GENERATED_NOT_COMPARED, "generated-not-compared", "info", "An entry not compared with its generator's output is reported with the reason."),
|
|
102
|
+
generatedCheck(WSP_GENERATED_SOURCE_MISSING, "generated-source-missing", "error", "Every source a generated entry names exists."),
|
|
103
|
+
];
|
|
104
|
+
const sha256 = (data) => createHash("sha256").update(data).digest("hex");
|
|
105
|
+
function hashOf(abs) {
|
|
106
|
+
return existsSync(abs) ? sha256(readFileSync(abs)) : null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Collect {@link GeneratedFileFacts} for every member of `declaration`, whose
|
|
110
|
+
* workspace root is `root`: its declared entries, then, for a `chant`
|
|
111
|
+
* member, its implicit `SKILL.md` files.
|
|
112
|
+
*/
|
|
113
|
+
export async function gatherGeneratedFacts(root, declaration, options = {}) {
|
|
114
|
+
const renderSkills = options.renderSkills ?? renderSkillsStatically;
|
|
115
|
+
const runGenerator = options.runGenerator ?? spawnGenerator;
|
|
116
|
+
const facts = [];
|
|
117
|
+
for (const m of declaration.members) {
|
|
118
|
+
const memberAbs = join(root, m.dir);
|
|
119
|
+
const rel = (p) => (m.dir === "." ? p : `${m.dir}/${p}`);
|
|
120
|
+
const declared = new Set(m.generated.map((g) => g.path));
|
|
121
|
+
for (const g of m.generated) {
|
|
122
|
+
const abs = join(memberAbs, g.path);
|
|
123
|
+
const current = hashOf(abs);
|
|
124
|
+
const base = {
|
|
125
|
+
member: m.name,
|
|
126
|
+
memberDir: m.dir,
|
|
127
|
+
path: rel(g.path),
|
|
128
|
+
pointer: g.pointer,
|
|
129
|
+
generator: g.generator,
|
|
130
|
+
implicit: false,
|
|
131
|
+
handWritten: g.handWritten?.because ?? null,
|
|
132
|
+
missingSources: g.sources.filter((s) => !existsSync(join(root, s))),
|
|
133
|
+
current,
|
|
134
|
+
};
|
|
135
|
+
let output;
|
|
136
|
+
if (g.handWritten || current === null)
|
|
137
|
+
output = { status: "not-run", reason: "not needed" };
|
|
138
|
+
else if (!options.runGenerators)
|
|
139
|
+
output = { status: "not-run", reason: `its generator runs only with --generated, since it runs member code` };
|
|
140
|
+
else
|
|
141
|
+
output = regenerate(root, memberAbs, abs, g.generator, runGenerator);
|
|
142
|
+
facts.push({ ...base, output });
|
|
143
|
+
}
|
|
144
|
+
if (m.kind === "chant")
|
|
145
|
+
facts.push(...(await skillFacts(m, memberAbs, declared, renderSkills)));
|
|
146
|
+
}
|
|
147
|
+
return facts;
|
|
148
|
+
}
|
|
149
|
+
async function skillFacts(m, memberAbs, declared, renderSkills) {
|
|
150
|
+
const rel = (p) => (m.dir === "." ? p : `${m.dir}/${p}`);
|
|
151
|
+
const base = { member: m.name, memberDir: m.dir, pointer: m.pointer, generator: "chant update", implicit: true, handWritten: null, missingSources: [] };
|
|
152
|
+
let render;
|
|
153
|
+
try {
|
|
154
|
+
render = await renderSkills(memberAbs);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
render = { status: "unknown", reason: `the member's lexicons could not be loaded (${err instanceof Error ? err.message : String(err)})` };
|
|
158
|
+
}
|
|
159
|
+
if (render.status === "unknown") {
|
|
160
|
+
return [{ ...base, path: rel("skills/*/SKILL.md"), current: null, output: { status: "not-run", reason: render.reason } }];
|
|
161
|
+
}
|
|
162
|
+
const out = [];
|
|
163
|
+
for (const [path, content] of [...render.files].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))) {
|
|
164
|
+
// A declared entry, hand-written or not, speaks for the file instead.
|
|
165
|
+
if (declared.has(path))
|
|
166
|
+
continue;
|
|
167
|
+
const current = hashOf(join(memberAbs, path));
|
|
168
|
+
// A skill chant update has not written (often gitignored) is not drift.
|
|
169
|
+
if (current === null)
|
|
170
|
+
continue;
|
|
171
|
+
out.push({ ...base, path: rel(path), current, output: { status: "produced", sha256: sha256(content) } });
|
|
172
|
+
}
|
|
173
|
+
if (render.unread) {
|
|
174
|
+
out.push({ ...base, path: rel("skills/*/SKILL.md"), current: null, output: { status: "not-run", reason: render.unread } });
|
|
175
|
+
}
|
|
176
|
+
return out;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Render the skills `chant update` would write for the member at `memberDir`,
|
|
180
|
+
* in this process. The member's `lexicons` are read from its config
|
|
181
|
+
* statically, never by running it. Lexicons declared by module path are left
|
|
182
|
+
* out, since loading one runs member code.
|
|
183
|
+
*/
|
|
184
|
+
export async function renderSkillsStatically(memberDir) {
|
|
185
|
+
const { readLexiconDeclarationsStatically } = await import("../../config-static.js");
|
|
186
|
+
const read = readLexiconDeclarationsStatically(memberDir);
|
|
187
|
+
if (read.status === "no-config")
|
|
188
|
+
return { status: "rendered", files: new Map() };
|
|
189
|
+
if (read.status === "unknown")
|
|
190
|
+
return { status: "unknown", reason: `the config's lexicons can't be read without running it (${read.reason})` };
|
|
191
|
+
const packages = read.entries.filter((e) => typeof e === "string");
|
|
192
|
+
const byPath = read.entries.filter((e) => typeof e !== "string").map((e) => e.name);
|
|
193
|
+
const files = new Map();
|
|
194
|
+
if (packages.length > 0) {
|
|
195
|
+
const { loadPlugins } = await import("../../cli/plugins.js");
|
|
196
|
+
const { skillFilePath } = await import("../../cli/commands/update.js");
|
|
197
|
+
for (const plugin of await loadPlugins(packages)) {
|
|
198
|
+
for (const skill of plugin.skills?.() ?? [])
|
|
199
|
+
files.set(skillFilePath(skill.name), skill.content);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
status: "rendered",
|
|
204
|
+
files,
|
|
205
|
+
...(byPath.length > 0 ? { unread: `the skills of ${byPath.join(", ")}, declared by module path, would run member code to render` } : {}),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// ── Running a generator ──────────────────────────────────────────────────────
|
|
209
|
+
/**
|
|
210
|
+
* Split a command line into words, with '...' and "..." quoting and
|
|
211
|
+
* backslash escapes. Returns undefined for anything a shell would interpret:
|
|
212
|
+
* pipes, redirections, `;`, `&`, substitutions. A generator is one command.
|
|
213
|
+
*/
|
|
214
|
+
export function splitCommandLine(line) {
|
|
215
|
+
const words = [];
|
|
216
|
+
let word = "";
|
|
217
|
+
let inWord = false;
|
|
218
|
+
for (let i = 0; i < line.length; i++) {
|
|
219
|
+
const c = line[i];
|
|
220
|
+
if (c === "'") {
|
|
221
|
+
const end = line.indexOf("'", i + 1);
|
|
222
|
+
if (end < 0)
|
|
223
|
+
return undefined;
|
|
224
|
+
word += line.slice(i + 1, end);
|
|
225
|
+
inWord = true;
|
|
226
|
+
i = end;
|
|
227
|
+
}
|
|
228
|
+
else if (c === '"') {
|
|
229
|
+
let j = i + 1;
|
|
230
|
+
for (; j < line.length && line[j] !== '"'; j++) {
|
|
231
|
+
if (line[j] === "$" || line[j] === "`")
|
|
232
|
+
return undefined;
|
|
233
|
+
if (line[j] === "\\" && (line[j + 1] === '"' || line[j + 1] === "\\"))
|
|
234
|
+
j++;
|
|
235
|
+
word += line[j];
|
|
236
|
+
}
|
|
237
|
+
if (j >= line.length)
|
|
238
|
+
return undefined;
|
|
239
|
+
inWord = true;
|
|
240
|
+
i = j;
|
|
241
|
+
}
|
|
242
|
+
else if (c === "\\") {
|
|
243
|
+
if (i + 1 >= line.length)
|
|
244
|
+
return undefined;
|
|
245
|
+
word += line[++i];
|
|
246
|
+
inWord = true;
|
|
247
|
+
}
|
|
248
|
+
else if (/\s/.test(c)) {
|
|
249
|
+
if (inWord)
|
|
250
|
+
words.push(word);
|
|
251
|
+
word = "";
|
|
252
|
+
inWord = false;
|
|
253
|
+
}
|
|
254
|
+
else if ("|&;<>()$`*?[]{}~#".includes(c) && !(inWord && c === "#")) {
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
word += c;
|
|
259
|
+
inWord = true;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (inWord)
|
|
263
|
+
words.push(word);
|
|
264
|
+
return words.length > 0 ? words : undefined;
|
|
265
|
+
}
|
|
266
|
+
/** `node_modules/.bin` directories from `dir` up, nearest first, so `chant` is the member's own. */
|
|
267
|
+
export function binPath(dir) {
|
|
268
|
+
const out = [];
|
|
269
|
+
for (let d = resolve(dir);; d = dirname(d)) {
|
|
270
|
+
const bin = join(d, "node_modules", ".bin");
|
|
271
|
+
if (existsSync(bin))
|
|
272
|
+
out.push(bin);
|
|
273
|
+
if (dirname(d) === d)
|
|
274
|
+
return out;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/** Run a generator with no shell, for up to ten minutes. */
|
|
278
|
+
export const spawnGenerator = ({ cwd, argv, env }) => {
|
|
279
|
+
const r = spawnSync(argv[0], argv.slice(1), { cwd, env, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"], timeout: 10 * 60000, maxBuffer: 64 * 1024 * 1024 });
|
|
280
|
+
if (r.error)
|
|
281
|
+
return { ok: false, message: r.error.message };
|
|
282
|
+
if (r.status !== 0) {
|
|
283
|
+
const tail = (r.stderr || r.stdout || "").trim().split("\n").slice(-5).join("\n");
|
|
284
|
+
return { ok: false, message: `exited with ${r.status ?? r.signal}${tail ? `:\n${tail}` : ""}` };
|
|
285
|
+
}
|
|
286
|
+
return { ok: true };
|
|
287
|
+
};
|
|
288
|
+
const OUTPUT_FLAGS = ["-o", "--output"];
|
|
289
|
+
/**
|
|
290
|
+
* Produce the file at `target` (absolute) with `generator`, run in
|
|
291
|
+
* `memberAbs`, without leaving anything changed in the tree. When the
|
|
292
|
+
* command passes `-o` or `--output` with the file's path, that flag gets a
|
|
293
|
+
* temporary path instead. Otherwise the generator writes in place, and the
|
|
294
|
+
* git working tree is put back as it was afterwards.
|
|
295
|
+
*/
|
|
296
|
+
export function regenerate(root, memberAbs, target, generator, run) {
|
|
297
|
+
const argv = splitCommandLine(generator);
|
|
298
|
+
if (!argv)
|
|
299
|
+
return { status: "failed", message: "the generator is not a single command: quoting must balance, and pipes, redirections and shell expansions are not run" };
|
|
300
|
+
const env = { ...process.env, PATH: [...binPath(memberAbs), process.env.PATH ?? ""].join(delimiter) };
|
|
301
|
+
const at = (i) => resolve(memberAbs, argv[i]) === target;
|
|
302
|
+
let flag = -1;
|
|
303
|
+
let inline = false;
|
|
304
|
+
for (let i = 0; i < argv.length; i++) {
|
|
305
|
+
if (OUTPUT_FLAGS.includes(argv[i]) && i + 1 < argv.length && at(i + 1)) {
|
|
306
|
+
flag = i + 1;
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
const eq = OUTPUT_FLAGS.map((f) => `${f}=`).find((p) => argv[i].startsWith(p));
|
|
310
|
+
if (eq && resolve(memberAbs, argv[i].slice(eq.length)) === target) {
|
|
311
|
+
flag = i;
|
|
312
|
+
inline = true;
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (flag >= 0) {
|
|
317
|
+
const dir = mkdtempSync(join(tmpdir(), "chant-generated-"));
|
|
318
|
+
try {
|
|
319
|
+
const temp = join(dir, basename(target));
|
|
320
|
+
const args = [...argv];
|
|
321
|
+
args[flag] = inline ? `${argv[flag].slice(0, argv[flag].indexOf("=") + 1)}${temp}` : temp;
|
|
322
|
+
const r = run({ cwd: memberAbs, argv: args, env });
|
|
323
|
+
if (!r.ok)
|
|
324
|
+
return { status: "failed", message: r.message };
|
|
325
|
+
if (!existsSync(temp))
|
|
326
|
+
return { status: "failed", message: "it exited 0 and wrote nothing to its output path" };
|
|
327
|
+
return { status: "produced", sha256: sha256(readFileSync(temp)) };
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
rmSync(dir, { recursive: true, force: true });
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const top = gitTop(root);
|
|
334
|
+
if (!top)
|
|
335
|
+
return { status: "failed", message: "it writes in place, and chant runs an in-place generator only in a git checkout, which it can put back afterwards" };
|
|
336
|
+
return withTreeRestored(top, [target], () => {
|
|
337
|
+
const r = run({ cwd: memberAbs, argv, env });
|
|
338
|
+
if (!r.ok)
|
|
339
|
+
return { status: "failed", message: r.message };
|
|
340
|
+
if (!existsSync(target))
|
|
341
|
+
return { status: "failed", message: "it exited 0 and left no file at the entry's path" };
|
|
342
|
+
return { status: "produced", sha256: sha256(readFileSync(target)) };
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
/** Paths git reports as changed or untracked, relative to `top`, with their status. */
|
|
346
|
+
function changedPaths(top) {
|
|
347
|
+
const out = execFileSync("git", ["status", "--porcelain=v1", "-z", "--untracked-files=all"], { cwd: top, encoding: "utf-8", maxBuffer: 256 * 1024 * 1024 });
|
|
348
|
+
const parts = out.split("\0");
|
|
349
|
+
const map = new Map();
|
|
350
|
+
for (let i = 0; i < parts.length; i++) {
|
|
351
|
+
const entry = parts[i];
|
|
352
|
+
if (entry.length < 4)
|
|
353
|
+
continue;
|
|
354
|
+
const xy = entry.slice(0, 2);
|
|
355
|
+
map.set(entry.slice(3), xy);
|
|
356
|
+
// A rename or copy is followed by its original path.
|
|
357
|
+
if (xy[0] === "R" || xy[0] === "C")
|
|
358
|
+
i++;
|
|
359
|
+
}
|
|
360
|
+
return map;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Run `fn`, then put the working tree of the repository at `top` back as it
|
|
364
|
+
* was: files that were clean are checked out from the index again, new
|
|
365
|
+
* untracked files are removed, and files that were already changed get their
|
|
366
|
+
* earlier bytes back. `extra` files (absolute) are restored too, whatever
|
|
367
|
+
* git says about them, which covers a gitignored target. Files a generator
|
|
368
|
+
* writes under ignored paths are otherwise left.
|
|
369
|
+
*/
|
|
370
|
+
export function withTreeRestored(top, extra, fn) {
|
|
371
|
+
const before = changedPaths(top);
|
|
372
|
+
const snapshot = new Map();
|
|
373
|
+
const keep = (rel) => {
|
|
374
|
+
const abs = join(top, rel);
|
|
375
|
+
let kind = "missing";
|
|
376
|
+
try {
|
|
377
|
+
kind = statSync(abs).isFile() ? "file" : "other";
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
// Missing: restoring means removing whatever appears there.
|
|
381
|
+
}
|
|
382
|
+
// A directory entry (a submodule) is left to git.
|
|
383
|
+
if (kind !== "other")
|
|
384
|
+
snapshot.set(rel, kind === "file" ? readFileSync(abs) : null);
|
|
385
|
+
};
|
|
386
|
+
for (const rel of before.keys())
|
|
387
|
+
keep(rel);
|
|
388
|
+
for (const abs of extra)
|
|
389
|
+
keep(relative(top, abs).split(sep).join("/"));
|
|
390
|
+
try {
|
|
391
|
+
return fn();
|
|
392
|
+
}
|
|
393
|
+
finally {
|
|
394
|
+
const after = changedPaths(top);
|
|
395
|
+
const checkout = [];
|
|
396
|
+
for (const rel of new Set([...snapshot.keys(), ...after.keys()])) {
|
|
397
|
+
const abs = join(top, rel);
|
|
398
|
+
if (snapshot.has(rel)) {
|
|
399
|
+
const was = snapshot.get(rel);
|
|
400
|
+
const now = existsSync(abs) ? readFileSync(abs) : null;
|
|
401
|
+
if (was === null && now !== null)
|
|
402
|
+
rmSync(abs, { force: true });
|
|
403
|
+
else if (was !== null && (now === null || !now.equals(was))) {
|
|
404
|
+
mkdirSync(dirname(abs), { recursive: true });
|
|
405
|
+
writeFileSync(abs, was);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
else if (after.get(rel) === "??") {
|
|
409
|
+
rmSync(abs, { force: true });
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
checkout.push(rel);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
for (let i = 0; i < checkout.length; i += 200) {
|
|
416
|
+
execFileSync("git", ["checkout", "--", ...checkout.slice(i, i + 200)], { cwd: top, stdio: "ignore" });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workspace checks behind member ledgers (#2538, #2524 D7, ws-036 and
|
|
3
|
+
* ws-037).
|
|
4
|
+
*
|
|
5
|
+
* - `WSP071`: every `chant` member that stamps ownership markers uses its own
|
|
6
|
+
* `ownership.stack`. Markers carry no member key, so the stack is what tells
|
|
7
|
+
* two members' resources and receipts apart.
|
|
8
|
+
* - `WSP072`: members that write the flat ledger layout never share an
|
|
9
|
+
* environment name. A member whose own chant is older than
|
|
10
|
+
* {@link MEMBER_LEDGER_FLOOR} still writes `<env>/...` at the top of
|
|
11
|
+
* `chant/lifecycle`, and so does the root member `.`; two flat writers with
|
|
12
|
+
* one environment name would write the same files.
|
|
13
|
+
* - `WSP073` (info): a member's ledger settings could not be read without
|
|
14
|
+
* running its config, so the two checks above could not compare it.
|
|
15
|
+
*
|
|
16
|
+
* The checks are pure functions over {@link MemberLedgerFacts}.
|
|
17
|
+
* {@link gatherLedgerFacts} collects those facts from a checkout, and
|
|
18
|
+
* `chant workspace check` gathers them before it runs {@link LEDGER_CHECKS}
|
|
19
|
+
* (#2641). WSP071 and WSP072 are fixed: a member that ignores either one
|
|
20
|
+
* writes its records or marks its resources as another member's. Member
|
|
21
|
+
* configs are read statically and never run.
|
|
22
|
+
*/
|
|
23
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
24
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
25
|
+
import { MEMBER_LEDGER_FLOOR } from "../../lifecycle/member-ledger.js";
|
|
26
|
+
import { compareVersions } from "../declaration.js";
|
|
27
|
+
export const WSP_DISTINCT_STACKS = "WSP071";
|
|
28
|
+
export const WSP_FLAT_LEDGER_ENVIRONMENTS = "WSP072";
|
|
29
|
+
export const WSP_LEDGER_SETTINGS_UNREAD = "WSP073";
|
|
30
|
+
/** `WSP071`: no two members share an `ownership.stack`. */
|
|
31
|
+
export function checkDistinctStacks(facts) {
|
|
32
|
+
const byStack = new Map();
|
|
33
|
+
for (const f of facts) {
|
|
34
|
+
if (f.stack === null)
|
|
35
|
+
continue;
|
|
36
|
+
byStack.set(f.stack, [...(byStack.get(f.stack) ?? []), f]);
|
|
37
|
+
}
|
|
38
|
+
const findings = [];
|
|
39
|
+
for (const [stack, members] of byStack) {
|
|
40
|
+
if (members.length < 2)
|
|
41
|
+
continue;
|
|
42
|
+
const names = members.map((m) => m.name);
|
|
43
|
+
findings.push({
|
|
44
|
+
id: WSP_DISTINCT_STACKS,
|
|
45
|
+
severity: "error",
|
|
46
|
+
members: names,
|
|
47
|
+
message: `members ${names.join(", ")} all set ownership.stack to ${JSON.stringify(stack)}; ` +
|
|
48
|
+
`ownership markers carry no member name, so each member needs its own stack. ` +
|
|
49
|
+
`Rename all but one in their chant.config.ts (chant workspace init proposes names).`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return findings;
|
|
53
|
+
}
|
|
54
|
+
/** Whether `f` writes the flat ledger layout: the root member, or a member on a chant below the floor. */
|
|
55
|
+
export function writesFlatLedger(f, floor = MEMBER_LEDGER_FLOOR) {
|
|
56
|
+
if (f.dir === ".")
|
|
57
|
+
return true;
|
|
58
|
+
if (f.chantVersion === null)
|
|
59
|
+
return false;
|
|
60
|
+
try {
|
|
61
|
+
return compareVersions(f.chantVersion, floor) < 0;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// A version chant cannot read says nothing about the layout.
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** `WSP072`: flat-layout writers never share an environment name. */
|
|
69
|
+
export function checkFlatLedgerEnvironments(facts, floor = MEMBER_LEDGER_FLOOR) {
|
|
70
|
+
const flat = facts.filter((f) => writesFlatLedger(f, floor));
|
|
71
|
+
const byEnv = new Map();
|
|
72
|
+
for (const f of flat) {
|
|
73
|
+
for (const env of new Set(f.environments))
|
|
74
|
+
byEnv.set(env, [...(byEnv.get(env) ?? []), f]);
|
|
75
|
+
}
|
|
76
|
+
const findings = [];
|
|
77
|
+
for (const [env, members] of byEnv) {
|
|
78
|
+
if (members.length < 2)
|
|
79
|
+
continue;
|
|
80
|
+
const names = members.map((m) => m.name);
|
|
81
|
+
const why = members.map((m) => (m.dir === "." ? `${m.name} is the root member` : `${m.name} runs chant ${m.chantVersion}`));
|
|
82
|
+
findings.push({
|
|
83
|
+
id: WSP_FLAT_LEDGER_ENVIRONMENTS,
|
|
84
|
+
severity: "error",
|
|
85
|
+
members: names,
|
|
86
|
+
message: `members ${names.join(", ")} ${names.length === 2 ? "both" : "all"} write the flat ledger layout and share the environment ${JSON.stringify(env)}, ` +
|
|
87
|
+
`so their releases, snapshots and runs land in the same files on chant/lifecycle (${why.join("; ")}). ` +
|
|
88
|
+
`Upgrade the members below chant ${floor}, which write under _members/<member>/, or rename the environment in one of them.`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return findings;
|
|
92
|
+
}
|
|
93
|
+
/** Both ledger checks, stack findings first. */
|
|
94
|
+
export function checkLedgers(facts, floor = MEMBER_LEDGER_FLOOR) {
|
|
95
|
+
return [...checkDistinctStacks(facts), ...checkFlatLedgerEnvironments(facts, floor)];
|
|
96
|
+
}
|
|
97
|
+
// ── As workspace checks ──────────────────────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* A finding as a workspace diagnostic. It sits at the first member it names,
|
|
100
|
+
* in declaration order, and that member's entry is the one that can carry a
|
|
101
|
+
* `suppress` for a settable check.
|
|
102
|
+
*/
|
|
103
|
+
function toDiagnostic(check, ctx, f) {
|
|
104
|
+
const member = ctx.declaration.members.find((m) => m.name === f.members[0]);
|
|
105
|
+
return { checkId: check.id, severity: check.severity, message: f.message, entity: f.members[0], pointer: member?.pointer ?? "" };
|
|
106
|
+
}
|
|
107
|
+
/** The ledger checks, which read `ctx.facts.ledgers`. They find nothing when the facts were not gathered. */
|
|
108
|
+
export const LEDGER_CHECKS = [
|
|
109
|
+
{
|
|
110
|
+
id: WSP_DISTINCT_STACKS,
|
|
111
|
+
name: "ownership-stack-shared",
|
|
112
|
+
description: "No two chant members set the same ownership.stack. Ownership markers carry no member name, so the stack tells members' resources and receipts apart.",
|
|
113
|
+
severity: "error",
|
|
114
|
+
configurable: false,
|
|
115
|
+
check(ctx) {
|
|
116
|
+
return checkDistinctStacks(ctx.facts?.ledgers ?? []).map((f) => toDiagnostic(this, ctx, f));
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
id: WSP_FLAT_LEDGER_ENVIRONMENTS,
|
|
121
|
+
name: "flat-ledger-environment-shared",
|
|
122
|
+
description: `No two members that write the flat ledger layout (the root member, and members on a chant older than ${MEMBER_LEDGER_FLOOR}) share an environment name.`,
|
|
123
|
+
severity: "error",
|
|
124
|
+
configurable: false,
|
|
125
|
+
check(ctx) {
|
|
126
|
+
return checkFlatLedgerEnvironments(ctx.facts?.ledgers ?? []).map((f) => toDiagnostic(this, ctx, f));
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: WSP_LEDGER_SETTINGS_UNREAD,
|
|
131
|
+
name: "ledger-settings-unread",
|
|
132
|
+
description: "A chant member's ownership and environments could not be read from its config without running it, so WSP071 and WSP072 could not compare it.",
|
|
133
|
+
severity: "info",
|
|
134
|
+
configurable: true,
|
|
135
|
+
check(ctx) {
|
|
136
|
+
return (ctx.facts?.ledgers ?? [])
|
|
137
|
+
.filter((f) => f.unread !== undefined)
|
|
138
|
+
.map((f) => ({
|
|
139
|
+
checkId: this.id,
|
|
140
|
+
severity: this.severity,
|
|
141
|
+
message: `member ${f.name}'s ownership and environments were not compared with other members': ${f.unread}`,
|
|
142
|
+
entity: f.name,
|
|
143
|
+
pointer: ctx.declaration.members.find((m) => m.name === f.name)?.pointer ?? "",
|
|
144
|
+
}));
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
// ── Facts from a checkout ────────────────────────────────────────────────────
|
|
149
|
+
/**
|
|
150
|
+
* The version of `@intentius/chant` that `dir`'s own toolchain resolves: the
|
|
151
|
+
* nearest `node_modules/@intentius/chant/package.json` walking up from `dir`,
|
|
152
|
+
* as Node's resolution would find it. Null when there is none.
|
|
153
|
+
*/
|
|
154
|
+
export function memberChantVersion(dir) {
|
|
155
|
+
for (let d = resolve(dir);; d = dirname(d)) {
|
|
156
|
+
const pkg = join(d, "node_modules", "@intentius", "chant", "package.json");
|
|
157
|
+
if (existsSync(pkg)) {
|
|
158
|
+
try {
|
|
159
|
+
const version = JSON.parse(readFileSync(pkg, "utf-8")).version;
|
|
160
|
+
return typeof version === "string" ? version : null;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (dirname(d) === d)
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** The config fields the ledger checks read. */
|
|
171
|
+
const LEDGER_FIELDS = ["ownership", "environments"];
|
|
172
|
+
/**
|
|
173
|
+
* Collect {@link MemberLedgerFacts} for every `chant` member of `declaration`,
|
|
174
|
+
* whose workspace root is `root`. `ownership` and `environments` are read
|
|
175
|
+
* from each member's config statically (../../config-static.ts), the way
|
|
176
|
+
* `chant audit` reads lexicons: the config is never run (#2641). A member
|
|
177
|
+
* whose settings can't be read that way gets {@link MemberLedgerFacts.unread}
|
|
178
|
+
* with the reason, and no stack or environments.
|
|
179
|
+
*/
|
|
180
|
+
export async function gatherLedgerFacts(root, declaration) {
|
|
181
|
+
const { readConfigFieldsStatically } = await import("../../config-static.js");
|
|
182
|
+
const { ChantConfigSchema, environmentNames, resolveOwnershipStack } = await import("../../config.js");
|
|
183
|
+
const facts = [];
|
|
184
|
+
for (const m of declaration.members) {
|
|
185
|
+
if (m.kind !== "chant")
|
|
186
|
+
continue;
|
|
187
|
+
const dir = join(root, m.dir);
|
|
188
|
+
const base = { name: m.name, dir: m.dir, chantVersion: memberChantVersion(dir) };
|
|
189
|
+
const read = readConfigFieldsStatically(dir, LEDGER_FIELDS);
|
|
190
|
+
// No config: the kind probe reports the member (WSP005).
|
|
191
|
+
if (read.status === "no-config")
|
|
192
|
+
continue;
|
|
193
|
+
const file = relative(root, read.configPath).split(sep).join("/");
|
|
194
|
+
const unread = (reason) => facts.push({ ...base, stack: null, environments: [], unread: `${file} can't be read without running it (${reason})` });
|
|
195
|
+
if (read.status === "unknown") {
|
|
196
|
+
unread(read.reason);
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const parsed = ChantConfigSchema.pick({ ownership: true, environments: true }).safeParse(read.fields);
|
|
200
|
+
if (!parsed.success) {
|
|
201
|
+
unread(`its ${String(parsed.error.issues[0]?.path[0] ?? "settings")} value is not what a chant config takes`);
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const config = parsed.data;
|
|
205
|
+
const environments = [...(environmentNames(config.environments) ?? [])];
|
|
206
|
+
const literalEnv = config.ownership?.env;
|
|
207
|
+
if (typeof literalEnv === "string" && !environments.includes(literalEnv))
|
|
208
|
+
environments.push(literalEnv);
|
|
209
|
+
facts.push({ ...base, stack: resolveOwnershipStack(config) ?? null, environments });
|
|
210
|
+
}
|
|
211
|
+
return facts;
|
|
212
|
+
}
|