@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,118 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { GateWait, asPendingGate } from "../gate-wait.js";
|
|
4
|
+
import { liveRunEnv } from "../run-live.js";
|
|
5
|
+
const execAsync = promisify(exec);
|
|
6
|
+
/**
|
|
7
|
+
* How much stdout a command may produce, matching every other exec site in
|
|
8
|
+
* the tree (`../activities/apply.ts`, the terraform lexicon's activities,
|
|
9
|
+
* `../../components/verbs/process-runner.ts`).
|
|
10
|
+
*
|
|
11
|
+
* Node's default is 1 MiB, and this was the only exec call leaving it unset
|
|
12
|
+
* (#2412) — on the one activity whose output chant cannot predict, because
|
|
13
|
+
* the command is the author's. A verbose test run, a playbook or a wide plan
|
|
14
|
+
* passes 1 MiB without trying, and the overflow is a rejection rather than a
|
|
15
|
+
* truncation, so the step fails for a reason that has nothing to do with the
|
|
16
|
+
* command.
|
|
17
|
+
*/
|
|
18
|
+
const MAX_STDOUT_BYTES = 64 * 1024 * 1024;
|
|
19
|
+
/** `result` with its stdout parsed as JSON, when the step asked for it. */
|
|
20
|
+
function withJson(result, args) {
|
|
21
|
+
if (!args.json)
|
|
22
|
+
return result;
|
|
23
|
+
if (result.stdout === "")
|
|
24
|
+
return { ...result, json: null };
|
|
25
|
+
try {
|
|
26
|
+
return { ...result, json: JSON.parse(result.stdout) };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const shown = result.stdout.length > 200 ? `${result.stdout.slice(0, 200)}...` : result.stdout;
|
|
30
|
+
throw new Error(`the step sets json, and its stdout is not JSON (${err instanceof Error ? err.message : String(err)}): ${shown}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run an arbitrary shell command.
|
|
35
|
+
*
|
|
36
|
+
* Runs under the `atMostOnce` profile by default (#2411): one attempt, since
|
|
37
|
+
* nothing here can know whether repeating the author's command is safe.
|
|
38
|
+
*/
|
|
39
|
+
export async function shellCmd(args, signal) {
|
|
40
|
+
const okExit = args.okExit ?? [0];
|
|
41
|
+
try {
|
|
42
|
+
const { stdout, stderr } = await execAsync(args.cmd, {
|
|
43
|
+
cwd: args.cwd,
|
|
44
|
+
// In a run that keeps an in-flight record, CHANT_RUN_ACTIVITY names the
|
|
45
|
+
// file the command appends activity lines to (../run-live.ts).
|
|
46
|
+
env: { ...process.env, ...liveRunEnv(), ...args.env },
|
|
47
|
+
maxBuffer: MAX_STDOUT_BYTES,
|
|
48
|
+
signal,
|
|
49
|
+
});
|
|
50
|
+
if (stderr)
|
|
51
|
+
console.error(stderr);
|
|
52
|
+
return withJson({ stdout: stdout.trim(), stderr: stderr.trim(), exitCode: 0 }, args);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const failure = err;
|
|
56
|
+
const exitCode = typeof failure.code === "number" ? failure.code : undefined;
|
|
57
|
+
// A signal kill (Ctrl-C, the profile's timeout, a maxBuffer overflow) is
|
|
58
|
+
// not an exit status the author declared anything about, so it rethrows
|
|
59
|
+
// even if `okExit` happens to contain the code.
|
|
60
|
+
const died = failure.killed === true || typeof failure.signal === "string" || signal?.aborted === true;
|
|
61
|
+
if (exitCode !== undefined && !died && args.gatedExit !== undefined && exitCode === args.gatedExit) {
|
|
62
|
+
const stderrText = (failure.stderr ?? "").trim();
|
|
63
|
+
if (stderrText)
|
|
64
|
+
console.error(stderrText);
|
|
65
|
+
throw new GateWait(await commandGate(args, (failure.stdout ?? "").trim(), exitCode));
|
|
66
|
+
}
|
|
67
|
+
if (exitCode !== undefined && !died && okExit.includes(exitCode)) {
|
|
68
|
+
const stderrText = (failure.stderr ?? "").trim();
|
|
69
|
+
if (stderrText)
|
|
70
|
+
console.error(stderrText);
|
|
71
|
+
return withJson({ stdout: (failure.stdout ?? "").trim(), stderr: stderrText, exitCode }, args);
|
|
72
|
+
}
|
|
73
|
+
if (exitCode !== undefined && !died) {
|
|
74
|
+
// `local-executor` records `error` as message text, so the code has to
|
|
75
|
+
// be in the message or it is gone (#2413).
|
|
76
|
+
failure.message = `command exited ${exitCode} (expected ${okExit.join(", ")}): ${failure.message}`;
|
|
77
|
+
}
|
|
78
|
+
throw failure;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** The pending fact a command's stdout carries: the whole of it as JSON, or its last line. */
|
|
82
|
+
function pendingFromStdout(stdout) {
|
|
83
|
+
const lines = stdout.split("\n");
|
|
84
|
+
for (const text of [stdout, lines[lines.length - 1] ?? ""]) {
|
|
85
|
+
try {
|
|
86
|
+
const parsed = JSON.parse(text);
|
|
87
|
+
const pending = asPendingGate(parsed?.pending);
|
|
88
|
+
if (pending)
|
|
89
|
+
return pending;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Not JSON: try the next reading, then the step's own `gate`.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The gate a command stopped at (#2779): the pending fact its stdout
|
|
99
|
+
* carries, or the newest one the gate ledger holds for the step's `gate`.
|
|
100
|
+
* Throws when neither names one, since a run can't be `gated` at a gate
|
|
101
|
+
* nobody can approve.
|
|
102
|
+
*/
|
|
103
|
+
async function commandGate(args, stdout, exitCode) {
|
|
104
|
+
const fromStdout = pendingFromStdout(stdout);
|
|
105
|
+
if (fromStdout)
|
|
106
|
+
return fromStdout;
|
|
107
|
+
const named = args.gate;
|
|
108
|
+
if (!named) {
|
|
109
|
+
throw new Error(`command exited ${exitCode}, its gatedExit, and named no gate: its stdout carries no \`pending\` gate fact as JSON, and the step has no \`gate\``);
|
|
110
|
+
}
|
|
111
|
+
const { readGateLedger, latestPendingGate } = await import("../../lifecycle/gate-ledger.js");
|
|
112
|
+
const { pending } = await readGateLedger(named.op, args.cwd ? { cwd: args.cwd } : undefined);
|
|
113
|
+
const latest = latestPendingGate(pending, named.gate);
|
|
114
|
+
if (!latest) {
|
|
115
|
+
throw new Error(`command exited ${exitCode}, its gatedExit, but the gate ledger holds no pending fact for ${named.op} / ${named.gate}, so there is no gate to stop at`);
|
|
116
|
+
}
|
|
117
|
+
return latest;
|
|
118
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The release activities an Op ships a source tree with (#2782): archive the
|
|
3
|
+
* tree, plan the release, and record it once it serves.
|
|
4
|
+
*
|
|
5
|
+
* - {@link sourceArchive}: one directory of HEAD as a tar (../source-archive.ts),
|
|
6
|
+
* named by its sha256. The same commit archives to the same bytes.
|
|
7
|
+
* - {@link releasePlan}: what a release will ship, as a JSON object named by
|
|
8
|
+
* the sha256 of its own canonical form. The ship gate binds to that digest
|
|
9
|
+
* (`gate("ship", { plan: plan.out.digest })`), the step that ships reads the
|
|
10
|
+
* plan back by it, and the release ledger records it (ws-055: a release
|
|
11
|
+
* record's digest names its plan). Nothing in a plan changes from one run of
|
|
12
|
+
* the same commit to the next, so a retried release plans the same digest
|
|
13
|
+
* and its approval still holds.
|
|
14
|
+
* - {@link releaseRecord}: persist the plan to `_plans/<digest>.json` on
|
|
15
|
+
* chant/lifecycle and append the release record, as `chant components
|
|
16
|
+
* release --release-plan` does. When the environment's latest record for
|
|
17
|
+
* the component already names this digest, nothing is written, so a
|
|
18
|
+
* retried release records once.
|
|
19
|
+
*/
|
|
20
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { join, resolve } from "node:path";
|
|
22
|
+
import { sortedJsonReplacer } from "../../utils.js";
|
|
23
|
+
import { archiveSourceTree, sha256Digest } from "../source-archive.js";
|
|
24
|
+
/** Archive a directory of a commit (default HEAD); see ../source-archive.ts. */
|
|
25
|
+
export async function sourceArchive(args) {
|
|
26
|
+
return archiveSourceTree({ dir: args.path, ref: args.ref, out: args.out, cwd: args.cwd });
|
|
27
|
+
}
|
|
28
|
+
/** The digest of a plan: sha256 of its canonical JSON (keys sorted), `digest` left out. Pure. */
|
|
29
|
+
export function releasePlanDigest(plan) {
|
|
30
|
+
const { digest: _digest, ...rest } = plan;
|
|
31
|
+
return sha256Digest(JSON.stringify(rest, sortedJsonReplacer));
|
|
32
|
+
}
|
|
33
|
+
/** Write a release plan, named by its own digest. */
|
|
34
|
+
export async function releasePlan(args) {
|
|
35
|
+
if (!args.component || !args.env || !args.gitSha)
|
|
36
|
+
throw new Error("releasePlan: a plan names its component, its environment and its commit");
|
|
37
|
+
const body = { component: args.component, env: args.env, gitSha: args.gitSha, ...args.content };
|
|
38
|
+
const digest = releasePlanDigest(body);
|
|
39
|
+
const dir = resolve(args.cwd ?? process.cwd(), args.dir ?? join("dist", "plans"));
|
|
40
|
+
mkdirSync(dir, { recursive: true });
|
|
41
|
+
const file = join(dir, `${digest.replace(":", "_")}.json`);
|
|
42
|
+
writeFileSync(file, JSON.stringify({ digest, ...body }, sortedJsonReplacer, 2) + "\n");
|
|
43
|
+
return { digest, file, gitSha: args.gitSha };
|
|
44
|
+
}
|
|
45
|
+
/** A plan `releasePlan` wrote, checked against its digest. */
|
|
46
|
+
export function readReleasePlan(path, digest) {
|
|
47
|
+
const plan = JSON.parse(readFileSync(path, "utf-8"));
|
|
48
|
+
const actual = releasePlanDigest(plan);
|
|
49
|
+
if (plan.digest !== actual)
|
|
50
|
+
throw new Error(`${path} names digest ${plan.digest}, but its content is ${actual}`);
|
|
51
|
+
if (digest !== undefined && digest !== actual)
|
|
52
|
+
throw new Error(`${path} is plan ${actual}, not the approved ${digest}`);
|
|
53
|
+
return plan;
|
|
54
|
+
}
|
|
55
|
+
/** Persist the plan and record the release in the ledger, once. */
|
|
56
|
+
export async function releaseRecord(args) {
|
|
57
|
+
const cwd = args.cwd;
|
|
58
|
+
const opts = cwd ? { cwd } : undefined;
|
|
59
|
+
const plan = readReleasePlan(resolve(cwd ?? process.cwd(), args.plan), args.digest);
|
|
60
|
+
const component = plan.component;
|
|
61
|
+
const env = plan.env;
|
|
62
|
+
const gitSha = plan.gitSha;
|
|
63
|
+
const { readReleaseLedger, latestPerComponent, appendReleaseRecord, resolveRunId } = await import("../../lifecycle/release-ledger.js");
|
|
64
|
+
const { persistReleasePlan } = await import("../../lifecycle/plan-ledger.js");
|
|
65
|
+
const { pushLifecycle } = await import("../../lifecycle/git.js");
|
|
66
|
+
let approver = null;
|
|
67
|
+
if (args.approval) {
|
|
68
|
+
const { readGateLedger } = await import("../../lifecycle/gate-ledger.js");
|
|
69
|
+
const { resolutions } = await readGateLedger(args.approval.op, opts);
|
|
70
|
+
const bound = resolutions.filter((r) => r.gate === args.approval.gate && r.planDigest === plan.digest);
|
|
71
|
+
approver = bound.length > 0 ? [...new Set(bound.map((r) => r.resolvedBy))].join(", ") : null;
|
|
72
|
+
}
|
|
73
|
+
const latest = latestPerComponent((await readReleaseLedger(env, opts)).records).get(component);
|
|
74
|
+
if (latest?.digest === plan.digest && latest.gitSha === gitSha) {
|
|
75
|
+
await persistReleasePlan(plan, opts);
|
|
76
|
+
await pushLifecycle(opts);
|
|
77
|
+
return { recorded: false, digest: plan.digest, env, component, approver };
|
|
78
|
+
}
|
|
79
|
+
const actor = args.actor || process.env.GITHUB_ACTOR || process.env.GITLAB_USER_LOGIN || process.env.USER;
|
|
80
|
+
if (!actor)
|
|
81
|
+
throw new Error("releaseRecord: no actor: pass one, or set GITHUB_ACTOR, GITLAB_USER_LOGIN or USER");
|
|
82
|
+
const { runId, runOrigin } = resolveRunId(args.runId);
|
|
83
|
+
await persistReleasePlan(plan, opts);
|
|
84
|
+
await appendReleaseRecord({
|
|
85
|
+
component,
|
|
86
|
+
env,
|
|
87
|
+
digest: plan.digest,
|
|
88
|
+
gitSha,
|
|
89
|
+
runId,
|
|
90
|
+
...(runOrigin ? { runOrigin } : {}),
|
|
91
|
+
timestamp: new Date().toISOString(),
|
|
92
|
+
actor,
|
|
93
|
+
...(approver ? { approver } : {}),
|
|
94
|
+
}, opts);
|
|
95
|
+
await pushLifecycle(opts);
|
|
96
|
+
return { recorded: true, digest: plan.digest, env, component, approver };
|
|
97
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rollback activities for a release a release Op shipped as a source tree
|
|
3
|
+
* (#2800): plan the rollback from the release ledger, and record it once the
|
|
4
|
+
* site serves the earlier release again.
|
|
5
|
+
*
|
|
6
|
+
* - {@link releaseRollbackPlan}: pick the release to go back to, read its plan
|
|
7
|
+
* from `_plans/` (ws-055), archive the same directory of the same commit
|
|
8
|
+
* again and refuse unless it hashes to the digest that plan recorded, then
|
|
9
|
+
* write a rollback plan named by its own sha256. The rollback gate binds to
|
|
10
|
+
* that digest. The step that restores the Machine reads the archive again,
|
|
11
|
+
* checked against the same digest, before the Machine changes.
|
|
12
|
+
* - {@link releaseRollbackRecord}: append a release record with the restored
|
|
13
|
+
* release's digest and commit, `restores` naming that release, the actor who
|
|
14
|
+
* ran it and the gate's approver, the way `chant components rollback`
|
|
15
|
+
* records one. Nothing is written when the ledger already records it.
|
|
16
|
+
*
|
|
17
|
+
* Which release: by default, the one the site served before the latest
|
|
18
|
+
* release the release Op shipped. A rollback's own record does not count as
|
|
19
|
+
* a release here, so running the rollback again plans the same rollback, its
|
|
20
|
+
* approval still holds, the Machine already serves it, and nothing is
|
|
21
|
+
* recorded twice. `to` names another release by its digest.
|
|
22
|
+
*/
|
|
23
|
+
import { execFileSync } from "node:child_process";
|
|
24
|
+
import { realpathSync } from "node:fs";
|
|
25
|
+
import { join, resolve } from "node:path";
|
|
26
|
+
import { archiveSourceTree } from "../source-archive.js";
|
|
27
|
+
import { readReleasePlan, releasePlan, releasePlanDigest } from "./source-release.js";
|
|
28
|
+
/** A record's reference, the way `restores` and `promotedFrom` name one. */
|
|
29
|
+
const refTo = (r) => ({ env: r.env, runId: r.runId, timestamp: r.timestamp });
|
|
30
|
+
/**
|
|
31
|
+
* The release a rollback goes back to, and the release it replaces. Pure.
|
|
32
|
+
*
|
|
33
|
+
* The replaced release is the component's latest record that is not itself a
|
|
34
|
+
* rollback. By default the target is the latest record before it with another
|
|
35
|
+
* digest: what the site served before that release. With `to`, the target is
|
|
36
|
+
* the latest record with that digest.
|
|
37
|
+
*/
|
|
38
|
+
export function pickRollback(records, component, env, to) {
|
|
39
|
+
// Ledger order, oldest first; a later append wins a tied timestamp.
|
|
40
|
+
const own = records
|
|
41
|
+
.map((r, i) => ({ r, i }))
|
|
42
|
+
.filter(({ r }) => r.component === component)
|
|
43
|
+
.sort((a, b) => (a.r.timestamp === b.r.timestamp ? a.i - b.i : a.r.timestamp < b.r.timestamp ? -1 : 1))
|
|
44
|
+
.map(({ r }) => r);
|
|
45
|
+
if (own.length === 0)
|
|
46
|
+
return { error: `no release of "${component}" is recorded in "${env}"` };
|
|
47
|
+
const releasedAt = own.map((r) => !r.restores).lastIndexOf(true);
|
|
48
|
+
if (releasedAt < 0)
|
|
49
|
+
return { error: `"${component}" has no release in "${env}" that was not itself a rollback` };
|
|
50
|
+
const replaced = own[releasedAt];
|
|
51
|
+
if (to !== undefined) {
|
|
52
|
+
const target = own.filter((r) => r.digest === to).at(-1);
|
|
53
|
+
if (!target)
|
|
54
|
+
return { error: `no release of "${component}" in "${env}" has digest ${to}` };
|
|
55
|
+
return { target, replaced };
|
|
56
|
+
}
|
|
57
|
+
const target = own.slice(0, releasedAt).filter((r) => r.digest !== replaced.digest).at(-1);
|
|
58
|
+
if (!target)
|
|
59
|
+
return { error: `"${component}" has no release in "${env}" before ${replaced.digest} to roll back to` };
|
|
60
|
+
return { target, replaced };
|
|
61
|
+
}
|
|
62
|
+
/** Plan a rollback: the earlier release, its plan, and its source tree archived again and checked against the recorded digest. */
|
|
63
|
+
export async function releaseRollbackPlan(args) {
|
|
64
|
+
if (!args.component || !args.env)
|
|
65
|
+
throw new Error("releaseRollbackPlan: name the component and the environment");
|
|
66
|
+
const cwd = resolve(args.cwd ?? process.cwd());
|
|
67
|
+
const opts = { cwd };
|
|
68
|
+
const { readReleaseLedger } = await import("../../lifecycle/release-ledger.js");
|
|
69
|
+
const { readReleasePlan: readPersistedPlan } = await import("../../lifecycle/plan-ledger.js");
|
|
70
|
+
const picked = pickRollback((await readReleaseLedger(args.env, opts)).records, args.component, args.env, args.to);
|
|
71
|
+
if ("error" in picked)
|
|
72
|
+
throw new Error(`releaseRollbackPlan: ${picked.error}`);
|
|
73
|
+
const { target, replaced } = picked;
|
|
74
|
+
// The restored release's plan, as it was approved: its content still hashes to its name.
|
|
75
|
+
const plan = await readPersistedPlan(target.digest, opts);
|
|
76
|
+
if (!plan)
|
|
77
|
+
throw new Error(`releaseRollbackPlan: no plan is recorded for ${target.digest} (_plans/ on chant/lifecycle), so its source tree is unknown`);
|
|
78
|
+
const planDigest = releasePlanDigest(plan);
|
|
79
|
+
if (planDigest !== target.digest)
|
|
80
|
+
throw new Error(`releaseRollbackPlan: the plan recorded for ${target.digest} hashes to ${planDigest}`);
|
|
81
|
+
const artifact = plan.artifact;
|
|
82
|
+
if (typeof artifact?.digest !== "string")
|
|
83
|
+
throw new Error(`releaseRollbackPlan: the plan for ${target.digest} records no artifact digest`);
|
|
84
|
+
const gitSha = plan.gitSha ?? target.gitSha;
|
|
85
|
+
// The same directory of the same commit, archived again: git archive gives the same bytes.
|
|
86
|
+
let dir;
|
|
87
|
+
if (typeof artifact.dir === "string") {
|
|
88
|
+
const root = realpathSync(execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf-8" }).trim());
|
|
89
|
+
dir = join(root, artifact.dir);
|
|
90
|
+
}
|
|
91
|
+
else if (args.path) {
|
|
92
|
+
dir = args.path;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw new Error(`releaseRollbackPlan: the plan for ${target.digest} records no artifact.dir; pass path, the directory the release archived`);
|
|
96
|
+
}
|
|
97
|
+
const archive = archiveSourceTree({ dir, ref: gitSha, cwd });
|
|
98
|
+
if (archive.digest !== artifact.digest) {
|
|
99
|
+
throw new Error(`releaseRollbackPlan: ${archive.dir} at ${gitSha.slice(0, 12)} archives to ${archive.digest}, not the ${artifact.digest} release ${target.digest} recorded; refusing to restore it`);
|
|
100
|
+
}
|
|
101
|
+
const written = await releasePlan({
|
|
102
|
+
component: args.component,
|
|
103
|
+
env: args.env,
|
|
104
|
+
gitSha,
|
|
105
|
+
content: {
|
|
106
|
+
rollback: { to: target.digest, from: replaced.digest, restores: refTo(target) },
|
|
107
|
+
artifact: { ...plan.artifact, digest: archive.digest, dir: archive.dir },
|
|
108
|
+
},
|
|
109
|
+
...(args.dir ? { dir: args.dir } : {}),
|
|
110
|
+
cwd,
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
digest: written.digest,
|
|
114
|
+
file: written.file,
|
|
115
|
+
to: target.digest,
|
|
116
|
+
from: replaced.digest,
|
|
117
|
+
gitSha,
|
|
118
|
+
archive: archive.archive,
|
|
119
|
+
archiveDigest: archive.digest,
|
|
120
|
+
dir: archive.dir,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Record a rollback in the release ledger, once. */
|
|
124
|
+
export async function releaseRollbackRecord(args) {
|
|
125
|
+
const cwd = args.cwd;
|
|
126
|
+
const opts = cwd ? { cwd } : undefined;
|
|
127
|
+
const plan = readReleasePlan(resolve(cwd ?? process.cwd(), args.plan), args.digest);
|
|
128
|
+
const rollback = plan.rollback;
|
|
129
|
+
if (!rollback?.to || !rollback.restores)
|
|
130
|
+
throw new Error(`releaseRollbackRecord: ${args.plan} is not a rollback plan (no rollback.to)`);
|
|
131
|
+
const component = plan.component;
|
|
132
|
+
const env = plan.env;
|
|
133
|
+
const gitSha = plan.gitSha;
|
|
134
|
+
const { readReleaseLedger, latestPerComponent, appendReleaseRecord, resolveRunId } = await import("../../lifecycle/release-ledger.js");
|
|
135
|
+
const { pushLifecycle } = await import("../../lifecycle/git.js");
|
|
136
|
+
let approver = null;
|
|
137
|
+
if (args.approval) {
|
|
138
|
+
const { readGateLedger } = await import("../../lifecycle/gate-ledger.js");
|
|
139
|
+
const { resolutions } = await readGateLedger(args.approval.op, opts);
|
|
140
|
+
const bound = resolutions.filter((r) => r.gate === args.approval.gate && r.planDigest === plan.digest);
|
|
141
|
+
approver = bound.length > 0 ? [...new Set(bound.map((r) => r.resolvedBy))].join(", ") : null;
|
|
142
|
+
}
|
|
143
|
+
const latest = latestPerComponent((await readReleaseLedger(env, opts)).records.filter((r) => r.component === component)).get(component);
|
|
144
|
+
if (latest?.digest === rollback.to && latest.restores?.runId === rollback.restores.runId && latest.restores.timestamp === rollback.restores.timestamp) {
|
|
145
|
+
return { recorded: false, digest: rollback.to, env, component, approver };
|
|
146
|
+
}
|
|
147
|
+
const actor = args.actor || process.env.GITHUB_ACTOR || process.env.GITLAB_USER_LOGIN || process.env.USER;
|
|
148
|
+
if (!actor)
|
|
149
|
+
throw new Error("releaseRollbackRecord: no actor: pass one, or set GITHUB_ACTOR, GITLAB_USER_LOGIN or USER");
|
|
150
|
+
const { runId, runOrigin } = resolveRunId(args.runId);
|
|
151
|
+
await appendReleaseRecord({
|
|
152
|
+
component,
|
|
153
|
+
env,
|
|
154
|
+
digest: rollback.to,
|
|
155
|
+
gitSha,
|
|
156
|
+
runId,
|
|
157
|
+
...(runOrigin ? { runOrigin } : {}),
|
|
158
|
+
timestamp: new Date().toISOString(),
|
|
159
|
+
actor,
|
|
160
|
+
...(approver ? { approver } : {}),
|
|
161
|
+
restores: rollback.restores,
|
|
162
|
+
}, opts);
|
|
163
|
+
await pushLifecycle(opts);
|
|
164
|
+
return { recorded: true, digest: rollback.to, env, component, approver };
|
|
165
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
/**
|
|
5
|
+
* Run `chant teardown` in the given project path.
|
|
6
|
+
* Uses longInfra profile — 20m timeout.
|
|
7
|
+
*/
|
|
8
|
+
export async function chantTeardown(args, signal) {
|
|
9
|
+
const { stdout, stderr } = await execAsync("npm run teardown", {
|
|
10
|
+
cwd: args.path,
|
|
11
|
+
signal,
|
|
12
|
+
});
|
|
13
|
+
if (stdout)
|
|
14
|
+
console.log(stdout);
|
|
15
|
+
if (stderr)
|
|
16
|
+
console.error(stderr);
|
|
17
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { sleep } from "./util.js";
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
/**
|
|
6
|
+
* Poll until a Kubernetes Deployment or StatefulSet named `name` is fully rolled out.
|
|
7
|
+
* Uses the `k8sWait` profile — 15m timeout.
|
|
8
|
+
*
|
|
9
|
+
* Progress goes to stdout, one line per poll, which is the executor's step-record
|
|
10
|
+
* channel: the local executor streams an activity's output alongside the step it
|
|
11
|
+
* belongs to, so a long rollout is visible without a liveness protocol. Nothing
|
|
12
|
+
* mid-run is durable here by design (chant #2114) — the op re-runs and converges.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately NOT migrated onto the generic `waitForReady` (#957): `kubectl
|
|
15
|
+
* rollout status` encodes rollout-specific semantics — progress-deadline
|
|
16
|
+
* timeouts, partial/paused rollouts, generation tracking — that a status-field
|
|
17
|
+
* predicate spec does not replicate, and it targets built-in workloads rather
|
|
18
|
+
* than arbitrary operator CRDs. `waitForReady` is the right tool for CRD
|
|
19
|
+
* readiness; `waitForStack` stays the right tool for workload rollouts.
|
|
20
|
+
*/
|
|
21
|
+
export async function waitForStack(args, signal) {
|
|
22
|
+
const ns = args.namespace ? `-n ${args.namespace}` : "";
|
|
23
|
+
const ctx = args.context ? `--context ${args.context}` : "";
|
|
24
|
+
const interval = args.intervalMs ?? 10000;
|
|
25
|
+
let attempt = 0;
|
|
26
|
+
while (true) {
|
|
27
|
+
if (signal?.aborted)
|
|
28
|
+
throw new Error("waitForStack aborted");
|
|
29
|
+
attempt++;
|
|
30
|
+
console.log(`[waitForStack] ${args.name}: poll ${attempt}`);
|
|
31
|
+
try {
|
|
32
|
+
await execAsync(`kubectl rollout status deployment/${args.name} ${ns} ${ctx} --timeout=30s`, { signal });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
if (signal?.aborted)
|
|
37
|
+
throw new Error("waitForStack aborted");
|
|
38
|
+
// Not ready yet — wait and retry
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
await execAsync(`kubectl rollout status statefulset/${args.name} ${ns} ${ctx} --timeout=30s`, { signal });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
if (signal?.aborted)
|
|
46
|
+
throw new Error("waitForStack aborted");
|
|
47
|
+
// Not ready yet
|
|
48
|
+
}
|
|
49
|
+
await sleep(interval, signal);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `workEvidence` (#2772): attach one piece of evidence to an acceptance
|
|
3
|
+
* criterion of the work item the run holds the lease on.
|
|
4
|
+
*
|
|
5
|
+
* Meant for an Op that declares `workLease` (#2748), a steward's among them:
|
|
6
|
+
* the builder passes the run's lease (`workLeaseOutput()`) as `lease`, and the
|
|
7
|
+
* write goes through only while that lease is still the run's, under its
|
|
8
|
+
* token. The rules are `attachWorkEvidence`'s (`../../workspace/work-evidence.ts`):
|
|
9
|
+
* the criterion must be one the record lists, and a `manual` criterion is
|
|
10
|
+
* refused, since the run holding the lease is the item's implementer.
|
|
11
|
+
* A refusal fails the step with its code.
|
|
12
|
+
*/
|
|
13
|
+
export async function workEvidence(args) {
|
|
14
|
+
const lease = args.lease;
|
|
15
|
+
if (!lease || typeof lease.item !== "string" || typeof lease.holder !== "string" || typeof lease.token !== "string") {
|
|
16
|
+
throw new Error("workEvidence runs under a work lease: pass the run's lease as `lease` (workLeaseOutput()) from an Op that declares workLease");
|
|
17
|
+
}
|
|
18
|
+
const { attachWorkEvidence } = await import("../../workspace/work-evidence.js");
|
|
19
|
+
const out = await attachWorkEvidence({
|
|
20
|
+
cwd: args.cwd ?? process.cwd(),
|
|
21
|
+
item: lease.item,
|
|
22
|
+
holder: lease.holder,
|
|
23
|
+
token: lease.token,
|
|
24
|
+
criterion: args.criterion,
|
|
25
|
+
result: args.result,
|
|
26
|
+
title: args.title,
|
|
27
|
+
...(args.url !== undefined ? { url: args.url } : {}),
|
|
28
|
+
...(args.path !== undefined ? { path: args.path } : {}),
|
|
29
|
+
...(args.kind !== undefined ? { kind: args.kind } : {}),
|
|
30
|
+
});
|
|
31
|
+
if ("error" in out)
|
|
32
|
+
throw new Error(`workEvidence refused for ${lease.item} ${args.criterion}: ${out.error.code}: ${out.error.message}`);
|
|
33
|
+
console.log(`workEvidence: ${out.item} ${args.criterion} ${args.result} (${out.acceptance.met}/${out.acceptance.total} met)`);
|
|
34
|
+
return { item: out.item, path: out.path, evidence: out.evidence, acceptance: out.acceptance };
|
|
35
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workflowSupplyChainAudit — the live counterpart to the github post-synth
|
|
3
|
+
* supply-chain checks (#286-#291).
|
|
4
|
+
*
|
|
5
|
+
* Some workflow-reference checks can only be answered against a moving external
|
|
6
|
+
* truth: whether a pinned SHA still corresponds to a real tag/release upstream,
|
|
7
|
+
* whether a referenced commit exists in the repo it claims, whether a ref is
|
|
8
|
+
* confusable as both a tag and a branch, whether a pin matches its version
|
|
9
|
+
* comment, or whether a new advisory now covers an action already in use. These
|
|
10
|
+
* change over time independent of the source, so they cannot live in the
|
|
11
|
+
* deterministic build — this activity owns *only* the checks that require live
|
|
12
|
+
* resolution.
|
|
13
|
+
*
|
|
14
|
+
* It is dependency-free and primitives-only: it reads the emitted workflow YAML
|
|
15
|
+
* (passed as a string) and resolves references through an injectable
|
|
16
|
+
* `ActionRefResolver`, so `chant run` can schedule it and tests can run
|
|
17
|
+
* it against recorded responses with no live network.
|
|
18
|
+
*/
|
|
19
|
+
/** Read `*.yml`/`*.yaml` files from a directory (best-effort). */
|
|
20
|
+
async function readWorkflowDir(dir) {
|
|
21
|
+
try {
|
|
22
|
+
const { readdir, readFile } = await import("node:fs/promises");
|
|
23
|
+
const { join } = await import("node:path");
|
|
24
|
+
const files = (await readdir(dir)).filter((f) => f.endsWith(".yml") || f.endsWith(".yaml"));
|
|
25
|
+
return Promise.all(files.map((f) => readFile(join(dir, f), "utf-8")));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const SHA_RE = /^[0-9a-f]{40}$/;
|
|
32
|
+
/**
|
|
33
|
+
* Collect external action references (`uses: owner/repo@ref`, with an optional
|
|
34
|
+
* trailing version comment) from a workflow YAML. Local (`./`) and `docker://`
|
|
35
|
+
* references are excluded.
|
|
36
|
+
*/
|
|
37
|
+
export function collectAuditRefs(yaml) {
|
|
38
|
+
const out = [];
|
|
39
|
+
const re = /uses:\s*['"]?([\w.-]+\/[\w.-]+(?:\/[\w./-]+)?)@([\w.-]+)['"]?\s*(?:#\s*(\S+))?/g;
|
|
40
|
+
let m;
|
|
41
|
+
while ((m = re.exec(yaml)) !== null) {
|
|
42
|
+
out.push({ slug: m[1].split("/").slice(0, 2).join("/"), ref: m[2], comment: m[3] });
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Default resolver: query the GitHub REST API for whether the ref exists, what
|
|
48
|
+
* tags point at it, archive status, and advisories. Best-effort and resilient —
|
|
49
|
+
* a network/HTTP error yields an "unknown" resolution (exists=true, no findings)
|
|
50
|
+
* rather than a false positive.
|
|
51
|
+
*/
|
|
52
|
+
export const defaultActionRefResolver = async (slug, ref) => {
|
|
53
|
+
const base = `https://api.github.com/repos/${slug}`;
|
|
54
|
+
const headers = { Accept: "application/vnd.github+json" };
|
|
55
|
+
if (process.env.GITHUB_TOKEN)
|
|
56
|
+
headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
|
|
57
|
+
const unknown = { exists: true, tags: [], archived: false, advisories: [] };
|
|
58
|
+
try {
|
|
59
|
+
const repoResp = await fetch(base, { headers });
|
|
60
|
+
if (repoResp.status === 404)
|
|
61
|
+
return { exists: false, tags: [], archived: false, advisories: [] };
|
|
62
|
+
if (!repoResp.ok)
|
|
63
|
+
return unknown;
|
|
64
|
+
const repo = (await repoResp.json());
|
|
65
|
+
const refResp = await fetch(`${base}/commits/${ref}`, { headers });
|
|
66
|
+
if (refResp.status === 404)
|
|
67
|
+
return { exists: false, tags: [], archived: !!repo.archived, advisories: [] };
|
|
68
|
+
let tags = [];
|
|
69
|
+
if (SHA_RE.test(ref)) {
|
|
70
|
+
const tagsResp = await fetch(`${base}/tags?per_page=100`, { headers });
|
|
71
|
+
if (tagsResp.ok) {
|
|
72
|
+
const tagList = (await tagsResp.json());
|
|
73
|
+
tags = tagList.filter((t) => t.commit?.sha === ref).map((t) => t.name);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return { exists: refResp.ok, tags, archived: !!repo.archived, advisories: [] };
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return unknown;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
function renderSummary(findings) {
|
|
83
|
+
if (findings.length === 0)
|
|
84
|
+
return "## Workflow supply-chain audit\n\nNo live drift detected against upstream references.\n";
|
|
85
|
+
let out = `## Workflow supply-chain audit\n\n${findings.length} finding(s) against live upstream truth:\n\n`;
|
|
86
|
+
out += "| Action | Ref | Finding | Detail |\n|---|---|---|---|\n";
|
|
87
|
+
for (const f of findings)
|
|
88
|
+
out += `| ${f.slug} | ${f.ref} | ${f.kind} | ${f.detail} |\n`;
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Resolve each pinned external reference in the emitted workflows against live
|
|
93
|
+
* upstreams and report drift.
|
|
94
|
+
*/
|
|
95
|
+
export async function workflowSupplyChainAudit(args) {
|
|
96
|
+
const resolver = args.resolver ?? defaultActionRefResolver;
|
|
97
|
+
const mode = args.mode ?? "report";
|
|
98
|
+
let yamls = args.yamls ?? (args.yaml ? [args.yaml] : []);
|
|
99
|
+
if (yamls.length === 0) {
|
|
100
|
+
yamls = await readWorkflowDir(args.workflowsDir ?? ".github/workflows");
|
|
101
|
+
}
|
|
102
|
+
const findings = [];
|
|
103
|
+
const seen = new Set();
|
|
104
|
+
for (const yaml of yamls) {
|
|
105
|
+
for (const { slug, ref, comment } of collectAuditRefs(yaml)) {
|
|
106
|
+
const key = `${slug}@${ref}`;
|
|
107
|
+
if (seen.has(key))
|
|
108
|
+
continue;
|
|
109
|
+
seen.add(key);
|
|
110
|
+
const res = await resolver(slug, ref);
|
|
111
|
+
if (!res.exists) {
|
|
112
|
+
findings.push({ slug, ref, kind: "impostor", detail: `ref does not exist in ${slug} — possible impostor or deleted ref` });
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (SHA_RE.test(ref) && res.tags.length === 0) {
|
|
116
|
+
findings.push({ slug, ref, kind: "stale-pin", detail: "pinned SHA is no longer on any tag/release upstream" });
|
|
117
|
+
}
|
|
118
|
+
if (res.ambiguousRef) {
|
|
119
|
+
findings.push({ slug, ref, kind: "ambiguous-ref", detail: "ref resolves as both a tag and a branch upstream (symbolic-ref confusion)" });
|
|
120
|
+
}
|
|
121
|
+
if (comment && res.tags.length > 0 && !res.tags.includes(comment)) {
|
|
122
|
+
findings.push({ slug, ref, kind: "pin-comment-mismatch", detail: `pin comment "${comment}" does not match the SHA's actual tag(s): ${res.tags.join(", ")}` });
|
|
123
|
+
}
|
|
124
|
+
if (res.archived) {
|
|
125
|
+
findings.push({ slug, ref, kind: "archived", detail: `${slug} has been archived upstream since pinning` });
|
|
126
|
+
}
|
|
127
|
+
for (const adv of res.advisories) {
|
|
128
|
+
findings.push({ slug, ref, kind: "advisory", detail: `disclosed advisory ${adv} covers ${slug}` });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return { mode, findings, summary: renderSummary(findings) };
|
|
133
|
+
}
|