@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,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injectable cloud I/O boundary for the *agnostic* capability implementations
|
|
3
|
+
* that remain in core: the `docker` build/push client and the Neo4j bolt-port
|
|
4
|
+
* probe. Every capability here that talks to a real tool goes through a
|
|
5
|
+
* `CloudExecutor` instead of shelling out directly, so production code gets a
|
|
6
|
+
* real, `child_process`/`net`-backed executor and tests get a
|
|
7
|
+
* `MockCloudExecutor` (./__tests__/mock-cloud-executor.ts) that records calls
|
|
8
|
+
* and returns canned results — no live docker, ever, in a test run.
|
|
9
|
+
*
|
|
10
|
+
* The AWS-specific clients (CloudFormation, ECS, Lambda, EMR, CodeDeploy, SSM
|
|
11
|
+
* host, S3, CloudFront, snapshot, ECR) used to live here too. They now live in
|
|
12
|
+
* the aws lexicon (`@intentius/chant-lexicon-aws/components`), contributed
|
|
13
|
+
* through the capability-plugin seam — see docs/components/cloud-boundary. The
|
|
14
|
+
* `docker` client stays in core because it is genuinely cloud-agnostic and
|
|
15
|
+
* shared: `docker-build` (agnostic) uses it here, and the aws lexicon's
|
|
16
|
+
* `publish-image` reuses the exported `realDocker` rather than duplicating it.
|
|
17
|
+
*/
|
|
18
|
+
import { exec } from "node:child_process";
|
|
19
|
+
import { createConnection } from "node:net";
|
|
20
|
+
import { promisify } from "node:util";
|
|
21
|
+
import { isAbsolute, join } from "node:path";
|
|
22
|
+
export const execFileAsync = promisify(exec);
|
|
23
|
+
// ── Real executor — shells out to `docker`; used outside tests ───────────────
|
|
24
|
+
/** Run a shell command, capturing stdout/stderr. Internal to the docker client; the aws lexicon's executor has its own (endpoint-aware) runner. */
|
|
25
|
+
function run(command) {
|
|
26
|
+
return execFileAsync(command, { maxBuffer: 64 * 1024 * 1024 });
|
|
27
|
+
}
|
|
28
|
+
/** Shell-quote a single argument for POSIX shells (wrap in single quotes, escaping embedded ones). Internal; the shared, exported `q` lives in ./process-runner. */
|
|
29
|
+
function q(value) {
|
|
30
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
31
|
+
}
|
|
32
|
+
export const realDocker = {
|
|
33
|
+
async build(args) {
|
|
34
|
+
const parts = [`docker build`, `-t ${q(args.tag)}`];
|
|
35
|
+
if (args.dockerfile) {
|
|
36
|
+
// dockerfile is relative to `context` (its documented contract); docker's `-f` resolves a relative path against cwd, not the context dir, so join them here (chant#936).
|
|
37
|
+
const dockerfilePath = isAbsolute(args.dockerfile) ? args.dockerfile : join(args.context, args.dockerfile);
|
|
38
|
+
parts.push(`-f ${q(dockerfilePath)}`);
|
|
39
|
+
}
|
|
40
|
+
if (args.target)
|
|
41
|
+
parts.push(`--target ${q(args.target)}`);
|
|
42
|
+
for (const [k, v] of Object.entries(args.buildArgs ?? {}))
|
|
43
|
+
parts.push(`--build-arg ${q(`${k}=${v}`)}`);
|
|
44
|
+
parts.push(q(args.context));
|
|
45
|
+
await run(parts.join(" "));
|
|
46
|
+
const { stdout } = await run(`docker image inspect ${q(args.tag)} --format '{{.Id}}'`);
|
|
47
|
+
return { digest: stdout.trim() };
|
|
48
|
+
},
|
|
49
|
+
async save(args) {
|
|
50
|
+
await run(`docker save ${q(args.image)} -o ${q(args.outFile)}`);
|
|
51
|
+
},
|
|
52
|
+
async load(args) {
|
|
53
|
+
const { stdout } = await run(`docker load -i ${q(args.inFile)}`);
|
|
54
|
+
const match = stdout.match(/[Ll]oaded image(?: ID)?:\s*(\S+)/);
|
|
55
|
+
return { digest: match?.[1] ?? stdout.trim() };
|
|
56
|
+
},
|
|
57
|
+
async tag(args) {
|
|
58
|
+
await run(`docker tag ${q(args.source)} ${q(args.target)}`);
|
|
59
|
+
},
|
|
60
|
+
async push(args) {
|
|
61
|
+
await run(`docker push ${q(args.image)}`);
|
|
62
|
+
const { stdout } = await run(`docker image inspect ${q(args.image)} --format '{{index .RepoDigests 0}}'`);
|
|
63
|
+
return { digest: stdout.trim() };
|
|
64
|
+
},
|
|
65
|
+
async remoteDigest(image) {
|
|
66
|
+
const { stdout } = await run(`docker manifest inspect -v ${q(image)}`);
|
|
67
|
+
return stdout.trim();
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
const realNeo4j = {
|
|
71
|
+
async probe(args) {
|
|
72
|
+
const endpoints = args.cluster
|
|
73
|
+
.split(",")
|
|
74
|
+
.map((s) => s.trim())
|
|
75
|
+
.filter(Boolean);
|
|
76
|
+
const results = await Promise.all(endpoints.map((endpoint) => probeBoltPort(endpoint)));
|
|
77
|
+
return { healthyCount: results.filter(Boolean).length, total: endpoints.length };
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
/** Probe one `host:port` bolt endpoint by opening (and immediately closing) a TCP socket. */
|
|
81
|
+
function probeBoltPort(endpoint, timeoutMs = 5000) {
|
|
82
|
+
const [host, portStr] = endpoint.split(":");
|
|
83
|
+
const port = Number(portStr ?? 7687);
|
|
84
|
+
return new Promise((resolve) => {
|
|
85
|
+
const socket = createConnection({ host, port, timeout: timeoutMs });
|
|
86
|
+
const finish = (healthy) => {
|
|
87
|
+
socket.destroy();
|
|
88
|
+
resolve(healthy);
|
|
89
|
+
};
|
|
90
|
+
socket.once("connect", () => finish(true));
|
|
91
|
+
socket.once("timeout", () => finish(false));
|
|
92
|
+
socket.once("error", () => finish(false));
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/** Build a `CloudExecutor` that shells out to the real `docker` CLI and probes real bolt ports. Never used in tests. */
|
|
96
|
+
export function realCloudExecutor() {
|
|
97
|
+
return { docker: realDocker, neo4j: realNeo4j };
|
|
98
|
+
}
|
|
99
|
+
/** Lazily-constructed process-wide default so importing a capability module never shells out at import time. */
|
|
100
|
+
let defaultExecutor;
|
|
101
|
+
/** The default `CloudExecutor` each capability factory falls back to when none is supplied. */
|
|
102
|
+
export function defaultCloudExecutor() {
|
|
103
|
+
if (!defaultExecutor)
|
|
104
|
+
defaultExecutor = realCloudExecutor();
|
|
105
|
+
return defaultExecutor;
|
|
106
|
+
}
|
|
107
|
+
/** Sleep for `ms`. Shared by every polling capability (`wait-*`) between attempts. */
|
|
108
|
+
export function sleep(ms) {
|
|
109
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
110
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component-level BOM aggregation (#614, epic #551 follow-up to #613).
|
|
3
|
+
*
|
|
4
|
+
* A component may produce more than one leaf BOM: a software SBOM
|
|
5
|
+
* (./sbom.ts's `generate-sbom`, over an image/jar/zip/dir) for its built
|
|
6
|
+
* artifact, and/or an IaC config-BOM (./config-bom.ts's `extract-config-bom`)
|
|
7
|
+
* for its synthesized template. Each leaf BOM already validates as its own
|
|
8
|
+
* standalone SPDX/CycloneDX document (#613). This module composes every leaf
|
|
9
|
+
* BOM a component's build archive carries into **one** component-level BOM —
|
|
10
|
+
* a real assembly (CycloneDX `metadata.component` + nested `components` +
|
|
11
|
+
* `compositions` + `dependencies`, or SPDX `documentDescribes`-equivalent
|
|
12
|
+
* `CONTAINS`/`DEPENDS_ON` relationships), not a re-implementation of the
|
|
13
|
+
* writer: `aggregateComponentBom` below reads each leaf BOM's own structural
|
|
14
|
+
* inventory back out (it does not re-parse the leaf's serialized bytes) and
|
|
15
|
+
* hands the result to ./bom-writer.ts's `writeBom`, which gained
|
|
16
|
+
* `BomInput.subDocuments` support for exactly this purpose.
|
|
17
|
+
*
|
|
18
|
+
* **Why not just concatenate/parse the leaf documents' bytes.** The leaf BOM
|
|
19
|
+
* bytes are the source of truth for each artifact independently, but this
|
|
20
|
+
* module needs each leaf's package list as structured data to nest it
|
|
21
|
+
* correctly in the assembly — reparsing SPDX/CycloneDX JSON back into
|
|
22
|
+
* `BomPackage[]` would be a second, format-aware reader this codebase does
|
|
23
|
+
* not otherwise need. Callers therefore pass each leaf's already-known
|
|
24
|
+
* `BomPackage[]` (what `generate-sbom`/`extract-config-bom` built before
|
|
25
|
+
* calling `writeBom` themselves) plus the archive entry it produced — see
|
|
26
|
+
* `ComponentBomLeaf` below. A caller assembling a component's archive
|
|
27
|
+
* end-to-end has both on hand already; nothing here re-derives them from
|
|
28
|
+
* scratch.
|
|
29
|
+
*
|
|
30
|
+
* **Single-artifact = 1:1, multi-artifact = a real assembly.** A component
|
|
31
|
+
* with exactly one leaf BOM produces a component BOM whose only "assembly"
|
|
32
|
+
* is itself — see `aggregateComponentBom`'s single-leaf fast path, which
|
|
33
|
+
* still runs through the same writer and produces a valid document, just
|
|
34
|
+
* with an empty `subDocuments` composition (nothing to nest). A component
|
|
35
|
+
* with two or more leaves gets `subDocuments` populated, the real multi-leaf
|
|
36
|
+
* case #614 asks for.
|
|
37
|
+
*
|
|
38
|
+
* **Release-level rollup is out of scope here** (deferred per #614's note) —
|
|
39
|
+
* this module aggregates *within* one component's archive, never across
|
|
40
|
+
* components/releases.
|
|
41
|
+
*/
|
|
42
|
+
import { sbomEntries } from "./build-archive.js";
|
|
43
|
+
import { writeBom } from "./bom-writer.js";
|
|
44
|
+
import { DEFAULT_SBOM_FORMAT } from "./sbom-generator.js";
|
|
45
|
+
/** Tool name recorded on the aggregate document — distinct from any individual leaf's own `generator` (e.g. "syft", "chant-config-bom-extractor"), since the aggregate is produced by this module, not by whichever tool generated a leaf. */
|
|
46
|
+
const COMPONENT_BOM_GENERATOR = "chant-component-bom-aggregator";
|
|
47
|
+
/**
|
|
48
|
+
* Compose a component's leaf BOMs (a software SBOM and/or an IaC config-BOM,
|
|
49
|
+
* per `input.leaves`) into one component-level BOM via ./bom-writer.ts's
|
|
50
|
+
* assembly support (`BomInput.subDocuments`). Pure — no I/O, no manifest
|
|
51
|
+
* mutation; the caller decides whether/where to write the result to disk
|
|
52
|
+
* (mirroring `extract-config-bom`'s `outDir` convention) and whether to fold
|
|
53
|
+
* it back into the archive as its own entry.
|
|
54
|
+
*
|
|
55
|
+
* Throws if `input.leaves` is empty — aggregation over zero leaves is a
|
|
56
|
+
* caller bug (compose only when at least one BOM exists), not a case this
|
|
57
|
+
* function silently no-ops on.
|
|
58
|
+
*/
|
|
59
|
+
export function aggregateComponentBom(input) {
|
|
60
|
+
if (input.leaves.length === 0) {
|
|
61
|
+
throw new Error(`aggregateComponentBom: component "${input.component}" has no leaf BOMs to aggregate — ` +
|
|
62
|
+
`only call this once at least one generate-sbom/extract-config-bom leaf exists`);
|
|
63
|
+
}
|
|
64
|
+
const format = input.format ?? DEFAULT_SBOM_FORMAT;
|
|
65
|
+
const totalPackageCount = input.leaves.reduce((sum, l) => sum + l.packages.length, 0);
|
|
66
|
+
// Single leaf: the component BOM *is* that leaf's BOM, structurally — no
|
|
67
|
+
// sub-document nesting needed, its packages become the aggregate's own
|
|
68
|
+
// flat package list directly (still a real, standalone valid document).
|
|
69
|
+
if (input.leaves.length === 1) {
|
|
70
|
+
const leaf = input.leaves[0];
|
|
71
|
+
const doc = writeBom(format, {
|
|
72
|
+
subjectName: input.component,
|
|
73
|
+
subjectId: input.manifest.manifestDigest,
|
|
74
|
+
packages: leaf.packages,
|
|
75
|
+
generator: COMPONENT_BOM_GENERATOR,
|
|
76
|
+
}, input.now);
|
|
77
|
+
return {
|
|
78
|
+
bom: { ...doc, packageCount: totalPackageCount, generator: COMPONENT_BOM_GENERATOR },
|
|
79
|
+
totalPackageCount,
|
|
80
|
+
leafCount: 1,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Multi-leaf: a real assembly — each leaf becomes its own nested
|
|
84
|
+
// sub-document, keyed by which artifact digest it describes (its
|
|
85
|
+
// `subjectDigest`) so the assembly is traceable back to a specific
|
|
86
|
+
// BuildArchiveEntry, never flattened into one anonymous package list.
|
|
87
|
+
const subDocuments = input.leaves.map((leaf) => ({
|
|
88
|
+
subjectName: leafSubjectName(leaf),
|
|
89
|
+
subjectId: leaf.entry.subjectDigest ?? leaf.entry.digest,
|
|
90
|
+
packages: leaf.packages,
|
|
91
|
+
}));
|
|
92
|
+
const doc = writeBom(format, {
|
|
93
|
+
subjectName: input.component,
|
|
94
|
+
subjectId: input.manifest.manifestDigest,
|
|
95
|
+
packages: [],
|
|
96
|
+
generator: COMPONENT_BOM_GENERATOR,
|
|
97
|
+
subDocuments,
|
|
98
|
+
}, input.now);
|
|
99
|
+
return {
|
|
100
|
+
bom: { ...doc, packageCount: totalPackageCount, generator: COMPONENT_BOM_GENERATOR },
|
|
101
|
+
totalPackageCount,
|
|
102
|
+
leafCount: input.leaves.length,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** Human-readable sub-document name: the leaf kind plus the archive path of the BOM entry itself, so two leaves of the same `bomKind` (unlikely but not disallowed) remain distinguishable. */
|
|
106
|
+
function leafSubjectName(leaf) {
|
|
107
|
+
const kind = leaf.entry.bomKind ?? "software";
|
|
108
|
+
return `${kind}:${leaf.entry.path}`;
|
|
109
|
+
}
|
|
110
|
+
// ── convenience: build leaves straight from a manifest ──────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Convenience for the common case: given a manifest that already carries
|
|
113
|
+
* `sbom`-kind entries (written by `generate-sbom`/`extract-config-bom`) and
|
|
114
|
+
* the `BomPackage[]` each one was built from (keyed by archive path, since
|
|
115
|
+
* that's the one stable identifier a caller has for "which leaf is this"),
|
|
116
|
+
* assemble the `ComponentBomLeaf[]` `aggregateComponentBom` expects. Kept
|
|
117
|
+
* separate from `aggregateComponentBom` itself so a caller that already has
|
|
118
|
+
* `ComponentBomLeaf[]` in hand (e.g. straight from the capabilities that just
|
|
119
|
+
* ran) can skip this lookup entirely.
|
|
120
|
+
*/
|
|
121
|
+
export function componentBomLeavesFromManifest(manifest, packagesByPath) {
|
|
122
|
+
return sbomEntries(manifest)
|
|
123
|
+
.filter((entry) => packagesByPath.has(entry.path))
|
|
124
|
+
.map((entry) => ({ entry, packages: packagesByPath.get(entry.path) }));
|
|
125
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* secrets family — `ensure-secret` (#1829, epic #1365 decision 3). The
|
|
3
|
+
* capability surface over the one generated-once materialization engine
|
|
4
|
+
* (../../secret-materialization.ts); the op step builder `ensureSecret(...)`
|
|
5
|
+
* (../../op/builders.ts) is the other surface over the same engine.
|
|
6
|
+
*
|
|
7
|
+
* Contract (read-then-write): present means done. The verb never mints over
|
|
8
|
+
* an existing value and never rotates implicitly; an existing secret that
|
|
9
|
+
* does not match the declared key-set/metadata stops the apply with a
|
|
10
|
+
* `SecretContractMismatchError` naming key names and metadata keys — never
|
|
11
|
+
* values. There is no safe undo for minting a secret others may already have
|
|
12
|
+
* consumed, and un-creating it would destroy the only copy of the material —
|
|
13
|
+
* so `rollbackPolicy: "needs-opt-out"`: COMP003 requires a component using
|
|
14
|
+
* this verb to acknowledge the compensation gap explicitly.
|
|
15
|
+
*
|
|
16
|
+
* The store adapter is per-provider (#1830 is the k8s row). Core registers a
|
|
17
|
+
* typed stub; a provider builds the real capability with
|
|
18
|
+
* {@link createEnsureSecretCapability}.
|
|
19
|
+
*/
|
|
20
|
+
import { CapabilityNotImplementedError } from "../capability.js";
|
|
21
|
+
import { ensureSecretMaterialization, defaultSecretMaterialGenerator, } from "../../secret-materialization.js";
|
|
22
|
+
/**
|
|
23
|
+
* Build the real `ensure-secret` capability over a provider's
|
|
24
|
+
* {@link SecretStoreAdapter}. The generator seam defaults to 32 CSPRNG bytes
|
|
25
|
+
* per key; the material it mints flows straight through the adapter to the
|
|
26
|
+
* store and is never returned, logged, or retained (see
|
|
27
|
+
* ../../secret-materialization.ts).
|
|
28
|
+
*/
|
|
29
|
+
export function createEnsureSecretCapability(deps) {
|
|
30
|
+
return {
|
|
31
|
+
kind: "ensure-secret",
|
|
32
|
+
rollbackPolicy: "needs-opt-out",
|
|
33
|
+
async run(_ctx, input) {
|
|
34
|
+
return ensureSecretMaterialization(deps.store, { name: input.name, keys: input.keys, metadata: input.metadata }, deps.generator ?? defaultSecretMaterialGenerator);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The starter-set registration: fully typed, correct `rollbackPolicy` for
|
|
40
|
+
* COMP003, but no store adapter — running it throws
|
|
41
|
+
* `CapabilityNotImplementedError` until a provider row (#1830, k8s) wires a
|
|
42
|
+
* real adapter via {@link createEnsureSecretCapability}.
|
|
43
|
+
*/
|
|
44
|
+
export const ensureSecretCapability = {
|
|
45
|
+
kind: "ensure-secret",
|
|
46
|
+
rollbackPolicy: "needs-opt-out",
|
|
47
|
+
async run() {
|
|
48
|
+
throw new CapabilityNotImplementedError("ensure-secret");
|
|
49
|
+
},
|
|
50
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The starter verb set, grouped by family, per epic #551 and
|
|
3
|
+
* docs/components/capabilities.mdx. The pilot AWS leaves — `docker-build`,
|
|
4
|
+
* `publish-image`, `load-image-on-host`, `cfn-deploy`, `ecs-update-service`,
|
|
5
|
+
* `code-deploy`, `wait-for-stack`, `wait-steady-state`, `wait-cluster-healthy`
|
|
6
|
+
* — are real implementations over the injectable `CloudExecutor` (#557/#564,
|
|
7
|
+
* epic #551, see ./cloud-executor.ts); every other verb remains a typed stub
|
|
8
|
+
* (../capability.ts). `generate-sbom` (#606) is a real implementation over
|
|
9
|
+
* the injectable, artifact-type-keyed `SbomGenerator` (./sbom-generator.ts);
|
|
10
|
+
* `./lockfile-sbom-generator.ts` (#613) is a real, hermetic backend for it
|
|
11
|
+
* (lockfile/manifest parsing, no external tool), and `./tool-sbom-generator.ts`
|
|
12
|
+
* (#610) is a real, deep-scan backend for it (`syft`/`docker buildx --sbom`/
|
|
13
|
+
* `cyclonedx-maven`/`cdxgen`, shelling out through the injectable
|
|
14
|
+
* `ProcessRunner`, ./process-runner.ts). `extract-config-bom` (#613) parses a
|
|
15
|
+
* synthesized CloudFormation template, so it moved to the aws lexicon (#684);
|
|
16
|
+
* core keeps the agnostic SPDX/CycloneDX writer, ./bom-writer.ts, which both it
|
|
17
|
+
* and `generate-sbom` share. ./component-bom.ts
|
|
18
|
+
* (#614) composes a component's leaf BOMs into one component-level BOM over
|
|
19
|
+
* that same writer, and ./reproducibility.ts (#614) records per-artifact
|
|
20
|
+
* reproducibility + provenance on each `BuildArchiveEntry`. `publish-image`
|
|
21
|
+
* (#610) also gained a best-effort OCI-referrer attach step (`oras attach`,
|
|
22
|
+
* also via `ProcessRunner`) for a supplied SBOM/component BOM — see ./publish.ts.
|
|
23
|
+
* `sign`/`attest-provenance` (#622, ./sign.ts) are real implementations over
|
|
24
|
+
* the same injectable `ProcessRunner`: keyless-by-default `cosign sign`/
|
|
25
|
+
* `cosign attest` for signature + SLSA provenance, reusing #614's
|
|
26
|
+
* `ProvenanceLink` material. `verify` (#622, ./verify.ts) is the matching
|
|
27
|
+
* deploy-time gate — `cosign verify`/`verify-attestation` against a
|
|
28
|
+
* configured identity policy, mirroring ../../lint/policy.ts's `policyGate`.
|
|
29
|
+
* `wrangler-deploy`/`wrangler-versions-promote` (#1293, epic #1296,
|
|
30
|
+
* ./wrangler.ts) and `r2-sync` (#1293, ./r2-sync.ts) are the Cloudflare
|
|
31
|
+
* Workers apply leaves — real implementations over the same injectable
|
|
32
|
+
* `ProcessRunner` `sign` uses, shelling to `wrangler`/`rclone` rather than an
|
|
33
|
+
* AWS-shaped SDK client. `run-agent` (#1941, epic #1564 phase 1, ./run-agent.ts)
|
|
34
|
+
* is the typed schema + registry entry for a bounded, attested agent-turn
|
|
35
|
+
* capability over a fly Sprite — a typed stub for now (`run`/`rollback`
|
|
36
|
+
* reject with `CapabilityNotImplementedError`), `rollbackPolicy: "native"`
|
|
37
|
+
* declared up front; the real sprite-lifecycle implementation is #1942.
|
|
38
|
+
*/
|
|
39
|
+
export * from "./build-archive.js";
|
|
40
|
+
export * from "./build.js";
|
|
41
|
+
export * from "./bom-writer.js";
|
|
42
|
+
export * from "./sbom-generator.js";
|
|
43
|
+
export * from "./sbom.js";
|
|
44
|
+
export * from "./lockfile-sbom-generator.js";
|
|
45
|
+
export * from "./tool-sbom-generator.js";
|
|
46
|
+
export * from "./component-bom.js";
|
|
47
|
+
export * from "./reproducibility.js";
|
|
48
|
+
export * from "./sign.js";
|
|
49
|
+
export * from "./verify.js";
|
|
50
|
+
export * from "./run-agent.js";
|
|
51
|
+
export * from "./wrangler.js";
|
|
52
|
+
export * from "./r2-sync.js";
|
|
53
|
+
export * from "./vuln-scan.js";
|
|
54
|
+
export * from "./vex.js";
|
|
55
|
+
export * from "./license-policy.js";
|
|
56
|
+
export * from "./vuln-gate.js";
|
|
57
|
+
export * from "./wait-verify.js";
|
|
58
|
+
export * from "./shell.js";
|
|
59
|
+
export * from "./ensure-secret.js";
|
|
60
|
+
export * from "./cloud-executor.js";
|
|
61
|
+
export * from "./process-runner.js";
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License policy over an SBOM's declared licenses (#626). The SBOM already
|
|
3
|
+
* enumerates every component and its license; this evaluates those against an
|
|
4
|
+
* allow/deny list (e.g. block a copyleft license in a proprietary product).
|
|
5
|
+
*
|
|
6
|
+
* **Report-only by default.** License posture is context-dependent — GPL is a
|
|
7
|
+
* problem for a proprietary binary but fine for a GPL project — so the gate
|
|
8
|
+
* (./vuln-gate.ts) does NOT block on license violations unless a project opts
|
|
9
|
+
* in (`failOnLicense: true`). Extraction reads both SPDX
|
|
10
|
+
* (`packages[].licenseConcluded`/`licenseDeclared`) and CycloneDX
|
|
11
|
+
* (`components[].licenses[]`) without a spec dependency.
|
|
12
|
+
*/
|
|
13
|
+
/** Extract each package's declared license from an SBOM, dispatching on media type (SPDX vs CycloneDX). Never throws on shape — a package with no license reads as `"NOASSERTION"`. */
|
|
14
|
+
export function extractLicenses(sbom) {
|
|
15
|
+
const doc = JSON.parse(sbom.bytes);
|
|
16
|
+
if (sbom.format === "cyclonedx" || Array.isArray(doc.components)) {
|
|
17
|
+
return (doc.components ?? []).map((c) => {
|
|
18
|
+
const first = c.licenses?.[0];
|
|
19
|
+
const license = first?.expression ?? first?.license?.id ?? first?.license?.name ?? "NOASSERTION";
|
|
20
|
+
return { package: c.name ?? "unknown", license };
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return (doc.packages ?? []).map((p) => ({
|
|
24
|
+
package: p.name ?? "unknown",
|
|
25
|
+
license: p.licenseConcluded && p.licenseConcluded !== "NOASSERTION" ? p.licenseConcluded : (p.licenseDeclared ?? "NOASSERTION"),
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
// ── evaluation ───────────────────────────────────────────────────────────────
|
|
29
|
+
/** Case-insensitive membership, so `"mit"` matches `"MIT"`. */
|
|
30
|
+
function includesCi(list, value) {
|
|
31
|
+
const v = value.toLowerCase();
|
|
32
|
+
return list.some((x) => x.toLowerCase() === v);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Split an SPDX license expression into its component license atoms, so a
|
|
36
|
+
* deny/allow list matches a license hidden inside an expression like
|
|
37
|
+
* `"GPL-3.0 OR MIT"` or `"(Apache-2.0 AND MIT)"` — an exact-string compare on
|
|
38
|
+
* the whole expression would miss `GPL-3.0` and let it through. Conservative:
|
|
39
|
+
* we only need the *set* of licenses referenced, so we split on `OR`/`AND`,
|
|
40
|
+
* drop parentheses, and strip any `WITH <exception>` suffix. A single license
|
|
41
|
+
* id returns itself unchanged.
|
|
42
|
+
*/
|
|
43
|
+
export function licenseAtoms(expr) {
|
|
44
|
+
return expr
|
|
45
|
+
.replace(/[()]/g, " ")
|
|
46
|
+
.split(/\s+(?:OR|AND)\s+/i)
|
|
47
|
+
.map((a) => a.split(/\s+WITH\s+/i)[0].trim())
|
|
48
|
+
.filter(Boolean);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Evaluate an SBOM's licenses against `policy`. A package violates if ANY atom
|
|
52
|
+
* of its (possibly compound) SPDX license expression is in `deny`, or (when
|
|
53
|
+
* `allow` is set) any atom is not in `allow`. This is conservative on `OR`
|
|
54
|
+
* expressions — `"GPL-3.0 OR MIT"` counts as a `GPL-3.0` deny hit even though a
|
|
55
|
+
* consumer could choose MIT — because a policy gate should surface the presence
|
|
56
|
+
* of a denied license, not silently rely on the consumer picking the permissive
|
|
57
|
+
* branch. Packages with no declared license (`NOASSERTION`/empty) are not
|
|
58
|
+
* flagged — an undeclared license is not asserted to be denied.
|
|
59
|
+
*/
|
|
60
|
+
export function evaluateLicensePolicy(sbom, policy) {
|
|
61
|
+
const out = [];
|
|
62
|
+
for (const { package: pkg, license } of extractLicenses(sbom)) {
|
|
63
|
+
if (!license || license === "NOASSERTION")
|
|
64
|
+
continue;
|
|
65
|
+
const atoms = licenseAtoms(license);
|
|
66
|
+
if (policy.deny && atoms.some((a) => includesCi(policy.deny, a))) {
|
|
67
|
+
out.push({ package: pkg, license, reason: "denied" });
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (policy.allow && policy.allow.length > 0 && atoms.some((a) => !includesCi(policy.allow, a))) {
|
|
71
|
+
out.push({ package: pkg, license, reason: "not-allowed" });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermetic lockfile/manifest-derived `SbomGenerator` (#613, epic #551 closes
|
|
3
|
+
* the "HERMETIC-generator half of #610" per #613's scope note). Pure
|
|
4
|
+
* TypeScript: reads a declared-dependency manifest already on disk (Node
|
|
5
|
+
* `package-lock.json`, JVM `pom.xml`) and emits a real SPDX/CycloneDX
|
|
6
|
+
* document via ./bom-writer.ts. No `syft`, no `docker buildx`, no
|
|
7
|
+
* `cyclonedx-maven`, no network — every package in the resulting BOM comes
|
|
8
|
+
* from parsing bytes chant already has locally.
|
|
9
|
+
*
|
|
10
|
+
* **What this backend is, and isn't.** A lockfile enumerates every declared
|
|
11
|
+
* (transitive-resolved) dependency at the versions actually installed, so
|
|
12
|
+
* the resulting SBOM is complete for **declared** dependencies — accurate
|
|
13
|
+
* package identity and version for everything npm/Maven resolved. It is
|
|
14
|
+
* **not** a container-layer scan: it cannot see OS packages baked into a base
|
|
15
|
+
* image, binaries copied in by a Dockerfile `COPY`/`RUN`, or anything not
|
|
16
|
+
* expressed as a lockfile entry. That deeper, image-layer-aware scan is
|
|
17
|
+
* `syft`'s job (or BuildKit's native `--sbom` attestation) and stays exactly
|
|
18
|
+
* where #610 already scoped it: the optional *deep* path, layered on top of
|
|
19
|
+
* (never replacing) this hermetic baseline. See
|
|
20
|
+
* docs/components/build-archive.mdx's SBOM section, updated alongside this
|
|
21
|
+
* change, for the customer-facing version of this distinction.
|
|
22
|
+
*
|
|
23
|
+
* Registered as `forDir`/`forZip`/`forJar` implementations (the artifact
|
|
24
|
+
* shapes a source-tree or packaged-but-uninspected artifact naturally maps
|
|
25
|
+
* to); `forImage` still throws `SbomGeneratorNotImplementedError` — an image
|
|
26
|
+
* SBOM needs either BuildKit's attestation or a container-layer scan, neither
|
|
27
|
+
* of which a lockfile read can substitute for, so this backend deliberately
|
|
28
|
+
* does not claim to cover it (mirrors how ./sbom-generator.ts's own
|
|
29
|
+
* `notImplementedSbomGenerator` prefers a loud, specific failure over a
|
|
30
|
+
* silently wrong answer).
|
|
31
|
+
*/
|
|
32
|
+
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
33
|
+
import { dirname, join } from "node:path";
|
|
34
|
+
import { writeBom } from "./bom-writer.js";
|
|
35
|
+
import { DEFAULT_SBOM_FORMAT } from "./sbom-generator.js";
|
|
36
|
+
import { SbomGeneratorNotImplementedError } from "./sbom-generator.js";
|
|
37
|
+
/**
|
|
38
|
+
* Parse a `package-lock.json` (v1, v2, or v3) into a flat `BomPackage[]`.
|
|
39
|
+
* Prefers the v2/v3 `packages` map (flat, one entry per resolved install
|
|
40
|
+
* location) since that's what `npm` >= 7 writes; falls back to the v1
|
|
41
|
+
* `dependencies` tree for older lockfiles. De-duplicates by `name@version`
|
|
42
|
+
* so a package appearing at multiple install paths (npm's dedup/hoisting)
|
|
43
|
+
* contributes one BOM entry, matching how a real scanner reports installed
|
|
44
|
+
* packages rather than filesystem paths.
|
|
45
|
+
*/
|
|
46
|
+
export function parseNpmPackageLock(content) {
|
|
47
|
+
const lock = JSON.parse(content);
|
|
48
|
+
const seen = new Map();
|
|
49
|
+
const add = (name, version, deps) => {
|
|
50
|
+
if (!name)
|
|
51
|
+
return;
|
|
52
|
+
const key = `${name}@${version ?? ""}`;
|
|
53
|
+
const existing = seen.get(key);
|
|
54
|
+
if (existing) {
|
|
55
|
+
if (deps?.length)
|
|
56
|
+
existing.dependsOn = [...new Set([...(existing.dependsOn ?? []), ...deps])];
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
seen.set(key, {
|
|
60
|
+
name,
|
|
61
|
+
version,
|
|
62
|
+
type: "npm",
|
|
63
|
+
purl: version ? `pkg:npm/${encodeURIComponent(name)}@${version}` : undefined,
|
|
64
|
+
dependsOn: deps?.length ? deps : undefined,
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
if (lock.packages) {
|
|
68
|
+
for (const [path, pkg] of Object.entries(lock.packages)) {
|
|
69
|
+
if (path === "")
|
|
70
|
+
continue; // the root project itself, not a dependency
|
|
71
|
+
const name = pkg.name ?? path.replace(/^.*node_modules\//, "");
|
|
72
|
+
add(name, pkg.version, pkg.dependencies ? Object.keys(pkg.dependencies) : undefined);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (lock.dependencies) {
|
|
76
|
+
for (const [name, pkg] of Object.entries(lock.dependencies)) {
|
|
77
|
+
add(name, pkg.version, pkg.requires ? Object.keys(pkg.requires) : undefined);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return [...seen.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
81
|
+
}
|
|
82
|
+
// ── pom.xml (Maven — cheap, declared <dependencies> only) ───────────────────
|
|
83
|
+
/**
|
|
84
|
+
* Parse the `<dependencies>` block of a `pom.xml` into a flat `BomPackage[]`.
|
|
85
|
+
* Deliberately minimal (#613 calls this out as "add JVM pom.xml if cheap"):
|
|
86
|
+
* a small tag-scoped regex walk over `<dependency>...</dependency>` blocks
|
|
87
|
+
* extracting `groupId`/`artifactId`/`version`, no XML DOM dependency, no
|
|
88
|
+
* property (`${...}`) resolution, no transitive resolution (Maven's own
|
|
89
|
+
* dependency-mediation graph isn't reproducible without invoking `mvn`,
|
|
90
|
+
* which would break the hermetic requirement). This is deliberately narrower
|
|
91
|
+
* than the npm parser above: it covers the common case (a flat, literal
|
|
92
|
+
* `<dependencies>` list) and documents its own limits rather than silently
|
|
93
|
+
* mis-resolving a `${property}` version or a `<dependencyManagement>`
|
|
94
|
+
* inheritance chain.
|
|
95
|
+
*/
|
|
96
|
+
export function parsePomXml(content) {
|
|
97
|
+
const packages = [];
|
|
98
|
+
// Strip <dependencyManagement>...</dependencyManagement> first — it
|
|
99
|
+
// declares version *policy*, not necessarily artifacts actually used, and
|
|
100
|
+
// (like the real <dependencies> block) can itself contain a nested
|
|
101
|
+
// <dependencies> block, which a naive non-nesting-aware regex would match
|
|
102
|
+
// in its place. Removing it up front guarantees the subsequent
|
|
103
|
+
// <dependencies> match is the real, top-level one.
|
|
104
|
+
const withoutManagement = content.replace(/<dependencyManagement>[\s\S]*?<\/dependencyManagement>/, "");
|
|
105
|
+
const depsBlockMatch = withoutManagement.match(/<dependencies>([\s\S]*?)<\/dependencies>/);
|
|
106
|
+
if (!depsBlockMatch)
|
|
107
|
+
return packages;
|
|
108
|
+
const depBlock = depsBlockMatch[1];
|
|
109
|
+
const depRegex = /<dependency>([\s\S]*?)<\/dependency>/g;
|
|
110
|
+
let match;
|
|
111
|
+
while ((match = depRegex.exec(depBlock)) !== null) {
|
|
112
|
+
const entry = match[1];
|
|
113
|
+
const groupId = entry.match(/<groupId>([^<]+)<\/groupId>/)?.[1]?.trim();
|
|
114
|
+
const artifactId = entry.match(/<artifactId>([^<]+)<\/artifactId>/)?.[1]?.trim();
|
|
115
|
+
const version = entry.match(/<version>([^<]+)<\/version>/)?.[1]?.trim();
|
|
116
|
+
if (!groupId || !artifactId)
|
|
117
|
+
continue;
|
|
118
|
+
const name = `${groupId}:${artifactId}`;
|
|
119
|
+
packages.push({
|
|
120
|
+
name,
|
|
121
|
+
version,
|
|
122
|
+
type: "maven",
|
|
123
|
+
purl: version ? `pkg:maven/${encodeURIComponent(groupId)}/${encodeURIComponent(artifactId)}@${version}` : undefined,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return packages.sort((a, b) => a.name.localeCompare(b.name));
|
|
127
|
+
}
|
|
128
|
+
/** Locate the first readable lockfile/manifest under `dir` this generator knows how to parse, in preference order (npm before Maven — most chant components are Node-first). Returns `undefined` if none is found. */
|
|
129
|
+
function findManifest(dir) {
|
|
130
|
+
for (const [kind, filename] of [["npm", "package-lock.json"], ["maven", "pom.xml"]]) {
|
|
131
|
+
const candidate = join(dir, filename);
|
|
132
|
+
try {
|
|
133
|
+
readFileSync(candidate, "utf-8");
|
|
134
|
+
return { kind, path: candidate };
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
/** Default on-disk path for a generated SBOM: `<dir>/sbom.<format>.json`, matching #613's `sbom.<format>.json` naming convention. */
|
|
143
|
+
export function sbomOutputPath(dir, format) {
|
|
144
|
+
return join(dir, `sbom.${format}.json`);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build a hermetic `SbomGenerator` backed by lockfile parsing. `forDir` scans
|
|
148
|
+
* `input.path` for a known manifest (`package-lock.json`, then `pom.xml`),
|
|
149
|
+
* parses it into a `BomPackage[]`, and writes both the SBOM document (via
|
|
150
|
+
* ./bom-writer.ts) to disk and returns it as an `SbomDocument`. `forZip`/
|
|
151
|
+
* `forJar` reuse the same scan against the artifact's source directory
|
|
152
|
+
* (the directory the archive was built from is the natural place a lockfile
|
|
153
|
+
* lives — the packaged bytes themselves are not re-inspected, matching this
|
|
154
|
+
* backend's "declared deps, not a binary scan" scope). `forImage` is not
|
|
155
|
+
* implemented here: an image's dependency surface includes its base layers,
|
|
156
|
+
* which no lockfile enumerates — see this module's doc comment.
|
|
157
|
+
*/
|
|
158
|
+
export function createLockfileSbomGenerator(options = {}) {
|
|
159
|
+
const now = options.now ?? (() => new Date());
|
|
160
|
+
function generateFromDir(dir, subjectName, digest, format = DEFAULT_SBOM_FORMAT) {
|
|
161
|
+
const manifest = findManifest(dir);
|
|
162
|
+
if (!manifest) {
|
|
163
|
+
throw new Error(`no supported lockfile/manifest found under "${dir}" (looked for package-lock.json, pom.xml) — ` +
|
|
164
|
+
`the hermetic lockfile SBOM backend requires a lockfile on disk; use the deep-scan path (#610) for images with no lockfile`);
|
|
165
|
+
}
|
|
166
|
+
const content = readFileSync(manifest.path, "utf-8");
|
|
167
|
+
const packages = manifest.kind === "npm" ? parseNpmPackageLock(content) : parsePomXml(content);
|
|
168
|
+
const generatorName = manifest.kind === "npm" ? "chant-lockfile-sbom/package-lock.json" : "chant-lockfile-sbom/pom.xml";
|
|
169
|
+
const doc = writeBom(format, { subjectName, subjectId: digest ?? manifest.path, packages, generator: generatorName }, now);
|
|
170
|
+
const outDir = options.outDir ?? dir;
|
|
171
|
+
mkdirSync(outDir, { recursive: true });
|
|
172
|
+
writeFileSync(sbomOutputPath(outDir, format), doc.bytes);
|
|
173
|
+
return { ...doc, packageCount: packages.length, generator: generatorName };
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
async forImage(_input) {
|
|
177
|
+
throw new SbomGeneratorNotImplementedError("forImage");
|
|
178
|
+
},
|
|
179
|
+
async forJar(input) {
|
|
180
|
+
return generateFromDir(dirname(input.jarPath), input.jarPath, input.digest, input.format);
|
|
181
|
+
},
|
|
182
|
+
async forZip(input) {
|
|
183
|
+
return generateFromDir(dirname(input.zipPath), input.zipPath, input.digest, input.format);
|
|
184
|
+
},
|
|
185
|
+
async forDir(input) {
|
|
186
|
+
return generateFromDir(input.path, input.path, undefined, input.format);
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/** Process-wide hermetic lockfile-backed `SbomGenerator`, ready to inject wherever ./sbom-generator.ts's `notImplementedSbomGenerator` default previously required an explicit real backend. */
|
|
191
|
+
export const lockfileSbomGenerator = createLockfileSbomGenerator();
|