@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,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-emit a release-ledger record from a successful `chant run --components
|
|
3
|
+
* <name> --env <env>` (#597, follow-up to #568/epic #551). Before this, the
|
|
4
|
+
* release ledger (../lifecycle/release-ledger.ts) was only populated by the
|
|
5
|
+
* standalone `chant components release <env>` command — a deploy that never
|
|
6
|
+
* called it left the ledger silently empty. This module makes recording
|
|
7
|
+
* happen *by construction*: the CLI's post-run step (`runOpComponents`)
|
|
8
|
+
* calls `maybeRecordAutoRelease` after the run reports success.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately CLI-side, not driver-side or workflow-side:
|
|
11
|
+
* - `../components/driver.ts` stays capability-agnostic — it already
|
|
12
|
+
* resists per-component/per-capability branching, and "write to git"
|
|
13
|
+
* is exactly the kind of side effect that doesn't belong in a step
|
|
14
|
+
* dispatcher tests exercise against a bare `CapabilityRegistry`.
|
|
15
|
+
* - A ledger write is a non-idempotent git push with real-world side
|
|
16
|
+
* effects (network, `Date.now()`, file writes) — the kind of thing that
|
|
17
|
+
* belongs at the edge of a run rather than inside a step a retry may run
|
|
18
|
+
* a second time. It happens in the CLI, once the run has reported a
|
|
19
|
+
* terminal outcome.
|
|
20
|
+
*
|
|
21
|
+
* Reuses ../lifecycle/release-ledger.ts's `appendReleaseRecord` verbatim —
|
|
22
|
+
* this module only decides *whether* to call it and *what digest* to record,
|
|
23
|
+
* mirroring the field-resolution `runComponentsReleaseRecord`
|
|
24
|
+
* (../cli/handlers/components.ts) already does for the standalone command
|
|
25
|
+
* (`--git-sha` defaults to HEAD, `--run-id`/`--actor` fall back to common CI
|
|
26
|
+
* env vars, timestamp is a real `new Date()` taken at record time).
|
|
27
|
+
*/
|
|
28
|
+
import { getHeadCommit, pushLifecycle, StaleLifecycleBranchError } from "../lifecycle/git.js";
|
|
29
|
+
import { appendReleaseRecord, InvalidReleaseRecordError } from "../lifecycle/release-ledger.js";
|
|
30
|
+
/**
|
|
31
|
+
* A step output that represents a *promoted* artifact — a publish-family result
|
|
32
|
+
* (publish-image / publish-artifact / load-image-on-host), identified by the
|
|
33
|
+
* location `uri` all three carry (`repo@sha256:…`, `host:…#…`, an artifact URL).
|
|
34
|
+
* This deliberately excludes outputs that carry only a content `digest`: e.g.
|
|
35
|
+
* `generate-sbom`'s `digest` is the SBOM document's own bytes, and
|
|
36
|
+
* `extract-config-bom` likewise *describes* an artifact rather than promoting
|
|
37
|
+
* one. Those must not trigger a release record (#665) — a release means "we
|
|
38
|
+
* promoted this by digest to a location", not "we hashed some bytes". The
|
|
39
|
+
* driver's own `collectComponentOutputs` stays looser (uri/digest/key) because it
|
|
40
|
+
* only feeds `@<component>.publish.*` wiring, where a false positive is harmless.
|
|
41
|
+
*/
|
|
42
|
+
export function isPromotedArtifact(output) {
|
|
43
|
+
return !!output && typeof output === "object" && "uri" in output && typeof output.uri === "string";
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Extract the artifact digest a component run promoted, by scanning its step
|
|
47
|
+
* records for the last {@link isPromotedArtifact promoted-artifact} output (a
|
|
48
|
+
* publish-family result carrying a location `uri`) and taking its `digest`, so
|
|
49
|
+
* a release record is only ever attempted when the run actually promoted
|
|
50
|
+
* something by digest. Returns undefined when no step promoted an artifact —
|
|
51
|
+
* e.g. a component whose deploy has no publish step, even if it ran
|
|
52
|
+
* `generate-sbom` (whose content `digest` is not a promotion, #665) — the
|
|
53
|
+
* caller treats that as "nothing to record", not an error. Used by the
|
|
54
|
+
* local-executor CLI path, which has the full `DriverStepRecord[]` from
|
|
55
|
+
* `runComponentDeploy`.
|
|
56
|
+
*/
|
|
57
|
+
export function extractRunDigest(records) {
|
|
58
|
+
let found;
|
|
59
|
+
for (const record of records) {
|
|
60
|
+
if (record.status !== "ok")
|
|
61
|
+
continue;
|
|
62
|
+
if (isPromotedArtifact(record.output) && typeof record.output.digest === "string") {
|
|
63
|
+
found = record.output.digest;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return found;
|
|
67
|
+
}
|
|
68
|
+
function resolveActor(override) {
|
|
69
|
+
return override ?? process.env.GITHUB_ACTOR ?? process.env.GITLAB_USER_LOGIN ?? process.env.USER;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* After a successful `chant run --components <name> --env <env>`, append
|
|
73
|
+
* exactly one immutable release record to the ledger and push it — or
|
|
74
|
+
* explain, without throwing, why it didn't. Never called for a failed run
|
|
75
|
+
* (`run.success` must be true before the caller invokes this at all; see
|
|
76
|
+
* `runOpComponents`) — a failed
|
|
77
|
+
* deploy writes nothing, by construction, since this function is simply
|
|
78
|
+
* never reached on that path.
|
|
79
|
+
*
|
|
80
|
+
* Skips (returns `{ recorded: false, reason }`, never throws for these
|
|
81
|
+
* expected cases):
|
|
82
|
+
* - `options.disabled` — the opt-out flag/config was set.
|
|
83
|
+
* - `run.success` false — defensive; callers should not reach here on failure.
|
|
84
|
+
* - no digest found in the run's records — a component with no publish step
|
|
85
|
+
* has nothing to bind a release record to.
|
|
86
|
+
* - no resolvable actor — mirrors `runComponentsReleaseRecord`'s hard
|
|
87
|
+
* requirement; an unattributed record defeats the ledger's purpose.
|
|
88
|
+
*
|
|
89
|
+
* Git-sha resolution failure and ledger-write failures
|
|
90
|
+
* (`InvalidReleaseRecordError`, `StaleLifecycleBranchError`, or any other
|
|
91
|
+
* error `appendReleaseRecord`/`pushLifecycle` throw) are reported as `{
|
|
92
|
+
* recorded: false, reason: "error", error }` rather than propagated — an
|
|
93
|
+
* auto-recorded ledger write is a best-effort observability side effect of a
|
|
94
|
+
* successful deploy; it must never turn a successful `chant run --components`
|
|
95
|
+
* into a failing CLI invocation. The caller should still surface the message
|
|
96
|
+
* as a warning.
|
|
97
|
+
*/
|
|
98
|
+
export async function maybeRecordAutoRelease(run, options = {}) {
|
|
99
|
+
if (options.disabled) {
|
|
100
|
+
return { recorded: false, reason: "opted-out" };
|
|
101
|
+
}
|
|
102
|
+
if (!run.success) {
|
|
103
|
+
return { recorded: false, reason: "run-not-successful" };
|
|
104
|
+
}
|
|
105
|
+
const digest = run.digest ?? extractRunDigest(run.records ?? []);
|
|
106
|
+
if (!digest) {
|
|
107
|
+
return { recorded: false, reason: "no-digest", detail: `component "${run.component}" published no digest-bearing artifact` };
|
|
108
|
+
}
|
|
109
|
+
const actor = resolveActor(options.actor);
|
|
110
|
+
if (!actor) {
|
|
111
|
+
return { recorded: false, reason: "no-actor", detail: "could not resolve an actor from GITHUB_ACTOR/GITLAB_USER_LOGIN/USER" };
|
|
112
|
+
}
|
|
113
|
+
let gitSha = options.gitSha;
|
|
114
|
+
try {
|
|
115
|
+
gitSha ?? (gitSha = await getHeadCommit({ cwd: options.cwd }));
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
return { recorded: false, reason: "error", error: err instanceof Error ? err.message : String(err) };
|
|
119
|
+
}
|
|
120
|
+
const timestamp = new Date().toISOString();
|
|
121
|
+
try {
|
|
122
|
+
const { commit, record } = await appendReleaseRecord({
|
|
123
|
+
component: run.component,
|
|
124
|
+
env: run.env,
|
|
125
|
+
digest,
|
|
126
|
+
gitSha,
|
|
127
|
+
runId: run.runId,
|
|
128
|
+
...(run.runOrigin ? { runOrigin: run.runOrigin } : {}),
|
|
129
|
+
timestamp,
|
|
130
|
+
actor,
|
|
131
|
+
...(run.profileOverride ? { profileOverride: run.profileOverride } : {}),
|
|
132
|
+
...(run.inputDigest ? { inputDigest: run.inputDigest } : {}),
|
|
133
|
+
}, { cwd: options.cwd });
|
|
134
|
+
await pushLifecycle({ cwd: options.cwd });
|
|
135
|
+
return { recorded: true, commit, record };
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
if (err instanceof InvalidReleaseRecordError || err instanceof StaleLifecycleBranchError) {
|
|
139
|
+
return { recorded: false, reason: "error", error: err.message };
|
|
140
|
+
}
|
|
141
|
+
return { recorded: false, reason: "error", error: err instanceof Error ? err.message : String(err) };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed step-builder API (#658) — ergonomic sugar over the kind-literal
|
|
3
|
+
* `Step`/`BuildSpec` contract. `phase("Verify", [healthGate({ path })])`
|
|
4
|
+
* is exactly `phase("Verify", [{ kind: "health-gate", path }])`, but
|
|
5
|
+
* with per-verb argument checking and autocomplete from each capability's own
|
|
6
|
+
* `Input` type. Core exports the agnostic verbs' builders; a lexicon exports
|
|
7
|
+
* its own (e.g. the aws lexicon's `cfnDeploy`, reusing the exported `step`).
|
|
8
|
+
*
|
|
9
|
+
* These are pure projections: a builder returns the same kind-literal the
|
|
10
|
+
* driver dispatches on (see ./component.ts's `Step`), so the JSON contract
|
|
11
|
+
* (component.schema.json) stays authoritative and a hand-written or
|
|
12
|
+
* non-chant-authored component keeps working. The runtime `Capability`
|
|
13
|
+
* objects live under `*Capability` names (./verbs/*), registered by `.kind`.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Build a `(input) => Step` for one deploy verb: tags the input with its
|
|
17
|
+
* `kind`. Exported so a lexicon's capability plugin (e.g. the aws lexicon,
|
|
18
|
+
* which owns the `cfn-deploy`/`emr-*`/… builders) can offer the same typed
|
|
19
|
+
* sugar for its own verbs without re-implementing this projection.
|
|
20
|
+
*/
|
|
21
|
+
export function step(kind) {
|
|
22
|
+
return (input) => ({ kind, ...input });
|
|
23
|
+
}
|
|
24
|
+
/** Build a `(input) => BuildSpec` for one build verb (the `build` field, not `deploy`). */
|
|
25
|
+
function buildSpec(kind) {
|
|
26
|
+
return (input) => ({ kind, ...input });
|
|
27
|
+
}
|
|
28
|
+
// ── build family → BuildSpec (the component's `build` field) ─────────────────
|
|
29
|
+
export const dockerBuild = buildSpec("docker-build");
|
|
30
|
+
export const zipPackage = buildSpec("zip-package");
|
|
31
|
+
export const jvmBuild = buildSpec("jvm-build");
|
|
32
|
+
// ── sbom ─────────────────────────────────────────────────────────────────────
|
|
33
|
+
export const generateSbom = step("generate-sbom");
|
|
34
|
+
// ── supply-chain security / policy ───────────────────────────────────────────
|
|
35
|
+
export const sign = step("sign");
|
|
36
|
+
export const attestProvenance = step("attest-provenance");
|
|
37
|
+
export const verify = step("verify");
|
|
38
|
+
export const scanVulnerabilities = step("scan-vulnerabilities");
|
|
39
|
+
export const vulnGate = step("vuln-gate");
|
|
40
|
+
// ── wait / verify (agnostic) ─────────────────────────────────────────────────
|
|
41
|
+
// The cloud-specific waits (`wait-for-stack`/`wait-steady-state`/`wait-job`)
|
|
42
|
+
// ship as builders from the aws lexicon, alongside their capabilities.
|
|
43
|
+
export const waitClusterHealthy = step("wait-cluster-healthy");
|
|
44
|
+
export const waitEndpoint = step("wait-endpoint");
|
|
45
|
+
export const healthGate = step("health-gate");
|
|
46
|
+
// ── escape hatch ─────────────────────────────────────────────────────────────
|
|
47
|
+
export const shell = step("shell");
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery + loading for capability plugins — the capability-side analogue
|
|
3
|
+
* of ../cli/plugins.ts's `loadPlugin`/`loadPlugins` for lexicons.
|
|
4
|
+
*
|
|
5
|
+
* Naming convention mirrors lexicons exactly, substituting "capability" for
|
|
6
|
+
* "lexicon": a capability plugin package is
|
|
7
|
+
* `@intentius/chant-capability-<name>` and is expected to export a value
|
|
8
|
+
* satisfying `CapabilityPlugin` (./capability-plugin.ts), detected at
|
|
9
|
+
* runtime with `isCapabilityPlugin` — the same dynamic-import + shape-guard
|
|
10
|
+
* strategy `loadPlugin` uses for `@intentius/chant-lexicon-<name>`.
|
|
11
|
+
*
|
|
12
|
+
* `buildCapabilityRegistry` is the Phase 2 replacement for Phase 1's
|
|
13
|
+
* `createCapabilityRegistry` (./registry.ts): it always loads the built-in
|
|
14
|
+
* `starterCapabilityPlugin` (./starter-plugin.ts) first — preserving every
|
|
15
|
+
* Phase 1 kind with zero behavior change — then loads any additional
|
|
16
|
+
* requested plugin packages on top, registering every capability they
|
|
17
|
+
* contribute into one `CapabilityRegistry` the driver resolves verbs
|
|
18
|
+
* through. Duplicate `kind` registration across plugins throws (via
|
|
19
|
+
* `CapabilityRegistry.register`'s existing guard), the same hard-conflict
|
|
20
|
+
* discipline `checkConflicts` (../cli/conflict-check.ts) applies to
|
|
21
|
+
* duplicate lexicon rule IDs.
|
|
22
|
+
*/
|
|
23
|
+
import { CapabilityRegistry } from "./capability.js";
|
|
24
|
+
import { lexiconModulePath, importLexiconPackage } from "../lexicon-module.js";
|
|
25
|
+
import { isCapabilityPlugin } from "./capability-plugin.js";
|
|
26
|
+
import { starterCapabilityPlugin } from "./starter-plugin.js";
|
|
27
|
+
/** Thrown when a dynamically-imported capability package does not satisfy `CapabilityPlugin` — the "malformed capability package" case #559 asks doctor/validation to detect. */
|
|
28
|
+
export class MalformedCapabilityPluginError extends Error {
|
|
29
|
+
constructor(packageName, reason) {
|
|
30
|
+
super(`capability plugin package "${packageName}" is malformed: ${reason}`);
|
|
31
|
+
this.packageName = packageName;
|
|
32
|
+
this.name = "MalformedCapabilityPluginError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Thrown when two loaded capability plugins register the same `kind` — mirrors the lexicon loader's hard rule-ID conflict. */
|
|
36
|
+
export class DuplicateCapabilityKindError extends Error {
|
|
37
|
+
constructor(kind, plugins) {
|
|
38
|
+
super(`capability "${kind}" is registered by more than one plugin: ${plugins.join(", ")}`);
|
|
39
|
+
this.kind = kind;
|
|
40
|
+
this.plugins = plugins;
|
|
41
|
+
this.name = "DuplicateCapabilityKindError";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Dynamically import and validate a single capability plugin package by
|
|
46
|
+
* name. Mirrors ../cli/plugins.ts's `loadPlugin` for lexicons: imports
|
|
47
|
+
* `@intentius/chant-capability-{name}`, scans its exports for a value
|
|
48
|
+
* satisfying `isCapabilityPlugin`, and throws a descriptive
|
|
49
|
+
* `MalformedCapabilityPluginError` if the package exists but exports nothing
|
|
50
|
+
* usable (the malformed-package case), or the original import error if the
|
|
51
|
+
* package cannot be found at all.
|
|
52
|
+
*/
|
|
53
|
+
export async function loadCapabilityPlugin(name) {
|
|
54
|
+
const packageName = `@intentius/chant-capability-${name}`;
|
|
55
|
+
let mod;
|
|
56
|
+
try {
|
|
57
|
+
mod = (await importLexiconPackage(packageName));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
throw new Error(`capability plugin package "${packageName}" could not be loaded: ${err instanceof Error ? err.message : String(err)}`);
|
|
61
|
+
}
|
|
62
|
+
for (const value of Object.values(mod)) {
|
|
63
|
+
if (isCapabilityPlugin(value)) {
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
throw new MalformedCapabilityPluginError(packageName, `does not export a CapabilityPlugin (expected an export with string "name", string "version", and a "capabilities" function)`);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Load and initialize multiple named capability plugins, in order. Calls
|
|
71
|
+
* `init()` on each plugin if present — mirrors `loadPlugins`'s lexicon
|
|
72
|
+
* `init()` hook.
|
|
73
|
+
*/
|
|
74
|
+
export async function loadCapabilityPlugins(names) {
|
|
75
|
+
const plugins = [];
|
|
76
|
+
for (const name of names) {
|
|
77
|
+
const plugin = await loadCapabilityPlugin(name);
|
|
78
|
+
if (plugin.init) {
|
|
79
|
+
await plugin.init();
|
|
80
|
+
}
|
|
81
|
+
plugins.push(plugin);
|
|
82
|
+
}
|
|
83
|
+
return plugins;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Load the capability plugin a *lexicon* package contributes, if any. A cloud
|
|
87
|
+
* lexicon (`@intentius/chant-lexicon-<name>`) is the natural home for that
|
|
88
|
+
* cloud's operational leaves (`cfn-deploy`, `emr-*`, …) — the same seam that
|
|
89
|
+
* already carries the lexicon's synthesis, `describeResources`, and ownership
|
|
90
|
+
* markers (docs/components/cloud-boundary). So when a project declares
|
|
91
|
+
* `lexicons: ["aws"]`, its aws leaves come along automatically: this imports
|
|
92
|
+
* the lexicon package and returns the first export satisfying
|
|
93
|
+
* `isCapabilityPlugin`.
|
|
94
|
+
*
|
|
95
|
+
* Tolerant by design — a lexicon that contributes *no* capabilities (most do
|
|
96
|
+
* not yet) simply returns `null` rather than throwing, unlike
|
|
97
|
+
* `loadCapabilityPlugin`'s strict `@intentius/chant-capability-<name>` contract
|
|
98
|
+
* where the package's whole reason to exist is the plugin.
|
|
99
|
+
*/
|
|
100
|
+
export async function loadCapabilityPluginFromLexicon(name) {
|
|
101
|
+
// chant #2520 — a lexicon declared by module path is imported from that path.
|
|
102
|
+
const packageName = lexiconModulePath(name) ?? `@intentius/chant-lexicon-${name}`;
|
|
103
|
+
let mod;
|
|
104
|
+
try {
|
|
105
|
+
mod = (await importLexiconPackage(packageName));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null; // lexicon not installed / not resolvable here — nothing to contribute.
|
|
109
|
+
}
|
|
110
|
+
for (const value of Object.values(mod)) {
|
|
111
|
+
if (isCapabilityPlugin(value))
|
|
112
|
+
return value;
|
|
113
|
+
}
|
|
114
|
+
return null; // lexicon present but contributes no capability plugin.
|
|
115
|
+
}
|
|
116
|
+
/** Load the capability plugins contributed by the given lexicons (skipping those that contribute none), initializing each. */
|
|
117
|
+
export async function loadCapabilityPluginsFromLexicons(names) {
|
|
118
|
+
const plugins = [];
|
|
119
|
+
for (const name of names) {
|
|
120
|
+
const plugin = await loadCapabilityPluginFromLexicon(name);
|
|
121
|
+
if (!plugin)
|
|
122
|
+
continue;
|
|
123
|
+
if (plugin.init)
|
|
124
|
+
await plugin.init();
|
|
125
|
+
plugins.push(plugin);
|
|
126
|
+
}
|
|
127
|
+
return plugins;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Register every capability every plugin contributes into one registry, in
|
|
131
|
+
* plugin order. Throws `DuplicateCapabilityKindError` if two plugins
|
|
132
|
+
* register the same `kind` (via a pre-check, so the error names every
|
|
133
|
+
* offending plugin rather than surfacing only the second registration
|
|
134
|
+
* attempt's generic `CapabilityRegistry.register` message).
|
|
135
|
+
*/
|
|
136
|
+
export function registerCapabilityPlugins(registry, plugins) {
|
|
137
|
+
const owners = new Map();
|
|
138
|
+
for (const plugin of plugins) {
|
|
139
|
+
for (const capability of plugin.capabilities()) {
|
|
140
|
+
const existing = owners.get(capability.kind) ?? [];
|
|
141
|
+
existing.push(plugin.name);
|
|
142
|
+
owners.set(capability.kind, existing);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const [kind, pluginNames] of owners) {
|
|
146
|
+
if (pluginNames.length > 1) {
|
|
147
|
+
throw new DuplicateCapabilityKindError(kind, pluginNames);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
for (const plugin of plugins) {
|
|
151
|
+
for (const capability of plugin.capabilities()) {
|
|
152
|
+
registry.register(capability);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return registry;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Build a `CapabilityRegistry` through the Phase 2 plugin contract: always
|
|
159
|
+
* registers the built-in `starterCapabilityPlugin` first (preserving every
|
|
160
|
+
* Phase 1 `kind` — see ./starter-plugin.ts), then loads and registers any
|
|
161
|
+
* additional named plugin packages. This is the Phase 2 entry point;
|
|
162
|
+
* `createCapabilityRegistry` (./registry.ts) remains available and now
|
|
163
|
+
* delegates to this same starter plugin, so existing Phase 1 callers (and
|
|
164
|
+
* the pilots) are unaffected.
|
|
165
|
+
*/
|
|
166
|
+
export async function buildCapabilityRegistry(options = {}) {
|
|
167
|
+
const registry = new CapabilityRegistry();
|
|
168
|
+
const plugins = [];
|
|
169
|
+
if (options.includeStarter !== false) {
|
|
170
|
+
plugins.push(starterCapabilityPlugin);
|
|
171
|
+
}
|
|
172
|
+
plugins.push(...(await loadCapabilityPluginsFromLexicons(options.lexicons ?? [])));
|
|
173
|
+
plugins.push(...(await loadCapabilityPlugins(options.plugins ?? [])));
|
|
174
|
+
return registerCapabilityPlugins(registry, plugins);
|
|
175
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schema + validation for `CapabilityManifest` (./capability-plugin.ts) —
|
|
3
|
+
* the capability-side analogue of ../lexicon-schema.ts's
|
|
4
|
+
* `LexiconManifestSchema`/`validateManifest`. Used to detect a malformed
|
|
5
|
+
* capability package's manifest (#559 acceptance criteria: "Doctor/validation
|
|
6
|
+
* covers a malformed capability package") with the same descriptive-error
|
|
7
|
+
* shape lexicon manifest validation uses.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
const semverRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?(\+[a-zA-Z0-9.]+)?$/;
|
|
11
|
+
export const CapabilityManifestSchema = z.object({
|
|
12
|
+
name: z.string().min(1, "manifest name must not be empty"),
|
|
13
|
+
version: z.string().regex(semverRegex, "version must be valid semver (X.Y.Z)"),
|
|
14
|
+
chantVersion: z.string().optional(),
|
|
15
|
+
kinds: z.array(z.string().min(1)).optional(),
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Validate a capability manifest from unknown input (object or JSON string).
|
|
19
|
+
* Throws a descriptive error on invalid input — mirrors
|
|
20
|
+
* ../lexicon-schema.ts's `validateManifest`.
|
|
21
|
+
*/
|
|
22
|
+
export function validateCapabilityManifest(data) {
|
|
23
|
+
if (data === null || data === undefined) {
|
|
24
|
+
throw new Error("capability manifest data is empty");
|
|
25
|
+
}
|
|
26
|
+
if (typeof data === "string") {
|
|
27
|
+
try {
|
|
28
|
+
data = JSON.parse(data);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const msg = err instanceof SyntaxError ? err.message : String(err);
|
|
32
|
+
throw new Error(`invalid JSON in capability manifest: ${msg}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
36
|
+
throw new Error("capability manifest must be a JSON object");
|
|
37
|
+
}
|
|
38
|
+
const result = CapabilityManifestSchema.safeParse(data);
|
|
39
|
+
if (!result.success) {
|
|
40
|
+
const issue = result.error.issues[0];
|
|
41
|
+
const path = issue.path.length > 0 ? issue.path.join(".") : undefined;
|
|
42
|
+
const prefix = path ? `capability manifest field ${path}` : "capability manifest";
|
|
43
|
+
throw new Error(`${prefix}: ${issue.message}`);
|
|
44
|
+
}
|
|
45
|
+
return result.data;
|
|
46
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability plugin contract — Phase 2 (#559, epic #551).
|
|
3
|
+
*
|
|
4
|
+
* Promotes the Phase 1 capability registry convention
|
|
5
|
+
* (`createCapabilityRegistry`/`STARTER_VERB_FAMILIES`, ./registry.ts) to a
|
|
6
|
+
* first-class chant plugin contract, mirroring the lexicon plugin contract
|
|
7
|
+
* (../lexicon.ts, ../cli/plugins.ts) so capabilities become typed,
|
|
8
|
+
* discoverable packages resolved by `kind`, the same way lexicons are
|
|
9
|
+
* discovered and resolved by resource type.
|
|
10
|
+
*
|
|
11
|
+
* Shape parity with `LexiconPlugin` (../lexicon.ts):
|
|
12
|
+
* - `name`/`version` mirror `LexiconManifest.name`/`.version`.
|
|
13
|
+
* - `capabilities()` is the required lifecycle method (like a lexicon's
|
|
14
|
+
* `serializer`/`generate`/`validate`) every capability package must
|
|
15
|
+
* implement — it returns the typed `Capability` instances this package
|
|
16
|
+
* contributes, registered by `kind` the same way a lexicon's resource
|
|
17
|
+
* types are registered by `resourceType`.
|
|
18
|
+
* - `families()`, `init()` are optional extensions, mirroring
|
|
19
|
+
* `LexiconPlugin`'s optional `lintRules`/`init`/etc.
|
|
20
|
+
* - `isCapabilityPlugin` is the runtime type guard `loadCapabilityPlugin`
|
|
21
|
+
* (./capability-plugin-loader.ts) uses to validate a dynamically-imported
|
|
22
|
+
* package before trusting it — the same defensive shape check
|
|
23
|
+
* `isLexiconPlugin` performs for lexicons.
|
|
24
|
+
*
|
|
25
|
+
* The starter verb set (./registry.ts) becomes the built-in, always-loaded
|
|
26
|
+
* plugin (`starterCapabilityPlugin`, ./starter-plugin.ts) under this same
|
|
27
|
+
* contract — see that module's docstring for the Phase 1 -> Phase 2
|
|
28
|
+
* migration path and the "no behavior change" guarantee.
|
|
29
|
+
*/
|
|
30
|
+
import { readFileSync } from "node:fs";
|
|
31
|
+
import { dirname, join } from "node:path";
|
|
32
|
+
import { fileURLToPath } from "node:url";
|
|
33
|
+
/**
|
|
34
|
+
* Type guard to check if a value is a `CapabilityPlugin`. Checks for the
|
|
35
|
+
* required `name`/`version`/`capabilities` shape, the same defensive check
|
|
36
|
+
* `isLexiconPlugin` (../lexicon.ts) performs before a dynamically-imported
|
|
37
|
+
* package is trusted and registered. This is also chant's detector for a
|
|
38
|
+
* *malformed* capability package (#559 acceptance criteria): a package
|
|
39
|
+
* missing any of these fails the guard and is rejected by the loader with a
|
|
40
|
+
* descriptive error rather than registered half-working.
|
|
41
|
+
*/
|
|
42
|
+
export function isCapabilityPlugin(value) {
|
|
43
|
+
if (typeof value !== "object" ||
|
|
44
|
+
value === null ||
|
|
45
|
+
!("name" in value) ||
|
|
46
|
+
typeof value.name !== "string" ||
|
|
47
|
+
!("version" in value) ||
|
|
48
|
+
typeof value.version !== "string") {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const obj = value;
|
|
52
|
+
return typeof obj.capabilities === "function";
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The calling module's own package version, read from the nearest
|
|
56
|
+
* `package.json` above it (chant #1505).
|
|
57
|
+
*
|
|
58
|
+
* `CapabilityPlugin.version` documents itself as the plugin package's semver,
|
|
59
|
+
* but chant's packages release in lockstep, so a hardcoded literal goes stale
|
|
60
|
+
* on every `just release` — the aws plugin shipped `"1.0.0"` from the day it
|
|
61
|
+
* was extracted from the starter set (#681), and the k8s plugin's authoring-
|
|
62
|
+
* time `"0.41.0"` was stale one release later. Walking up from the module's
|
|
63
|
+
* own URL survives both the `src/` (development condition) and `dist/`
|
|
64
|
+
* layouts, and an npm install, without any build-time stamping.
|
|
65
|
+
*
|
|
66
|
+
* Returns `"0.0.0"` when no versioned `package.json` is found — a visible
|
|
67
|
+
* sentinel rather than a guess; nothing gates on the field.
|
|
68
|
+
*
|
|
69
|
+
* Call it lazily (from a `get version()` accessor, as the built-in plugins
|
|
70
|
+
* do), not at module scope: the read touches the filesystem, and a plugin
|
|
71
|
+
* module must stay importable where `fs` is absent (workerd, chant #1081).
|
|
72
|
+
* The result is cached per module URL, so the walk happens once.
|
|
73
|
+
*/
|
|
74
|
+
export function ownPackageVersion(moduleUrl) {
|
|
75
|
+
const cached = ownVersionCache.get(moduleUrl);
|
|
76
|
+
if (cached !== undefined)
|
|
77
|
+
return cached;
|
|
78
|
+
const found = findPackageVersion(moduleUrl);
|
|
79
|
+
ownVersionCache.set(moduleUrl, found);
|
|
80
|
+
return found;
|
|
81
|
+
}
|
|
82
|
+
const ownVersionCache = new Map();
|
|
83
|
+
function findPackageVersion(moduleUrl) {
|
|
84
|
+
let dir = dirname(fileURLToPath(moduleUrl));
|
|
85
|
+
for (;;) {
|
|
86
|
+
try {
|
|
87
|
+
const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf-8"));
|
|
88
|
+
if (typeof pkg.version === "string")
|
|
89
|
+
return pkg.version;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// No package.json here (or unreadable) — keep walking up.
|
|
93
|
+
}
|
|
94
|
+
const parent = dirname(dir);
|
|
95
|
+
if (parent === dir)
|
|
96
|
+
return "0.0.0";
|
|
97
|
+
dir = parent;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability contract — the typed leaf behavior components compose from.
|
|
3
|
+
*
|
|
4
|
+
* A capability is a verb ("docker-build", "cfn-deploy", "wait-steady-state"),
|
|
5
|
+
* never a noun (never named after the component that happens to use it).
|
|
6
|
+
* Registered once by `kind`, dispatched by the orchestrator, composed by an
|
|
7
|
+
* unbounded number of components. See:
|
|
8
|
+
* https://intentius.io/chant/components/capabilities/
|
|
9
|
+
*
|
|
10
|
+
* This module defines the interface and registry only. Verb implementations
|
|
11
|
+
* live under `./verbs/*` as typed stubs — no cloud calls, no side effects.
|
|
12
|
+
* Cloud implementations are a later phase (see epic #551, issue #554).
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Thrown by a stub `run`/`rollback` — the verb is specified and typed but has
|
|
16
|
+
* no cloud implementation yet. Distinguishes "not implemented" from a runtime
|
|
17
|
+
* failure so callers (and tests) can assert on it specifically.
|
|
18
|
+
*/
|
|
19
|
+
export class CapabilityNotImplementedError extends Error {
|
|
20
|
+
constructor(kind) {
|
|
21
|
+
super(`capability "${kind}" is not implemented`);
|
|
22
|
+
this.kind = kind;
|
|
23
|
+
this.name = "CapabilityNotImplementedError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolves capabilities by `kind`. One registry instance is the composition
|
|
28
|
+
* root the orchestrator dispatches through; `createCapabilityRegistry` builds
|
|
29
|
+
* one pre-seeded with the starter verb set (see `./verbs`).
|
|
30
|
+
*/
|
|
31
|
+
export class CapabilityRegistry {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.capabilities = new Map();
|
|
34
|
+
}
|
|
35
|
+
/** Register a capability. Throws if `kind` is already registered — a capability is a verb, registered once. */
|
|
36
|
+
register(capability) {
|
|
37
|
+
if (this.capabilities.has(capability.kind)) {
|
|
38
|
+
throw new Error(`capability "${capability.kind}" is already registered`);
|
|
39
|
+
}
|
|
40
|
+
this.capabilities.set(capability.kind, capability);
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
/** Resolve a capability by `kind`. Throws a friendly error listing known kinds if absent. */
|
|
44
|
+
resolve(kind) {
|
|
45
|
+
const capability = this.capabilities.get(kind);
|
|
46
|
+
if (!capability) {
|
|
47
|
+
const known = [...this.capabilities.keys()].sort().join(", ");
|
|
48
|
+
throw new Error(`no capability registered for kind "${kind}" (known: ${known})`);
|
|
49
|
+
}
|
|
50
|
+
return capability;
|
|
51
|
+
}
|
|
52
|
+
/** True if a capability is registered for `kind`. */
|
|
53
|
+
has(kind) {
|
|
54
|
+
return this.capabilities.has(kind);
|
|
55
|
+
}
|
|
56
|
+
/** All registered kinds, sorted. */
|
|
57
|
+
kinds() {
|
|
58
|
+
return [...this.capabilities.keys()].sort();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The files a change touched, and the units lexicons own that those files
|
|
3
|
+
* belong to (#3183).
|
|
4
|
+
*
|
|
5
|
+
* `lifecycle affected` judges chant source by diffing what it builds. A unit
|
|
6
|
+
* that is not chant source, such as a hand-written Terraform root, never
|
|
7
|
+
* shows in that diff, so a lexicon that owns such units answers from the
|
|
8
|
+
* changed paths instead (`LexiconPlugin.changedUnits`).
|
|
9
|
+
*/
|
|
10
|
+
import { execFile } from "node:child_process";
|
|
11
|
+
import { posix } from "node:path";
|
|
12
|
+
import { promisify } from "node:util";
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
14
|
+
async function git(cwd, args) {
|
|
15
|
+
const { stdout } = await execFileAsync("git", args, { cwd, maxBuffer: 64 * 1024 * 1024 });
|
|
16
|
+
return stdout;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The commit a change is measured from: the merge base of `base` and `head`.
|
|
20
|
+
* A pull request's head that branched before `base` moved is measured from
|
|
21
|
+
* where it branched, so the other changes on `base` are not counted as its
|
|
22
|
+
* own; a merge commit's first parent is its own merge base.
|
|
23
|
+
*/
|
|
24
|
+
export async function resolveMergeBase(cwd, base, head = "HEAD") {
|
|
25
|
+
try {
|
|
26
|
+
return (await git(cwd, ["merge-base", base, head])).trim();
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const detail = err.stderr?.trim();
|
|
30
|
+
throw new Error(`cannot find where ${head} and ${base} meet${detail ? `: ${detail}` : ""}. ` +
|
|
31
|
+
"Is the base fetched? A CI checkout needs the history (fetch-depth: 0, GIT_DEPTH: 0).");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** The full commit `ref` names. */
|
|
35
|
+
export async function resolveCommit(cwd, ref) {
|
|
36
|
+
return (await git(cwd, ["rev-parse", "--verify", `${ref}^{commit}`])).trim();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Files changed between `base` and `head`, relative to `cwd`, with `/`
|
|
40
|
+
* separators. A rename counts as its old and its new path.
|
|
41
|
+
*
|
|
42
|
+
* Every changed file in the repository is listed, not only those under
|
|
43
|
+
* `cwd`: one outside it reads `../...`. A project in a workspace member
|
|
44
|
+
* (#3465) can call a module that lives in another member or beside the
|
|
45
|
+
* members, and a change there reaches it; `changedUnits` decides which of
|
|
46
|
+
* these paths matter.
|
|
47
|
+
*/
|
|
48
|
+
export async function changedFilesBetween(cwd, base, head = "HEAD") {
|
|
49
|
+
const prefix = (await git(cwd, ["rev-parse", "--show-prefix"])).trim().replace(/\/+$/, "");
|
|
50
|
+
const out = await git(cwd, ["diff", "--name-only", "-z", "--no-renames", "--no-relative", base, head]);
|
|
51
|
+
return out
|
|
52
|
+
.split("\0")
|
|
53
|
+
.filter(Boolean)
|
|
54
|
+
.map((file) => {
|
|
55
|
+
const rel = posix.relative(prefix, file);
|
|
56
|
+
return rel === "" ? "." : rel;
|
|
57
|
+
})
|
|
58
|
+
.sort();
|
|
59
|
+
}
|
|
60
|
+
/** The union of every plugin's `changedUnits` answer, sorted. */
|
|
61
|
+
export async function lexiconChangedUnits(plugins, ctx) {
|
|
62
|
+
if (ctx.changedFiles.length === 0)
|
|
63
|
+
return [];
|
|
64
|
+
const units = new Set();
|
|
65
|
+
for (const plugin of plugins) {
|
|
66
|
+
if (!plugin.changedUnits)
|
|
67
|
+
continue;
|
|
68
|
+
for (const unit of await plugin.changedUnits(ctx))
|
|
69
|
+
units.add(unit);
|
|
70
|
+
}
|
|
71
|
+
return [...units].sort();
|
|
72
|
+
}
|