@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,730 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant components` handlers — release ledger + status surface (#568, epic
|
|
3
|
+
* #551 "Build & deploy observability").
|
|
4
|
+
*
|
|
5
|
+
* Two subcommands:
|
|
6
|
+
* - `chant components release record` — append one immutable release record
|
|
7
|
+
* to the `chant/lifecycle` orphan branch (../../lifecycle/release-ledger.ts).
|
|
8
|
+
* A deploy composition calls this (typically from a `Verify` phase, or the
|
|
9
|
+
* CI job that ran `chant build --components --generate <lexicon>`) once
|
|
10
|
+
* the artifact digest, git sha, and run id are known.
|
|
11
|
+
* - `chant components status [env]` — the status surface: joins the release
|
|
12
|
+
* ledger against live evidence (`lifecycle diff --live` + ownership,
|
|
13
|
+
* reused via `buildChangeSet`) by digest, and reports what's built vs
|
|
14
|
+
* what's deployed where, flagging unrecorded deploys and drift.
|
|
15
|
+
*
|
|
16
|
+
* `componentBom`/`build.reproducibility` (#614) resolve to real data as of
|
|
17
|
+
* #609: for every recorded digest in an environment's ledger, this handler
|
|
18
|
+
* looks up the persisted `BuildArchiveManifest` that produced it
|
|
19
|
+
* (`findBuildManifestByArtifactDigest`, ../../lifecycle/build-ledger-
|
|
20
|
+
* store.ts) and derives `buildsByDigest`/`componentBomByDigest` from it via
|
|
21
|
+
* `buildLedgerEntries`/`componentBomSummary` — the same derivation
|
|
22
|
+
* `build-ledger.test.ts` already exercises directly, now fed by a real
|
|
23
|
+
* manifest instead of a hand-built one. A digest with no persisted manifest
|
|
24
|
+
* (predates #609, or was recorded via `chant components release` alone with
|
|
25
|
+
* no corresponding build) simply has no entry in either map, so `build`/
|
|
26
|
+
* `componentBom` fall back to `null` exactly as before — no regression for
|
|
27
|
+
* ledgers with no persisted manifests at all.
|
|
28
|
+
*/
|
|
29
|
+
import { resolve, join, dirname } from "node:path";
|
|
30
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
31
|
+
import { getHeadCommit, fetchLifecycle, pushLifecycle, readSnapshot, snapshotStorageKey, StaleLifecycleBranchError } from "../../lifecycle/git.js";
|
|
32
|
+
import { appendReleaseRecord, readReleaseLedger, listReleaseEnvironments, latestPerComponent, resolveRunId, InvalidReleaseRecordError, } from "../../lifecycle/release-ledger.js";
|
|
33
|
+
import { persistReleasePlan, InvalidReleasePlanError } from "../../lifecycle/plan-ledger.js";
|
|
34
|
+
import { reconcileStatus, liveEvidenceFromChangeSet, compareAcrossEnvironments, mergeLiveEvidence } from "../../lifecycle/status.js";
|
|
35
|
+
import { commandBuildParams } from "../build-params-cli.js";
|
|
36
|
+
import { buildChangeSet } from "../../lifecycle/change-set.js";
|
|
37
|
+
import { buildLedgerEntries, componentBomSummary } from "../../lifecycle/build-ledger.js";
|
|
38
|
+
import { findBuildManifestByArtifactDigest, readBuildManifest } from "../../lifecycle/build-ledger-store.js";
|
|
39
|
+
import { loadChantConfig } from "../../config.js";
|
|
40
|
+
import { applyLiveEndpoint } from "../../live-endpoint.js";
|
|
41
|
+
import { isObservableDeclarable } from "../../declarable.js";
|
|
42
|
+
import { build } from "../../build.js";
|
|
43
|
+
import { discoverComponents } from "../../components/discover.js";
|
|
44
|
+
import { formatError, formatWarning, formatSuccess, formatBold } from "../format.js";
|
|
45
|
+
import { normalizeObservation, mergeObservations, unobservedAll } from "../../observation.js";
|
|
46
|
+
import { deployUnits } from "../../components/deploy-units.js";
|
|
47
|
+
import { sortedJsonReplacer } from "../../utils.js";
|
|
48
|
+
import { withoutReadFlags } from "../../lifecycle/legacy-digest.js";
|
|
49
|
+
/**
|
|
50
|
+
* chant components release <env> --component <name> --digest <sha256:...>
|
|
51
|
+
* [--git-sha <sha>] [--run-id <id>] [--actor <name>]
|
|
52
|
+
*
|
|
53
|
+
* `--git-sha` defaults to the current HEAD commit (`git rev-parse HEAD`);
|
|
54
|
+
* `--run-id` defaults to common CI run-id env vars
|
|
55
|
+
* (`GITHUB_RUN_ID`/`CI_PIPELINE_ID`) or a locally generated id; `--actor`
|
|
56
|
+
* defaults to common CI actor env vars
|
|
57
|
+
* (`GITHUB_ACTOR`/`GITLAB_USER_LOGIN`/`USER`) but must resolve to *something*
|
|
58
|
+
* — an unattributed release record defeats the point of a release ledger, so
|
|
59
|
+
* this is the one field with no silent fallback to a placeholder.
|
|
60
|
+
*
|
|
61
|
+
* The timestamp is always a real `new Date()` taken here, at record time —
|
|
62
|
+
* never threaded in from elsewhere and never mocked in production code, per
|
|
63
|
+
* #568: "the session cannot call Date.now() in some contexts; take the
|
|
64
|
+
* timestamp from the environment/CLI at record time."
|
|
65
|
+
*
|
|
66
|
+
* `--release-plan <file>` (ws-055, #2733) takes `--digest`'s place: the file is a
|
|
67
|
+
* release plan JSON object naming its own `digest` field, persisted
|
|
68
|
+
* content-addressed to `_plans/<digest>.json` (../../lifecycle/plan-
|
|
69
|
+
* ledger.ts) before the release record is appended, so the record's digest
|
|
70
|
+
* always names a plan this checkout can resolve. Passing both requires them
|
|
71
|
+
* to agree — a plan is content-addressed by its own digest, so a caller
|
|
72
|
+
* naming a different one is a mistake, not an override.
|
|
73
|
+
*/
|
|
74
|
+
export async function runComponentsReleaseRecord(ctx) {
|
|
75
|
+
const { args } = ctx;
|
|
76
|
+
const environment = args.extraPositional;
|
|
77
|
+
if (!environment) {
|
|
78
|
+
console.error(formatError({
|
|
79
|
+
message: "Environment is required: chant components release <env> --component <name> --digest <sha256:...>",
|
|
80
|
+
}));
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
const component = args.component;
|
|
84
|
+
let digest = args.digest;
|
|
85
|
+
let plan;
|
|
86
|
+
if (args.releasePlanFile) {
|
|
87
|
+
let raw;
|
|
88
|
+
try {
|
|
89
|
+
raw = await readFile(args.releasePlanFile, "utf-8");
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
console.error(formatError({ message: `Could not read --release-plan ${args.releasePlanFile}: ${err instanceof Error ? err.message : String(err)}` }));
|
|
93
|
+
return 1;
|
|
94
|
+
}
|
|
95
|
+
let parsed;
|
|
96
|
+
try {
|
|
97
|
+
parsed = JSON.parse(raw);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
console.error(formatError({ message: `--release-plan ${args.releasePlanFile} is not valid JSON: ${err instanceof Error ? err.message : String(err)}` }));
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
104
|
+
console.error(formatError({ message: `--release-plan ${args.releasePlanFile} must be a JSON object` }));
|
|
105
|
+
return 1;
|
|
106
|
+
}
|
|
107
|
+
plan = parsed;
|
|
108
|
+
if (typeof plan.digest !== "string" || plan.digest.length === 0) {
|
|
109
|
+
console.error(formatError({ message: `--release-plan ${args.releasePlanFile} is missing its own "digest" field — a release plan is content-addressed by its own digest` }));
|
|
110
|
+
return 1;
|
|
111
|
+
}
|
|
112
|
+
if (digest !== undefined && digest !== plan.digest) {
|
|
113
|
+
console.error(formatError({ message: `--digest ${digest} does not match --release-plan ${args.releasePlanFile}'s own digest ${plan.digest}` }));
|
|
114
|
+
return 1;
|
|
115
|
+
}
|
|
116
|
+
digest = plan.digest;
|
|
117
|
+
}
|
|
118
|
+
if (!component || !digest) {
|
|
119
|
+
console.error(formatError({
|
|
120
|
+
message: "--component and --digest are required",
|
|
121
|
+
hint: "chant components release <env> --component <name> --digest <sha256:...> [--release-plan <file>] [--git-sha <sha>] [--run-id <id>] [--actor <name>] [--approver <name>]",
|
|
122
|
+
}));
|
|
123
|
+
return 1;
|
|
124
|
+
}
|
|
125
|
+
const gitSha = args.gitSha ?? (await getHeadCommit().catch(() => undefined));
|
|
126
|
+
// Id + origin resolved together from the same environment (#2045), so the
|
|
127
|
+
// recorded runId always says which id space it lives in and how to reach it.
|
|
128
|
+
const { runId, runOrigin } = resolveRunId(args.runId);
|
|
129
|
+
const actor = args.actor ?? process.env.GITHUB_ACTOR ?? process.env.GITLAB_USER_LOGIN ?? process.env.USER;
|
|
130
|
+
// Who approved a gated change (#1035). Optional — omitted for an ungated
|
|
131
|
+
// change, and never defaulted to `actor`, since recording the approver as the
|
|
132
|
+
// triggerer would defeat the separation-of-duties the field exists to attest.
|
|
133
|
+
const approver = args.approver;
|
|
134
|
+
if (!gitSha) {
|
|
135
|
+
console.error(formatError({ message: "Could not resolve --git-sha (not in a git repo?) — pass it explicitly." }));
|
|
136
|
+
return 1;
|
|
137
|
+
}
|
|
138
|
+
if (!actor) {
|
|
139
|
+
console.error(formatError({
|
|
140
|
+
message: "Could not resolve --actor from the environment",
|
|
141
|
+
hint: "Pass --actor explicitly, or set GITHUB_ACTOR / GITLAB_USER_LOGIN / USER.",
|
|
142
|
+
}));
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
145
|
+
const timestamp = new Date().toISOString();
|
|
146
|
+
try {
|
|
147
|
+
if (plan)
|
|
148
|
+
await persistReleasePlan(plan);
|
|
149
|
+
const { commit, record } = await appendReleaseRecord({
|
|
150
|
+
component,
|
|
151
|
+
env: environment,
|
|
152
|
+
digest,
|
|
153
|
+
gitSha,
|
|
154
|
+
runId,
|
|
155
|
+
...(runOrigin ? { runOrigin } : {}),
|
|
156
|
+
timestamp,
|
|
157
|
+
actor,
|
|
158
|
+
...(approver ? { approver } : {}),
|
|
159
|
+
});
|
|
160
|
+
await pushLifecycle();
|
|
161
|
+
if (args.json) {
|
|
162
|
+
console.log(JSON.stringify(record, null, 2));
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
console.error(formatSuccess(`Recorded release: ${formatBold(component)}@${environment} -> ${digest} (commit ${commit.slice(0, 7)})`));
|
|
166
|
+
}
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
if (err instanceof InvalidReleaseRecordError || err instanceof InvalidReleasePlanError) {
|
|
171
|
+
console.error(formatError({ message: err.message }));
|
|
172
|
+
return 1;
|
|
173
|
+
}
|
|
174
|
+
if (err instanceof StaleLifecycleBranchError) {
|
|
175
|
+
console.error(formatError({
|
|
176
|
+
message: err.message,
|
|
177
|
+
hint: `Pull and retry: \`git fetch origin chant/lifecycle:chant/lifecycle\` && \`chant components release ${environment} --component ${component} --digest ${digest}\`.`,
|
|
178
|
+
}));
|
|
179
|
+
return 1;
|
|
180
|
+
}
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* chant components export <env> --component <name> [--digest <manifestDigest>]
|
|
186
|
+
* -o <dir> [--json]
|
|
187
|
+
*
|
|
188
|
+
* Materializes a persisted `BuildArchiveManifest` (#609,
|
|
189
|
+
* ../../lifecycle/build-ledger-store.ts) to a portable directory: every
|
|
190
|
+
* `image`/`template`/`asset`/`sbom` entry is copied byte-for-byte from where
|
|
191
|
+
* the build that produced it left it on disk (its `path`, resolved against
|
|
192
|
+
* the current working directory — the same directory a component's
|
|
193
|
+
* `docker-build`/`addArchiveTemplate`/etc. step wrote it into) under that
|
|
194
|
+
* same archive-relative path in `-o <dir>`, plus a `manifest.json` so the
|
|
195
|
+
* directory is self-describing without chant. No re-synthesis: this reads
|
|
196
|
+
* bytes a prior `chant build`/`run --components` already produced, never
|
|
197
|
+
* regenerates them (#929) — the "byte-identical, promote-by-digest" contract
|
|
198
|
+
* the build archive is built on (see ../../components/verbs/build-archive.ts).
|
|
199
|
+
*
|
|
200
|
+
* Manifest resolution:
|
|
201
|
+
* - `--digest <manifestDigest>` reads it directly (`readBuildManifest`),
|
|
202
|
+
* independent of any environment/release record.
|
|
203
|
+
* - Otherwise resolves "the manifest behind this component's most recent
|
|
204
|
+
* successful run" in `<env>`: the latest release record's own
|
|
205
|
+
* `manifestDigest` when it was recorded, else a reverse lookup by its
|
|
206
|
+
* promoted artifact digest (`findBuildManifestByArtifactDigest`) — the
|
|
207
|
+
* same join `chant components status` already performs.
|
|
208
|
+
*
|
|
209
|
+
* A source file missing on disk (the build that produced the manifest ran
|
|
210
|
+
* somewhere else, or its output was since cleaned) is reported per entry
|
|
211
|
+
* rather than silently dropped; the command exits non-zero so an incomplete
|
|
212
|
+
* export is never mistaken for a complete one.
|
|
213
|
+
*/
|
|
214
|
+
export async function runComponentsExport(ctx) {
|
|
215
|
+
const { args } = ctx;
|
|
216
|
+
const environment = args.extraPositional;
|
|
217
|
+
const component = args.component;
|
|
218
|
+
const outDir = args.output;
|
|
219
|
+
const usage = "chant components export <env> --component <name> [--digest <manifestDigest>] -o <dir>";
|
|
220
|
+
if (!outDir) {
|
|
221
|
+
console.error(formatError({ message: "-o/--output <dir> is required", hint: usage }));
|
|
222
|
+
return 1;
|
|
223
|
+
}
|
|
224
|
+
await fetchLifecycle();
|
|
225
|
+
let manifest;
|
|
226
|
+
if (args.digest) {
|
|
227
|
+
const resolved = await readBuildManifest(args.digest);
|
|
228
|
+
if (!resolved) {
|
|
229
|
+
console.error(formatError({ message: `No persisted build manifest found for digest ${args.digest}` }));
|
|
230
|
+
return 1;
|
|
231
|
+
}
|
|
232
|
+
if (component && resolved.component !== component) {
|
|
233
|
+
console.error(formatWarning({
|
|
234
|
+
message: `--component ${component} does not match the resolved manifest's component (${resolved.component}) — exporting the manifest at --digest ${args.digest} anyway`,
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
manifest = resolved;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
if (!environment || !component) {
|
|
241
|
+
console.error(formatError({
|
|
242
|
+
message: "Environment and --component are required unless --digest <manifestDigest> is given",
|
|
243
|
+
hint: usage,
|
|
244
|
+
}));
|
|
245
|
+
return 1;
|
|
246
|
+
}
|
|
247
|
+
const ledger = await readReleaseLedger(environment);
|
|
248
|
+
const latest = latestPerComponent(ledger.records).get(component);
|
|
249
|
+
if (!latest) {
|
|
250
|
+
console.error(formatError({
|
|
251
|
+
message: `No release record for component "${component}" in environment "${environment}"`,
|
|
252
|
+
}));
|
|
253
|
+
return 1;
|
|
254
|
+
}
|
|
255
|
+
const resolved = latest.manifestDigest
|
|
256
|
+
? await readBuildManifest(latest.manifestDigest)
|
|
257
|
+
: await findBuildManifestByArtifactDigest(latest.digest);
|
|
258
|
+
if (!resolved) {
|
|
259
|
+
console.error(formatError({
|
|
260
|
+
message: `No persisted build manifest found for ${component}@${environment}'s recorded digest ${latest.digest}`,
|
|
261
|
+
hint: "The build predates #609, or was recorded via `chant components release` alone with no corresponding `chant build`/`run --components`.",
|
|
262
|
+
}));
|
|
263
|
+
return 1;
|
|
264
|
+
}
|
|
265
|
+
manifest = resolved;
|
|
266
|
+
}
|
|
267
|
+
const targetDir = resolve(outDir);
|
|
268
|
+
const sourceRoot = resolve(".");
|
|
269
|
+
await mkdir(targetDir, { recursive: true });
|
|
270
|
+
const entries = [...manifest.contents].sort((a, b) => a.path.localeCompare(b.path));
|
|
271
|
+
const results = [];
|
|
272
|
+
for (const entry of entries) {
|
|
273
|
+
try {
|
|
274
|
+
const bytes = await readFile(resolve(sourceRoot, entry.path));
|
|
275
|
+
const target = join(targetDir, entry.path);
|
|
276
|
+
await mkdir(dirname(target), { recursive: true });
|
|
277
|
+
await writeFile(target, bytes);
|
|
278
|
+
results.push({ kind: entry.kind, path: entry.path, digest: entry.digest, status: "materialized" });
|
|
279
|
+
}
|
|
280
|
+
catch (err) {
|
|
281
|
+
results.push({
|
|
282
|
+
kind: entry.kind,
|
|
283
|
+
path: entry.path,
|
|
284
|
+
digest: entry.digest,
|
|
285
|
+
status: "missing",
|
|
286
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// The exported manifest is the recorded one; read-side flags (#2514) stay out of it.
|
|
291
|
+
await writeFile(join(targetDir, "manifest.json"), JSON.stringify(withoutReadFlags(manifest), sortedJsonReplacer, 2));
|
|
292
|
+
const missing = results.filter((r) => r.status === "missing");
|
|
293
|
+
if (args.json) {
|
|
294
|
+
console.log(JSON.stringify({
|
|
295
|
+
component: manifest.component,
|
|
296
|
+
manifestDigest: manifest.manifestDigest,
|
|
297
|
+
...(manifest.flags ? { flags: manifest.flags } : {}),
|
|
298
|
+
outDir: targetDir,
|
|
299
|
+
entries: results,
|
|
300
|
+
}, null, 2));
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
console.log(formatBold(`${manifest.component} (${manifest.manifestDigest}) -> ${targetDir}`));
|
|
304
|
+
for (const r of results) {
|
|
305
|
+
const status = r.status === "materialized" ? formatSuccess("ok") : formatError({ message: r.reason ?? "missing" });
|
|
306
|
+
console.log(` ${r.kind.padEnd(10)}${r.path.padEnd(40)}${status}`);
|
|
307
|
+
}
|
|
308
|
+
console.log(` ${"manifest".padEnd(10)}${"manifest.json".padEnd(40)}${formatSuccess("ok")}`);
|
|
309
|
+
}
|
|
310
|
+
if (missing.length > 0) {
|
|
311
|
+
console.error(formatError({
|
|
312
|
+
message: `${missing.length} of ${results.length} archive entr${missing.length === 1 ? "y" : "ies"} not found on disk — export incomplete`,
|
|
313
|
+
hint: `Run this from the checkout where the build that produced ${manifest.manifestDigest} still has its output on disk.`,
|
|
314
|
+
}));
|
|
315
|
+
return 1;
|
|
316
|
+
}
|
|
317
|
+
console.error(formatSuccess(`Exported ${results.length} entr${results.length === 1 ? "y" : "ies"} + manifest.json to ${targetDir}`));
|
|
318
|
+
return 0;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* chant components status [env] [--live] [--json] [--compare-to <env>]
|
|
322
|
+
*
|
|
323
|
+
* Answers "what's built" and "what's deployed where," joined by digest.
|
|
324
|
+
* Without `--live`, reports the release ledger alone (recorded vs unrecorded
|
|
325
|
+
* is meaningless without live evidence, so every recorded row reports
|
|
326
|
+
* `unknown` reconciliation — still useful as a pure ledger read). With
|
|
327
|
+
* `--live`, joins against `lifecycle diff --live` + ownership (reusing
|
|
328
|
+
* `buildChangeSet`, the same classification `lifecycle plan` already
|
|
329
|
+
* trusts) to flag unrecorded deploys and drift.
|
|
330
|
+
*
|
|
331
|
+
* Omitting `<env>` reports every environment that has release records.
|
|
332
|
+
* `--compare-to <env>` answers the single-query cross-environment question
|
|
333
|
+
* the epic names explicitly: "which build is in `<env>`, and is it the one
|
|
334
|
+
* tested in `<compare-to>`."
|
|
335
|
+
*/
|
|
336
|
+
/** Every distinct `cfn-deploy` stack name a component's deploy phases target. A
|
|
337
|
+
* step may itself be a nested `Phase`, so walk recursively; a resolved component
|
|
338
|
+
* carries the stack as a concrete string.
|
|
339
|
+
*
|
|
340
|
+
* Exported for `chant graph --live` (../handlers/graph.ts's `runGraphLive`,
|
|
341
|
+
* #57): the same per-component stack resolution this file uses for `chant
|
|
342
|
+
* components status --live` is also how the live graph learns which stacks to
|
|
343
|
+
* observe on a multi-stack, per-component project (`describeResources`'s
|
|
344
|
+
* single-stack-named-after-the-environment convention never matches one). */
|
|
345
|
+
export function cfnDeployStacks(deploy) {
|
|
346
|
+
// The CloudFormation slice of the generic deploy-unit walk (#1495) — kept
|
|
347
|
+
// because `chant graph --live`'s stack enrichment is genuinely CFN-shaped.
|
|
348
|
+
return deployUnits(deploy)
|
|
349
|
+
.filter((u) => u.lexicon === "aws")
|
|
350
|
+
.map((u) => u.unit);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Per-component stack presence for `--live`: resolve each component's own
|
|
354
|
+
* `cfn-deploy` stack(s) and observe them directly via a lexicon's
|
|
355
|
+
* `describeStackStatus`. This is the multi-stack component signal that
|
|
356
|
+
* `describeResources` (entity-keyed, single-stack-per-env) misses (#57): a
|
|
357
|
+
* component whose stack is present reconciles as live/owned, joined to the DAG
|
|
358
|
+
* by component name. Components with no `cfn-deploy` stack — or where the
|
|
359
|
+
* observer can't determine any of theirs — are omitted, so the change-set
|
|
360
|
+
* evidence still governs them.
|
|
361
|
+
*/
|
|
362
|
+
async function observeComponentStacks(components, plugins, environment) {
|
|
363
|
+
// Observer per unit's own lexicon (#1495): a component's kubectl-apply unit
|
|
364
|
+
// is read by the k8s lexicon, its cfn-deploy stack by aws. A unit whose
|
|
365
|
+
// lexicon ships no describeStackStatus is skipped — the same absent-observer
|
|
366
|
+
// degradation as before, per unit instead of per project.
|
|
367
|
+
const observerFor = (lexicon) => plugins.find((p) => p.name === lexicon && p.describeStackStatus);
|
|
368
|
+
const evidence = new Map();
|
|
369
|
+
for (const [name, { component }] of components) {
|
|
370
|
+
const units = deployUnits(component.deploy).filter((u) => observerFor(u.lexicon));
|
|
371
|
+
const stacks = units.map((u) => u.unit);
|
|
372
|
+
if (stacks.length === 0)
|
|
373
|
+
continue;
|
|
374
|
+
const observed = await Promise.all(units.map((u) => observerFor(u.lexicon).describeStackStatus({ environment, stack: u.unit }).catch(() => null)));
|
|
375
|
+
const determinate = observed.filter((o) => o !== null);
|
|
376
|
+
if (determinate.length === 0) {
|
|
377
|
+
// Every stack read came back indeterminate (the lexicon's own "I cannot
|
|
378
|
+
// tell" — see describeStackStatus). Record the hole rather than dropping
|
|
379
|
+
// the component, which would leave a recorded component reading `stale`
|
|
380
|
+
// (#1089).
|
|
381
|
+
evidence.set(name, {
|
|
382
|
+
live: false,
|
|
383
|
+
unobserved: {
|
|
384
|
+
reason: "read-failed",
|
|
385
|
+
detail: `no determinate status for stack(s): ${stacks.join(", ")}`,
|
|
386
|
+
},
|
|
387
|
+
});
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
const present = determinate.every((o) => o.present);
|
|
391
|
+
// Surface the (first present, else first) stack's raw status for a richer
|
|
392
|
+
// palette than the reconciliation verdict. One cfn-deploy stack per component
|
|
393
|
+
// is the norm; a multi-stack component reports its representative unit.
|
|
394
|
+
const repr = determinate.find((o) => o.present) ?? determinate[0];
|
|
395
|
+
// Some-but-not-all present is its own answer (#1528): `live` stays false —
|
|
396
|
+
// deployed means all of it — but the split and the missing unit names ride
|
|
397
|
+
// along, so the row can say "half up" instead of "nothing observed live"
|
|
398
|
+
// while its own `stack` field shows a healthy unit.
|
|
399
|
+
const presentCount = determinate.filter((o) => o.present).length;
|
|
400
|
+
const missing = determinate.filter((o) => !o.present).map((o) => o.stack);
|
|
401
|
+
evidence.set(name, {
|
|
402
|
+
live: present,
|
|
403
|
+
ownership: present ? "owned" : undefined,
|
|
404
|
+
stack: { name: repr.stack, status: repr.status, healthy: repr.healthy },
|
|
405
|
+
...(presentCount > 0 && !present ? { partial: { present: presentCount, total: determinate.length, missing } } : {}),
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
return evidence;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* The last lifecycle snapshot(s) for one lexicon, as `components status --live`
|
|
412
|
+
* reads them for its drift baseline (#2513). Reads the stack-keyed snapshot for
|
|
413
|
+
* each stack the status read targets and the unstacked one `lifecycle plan`
|
|
414
|
+
* reads, merging resources (a stack's own snapshot wins) and remembering, per
|
|
415
|
+
* entity, which snapshot's timestamp it came from. A missing or unreadable
|
|
416
|
+
* snapshot is no baseline, never an error: with none, nothing can have changed
|
|
417
|
+
* since, and the status falls back to identity and presence.
|
|
418
|
+
*/
|
|
419
|
+
async function readStatusBaseline(environment, lexicon, stacks) {
|
|
420
|
+
const keys = [...new Set([...stacks.filter((s) => !!s).map((s) => snapshotStorageKey(lexicon, s)), snapshotStorageKey(lexicon)])];
|
|
421
|
+
let resources;
|
|
422
|
+
const timestamps = new Map();
|
|
423
|
+
for (const key of keys) {
|
|
424
|
+
let snap;
|
|
425
|
+
try {
|
|
426
|
+
const content = await readSnapshot(environment, key);
|
|
427
|
+
snap = content ? JSON.parse(content) : undefined;
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
snap = undefined;
|
|
431
|
+
}
|
|
432
|
+
if (!snap?.resources)
|
|
433
|
+
continue;
|
|
434
|
+
resources ?? (resources = {});
|
|
435
|
+
for (const [name, meta] of Object.entries(snap.resources)) {
|
|
436
|
+
if (Object.prototype.hasOwnProperty.call(resources, name))
|
|
437
|
+
continue;
|
|
438
|
+
resources[name] = meta;
|
|
439
|
+
if (snap.timestamp)
|
|
440
|
+
timestamps.set(name, snap.timestamp);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return { resources, timestamps };
|
|
444
|
+
}
|
|
445
|
+
export async function runComponentsStatus(ctx) {
|
|
446
|
+
const { args, plugins, serializers } = ctx;
|
|
447
|
+
const requestedEnv = args.extraPositional;
|
|
448
|
+
await fetchLifecycle();
|
|
449
|
+
const environments = requestedEnv ? [requestedEnv] : await listReleaseEnvironments();
|
|
450
|
+
if (environments.length === 0) {
|
|
451
|
+
console.error(formatWarning({
|
|
452
|
+
message: requestedEnv
|
|
453
|
+
? `No release records found for environment "${requestedEnv}"`
|
|
454
|
+
: "No release records found in any environment",
|
|
455
|
+
}));
|
|
456
|
+
return args.json ? (console.log(JSON.stringify([])), 0) : 0;
|
|
457
|
+
}
|
|
458
|
+
// Discover components (best-effort) so a live/owned-but-never-recorded
|
|
459
|
+
// component still gets a row, not just those that appear in the ledger.
|
|
460
|
+
const { config } = await loadChantConfig(resolve("."));
|
|
461
|
+
const discovery = await discoverComponents(resolve(args.src ?? config.sourceDir ?? "."), {
|
|
462
|
+
sandbox: args.sandbox,
|
|
463
|
+
});
|
|
464
|
+
const allComponents = [...discovery.components.keys()];
|
|
465
|
+
// Component -> live entity/resource name(s) it owns (#598), when declared
|
|
466
|
+
// explicitly via `Component.liveNames`. Components with no `liveNames`
|
|
467
|
+
// simply have no entry here, so `liveEvidenceFromChangeSet` falls back to
|
|
468
|
+
// the name == entity join — no regression for the pilot components.
|
|
469
|
+
const liveNameMapping = new Map();
|
|
470
|
+
for (const [name, discovered] of discovery.components) {
|
|
471
|
+
if (discovered.component.liveNames?.length) {
|
|
472
|
+
liveNameMapping.set(name, discovered.component.liveNames);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
const allRows = [];
|
|
476
|
+
const ledgerByEnv = new Map();
|
|
477
|
+
for (const environment of environments) {
|
|
478
|
+
const ledger = await readReleaseLedger(environment);
|
|
479
|
+
ledgerByEnv.set(environment, ledger);
|
|
480
|
+
if (ledger.malformed > 0) {
|
|
481
|
+
console.error(formatWarning({ message: `${environment}: skipped ${ledger.malformed} malformed ledger line(s)` }));
|
|
482
|
+
}
|
|
483
|
+
let liveEvidence;
|
|
484
|
+
if (args.live) {
|
|
485
|
+
// #1166 — an environment can declare its own endpoint (a local emulator
|
|
486
|
+
// like Floci), applied here unless the ambient shell already set it, so
|
|
487
|
+
// `--live` status doesn't silently read the wrong account per environment.
|
|
488
|
+
const endpointResult = applyLiveEndpoint(config.environments, environment, plugins.filter((p) => p.describeResources || p.describeStackStatus));
|
|
489
|
+
if (endpointResult.notice)
|
|
490
|
+
console.error(formatWarning({ message: endpointResult.notice }));
|
|
491
|
+
try {
|
|
492
|
+
const targetSerializers = serializers;
|
|
493
|
+
// With this invocation's parameters (#1483). Built on defaults, the
|
|
494
|
+
// declared half of the comparison is a different estate from the one
|
|
495
|
+
// deployed, and every resource the real parameter declares reads as
|
|
496
|
+
// absent.
|
|
497
|
+
const statusParams = await commandBuildParams(config.buildParams, args);
|
|
498
|
+
if (!statusParams)
|
|
499
|
+
return 1;
|
|
500
|
+
const buildResult = await build(resolve(args.src ?? config.sourceDir ?? "."), targetSerializers, undefined, {
|
|
501
|
+
buildParams: statusParams,
|
|
502
|
+
});
|
|
503
|
+
// Which deployed stack(s) to read the change set from (behold#100).
|
|
504
|
+
//
|
|
505
|
+
// `describeResources` defaults to the single-stack convention — the
|
|
506
|
+
// stack named after the environment — which is wrong for exactly the
|
|
507
|
+
// projects this command exists for: a component project deploys the
|
|
508
|
+
// stack its own `cfn-deploy` names, and that is almost never the env
|
|
509
|
+
// name. Every declared resource then came back absent, so the rollup
|
|
510
|
+
// #1300 computes read `present: 0` over a healthy estate. That was
|
|
511
|
+
// invisible while nothing consumed the rollup; behold#100 paints from
|
|
512
|
+
// it, so it has to be right.
|
|
513
|
+
//
|
|
514
|
+
// The components' own `cfn-deploy` stacks are the authority (the same
|
|
515
|
+
// ones `observeComponentStacks` reads below), with `config.stacks` as
|
|
516
|
+
// the declared override for a project whose stacks aren't derivable
|
|
517
|
+
// from a deploy step. `[undefined]` keeps the old single-read
|
|
518
|
+
// behaviour for a project with neither.
|
|
519
|
+
const componentStackNames = new Set();
|
|
520
|
+
for (const { component } of discovery.components.values()) {
|
|
521
|
+
for (const stack of cfnDeployStacks(component.deploy))
|
|
522
|
+
componentStackNames.add(stack);
|
|
523
|
+
}
|
|
524
|
+
for (const stack of config.stacks ?? [])
|
|
525
|
+
componentStackNames.add(stack.name);
|
|
526
|
+
const readTargets = componentStackNames.size ? [...componentStackNames] : [undefined];
|
|
527
|
+
const merged = { env: environment, entries: [] };
|
|
528
|
+
const observations = new Map();
|
|
529
|
+
for (const plugin of plugins) {
|
|
530
|
+
if (!plugin.describeResources)
|
|
531
|
+
continue;
|
|
532
|
+
const declared = new Set();
|
|
533
|
+
const entities = new Map();
|
|
534
|
+
for (const [name, entity] of buildResult.entities) {
|
|
535
|
+
// Resource declarables only (see lifecycle/observe.ts).
|
|
536
|
+
if (entity.lexicon === plugin.name && isObservableDeclarable(entity)) {
|
|
537
|
+
declared.add(name);
|
|
538
|
+
entities.set(name, {
|
|
539
|
+
entityType: entity.entityType,
|
|
540
|
+
props: (entity.props != null ? entity.props : {}),
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
let observed;
|
|
545
|
+
try {
|
|
546
|
+
observed = mergeObservations(await Promise.all(readTargets.map(async (stack) => normalizeObservation(await plugin.describeResources({
|
|
547
|
+
environment,
|
|
548
|
+
buildOutput: "",
|
|
549
|
+
entityNames: Array.from(declared),
|
|
550
|
+
entities,
|
|
551
|
+
...(stack ? { stack } : {}),
|
|
552
|
+
})))));
|
|
553
|
+
}
|
|
554
|
+
catch (err) {
|
|
555
|
+
// A failed read is not an empty environment (#1089): mark every
|
|
556
|
+
// declared entity NOT-OBSERVED so the status rows say "unknown"
|
|
557
|
+
// rather than "stale" (recorded, and nothing live).
|
|
558
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
559
|
+
console.error(formatWarning({ message: `${plugin.name}: describeResources failed — ${message} (components in this lexicon report unknown, not stale)` }));
|
|
560
|
+
observed = { resources: {}, unobserved: unobservedAll(declared, "read-failed", message, entities), queried: {}, sources: {}, notes: [] };
|
|
561
|
+
}
|
|
562
|
+
// The last lifecycle snapshot is the prior observation drift is
|
|
563
|
+
// measured against (#2513) — the same one `lifecycle plan` reads, so
|
|
564
|
+
// `drifted` here means what `update` means there. Without it every
|
|
565
|
+
// live, declared entity classified `noop` and `drifted` could not be
|
|
566
|
+
// reached. Each entity remembers its snapshot's timestamp so the
|
|
567
|
+
// status join can ignore a change made before the release.
|
|
568
|
+
const baseline = await readStatusBaseline(environment, plugin.name, readTargets);
|
|
569
|
+
const cs = buildChangeSet(environment, {
|
|
570
|
+
declared,
|
|
571
|
+
observedNow: observed.resources,
|
|
572
|
+
observedThen: baseline.resources,
|
|
573
|
+
unobserved: observed.unobserved,
|
|
574
|
+
}, { lexicon: plugin.name });
|
|
575
|
+
merged.entries.push(...cs.entries);
|
|
576
|
+
for (const entry of cs.entries) {
|
|
577
|
+
observations.set(entry.name, {
|
|
578
|
+
now: observed.resources[entry.name],
|
|
579
|
+
then: baseline.resources?.[entry.name],
|
|
580
|
+
thenAt: baseline.timestamps.get(entry.name),
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
liveEvidence = liveEvidenceFromChangeSet(merged, liveNameMapping, { observations });
|
|
585
|
+
// Multi-stack component projects (each component owns its own stack) are
|
|
586
|
+
// invisible to the entity-keyed, single-stack `describeResources` above —
|
|
587
|
+
// observe each component's own cfn-deploy stack directly and overlay it as
|
|
588
|
+
// the authoritative presence signal (#57).
|
|
589
|
+
const anyObserver = plugins.some((p) => p.describeStackStatus);
|
|
590
|
+
if (anyObserver) {
|
|
591
|
+
const stackEvidence = await observeComponentStacks(discovery.components, plugins, environment);
|
|
592
|
+
liveEvidence = mergeLiveEvidence(liveEvidence, stackEvidence);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
finally {
|
|
596
|
+
endpointResult.restore();
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
// #609: resolve the persisted build manifest behind each recorded digest
|
|
600
|
+
// (if any) so `build`/`componentBom` are real queries, not always null.
|
|
601
|
+
const buildsByDigest = new Map();
|
|
602
|
+
const componentBomByDigest = new Map();
|
|
603
|
+
const recordedDigests = new Set(ledger.records.map((r) => r.digest));
|
|
604
|
+
for (const digest of recordedDigests) {
|
|
605
|
+
const manifest = await findBuildManifestByArtifactDigest(digest);
|
|
606
|
+
if (!manifest)
|
|
607
|
+
continue;
|
|
608
|
+
const bom = componentBomSummary(manifest);
|
|
609
|
+
if (bom)
|
|
610
|
+
componentBomByDigest.set(digest, bom);
|
|
611
|
+
const ledgerEntries = await buildLedgerEntries(manifest);
|
|
612
|
+
const entry = ledgerEntries.find((e) => e.digest === digest);
|
|
613
|
+
if (entry)
|
|
614
|
+
buildsByDigest.set(digest, entry);
|
|
615
|
+
}
|
|
616
|
+
const rows = reconcileStatus(environment, ledger.records, {
|
|
617
|
+
liveEvidence,
|
|
618
|
+
allComponents,
|
|
619
|
+
buildsByDigest,
|
|
620
|
+
componentBomByDigest,
|
|
621
|
+
});
|
|
622
|
+
for (const row of rows) {
|
|
623
|
+
allRows.push({
|
|
624
|
+
component: row.component,
|
|
625
|
+
env: row.env,
|
|
626
|
+
recorded: row.recorded
|
|
627
|
+
? {
|
|
628
|
+
digest: row.recorded.digest,
|
|
629
|
+
gitSha: row.recorded.gitSha,
|
|
630
|
+
runId: row.recorded.runId,
|
|
631
|
+
timestamp: row.recorded.timestamp,
|
|
632
|
+
actor: row.recorded.actor,
|
|
633
|
+
...(row.recorded.flags ? { flags: row.recorded.flags } : {}),
|
|
634
|
+
}
|
|
635
|
+
: null,
|
|
636
|
+
build: row.build
|
|
637
|
+
? {
|
|
638
|
+
manifestDigest: row.build.manifestDigest,
|
|
639
|
+
referrers: row.build.referrers.map((r) => r.kind),
|
|
640
|
+
sbom: row.build.sbom
|
|
641
|
+
? {
|
|
642
|
+
mediaType: row.build.sbom.mediaType,
|
|
643
|
+
packageCount: row.build.sbom.packageCount,
|
|
644
|
+
generator: row.build.sbom.generator,
|
|
645
|
+
source: row.build.sbom.source,
|
|
646
|
+
}
|
|
647
|
+
: null,
|
|
648
|
+
reproducibility: row.build.reproducibility
|
|
649
|
+
? { basis: row.build.reproducibility.basis, verifyBy: row.build.reproducibility.verifyBy }
|
|
650
|
+
: null,
|
|
651
|
+
}
|
|
652
|
+
: null,
|
|
653
|
+
componentBom: row.componentBom
|
|
654
|
+
? {
|
|
655
|
+
leaves: row.componentBom.leaves.map((l) => ({
|
|
656
|
+
path: l.path,
|
|
657
|
+
bomKind: l.bomKind,
|
|
658
|
+
subjectDigest: l.subjectDigest,
|
|
659
|
+
mediaType: l.mediaType,
|
|
660
|
+
packageCount: l.packageCount,
|
|
661
|
+
generator: l.generator,
|
|
662
|
+
})),
|
|
663
|
+
totalPackageCount: row.componentBom.totalPackageCount,
|
|
664
|
+
isAssembly: row.componentBom.isAssembly,
|
|
665
|
+
}
|
|
666
|
+
: null,
|
|
667
|
+
reconciliation: row.reconciliation,
|
|
668
|
+
detail: row.detail,
|
|
669
|
+
...(row.live !== undefined ? { live: row.live } : {}),
|
|
670
|
+
...(row.unobserved ? { unobserved: row.unobserved } : {}),
|
|
671
|
+
...(row.stack ? { stack: row.stack } : {}),
|
|
672
|
+
...(row.resources ? { resources: row.resources } : {}),
|
|
673
|
+
});
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
// `--compare-to` — single-query cross-env digest comparison, per component.
|
|
677
|
+
let comparisons;
|
|
678
|
+
if (args.compareTo && requestedEnv) {
|
|
679
|
+
const otherLedger = ledgerByEnv.get(args.compareTo) ?? (await readReleaseLedger(args.compareTo));
|
|
680
|
+
const componentsToCompare = new Set([...allRows.map((r) => r.component)]);
|
|
681
|
+
comparisons = [...componentsToCompare].sort().map((component) => compareAcrossEnvironments(component, { name: requestedEnv, records: ledgerByEnv.get(requestedEnv)?.records ?? [] }, { name: args.compareTo, records: otherLedger.records }));
|
|
682
|
+
}
|
|
683
|
+
if (args.json) {
|
|
684
|
+
console.log(JSON.stringify(comparisons ? { rows: allRows, comparisons } : allRows, null, 2));
|
|
685
|
+
return 0;
|
|
686
|
+
}
|
|
687
|
+
console.log(formatBold("COMPONENT".padEnd(24)) +
|
|
688
|
+
formatBold("ENV".padEnd(12)) +
|
|
689
|
+
formatBold("DIGEST".padEnd(20)) +
|
|
690
|
+
formatBold("STATUS".padEnd(14)) +
|
|
691
|
+
formatBold("DETAIL"));
|
|
692
|
+
console.log("-".repeat(110));
|
|
693
|
+
for (const row of allRows) {
|
|
694
|
+
const digestShort = row.recorded ? row.recorded.digest.slice(0, 19) : "-";
|
|
695
|
+
console.log(row.component.padEnd(24) +
|
|
696
|
+
row.env.padEnd(12) +
|
|
697
|
+
digestShort.padEnd(20) +
|
|
698
|
+
row.reconciliation.padEnd(14) +
|
|
699
|
+
row.detail +
|
|
700
|
+
(row.recorded?.flags?.length ? ` [${row.recorded.flags.join(", ")}]` : ""));
|
|
701
|
+
}
|
|
702
|
+
if (comparisons) {
|
|
703
|
+
console.log(`\n${formatBold(`Cross-check: ${requestedEnv} vs ${args.compareTo}`)}`);
|
|
704
|
+
for (const c of comparisons) {
|
|
705
|
+
const verdict = c.same
|
|
706
|
+
? "same build"
|
|
707
|
+
: c.mixedDigestForms
|
|
708
|
+
? "different digests, one recorded before real SHA-256 (legacy-digest), so this cannot tell"
|
|
709
|
+
: "DIFFERENT builds";
|
|
710
|
+
console.log(` ${c.component}: ${c.digestA ?? "(none)"} vs ${c.digestB ?? "(none)"} — ${verdict}`);
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
const unrecordedCount = allRows.filter((r) => r.reconciliation === "unrecorded").length;
|
|
714
|
+
const driftedCount = allRows.filter((r) => r.reconciliation === "drifted").length;
|
|
715
|
+
if (unrecordedCount === 0 && driftedCount === 0) {
|
|
716
|
+
console.error(formatSuccess(`No unrecorded deploys or drift across ${allRows.length} row(s)`));
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
console.error(formatWarning({ message: `${unrecordedCount} unrecorded, ${driftedCount} drifted` }));
|
|
720
|
+
}
|
|
721
|
+
return 0;
|
|
722
|
+
}
|
|
723
|
+
/** Fallback for `chant components` with no/unknown subcommand. */
|
|
724
|
+
export async function runComponentsUnknown(ctx) {
|
|
725
|
+
console.error(formatError({
|
|
726
|
+
message: `Unknown components subcommand: ${ctx.args.path}`,
|
|
727
|
+
hint: "Available: chant components status [env], chant components release <env>, chant components export <env>",
|
|
728
|
+
}));
|
|
729
|
+
return 1;
|
|
730
|
+
}
|