@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,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build-archive manifest store (#609, epic #551 follow-up to #564/#568/#606/
|
|
3
|
+
* #613/#614): persists a `BuildArchiveManifest`
|
|
4
|
+
* (../components/verbs/build-archive.ts) to a durable, content-addressed
|
|
5
|
+
* location so it survives past the in-process build/run that assembled it.
|
|
6
|
+
*
|
|
7
|
+
* **The gap this closes.** `docker-build` (../components/verbs/build.ts) and
|
|
8
|
+
* friends assemble a real `BuildArchiveManifest` in memory — complete with
|
|
9
|
+
* `sbom`/config-BOM entries (#606/#613) and per-artifact
|
|
10
|
+
* `reproducibility`/`provenance` (#614) — but nothing ever wrote it anywhere
|
|
11
|
+
* durable. `build-ledger.ts`'s `buildLedgerEntries`/`componentBomSummary` are
|
|
12
|
+
* unit-tested against a manifest handed to them directly, but
|
|
13
|
+
* `chant components status` (../cli/handlers/components.ts) had no manifest
|
|
14
|
+
* to hand them at all: `componentBom` and `build.reproducibility` were always
|
|
15
|
+
* `null` in that CLI path. This module is the missing durable layer — write
|
|
16
|
+
* once at build time, read back by digest at status time.
|
|
17
|
+
*
|
|
18
|
+
* **Storage choice: the `chant/lifecycle` orphan branch, a sibling namespace
|
|
19
|
+
* to the release ledger.** Reuses the exact git-plumbing
|
|
20
|
+
* `writeBlobToPath`/`readBlobFromPath`/`listFilesInDir` (./git.ts) that
|
|
21
|
+
* `writeSnapshot`/`appendReleaseRecordLine` already use — same hash-object →
|
|
22
|
+
* mktree → commit-tree → update-ref pipeline, same `--force-with-lease` push
|
|
23
|
+
* discipline (`pushLifecycle`), same "no checkout, no working tree changes"
|
|
24
|
+
* property. Rejected alternatives:
|
|
25
|
+
* - **A new on-disk directory in the working tree** — would need its own
|
|
26
|
+
* persistence/sync story (commit it? gitignore it? sync across CI
|
|
27
|
+
* runners?) that the orphan branch already solves for the release ledger;
|
|
28
|
+
* introducing a second mechanism for a manifest that is conceptually the
|
|
29
|
+
* same kind of durable, git-native record would be needless divergence.
|
|
30
|
+
* - **A path under `<env>/`** — a build archive is *not* env-scoped. The
|
|
31
|
+
* whole point of promote-by-digest (epic #551 "4. Build archive +
|
|
32
|
+
* deferred publish") is that one build's manifest is referenced from
|
|
33
|
+
* every environment it gets promoted to; writing it under a single env
|
|
34
|
+
* directory would either duplicate it per env (defeating "byte-identical
|
|
35
|
+
* across envs") or arbitrarily pick one env as "the" owner. Manifests
|
|
36
|
+
* instead live under a fixed top-level `_builds/` directory on the same
|
|
37
|
+
* orphan branch, keyed by `manifestDigest` — a peer of the per-env
|
|
38
|
+
* directories `writeSnapshot`/the release ledger already create there,
|
|
39
|
+
* never nested inside one.
|
|
40
|
+
*
|
|
41
|
+
* **Content-addressed, keyed by `manifestDigest`.** One file per manifest,
|
|
42
|
+
* `_builds/<manifestDigest-with-":"->"_">.json`, so a rebuild of
|
|
43
|
+
* byte-identical inputs (same `manifestDigest`, per
|
|
44
|
+
* ../components/verbs/build-archive.ts's module doc) overwrites its own
|
|
45
|
+
* entry with identical content rather than accumulating duplicates —
|
|
46
|
+
* `writeBlobToPath` already replaces-by-path, so this falls out for free.
|
|
47
|
+
* `findBuildManifestByArtifactDigest` additionally resolves "the manifest
|
|
48
|
+
* that produced artifact digest X" (the join key `chant components status`
|
|
49
|
+
* actually has on hand — a `ReleaseRecord.digest` is an *artifact* digest,
|
|
50
|
+
* not a manifest digest) by scanning every stored manifest's `contents` for
|
|
51
|
+
* a matching entry. This is a linear scan over however many manifests have
|
|
52
|
+
* been persisted; fine for the ledger's expected scale (one manifest per
|
|
53
|
+
* build), and avoids maintaining a second reverse-index file that could get
|
|
54
|
+
* out of sync with the manifests themselves.
|
|
55
|
+
*/
|
|
56
|
+
import { sortedJsonReplacer } from "../utils.js";
|
|
57
|
+
import { flagLegacyDigest, warnOnLegacyDigests, withoutReadFlags } from "./legacy-digest.js";
|
|
58
|
+
import { writeBlobToPath, readBlobFromPath, listFilesInDir } from "./git.js";
|
|
59
|
+
/** Fixed top-level directory on the `chant/lifecycle` orphan branch that holds every persisted build manifest — a peer of the per-env directories, never nested inside one (see module doc for why). */
|
|
60
|
+
const BUILDS_DIR = "_builds";
|
|
61
|
+
/** Turn a `sha256:...`-style digest into a filesystem/git-tree-safe filename stem (`:` is not usable in a git tree entry name the way this plumbing constructs it). */
|
|
62
|
+
function digestToFilenameStem(digest) {
|
|
63
|
+
return digest.replace(/:/g, "_");
|
|
64
|
+
}
|
|
65
|
+
function manifestFilename(manifestDigest) {
|
|
66
|
+
return `${digestToFilenameStem(manifestDigest)}.json`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Persist a `BuildArchiveManifest` to the orphan branch, keyed by its own
|
|
70
|
+
* `manifestDigest`. Does not push to the remote — call `pushLifecycle`
|
|
71
|
+
* (./git.ts) afterward, the same two-step (`write` then `push`) shape
|
|
72
|
+
* `appendReleaseRecord`/`takeSnapshot` use, so a caller persisting several
|
|
73
|
+
* manifests (or a manifest plus a release record) in one run can batch the
|
|
74
|
+
* push into one network round-trip.
|
|
75
|
+
*
|
|
76
|
+
* Idempotent: persisting the same manifest twice (identical `manifestDigest`)
|
|
77
|
+
* overwrites the same path with identical bytes — safe to call more than
|
|
78
|
+
* once for the same build.
|
|
79
|
+
*/
|
|
80
|
+
export async function persistBuildManifest(manifest, opts) {
|
|
81
|
+
// `flags` are read-side only (#2514); a manifest read back and persisted again never keeps them.
|
|
82
|
+
const json = JSON.stringify(withoutReadFlags(manifest), sortedJsonReplacer);
|
|
83
|
+
const commit = await writeBlobToPath(BUILDS_DIR, manifestFilename(manifest.manifestDigest), json, "Build manifest", opts);
|
|
84
|
+
return { commit };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Read a persisted `BuildArchiveManifest` back by its own `manifestDigest`.
|
|
88
|
+
* Returns `null` when no manifest was ever persisted under that digest
|
|
89
|
+
* (never throws — a status query for a digest with no recorded build is a
|
|
90
|
+
* normal, expected state, matching `readSnapshot`'s null-on-missing
|
|
91
|
+
* convention).
|
|
92
|
+
*/
|
|
93
|
+
export async function readBuildManifest(manifestDigest, opts) {
|
|
94
|
+
const content = await readBlobFromPath(BUILDS_DIR, manifestFilename(manifestDigest), opts);
|
|
95
|
+
if (!content)
|
|
96
|
+
return null;
|
|
97
|
+
let manifest;
|
|
98
|
+
try {
|
|
99
|
+
manifest = JSON.parse(content);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
// chant #2514 — a manifest whose digests predate real SHA-256 is flagged
|
|
105
|
+
// legacy-digest, never re-keyed, and the project is warned once.
|
|
106
|
+
const digests = [
|
|
107
|
+
manifest.manifestDigest,
|
|
108
|
+
...(Array.isArray(manifest.contents) ? manifest.contents.map((e) => e?.digest) : []),
|
|
109
|
+
];
|
|
110
|
+
warnOnLegacyDigests(digests, "build manifests", opts?.cwd);
|
|
111
|
+
return flagLegacyDigest(manifest, digests);
|
|
112
|
+
}
|
|
113
|
+
/** List the `manifestDigest` of every build manifest persisted on the orphan branch. */
|
|
114
|
+
export async function listBuildManifestDigests(opts) {
|
|
115
|
+
const files = await listFilesInDir(BUILDS_DIR, opts);
|
|
116
|
+
return files
|
|
117
|
+
.filter((f) => f.endsWith(".json"))
|
|
118
|
+
.map((f) => f.replace(/\.json$/, "").replace(/_/g, ":"));
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Read every persisted build manifest. Best-effort: a manifest file that
|
|
122
|
+
* fails to parse is skipped rather than failing the whole read (mirrors
|
|
123
|
+
* `readReleaseLedger`'s "skip malformed lines" degrade-gracefully
|
|
124
|
+
* convention) — the caller only gets the count implicitly via array length,
|
|
125
|
+
* since a corrupted manifest blob is a much rarer/more surprising event than
|
|
126
|
+
* a hand-edited ledger line and not expected to need the same "surfaced
|
|
127
|
+
* count" treatment.
|
|
128
|
+
*/
|
|
129
|
+
export async function readAllBuildManifests(opts) {
|
|
130
|
+
const digests = await listBuildManifestDigests(opts);
|
|
131
|
+
const manifests = [];
|
|
132
|
+
for (const digest of digests) {
|
|
133
|
+
const manifest = await readBuildManifest(digest, opts);
|
|
134
|
+
if (manifest)
|
|
135
|
+
manifests.push(manifest);
|
|
136
|
+
}
|
|
137
|
+
return manifests;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Find the persisted manifest that carries an entry (any kind — image,
|
|
141
|
+
* template, asset, or sbom) whose `digest` equals `artifactDigest`. This is
|
|
142
|
+
* the lookup `chant components status` actually needs: a `ReleaseRecord`
|
|
143
|
+
* (../lifecycle/release-ledger.ts) records the *artifact* digest that was
|
|
144
|
+
* promoted/deployed, not the manifest's own aggregate `manifestDigest` — so
|
|
145
|
+
* resolving "the build behind this deployed digest" means searching
|
|
146
|
+
* manifest contents, not a direct keyed lookup. Returns `undefined` when no
|
|
147
|
+
* persisted manifest contains a matching entry (no build was ever persisted
|
|
148
|
+
* for that artifact digest — e.g. it predates #609, or was recorded via the
|
|
149
|
+
* standalone `chant components release` command with no corresponding
|
|
150
|
+
* `chant build`/`run` in this checkout).
|
|
151
|
+
*
|
|
152
|
+
* A `ReleaseRecord.manifestDigest`, when present (an optional field a caller
|
|
153
|
+
* may have supplied at record time), lets a caller skip this scan entirely
|
|
154
|
+
* via `readBuildManifest` directly — this function is the fallback for the
|
|
155
|
+
* common case where only the artifact digest is known.
|
|
156
|
+
*/
|
|
157
|
+
export async function findBuildManifestByArtifactDigest(artifactDigest, opts) {
|
|
158
|
+
const manifests = await readAllBuildManifests(opts);
|
|
159
|
+
return manifests.find((m) => m.contents.some((entry) => entry.digest === artifactDigest));
|
|
160
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build ledger — the "what's been built" half of build & deploy observability
|
|
3
|
+
* (#568, epic #551 "Build & deploy observability" / "4. Build archive +
|
|
4
|
+
* deferred publish"; SBOM consume/surface added in #606).
|
|
5
|
+
*
|
|
6
|
+
* The `BuildArchive` manifest (../components/verbs/build-archive.ts) is
|
|
7
|
+
* itself the build ledger: it is content-addressed by digest and enumerates
|
|
8
|
+
* every image/template/asset/sbom a build produced. What #568 adds on top is
|
|
9
|
+
* discovery of an image's **referrers** — the SBOM, SLSA provenance, and
|
|
10
|
+
* signature attached to the same digest by tooling like `oras discover
|
|
11
|
+
* <digest>` / `cosign tree` (epic #551's phrasing).
|
|
12
|
+
*
|
|
13
|
+
* This module only *surfaces and consumes* SBOM/provenance/signature
|
|
14
|
+
* evidence — generation is ../components/verbs/sbom.ts's `generate-sbom`
|
|
15
|
+
* capability (#606; SLSA provenance + signing remain out of scope, noted as
|
|
16
|
+
* fast-follow siblings). Two sources feed the same `sbom` summary below, and
|
|
17
|
+
* a caller gets *both* without special-casing which one exists:
|
|
18
|
+
*
|
|
19
|
+
* - **archive-carried** — an `sbom`-kind entry in the same
|
|
20
|
+
* `BuildArchiveManifest`, written directly by `generate-sbom`. This is
|
|
21
|
+
* the **universal home**: it works for every artifact type (image, jar,
|
|
22
|
+
* zip) and every publish backend, including the registry-less
|
|
23
|
+
* `load-image-on-host` path, with no registry/network access required to
|
|
24
|
+
* read it back.
|
|
25
|
+
* - **referrer-projected** — an OCI referrer of `kind: "sbom"` discovered
|
|
26
|
+
* via `ReferrerLookup`, the registry-side convenience for image
|
|
27
|
+
* artifacts (`oras discover <digest>`/`cosign tree`) that #568 already
|
|
28
|
+
* modeled. Not every artifact type has this projection (only images
|
|
29
|
+
* published to a registry do), and not every environment can query it
|
|
30
|
+
* (`ReferrerLookup` defaults to `noopReferrerLookup`, no network).
|
|
31
|
+
*
|
|
32
|
+
* `buildLedgerEntries` prefers the archive-carried copy when both exist
|
|
33
|
+
* (same digest either way, since both trace back to the same
|
|
34
|
+
* `generate-sbom` run — the archive is the source of truth; the referrer is
|
|
35
|
+
* a projection of it) and falls back to the referrer when only that is
|
|
36
|
+
* available (e.g. a manifest read that predates #606, or a third-party tool
|
|
37
|
+
* attached an SBOM directly to the registry outside chant's own build). The
|
|
38
|
+
* `ReferrerLookup` interface remains injectable for exactly the reason
|
|
39
|
+
* `CloudExecutor` is injectable elsewhere in ../components/verbs: no test and
|
|
40
|
+
* no default implementation shells out to a real `oras`/`cosign`/registry
|
|
41
|
+
* call.
|
|
42
|
+
*
|
|
43
|
+
* **#614 additions.** Two more things get surfaced per manifest, both
|
|
44
|
+
* derived from data the manifest already carries (no new generation, no
|
|
45
|
+
* re-parsing of BOM bytes):
|
|
46
|
+
*
|
|
47
|
+
* - Each `BuildLedgerEntry` (still one per image, matching this module's
|
|
48
|
+
* existing scope) now carries that image's own `reproducibility` — read
|
|
49
|
+
* straight off its `BuildArchiveEntry`, never inferred from a sibling
|
|
50
|
+
* artifact (see ../components/verbs/reproducibility.ts's module doc for
|
|
51
|
+
* why a blanket flag would misrepresent a multi-artifact component).
|
|
52
|
+
* `artifactReproducibilitySummary` below reports the same per-artifact
|
|
53
|
+
* honesty for *every* artifact entry in a manifest (image, template,
|
|
54
|
+
* asset alike) — the full per-artifact picture #614 asks for, not just
|
|
55
|
+
* the image-scoped slice `buildLedgerEntries` has always covered.
|
|
56
|
+
* - `componentBomSummary` reports the component-level BOM aggregation
|
|
57
|
+
* picture (../components/verbs/component-bom.ts): how many leaf BOMs
|
|
58
|
+
* (software SBOM + IaC config-BOM) the manifest carries, each one's
|
|
59
|
+
* `bomKind`/format/package count, and whether they'd compose into a
|
|
60
|
+
* single-artifact (1:1) or real multi-artifact assembly. This is a
|
|
61
|
+
* summary read off the manifest's existing `sbom`-kind entries — it does
|
|
62
|
+
* not regenerate or re-validate the aggregate document (that stays
|
|
63
|
+
* `aggregateComponentBom`'s job, given each leaf's `BomPackage[]`, which
|
|
64
|
+
* the manifest alone does not carry).
|
|
65
|
+
*/
|
|
66
|
+
import { findSbomForSubject, imageEntries, sbomEntries, artifactEntries } from "../components/verbs/build-archive.js";
|
|
67
|
+
/** Default `ReferrerLookup`: reports no referrers. A real registry/`oras`-backed implementation is out of scope here (belongs with #564's signing follow-up) — this keeps build-ledger queries safe to run with no cloud/network access. */
|
|
68
|
+
export const noopReferrerLookup = {
|
|
69
|
+
async discover() {
|
|
70
|
+
return [];
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Build the ledger view for one archive manifest: every `image`-kind entry,
|
|
75
|
+
* each paired with its OCI referrers via `lookup` and its SBOM summary (read
|
|
76
|
+
* from the archive-carried entry first, the referrer projection otherwise —
|
|
77
|
+
* see this module's doc comment). "What's built" becomes "what's built, from
|
|
78
|
+
* which commit, by what, when" once a release record (./release-ledger.ts)
|
|
79
|
+
* is joined onto this by `digest` — this function only produces the build
|
|
80
|
+
* side of that join.
|
|
81
|
+
*/
|
|
82
|
+
export async function buildLedgerEntries(manifest, lookup = noopReferrerLookup) {
|
|
83
|
+
const images = imageEntries(manifest);
|
|
84
|
+
const entries = [];
|
|
85
|
+
for (const image of images) {
|
|
86
|
+
const referrers = await lookup.discover(image.digest);
|
|
87
|
+
const archiveSbom = findSbomForSubject(manifest, image.digest);
|
|
88
|
+
const referrerSbom = findReferrer(referrers, "sbom");
|
|
89
|
+
const sbom = archiveSbom
|
|
90
|
+
? {
|
|
91
|
+
mediaType: archiveSbom.mediaType ?? "application/octet-stream",
|
|
92
|
+
packageCount: archiveSbom.packageCount,
|
|
93
|
+
generator: archiveSbom.generator,
|
|
94
|
+
source: "archive",
|
|
95
|
+
}
|
|
96
|
+
: referrerSbom
|
|
97
|
+
? { mediaType: referrerSbom.mediaType, source: "referrer" }
|
|
98
|
+
: undefined;
|
|
99
|
+
entries.push({
|
|
100
|
+
component: manifest.component,
|
|
101
|
+
path: image.path,
|
|
102
|
+
digest: image.digest,
|
|
103
|
+
createdAt: manifest.createdAt,
|
|
104
|
+
manifestDigest: manifest.manifestDigest,
|
|
105
|
+
referrers,
|
|
106
|
+
sbom,
|
|
107
|
+
reproducibility: image.reproducibility,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return entries;
|
|
111
|
+
}
|
|
112
|
+
/** Find the referrer of a given kind for a digest, if any (a convenience for "does this build have a signature/SBOM/provenance"). */
|
|
113
|
+
export function findReferrer(referrers, kind) {
|
|
114
|
+
return referrers.find((r) => r.kind === kind);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Report every artifact entry's (`image`/`template`/`asset`) own
|
|
118
|
+
* reproducibility + provenance, honestly per-artifact — the full picture
|
|
119
|
+
* #614 asks for, wider than `buildLedgerEntries`'s image-only scope. Order
|
|
120
|
+
* matches `artifactEntries`' manifest insertion order; sort by `path`
|
|
121
|
+
* yourself for a stable display order (mirroring
|
|
122
|
+
* `computeManifestDigest`'s own path-sort convention).
|
|
123
|
+
*/
|
|
124
|
+
export function artifactReproducibilitySummary(manifest) {
|
|
125
|
+
return artifactEntries(manifest).map((entry) => ({
|
|
126
|
+
path: entry.path,
|
|
127
|
+
kind: entry.kind,
|
|
128
|
+
digest: entry.digest,
|
|
129
|
+
reproducibility: entry.reproducibility,
|
|
130
|
+
sourceRef: entry.provenance?.sourceRef,
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Build the component BOM summary for one manifest, straight from its
|
|
135
|
+
* existing `sbom`-kind entries — no regeneration, no re-parsing of BOM
|
|
136
|
+
* bytes. `undefined` when the manifest carries no BOM at all (a component
|
|
137
|
+
* that composed neither `generate-sbom` nor `extract-config-bom` — skipping
|
|
138
|
+
* is structural, matching every other BOM consumer's convention in this
|
|
139
|
+
* codebase).
|
|
140
|
+
*/
|
|
141
|
+
export function componentBomSummary(manifest) {
|
|
142
|
+
const boms = sbomEntries(manifest);
|
|
143
|
+
if (boms.length === 0)
|
|
144
|
+
return undefined;
|
|
145
|
+
const leaves = boms.map((entry) => ({
|
|
146
|
+
path: entry.path,
|
|
147
|
+
bomKind: entry.bomKind ?? "software",
|
|
148
|
+
subjectDigest: entry.subjectDigest,
|
|
149
|
+
mediaType: entry.mediaType ?? "application/octet-stream",
|
|
150
|
+
packageCount: entry.packageCount,
|
|
151
|
+
generator: entry.generator,
|
|
152
|
+
}));
|
|
153
|
+
const totalPackageCount = leaves.reduce((sum, l) => sum + (l.packageCount ?? 0), 0);
|
|
154
|
+
return { leaves, totalPackageCount, isAssembly: leaves.length > 1 };
|
|
155
|
+
}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Change set: a typed, read-only projection of a live diff.
|
|
3
|
+
*
|
|
4
|
+
* `chant lifecycle diff --live` computes a three-way comparison — declared now /
|
|
5
|
+
* last snapshot / live now — and prints it. `buildChangeSet` promotes that
|
|
6
|
+
* same signal into a classified create/update/delete/adopt/runtime/noop set
|
|
7
|
+
* that other tooling (reconcile, apply) can act on.
|
|
8
|
+
*
|
|
9
|
+
* Strictly read-only and pure: no I/O, no mutation. The classification reads
|
|
10
|
+
* ownership from the live marker only (populated downstream); until ownership
|
|
11
|
+
* exists, an undeclared live resource is `adopt`, never `delete`. The snapshot
|
|
12
|
+
* is evidence, never the basis for a mutation decision — it must never become
|
|
13
|
+
* load-bearing.
|
|
14
|
+
*/
|
|
15
|
+
import { diffLive } from "./live-diff.js";
|
|
16
|
+
import { unobservedReasonText } from "../observation.js";
|
|
17
|
+
import { renderDisruption, summarizeDisruption } from "./disruption.js";
|
|
18
|
+
export function buildChangeSet(env, input, options) {
|
|
19
|
+
const diff = diffLive(input);
|
|
20
|
+
const { declared, observedNow } = input;
|
|
21
|
+
const observedThen = input.observedThen ?? {};
|
|
22
|
+
const unobservedInput = input.unobserved ?? {};
|
|
23
|
+
const driftByName = new Map(diff.driftedSinceSnapshot.map((d) => [d.name, d.changes]));
|
|
24
|
+
const names = new Set([
|
|
25
|
+
...declared,
|
|
26
|
+
...Object.keys(observedNow),
|
|
27
|
+
...Object.keys(observedThen),
|
|
28
|
+
...Object.keys(unobservedInput),
|
|
29
|
+
]);
|
|
30
|
+
const entries = [];
|
|
31
|
+
for (const name of names) {
|
|
32
|
+
const isDeclared = declared.has(name);
|
|
33
|
+
const live = Object.prototype.hasOwnProperty.call(observedNow, name);
|
|
34
|
+
const inSnapshot = Object.prototype.hasOwnProperty.call(observedThen, name);
|
|
35
|
+
// A returned resource was observed by definition; `unobserved` only counts
|
|
36
|
+
// for entities the lexicon did not return.
|
|
37
|
+
const unobservedEntry = live ? undefined : unobservedInput[name];
|
|
38
|
+
const type = observedNow[name]?.type ?? observedThen[name]?.type ?? unobservedEntry?.type;
|
|
39
|
+
const evidence = { declared: isDeclared, inSnapshot, live, observed: !unobservedEntry };
|
|
40
|
+
// Ownership comes from the LIVE marker only (carried on observedNow), never
|
|
41
|
+
// from the snapshot. This is the invariant that keeps the snapshot from
|
|
42
|
+
// becoming load-bearing: a mutation decision (delete) is never made from a
|
|
43
|
+
// record chant has to host.
|
|
44
|
+
const ownership = observedNow[name]?.ownership ?? "unknown";
|
|
45
|
+
// Owner-reference chain (#1077), same live-only provenance as ownership
|
|
46
|
+
// above. Only a `declared` root changes the classification; `unknown` is
|
|
47
|
+
// deliberately not escalated (#1168's tri-state precedent — an
|
|
48
|
+
// unconfirmed chain never earns the more confident verdict).
|
|
49
|
+
const runtimeOwner = !isDeclared && observedNow[name]?.ownerChain?.root === "declared"
|
|
50
|
+
? observedNow[name].ownerChain.entity
|
|
51
|
+
: undefined;
|
|
52
|
+
let action;
|
|
53
|
+
let deltas;
|
|
54
|
+
if (unobservedEntry) {
|
|
55
|
+
// The lexicon never looked. Absence is not established, so neither a
|
|
56
|
+
// create (declared) nor a delete/adopt (undeclared) can be proposed —
|
|
57
|
+
// the entry exists to say the plan has a hole here.
|
|
58
|
+
action = "unobserved";
|
|
59
|
+
}
|
|
60
|
+
else if (isDeclared && !live) {
|
|
61
|
+
// Declared in source, and the provider confirmed it absent → create.
|
|
62
|
+
action = "create";
|
|
63
|
+
}
|
|
64
|
+
else if (isDeclared && live) {
|
|
65
|
+
const drift = driftByName.get(name);
|
|
66
|
+
if (drift && drift.length > 0) {
|
|
67
|
+
action = "update";
|
|
68
|
+
deltas = drift;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
action = "noop";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (live && runtimeOwner) {
|
|
75
|
+
// Live, undeclared, and its owner chain reaches a declared entity
|
|
76
|
+
// (#1077) — expected runtime, never a delete/adopt candidate, checked
|
|
77
|
+
// ahead of the ownership marker below: even a runtime child that
|
|
78
|
+
// happens to carry chant's own marker (label propagation from its
|
|
79
|
+
// owner's template) must never be proposed for deletion.
|
|
80
|
+
action = "runtime";
|
|
81
|
+
}
|
|
82
|
+
else if (live) {
|
|
83
|
+
// Live but undeclared. Only a chant-owned orphan is a safe delete; a
|
|
84
|
+
// foreign or unknown orphan can be adopted but never auto-deleted.
|
|
85
|
+
action = ownership === "owned" ? "delete" : "adopt";
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Only in the snapshot: already gone, nothing to reconcile.
|
|
89
|
+
action = "noop";
|
|
90
|
+
}
|
|
91
|
+
// The address the read went to (#1620) — from the unobserved entry when
|
|
92
|
+
// there is one, else the observation's queried map. Diagnostic only; the
|
|
93
|
+
// classification above never reads it.
|
|
94
|
+
const queried = unobservedEntry?.queried ?? input.queried?.[name];
|
|
95
|
+
const definition = action === "create" ? input.definitions?.[name] : undefined;
|
|
96
|
+
// The provider's id for the row (#1674). Live first; the snapshot's only
|
|
97
|
+
// when the resource is no longer live (a snapshot-only noop).
|
|
98
|
+
const physicalId = observedNow[name]?.physicalId ?? observedThen[name]?.physicalId;
|
|
99
|
+
entries.push({
|
|
100
|
+
name,
|
|
101
|
+
type,
|
|
102
|
+
...(options?.lexicon ? { lexicon: options.lexicon } : {}),
|
|
103
|
+
...(physicalId ? { physicalId } : {}),
|
|
104
|
+
action,
|
|
105
|
+
evidence,
|
|
106
|
+
deltas,
|
|
107
|
+
ownership,
|
|
108
|
+
...(unobservedEntry
|
|
109
|
+
? {
|
|
110
|
+
unobservedReason: unobservedEntry.reason,
|
|
111
|
+
...(unobservedEntry.detail ? { unobservedDetail: unobservedEntry.detail } : {}),
|
|
112
|
+
}
|
|
113
|
+
: {}),
|
|
114
|
+
...(queried ? { queried } : {}),
|
|
115
|
+
...(definition ? { definition } : {}),
|
|
116
|
+
...(runtimeOwner ? { runtimeOwner } : {}),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
120
|
+
return { env, entries };
|
|
121
|
+
}
|
|
122
|
+
const ACTION_ORDER = ["create", "update", "effect", "delete", "adopt", "runtime", "noop", "unobserved"];
|
|
123
|
+
/** Count entries per action. */
|
|
124
|
+
export function summarize(cs) {
|
|
125
|
+
const counts = {
|
|
126
|
+
create: 0,
|
|
127
|
+
update: 0,
|
|
128
|
+
effect: 0,
|
|
129
|
+
delete: 0,
|
|
130
|
+
adopt: 0,
|
|
131
|
+
runtime: 0,
|
|
132
|
+
noop: 0,
|
|
133
|
+
unobserved: 0,
|
|
134
|
+
};
|
|
135
|
+
for (const e of cs.entries)
|
|
136
|
+
counts[e.action]++;
|
|
137
|
+
return counts;
|
|
138
|
+
}
|
|
139
|
+
/** Project a change set onto the GitLab MR plan widget shape. Pure. */
|
|
140
|
+
export function gitlabMrReport(cs) {
|
|
141
|
+
const counts = summarize(cs);
|
|
142
|
+
return { create: counts.create, update: counts.update, delete: counts.delete };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Warning a plan should print when it carries a hole — a declared entity the
|
|
146
|
+
* lexicon could not observe (#1089). The `--json` and `--report gitlab-mr`
|
|
147
|
+
* shapes have no column for `unobserved`, so both the CLI (on stderr) and the
|
|
148
|
+
* `markdown` report (in the body, since a reviewer never sees a job's stderr)
|
|
149
|
+
* read this same wording rather than drifting apart. Empty when the plan has
|
|
150
|
+
* no hole. Same discipline as {@link disruptionNotices} in `./disruption`.
|
|
151
|
+
*/
|
|
152
|
+
export function unobservedPlanNotice(cs) {
|
|
153
|
+
const count = summarize(cs).unobserved;
|
|
154
|
+
return count > 0
|
|
155
|
+
? [
|
|
156
|
+
`${count} declared entity(ies) could not be observed — no create/update/delete is proposed for them. This plan is incomplete, not clean.`,
|
|
157
|
+
]
|
|
158
|
+
: [];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Section heading text for one action group — shared between {@link renderChangeSet}
|
|
162
|
+
* and {@link renderChangeSetMarkdown} so the wording never drifts between the
|
|
163
|
+
* terminal render and the reviewer-facing one.
|
|
164
|
+
*/
|
|
165
|
+
function actionSectionLabel(action, hasDisruption) {
|
|
166
|
+
switch (action) {
|
|
167
|
+
case "unobserved":
|
|
168
|
+
return "UNOBSERVED (declared; chant could not read live state — no action proposed)";
|
|
169
|
+
case "runtime":
|
|
170
|
+
return "RUNTIME (owned by a declared resource; not drift, never a delete/adopt candidate)";
|
|
171
|
+
case "effect":
|
|
172
|
+
return "EFFECT (receipt absent or stale; the effect step fires — the generic apply never writes a receipt)";
|
|
173
|
+
case "update":
|
|
174
|
+
return hasDisruption
|
|
175
|
+
? "UPDATE (disruption from the lexicon that owns the spec; unknown means nobody could say, not that it is safe)"
|
|
176
|
+
: "UPDATE";
|
|
177
|
+
default:
|
|
178
|
+
return action.toUpperCase();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/** Human-readable render of a change set. Pure — returns a string. */
|
|
182
|
+
export function renderChangeSet(cs) {
|
|
183
|
+
const counts = summarize(cs);
|
|
184
|
+
const header = ACTION_ORDER.map((a) => `${counts[a]} ${a}`).join(", ");
|
|
185
|
+
const lines = [`Plan for ${cs.env}: ${header}`];
|
|
186
|
+
// Disruption (#1665) rides the header too, so the one number that says how
|
|
187
|
+
// much this plan hurts is visible without reading every row.
|
|
188
|
+
const disruption = summarizeDisruption(cs);
|
|
189
|
+
const disruptionParts = Object.entries(disruption)
|
|
190
|
+
.filter(([, n]) => n > 0)
|
|
191
|
+
.map(([level, n]) => `${n} ${level}`);
|
|
192
|
+
if (disruptionParts.length > 0) {
|
|
193
|
+
lines.push(`Disruption: ${disruptionParts.join(", ")}`);
|
|
194
|
+
}
|
|
195
|
+
for (const action of ACTION_ORDER) {
|
|
196
|
+
const group = cs.entries.filter((e) => e.action === action);
|
|
197
|
+
if (group.length === 0)
|
|
198
|
+
continue;
|
|
199
|
+
lines.push(`\n${actionSectionLabel(action, disruptionParts.length > 0)}:`);
|
|
200
|
+
for (const e of group) {
|
|
201
|
+
if (e.action === "effect") {
|
|
202
|
+
lines.push(` effect will fire: ${e.effect ?? e.name} — receipt ${e.name}${e.type ? ` (${e.type})` : ""}` +
|
|
203
|
+
`${e.effectDetail ? ` — ${e.effectDetail}` : ""}`);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
const own = e.ownership === "unknown" ? "" : ` [${e.ownership}]`;
|
|
207
|
+
const why = e.unobservedReason
|
|
208
|
+
? ` — ${unobservedReasonText(e.unobservedReason)}${e.unobservedDetail ? `: ${e.unobservedDetail}` : ""}`
|
|
209
|
+
: "";
|
|
210
|
+
const owner = e.runtimeOwner ? ` — owned by ${e.runtimeOwner}` : "";
|
|
211
|
+
lines.push(` ${e.name}${e.type ? ` (${e.type})` : ""}${own}${why}${owner}${renderDisruption(e)}`);
|
|
212
|
+
const forced = new Set(e.disruptionBecause ?? []);
|
|
213
|
+
for (const d of e.deltas ?? []) {
|
|
214
|
+
// A path the verdict rests on is marked, so a `replace` row says which
|
|
215
|
+
// of five changed properties caused it.
|
|
216
|
+
lines.push(` ${forced.has(d.path) ? "! " : ""}${d.path}: ${fmt(d.oldValue)} → ${fmt(d.newValue)}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (cs.held && cs.held.length > 0) {
|
|
221
|
+
lines.push(`\n${heldSectionLabel()}:`);
|
|
222
|
+
for (const line of heldLines(cs.held))
|
|
223
|
+
lines.push(line);
|
|
224
|
+
}
|
|
225
|
+
return lines.join("\n");
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Section heading for the held set (#2162) — shared between {@link renderChangeSet}
|
|
229
|
+
* and {@link renderChangeSetMarkdown}.
|
|
230
|
+
*/
|
|
231
|
+
function heldSectionLabel() {
|
|
232
|
+
return "HELD (declared heldElsewhere(); not drift, never proposed for update)";
|
|
233
|
+
}
|
|
234
|
+
/** One held property's plain-text line, indented under its entity. */
|
|
235
|
+
function heldLines(held) {
|
|
236
|
+
const lines = [];
|
|
237
|
+
for (const entity of held) {
|
|
238
|
+
const lexicon = entity.lexicon ? ` ${entity.lexicon}` : "";
|
|
239
|
+
lines.push(` ${entity.name} (${entity.type})${lexicon}`);
|
|
240
|
+
for (const h of entity.held) {
|
|
241
|
+
const live = "live" in h ? fmt(h.live) : "<absent>";
|
|
242
|
+
const suspicious = h.suspicious
|
|
243
|
+
? " [SUSPICIOUS: no live value ever showed up here]"
|
|
244
|
+
: "";
|
|
245
|
+
lines.push(` ${h.path}: held by ${h.by} — ${live} (${h.reason})${suspicious}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return lines;
|
|
249
|
+
}
|
|
250
|
+
/** One held property's markdown line, mirroring {@link renderMarkdownEntry}'s formatting. */
|
|
251
|
+
function heldLinesMarkdown(held) {
|
|
252
|
+
const lines = [];
|
|
253
|
+
for (const entity of held) {
|
|
254
|
+
const lexicon = entity.lexicon ? ` \`${entity.lexicon}\`` : "";
|
|
255
|
+
lines.push(`- \`${entity.name}\` (${entity.type})${lexicon}`);
|
|
256
|
+
if (entity.held.length > 0) {
|
|
257
|
+
lines.push(" ```");
|
|
258
|
+
for (const h of entity.held) {
|
|
259
|
+
const live = "live" in h ? fmt(h.live) : "<absent>";
|
|
260
|
+
const suspicious = h.suspicious ? " SUSPICIOUS: no live value ever showed up here" : "";
|
|
261
|
+
lines.push(` ${h.path}: held by ${h.by} — ${live} (${h.reason})${suspicious}`);
|
|
262
|
+
}
|
|
263
|
+
lines.push(" ```");
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return lines;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Entries beyond this in one action group are collapsed into a `<details>`
|
|
270
|
+
* block in {@link renderChangeSetMarkdown} — a group's worth of rows is fine
|
|
271
|
+
* to read inline, a hundred-entry plan is not (#1983).
|
|
272
|
+
*/
|
|
273
|
+
const MARKDOWN_FOLD_THRESHOLD = 20;
|
|
274
|
+
/** One entry's markdown, mirroring the rows {@link renderChangeSet} prints. */
|
|
275
|
+
function renderMarkdownEntry(e) {
|
|
276
|
+
if (e.action === "effect") {
|
|
277
|
+
return [
|
|
278
|
+
`- effect will fire: \`${e.effect ?? e.name}\` — receipt \`${e.name}\`${e.type ? ` (${e.type})` : ""}` +
|
|
279
|
+
`${e.effectDetail ? ` — ${e.effectDetail}` : ""}`,
|
|
280
|
+
];
|
|
281
|
+
}
|
|
282
|
+
const lexicon = e.lexicon ? ` \`${e.lexicon}\`` : "";
|
|
283
|
+
const own = e.ownership === "unknown" ? "" : ` [${e.ownership}]`;
|
|
284
|
+
const why = e.unobservedReason
|
|
285
|
+
? ` — ${unobservedReasonText(e.unobservedReason)}${e.unobservedDetail ? `: ${e.unobservedDetail}` : ""}`
|
|
286
|
+
: "";
|
|
287
|
+
const owner = e.runtimeOwner ? ` — owned by \`${e.runtimeOwner}\`` : "";
|
|
288
|
+
// Bolded rather than the plain-text render's bare " — destroy: ..." — a
|
|
289
|
+
// reviewer scanning a wall of "update" rows should see disruption without
|
|
290
|
+
// reading every one (#1665).
|
|
291
|
+
const disruption = e.disruption
|
|
292
|
+
? ` — **${e.disruption}**${e.disruptionDetail ? `: ${e.disruptionDetail}` : ""}`
|
|
293
|
+
: "";
|
|
294
|
+
const lines = [`- \`${e.name}\`${e.type ? ` (${e.type})` : ""}${lexicon}${own}${why}${owner}${disruption}`];
|
|
295
|
+
if (e.deltas && e.deltas.length > 0) {
|
|
296
|
+
const forced = new Set(e.disruptionBecause ?? []);
|
|
297
|
+
lines.push(" ```");
|
|
298
|
+
for (const d of e.deltas) {
|
|
299
|
+
lines.push(` ${forced.has(d.path) ? "! " : " "}${d.path}: ${fmt(d.oldValue)} → ${fmt(d.newValue)}`);
|
|
300
|
+
}
|
|
301
|
+
lines.push(" ```");
|
|
302
|
+
}
|
|
303
|
+
return lines;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Markdown projection of a change set (#1983) — sized for a PR/MR comment
|
|
307
|
+
* rather than a terminal. A scannable counts header, entries grouped by
|
|
308
|
+
* action and attributed to their lexicon, deltas in a fenced block, and any
|
|
309
|
+
* group past {@link MARKDOWN_FOLD_THRESHOLD} folded into a `<details>` so a
|
|
310
|
+
* large plan doesn't bury the comment. Pure — no ANSI, no I/O — and
|
|
311
|
+
* deterministic: same entry ordering as {@link renderChangeSet}.
|
|
312
|
+
*
|
|
313
|
+
* Both a hole (#1089) and an expensive verdict (#1665) are surfaced IN the
|
|
314
|
+
* body, not left to stderr the way `--json` and `--report gitlab-mr` leave
|
|
315
|
+
* them: a reviewer reading a comment never sees the job's log, so a plan
|
|
316
|
+
* carrying either must not read as clean.
|
|
317
|
+
*/
|
|
318
|
+
export function renderChangeSetMarkdown(cs) {
|
|
319
|
+
const counts = summarize(cs);
|
|
320
|
+
const lines = [`## Plan for \`${cs.env}\``, "", ACTION_ORDER.map((a) => `${counts[a]} ${a}`).join(", ")];
|
|
321
|
+
const disruption = summarizeDisruption(cs);
|
|
322
|
+
const disruptionParts = Object.entries(disruption)
|
|
323
|
+
.filter(([, n]) => n > 0)
|
|
324
|
+
.map(([level, n]) => `${n} ${level}`);
|
|
325
|
+
if (disruptionParts.length > 0) {
|
|
326
|
+
lines.push("", `**Disruption:** ${disruptionParts.join(", ")}`);
|
|
327
|
+
}
|
|
328
|
+
for (const notice of unobservedPlanNotice(cs)) {
|
|
329
|
+
lines.push("", `> **${notice}**`);
|
|
330
|
+
}
|
|
331
|
+
for (const action of ACTION_ORDER) {
|
|
332
|
+
const group = cs.entries.filter((e) => e.action === action);
|
|
333
|
+
if (group.length === 0)
|
|
334
|
+
continue;
|
|
335
|
+
lines.push("", `### ${actionSectionLabel(action, disruptionParts.length > 0)}`);
|
|
336
|
+
const body = group.flatMap((e) => renderMarkdownEntry(e));
|
|
337
|
+
if (group.length > MARKDOWN_FOLD_THRESHOLD) {
|
|
338
|
+
lines.push("", `<details><summary>${group.length} entries — click to expand</summary>`, "", ...body, "", "</details>");
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
lines.push("", ...body);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (cs.held && cs.held.length > 0) {
|
|
345
|
+
lines.push("", `### ${heldSectionLabel()}`, "", ...heldLinesMarkdown(cs.held));
|
|
346
|
+
}
|
|
347
|
+
return lines.join("\n").trimEnd() + "\n";
|
|
348
|
+
}
|
|
349
|
+
function fmt(v) {
|
|
350
|
+
if (v === undefined)
|
|
351
|
+
return "<unset>";
|
|
352
|
+
if (typeof v === "string")
|
|
353
|
+
return v.length > 60 ? v.slice(0, 57) + "..." : v;
|
|
354
|
+
const json = JSON.stringify(v);
|
|
355
|
+
return json.length > 60 ? json.slice(0, 57) + "..." : json;
|
|
356
|
+
}
|