@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,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The root CI file that runs `chant ci tick` (#3573, ws-103; ws-042 for its
|
|
3
|
+
* place at the repository root, #2524 D14 for its header and record).
|
|
4
|
+
*
|
|
5
|
+
* `chant ci workflow` writes `.github/workflows/chant-ci-green.yml`. It runs
|
|
6
|
+
* the tick when a workflow that holds a required check run completes on the
|
|
7
|
+
* branch, so a result or a re-run is acted on within seconds, and every 15
|
|
8
|
+
* minutes as a backstop for a dropped or late event. One concurrency group
|
|
9
|
+
* that never cancels keeps ticks one at a time.
|
|
10
|
+
*
|
|
11
|
+
* GitHub's `workflow_run` names workflows, and `ci.green` names check runs,
|
|
12
|
+
* so the generator reads the repository's other workflow files and keeps
|
|
13
|
+
* each workflow with a job whose check-run name meets one of a required
|
|
14
|
+
* phase's patterns. A job's check run is its `name`, or its id, with
|
|
15
|
+
* ` (<matrix values>)` after it for a matrix job and ` / <job>` after it for
|
|
16
|
+
* a job that calls a reusable workflow; a `${{ }}` expression stands for
|
|
17
|
+
* anything. `--workflow <name>` adds a workflow the scan can't see.
|
|
18
|
+
*
|
|
19
|
+
* The tick runs the published chant that wrote the file, through npx.
|
|
20
|
+
* `--chant <command>` runs another one instead, and `--install <command>`
|
|
21
|
+
* adds a step that installs it, with setup-node caching npm's downloads when
|
|
22
|
+
* the workspace root has a `package-lock.json`. chant's own repository uses
|
|
23
|
+
* both to run its source at the commit it checks out.
|
|
24
|
+
*
|
|
25
|
+
* The tick pushes its tags with the credentials actions/checkout leaves in
|
|
26
|
+
* the clone, the Actions token by default. GitHub treats a new ref to a
|
|
27
|
+
* commit whose workflow files differ from the default branch's as an update
|
|
28
|
+
* to those workflows, and the Actions token can never hold the `workflows`
|
|
29
|
+
* permission, so it is refused there. `--token-secret <NAME>` checks out
|
|
30
|
+
* with `secrets.<NAME>` instead, falling back to the Actions token where the
|
|
31
|
+
* secret is unset (#3624), so a fork or a fresh clone still tags the commits
|
|
32
|
+
* that change no workflow file; and `--app-id-var <VAR> --app-key-secret
|
|
33
|
+
* <NAME>` mints a GitHub App token first and checks out with that. The
|
|
34
|
+
* tick's own `GITHUB_TOKEN`, which reads check runs, stays the Actions token:
|
|
35
|
+
* a fine-grained personal access token can't call the Checks API.
|
|
36
|
+
*
|
|
37
|
+
* Like a member's pipelines (./member-pipeline.ts), the file starts with the
|
|
38
|
+
* generated-file header naming the command, and the member whose directory
|
|
39
|
+
* the command runs in records it in its generated-file record, so `WSP081`
|
|
40
|
+
* allows one declarer.
|
|
41
|
+
*/
|
|
42
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
43
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
44
|
+
import { GENERATED_MARKER } from "../discovery/files.js";
|
|
45
|
+
import { parseYAMLDocument } from "../yaml.js";
|
|
46
|
+
import { matchesCheckRun } from "./ci-green.js";
|
|
47
|
+
import { githubSecretOrJobToken } from "../ci-jobs.js";
|
|
48
|
+
/** Where the workflow goes, relative to the repository root. */
|
|
49
|
+
export const CI_GREEN_WORKFLOW_FILE = ".github/workflows/chant-ci-green.yml";
|
|
50
|
+
export const CI_GREEN_WORKFLOW_NAME = "chant-ci-green";
|
|
51
|
+
const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
52
|
+
const EXPRESSION = /\$\{\{[^}]*\}\}/g;
|
|
53
|
+
/** The check-run names a workflow's jobs report, as patterns: `*` stands for what an expression or a matrix fills in. */
|
|
54
|
+
export function jobCheckRuns(doc) {
|
|
55
|
+
if (!isObject(doc) || !isObject(doc.jobs))
|
|
56
|
+
return [];
|
|
57
|
+
const out = [];
|
|
58
|
+
for (const [id, job] of Object.entries(doc.jobs)) {
|
|
59
|
+
if (!isObject(job))
|
|
60
|
+
continue;
|
|
61
|
+
const named = typeof job.name === "string" ? job.name : id;
|
|
62
|
+
const base = named.replace(EXPRESSION, "*");
|
|
63
|
+
out.push(base);
|
|
64
|
+
if (isObject(job.strategy) && job.strategy.matrix !== undefined && base === named)
|
|
65
|
+
out.push(`${base} (*)`);
|
|
66
|
+
if (typeof job.uses === "string")
|
|
67
|
+
out.push(`${base} / *`);
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
/** Whether two patterns can name the same check run: either matches the other with its `*` filled in. */
|
|
72
|
+
function meet(a, b) {
|
|
73
|
+
return matchesCheckRun(a, b.replace(/\*/g, "x")) || matchesCheckRun(b, a.replace(/\*/g, "x"));
|
|
74
|
+
}
|
|
75
|
+
/** The name `workflow_run` knows a workflow by: its `name`, or its path when it has none or the name is an expression. */
|
|
76
|
+
function workflowName(doc, path) {
|
|
77
|
+
return isObject(doc) && typeof doc.name === "string" && !doc.name.includes("${{") ? doc.name : path;
|
|
78
|
+
}
|
|
79
|
+
/** Find the workflows that hold the required phases' check runs. */
|
|
80
|
+
export function workflowsHolding(green, sources) {
|
|
81
|
+
const patterns = green.require.flatMap((name) => green.phases.find((p) => p.name === name).runs.map((pattern) => ({ phase: name, pattern })));
|
|
82
|
+
const workflows = new Set();
|
|
83
|
+
const met = new Set();
|
|
84
|
+
const unreadable = [];
|
|
85
|
+
for (const s of sources) {
|
|
86
|
+
let doc;
|
|
87
|
+
try {
|
|
88
|
+
doc = parseYAMLDocument(s.text);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
unreadable.push(s.path);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const runs = jobCheckRuns(doc);
|
|
95
|
+
for (const p of patterns) {
|
|
96
|
+
if (!runs.some((r) => meet(p.pattern, r)))
|
|
97
|
+
continue;
|
|
98
|
+
workflows.add(workflowName(doc, s.path));
|
|
99
|
+
met.add(`${p.phase}\0${p.pattern}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
workflows: [...workflows].sort(),
|
|
104
|
+
unmatched: patterns.filter((p) => !met.has(`${p.phase}\0${p.pattern}`)),
|
|
105
|
+
unreadable,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** The repository's GitHub workflow files, other than `skip`. */
|
|
109
|
+
export function readWorkflowSources(repoRoot, skip) {
|
|
110
|
+
const dir = join(repoRoot, ".github", "workflows");
|
|
111
|
+
if (!existsSync(dir))
|
|
112
|
+
return [];
|
|
113
|
+
return readdirSync(dir)
|
|
114
|
+
.filter((f) => /\.ya?ml$/.test(f))
|
|
115
|
+
.sort()
|
|
116
|
+
.map((f) => `.github/workflows/${f}`)
|
|
117
|
+
.filter((p) => p !== skip)
|
|
118
|
+
.map((path) => ({ path, text: readFileSync(join(repoRoot, path), "utf-8") }));
|
|
119
|
+
}
|
|
120
|
+
const q = (s) => JSON.stringify(s);
|
|
121
|
+
/** A secret or variable name GitHub accepts: letters, digits and underscores, not starting with a digit. */
|
|
122
|
+
export const ACTIONS_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
123
|
+
/** The workflow's YAML, without the generated-file header. Deterministic: the same input writes the same bytes. */
|
|
124
|
+
export function renderCiGreenWorkflow(input) {
|
|
125
|
+
const { green } = input;
|
|
126
|
+
const where = input.workspaceRoot === "." ? [] : [` working-directory: ${q(input.workspaceRoot)}`];
|
|
127
|
+
const cache = input.install && input.npmLock ? [" cache: npm", ...(input.npmLock === "package-lock.json" ? [] : [` cache-dependency-path: ${q(input.npmLock)}`])] : [];
|
|
128
|
+
const tick = input.chant ? q(`${input.chant} ci tick`) : `npx --yes @intentius/chant@${input.chantVersion} ci tick`;
|
|
129
|
+
const push = input.push;
|
|
130
|
+
const mint = push && "appIdVar" in push
|
|
131
|
+
? [
|
|
132
|
+
" - name: Mint a GitHub App token that may push tags to commits that change workflows",
|
|
133
|
+
" id: app-token",
|
|
134
|
+
" uses: actions/create-github-app-token@v2",
|
|
135
|
+
" with:",
|
|
136
|
+
` app-id: \${{ vars.${push.appIdVar} }}`,
|
|
137
|
+
` private-key: \${{ secrets.${push.appKeySecret} }}`,
|
|
138
|
+
]
|
|
139
|
+
: [];
|
|
140
|
+
const token = !push ? [] : ["secret" in push ? ` token: ${githubSecretOrJobToken(push.secret)}` : " token: ${{ steps.app-token.outputs.token }}"];
|
|
141
|
+
const lines = [
|
|
142
|
+
`name: ${CI_GREEN_WORKFLOW_NAME}`,
|
|
143
|
+
"",
|
|
144
|
+
"# Tags each commit on the branch that passed its required phases ci/green/<sha>,",
|
|
145
|
+
"# and a green commit that later fails one ci/revoked/<sha>.",
|
|
146
|
+
"on:",
|
|
147
|
+
" workflow_run:",
|
|
148
|
+
" workflows:",
|
|
149
|
+
...input.workflows.map((w) => ` - ${q(w)}`),
|
|
150
|
+
" types:",
|
|
151
|
+
" - completed",
|
|
152
|
+
" branches:",
|
|
153
|
+
` - ${q(green.branch)}`,
|
|
154
|
+
" schedule:",
|
|
155
|
+
" - cron: \"*/15 * * * *\"",
|
|
156
|
+
" workflow_dispatch: {}",
|
|
157
|
+
"",
|
|
158
|
+
"# One tick at a time, and a tick in progress is never cancelled.",
|
|
159
|
+
"concurrency:",
|
|
160
|
+
` group: ${CI_GREEN_WORKFLOW_NAME}`,
|
|
161
|
+
" cancel-in-progress: false",
|
|
162
|
+
"",
|
|
163
|
+
"permissions:",
|
|
164
|
+
" contents: write",
|
|
165
|
+
" checks: read",
|
|
166
|
+
"",
|
|
167
|
+
"jobs:",
|
|
168
|
+
" tick:",
|
|
169
|
+
" runs-on: ubuntu-latest",
|
|
170
|
+
" timeout-minutes: 15",
|
|
171
|
+
" steps:",
|
|
172
|
+
...mint,
|
|
173
|
+
" - uses: actions/checkout@v6",
|
|
174
|
+
" with:",
|
|
175
|
+
` ref: ${q(green.branch)}`,
|
|
176
|
+
" fetch-depth: 0",
|
|
177
|
+
...token,
|
|
178
|
+
" - uses: actions/setup-node@v6",
|
|
179
|
+
" with:",
|
|
180
|
+
" node-version: \"24\"",
|
|
181
|
+
...cache,
|
|
182
|
+
...(input.install ? [" - name: Install what the tick runs", ...where, ` run: ${q(input.install)}`] : []),
|
|
183
|
+
" - name: Tag the commits that turned green, revoke the ones that turned red",
|
|
184
|
+
...where,
|
|
185
|
+
" env:",
|
|
186
|
+
" GITHUB_TOKEN: ${{ github.token }}",
|
|
187
|
+
" GIT_COMMITTER_NAME: github-actions[bot]",
|
|
188
|
+
" GIT_COMMITTER_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com",
|
|
189
|
+
` run: ${tick}`,
|
|
190
|
+
];
|
|
191
|
+
return lines.join("\n") + "\n";
|
|
192
|
+
}
|
|
193
|
+
/** The header line naming the command that regenerates the file, and where to run it. */
|
|
194
|
+
export function ciGreenHeader(command, where) {
|
|
195
|
+
return `# ${GENERATED_MARKER}. Regenerate with: ${command} (in the ${where === "member" ? "member's directory" : "workspace root"})\n`;
|
|
196
|
+
}
|
|
197
|
+
/** Write the file, creating its directory. Returns the path relative to the current directory. */
|
|
198
|
+
export function writeWorkflowFile(target, text) {
|
|
199
|
+
mkdirSync(dirname(resolve(target)), { recursive: true });
|
|
200
|
+
writeFileSync(target, text);
|
|
201
|
+
return relative(process.cwd(), target).split(sep).join("/") || target;
|
|
202
|
+
}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which commits passed CI (#3573, ws-103).
|
|
3
|
+
*
|
|
4
|
+
* The declaration's `ci.green` names a branch, a window and phases, each
|
|
5
|
+
* phase a list of check-run name patterns. A phase passes when every check
|
|
6
|
+
* run its patterns match finished with success, judged by each run's latest
|
|
7
|
+
* attempt. A run that finished as skipped passes only in a phase declared
|
|
8
|
+
* `skipped: pass`. A run still going, or a pattern no run matches yet, leaves
|
|
9
|
+
* the phase undecided. A commit passes when every phase in `require` passes,
|
|
10
|
+
* and fails when one of them fails.
|
|
11
|
+
*
|
|
12
|
+
* What chant concluded is kept in git as two kinds of annotated tag, each
|
|
13
|
+
* made once and never moved or deleted by chant:
|
|
14
|
+
*
|
|
15
|
+
* ci/green/<sha> every required phase passed; the annotation gives the
|
|
16
|
+
* time and each phase's runs
|
|
17
|
+
* ci/revoked/<sha> a green commit later failed a required phase (a re-run
|
|
18
|
+
* that went red); the annotation gives the phase, the
|
|
19
|
+
* run and the time
|
|
20
|
+
*
|
|
21
|
+
* {@link ciTick} walks the branch's first-parent commits within the window,
|
|
22
|
+
* tags the ones that turned green and revokes the green ones that turned red.
|
|
23
|
+
* It is idempotent: a second tick over the same check runs changes nothing.
|
|
24
|
+
* A revoked commit is never looked at again, so it goes green again only
|
|
25
|
+
* when someone deletes its revoked tag by hand, which leaves its green tag
|
|
26
|
+
* standing. {@link lastGreen} reads the tags alone, with no forge.
|
|
27
|
+
*
|
|
28
|
+
* The forge is asked only for check runs (`./ci-green-forge.ts`). The tags
|
|
29
|
+
* are fetched from and pushed to the remote with git.
|
|
30
|
+
*/
|
|
31
|
+
import { execFileSync } from "node:child_process";
|
|
32
|
+
import { readDeclaration, readerVersion, WORKSPACE_ERROR_CODES, WorkspaceReadError } from "./declaration.js";
|
|
33
|
+
import { gitTop } from "./tree.js";
|
|
34
|
+
import { locateWorkspace } from "./which-chant.js";
|
|
35
|
+
export const CI_GREEN_TAG_PREFIX = "ci/green/";
|
|
36
|
+
export const CI_REVOKED_TAG_PREFIX = "ci/revoked/";
|
|
37
|
+
export const CI_LAST_GREEN_CONTRACT_VERSION = 1;
|
|
38
|
+
export const CI_LAST_GREEN_SCHEMA_ID = "https://intentius.io/chant/schemas/workspace/ci-last-green/v1/ci-last-green.schema.json";
|
|
39
|
+
/** Why `ci last-green` or `ci tick` could not start. Closed. */
|
|
40
|
+
export const CI_GREEN_ERROR_CODES = [...WORKSPACE_ERROR_CODES, "ci-green-undeclared", "ci-branch-unknown"];
|
|
41
|
+
export class CiGreenError extends Error {
|
|
42
|
+
constructor(code, message) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.code = code;
|
|
45
|
+
this.name = "CiGreenError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Whether a check run's name matches a pattern: the whole name, `*` standing for any run of characters. */
|
|
49
|
+
export function matchesCheckRun(pattern, name) {
|
|
50
|
+
const re = new RegExp(`^${pattern.split("*").map((p) => p.replace(/[.+?^${}()|[\]\\]/g, "\\$&")).join(".*")}$`, "s");
|
|
51
|
+
return re.test(name);
|
|
52
|
+
}
|
|
53
|
+
/** Each check run's latest attempt, by name: the run with the largest id. */
|
|
54
|
+
export function latestAttempts(runs) {
|
|
55
|
+
const byName = new Map();
|
|
56
|
+
for (const r of runs) {
|
|
57
|
+
const seen = byName.get(r.name);
|
|
58
|
+
if (!seen || r.id > seen.id)
|
|
59
|
+
byName.set(r.name, r);
|
|
60
|
+
}
|
|
61
|
+
return [...byName.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
62
|
+
}
|
|
63
|
+
function runVerdict(phase, r) {
|
|
64
|
+
if (r.status !== "completed")
|
|
65
|
+
return "pending";
|
|
66
|
+
if (r.conclusion === "success")
|
|
67
|
+
return "pass";
|
|
68
|
+
if (r.conclusion === "skipped")
|
|
69
|
+
return phase.skipped === "pass" ? "pass" : "fail";
|
|
70
|
+
return "fail";
|
|
71
|
+
}
|
|
72
|
+
/** Judge one phase against a commit's latest attempts. */
|
|
73
|
+
export function evaluatePhase(phase, latest) {
|
|
74
|
+
const runs = [];
|
|
75
|
+
const unmatched = [];
|
|
76
|
+
for (const pattern of phase.runs) {
|
|
77
|
+
const matched = latest.filter((r) => matchesCheckRun(pattern, r.name));
|
|
78
|
+
if (matched.length === 0)
|
|
79
|
+
unmatched.push(pattern);
|
|
80
|
+
for (const r of matched) {
|
|
81
|
+
if (runs.some((x) => x.name === r.name))
|
|
82
|
+
continue;
|
|
83
|
+
runs.push({ name: r.name, id: r.id, status: r.status, conclusion: r.conclusion, url: r.url, verdict: runVerdict(phase, r) });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const verdict = runs.some((r) => r.verdict === "fail")
|
|
87
|
+
? "fail"
|
|
88
|
+
: runs.some((r) => r.verdict === "pending") || unmatched.length > 0
|
|
89
|
+
? "pending"
|
|
90
|
+
: "pass";
|
|
91
|
+
return { phase: phase.name, verdict, runs, unmatched };
|
|
92
|
+
}
|
|
93
|
+
/** Judge a commit: it fails when a required phase fails, and passes when every one passes. */
|
|
94
|
+
export function evaluateCommit(green, runs) {
|
|
95
|
+
const latest = latestAttempts(runs);
|
|
96
|
+
const phases = green.require.map((name) => evaluatePhase(green.phases.find((p) => p.name === name), latest));
|
|
97
|
+
const failed = phases.find((p) => p.verdict === "fail");
|
|
98
|
+
if (failed)
|
|
99
|
+
return { verdict: "fail", phases, failure: { phase: failed.phase, run: failed.runs.find((r) => r.verdict === "fail") } };
|
|
100
|
+
return { verdict: phases.some((p) => p.verdict === "pending") ? "pending" : "pass", phases, failure: null };
|
|
101
|
+
}
|
|
102
|
+
/** A time as an annotation and a tick report write it: UTC, to the second. */
|
|
103
|
+
const iso = (d) => d.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
104
|
+
/** `window` (`90m`, `24h`, `7d`) in milliseconds. */
|
|
105
|
+
export function windowMs(window) {
|
|
106
|
+
const m = /^([1-9][0-9]*)(m|h|d)$/.exec(window);
|
|
107
|
+
if (!m)
|
|
108
|
+
throw new Error(`ci.green.window must be a number of minutes, hours or days, such as 24h, not ${JSON.stringify(window)}`);
|
|
109
|
+
return Number(m[1]) * { m: 60000, h: 3600000, d: 86400000 }[m[2]];
|
|
110
|
+
}
|
|
111
|
+
const runRecord = (r) => ({ name: r.name, id: r.id, conclusion: r.conclusion, url: r.url });
|
|
112
|
+
/** The annotation of a green tag: a subject line, then the record as JSON. */
|
|
113
|
+
export function greenAnnotation(green, sha, verdict, at) {
|
|
114
|
+
const record = {
|
|
115
|
+
schema: 1,
|
|
116
|
+
tag: "green",
|
|
117
|
+
commit: sha,
|
|
118
|
+
branch: green.branch,
|
|
119
|
+
at: iso(at),
|
|
120
|
+
phases: Object.fromEntries(verdict.phases.map((p) => [p.phase, p.runs.map(runRecord)])),
|
|
121
|
+
};
|
|
122
|
+
return `ci: every required phase passed (${green.require.join(", ")})\n\n${JSON.stringify(record, null, 2)}\n`;
|
|
123
|
+
}
|
|
124
|
+
/** The annotation of a revoked tag: the phase and the run that failed, and the time. */
|
|
125
|
+
export function revokedAnnotation(green, sha, failure, at) {
|
|
126
|
+
const record = { schema: 1, tag: "revoked", commit: sha, branch: green.branch, at: iso(at), phase: failure.phase, run: runRecord(failure.run) };
|
|
127
|
+
return `ci: phase ${failure.phase} failed in ${failure.run.name} (${failure.run.conclusion ?? failure.run.status})\n\n${JSON.stringify(record, null, 2)}\n`;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Decide what a tick does, without touching git: a commit with no green tag
|
|
131
|
+
* whose required phases all passed gets one, and a green commit with no
|
|
132
|
+
* revoked tag that now fails a required phase gets revoked. A revoked commit
|
|
133
|
+
* is skipped without asking the forge.
|
|
134
|
+
*/
|
|
135
|
+
export async function planTick(input) {
|
|
136
|
+
const out = [];
|
|
137
|
+
for (const c of input.commits) {
|
|
138
|
+
const before = input.revokedTags.has(c.sha) ? "revoked" : input.greenTags.has(c.sha) ? "green" : "none";
|
|
139
|
+
if (before === "revoked") {
|
|
140
|
+
out.push({ ...c, before, made: null });
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const verdict = evaluateCommit(input.green, await input.checkRuns(c.sha));
|
|
144
|
+
let made = null;
|
|
145
|
+
if (before === "none" && verdict.verdict === "pass") {
|
|
146
|
+
made = { tag: `${CI_GREEN_TAG_PREFIX}${c.sha}`, message: greenAnnotation(input.green, c.sha, verdict, input.now) };
|
|
147
|
+
}
|
|
148
|
+
else if (before === "green" && verdict.verdict === "fail") {
|
|
149
|
+
made = { tag: `${CI_REVOKED_TAG_PREFIX}${c.sha}`, message: revokedAnnotation(input.green, c.sha, verdict.failure, input.now) };
|
|
150
|
+
}
|
|
151
|
+
out.push({ ...c, before, verdict, made });
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
function git(top, args) {
|
|
156
|
+
return execFileSync("git", args, {
|
|
157
|
+
cwd: top,
|
|
158
|
+
encoding: "utf-8",
|
|
159
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
160
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: "0" },
|
|
161
|
+
maxBuffer: 256 * 1024 * 1024,
|
|
162
|
+
}).trimEnd();
|
|
163
|
+
}
|
|
164
|
+
function tryGit(top, args) {
|
|
165
|
+
try {
|
|
166
|
+
return git(top, args);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** The ci tags in the repository: the commits with a green tag, and those with a revoked one. */
|
|
173
|
+
export function readCiTags(top) {
|
|
174
|
+
const green = new Map();
|
|
175
|
+
const revoked = new Set();
|
|
176
|
+
const lines = git(top, ["for-each-ref", "--format=%(refname:lstrip=2)%09%(taggerdate:iso-strict)", `refs/tags/${CI_GREEN_TAG_PREFIX}`, `refs/tags/${CI_REVOKED_TAG_PREFIX}`]);
|
|
177
|
+
for (const line of lines.split("\n").filter(Boolean)) {
|
|
178
|
+
const [tag, date] = line.split("\t");
|
|
179
|
+
if (tag.startsWith(CI_GREEN_TAG_PREFIX))
|
|
180
|
+
green.set(tag.slice(CI_GREEN_TAG_PREFIX.length), date ?? "");
|
|
181
|
+
else
|
|
182
|
+
revoked.add(tag.slice(CI_REVOKED_TAG_PREFIX.length));
|
|
183
|
+
}
|
|
184
|
+
return { green, revoked };
|
|
185
|
+
}
|
|
186
|
+
/** The declaration's `ci.green`, read where `cwd` is, and the git top. */
|
|
187
|
+
function readGreen(cwd) {
|
|
188
|
+
const located = locateWorkspace(cwd);
|
|
189
|
+
const declaration = readDeclaration(located.tree);
|
|
190
|
+
const green = declaration.ci?.green ?? null;
|
|
191
|
+
if (!green)
|
|
192
|
+
throw new CiGreenError("ci-green-undeclared", `${declaration.file} declares no ci.green, so chant does not know which check runs make a commit green`);
|
|
193
|
+
const top = located.top ?? gitTop(cwd);
|
|
194
|
+
if (!top)
|
|
195
|
+
throw new WorkspaceReadError("not-a-git-repository", "the ci tags are git tags, and this directory is not in a git repository");
|
|
196
|
+
return { green, top, workspace: { name: declaration.name, root: located.root, file: declaration.file } };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* One tick: fetch the branch and the ci tags from the remote (pruning a ci
|
|
200
|
+
* tag deleted there by hand), judge the first-parent commits within the
|
|
201
|
+
* window, make the tags that are due and push them, never forced.
|
|
202
|
+
*/
|
|
203
|
+
export async function ciTick(req) {
|
|
204
|
+
const { green, top } = readGreen(req.cwd);
|
|
205
|
+
const remote = req.remote ?? "origin";
|
|
206
|
+
const now = req.now ?? new Date();
|
|
207
|
+
const tracking = `refs/remotes/${remote}/${green.branch}`;
|
|
208
|
+
try {
|
|
209
|
+
git(top, ["fetch", "--quiet", "--no-tags", "--prune", remote, `+refs/heads/${green.branch}:${tracking}`, "+refs/tags/ci/*:refs/tags/ci/*"]);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
throw new Error(`could not fetch ${green.branch} and the ci tags from ${remote}: ${stderrOf(err)}`);
|
|
213
|
+
}
|
|
214
|
+
if (tryGit(top, ["rev-parse", "--verify", "--quiet", `${tracking}^{commit}`]) === null) {
|
|
215
|
+
throw new CiGreenError("ci-branch-unknown", `${remote} has no branch ${green.branch}`);
|
|
216
|
+
}
|
|
217
|
+
const cutoff = Math.floor((now.getTime() - windowMs(green.window)) / 1000);
|
|
218
|
+
const commits = git(top, ["log", "--first-parent", `--max-age=${cutoff}`, "--format=%H %ct", tracking])
|
|
219
|
+
.split("\n")
|
|
220
|
+
.filter(Boolean)
|
|
221
|
+
.map((line) => line.split(" "))
|
|
222
|
+
.filter(([, ct]) => Number(ct) >= cutoff)
|
|
223
|
+
.map(([sha, ct]) => ({ sha, committed: iso(new Date(Number(ct) * 1000)) }));
|
|
224
|
+
const tags = readCiTags(top);
|
|
225
|
+
const planned = await planTick({
|
|
226
|
+
green,
|
|
227
|
+
commits,
|
|
228
|
+
greenTags: new Set(tags.green.keys()),
|
|
229
|
+
revokedTags: tags.revoked,
|
|
230
|
+
checkRuns: (sha) => req.forge.checkRuns(sha),
|
|
231
|
+
now,
|
|
232
|
+
});
|
|
233
|
+
const due = planned.filter((c) => c.made !== null);
|
|
234
|
+
if (!req.dryRun && due.length > 0) {
|
|
235
|
+
const ident = taggerConfig(top);
|
|
236
|
+
for (const c of due)
|
|
237
|
+
git(top, [...ident, "tag", "-a", "-m", c.made.message, c.made.tag, c.sha]);
|
|
238
|
+
try {
|
|
239
|
+
git(top, ["push", "--quiet", remote, ...due.map((c) => `refs/tags/${c.made.tag}`)]);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
// The local tags stay until the next tick's fetch prunes the ones the remote lacks.
|
|
243
|
+
const stderr = stderrOf(err);
|
|
244
|
+
const cause = pushRefusalCause(stderr);
|
|
245
|
+
throw new Error(`could not push ${due.map((c) => c.made.tag).join(", ")} to ${remote}: ${cause ? `${cause}\n` : ""}${stderr}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return { branch: green.branch, window: green.window, ref: tracking, commits: planned, made: due.map((c) => c.made.tag) };
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Why the remote refused a tag push, when chant can tell. GitHub refuses a
|
|
252
|
+
* new ref to a commit whose workflow files differ from the default branch's
|
|
253
|
+
* unless the token may update workflows, and the Actions token never may.
|
|
254
|
+
*/
|
|
255
|
+
export function pushRefusalCause(stderr) {
|
|
256
|
+
if (!/without [`']?workflows?[`']? (permission|scope)/i.test(stderr))
|
|
257
|
+
return null;
|
|
258
|
+
return ("GitHub refused the tag push because the tagged commit changes workflow files, and GITHUB_TOKEN can't update workflows: " +
|
|
259
|
+
"regenerate the workflow with --token-secret <NAME>, naming a secret that holds a fine-grained token with Contents and Workflows read and write, " +
|
|
260
|
+
"or with --app-id-var <VAR> --app-key-secret <NAME> for a GitHub App's token");
|
|
261
|
+
}
|
|
262
|
+
/** A tagger for an annotated tag when git has none configured, as on a fresh CI runner. The environment's GIT_COMMITTER_* still win. */
|
|
263
|
+
function taggerConfig(top) {
|
|
264
|
+
const out = [];
|
|
265
|
+
if (tryGit(top, ["config", "user.name"]) === null)
|
|
266
|
+
out.push("-c", "user.name=chant");
|
|
267
|
+
if (tryGit(top, ["config", "user.email"]) === null)
|
|
268
|
+
out.push("-c", "user.email=chant@localhost");
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
function stderrOf(err) {
|
|
272
|
+
const e = err;
|
|
273
|
+
return String(e.stderr ?? e.message ?? err).trim();
|
|
274
|
+
}
|
|
275
|
+
/** The text `chant ci tick` prints. */
|
|
276
|
+
export function formatTick(r, dryRun = false) {
|
|
277
|
+
const lines = [`${r.branch}, commits within ${r.window}: ${r.commits.length}`];
|
|
278
|
+
for (const c of r.commits) {
|
|
279
|
+
const short = c.sha.slice(0, 12);
|
|
280
|
+
if (c.made) {
|
|
281
|
+
lines.push(` ${short} ${dryRun ? "would make" : "made"} ${c.made.tag.slice(0, c.made.tag.lastIndexOf("/"))}${c.verdict?.failure ? `: phase ${c.verdict.failure.phase}, ${c.verdict.failure.run.name} ${c.verdict.failure.run.conclusion}` : ""}`);
|
|
282
|
+
}
|
|
283
|
+
else if (c.before === "revoked") {
|
|
284
|
+
lines.push(` ${short} revoked`);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
const v = c.verdict;
|
|
288
|
+
const waiting = v.phases.filter((p) => p.verdict === "pending").map((p) => p.phase);
|
|
289
|
+
const what = c.before === "green" ? "green" : v.verdict === "fail" ? `failed: phase ${v.failure.phase}, ${v.failure.run.name} ${v.failure.run.conclusion}` : `undecided: ${waiting.join(", ")}`;
|
|
290
|
+
lines.push(` ${short} ${what}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return lines.join("\n");
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* `chant ci last-green`: the newest first-parent commit of the branch with a
|
|
297
|
+
* green tag and no revoked tag. It reads local refs and tags and never
|
|
298
|
+
* fetches, so a reader fetches first (`git fetch origin --tags`).
|
|
299
|
+
*/
|
|
300
|
+
export function lastGreen(req) {
|
|
301
|
+
const head = { $schema: CI_LAST_GREEN_SCHEMA_ID, contract: CI_LAST_GREEN_CONTRACT_VERSION, chant: readerVersion() };
|
|
302
|
+
try {
|
|
303
|
+
const { green, top, workspace } = readGreen(req.cwd);
|
|
304
|
+
const candidates = [`refs/remotes/${req.remote ?? "origin"}/${green.branch}`, `refs/heads/${green.branch}`];
|
|
305
|
+
const ref = candidates.find((r) => tryGit(top, ["rev-parse", "--verify", "--quiet", `${r}^{commit}`]) !== null);
|
|
306
|
+
if (!ref)
|
|
307
|
+
throw new CiGreenError("ci-branch-unknown", `this repository has neither ${candidates.join(" nor ")}`);
|
|
308
|
+
const tags = readCiTags(top);
|
|
309
|
+
let commit = null;
|
|
310
|
+
if (tags.green.size > 0) {
|
|
311
|
+
for (const sha of git(top, ["rev-list", "--first-parent", ref]).split("\n")) {
|
|
312
|
+
if (!tags.green.has(sha) || tags.revoked.has(sha))
|
|
313
|
+
continue;
|
|
314
|
+
commit = { sha, tag: `${CI_GREEN_TAG_PREFIX}${sha}`, tagged: tags.green.get(sha) || null, committed: git(top, ["show", "-s", "--format=%cI", sha]) };
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
return { ...head, workspace, branch: green.branch, ref, commit };
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
if (err instanceof CiGreenError || err instanceof WorkspaceReadError)
|
|
322
|
+
return { ...head, error: { code: err.code, message: err instanceof WorkspaceReadError ? err.describe() : err.message } };
|
|
323
|
+
throw err;
|
|
324
|
+
}
|
|
325
|
+
}
|