@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,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The member-link checks, WSP091 to WSP097 (#2539; #2524 D6, ws-008).
|
|
3
|
+
*
|
|
4
|
+
* `chant workspace check` resolves every declared link in source: the
|
|
5
|
+
* producer's outputs come from its kind, and a `chant` producer's are read
|
|
6
|
+
* from its TypeScript without running it (`../member-handles.ts`). Nothing
|
|
7
|
+
* here reaches the network or starts a process. The rows themselves come
|
|
8
|
+
* from `../links.ts`, which `chant workspace graph` shares.
|
|
9
|
+
*
|
|
10
|
+
* | Id | Fails when |
|
|
11
|
+
* |---|---|
|
|
12
|
+
* | WSP091 | a link names no member, an example group, or its own member (fixed) |
|
|
13
|
+
* | WSP092 | a link's kind is not a link kind chant knows (fixed) |
|
|
14
|
+
* | WSP093 | the producer exposes no output of that name, as when it was renamed |
|
|
15
|
+
* | WSP094 | the producer's outputs can't be read in source, so the link is kept unresolved |
|
|
16
|
+
* | WSP095 | an inferred join is ambiguous: a parameter matches two or more outputs |
|
|
17
|
+
* | WSP096 | a consumer states the same link twice |
|
|
18
|
+
* | WSP097 | an entry lists `outputs` for a kind that doesn't take them from the entry |
|
|
19
|
+
* | WSP098 | a link states a `protocol` and its kind is not `telemetry` (#2558) |
|
|
20
|
+
*/
|
|
21
|
+
import { sourceMemberHandles } from "../member-handles.js";
|
|
22
|
+
import { DEFAULT_LINK_KIND, LINK_KINDS, TELEMETRY_LINK_KIND, linkTargetProblem, resolveLinks } from "../links.js";
|
|
23
|
+
const tables = new WeakMap();
|
|
24
|
+
/** The link rows for a check run, resolved once and shared by every link check. */
|
|
25
|
+
export function linkTable(ctx) {
|
|
26
|
+
let rows = tables.get(ctx);
|
|
27
|
+
if (!rows) {
|
|
28
|
+
rows = resolveLinks(ctx.declaration, sourceMemberHandles(ctx.declaration, ctx.tree, ctx.groups, ctx.kinds));
|
|
29
|
+
tables.set(ctx, rows);
|
|
30
|
+
}
|
|
31
|
+
return rows;
|
|
32
|
+
}
|
|
33
|
+
const declaredRows = (ctx) => linkTable(ctx).filter((r) => r.status !== "ambiguous" && r.origin === "declared");
|
|
34
|
+
function linkFinding(check, row, field, message) {
|
|
35
|
+
return { checkId: check.id, severity: check.severity, message, entity: row.consumer, pointer: `${row.pointer}/${field}` };
|
|
36
|
+
}
|
|
37
|
+
const describeLink = (row) => `${row.consumer}'s link to ${row.producer} output ${row.output}`;
|
|
38
|
+
export const LINK_CHECKS = [
|
|
39
|
+
{
|
|
40
|
+
id: "WSP091",
|
|
41
|
+
name: "link-target-unknown",
|
|
42
|
+
description: "Every member link names another member of the workspace. A link to an unknown name, an example group or the consumer itself fails closed.",
|
|
43
|
+
severity: "error",
|
|
44
|
+
configurable: false,
|
|
45
|
+
check(ctx) {
|
|
46
|
+
return ctx.declaration.members.flatMap((m) => m.links.flatMap((l) => {
|
|
47
|
+
const problem = linkTargetProblem(ctx.declaration, m, l);
|
|
48
|
+
return problem ? [{ checkId: this.id, severity: this.severity, message: problem, entity: m.name, pointer: `${l.pointer}/member` }] : [];
|
|
49
|
+
}));
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "WSP092",
|
|
54
|
+
name: "link-kind-unknown",
|
|
55
|
+
description: `Every member link's kind is one chant knows. Unknown link kinds fail closed; ${DEFAULT_LINK_KIND} is the default, and ${LINK_KINDS.filter((k) => k !== DEFAULT_LINK_KIND).join(", ")} is the other.`,
|
|
56
|
+
severity: "error",
|
|
57
|
+
configurable: false,
|
|
58
|
+
check(ctx) {
|
|
59
|
+
return ctx.declaration.members.flatMap((m) => m.links
|
|
60
|
+
.filter((l) => l.kind !== null && !LINK_KINDS.includes(l.kind))
|
|
61
|
+
.map((l) => ({
|
|
62
|
+
checkId: this.id,
|
|
63
|
+
severity: this.severity,
|
|
64
|
+
message: `member ${m.name}'s link to ${l.member} has kind ${l.kind}, which is not a link kind chant knows; known link kinds: ${LINK_KINDS.join(", ")}`,
|
|
65
|
+
entity: m.name,
|
|
66
|
+
pointer: `${l.pointer}/kind`,
|
|
67
|
+
})));
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "WSP093",
|
|
72
|
+
name: "link-output-missing",
|
|
73
|
+
description: "Every member link names an output its producer exposes, matched exactly. A producer that renames an output fails this for every consumer that links to the old name.",
|
|
74
|
+
severity: "error",
|
|
75
|
+
configurable: true,
|
|
76
|
+
check(ctx) {
|
|
77
|
+
return declaredRows(ctx)
|
|
78
|
+
.filter((r) => r.status === "missing")
|
|
79
|
+
.map((r) => linkFinding(this, r, "output", `${describeLink(r)} does not resolve: ${r.reason}`));
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "WSP094",
|
|
84
|
+
name: "link-unresolved",
|
|
85
|
+
description: "A member link whose producer's outputs can't be read in source is kept, unresolved, and reported.",
|
|
86
|
+
severity: "info",
|
|
87
|
+
configurable: true,
|
|
88
|
+
check(ctx) {
|
|
89
|
+
return declaredRows(ctx)
|
|
90
|
+
.filter((r) => r.status === "unresolved")
|
|
91
|
+
.map((r) => linkFinding(this, r, "output", `${describeLink(r)} is kept unresolved: ${r.reason}`));
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: "WSP095",
|
|
96
|
+
name: "join-ambiguous",
|
|
97
|
+
description: "No inferred join is ambiguous: a parameter that matches outputs of two producers (or two outputs of one) needs a declared link saying which.",
|
|
98
|
+
severity: "warning",
|
|
99
|
+
configurable: true,
|
|
100
|
+
check(ctx) {
|
|
101
|
+
const byName = new Map(ctx.declaration.members.map((m) => [m.name, m]));
|
|
102
|
+
return linkTable(ctx)
|
|
103
|
+
.filter((r) => r.status === "ambiguous")
|
|
104
|
+
.map((r) => {
|
|
105
|
+
const choices = r.candidates.map((c) => `${c.producer} output ${c.output} (${c.label})`).join(", ");
|
|
106
|
+
const first = r.candidates[0];
|
|
107
|
+
return {
|
|
108
|
+
checkId: this.id,
|
|
109
|
+
severity: this.severity,
|
|
110
|
+
message: `${r.reason}: ${choices}. Declare the one it reads, such as { "member": "${first.producer}", "output": "${first.output}" } in ${r.consumer}'s links`,
|
|
111
|
+
entity: r.consumer,
|
|
112
|
+
pointer: byName.get(r.consumer).pointer,
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "WSP096",
|
|
119
|
+
name: "link-duplicate",
|
|
120
|
+
description: "A link is stated once: no consumer lists the same member and output twice.",
|
|
121
|
+
severity: "error",
|
|
122
|
+
configurable: true,
|
|
123
|
+
check(ctx) {
|
|
124
|
+
const out = [];
|
|
125
|
+
for (const m of ctx.declaration.members) {
|
|
126
|
+
const seen = new Map();
|
|
127
|
+
for (const l of m.links) {
|
|
128
|
+
const key = `${l.member}\0${l.output}\0${l.kind ?? DEFAULT_LINK_KIND}`;
|
|
129
|
+
const first = seen.get(key);
|
|
130
|
+
if (first) {
|
|
131
|
+
out.push({
|
|
132
|
+
checkId: this.id,
|
|
133
|
+
severity: this.severity,
|
|
134
|
+
message: `member ${m.name} links to ${l.member} output ${l.output} twice; the first is at ${first}`,
|
|
135
|
+
entity: m.name,
|
|
136
|
+
pointer: l.pointer,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
seen.set(key, l.pointer);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: "WSP097",
|
|
149
|
+
name: "outputs-not-listable",
|
|
150
|
+
description: "An entry lists outputs only when its kind takes them from the entry: other, or a kind from a package. A chant member's outputs are read from its source, and a nested workspace exposes none.",
|
|
151
|
+
severity: "error",
|
|
152
|
+
configurable: true,
|
|
153
|
+
check(ctx) {
|
|
154
|
+
return ctx.declaration.members
|
|
155
|
+
.filter((m) => m.outputs !== null)
|
|
156
|
+
.flatMap((m) => {
|
|
157
|
+
const kind = ctx.kinds.get(m.kind);
|
|
158
|
+
if (!kind || kind.outputs.from === "declared")
|
|
159
|
+
return [];
|
|
160
|
+
const why = kind.outputs.from === "chant-source" ? "reads a member's outputs from its source" : "exposes no outputs";
|
|
161
|
+
return [
|
|
162
|
+
{
|
|
163
|
+
checkId: this.id,
|
|
164
|
+
severity: this.severity,
|
|
165
|
+
message: `member ${m.name} lists outputs, and kind ${m.kind} ${why}; remove the list`,
|
|
166
|
+
entity: m.name,
|
|
167
|
+
pointer: `${m.pointer}/outputs`,
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: "WSP098",
|
|
175
|
+
name: "link-protocol-misplaced",
|
|
176
|
+
description: "A link states a protocol only when it is a telemetry link: protocol is the OTLP protocol the consumer sends to the producer's collector, and no other link kind has one.",
|
|
177
|
+
severity: "error",
|
|
178
|
+
configurable: true,
|
|
179
|
+
check(ctx) {
|
|
180
|
+
return ctx.declaration.members.flatMap((m) => m.links
|
|
181
|
+
.filter((l) => l.protocol !== null && (l.kind ?? DEFAULT_LINK_KIND) !== TELEMETRY_LINK_KIND)
|
|
182
|
+
.map((l) => ({
|
|
183
|
+
checkId: this.id,
|
|
184
|
+
severity: this.severity,
|
|
185
|
+
message: `member ${m.name}'s link to ${l.member} output ${l.output} states protocol ${l.protocol}, and its kind is ${l.kind ?? DEFAULT_LINK_KIND}; protocol belongs to a ${TELEMETRY_LINK_KIND} link`,
|
|
186
|
+
entity: m.name,
|
|
187
|
+
pointer: `${l.pointer}/protocol`,
|
|
188
|
+
})));
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
];
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live link checks, WSP141 and WSP142 (#2549; #2524 D6, ws-062).
|
|
3
|
+
*
|
|
4
|
+
* `chant workspace check --live --env <env>` resolves each declared member
|
|
5
|
+
* link against what its producer's estate publishes now. It reads the live
|
|
6
|
+
* graph the way `chant workspace graph --live --env <env>` does: each `chant`
|
|
7
|
+
* member runs `chant graph --live` under its own toolchain, and the outputs of
|
|
8
|
+
* the live graph (the stack outputs a lexicon's live read reports) are the
|
|
9
|
+
* names a link may match, exactly. That is the one place this command reaches
|
|
10
|
+
* a network, through the member's own chant, with the member's own
|
|
11
|
+
* credentials. Without `--live` none of this runs, and the source checks
|
|
12
|
+
* (`./links.ts`) stay offline.
|
|
13
|
+
*
|
|
14
|
+
* | Id | Fails when |
|
|
15
|
+
* |---|---|
|
|
16
|
+
* | WSP141 | the producer was read live and publishes no output of that name |
|
|
17
|
+
* | WSP142 | the link could not be resolved live: the producer's kind is not read live, its read failed, or the read returned no outputs at all |
|
|
18
|
+
*
|
|
19
|
+
* Only declared links of kind `output` are resolved live. A `telemetry` link
|
|
20
|
+
* names a collector's pipeline or exporter, which the graph reports from the
|
|
21
|
+
* member's source, so it is not part of this check.
|
|
22
|
+
*/
|
|
23
|
+
import { DEFAULT_LINK_KIND, irMemberHandles, resolveLinks } from "../links.js";
|
|
24
|
+
const describeLink = (row) => `${row.consumer}'s link to ${row.producer} output ${row.output}`;
|
|
25
|
+
/**
|
|
26
|
+
* Read the live graph of the workspace at `cwd` for `env` and resolve the
|
|
27
|
+
* declared links against it. `onStderr` gets each member's stderr, which is
|
|
28
|
+
* where a lexicon's live read reports an account it could not reach.
|
|
29
|
+
*/
|
|
30
|
+
export async function gatherLiveLinkFacts(cwd, declaration, kinds, env, onStderr) {
|
|
31
|
+
const { workspaceGraph } = await import("../graph-cli.js");
|
|
32
|
+
const { doc } = await workspaceGraph({ cwd, args: { live: true, env }, noCache: true, ...(onStderr ? { onStderr } : {}) });
|
|
33
|
+
if ("error" in doc) {
|
|
34
|
+
return { env, rows: unreadRows(declaration, `the live graph could not be read: ${doc.error.code}: ${doc.error.message}`) };
|
|
35
|
+
}
|
|
36
|
+
const read = new Map(doc.members.map((m) => [m.name, m]));
|
|
37
|
+
const composed = doc.members.filter((m) => m.status === "composed").map((m) => m.name);
|
|
38
|
+
const handles = irMemberHandles({ composed, exports: doc.exports, imports: doc.imports });
|
|
39
|
+
const table = resolveLinks(declaration, handles);
|
|
40
|
+
const rows = [];
|
|
41
|
+
for (const r of table) {
|
|
42
|
+
if (r.status === "ambiguous" || r.origin !== "declared" || r.kind !== DEFAULT_LINK_KIND)
|
|
43
|
+
continue;
|
|
44
|
+
const row = { ...r, resolves: "live" };
|
|
45
|
+
if (row.status !== "invalid") {
|
|
46
|
+
const producer = read.get(row.producer);
|
|
47
|
+
const kind = kinds.get(declaration.members.find((m) => m.name === row.producer)?.kind ?? "");
|
|
48
|
+
if (!producer || producer.status !== "composed") {
|
|
49
|
+
row.status = "unresolved";
|
|
50
|
+
row.reason =
|
|
51
|
+
producer?.reason?.message ??
|
|
52
|
+
(kind ? `${row.producer} is kind ${kind.name}, which chant does not read live` : `${row.producer} was not read live`);
|
|
53
|
+
}
|
|
54
|
+
else if (row.status === "missing" && !doc.exports.some((e) => e.member === row.producer)) {
|
|
55
|
+
row.status = "unresolved";
|
|
56
|
+
row.reason = `the live read of ${row.producer} returned no outputs: the account may be unreachable, or its lexicon reports none`;
|
|
57
|
+
}
|
|
58
|
+
else if (row.status === "missing") {
|
|
59
|
+
row.reason = row.reason?.replace(/^(\S+) has no output/, "$1 publishes no output") ?? row.reason;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
rows.push(row);
|
|
63
|
+
}
|
|
64
|
+
return { env, rows };
|
|
65
|
+
}
|
|
66
|
+
/** Every declared output link as unresolved, when the live graph could not be read at all. */
|
|
67
|
+
function unreadRows(declaration, reason) {
|
|
68
|
+
return resolveLinks(declaration, new Map())
|
|
69
|
+
.filter((r) => r.status !== "ambiguous" && r.origin === "declared" && r.kind === DEFAULT_LINK_KIND)
|
|
70
|
+
.map((r) => ({ ...r, resolves: "live", ...(r.status === "invalid" ? {} : { status: "unresolved", reason }) }));
|
|
71
|
+
}
|
|
72
|
+
function liveFinding(check, row, message) {
|
|
73
|
+
return { checkId: check.id, severity: check.severity, message, entity: row.consumer, pointer: `${row.pointer}/output` };
|
|
74
|
+
}
|
|
75
|
+
export const LIVE_CHECKS = [
|
|
76
|
+
{
|
|
77
|
+
id: "WSP141",
|
|
78
|
+
name: "link-live-missing",
|
|
79
|
+
description: "With --live, a member link names an output its producer's estate publishes now, matched exactly. A producer whose declared output isn't deployed yet, or was renamed in the estate, fails this for every consumer.",
|
|
80
|
+
severity: "warning",
|
|
81
|
+
configurable: true,
|
|
82
|
+
check(ctx) {
|
|
83
|
+
return (ctx.facts?.live?.rows ?? [])
|
|
84
|
+
.filter((r) => r.status === "missing")
|
|
85
|
+
.map((r) => liveFinding(this, r, `${describeLink(r)} does not resolve live in ${ctx.facts.live.env}: ${r.reason}`));
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: "WSP142",
|
|
90
|
+
name: "link-live-unresolved",
|
|
91
|
+
description: "With --live, a member link that could not be resolved against a live read is kept, unresolved, and reported: the producer's kind is not read live, its read failed, or the read returned no outputs.",
|
|
92
|
+
severity: "info",
|
|
93
|
+
configurable: true,
|
|
94
|
+
check(ctx) {
|
|
95
|
+
return (ctx.facts?.live?.rows ?? [])
|
|
96
|
+
.filter((r) => r.status === "unresolved")
|
|
97
|
+
.map((r) => liveFinding(this, r, `${describeLink(r)} is kept unresolved in ${ctx.facts.live.env}: ${r.reason}`));
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
];
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workspace checks behind per-member pipelines (#2542; #2524 D19,
|
|
3
|
+
* ws-040, ws-041 and ws-042).
|
|
4
|
+
*
|
|
5
|
+
* - `WSP081`: each generated file has exactly one declarer. Two members that
|
|
6
|
+
* both list `.github/workflows/deploy.yml` would each overwrite the other's
|
|
7
|
+
* pipeline on every regeneration.
|
|
8
|
+
* - `WSP082`: a member declares generated files only inside its own
|
|
9
|
+
* directory, with one exception: forge CI files, which forges read from
|
|
10
|
+
* fixed paths at the repository root ({@link isForgePath}).
|
|
11
|
+
* - `WSP083`: linked members share at least one environment name. Names are
|
|
12
|
+
* matched exactly, with no mapping (ws-040), so this is a warning: a
|
|
13
|
+
* member with its own names still builds.
|
|
14
|
+
*
|
|
15
|
+
* The checks are pure functions over {@link MemberPipelineFacts}.
|
|
16
|
+
* {@link gatherPipelineFacts} collects those facts from a checkout, reading
|
|
17
|
+
* each member's generated-file record (../member-pipeline.ts), and
|
|
18
|
+
* `chant workspace check` gathers them before it runs {@link PIPELINE_CHECKS}
|
|
19
|
+
* (#2641).
|
|
20
|
+
*/
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
import { declaredMemberLinks } from "../links.js";
|
|
23
|
+
import { readGeneratedRecord } from "../member-pipeline.js";
|
|
24
|
+
export const WSP_ONE_DECLARER = "WSP081";
|
|
25
|
+
export const WSP_GENERATED_PLACEMENT = "WSP082";
|
|
26
|
+
export const WSP_LINKED_ENVIRONMENTS = "WSP083";
|
|
27
|
+
/**
|
|
28
|
+
* Whether `path` (repository-relative) is a forge CI file: a file directly in
|
|
29
|
+
* `.github/workflows/`, `.forgejo/workflows/` or `.gitea/workflows/`, the
|
|
30
|
+
* root `.gitlab-ci.yml`, or a file directly in `.gitlab/ci/`, which the root
|
|
31
|
+
* `.gitlab-ci.yml` includes. The exemption is this narrow on purpose (ws-042).
|
|
32
|
+
*/
|
|
33
|
+
export function isForgePath(path) {
|
|
34
|
+
if (path === ".gitlab-ci.yml")
|
|
35
|
+
return true;
|
|
36
|
+
return /^(\.github\/workflows|\.forgejo\/workflows|\.gitea\/workflows|\.gitlab\/ci)\/[^/]+$/.test(path);
|
|
37
|
+
}
|
|
38
|
+
function inside(path, dir) {
|
|
39
|
+
return dir === "." || path === dir || path.startsWith(`${dir}/`);
|
|
40
|
+
}
|
|
41
|
+
/** `WSP081`: no two members declare the same generated file. */
|
|
42
|
+
export function checkOneDeclarer(facts) {
|
|
43
|
+
const byPath = new Map();
|
|
44
|
+
for (const f of facts) {
|
|
45
|
+
for (const path of new Set(f.generated))
|
|
46
|
+
byPath.set(path, [...(byPath.get(path) ?? []), f.name]);
|
|
47
|
+
}
|
|
48
|
+
const findings = [];
|
|
49
|
+
for (const [path, members] of [...byPath].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))) {
|
|
50
|
+
if (members.length < 2)
|
|
51
|
+
continue;
|
|
52
|
+
findings.push({
|
|
53
|
+
id: WSP_ONE_DECLARER,
|
|
54
|
+
severity: "error",
|
|
55
|
+
members,
|
|
56
|
+
path,
|
|
57
|
+
message: `members ${members.join(", ")} all declare ${path} as a generated file; each would overwrite ` +
|
|
58
|
+
`the others' output. Keep it in one member, and give the others their own file ` +
|
|
59
|
+
`(a member's pipeline is named after it by default).`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return findings;
|
|
63
|
+
}
|
|
64
|
+
/** `WSP082`: a member's generated files sit in its own directory, or are forge CI files. */
|
|
65
|
+
export function checkGeneratedPlacement(facts) {
|
|
66
|
+
const findings = [];
|
|
67
|
+
for (const f of facts) {
|
|
68
|
+
for (const path of f.generated) {
|
|
69
|
+
if (inside(path, f.dir) || isForgePath(path))
|
|
70
|
+
continue;
|
|
71
|
+
findings.push({
|
|
72
|
+
id: WSP_GENERATED_PLACEMENT,
|
|
73
|
+
severity: "error",
|
|
74
|
+
members: [f.name],
|
|
75
|
+
path,
|
|
76
|
+
message: `member ${f.name} declares ${path}, which is outside its directory (${f.dir}) and is not a forge ` +
|
|
77
|
+
`CI file. Only files in .github/workflows/, .forgejo/workflows/, .gitea/workflows/ or .gitlab/ci/, ` +
|
|
78
|
+
`and .gitlab-ci.yml, may sit outside the member that generates them.`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return findings;
|
|
83
|
+
}
|
|
84
|
+
/** `WSP083`: every link joins members that share an environment name, when both name any. */
|
|
85
|
+
export function checkLinkedEnvironments(facts, links) {
|
|
86
|
+
const byName = new Map(facts.map((f) => [f.name, f]));
|
|
87
|
+
const order = new Map(facts.map((f, i) => [f.name, i]));
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
const findings = [];
|
|
90
|
+
for (const link of links) {
|
|
91
|
+
const a = byName.get(link.consumer);
|
|
92
|
+
const b = byName.get(link.producer);
|
|
93
|
+
if (!a || !b || a === b)
|
|
94
|
+
continue;
|
|
95
|
+
const [first, second] = order.get(a.name) <= order.get(b.name) ? [a, b] : [b, a];
|
|
96
|
+
const key = `${first.name}\0${second.name}`;
|
|
97
|
+
if (seen.has(key))
|
|
98
|
+
continue;
|
|
99
|
+
seen.add(key);
|
|
100
|
+
// A member that names no environment has nothing to line up yet.
|
|
101
|
+
if (first.environments.length === 0 || second.environments.length === 0)
|
|
102
|
+
continue;
|
|
103
|
+
const shared = first.environments.filter((e) => second.environments.includes(e));
|
|
104
|
+
if (shared.length > 0)
|
|
105
|
+
continue;
|
|
106
|
+
const list = (f) => [...new Set(f.environments)].sort().join(", ");
|
|
107
|
+
findings.push({
|
|
108
|
+
id: WSP_LINKED_ENVIRONMENTS,
|
|
109
|
+
severity: "warning",
|
|
110
|
+
members: [first.name, second.name],
|
|
111
|
+
message: `linked members ${first.name} (${list(first)}) and ${second.name} (${list(second)}) share no ` +
|
|
112
|
+
`environment name. Names are matched exactly, so a view across members, such as ` +
|
|
113
|
+
`chant workspace status <env>, can't line their releases up. Rename one side to match.`,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return findings;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Collect the facts from a checkout. `prefix` is the workspace root relative
|
|
120
|
+
* to the repository root (`"."` when they are the same). Each member's
|
|
121
|
+
* generated files and environments come from its generated-file record.
|
|
122
|
+
*/
|
|
123
|
+
export function gatherPipelineFacts(workspaceRoot, declaration, prefix = ".") {
|
|
124
|
+
return declaration.members.map((m) => {
|
|
125
|
+
const record = readGeneratedRecord(m.dir === "." ? workspaceRoot : join(workspaceRoot, m.dir));
|
|
126
|
+
const dir = prefix === "." ? m.dir : m.dir === "." ? prefix : `${prefix}/${m.dir}`;
|
|
127
|
+
return {
|
|
128
|
+
name: m.name,
|
|
129
|
+
dir,
|
|
130
|
+
generated: record.files.map((f) => f.path),
|
|
131
|
+
environments: [...new Set(record.files.flatMap((f) => (f.env ? [f.env] : [])))],
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Run the three checks. `links` defaults to none; `chant workspace check`
|
|
137
|
+
* passes the declared member links (#2539).
|
|
138
|
+
*/
|
|
139
|
+
export function checkPipelines(facts, links = []) {
|
|
140
|
+
return [...checkOneDeclarer(facts), ...checkGeneratedPlacement(facts), ...checkLinkedEnvironments(facts, links)];
|
|
141
|
+
}
|
|
142
|
+
// ── As workspace checks ──────────────────────────────────────────────────────
|
|
143
|
+
/**
|
|
144
|
+
* A finding as a workspace diagnostic. It sits at the first member it names,
|
|
145
|
+
* in declaration order, and that member's entry is the one that can carry a
|
|
146
|
+
* `suppress`.
|
|
147
|
+
*/
|
|
148
|
+
function toDiagnostic(check, ctx, f) {
|
|
149
|
+
const member = ctx.declaration.members.find((m) => m.name === f.members[0]);
|
|
150
|
+
return { checkId: check.id, severity: check.severity, message: f.message, entity: f.members[0], pointer: member?.pointer ?? "" };
|
|
151
|
+
}
|
|
152
|
+
/** The member links `WSP083` compares: the pairs the declaration links (#2539). */
|
|
153
|
+
function declaredLinks(ctx) {
|
|
154
|
+
return declaredMemberLinks(ctx.declaration);
|
|
155
|
+
}
|
|
156
|
+
/** The pipeline checks, which read `ctx.facts.pipelines`. They find nothing when the facts were not gathered. */
|
|
157
|
+
export const PIPELINE_CHECKS = [
|
|
158
|
+
{
|
|
159
|
+
id: WSP_ONE_DECLARER,
|
|
160
|
+
name: "generated-declared-twice",
|
|
161
|
+
description: "No two members record the same generated file, so no member's regeneration overwrites another's pipeline.",
|
|
162
|
+
severity: "error",
|
|
163
|
+
configurable: true,
|
|
164
|
+
check(ctx) {
|
|
165
|
+
return checkOneDeclarer(ctx.facts?.pipelines ?? []).map((f) => toDiagnostic(this, ctx, f));
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: WSP_GENERATED_PLACEMENT,
|
|
170
|
+
name: "generated-outside-member",
|
|
171
|
+
description: "A member's recorded generated files sit in its own directory, or are forge CI files at the fixed paths forges read.",
|
|
172
|
+
severity: "error",
|
|
173
|
+
configurable: true,
|
|
174
|
+
check(ctx) {
|
|
175
|
+
return checkGeneratedPlacement(ctx.facts?.pipelines ?? []).map((f) => toDiagnostic(this, ctx, f));
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
id: WSP_LINKED_ENVIRONMENTS,
|
|
180
|
+
name: "linked-environments-disjoint",
|
|
181
|
+
description: "Linked members share at least one environment name, matched exactly, when both name any.",
|
|
182
|
+
severity: "warning",
|
|
183
|
+
configurable: true,
|
|
184
|
+
check(ctx) {
|
|
185
|
+
return checkLinkedEnvironments(ctx.facts?.pipelines ?? [], declaredLinks(ctx)).map((f) => toDiagnostic(this, ctx, f));
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
];
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The record checks, WSP111 to WSP114 (#2549; #2524 D4, D18).
|
|
3
|
+
*
|
|
4
|
+
* With `--kind <kind file>`, `chant workspace check` reads the records the
|
|
5
|
+
* kind locates, in the tree it checks, and reports the files they pin by hash
|
|
6
|
+
* that have changed or gone since. A decision stays valid when its evidence
|
|
7
|
+
* drifts, so drift is a warning: it asks for the decision to be looked at
|
|
8
|
+
* again, and the declaration's `checks` can raise it to an error.
|
|
9
|
+
*
|
|
10
|
+
* | Id | Finds |
|
|
11
|
+
* |---|---|
|
|
12
|
+
* | WSP111 | a pinned file whose bytes no longer hash to the pinned sha256 |
|
|
13
|
+
* | WSP112 | a pinned file that does not exist |
|
|
14
|
+
* | WSP113 | a pinned file that a superseding record pins at the old hash: the artifact did not follow the decision |
|
|
15
|
+
* | WSP114 | the records of `--kind` can't be read (fixed) |
|
|
16
|
+
* | WSP115 | a record kind the declaration names is missing or does not load as one (fixed, #2680) |
|
|
17
|
+
* | WSP116 | an answer kind's decision points file is missing or not valid (fixed, ws-058, #2738) |
|
|
18
|
+
* | WSP117 | a done work item has an acceptance criterion no passing evidence meets (#2772) |
|
|
19
|
+
*
|
|
20
|
+
* WSP117 reads the records of every declared work kind with acceptance
|
|
21
|
+
* criteria, in the working tree, and the records of `--kind`. It carries the
|
|
22
|
+
* reason code `work-acceptance-unmet`.
|
|
23
|
+
*/
|
|
24
|
+
/** The read contract's codes the record checks carry as `code`: WSP117's (#2772). */
|
|
25
|
+
export const RECORD_FINDING_CODES = ["work-acceptance-unmet"];
|
|
26
|
+
function warningFindings(check, facts, code) {
|
|
27
|
+
if (!facts || "error" in facts)
|
|
28
|
+
return [];
|
|
29
|
+
const out = [];
|
|
30
|
+
for (const r of facts.records) {
|
|
31
|
+
// A superseded record's evidence no longer backs anything current.
|
|
32
|
+
if (r.supersededBy !== null)
|
|
33
|
+
continue;
|
|
34
|
+
for (const w of r.warnings) {
|
|
35
|
+
if (w.code !== code)
|
|
36
|
+
continue;
|
|
37
|
+
out.push({ checkId: check.id, severity: check.severity, message: `${r.id ?? r.path}: ${w.message}`, pointer: "", file: r.file });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
export const RECORD_CHECKS = [
|
|
43
|
+
{
|
|
44
|
+
id: "WSP111",
|
|
45
|
+
name: "record-asset-drift",
|
|
46
|
+
description: "Every file a current record pins by hash still hashes to the pinned sha256. A changed file asks for the record to be revisited.",
|
|
47
|
+
severity: "warning",
|
|
48
|
+
configurable: true,
|
|
49
|
+
check(ctx) {
|
|
50
|
+
return warningFindings(this, ctx.facts?.records, "asset-drift");
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: "WSP112",
|
|
55
|
+
name: "record-asset-missing",
|
|
56
|
+
description: "Every file a current record pins by hash exists.",
|
|
57
|
+
severity: "warning",
|
|
58
|
+
configurable: true,
|
|
59
|
+
check(ctx) {
|
|
60
|
+
return warningFindings(this, ctx.facts?.records, "asset-missing");
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "WSP113",
|
|
65
|
+
name: "record-asset-stale",
|
|
66
|
+
description: "No current record pins a file at the same hash as a record it supersedes while the file is unchanged since: when a decision changes, the artifacts it rests on follow.",
|
|
67
|
+
severity: "warning",
|
|
68
|
+
configurable: true,
|
|
69
|
+
check(ctx) {
|
|
70
|
+
return warningFindings(this, ctx.facts?.records, "asset-stale");
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "WSP114",
|
|
75
|
+
name: "records-unreadable",
|
|
76
|
+
description: "The records of the kind named with --kind can be read.",
|
|
77
|
+
severity: "error",
|
|
78
|
+
configurable: false,
|
|
79
|
+
check(ctx) {
|
|
80
|
+
const facts = ctx.facts?.records;
|
|
81
|
+
if (!facts || !("error" in facts))
|
|
82
|
+
return [];
|
|
83
|
+
return [{ checkId: this.id, severity: this.severity, message: `--kind ${facts.kind}: ${facts.error.code}: ${facts.error.message}`, pointer: "" }];
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "WSP115",
|
|
88
|
+
name: "record-kind-unloadable",
|
|
89
|
+
description: "Every record kind the declaration names is a file that exports a valid recordKind, with the schema it names.",
|
|
90
|
+
severity: "error",
|
|
91
|
+
configurable: false,
|
|
92
|
+
check(ctx) {
|
|
93
|
+
return (ctx.facts?.declaredKinds ?? [])
|
|
94
|
+
.filter((k) => k.reason !== null)
|
|
95
|
+
.map((k) => ({
|
|
96
|
+
checkId: this.id,
|
|
97
|
+
severity: this.severity,
|
|
98
|
+
message: `${k.declared.member === null ? "the workspace" : `member ${k.declared.member}`} declares the record kind ${k.declared.kind}, which can't be loaded: ${k.reason.code}: ${k.reason.message}`,
|
|
99
|
+
...(k.declared.member !== null ? { entity: k.declared.member } : {}),
|
|
100
|
+
pointer: `${k.declared.pointer}/kind`,
|
|
101
|
+
}));
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: "WSP116",
|
|
106
|
+
name: "decision-points-invalid",
|
|
107
|
+
description: "Every answer kind the declaration names has a decision points file that matches decision-points.schema.json: each input names a read-contract output, each table row tests declared inputs and answers a candidate, each model id is pinned, and the chain ends in its one quorum (ws-058).",
|
|
108
|
+
severity: "error",
|
|
109
|
+
configurable: false,
|
|
110
|
+
check(ctx) {
|
|
111
|
+
const out = [];
|
|
112
|
+
for (const k of ctx.facts?.declaredKinds ?? []) {
|
|
113
|
+
if (!k.points)
|
|
114
|
+
continue;
|
|
115
|
+
const where = k.declared.member === null ? "the workspace" : `member ${k.declared.member}`;
|
|
116
|
+
const finding = (message) => ({
|
|
117
|
+
checkId: this.id,
|
|
118
|
+
severity: this.severity,
|
|
119
|
+
message,
|
|
120
|
+
...(k.declared.member !== null ? { entity: k.declared.member } : {}),
|
|
121
|
+
pointer: `${k.declared.pointer}/kind`,
|
|
122
|
+
});
|
|
123
|
+
for (const p of k.points.problems)
|
|
124
|
+
out.push(finding(`${where} declares the answer kind ${k.declared.kind}, whose points file ${k.points.file} ${p.field ? `has ${p.field}, which ${p.message}` : p.message}`));
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "WSP117",
|
|
131
|
+
name: "work-acceptance-unmet",
|
|
132
|
+
description: "Every done work item meets its acceptance criteria: each has evidence that names it, passed, and has the verification the criterion expects, and a manual verdict is from someone other than the implementer (#2772).",
|
|
133
|
+
severity: "error",
|
|
134
|
+
configurable: true,
|
|
135
|
+
check(ctx) {
|
|
136
|
+
const out = [];
|
|
137
|
+
const seen = new Set();
|
|
138
|
+
const facts = ctx.facts?.records;
|
|
139
|
+
if (facts && !("error" in facts)) {
|
|
140
|
+
for (const r of facts.records) {
|
|
141
|
+
if (r.supersededBy !== null)
|
|
142
|
+
continue;
|
|
143
|
+
const w = r.warnings.find((x) => x.code === "work-acceptance-unmet");
|
|
144
|
+
if (!w || seen.has(r.file))
|
|
145
|
+
continue;
|
|
146
|
+
seen.add(r.file);
|
|
147
|
+
out.push({ checkId: this.id, severity: this.severity, message: w.message, pointer: "", file: r.file, code: "work-acceptance-unmet" });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
for (const k of ctx.facts?.declaredKinds ?? []) {
|
|
151
|
+
for (const a of k.acceptance ?? []) {
|
|
152
|
+
if (a.unmet === null || seen.has(a.file))
|
|
153
|
+
continue;
|
|
154
|
+
seen.add(a.file);
|
|
155
|
+
out.push({
|
|
156
|
+
checkId: this.id,
|
|
157
|
+
severity: this.severity,
|
|
158
|
+
message: a.unmet,
|
|
159
|
+
...(k.declared.member !== null ? { entity: k.declared.member } : {}),
|
|
160
|
+
pointer: "",
|
|
161
|
+
file: a.file,
|
|
162
|
+
code: "work-acceptance-unmet",
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return out;
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
];
|