@intentius/chant 0.124.12 → 0.124.14
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.js +668 -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.js +312 -0
- package/dist/child-project.js +21 -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.js +134 -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.js +305 -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.js +208 -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 +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- 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 +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +260 -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.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +193 -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.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.js +64 -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.js +997 -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.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.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- 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 +460 -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.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -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.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- 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.js +587 -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 +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +245 -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/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +36 -6
- 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/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -0
- 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/discover.ts +3 -0
- package/src/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +5 -30
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SBOM document type + the injectable, artifact-type-keyed `SbomGenerator`
|
|
3
|
+
* boundary (#606, epic #551 "Build & deploy observability" follow-up to
|
|
4
|
+
* #564/#568). Mirrors ./cloud-executor.ts's `CloudExecutor` pattern: a real
|
|
5
|
+
* backend may shell out to `syft`/`docker buildx --sbom`/`cyclonedx-maven`,
|
|
6
|
+
* but no test and no default import ever does — every backend here is
|
|
7
|
+
* injected, and tests construct a `MockSbomGenerator`
|
|
8
|
+
* (./__tests__/mock-sbom-generator.ts) instead.
|
|
9
|
+
*
|
|
10
|
+
* **Format-agnostic by construction.** An SBOM is stored as an opaque typed
|
|
11
|
+
* doc: `{ format, mediaType, bytes }`. Nothing downstream (the build-archive
|
|
12
|
+
* manifest, the build ledger, `chant components status`) branches on
|
|
13
|
+
* `format` — every consumer keys off `mediaType`, the same convention
|
|
14
|
+
* `BuildArchiveEntry.mediaType` already uses for image/template/asset
|
|
15
|
+
* entries (./build-archive.ts). SPDX (`application/spdx+json`) and
|
|
16
|
+
* CycloneDX (`application/vnd.cyclonedx+json`) are both first-class; neither
|
|
17
|
+
* is hardcoded as *the* format anywhere in this module or its consumers.
|
|
18
|
+
*
|
|
19
|
+
* **Default format:** SPDX, matching the epic's refinement from the
|
|
20
|
+
* devops-cloud.news SBOM article — BuildKit natively emits SPDX attestations
|
|
21
|
+
* for images, so the image/BuildKit backend defaults to SPDX; the `syft`
|
|
22
|
+
* backend can emit either and defaults to SPDX here too, for one predictable
|
|
23
|
+
* default across artifact types. Override via `chant.config.ts`'s
|
|
24
|
+
* `sbom.format` (see ../../config.ts) and/or a component's own `build.sbom`
|
|
25
|
+
* (see ../component.ts's `BuildSpec`). Documented in
|
|
26
|
+
* docs/components/build-archive.mdx.
|
|
27
|
+
*
|
|
28
|
+
* **Artifact-type-keyed generation.** "Generate an SBOM" has a different
|
|
29
|
+
* real implementation per artifact type — an image asks BuildKit or scans
|
|
30
|
+
* the built image with `syft`; a JAR is scanned with `syft` or
|
|
31
|
+
* `cyclonedx-maven`; a zip/Lambda package is scanned with `syft`; a bare
|
|
32
|
+
* source directory is scanned with `syft`/`cdxgen`. `SbomGenerator` is one
|
|
33
|
+
* interface with one method per artifact type — analogous to
|
|
34
|
+
* `PublishImageBackend` being one interface satisfied by two backends
|
|
35
|
+
* (./publish.ts) — so the *capability* (./sbom.ts) stays artifact-type
|
|
36
|
+
* agnostic and simply calls the method matching the archive entry it was
|
|
37
|
+
* handed.
|
|
38
|
+
*/
|
|
39
|
+
// `lockfileSbomGenerator` (#630's hermetic default, below) lives in
|
|
40
|
+
// ./lockfile-sbom-generator.ts, which itself imports `DEFAULT_SBOM_FORMAT`/
|
|
41
|
+
// `SbomGeneratorNotImplementedError` from *this* module — a deliberate
|
|
42
|
+
// circular import. Safe here because the only use of `lockfileSbomGenerator`
|
|
43
|
+
// in this file is inside `defaultSbomGenerator()`'s function body (evaluated
|
|
44
|
+
// lazily, on first call), never at this module's own top-level/import time,
|
|
45
|
+
// so it doesn't matter which module's evaluation finishes first.
|
|
46
|
+
import { lockfileSbomGenerator } from "./lockfile-sbom-generator.js";
|
|
47
|
+
/** Canonical media type per format, mirroring `BuildArchiveEntry.mediaType`'s convention (./build-archive.ts). */
|
|
48
|
+
export const SBOM_MEDIA_TYPES = {
|
|
49
|
+
spdx: "application/spdx+json",
|
|
50
|
+
cyclonedx: "application/vnd.cyclonedx+json",
|
|
51
|
+
};
|
|
52
|
+
/** Project-wide default SBOM format when neither `chant.config.ts`'s `sbom.format` nor a component's `build.sbom.format` says otherwise. Documented in docs/components/build-archive.mdx. */
|
|
53
|
+
export const DEFAULT_SBOM_FORMAT = "spdx";
|
|
54
|
+
/**
|
|
55
|
+
* Thrown by `NotImplementedSbomGenerator` — the "no real backend wired yet"
|
|
56
|
+
* signal, matching `CapabilityNotImplementedError`'s role for verb stubs
|
|
57
|
+
* (../capability.ts). Kept distinct from a generic `Error` so callers (and
|
|
58
|
+
* tests) can assert on it specifically.
|
|
59
|
+
*/
|
|
60
|
+
export class SbomGeneratorNotImplementedError extends Error {
|
|
61
|
+
constructor(method) {
|
|
62
|
+
super(`SbomGenerator.${method} has no real implementation configured — inject a real generator ` +
|
|
63
|
+
`(shelling out to syft/buildx/cyclonedx-maven/cdxgen) or use a mock in tests`);
|
|
64
|
+
this.method = method;
|
|
65
|
+
this.name = "SbomGeneratorNotImplementedError";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* All-throwing `SbomGenerator`: every method throws
|
|
70
|
+
* `SbomGeneratorNotImplementedError`. No longer the process-wide default (see
|
|
71
|
+
* `defaultSbomGenerator` below, #630) — kept exported for callers that
|
|
72
|
+
* deliberately want the loud, no-backend-at-all behavior (e.g. a test
|
|
73
|
+
* asserting on the thrown error itself, or a caller that wants to force
|
|
74
|
+
* "nothing is wired" rather than silently getting the hermetic backend).
|
|
75
|
+
*/
|
|
76
|
+
export const notImplementedSbomGenerator = {
|
|
77
|
+
async forImage() {
|
|
78
|
+
throw new SbomGeneratorNotImplementedError("forImage");
|
|
79
|
+
},
|
|
80
|
+
async forJar() {
|
|
81
|
+
throw new SbomGeneratorNotImplementedError("forJar");
|
|
82
|
+
},
|
|
83
|
+
async forZip() {
|
|
84
|
+
throw new SbomGeneratorNotImplementedError("forZip");
|
|
85
|
+
},
|
|
86
|
+
async forDir() {
|
|
87
|
+
throw new SbomGeneratorNotImplementedError("forDir");
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
/** Lazily-constructed process-wide default, mirroring ./cloud-executor.ts's `defaultCloudExecutor`. */
|
|
91
|
+
let defaultGenerator;
|
|
92
|
+
/**
|
|
93
|
+
* The default `SbomGenerator` the `generate-sbom` capability falls back to
|
|
94
|
+
* when none is supplied.
|
|
95
|
+
*
|
|
96
|
+
* **Hermetic by default (#630).** This is `./lockfile-sbom-generator.ts`'s
|
|
97
|
+
* `lockfileSbomGenerator` — `forDir`/`forZip`/`forJar` parse a
|
|
98
|
+
* `package-lock.json`/`pom.xml` already on disk (no `syft`, no network, no
|
|
99
|
+
* external tool) and emit a real SPDX/CycloneDX document. That means a
|
|
100
|
+
* newcomer composing `generate-sbom` over a source directory, a zip/Lambda
|
|
101
|
+
* package, or a JAR gets a working SBOM the moment they `chant run
|
|
102
|
+
* --components`, with nothing to install first — the whole point of #630's
|
|
103
|
+
* "runnable proof" bar. `forImage` still throws
|
|
104
|
+
* `SbomGeneratorNotImplementedError`: no hermetic backend can see an image's
|
|
105
|
+
* base layers, so an image SBOM still needs the real deep-scan tool backend
|
|
106
|
+
* (`syft`/`docker buildx --sbom`/`cyclonedx-maven`/`cdxgen`, #610) — a
|
|
107
|
+
* documented, deliberate gap, not an oversight. This was previously
|
|
108
|
+
* `notImplementedSbomGenerator` (every method throwing); switching the
|
|
109
|
+
* default is intentional per #630 — the prior "loud failure by default"
|
|
110
|
+
* traded newcomer runnability for a default nobody exercised without opting
|
|
111
|
+
* in, which #613 already built a hermetic backend to fix but never wired up.
|
|
112
|
+
* A project that truly wants the old all-throwing behavior can construct
|
|
113
|
+
* `createGenerateSbomCapability(notImplementedSbomGenerator)` explicitly.
|
|
114
|
+
*/
|
|
115
|
+
export function defaultSbomGenerator() {
|
|
116
|
+
if (!defaultGenerator)
|
|
117
|
+
defaultGenerator = lockfileSbomGenerator;
|
|
118
|
+
return defaultGenerator;
|
|
119
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `generate-sbom` capability (#606, epic #551 follow-up to #564's build
|
|
3
|
+
* archive / #568's build ledger — closes the "produce" side #568 explicitly
|
|
4
|
+
* deferred).
|
|
5
|
+
*
|
|
6
|
+
* One capability, artifact-type-keyed via the injectable `SbomGenerator`
|
|
7
|
+
* (./sbom-generator.ts — mirrors ./cloud-executor.ts's `CloudExecutor`
|
|
8
|
+
* pattern), so a build-producing component of *any* artifact type — image,
|
|
9
|
+
* JAR, zip/Lambda package, or a bare source directory for a config-only
|
|
10
|
+
* producer — generates its SBOM through the same verb. Never docker-only:
|
|
11
|
+
* dispatch is on `input.artifactType`, not on which build capability
|
|
12
|
+
* produced the artifact.
|
|
13
|
+
*
|
|
14
|
+
* Writes the result into the build-archive manifest as an `sbom`-kind entry
|
|
15
|
+
* (../verbs/build-archive.ts), content-addressed and linked to its subject
|
|
16
|
+
* artifact's digest via `subjectDigest` — the **universal home** for the
|
|
17
|
+
* SBOM regardless of artifact type or registry availability. Registering the
|
|
18
|
+
* SBOM as an OCI referrer for image artifacts at publish time is a separate,
|
|
19
|
+
* later concern (the publish step/registry tooling's job, see
|
|
20
|
+
* ../../lifecycle/build-ledger.ts's `ReferrerLookup` for the consume side);
|
|
21
|
+
* this capability only ever writes the archive-carried copy, so it works
|
|
22
|
+
* unconditionally — including the registry-less `load-image-on-host` path.
|
|
23
|
+
*
|
|
24
|
+
* Config-only / infra components have no built artifact and simply never
|
|
25
|
+
* compose this step into their `deploy`/`build` phase — "skips cleanly" is
|
|
26
|
+
* structural (no step to run), not a special case this module needs to
|
|
27
|
+
* detect. Opt-out is the same: a component that wants no SBOM omits the
|
|
28
|
+
* `generate-sbom` step from its composition.
|
|
29
|
+
*/
|
|
30
|
+
import { addArchiveEntry, archiveRelativePath, contentDigest, createBuildArchiveManifest, } from "./build-archive.js";
|
|
31
|
+
import { defaultSbomGenerator, DEFAULT_SBOM_FORMAT, } from "./sbom-generator.js";
|
|
32
|
+
/** Default archive path for a generated SBOM when `into` is omitted: `<artifact path>.sbom.json`. */
|
|
33
|
+
function defaultSbomPath(artifactPath) {
|
|
34
|
+
return `${archiveRelativePath(artifactPath)}.sbom.json`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Dispatch one `SbomGenerator` call by `artifactType` — the only place this
|
|
38
|
+
* capability branches on artifact type, matching how `selectPublishBackend`
|
|
39
|
+
* (./publish.ts) is the only place the publish family branches on backend
|
|
40
|
+
* kind. Never a component/cloud name, always an artifact shape.
|
|
41
|
+
*/
|
|
42
|
+
async function generate(generator, input, artifactPath) {
|
|
43
|
+
switch (input.artifactType) {
|
|
44
|
+
case "image":
|
|
45
|
+
return generator.forImage({ imagePath: artifactPath, digest: input.digest ?? "", format: input.format });
|
|
46
|
+
case "jar":
|
|
47
|
+
return generator.forJar({ jarPath: artifactPath, digest: input.digest ?? "", format: input.format });
|
|
48
|
+
case "zip":
|
|
49
|
+
return generator.forZip({ zipPath: artifactPath, digest: input.digest ?? "", format: input.format });
|
|
50
|
+
case "dir":
|
|
51
|
+
return generator.forDir({ path: artifactPath, format: input.format });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate an SBOM for a build-producing component's artifact (image, JAR,
|
|
56
|
+
* zip, or source directory) via the artifact-type-keyed `SbomGenerator`, and
|
|
57
|
+
* fold the result into the build-archive manifest as an `sbom`-kind entry
|
|
58
|
+
* linked to the subject artifact's digest. Format defaults to
|
|
59
|
+
* `DEFAULT_SBOM_FORMAT` (SPDX) when neither `input.format` nor the injected
|
|
60
|
+
* generator overrides it — see ./sbom-generator.ts's module doc for the
|
|
61
|
+
* full default-resolution story. `chant.config.ts`'s `sbom.format` (see
|
|
62
|
+
* ../../config.ts's `ChantConfig.sbom` and `resolveSbomFormat`) is resolved
|
|
63
|
+
* by the caller/orchestrator into `input.format` before this capability
|
|
64
|
+
* runs, the same way env config is resolved before any other capability's
|
|
65
|
+
* `run` (this module never imports ../../config.ts directly, matching how
|
|
66
|
+
* no other verb module does either).
|
|
67
|
+
*
|
|
68
|
+
* No rollback: an already-generated SBOM sitting in the archive (or, later,
|
|
69
|
+
* projected as a registry referrer) is immutable, content-addressed
|
|
70
|
+
* evidence — nothing to compensate, the same opt-out `docker-build` and
|
|
71
|
+
* `publish-image` already take for their own no-mutable-remote-state reason.
|
|
72
|
+
*/
|
|
73
|
+
export function createGenerateSbomCapability(generator = defaultSbomGenerator()) {
|
|
74
|
+
return {
|
|
75
|
+
kind: "generate-sbom",
|
|
76
|
+
async run(ctx, input) {
|
|
77
|
+
const artifactPath = archiveRelativePath(input.path);
|
|
78
|
+
const format = input.format ?? DEFAULT_SBOM_FORMAT;
|
|
79
|
+
const sbom = await generate(generator, { ...input, format }, artifactPath);
|
|
80
|
+
const into = input.into ?? defaultSbomPath(input.path);
|
|
81
|
+
const digest = contentDigest(sbom.bytes);
|
|
82
|
+
const base = input.manifest ?? createBuildArchiveManifest(ctx.component);
|
|
83
|
+
const manifest = addArchiveEntry(base, {
|
|
84
|
+
kind: "sbom",
|
|
85
|
+
path: into,
|
|
86
|
+
digest,
|
|
87
|
+
mediaType: sbom.mediaType,
|
|
88
|
+
subjectDigest: input.digest,
|
|
89
|
+
packageCount: sbom.packageCount,
|
|
90
|
+
generator: sbom.generator,
|
|
91
|
+
});
|
|
92
|
+
return { sbom, archivePath: into, digest, manifest };
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Default `generate-sbom` capability, backed by the process-wide default `SbomGenerator` — the hermetic lockfile backend (#630), so `dir`/`zip`/`jar` work with no tool installed; only `forImage` throws until `toolSbomGenerator` is injected. See ./sbom-generator.ts's `defaultSbomGenerator`. */
|
|
97
|
+
export const generateSbomCapability = createGenerateSbomCapability();
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* escape hatch family — `shell`. Typed, but flagged: a raw shell step run by
|
|
3
|
+
* exactly one component is the "capability-per-component" smell the model
|
|
4
|
+
* exists to avoid (see docs/components/capabilities.mdx#the-discipline).
|
|
5
|
+
* `reason` is required so lint (COMP006) can flag an escape hatch used without
|
|
6
|
+
* a stated justification.
|
|
7
|
+
*/
|
|
8
|
+
import { defaultProcessRunner, q } from "./process-runner.js";
|
|
9
|
+
import { releaseEnvironment } from "../../telemetry-attribution.js";
|
|
10
|
+
/**
|
|
11
|
+
* Run an arbitrary shell command through the injectable {@link ProcessRunner}.
|
|
12
|
+
* The escape hatch — typed, lint-flagged, and requires a `reason`. A non-zero
|
|
13
|
+
* exit rejects (with the command's own stderr), failing the step like any other
|
|
14
|
+
* capability error, so `onFailure`/rollback fires.
|
|
15
|
+
*/
|
|
16
|
+
export function createShellCapability(processRunner = defaultProcessRunner()) {
|
|
17
|
+
return {
|
|
18
|
+
kind: "shell",
|
|
19
|
+
async run(ctx, input) {
|
|
20
|
+
// A release run exports its attributes (#3061, ws-081), so a `docker compose up` here fills the
|
|
21
|
+
// Compose file's `${CHANT_RELEASE_ATTRIBUTES:-}`. A value the step sets itself wins.
|
|
22
|
+
const env = { ...releaseEnvironment(ctx.release), ...(input.env ?? {}) };
|
|
23
|
+
const envPrefix = Object.keys(env).length > 0
|
|
24
|
+
? `env ${Object.entries(env).map(([k, v]) => `${k}=${q(v)}`).join(" ")} `
|
|
25
|
+
: "";
|
|
26
|
+
const { stdout } = await processRunner.run(`${envPrefix}${input.cmd}`, { cwd: input.cwd });
|
|
27
|
+
return { stdout, exitCode: 0 };
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Default `shell` capability, backed by the real process runner. */
|
|
32
|
+
export const shellCapability = createShellCapability();
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sign` capability — keyless cosign signing + SLSA provenance attestation
|
|
3
|
+
* (#622, epic #551 follow-up to #610's referrer-attach path and #614's
|
|
4
|
+
* reproducibility/provenance material). The companion gate is
|
|
5
|
+
* `./verify.ts`'s `verify` capability.
|
|
6
|
+
*
|
|
7
|
+
* **Beginner footgun #1 neutralized: sign the digest, never a tag.** `input`
|
|
8
|
+
* requires an already-resolved `sha256:` image reference (typically wired
|
|
9
|
+
* from a prior publish step, `"@Publish.uri"`, which is itself
|
|
10
|
+
* `repo@sha256:...` — see ./publish.ts) — never a bare tag. A tag is mutable;
|
|
11
|
+
* signing one says nothing about which bytes were actually signed by the
|
|
12
|
+
* time someone pulls it. `assertDigestRef` below throws before ever shelling
|
|
13
|
+
* out if a caller passes a tag-only reference.
|
|
14
|
+
*
|
|
15
|
+
* **Beginner footgun #2 neutralized: keyless by default.** Sign via cosign's
|
|
16
|
+
* keyless flow (a short-lived Fulcio cert bound to an OIDC identity, logged
|
|
17
|
+
* to the public Rekor transparency log) — `cosign sign --yes <ref>` with no
|
|
18
|
+
* `--key`. There is no private key file for a first-timer to generate, lose,
|
|
19
|
+
* leak, or forget to rotate. Key-based signing (`input.key`) is an opt-in
|
|
20
|
+
* override for teams with an existing KMS/file-based key policy, never the
|
|
21
|
+
* default — see `buildSignArgs`/`buildAttestArgs` below: `--key` is added
|
|
22
|
+
* only when `input.key` is explicitly supplied, and it is the *only* thing
|
|
23
|
+
* that changes about the invocation (still by digest, still attached the
|
|
24
|
+
* same way).
|
|
25
|
+
*
|
|
26
|
+
* **SLSA provenance.** `attestProvenance` builds an in-toto
|
|
27
|
+
* `https://slsa.dev/provenance/v1` statement from the same
|
|
28
|
+
* `ProvenanceLink`/`ArtifactReproducibility` material #614's
|
|
29
|
+
* ./reproducibility.ts already records per build-archive entry (source ref,
|
|
30
|
+
* artifact digest) plus a builder id and timestamp, then signs+attaches it
|
|
31
|
+
* via `cosign attest` (keyless by the same default). This reuses #614's
|
|
32
|
+
* provenance model rather than inventing a second one — the in-toto
|
|
33
|
+
* statement's `predicate.buildDefinition.resolvedDependencies` /
|
|
34
|
+
* `.internalParameters` are populated from the same source-ref/digest link a
|
|
35
|
+
* build archive entry already carries.
|
|
36
|
+
*
|
|
37
|
+
* Both `sign` and `attestProvenance` shell out to `cosign` through the
|
|
38
|
+
* injectable `ProcessRunner` (./process-runner.ts) — mirroring
|
|
39
|
+
* ./tool-sbom-generator.ts and ./publish.ts's referrer-attach step exactly:
|
|
40
|
+
* `requireTool` throws `ToolNotAvailableError` with an actionable message if
|
|
41
|
+
* `cosign` is absent, and no test here ever spawns a real process or talks
|
|
42
|
+
* to Rekor/Fulcio.
|
|
43
|
+
*
|
|
44
|
+
* **#1943 extension (`run-agent` interop).** `BuildProvenanceStatementInput`
|
|
45
|
+
* gained two optional merge fields, `externalParameters`/`internalParameters`
|
|
46
|
+
* — additive only, every existing call site's statement is byte-identical
|
|
47
|
+
* without them. `run-agent` (./run-agent.ts's `buildRunAgentProvenanceStatement`)
|
|
48
|
+
* is the first caller to use them, plus `buildType` (already overridable,
|
|
49
|
+
* unchanged here) set to a `run-agent`-specific recipe URI. `predicateType`
|
|
50
|
+
* stays `"https://slsa.dev/provenance/v1"` for every caller, `run-agent`
|
|
51
|
+
* included — see ./run-agent.ts's own doc comment ("Attestation interop")
|
|
52
|
+
* for why a turn is attested as an SLSA-shaped provenance predicate rather
|
|
53
|
+
* than under a minted `run-agent`-specific `predicateType`, and why that
|
|
54
|
+
* decision means `sign`/`attestProvenance`/`../verbs/verify.ts` needed zero
|
|
55
|
+
* changes to their `cosign` invocations to attest/verify a turn.
|
|
56
|
+
*/
|
|
57
|
+
import { defaultProcessRunner, q, requireTool } from "./process-runner.js";
|
|
58
|
+
// ── shared: digest-only reference guard ─────────────────────────────────────
|
|
59
|
+
/**
|
|
60
|
+
* Thrown when a `sign`/`attest` input's image reference has no `@sha256:...`
|
|
61
|
+
* digest — refusing to sign a mutable tag (beginner footgun #1) rather than
|
|
62
|
+
* silently signing whatever the tag happens to resolve to right now.
|
|
63
|
+
*/
|
|
64
|
+
export class SignTargetNotDigestError extends Error {
|
|
65
|
+
constructor(ref, verb) {
|
|
66
|
+
super(`${verb} "${ref}": expected a digest reference ("repo@sha256:...", e.g. from a prior publish step's "@Publish.uri") — ` +
|
|
67
|
+
`signing a mutable tag would not pin which bytes were signed. Pass the digest-qualified reference instead.`);
|
|
68
|
+
this.ref = ref;
|
|
69
|
+
this.verb = verb;
|
|
70
|
+
this.name = "SignTargetNotDigestError";
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** True if `ref` carries an `@sha256:<hex>` digest — the only form `sign`/`attest` accept. */
|
|
74
|
+
function isDigestRef(ref) {
|
|
75
|
+
return /@sha256:[0-9a-f]{64}$/i.test(ref);
|
|
76
|
+
}
|
|
77
|
+
/** Throw `SignTargetNotDigestError` unless `ref` is digest-qualified. */
|
|
78
|
+
function assertDigestRef(ref, verb) {
|
|
79
|
+
if (!isDigestRef(ref))
|
|
80
|
+
throw new SignTargetNotDigestError(ref, verb);
|
|
81
|
+
}
|
|
82
|
+
/** Append the shared keyless/key-based signing flags to a cosign argv, mutating `args` in place. Shared by `buildSignArgs` and `buildAttestArgs` so both stay in lockstep. */
|
|
83
|
+
function appendSigningFlags(args, opts) {
|
|
84
|
+
if (opts.key) {
|
|
85
|
+
args.push("--key", q(opts.key.key));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// Keyless (default): no --key at all — cosign's own keyless flow (Fulcio + Rekor).
|
|
89
|
+
const k = opts.keyless;
|
|
90
|
+
if (k?.identityToken)
|
|
91
|
+
args.push("--identity-token", q(k.identityToken));
|
|
92
|
+
if (k?.oidcIssuer)
|
|
93
|
+
args.push("--oidc-issuer", q(k.oidcIssuer));
|
|
94
|
+
if (k?.oidcClientId)
|
|
95
|
+
args.push("--oidc-client-id", q(k.oidcClientId));
|
|
96
|
+
if (k?.fulcioUrl)
|
|
97
|
+
args.push("--fulcio-url", q(k.fulcioUrl));
|
|
98
|
+
if (k?.rekorUrl)
|
|
99
|
+
args.push("--rekor-url", q(k.rekorUrl));
|
|
100
|
+
}
|
|
101
|
+
/** Build the `cosign sign` argv (as a shell command string) for `input` — factored out so tests can assert on the exact invocation without needing a full mock run. */
|
|
102
|
+
export function buildSignArgs(input) {
|
|
103
|
+
const args = ["cosign", "sign", "--yes"];
|
|
104
|
+
appendSigningFlags(args, { keyless: input.keyless, key: input.key });
|
|
105
|
+
for (const [k, v] of Object.entries(input.annotations ?? {})) {
|
|
106
|
+
args.push("-a", q(`${k}=${v}`));
|
|
107
|
+
}
|
|
108
|
+
args.push(q(input.imageRef));
|
|
109
|
+
return args.join(" ");
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Sign an artifact by digest via keyless cosign (default) or an opt-in
|
|
113
|
+
* key-based override, and attach the signature as an OCI referrer on that
|
|
114
|
+
* digest — `cosign sign` itself performs the attach (cosign's signatures are
|
|
115
|
+
* always stored as registry referrers/the legacy tag convention; no separate
|
|
116
|
+
* `oras attach` step is needed the way SBOM/BOM referrer attach in
|
|
117
|
+
* ./publish.ts requires one, since cosign natively pushes to the registry).
|
|
118
|
+
* Refuses to run at all against a non-digest reference (`SignTargetNotDigestError`)
|
|
119
|
+
* — sign is never invoked for a tag, by construction, before any process is spawned.
|
|
120
|
+
*
|
|
121
|
+
* No rollback: an already-signed, content-addressed image's signature is
|
|
122
|
+
* immutable evidence sitting in the registry — nothing to compensate, the
|
|
123
|
+
* same opt-out `publish-image`/`generate-sbom` already take for
|
|
124
|
+
* no-mutable-remote-state operations.
|
|
125
|
+
*/
|
|
126
|
+
export function createSignCapability(processRunner = defaultProcessRunner()) {
|
|
127
|
+
return {
|
|
128
|
+
kind: "sign",
|
|
129
|
+
async run(_ctx, input) {
|
|
130
|
+
assertDigestRef(input.imageRef, "sign");
|
|
131
|
+
await requireTool(processRunner, "cosign", `sign ${input.imageRef}`);
|
|
132
|
+
await processRunner.run(buildSignArgs(input));
|
|
133
|
+
return { imageRef: input.imageRef, signed: true, method: input.key ? "key" : "keyless" };
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** Default `sign` capability, backed by the real `ProcessRunner`. */
|
|
138
|
+
export const signCapability = createSignCapability();
|
|
139
|
+
const DEFAULT_BUILD_TYPE = "https://chant.dev/build-archive/v1";
|
|
140
|
+
/** Extract the bare `sha256:...` digest out of a digest-qualified reference (`repo@sha256:...`). */
|
|
141
|
+
function digestOf(ref) {
|
|
142
|
+
const match = /sha256:([0-9a-f]{64})$/i.exec(ref);
|
|
143
|
+
if (!match)
|
|
144
|
+
throw new SignTargetNotDigestError(ref, "attest");
|
|
145
|
+
return match[1];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build an in-toto SLSA provenance statement for `input.imageRef`, reusing
|
|
149
|
+
* #614's `ProvenanceLink` (source ref -> artifact digest) as the statement's
|
|
150
|
+
* `resolvedDependencies`/`internalParameters` material — the honest subset
|
|
151
|
+
* chant can actually attest to (which source commit, which builder, when),
|
|
152
|
+
* matching ./reproducibility.ts's "honesty over convenience" stance rather
|
|
153
|
+
* than fabricating a stronger provenance claim than the build system backs.
|
|
154
|
+
*/
|
|
155
|
+
export function buildProvenanceStatement(input) {
|
|
156
|
+
const digest = digestOf(input.imageRef);
|
|
157
|
+
return {
|
|
158
|
+
_type: "https://in-toto.io/Statement/v1",
|
|
159
|
+
predicateType: "https://slsa.dev/provenance/v1",
|
|
160
|
+
subject: [{ name: input.imageRef, digest: { sha256: digest } }],
|
|
161
|
+
predicate: {
|
|
162
|
+
buildDefinition: {
|
|
163
|
+
buildType: input.buildType ?? DEFAULT_BUILD_TYPE,
|
|
164
|
+
// Reserved keys spread LAST so a caller-supplied key can never clobber
|
|
165
|
+
// them into a signed statement that disagrees with resolvedDependencies.
|
|
166
|
+
externalParameters: { ...input.externalParameters, sourceRef: input.provenance.sourceRef },
|
|
167
|
+
internalParameters: { ...input.internalParameters, artifactDigest: input.provenance.artifactDigest },
|
|
168
|
+
resolvedDependencies: [{ uri: input.provenance.sourceRef, digest: { sha256: digest } }],
|
|
169
|
+
},
|
|
170
|
+
runDetails: {
|
|
171
|
+
builder: { id: input.builderId },
|
|
172
|
+
metadata: {
|
|
173
|
+
...(input.invocationId ? { invocationId: input.invocationId } : {}),
|
|
174
|
+
finishedOn: input.finishedOn ?? new Date().toISOString(),
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Build the `cosign attest` argv (as a shell command string) for a
|
|
182
|
+
* predicate-type/payload pair. Factored out (like `buildSignArgs`) so tests
|
|
183
|
+
* can assert on the exact invocation. `--predicate` reads from a scratch
|
|
184
|
+
* file path (`cosign attest` does not accept the payload on stdin any more
|
|
185
|
+
* reliably than `oras attach` does — see ./publish.ts's `attachOneReferrer`
|
|
186
|
+
* for the same scratch-file convention) — the caller passes the path already
|
|
187
|
+
* written.
|
|
188
|
+
*/
|
|
189
|
+
export function buildAttestArgs(input, predicatePath) {
|
|
190
|
+
const args = ["cosign", "attest", "--yes", "--type", "slsaprovenance1", "--predicate", q(predicatePath)];
|
|
191
|
+
appendSigningFlags(args, { keyless: input.keyless, key: input.key });
|
|
192
|
+
args.push(q(input.imageRef));
|
|
193
|
+
return args.join(" ");
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Build an in-toto SLSA provenance statement for a digest-qualified artifact
|
|
197
|
+
* (reusing #614's `ProvenanceLink` material) and sign+attach it via keyless
|
|
198
|
+
* `cosign attest` (default) or an opt-in key-based override — attached as a
|
|
199
|
+
* referrer alongside the signature (`sign`) and SBOM (`generate-sbom`) on
|
|
200
|
+
* the same digest. Refuses a non-digest `imageRef` the same way `sign` does.
|
|
201
|
+
*
|
|
202
|
+
* No rollback: same reasoning as `sign` — an attached, content-addressed
|
|
203
|
+
* attestation is immutable evidence, nothing to compensate.
|
|
204
|
+
*/
|
|
205
|
+
export function createAttestProvenanceCapability(processRunner = defaultProcessRunner()) {
|
|
206
|
+
return {
|
|
207
|
+
kind: "attest-provenance",
|
|
208
|
+
async run(_ctx, input) {
|
|
209
|
+
assertDigestRef(input.imageRef, "attest");
|
|
210
|
+
await requireTool(processRunner, "cosign", `attest SLSA provenance for ${input.imageRef}`);
|
|
211
|
+
const statement = buildProvenanceStatement(input);
|
|
212
|
+
const scratchFile = `/tmp/chant-provenance-attest/${digestOf(input.imageRef)}-${Date.now()}.json`;
|
|
213
|
+
await processRunner.run(`mkdir -p ${q("/tmp/chant-provenance-attest")}`);
|
|
214
|
+
await processRunner.run(`printf '%s' ${q(JSON.stringify(statement))} > ${q(scratchFile)}`);
|
|
215
|
+
await processRunner.run(buildAttestArgs(input, scratchFile));
|
|
216
|
+
return { imageRef: input.imageRef, statement, attested: true, method: input.key ? "key" : "keyless" };
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/** Default `attest-provenance` capability, backed by the real `ProcessRunner`. */
|
|
221
|
+
export const attestProvenanceCapability = createAttestProvenanceCapability();
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for building typed capability stubs.
|
|
3
|
+
*
|
|
4
|
+
* A stub is fully typed (`kind`, `In`, `Out`) so compositions can wire
|
|
5
|
+
* output -> input and lint can check the graph, but `run`/`rollback` throw
|
|
6
|
+
* `CapabilityNotImplementedError` — no cloud calls, no side effects. Cloud
|
|
7
|
+
* implementations land in a later phase (epic #551).
|
|
8
|
+
*/
|
|
9
|
+
import { CapabilityNotImplementedError } from "../capability.js";
|
|
10
|
+
/**
|
|
11
|
+
* Build a stub `Capability<In, Out>` for `kind`. `supportsRollback` also
|
|
12
|
+
* attaches a `rollback` that throws the same error, so compositions can
|
|
13
|
+
* already reference `rollback` in typed code ahead of the real implementation.
|
|
14
|
+
*/
|
|
15
|
+
export function stubCapability(kind, opts) {
|
|
16
|
+
const capability = {
|
|
17
|
+
kind,
|
|
18
|
+
async run() {
|
|
19
|
+
throw new CapabilityNotImplementedError(kind);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
if (opts?.rollback) {
|
|
23
|
+
capability.rollback = async () => {
|
|
24
|
+
throw new CapabilityNotImplementedError(kind);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return capability;
|
|
28
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real, deep-scan `SbomGenerator` backend (#610, epic #551's "deep external
|
|
3
|
+
* tool" half of the SBOM story — the counterpart to ./lockfile-sbom-generator.ts's
|
|
4
|
+
* hermetic, zero-dependency default from #613). Shells out to whichever
|
|
5
|
+
* external scanner fits the artifact type, through the injectable
|
|
6
|
+
* `ProcessRunner` (./process-runner.ts, itself mirroring
|
|
7
|
+
* ./cloud-executor.ts's `CloudExecutor` pattern):
|
|
8
|
+
*
|
|
9
|
+
* - `image` -> `docker buildx build --sbom=true` (BuildKit's native SPDX
|
|
10
|
+
* attestation) when a Dockerfile build context is available, otherwise a
|
|
11
|
+
* `syft <tarball>` scan of the already-built OCI-layout tarball;
|
|
12
|
+
* - `jar` -> `syft`, or `cyclonedx-maven` when the jar's project directory
|
|
13
|
+
* carries a `pom.xml` (a more Maven-native scan than a bytecode-level jar
|
|
14
|
+
* scan);
|
|
15
|
+
* - `zip` -> `syft <zip>`;
|
|
16
|
+
* - `dir` -> `syft <dir>`, falling back to `cdxgen <dir>` when `syft` is
|
|
17
|
+
* unavailable (`cdxgen`'s "wnat's on disk" mode covers ecosystems syft
|
|
18
|
+
* might not have detected).
|
|
19
|
+
*
|
|
20
|
+
* Every method resolves the specific tool it needs, checks availability via
|
|
21
|
+
* `ProcessRunner.available` first, and throws `ToolNotAvailableError`
|
|
22
|
+
* (./process-runner.ts) with an actionable install hint if the tool is
|
|
23
|
+
* missing — never a silent empty SBOM. Tests inject `MockProcessRunner`
|
|
24
|
+
* (./__tests__/mock-process-runner.ts) and assert on the constructed command
|
|
25
|
+
* line + parsed output; nothing here ever spawns a real process.
|
|
26
|
+
*
|
|
27
|
+
* This backend is **not** the process-wide default (see
|
|
28
|
+
* ./sbom-generator.ts's `notImplementedSbomGenerator` and
|
|
29
|
+
* ./lockfile-sbom-generator.ts's `lockfileSbomGenerator` module docs for why):
|
|
30
|
+
* a project opts in explicitly by constructing
|
|
31
|
+
* `createGenerateSbomCapability(createToolSbomGenerator())` when it wants the
|
|
32
|
+
* deeper, external-tool-backed scan (e.g. to see an image's base-layer OS
|
|
33
|
+
* packages, which no lockfile read can see).
|
|
34
|
+
*/
|
|
35
|
+
import { basename, dirname, join } from "node:path";
|
|
36
|
+
import { existsSync } from "node:fs";
|
|
37
|
+
import { DEFAULT_SBOM_FORMAT, SBOM_MEDIA_TYPES, } from "./sbom-generator.js";
|
|
38
|
+
import { defaultProcessRunner, q, requireTool } from "./process-runner.js";
|
|
39
|
+
/** `syft`'s CycloneDX/SPDX JSON output format flags, keyed by `SbomFormat`. */
|
|
40
|
+
const SYFT_FORMAT = {
|
|
41
|
+
spdx: "spdx-json",
|
|
42
|
+
cyclonedx: "cyclonedx-json",
|
|
43
|
+
};
|
|
44
|
+
/** `cdxgen` only emits CycloneDX; SPDX is not one of its output formats. */
|
|
45
|
+
const CDXGEN_FORMAT = "cyclonedx";
|
|
46
|
+
/** Parse a package count out of a CycloneDX or SPDX JSON document, without requiring a full schema-aware parse — mirrors how ./lockfile-sbom-generator.ts's callers only need a count, not full re-validation. */
|
|
47
|
+
function countPackages(format, bytes) {
|
|
48
|
+
try {
|
|
49
|
+
const doc = JSON.parse(bytes);
|
|
50
|
+
if (format === "cyclonedx" && Array.isArray(doc.components))
|
|
51
|
+
return doc.components.length;
|
|
52
|
+
if (format === "spdx" && Array.isArray(doc.packages))
|
|
53
|
+
return doc.packages.length;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Malformed/unexpected output — report no count rather than throwing;
|
|
57
|
+
// the SBOM bytes themselves are still returned to the caller as-is.
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
/** Build a per-call scratch output path so concurrent scans never collide. */
|
|
62
|
+
function scratchPath(workDir, subject, format) {
|
|
63
|
+
const dir = workDir ?? "/tmp/chant-sbom";
|
|
64
|
+
const safeName = basename(subject).replace(/[^a-zA-Z0-9_.-]/g, "_");
|
|
65
|
+
return join(dir, `${safeName}.${Date.now()}.${format}.json`);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build a real, deep-scan `SbomGenerator` backend. Every method shells out
|
|
69
|
+
* through `options.runner` (default: the real `ProcessRunner`); tests should
|
|
70
|
+
* always pass a `MockProcessRunner` instead.
|
|
71
|
+
*/
|
|
72
|
+
export function createToolSbomGenerator(options = {}) {
|
|
73
|
+
const runner = options.runner ?? defaultProcessRunner();
|
|
74
|
+
async function runSyft(target, format) {
|
|
75
|
+
await requireTool(runner, "syft", `scan ${target} for a software bill of materials`);
|
|
76
|
+
const out = scratchPath(options.workDir, target, format);
|
|
77
|
+
await runner.run(`syft ${q(target)} -o ${SYFT_FORMAT[format]}=${q(out)}`);
|
|
78
|
+
const { stdout } = await runner.run(`cat ${q(out)}`);
|
|
79
|
+
return { bytes: stdout, generator: "syft" };
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
async forImage(input) {
|
|
83
|
+
const format = input.format ?? DEFAULT_SBOM_FORMAT;
|
|
84
|
+
// Prefer BuildKit's own attestation when the image was built from a
|
|
85
|
+
// context on disk right next to the tarball (the common docker-build ->
|
|
86
|
+
// generate-sbom composition); otherwise fall back to scanning the
|
|
87
|
+
// already-saved tarball with syft, which needs no rebuild.
|
|
88
|
+
const buildContext = dirname(input.imagePath);
|
|
89
|
+
const hasDockerfile = existsSync(join(buildContext, "Dockerfile"));
|
|
90
|
+
if (hasDockerfile && (await runner.available("docker"))) {
|
|
91
|
+
const out = scratchPath(options.workDir, input.imagePath, format);
|
|
92
|
+
await runner.run(`docker buildx build --sbom=true --output type=local,dest=${q(out)} ${q(buildContext)}`);
|
|
93
|
+
const { stdout } = await runner.run(`cat ${q(join(out, "sbom.spdx.json"))}`);
|
|
94
|
+
return {
|
|
95
|
+
format,
|
|
96
|
+
mediaType: SBOM_MEDIA_TYPES[format],
|
|
97
|
+
bytes: stdout,
|
|
98
|
+
packageCount: countPackages(format, stdout),
|
|
99
|
+
generator: "buildkit",
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const { bytes, generator } = await runSyft(input.imagePath, format);
|
|
103
|
+
return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes, packageCount: countPackages(format, bytes), generator };
|
|
104
|
+
},
|
|
105
|
+
async forJar(input) {
|
|
106
|
+
const format = input.format ?? DEFAULT_SBOM_FORMAT;
|
|
107
|
+
const projectDir = dirname(input.jarPath);
|
|
108
|
+
const hasPom = existsSync(join(projectDir, "pom.xml"));
|
|
109
|
+
if (hasPom && (await runner.available("mvn"))) {
|
|
110
|
+
await requireTool(runner, "mvn", `run cyclonedx-maven against ${projectDir}`);
|
|
111
|
+
const out = scratchPath(options.workDir, input.jarPath, "cyclonedx");
|
|
112
|
+
await runner.run(`mvn -f ${q(join(projectDir, "pom.xml"))} org.cyclonedx:cyclonedx-maven-plugin:makeAggregateBom -DoutputFormat=json -DoutputName=${q(basename(out, ".json"))}`, { cwd: projectDir });
|
|
113
|
+
const { stdout } = await runner.run(`cat ${q(out)}`);
|
|
114
|
+
return {
|
|
115
|
+
format: "cyclonedx",
|
|
116
|
+
mediaType: SBOM_MEDIA_TYPES.cyclonedx,
|
|
117
|
+
bytes: stdout,
|
|
118
|
+
packageCount: countPackages("cyclonedx", stdout),
|
|
119
|
+
generator: "cyclonedx-maven",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const { bytes, generator } = await runSyft(input.jarPath, format);
|
|
123
|
+
return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes, packageCount: countPackages(format, bytes), generator };
|
|
124
|
+
},
|
|
125
|
+
async forZip(input) {
|
|
126
|
+
const format = input.format ?? DEFAULT_SBOM_FORMAT;
|
|
127
|
+
const { bytes, generator } = await runSyft(input.zipPath, format);
|
|
128
|
+
return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes, packageCount: countPackages(format, bytes), generator };
|
|
129
|
+
},
|
|
130
|
+
async forDir(input) {
|
|
131
|
+
const format = input.format ?? DEFAULT_SBOM_FORMAT;
|
|
132
|
+
if (await runner.available("syft")) {
|
|
133
|
+
const { bytes, generator } = await runSyft(input.path, format);
|
|
134
|
+
return { format, mediaType: SBOM_MEDIA_TYPES[format], bytes, packageCount: countPackages(format, bytes), generator };
|
|
135
|
+
}
|
|
136
|
+
// syft absent — fall back to cdxgen (CycloneDX-only; requested SPDX is
|
|
137
|
+
// reported back as the CycloneDX doc's own format, never silently
|
|
138
|
+
// mislabeled as SPDX).
|
|
139
|
+
await requireTool(runner, "cdxgen", `scan ${input.path} for a software bill of materials (syft is also unavailable)`);
|
|
140
|
+
const out = scratchPath(options.workDir, input.path, CDXGEN_FORMAT);
|
|
141
|
+
await runner.run(`cdxgen -o ${q(out)} ${q(input.path)}`);
|
|
142
|
+
const { stdout } = await runner.run(`cat ${q(out)}`);
|
|
143
|
+
return {
|
|
144
|
+
format: CDXGEN_FORMAT,
|
|
145
|
+
mediaType: SBOM_MEDIA_TYPES[CDXGEN_FORMAT],
|
|
146
|
+
bytes: stdout,
|
|
147
|
+
packageCount: countPackages(CDXGEN_FORMAT, stdout),
|
|
148
|
+
generator: "cdxgen",
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/** Process-wide, real-tool-backed `SbomGenerator`, ready to inject wherever a project opts into the deep-scan path over ./lockfile-sbom-generator.ts's hermetic default. Never constructed by a test. */
|
|
154
|
+
export const toolSbomGenerator = createToolSbomGenerator();
|