@intentius/chant 0.124.12 → 0.124.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/chant +11 -0
- package/dist/agents/checks.js +326 -0
- package/dist/agents/discover.js +885 -0
- package/dist/agents/importer.js +17 -0
- package/dist/agents/index.js +12 -0
- package/dist/agents/types.js +19 -0
- package/dist/apply.js +151 -0
- package/dist/attrref.js +70 -0
- package/dist/audit/catalog.js +350 -0
- package/dist/audit/core.js +252 -0
- package/dist/audit/discover.js +633 -0
- package/dist/audit/fetch.js +666 -0
- package/dist/audit/lineage.js +91 -0
- package/dist/audit/nginx.js +366 -0
- package/dist/audit/prior-art.js +132 -0
- package/dist/audit/proof.js +321 -0
- package/dist/audit/report-html.js +194 -0
- package/dist/audit/report-model.js +198 -0
- package/dist/audit/report.js +102 -0
- package/dist/audit/rules-doc.js +144 -0
- package/dist/audit/secrets.js +405 -0
- package/dist/audit/terraform-state.js +140 -0
- package/dist/audit/wrangler.js +262 -0
- package/dist/behaviour-delta.js +401 -0
- package/dist/behaviour-engine.js +357 -0
- package/dist/behaviour-graph.js +83 -0
- package/dist/behaviour-http.js +188 -0
- package/dist/behaviour-kinds.js +172 -0
- package/dist/behaviour-overlay.js +50 -0
- package/dist/behaviour-predict.js +188 -0
- package/dist/behaviour-request.js +194 -0
- package/dist/behaviour.js +1325 -0
- package/dist/build-params.js +108 -0
- package/dist/build.js +668 -0
- package/dist/builder.js +44 -0
- package/dist/cdk/advise.js +30 -0
- package/dist/cdk/assembly.js +122 -0
- package/dist/cdk/graph.js +444 -0
- package/dist/cdk/tier-map.js +64 -0
- package/dist/cdk/types.js +24 -0
- package/dist/change-set.js +312 -0
- package/dist/child-project.js +21 -0
- package/dist/claimed-fields.js +135 -0
- package/dist/cli/build-options.js +70 -0
- package/dist/cli/build-params-cli.js +139 -0
- package/dist/cli/command-group.js +123 -0
- package/dist/cli/commands/audit-agents.js +326 -0
- package/dist/cli/commands/audit.js +571 -0
- package/dist/cli/commands/build.js +920 -0
- package/dist/cli/commands/carve-apply.js +153 -0
- package/dist/cli/commands/carve-bridge.js +201 -0
- package/dist/cli/commands/carve-emit.js +332 -0
- package/dist/cli/commands/carve-status.js +119 -0
- package/dist/cli/commands/carve.js +204 -0
- package/dist/cli/commands/check-lexicon-docs.js +79 -0
- package/dist/cli/commands/check-lexicon-examples.js +177 -0
- package/dist/cli/commands/check-lexicon-intrinsics.js +291 -0
- package/dist/cli/commands/check-lexicon-mcp.js +82 -0
- package/dist/cli/commands/check-lexicon-plugin.d.ts.map +1 -1
- package/dist/cli/commands/check-lexicon-plugin.js +104 -0
- package/dist/cli/commands/check-lexicon.js +766 -0
- package/dist/cli/commands/describe.js +85 -0
- package/dist/cli/commands/diff.js +175 -0
- package/dist/cli/commands/doctor.js +350 -0
- package/dist/cli/commands/import-agents.js +155 -0
- package/dist/cli/commands/import.js +670 -0
- package/dist/cli/commands/init-lexicon/templates/codegen.js +194 -0
- package/dist/cli/commands/init-lexicon/templates/docs.js +100 -0
- package/dist/cli/commands/init-lexicon/templates/examples.js +29 -0
- package/dist/cli/commands/init-lexicon/templates/lint.js +34 -0
- package/dist/cli/commands/init-lexicon/templates/lsp.js +37 -0
- package/dist/cli/commands/init-lexicon/templates/plugin.js +108 -0
- package/dist/cli/commands/init-lexicon/templates/project.js +240 -0
- package/dist/cli/commands/init-lexicon/templates/spec.js +56 -0
- package/dist/cli/commands/init-lexicon/templates/tests.js +66 -0
- package/dist/cli/commands/init-lexicon.js +172 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/lexicon-rolling-upgrade.js +145 -0
- package/dist/cli/commands/lexicon-surface-diff.js +145 -0
- package/dist/cli/commands/licenses.js +125 -0
- package/dist/cli/commands/lint.d.ts.map +1 -1
- package/dist/cli/commands/lint.js +948 -0
- package/dist/cli/commands/list.js +63 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +423 -0
- package/dist/cli/commands/onboard.js +403 -0
- package/dist/cli/commands/pinned-upgrade.js +191 -0
- package/dist/cli/commands/update.js +194 -0
- package/dist/cli/commands/vendor.js +217 -0
- package/dist/cli/conflict-check.js +104 -0
- package/dist/cli/debug.js +8 -0
- package/dist/cli/format.js +104 -0
- package/dist/cli/handlers/build.js +267 -0
- package/dist/cli/handlers/carve-apply.js +30 -0
- package/dist/cli/handlers/carve-bridge.js +28 -0
- package/dist/cli/handlers/carve-emit.js +50 -0
- package/dist/cli/handlers/carve-status.js +26 -0
- package/dist/cli/handlers/carve.js +40 -0
- package/dist/cli/handlers/change-set.js +46 -0
- package/dist/cli/handlers/components.js +730 -0
- package/dist/cli/handlers/dev.js +113 -0
- package/dist/cli/handlers/emulator.js +233 -0
- package/dist/cli/handlers/explain.js +54 -0
- package/dist/cli/handlers/fan-out.js +422 -0
- package/dist/cli/handlers/gate-resume.js +275 -0
- package/dist/cli/handlers/generate.js +84 -0
- package/dist/cli/handlers/graph.js +969 -0
- package/dist/cli/handlers/init.js +102 -0
- package/dist/cli/handlers/lifecycle.js +1727 -0
- package/dist/cli/handlers/lint.js +62 -0
- package/dist/cli/handlers/migrate.js +48 -0
- package/dist/cli/handlers/misc.js +391 -0
- package/dist/cli/handlers/operator.js +1162 -0
- package/dist/cli/handlers/override-approve.js +102 -0
- package/dist/cli/handlers/pr.js +503 -0
- package/dist/cli/handlers/promote.js +342 -0
- package/dist/cli/handlers/run-generate.js +206 -0
- package/dist/cli/handlers/run-wave.js +66 -0
- package/dist/cli/handlers/run.js +1191 -0
- package/dist/cli/handlers/scenario.js +325 -0
- package/dist/cli/handlers/search.js +924 -0
- package/dist/cli/handlers/serve.js +32 -0
- package/dist/cli/handlers/vendor.js +154 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/is-entry-point.js +23 -0
- package/dist/cli/lsp/capabilities.js +28 -0
- package/dist/cli/lsp/diagnostics.js +34 -0
- package/dist/cli/lsp/server.js +329 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2540 -0
- package/dist/cli/mcp/lifecycle-tools.js +80 -0
- package/dist/cli/mcp/op-tools.js +306 -0
- package/dist/cli/mcp/resource-handlers.js +258 -0
- package/dist/cli/mcp/resources/context.js +85 -0
- package/dist/cli/mcp/server.js +353 -0
- package/dist/cli/mcp/tools/build.js +111 -0
- package/dist/cli/mcp/tools/composites.js +95 -0
- package/dist/cli/mcp/tools/explain.js +166 -0
- package/dist/cli/mcp/tools/import.js +49 -0
- package/dist/cli/mcp/tools/lint.js +41 -0
- package/dist/cli/mcp/tools/scaffold.js +111 -0
- package/dist/cli/mcp/tools/search.js +112 -0
- package/dist/cli/mcp/types.js +1 -0
- package/dist/cli/mcp/workspace-plugins.js +91 -0
- package/dist/cli/mcp/workspace-tools.d.ts +1 -1
- package/dist/cli/mcp/workspace-tools.js +564 -0
- package/dist/cli/mcp-config.js +70 -0
- package/dist/cli/plugins.js +313 -0
- package/dist/cli/registry.js +23 -0
- package/dist/cli/reporters/stylish.js +329 -0
- package/dist/cli/version.js +15 -0
- package/dist/cli/watch.js +79 -0
- package/dist/codegen/bound-property-types.js +82 -0
- package/dist/codegen/coverage.js +119 -0
- package/dist/codegen/docs-file-markers.js +60 -0
- package/dist/codegen/docs-pages.js +115 -0
- package/dist/codegen/docs-rule-scanning.js +164 -0
- package/dist/codegen/docs-rules.js +76 -0
- package/dist/codegen/docs-sections.js +117 -0
- package/dist/codegen/docs-sidebar.js +65 -0
- package/dist/codegen/docs-types.js +4 -0
- package/dist/codegen/docs.js +356 -0
- package/dist/codegen/fetch.js +340 -0
- package/dist/codegen/generate-post-synth-barrel.js +63 -0
- package/dist/codegen/generate-registry.js +71 -0
- package/dist/codegen/generate-runtime-index.js +56 -0
- package/dist/codegen/generate-typescript.js +119 -0
- package/dist/codegen/generate.js +115 -0
- package/dist/codegen/json-patch.js +141 -0
- package/dist/codegen/json-schema-to-ts.js +344 -0
- package/dist/codegen/json-schema.js +246 -0
- package/dist/codegen/lexicon-regen.js +412 -0
- package/dist/codegen/naming.js +217 -0
- package/dist/codegen/okf-lexicon.js +245 -0
- package/dist/codegen/package.js +150 -0
- package/dist/codegen/pinned-upgrade.d.ts.map +1 -1
- package/dist/codegen/pinned-upgrade.js +494 -0
- package/dist/codegen/registry.js +60 -0
- package/dist/codegen/rehype-base-url.mjs +68 -0
- package/dist/codegen/rolling-upgrade.js +217 -0
- package/dist/codegen/surface-snapshot.js +537 -0
- package/dist/codegen/testdata/postgres-tags.json +242 -0
- package/dist/codegen/topo-sort.js +36 -0
- package/dist/codegen/typecheck.js +115 -0
- package/dist/codegen/validate.js +200 -0
- package/dist/codegen/version-bump.js +35 -0
- package/dist/components/auto-release.js +143 -0
- package/dist/components/builders.js +47 -0
- package/dist/components/capability-plugin-loader.js +175 -0
- package/dist/components/capability-plugin-schema.js +46 -0
- package/dist/components/capability-plugin.js +99 -0
- package/dist/components/capability.js +60 -0
- package/dist/components/changed-files.js +72 -0
- package/dist/components/cli-support.js +427 -0
- package/dist/components/component.js +120 -0
- package/dist/components/component.schema.json +271 -0
- package/dist/components/config-defaults.js +130 -0
- package/dist/components/deploy-units.js +60 -0
- package/dist/components/discover.d.ts.map +1 -1
- package/dist/components/discover.js +189 -0
- package/dist/components/driver-output.js +86 -0
- package/dist/components/driver.js +728 -0
- package/dist/components/fan-out-output.js +165 -0
- package/dist/components/fan-out-record.js +94 -0
- package/dist/components/fan-out-run.js +373 -0
- package/dist/components/fan-out-support.js +60 -0
- package/dist/components/fan-out.js +273 -0
- package/dist/components/gate-plan.js +41 -0
- package/dist/components/gated-wave-pipeline.js +46 -0
- package/dist/components/index.js +24 -0
- package/dist/components/layers.js +28 -0
- package/dist/components/manifest-persistence.js +108 -0
- package/dist/components/pilots/alb-ecs.pilot.js +59 -0
- package/dist/components/pilots/dynamodb.pilot.js +51 -0
- package/dist/components/pilots/jar-emr.pilot.js +65 -0
- package/dist/components/pilots/lambda.pilot.js +52 -0
- package/dist/components/pilots/neo4j-fanout.pilot.js +68 -0
- package/dist/components/pilots/project.js +12 -0
- package/dist/components/pr-pipeline.js +134 -0
- package/dist/components/pr-run.js +363 -0
- package/dist/components/presets/ecs-fargate.js +72 -0
- package/dist/components/presets/index.js +28 -0
- package/dist/components/presets/lambda.js +34 -0
- package/dist/components/presets/single-host-compose.js +41 -0
- package/dist/components/promote.js +549 -0
- package/dist/components/registry.js +34 -0
- package/dist/components/run-progress.js +33 -0
- package/dist/components/sandbox/driver.d.ts.map +1 -1
- package/dist/components/sandbox/driver.js +93 -0
- package/dist/components/sandbox/run.js +115 -0
- package/dist/components/starter-plugin.js +104 -0
- package/dist/components/verbs/__tests__/mock-cloud-executor.js +68 -0
- package/dist/components/verbs/__tests__/mock-process-runner.js +45 -0
- package/dist/components/verbs/__tests__/mock-sbom-generator.js +56 -0
- package/dist/components/verbs/bom-writer.js +287 -0
- package/dist/components/verbs/build-archive.js +188 -0
- package/dist/components/verbs/build.js +142 -0
- package/dist/components/verbs/cloud-executor.js +110 -0
- package/dist/components/verbs/component-bom.js +125 -0
- package/dist/components/verbs/ensure-secret.js +50 -0
- package/dist/components/verbs/index.js +61 -0
- package/dist/components/verbs/license-policy.js +75 -0
- package/dist/components/verbs/lockfile-sbom-generator.js +191 -0
- package/dist/components/verbs/process-runner.js +78 -0
- package/dist/components/verbs/r2-sync.js +93 -0
- package/dist/components/verbs/reproducibility.js +62 -0
- package/dist/components/verbs/run-agent.js +577 -0
- package/dist/components/verbs/sbom-generator.js +119 -0
- package/dist/components/verbs/sbom.js +97 -0
- package/dist/components/verbs/shell.js +32 -0
- package/dist/components/verbs/sign.js +221 -0
- package/dist/components/verbs/stub.js +28 -0
- package/dist/components/verbs/tool-sbom-generator.js +154 -0
- package/dist/components/verbs/verify.js +112 -0
- package/dist/components/verbs/vex.js +131 -0
- package/dist/components/verbs/vuln-gate.js +152 -0
- package/dist/components/verbs/vuln-scan.js +288 -0
- package/dist/components/verbs/wait-verify.js +106 -0
- package/dist/components/verbs/wrangler.js +179 -0
- package/dist/components/wave-plan.js +102 -0
- package/dist/composite.js +305 -0
- package/dist/config-import.d.ts.map +1 -1
- package/dist/config-import.js +22 -0
- package/dist/config-sandbox.js +122 -0
- package/dist/config-static.js +206 -0
- package/dist/config.js +605 -0
- package/dist/content-digest.js +23 -0
- package/dist/declarable.js +114 -0
- package/dist/deep-observation.js +437 -0
- package/dist/detectLexicon.js +54 -0
- package/dist/discovery/cache.js +70 -0
- package/dist/discovery/collect.js +208 -0
- package/dist/discovery/cycles.js +95 -0
- package/dist/discovery/entity-wire-codec.js +391 -0
- package/dist/discovery/entity-wire.js +42 -0
- package/dist/discovery/files.js +121 -0
- package/dist/discovery/fold-import.d.ts.map +1 -1
- package/dist/discovery/fold-import.js +4178 -0
- package/dist/discovery/fold-rank.js +292 -0
- package/dist/discovery/graph.js +115 -0
- package/dist/discovery/import.d.ts.map +1 -1
- package/dist/discovery/import.js +65 -0
- package/dist/discovery/index.js +333 -0
- package/dist/discovery/param-deps.js +487 -0
- package/dist/discovery/resolve.js +39 -0
- package/dist/discovery/sandbox/bundle.js +214 -0
- package/dist/discovery/sandbox/child-errors.js +26 -0
- package/dist/discovery/sandbox/config-run.js +100 -0
- package/dist/discovery/sandbox/config-wire.js +183 -0
- package/dist/discovery/sandbox/driver.d.ts.map +1 -1
- package/dist/discovery/sandbox/driver.js +333 -0
- package/dist/discovery/sandbox/fork.js +229 -0
- package/dist/discovery/sandbox/policy-run.js +142 -0
- package/dist/discovery/sandbox/policy-wire.js +152 -0
- package/dist/discovery/sandbox/run.js +77 -0
- package/dist/discovery/specifier-resolve.js +320 -0
- package/dist/discovery/walk.js +284 -0
- package/dist/effect-receipt.js +340 -0
- package/dist/env.js +55 -0
- package/dist/errors.js +62 -0
- package/dist/fold/fold.js +1434 -0
- package/dist/fold/foldable-helpers.js +229 -0
- package/dist/fold/subset.js +696 -0
- package/dist/fold-provenance.js +414 -0
- package/dist/gate-decision.d.ts +36 -4
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +260 -0
- package/dist/gate-resume-run.js +154 -0
- package/dist/gated-waves.js +165 -0
- package/dist/governance.js +43 -0
- package/dist/graph-declared.js +45 -0
- package/dist/graph-detail.js +207 -0
- package/dist/graph-dot.js +54 -0
- package/dist/graph-effective.js +107 -0
- package/dist/graph-ir.js +623 -0
- package/dist/graph-layout.js +184 -0
- package/dist/graph-lens.js +105 -0
- package/dist/graph-mermaid.js +83 -0
- package/dist/graph-ops.js +39 -0
- package/dist/graph-refs.js +156 -0
- package/dist/held-elsewhere.js +87 -0
- package/dist/identity.js +251 -0
- package/dist/import/base-parser.js +34 -0
- package/dist/import/embedded.js +255 -0
- package/dist/import/generator.js +1 -0
- package/dist/import/ir-utils.js +85 -0
- package/dist/import/parser-options.js +45 -0
- package/dist/import/parser.js +1 -0
- package/dist/index.js +118 -0
- package/dist/intrinsic-interpolation.js +73 -0
- package/dist/intrinsic.js +31 -0
- package/dist/join-key.js +35 -0
- package/dist/kubectl-context.js +150 -0
- package/dist/lexicon-config.js +58 -0
- package/dist/lexicon-integrity.js +47 -0
- package/dist/lexicon-manifest.js +70 -0
- package/dist/lexicon-module.d.ts.map +1 -1
- package/dist/lexicon-module.js +241 -0
- package/dist/lexicon-output.js +218 -0
- package/dist/lexicon-plugin-helpers.js +104 -0
- package/dist/lexicon-schema.js +136 -0
- package/dist/lexicon.js +130 -0
- package/dist/lifecycle/affected.js +224 -0
- package/dist/lifecycle/assert-live.js +110 -0
- package/dist/lifecycle/build-ledger-store.js +160 -0
- package/dist/lifecycle/build-ledger.js +155 -0
- package/dist/lifecycle/change-set.js +356 -0
- package/dist/lifecycle/converge-ledger.js +161 -0
- package/dist/lifecycle/deep-diff.js +233 -0
- package/dist/lifecycle/deep-observe.js +147 -0
- package/dist/lifecycle/digest.js +143 -0
- package/dist/lifecycle/disruption.js +135 -0
- package/dist/lifecycle/gate-applied.js +113 -0
- package/dist/lifecycle/gate-audit.js +341 -0
- package/dist/lifecycle/gate-ledger-select.js +89 -0
- package/dist/lifecycle/gate-ledger.d.ts +8 -0
- package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
- package/dist/lifecycle/gate-ledger.js +193 -0
- package/dist/lifecycle/gate-origin.js +117 -0
- package/dist/lifecycle/gate-pending.js +58 -0
- package/dist/lifecycle/git.js +1182 -0
- package/dist/lifecycle/identity.js +58 -0
- package/dist/lifecycle/index.js +26 -0
- package/dist/lifecycle/lease.js +283 -0
- package/dist/lifecycle/ledger-port.js +1 -0
- package/dist/lifecycle/legacy-digest.js +91 -0
- package/dist/lifecycle/live-diff.js +274 -0
- package/dist/lifecycle/local-note.js +15 -0
- package/dist/lifecycle/member-ledger.js +122 -0
- package/dist/lifecycle/observation-baseline.js +155 -0
- package/dist/lifecycle/observe.js +375 -0
- package/dist/lifecycle/oras-referrer-lookup.js +82 -0
- package/dist/lifecycle/override-ledger.js +54 -0
- package/dist/lifecycle/plan-digest.js +110 -0
- package/dist/lifecycle/plan-ledger.js +129 -0
- package/dist/lifecycle/receipt-plan.js +192 -0
- package/dist/lifecycle/release-ledger.js +155 -0
- package/dist/lifecycle/release-read.js +64 -0
- package/dist/lifecycle/replay.js +193 -0
- package/dist/lifecycle/rollback.js +102 -0
- package/dist/lifecycle/run-ledger.js +183 -0
- package/dist/lifecycle/scenario-eval.js +204 -0
- package/dist/lifecycle/scenario.js +214 -0
- package/dist/lifecycle/snapshot.js +239 -0
- package/dist/lifecycle/status.js +447 -0
- package/dist/lifecycle/symptoms.js +117 -0
- package/dist/lifecycle/teardown.js +255 -0
- package/dist/lifecycle/types.js +1 -0
- package/dist/lifecycle/unobserved-gate.js +33 -0
- package/dist/lifecycle/wave-plans.js +68 -0
- package/dist/lifecycle/work-item-id.js +36 -0
- package/dist/lifecycle/work-lease.js +393 -0
- package/dist/lint/component-checks.js +87 -0
- package/dist/lint/config.js +483 -0
- package/dist/lint/declarative.js +122 -0
- package/dist/lint/discover.d.ts.map +1 -1
- package/dist/lint/discover.js +138 -0
- package/dist/lint/engine.js +246 -0
- package/dist/lint/knowledge-checks.js +64 -0
- package/dist/lint/named-checks.js +22 -0
- package/dist/lint/output-checks.js +87 -0
- package/dist/lint/output-docs.js +163 -0
- package/dist/lint/parser.js +33 -0
- package/dist/lint/pipeline-change-gate.js +70 -0
- package/dist/lint/policy-import.d.ts +1 -1
- package/dist/lint/policy-import.d.ts.map +1 -1
- package/dist/lint/policy-import.js +62 -0
- package/dist/lint/policy-sandbox.js +86 -0
- package/dist/lint/policy.js +122 -0
- package/dist/lint/post-synth.js +87 -0
- package/dist/lint/presets/relaxed.json +26 -0
- package/dist/lint/presets/strict.json +24 -24
- package/dist/lint/receipt-checks.js +83 -0
- package/dist/lint/rule-loader.d.ts.map +1 -1
- package/dist/lint/rule-loader.js +89 -0
- package/dist/lint/rule-registry.js +86 -0
- package/dist/lint/rule.js +1 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-a.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp000-discovery-error/broken-b.component.js +7 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/fail/orphan-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/emr-job.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp001/pass/jar-lib.component.js +9 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/fail/search-service.component.js +25 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/jar-lib.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp002/pass/search-service.component.js +21 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/fail/migrator.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/agent-turn.component.js +24 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/migrator.component.js +17 -0
- package/dist/lint/rules/__fixtures__/comp/comp003/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/fail/neo4j-cluster.component.js +18 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/neo4j-cluster.component.js +20 -0
- package/dist/lint/rules/__fixtures__/comp/comp004/pass/orders-table.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/fail/search-service.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp005/pass/search-service.component.js +16 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/fail/legacy-tool.component.js +8 -0
- package/dist/lint/rules/__fixtures__/comp/comp006/pass/legacy-tool.component.js +12 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/inventory-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/fail/orders-table.component.js +11 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/orders-table.component.js +10 -0
- package/dist/lint/rules/__fixtures__/comp/comp007/pass/search-service.component.js +16 -0
- package/dist/lint/rules/comp/comp001-publishes-never-applies.js +69 -0
- package/dist/lint/rules/comp/comp002-dangling-wiring-ref.js +84 -0
- package/dist/lint/rules/comp/comp003-mutating-no-rollback.js +103 -0
- package/dist/lint/rules/comp/comp004-gate-needs-durable-runtime.js +70 -0
- package/dist/lint/rules/comp/comp005-capability-kind-is-noun.js +109 -0
- package/dist/lint/rules/comp/comp006-shell-needs-reason.js +49 -0
- package/dist/lint/rules/comp/comp007-composition-sprawl.js +64 -0
- package/dist/lint/rules/comp/index.js +33 -0
- package/dist/lint/rules/comp/support.js +129 -0
- package/dist/lint/rules/composite-scope.js +51 -0
- package/dist/lint/rules/cor017-composite-name-match.js +93 -0
- package/dist/lint/rules/cor018-composite-prefer-lexicon-type.js +136 -0
- package/dist/lint/rules/cor021-env-literal-name.js +100 -0
- package/dist/lint/rules/cor022-receipt-leaf.js +118 -0
- package/dist/lint/rules/cor024-receipt-secret-pointer.js +199 -0
- package/dist/lint/rules/declarable-naming-convention.js +62 -0
- package/dist/lint/rules/evl001-non-literal-expression.js +66 -0
- package/dist/lint/rules/evl002-control-flow-resource.js +69 -0
- package/dist/lint/rules/evl003-dynamic-property-access.js +44 -0
- package/dist/lint/rules/evl004-spread-non-const.js +94 -0
- package/dist/lint/rules/evl005-resource-block-body.js +41 -0
- package/dist/lint/rules/evl007-invalid-siblings.js +105 -0
- package/dist/lint/rules/evl009-composite-no-constant.js +158 -0
- package/dist/lint/rules/evl010-composite-no-transform.js +59 -0
- package/dist/lint/rules/evl011-symbolic-in-template.js +106 -0
- package/dist/lint/rules/export-required.js +115 -0
- package/dist/lint/rules/file-declarable-limit.js +88 -0
- package/dist/lint/rules/flat-declarations.js +62 -0
- package/dist/lint/rules/index.js +90 -0
- package/dist/lint/rules/no-cyclic-declarable-ref.js +138 -0
- package/dist/lint/rules/no-redundant-type-import.js +76 -0
- package/dist/lint/rules/no-redundant-value-cast.js +41 -0
- package/dist/lint/rules/no-string-ref.js +59 -0
- package/dist/lint/rules/no-unused-declarable-import.js +75 -0
- package/dist/lint/rules/no-unused-declarable.js +142 -0
- package/dist/lint/rules/op/index.js +28 -0
- package/dist/lint/rules/op/ops012-activity-contract.js +54 -0
- package/dist/lint/rules/op/ops013-step-output-ref.js +88 -0
- package/dist/lint/rules/op/ops014-converge-rule-refusals.js +114 -0
- package/dist/lint/rules/op/ops015-gate-approval.js +45 -0
- package/dist/lint/rules/op/support.js +11 -0
- package/dist/lint/rules/op/sys010-key-over-plain-http.js +100 -0
- package/dist/lint/rules/property-kind.js +56 -0
- package/dist/lint/rules/single-concern-file.js +71 -0
- package/dist/lint/rules/sys001-no-literal-key.js +60 -0
- package/dist/lint/selectors.js +168 -0
- package/dist/lint/suppressions.js +129 -0
- package/dist/lint/typescript.js +17 -0
- package/dist/live-endpoint.js +113 -0
- package/dist/live-read-session.js +76 -0
- package/dist/lsp/lexicon-providers.js +163 -0
- package/dist/lsp/types.js +5 -0
- package/dist/managed-fields.js +293 -0
- package/dist/mcp/types.js +4 -0
- package/dist/notify-verify.js +0 -1
- package/dist/notify.js +0 -1
- package/dist/notify.schema.json +72 -0
- package/dist/observation.js +266 -0
- package/dist/okf-read.js +134 -0
- package/dist/okf.js +275 -0
- package/dist/op/__fixtures__/decide-stub-backend.js +125 -0
- package/dist/op/activities/activity-contracts.js +313 -0
- package/dist/op/activities/apply.js +582 -0
- package/dist/op/activities/build.js +18 -0
- package/dist/op/activities/change-coverage.js +40 -0
- package/dist/op/activities/change-set.js +64 -0
- package/dist/op/activities/converge.js +492 -0
- package/dist/op/activities/decide.js +211 -0
- package/dist/op/activities/env-teardown.js +110 -0
- package/dist/op/activities/factory.js +591 -0
- package/dist/op/activities/forge-pull-request.js +82 -0
- package/dist/op/activities/gh-host.js +78 -0
- package/dist/op/activities/guard-validate.js +165 -0
- package/dist/op/activities/http-check.js +40 -0
- package/dist/op/activities/index.js +59 -0
- package/dist/op/activities/lexicon-upgrade.js +629 -0
- package/dist/op/activities/lifecycle.js +109 -0
- package/dist/op/activities/pipeline-audit.js +147 -0
- package/dist/op/activities/policy.js +26 -0
- package/dist/op/activities/predict-behaviour.js +341 -0
- package/dist/op/activities/propose-upgrade.js +165 -0
- package/dist/op/activities/reconcile.js +997 -0
- package/dist/op/activities/shell.js +118 -0
- package/dist/op/activities/source-release.js +97 -0
- package/dist/op/activities/source-rollback.js +165 -0
- package/dist/op/activities/teardown.js +17 -0
- package/dist/op/activities/util.js +6 -0
- package/dist/op/activities/wait.js +51 -0
- package/dist/op/activities/work-evidence.js +35 -0
- package/dist/op/activities/workflow-audit.js +133 -0
- package/dist/op/activity-contract-registry.js +106 -0
- package/dist/op/activity-contract.js +232 -0
- package/dist/op/activity-failure.js +31 -0
- package/dist/op/activity-profiles.js +129 -0
- package/dist/op/activity-registry.js +105 -0
- package/dist/op/activity-runtime.js +28 -0
- package/dist/op/builders.js +801 -0
- package/dist/op/change-signal.js +118 -0
- package/dist/op/composites/apply-op.js +151 -0
- package/dist/op/composites/behaviour-op.js +65 -0
- package/dist/op/composites/converge-op.js +141 -0
- package/dist/op/composites/index.js +19 -0
- package/dist/op/composites/lexicon-upgrade-op.js +107 -0
- package/dist/op/composites/pipeline-audit-op.js +50 -0
- package/dist/op/composites/reconcile-op.js +84 -0
- package/dist/op/composites/watch-op.js +69 -0
- package/dist/op/composites/workflow-audit-op.js +57 -0
- package/dist/op/converge-rule.js +205 -0
- package/dist/op/cron.js +146 -0
- package/dist/op/decide-backend.js +181 -0
- package/dist/op/decide-config.js +68 -0
- package/dist/op/decide-read-inputs.js +141 -0
- package/dist/op/discover.d.ts.map +1 -1
- package/dist/op/discover.js +213 -0
- package/dist/op/duration.js +21 -0
- package/dist/op/emulator-freshness.js +80 -0
- package/dist/op/emulator-lifecycle.js +269 -0
- package/dist/op/factory.js +83 -0
- package/dist/op/gate-approval.js +172 -0
- package/dist/op/gate-name.js +86 -0
- package/dist/op/gate-plan-context.js +167 -0
- package/dist/op/gate-point-run.js +67 -0
- package/dist/op/gate-point.js +111 -0
- package/dist/op/gate-resume-plan.js +155 -0
- package/dist/op/gate-resume.js +31 -0
- package/dist/op/gate-review.js +290 -0
- package/dist/op/gate-run-locator.js +85 -0
- package/dist/op/gate-summary.js +100 -0
- package/dist/op/gate-wait.js +56 -0
- package/dist/op/gate.js +449 -0
- package/dist/op/generate-pipeline.js +124 -0
- package/dist/op/index.js +51 -0
- package/dist/op/lifecycle-receipt-store.js +45 -0
- package/dist/op/local-executor.js +1164 -0
- package/dist/op/local-output.js +140 -0
- package/dist/op/op-ir.js +317 -0
- package/dist/op/op-verb-class.js +131 -0
- package/dist/op/op-waves-notify.js +136 -0
- package/dist/op/op-waves-run.d.ts +1 -1
- package/dist/op/op-waves-run.d.ts.map +1 -1
- package/dist/op/op-waves-run.js +1657 -0
- package/dist/op/op-waves.js +409 -0
- package/dist/op/operator.js +743 -0
- package/dist/op/receipt-store.js +94 -0
- package/dist/op/resource.js +23 -0
- package/dist/op/run-context.js +28 -0
- package/dist/op/run-live.js +256 -0
- package/dist/op/runtime.js +21 -0
- package/dist/op/runtimes/local.js +195 -0
- package/dist/op/source-archive.js +131 -0
- package/dist/op/step-output-ref.js +397 -0
- package/dist/op/steward-beside.js +169 -0
- package/dist/op/steward-points.js +138 -0
- package/dist/op/steward-turn.js +59 -0
- package/dist/op/steward.js +317 -0
- package/dist/op/types.js +25 -0
- package/dist/op/work-lease-decl.js +81 -0
- package/dist/op/work-lease-run.js +393 -0
- package/dist/override-gate.js +284 -0
- package/dist/owner-chain.js +74 -0
- package/dist/ownership.js +92 -0
- package/dist/params.js +61 -0
- package/dist/plan-summary.js +711 -0
- package/dist/point-decision.js +211 -0
- package/dist/pr-forge.js +810 -0
- package/dist/pr-loop.js +203 -0
- package/dist/project-codegen.js +191 -0
- package/dist/project-root.js +74 -0
- package/dist/project-validation.js +50 -0
- package/dist/provenance.js +157 -0
- package/dist/pseudo-parameter.js +40 -0
- package/dist/reconcile.js +450 -0
- package/dist/resource-attributes.js +33 -0
- package/dist/runtime-adapter.js +77 -0
- package/dist/runtime.js +66 -0
- package/dist/secret-materialization.js +153 -0
- package/dist/secret-provenance.js +250 -0
- package/dist/serializer-walker.js +112 -0
- package/dist/serializer.js +1 -0
- package/dist/sort.js +45 -0
- package/dist/stack-output.js +115 -0
- package/dist/telemetry-attribution.js +149 -0
- package/dist/terraform/__fixtures__/build-graph.js +63 -0
- package/dist/terraform/adopt-state.js +40 -0
- package/dist/terraform/aws-resources.js +384 -0
- package/dist/terraform/bridge.js +204 -0
- package/dist/terraform/carve-provider.js +155 -0
- package/dist/terraform/carve.js +138 -0
- package/dist/terraform/data-source-shape.js +57 -0
- package/dist/terraform/emit-source.js +36 -0
- package/dist/terraform/excise.js +123 -0
- package/dist/terraform/graduate.js +128 -0
- package/dist/terraform/graph.js +435 -0
- package/dist/terraform/hcl2json.js +60 -0
- package/dist/terraform/manifest.js +149 -0
- package/dist/terraform/parse.js +81 -0
- package/dist/terraform/providers/aws.js +146 -0
- package/dist/terraform/providers/gcp.js +294 -0
- package/dist/terraform/providers/index.js +17 -0
- package/dist/terraform/providers/kubernetes.js +253 -0
- package/dist/terraform/score.js +151 -0
- package/dist/terraform/state.js +67 -0
- package/dist/terraform/tier-map.js +74 -0
- package/dist/terraform/types.js +13 -0
- package/dist/terraform/unified-diff.js +132 -0
- package/dist/testing.js +295 -0
- package/dist/toml-emit.js +153 -0
- package/dist/toml-parse.js +355 -0
- package/dist/toml-utils.js +60 -0
- package/dist/toml.js +428 -0
- package/dist/ts-loader.d.ts +46 -0
- package/dist/ts-loader.d.ts.map +1 -0
- package/dist/ts-loader.js +103 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +61 -0
- package/dist/validation.js +20 -0
- package/dist/vendor/js-yaml-load.js +1662 -0
- package/dist/workspace/__fixtures__/contract-repo.js +103 -0
- package/dist/workspace/__fixtures__/decide-workspace.js +112 -0
- package/dist/workspace/__fixtures__/sessions.js +91 -0
- package/dist/workspace/__fixtures__/two-member-workspace.js +34 -0
- package/dist/workspace/agent-cli.js +99 -0
- package/dist/workspace/agent.schema.json +390 -0
- package/dist/workspace/answers-ledger.js +89 -0
- package/dist/workspace/box-cli.js +142 -0
- package/dist/workspace/box-factory-write.js +196 -0
- package/dist/workspace/box-factory-write.schema.json +342 -0
- package/dist/workspace/box-factory.js +88 -0
- package/dist/workspace/box-intent.js +126 -0
- package/dist/workspace/box-isolation.js +169 -0
- package/dist/workspace/box-listing-write.schema.json +204 -0
- package/dist/workspace/box-listing.js +298 -0
- package/dist/workspace/box-publish.js +352 -0
- package/dist/workspace/box-publish.schema.json +498 -0
- package/dist/workspace/box-services.js +39 -0
- package/dist/workspace/broker-protocol.js +359 -0
- package/dist/workspace/broker-protocol.schema.json +228 -0
- package/dist/workspace/change-set.schema.json +460 -0
- package/dist/workspace/changes-cli.js +56 -0
- package/dist/workspace/changes.js +446 -0
- package/dist/workspace/changes.schema.json +642 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-fly-site.js +198 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-live-names.js +155 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-rollback.js +214 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-inputs.js +180 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit-ship-policy.js +99 -0
- package/dist/workspace/chant-migrations/chud-lexicon-exit.js +847 -0
- package/dist/workspace/chant-migrations.js +113 -0
- package/dist/workspace/check.schema.json +433 -0
- package/dist/workspace/checks/box-isolation.js +62 -0
- package/dist/workspace/checks/boxes.js +491 -0
- package/dist/workspace/checks/diagrams.js +104 -0
- package/dist/workspace/checks/generated.js +419 -0
- package/dist/workspace/checks/ledgers.js +212 -0
- package/dist/workspace/checks/links.js +191 -0
- package/dist/workspace/checks/live.js +100 -0
- package/dist/workspace/checks/pipelines.js +188 -0
- package/dist/workspace/checks/records.js +169 -0
- package/dist/workspace/checks.js +426 -0
- package/dist/workspace/ci-green-cli.js +125 -0
- package/dist/workspace/ci-green-forge.js +83 -0
- package/dist/workspace/ci-green-workflow.js +199 -0
- package/dist/workspace/ci-green.js +325 -0
- package/dist/workspace/ci-last-green.schema.json +158 -0
- package/dist/workspace/compose-graph.js +235 -0
- package/dist/workspace/compose-reports.js +146 -0
- package/dist/workspace/composites.js +264 -0
- package/dist/workspace/composites.schema.json +617 -0
- package/dist/workspace/conformance/__fixture__/app/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/app/src/server.mjs +29 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.kind.mjs +54 -0
- package/dist/workspace/conformance/__fixture__/decisions/decision.schema.json +512 -0
- package/dist/workspace/conformance/__fixture__/decisions/fix-001-how-the-app-is-deployed.md +40 -0
- package/dist/workspace/conformance/__fixture__/delivery/chant.config.ts +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/lexicon/index.ts +26 -0
- package/dist/workspace/conformance/__fixture__/delivery/package.json +7 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.component.ts +14 -0
- package/dist/workspace/conformance/__fixture__/delivery/src/app.ts +4 -0
- package/dist/workspace/conformance/__fixtures__/reference-broker.js +205 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.kind.mjs +32 -0
- package/dist/workspace/conformance/__writer_fixture__/answers/answer.schema.json +135 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.kind.mjs +37 -0
- package/dist/workspace/conformance/__writer_fixture__/contracts/contract.schema.json +213 -0
- package/dist/workspace/conformance/__writer_fixture__/decisions/points.json +228 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.kind.mjs +15 -0
- package/dist/workspace/conformance/__writer_fixture__/drivers/driver.schema.json +38 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.kind.mjs +54 -0
- package/dist/workspace/conformance/__writer_fixture__/sessions/session.schema.json +289 -0
- package/dist/workspace/conformance/__writer_fixture__/work/W-001-the-writer-suite-works-this-item.md +25 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.kind.mjs +60 -0
- package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +603 -0
- package/dist/workspace/conformance/broker.js +736 -0
- package/dist/workspace/conformance/index.js +673 -0
- package/dist/workspace/conformance/vitest.js +108 -0
- package/dist/workspace/conformance/writer.js +1080 -0
- package/dist/workspace/decide.js +879 -0
- package/dist/workspace/decision-points.schema.json +135 -135
- package/dist/workspace/declaration-write-cli.js +74 -0
- package/dist/workspace/declaration-write.js +238 -0
- package/dist/workspace/declaration.js +938 -0
- package/dist/workspace/declaration.schema.json +1413 -1413
- package/dist/workspace/declared-kinds.js +106 -0
- package/dist/workspace/environments.js +164 -0
- package/dist/workspace/evidence.schema.json +279 -0
- package/dist/workspace/export-cli.js +185 -0
- package/dist/workspace/export.js +499 -0
- package/dist/workspace/factory-rules.js +175 -0
- package/dist/workspace/generated-files.js +92 -0
- package/dist/workspace/glob.js +45 -0
- package/dist/workspace/graph-cache.js +352 -0
- package/dist/workspace/graph-cli.js +348 -0
- package/dist/workspace/graph.schema.json +1338 -0
- package/dist/workspace/identity-gate-rule.d.ts +65 -0
- package/dist/workspace/identity-gate-rule.d.ts.map +1 -0
- package/dist/workspace/identity-gate-rule.js +75 -0
- package/dist/workspace/identity.d.ts +4 -2
- package/dist/workspace/identity.d.ts.map +1 -1
- package/dist/workspace/identity.js +126 -0
- package/dist/workspace/import.js +283 -0
- package/dist/workspace/init.js +620 -0
- package/dist/workspace/intent-cli.js +263 -0
- package/dist/workspace/intent-joins.js +201 -0
- package/dist/workspace/intent-record.js +352 -0
- package/dist/workspace/intent-record.schema.json +864 -0
- package/dist/workspace/intent.js +1582 -0
- package/dist/workspace/intent.schema.json +2420 -0
- package/dist/workspace/json-edit.js +221 -0
- package/dist/workspace/jsonc.js +235 -0
- package/dist/workspace/kind-readers.js +103 -0
- package/dist/workspace/kinds.js +587 -0
- package/dist/workspace/lexicon-symbols.js +112 -0
- package/dist/workspace/lineage-adopt-cli.js +102 -0
- package/dist/workspace/lineage-adopt.js +360 -0
- package/dist/workspace/lineage-check.js +282 -0
- package/dist/workspace/lineage-cli.js +121 -0
- package/dist/workspace/lineage-hash-index.js +284 -0
- package/dist/workspace/lineage-init.js +507 -0
- package/dist/workspace/lineage-lock.js +387 -0
- package/dist/workspace/lineage-merge.js +45 -0
- package/dist/workspace/lineage-migrations.d.ts.map +1 -1
- package/dist/workspace/lineage-migrations.js +329 -0
- package/dist/workspace/lineage-provenance.js +36 -0
- package/dist/workspace/lineage-update.js +138 -0
- package/dist/workspace/lineage-upgrade-cli.js +131 -0
- package/dist/workspace/lineage-upgrade.js +889 -0
- package/dist/workspace/lineage-vendor.js +171 -0
- package/dist/workspace/lineage-version.js +128 -0
- package/dist/workspace/lineage-versions.js +275 -0
- package/dist/workspace/links.js +330 -0
- package/dist/workspace/ls-generated.js +95 -0
- package/dist/workspace/ls.js +277 -0
- package/dist/workspace/ls.schema.json +333 -0
- package/dist/workspace/member-commands.js +508 -0
- package/dist/workspace/member-handles.js +216 -0
- package/dist/workspace/member-pipeline.js +258 -0
- package/dist/workspace/member-run.js +117 -0
- package/dist/workspace/member-write.schema.json +193 -0
- package/dist/workspace/nested-graph.js +156 -0
- package/dist/workspace/nesting.js +38 -0
- package/dist/workspace/patch.js +301 -0
- package/dist/workspace/patch.schema.json +321 -0
- package/dist/workspace/pin-cli.js +55 -0
- package/dist/workspace/pin-integrity.js +100 -0
- package/dist/workspace/plan-summary.schema.json +155 -0
- package/dist/workspace/point-answer.schema.json +129 -129
- package/dist/workspace/points-cli.js +291 -0
- package/dist/workspace/points-write.schema.json +660 -0
- package/dist/workspace/points.js +521 -0
- package/dist/workspace/points.schema.json +916 -0
- package/dist/workspace/pr-report.schema.json +108 -0
- package/dist/workspace/principal-classes.d.ts +3 -14
- package/dist/workspace/principal-classes.d.ts.map +1 -1
- package/dist/workspace/principal-classes.js +245 -0
- package/dist/workspace/reason-codes.js +326 -0
- package/dist/workspace/record-assets.js +151 -0
- package/dist/workspace/record-decided.js +105 -0
- package/dist/workspace/record-sessions.js +96 -0
- package/dist/workspace/record-source.js +114 -0
- package/dist/workspace/records-amend.schema.json +284 -0
- package/dist/workspace/records-checkout.js +76 -0
- package/dist/workspace/records-cli.js +707 -0
- package/dist/workspace/records-close.js +116 -0
- package/dist/workspace/records-close.schema.json +278 -0
- package/dist/workspace/records-new.schema.json +202 -0
- package/dist/workspace/records-review.schema.json +367 -0
- package/dist/workspace/records-since.js +317 -0
- package/dist/workspace/records-since.schema.json +218 -0
- package/dist/workspace/records-write.js +1229 -0
- package/dist/workspace/records.js +1345 -0
- package/dist/workspace/records.schema.json +604 -0
- package/dist/workspace/reference-kinds/app/package.json +10 -0
- package/dist/workspace/reference-kinds/app/workspace-kinds.json +45 -0
- package/dist/workspace/returns.js +303 -0
- package/dist/workspace/root-refusal.js +75 -0
- package/dist/workspace/run-statement.schema.json +622 -0
- package/dist/workspace/runs-cli.js +584 -0
- package/dist/workspace/runs-write.schema.json +994 -0
- package/dist/workspace/runs.js +708 -0
- package/dist/workspace/runs.schema.json +1257 -0
- package/dist/workspace/runtimes.js +76 -0
- package/dist/workspace/session-kinds.js +83 -0
- package/dist/workspace/signers.schema.json +206 -0
- package/dist/workspace/source-block.js +125 -0
- package/dist/workspace/squash.js +177 -0
- package/dist/workspace/status-gates.js +162 -0
- package/dist/workspace/status-stewards.js +330 -0
- package/dist/workspace/status.js +514 -0
- package/dist/workspace/status.schema.json +998 -0
- package/dist/workspace/steward-index.js +191 -0
- package/dist/workspace/symbols.js +188 -0
- package/dist/workspace/template-manifest.js +227 -0
- package/dist/workspace/template-pins.js +115 -0
- package/dist/workspace/trailer-joins.js +65 -0
- package/dist/workspace/trailers.js +111 -0
- package/dist/workspace/tree.js +136 -0
- package/dist/workspace/trust/attestor.js +63 -0
- package/dist/workspace/trust/dsse.js +108 -0
- package/dist/workspace/trust/evidence-cli.js +175 -0
- package/dist/workspace/trust/evidence.js +161 -0
- package/dist/workspace/trust/gate-seal.js +226 -0
- package/dist/workspace/trust/policy.js +190 -0
- package/dist/workspace/trust/provenance.js +180 -0
- package/dist/workspace/trust/rotation.js +298 -0
- package/dist/workspace/trust/run-commits.js +101 -0
- package/dist/workspace/trust/run-statement.js +182 -0
- package/dist/workspace/trust/seal.js +272 -0
- package/dist/workspace/trust/signers-cli.js +152 -0
- package/dist/workspace/trust/ssh-commit.js +178 -0
- package/dist/workspace/trust/test-repo.js +118 -0
- package/dist/workspace/trust/trust-files.js +193 -0
- package/dist/workspace/trust/verify-cli.js +63 -0
- package/dist/workspace/trust/verify.js +192 -0
- package/dist/workspace/which-chant.js +141 -0
- package/dist/workspace/wip-cli.js +95 -0
- package/dist/workspace/wip-write.schema.json +504 -0
- package/dist/workspace/wip.js +631 -0
- package/dist/workspace/wip.schema.json +334 -0
- package/dist/workspace/work-cli.js +448 -0
- package/dist/workspace/work-evidence.js +122 -0
- package/dist/workspace/work-evidence.schema.json +222 -0
- package/dist/workspace/work-history.schema.json +421 -0
- package/dist/workspace/work-lease.schema.json +246 -0
- package/dist/workspace/work-size.js +77 -0
- package/dist/workspace/work.js +283 -0
- package/dist/workspace/workspace-kinds.schema.json +259 -259
- package/dist/workspace/workspace-principals.schema.json +53 -53
- package/dist/workspace/write-lock-cli.js +105 -0
- package/dist/workspace/write-lock.js +424 -0
- package/dist/workspace/write-lock.schema.json +172 -0
- package/dist/workspace/write-scope.js +484 -0
- package/dist/yaml.js +459 -0
- package/package.json +2 -2
- package/src/cli/commands/check-lexicon-plugin.ts +2 -0
- package/src/cli/commands/lint.ts +36 -6
- package/src/cli/commands/migrate.ts +2 -0
- package/src/cli/compiled-cli.e2e.test.ts +165 -0
- package/src/cli/main.ts +121 -27
- package/src/cli/mcp/workspace-tools.ts +1 -1
- package/src/codegen/pinned-upgrade.ts +2 -0
- package/src/components/discover.ts +2 -0
- package/src/components/sandbox/driver.ts +3 -1
- package/src/config-import.ts +3 -0
- package/src/discovery/fold-import.ts +23 -14
- package/src/discovery/import.ts +2 -0
- package/src/discovery/sandbox/driver.ts +3 -1
- package/src/gate-decision-bundle.test.ts +3 -2
- package/src/gate-decision-identity.test.ts +176 -0
- package/src/gate-decision.ts +100 -22
- package/src/lexicon-module.ts +3 -0
- package/src/lifecycle/gate-ledger.ts +8 -0
- package/src/lint/config.ts +1 -1
- package/src/lint/discover.ts +28 -8
- package/src/lint/policy-import.ts +4 -1
- package/src/lint/rule-loader.ts +2 -0
- package/src/op/discover.ts +3 -0
- package/src/op/op-waves-point.test.ts +1 -0
- package/src/op/op-waves-run.ts +5 -4
- package/src/op/op-waves.test.ts +14 -0
- package/src/ts-loader.test.ts +23 -0
- package/src/ts-loader.ts +122 -0
- package/src/workspace/chant-migrations/chud-lexicon-exit.ts +1 -1
- package/src/workspace/declaration.ts +1 -1
- package/src/workspace/identity-gate-rule.ts +109 -0
- package/src/workspace/identity.ts +8 -18
- package/src/workspace/kinds.ts +1 -1
- package/src/workspace/lineage-migrations.ts +2 -0
- package/src/workspace/points.ts +1 -1
- package/src/workspace/principal-classes.ts +5 -30
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant workspace box listing set <member>` (#3308): change a box's listing,
|
|
3
|
+
* `members[i].box.listing` in the declaration (#3146, ws-077), through chant.
|
|
4
|
+
*
|
|
5
|
+
* ws-074 makes the repo the database and lets a tool write only through
|
|
6
|
+
* chant's write contract. The listing is configuration on the box block, so
|
|
7
|
+
* before this a tool such as hud would have had to edit `chant.workspace.json`
|
|
8
|
+
* itself. This write changes only the listing's own properties, in place, so
|
|
9
|
+
* the file keeps its formatting, key order and, in a `.jsonc` file, its
|
|
10
|
+
* comments. It can copy a cover image into the repository and point the
|
|
11
|
+
* listing at it. It validates the declaration it would write, judges every
|
|
12
|
+
* path it writes by the write scope at base (`judgePath`, the rule `check
|
|
13
|
+
* --changes` applies to the commit later), refuses a bare `--by` name under
|
|
14
|
+
* `identity.attribution: "identified"` (ws-080), prints one JSON document
|
|
15
|
+
* (`box-listing-write.schema.json`) and never commits: the caller commits, as
|
|
16
|
+
* after the records writes. Like them it holds the working tree's write lock
|
|
17
|
+
* (#3173, ws-089) from reading the declaration to writing it.
|
|
18
|
+
*/
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
|
|
22
|
+
import { listingView, treeBytes } from "./box-factory.js";
|
|
23
|
+
import { parseDeclaration, readDeclaration, readerVersion, WORKSPACE_ERROR_CODES, WorkspaceReadError } from "./declaration.js";
|
|
24
|
+
import { IDENTITY_CODES, IdentityError, refuseUnidentified } from "./identity.js";
|
|
25
|
+
import { removeProperty, setProperty, valueAt } from "./json-edit.js";
|
|
26
|
+
import { parseJsonText } from "./jsonc.js";
|
|
27
|
+
import { workingTree } from "./tree.js";
|
|
28
|
+
import { locateWorkspace } from "./which-chant.js";
|
|
29
|
+
import { judgePath, resolveWriter, scopeSource, unknownClassVerdict, WriteScopeError } from "./write-scope.js";
|
|
30
|
+
import { withWriteLockSync, WriteLockError, WRITE_LOCK_CODES } from "./write-lock.js";
|
|
31
|
+
/** The version of the document this write prints. */
|
|
32
|
+
export const BOX_LISTING_CONTRACT_VERSION = 1;
|
|
33
|
+
/** `$id` of the JSON Schema for what `box listing set` prints, shipped beside this file. */
|
|
34
|
+
export const BOX_LISTING_WRITE_SCHEMA_ID = "https://intentius.io/chant/schemas/workspace/box-listing-write/v1/box-listing-write.schema.json";
|
|
35
|
+
/** Why a listing write wrote nothing. Closed. */
|
|
36
|
+
export const BOX_LISTING_ERROR_CODES = [
|
|
37
|
+
...WORKSPACE_ERROR_CODES,
|
|
38
|
+
"write-usage-invalid",
|
|
39
|
+
"write-input-invalid",
|
|
40
|
+
"listing-member-unknown",
|
|
41
|
+
"listing-box-missing",
|
|
42
|
+
"listing-cover-invalid",
|
|
43
|
+
"write-scope-member",
|
|
44
|
+
"write-scope-protected",
|
|
45
|
+
"write-scope-class-unknown",
|
|
46
|
+
"agent-unknown",
|
|
47
|
+
...IDENTITY_CODES,
|
|
48
|
+
...WRITE_LOCK_CODES,
|
|
49
|
+
];
|
|
50
|
+
/** The listing properties a write may set. Any `x-` key is passed through as well. */
|
|
51
|
+
export const LISTING_FIELDS = ["published", "title", "line", "cover"];
|
|
52
|
+
/** The largest cover image the write copies, in bytes. */
|
|
53
|
+
export const COVER_MAX_BYTES = 5 * 1024 * 1024;
|
|
54
|
+
/** The picture formats a cover may be, by the extension its file takes. */
|
|
55
|
+
const COVER_TYPES = [
|
|
56
|
+
{ type: "image/png", ext: "png", exts: ["png"], magic: (b) => b.length >= 8 && [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every((x, i) => b[i] === x) },
|
|
57
|
+
{ type: "image/jpeg", ext: "jpg", exts: ["jpg", "jpeg"], magic: (b) => b.length >= 3 && b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff },
|
|
58
|
+
{
|
|
59
|
+
type: "image/webp",
|
|
60
|
+
ext: "webp",
|
|
61
|
+
exts: ["webp"],
|
|
62
|
+
magic: (b) => b.length >= 12 && String.fromCharCode(...b.slice(0, 4)) === "RIFF" && String.fromCharCode(...b.slice(8, 12)) === "WEBP",
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
class ListingWriteError extends Error {
|
|
66
|
+
constructor(code, message) {
|
|
67
|
+
super(message);
|
|
68
|
+
this.code = code;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const toPosix = (p) => (sep === "/" ? p : p.split(sep).join("/"));
|
|
72
|
+
const sha256 = (b) => createHash("sha256").update(b).digest("hex");
|
|
73
|
+
const isObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
|
|
74
|
+
/** A path from the workspace root that stays inside it, with / separators, or a reason it isn't one. */
|
|
75
|
+
function workspacePath(raw, what) {
|
|
76
|
+
const p = toPosix(raw).replace(/^\.\//, "");
|
|
77
|
+
const norm = posix.normalize(p);
|
|
78
|
+
if (p === "" || isAbsolute(raw) || norm.startsWith("../") || norm === ".." || norm !== p || p.endsWith("/")) {
|
|
79
|
+
throw new ListingWriteError("listing-cover-invalid", `${what} ${JSON.stringify(raw)} is not a file path from the workspace root: give it relative, normalised and inside the workspace`);
|
|
80
|
+
}
|
|
81
|
+
if (p.split("/")[0] === ".git")
|
|
82
|
+
throw new ListingWriteError("listing-cover-invalid", `${what} ${JSON.stringify(raw)} is inside .git`);
|
|
83
|
+
return p;
|
|
84
|
+
}
|
|
85
|
+
function sniff(bytes, what) {
|
|
86
|
+
const t = COVER_TYPES.find((c) => c.magic(bytes));
|
|
87
|
+
if (!t)
|
|
88
|
+
throw new ListingWriteError("listing-cover-invalid", `${what} is not a PNG, JPEG or WebP picture`);
|
|
89
|
+
return t;
|
|
90
|
+
}
|
|
91
|
+
/** The listing fields given with --from: a JSON object of published, title, line, cover and x- keys; null for a key takes it out. */
|
|
92
|
+
function readFields(text) {
|
|
93
|
+
if (text === undefined || text.trim() === "")
|
|
94
|
+
return {};
|
|
95
|
+
let value;
|
|
96
|
+
try {
|
|
97
|
+
value = JSON.parse(text);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
throw new ListingWriteError("write-input-invalid", `the listing fields are not JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
101
|
+
}
|
|
102
|
+
if (!isObject(value))
|
|
103
|
+
throw new ListingWriteError("write-input-invalid", "the listing fields are a JSON object, such as {\"title\": \"...\", \"line\": \"...\"}");
|
|
104
|
+
for (const [k, v] of Object.entries(value)) {
|
|
105
|
+
if (k.startsWith("x-"))
|
|
106
|
+
continue;
|
|
107
|
+
if (!LISTING_FIELDS.includes(k))
|
|
108
|
+
throw new ListingWriteError("write-input-invalid", `${k} is not a listing field; a listing takes ${LISTING_FIELDS.join(", ")} and x- keys`);
|
|
109
|
+
if (v === null)
|
|
110
|
+
continue;
|
|
111
|
+
if (k === "published" && typeof v !== "boolean")
|
|
112
|
+
throw new ListingWriteError("write-input-invalid", "published is true or false, or null to take it out");
|
|
113
|
+
if (k !== "published" && typeof v !== "string")
|
|
114
|
+
throw new ListingWriteError("write-input-invalid", `${k} is a string, or null to take it out`);
|
|
115
|
+
}
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
/** Write `bytes` to `file` through a sibling temporary file, so a reader never sees half of it. */
|
|
119
|
+
function writeAtomically(file, bytes) {
|
|
120
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
121
|
+
const tmp = `${file}.chant-${process.pid}.tmp`;
|
|
122
|
+
writeFileSync(tmp, bytes);
|
|
123
|
+
renameSync(tmp, file);
|
|
124
|
+
}
|
|
125
|
+
/** Run the write and build the document it prints. Never throws for a refusal. */
|
|
126
|
+
export function boxListingSet(req) {
|
|
127
|
+
const head = { $schema: BOX_LISTING_WRITE_SCHEMA_ID, contract: BOX_LISTING_CONTRACT_VERSION, chant: readerVersion() };
|
|
128
|
+
try {
|
|
129
|
+
return withWriteLockSync(req.cwd, { verb: "box listing set", by: req.by ?? null, agent: req.agent || null }, req.dryRun, () => write(req, head));
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
const fail = (code, message) => ({ ...head, member: req.member || null, error: { code, message } });
|
|
133
|
+
if (err instanceof ListingWriteError)
|
|
134
|
+
return fail(err.code, err.message);
|
|
135
|
+
// A path write is never judged write-scope-kind, which is for record kinds.
|
|
136
|
+
if (err instanceof WriteScopeError)
|
|
137
|
+
return fail(err.code, err.message);
|
|
138
|
+
if (err instanceof IdentityError)
|
|
139
|
+
return fail(err.code, err.message);
|
|
140
|
+
if (err instanceof WriteLockError)
|
|
141
|
+
return fail(err.code, err.message);
|
|
142
|
+
if (err instanceof WorkspaceReadError)
|
|
143
|
+
return fail(err.code, err.describe());
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function write(req, head) {
|
|
148
|
+
if (!req.member)
|
|
149
|
+
throw new ListingWriteError("write-usage-invalid", "box listing set needs the member whose box it lists: box listing set <member>");
|
|
150
|
+
if (req.coverPath !== undefined && req.cover === undefined)
|
|
151
|
+
throw new ListingWriteError("write-usage-invalid", "--cover-path says where --cover's image goes, and no --cover was given");
|
|
152
|
+
const fields = readFields(req.fields);
|
|
153
|
+
if (req.cover !== undefined && "cover" in fields)
|
|
154
|
+
throw new ListingWriteError("write-usage-invalid", "give the cover once: --cover copies an image in, and a cover field names a file already in the workspace");
|
|
155
|
+
if (req.cover === undefined && req.fields === undefined)
|
|
156
|
+
throw new ListingWriteError("write-usage-invalid", "box listing set needs --from <file|-> with the listing fields, --cover <image>, or both");
|
|
157
|
+
const located = locateWorkspace(req.cwd);
|
|
158
|
+
const declaration = readDeclaration(located.tree);
|
|
159
|
+
const member = declaration.members.find((m) => m.name === req.member);
|
|
160
|
+
if (!member) {
|
|
161
|
+
throw new ListingWriteError("listing-member-unknown", `no member is named ${req.member}; the declaration's members are ${declaration.members.map((m) => m.name).join(", ") || "none"}`);
|
|
162
|
+
}
|
|
163
|
+
if (!member.box)
|
|
164
|
+
throw new ListingWriteError("listing-box-missing", `member ${member.name} declares no box block, so it has no listing; a listing is what a box shows of itself (#3146)`);
|
|
165
|
+
const repoBase = located.top ?? located.rootOnDisk;
|
|
166
|
+
const fromRepo = (pathInWorkspace) => toPosix(relative(repoBase, join(located.rootOnDisk, ...pathInWorkspace.split("/"))));
|
|
167
|
+
const declFile = join(located.rootOnDisk, declaration.file);
|
|
168
|
+
const before = readFileSync(declFile, "utf-8");
|
|
169
|
+
const jsonc = declaration.file.endsWith(".jsonc");
|
|
170
|
+
// The cover: an image copied in, or a file already in the workspace.
|
|
171
|
+
let copy = null;
|
|
172
|
+
if (req.cover !== undefined) {
|
|
173
|
+
const src = resolve(req.cwd, req.cover);
|
|
174
|
+
let bytes;
|
|
175
|
+
try {
|
|
176
|
+
if (statSync(src).size > COVER_MAX_BYTES)
|
|
177
|
+
throw new ListingWriteError("listing-cover-invalid", `--cover ${req.cover} is larger than ${COVER_MAX_BYTES} bytes; a cover is a picture for a listing, so make it smaller`);
|
|
178
|
+
bytes = readFileSync(src);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
if (err instanceof ListingWriteError)
|
|
182
|
+
throw err;
|
|
183
|
+
throw new ListingWriteError("listing-cover-invalid", `--cover ${req.cover} can't be read: ${err instanceof Error ? err.message : String(err)}`);
|
|
184
|
+
}
|
|
185
|
+
const type = sniff(bytes, `--cover ${req.cover}`);
|
|
186
|
+
const current = member.box.listing?.cover ?? null;
|
|
187
|
+
const dir = member.dir === "." ? "" : `${member.dir}/`;
|
|
188
|
+
const path = req.coverPath !== undefined
|
|
189
|
+
? workspacePath(req.coverPath, "--cover-path")
|
|
190
|
+
: current !== null && type.exts.includes(posix.extname(current).slice(1).toLowerCase())
|
|
191
|
+
? current
|
|
192
|
+
: `${dir}listing/cover.${type.ext}`;
|
|
193
|
+
const ext = posix.extname(path).slice(1).toLowerCase();
|
|
194
|
+
if (!type.exts.includes(ext))
|
|
195
|
+
throw new ListingWriteError("listing-cover-invalid", `--cover ${req.cover} is ${type.type}, and ${path} has the extension .${ext}; name it .${type.ext}`);
|
|
196
|
+
if (path === declaration.file)
|
|
197
|
+
throw new ListingWriteError("listing-cover-invalid", `--cover-path names the declaration itself`);
|
|
198
|
+
copy = { path, bytes, type, replaced: current !== null && current !== path ? current : null };
|
|
199
|
+
fields.cover = path;
|
|
200
|
+
}
|
|
201
|
+
else if (typeof fields.cover === "string") {
|
|
202
|
+
const path = workspacePath(fields.cover, "cover");
|
|
203
|
+
const bytes = treeBytes(workingTree(located.rootOnDisk))(path);
|
|
204
|
+
if (bytes === null)
|
|
205
|
+
throw new ListingWriteError("listing-cover-invalid", `cover ${path} is not a file in the workspace; copy an image in with --cover <image> instead`);
|
|
206
|
+
sniff(bytes, `cover ${path}`);
|
|
207
|
+
fields.cover = path;
|
|
208
|
+
}
|
|
209
|
+
// The declaration, with only the listing's own properties changed.
|
|
210
|
+
const boxPointer = member.box.pointer;
|
|
211
|
+
const listingPointer = `${boxPointer}/listing`;
|
|
212
|
+
const parsedBefore = parseJsonText(before, { jsonc });
|
|
213
|
+
if (!parsedBefore.ok)
|
|
214
|
+
throw new WorkspaceReadError("declaration-unparseable", parsedBefore.message);
|
|
215
|
+
const rawListing = valueAt(parsedBefore.value, listingPointer);
|
|
216
|
+
let after = before;
|
|
217
|
+
const expected = structuredClone(parsedBefore.value);
|
|
218
|
+
const expectedBox = valueAt(expected, boxPointer);
|
|
219
|
+
if (rawListing === undefined) {
|
|
220
|
+
const value = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== null));
|
|
221
|
+
after = setProperty(after, jsonc, boxPointer, "listing", value);
|
|
222
|
+
expectedBox.listing = value;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
const expectedListing = expectedBox.listing;
|
|
226
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
227
|
+
if (v === null) {
|
|
228
|
+
after = removeProperty(after, jsonc, listingPointer, k);
|
|
229
|
+
delete expectedListing[k];
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
after = setProperty(after, jsonc, listingPointer, k, v);
|
|
233
|
+
expectedListing[k] = v;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const parsedAfter = parseJsonText(after, { jsonc });
|
|
238
|
+
if (!parsedAfter.ok || JSON.stringify(parsedAfter.value) !== JSON.stringify(expected)) {
|
|
239
|
+
// An edit that does not read back as the value meant is never written.
|
|
240
|
+
throw new Error(`box listing set: editing ${declaration.file} in place did not give the declaration intended; nothing was written`);
|
|
241
|
+
}
|
|
242
|
+
let next;
|
|
243
|
+
try {
|
|
244
|
+
next = parseDeclaration(after, declaration.file);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
if (err instanceof WorkspaceReadError)
|
|
248
|
+
throw new ListingWriteError("write-input-invalid", `the listing would make the declaration invalid: ${err.describe()}`);
|
|
249
|
+
throw err;
|
|
250
|
+
}
|
|
251
|
+
const nextMember = next.members.find((m) => m.name === member.name);
|
|
252
|
+
// The write scope at base, for each file written, and who --by names.
|
|
253
|
+
const source = scopeSource(req.cwd);
|
|
254
|
+
if (req.by !== undefined)
|
|
255
|
+
refuseUnidentified(source, [req.by], "--by", { agent: req.agent });
|
|
256
|
+
if (source.declaration !== null || (req.agent !== undefined && req.agent !== "")) {
|
|
257
|
+
const writer = resolveWriter(source.declaration, source.policy, { agent: req.agent || null, principal: req.by ?? null }, source.classes);
|
|
258
|
+
const unknown = unknownClassVerdict(source.declaration, writer, source.classes);
|
|
259
|
+
if (!unknown.ok)
|
|
260
|
+
throw new WriteScopeError(unknown.code, unknown.message);
|
|
261
|
+
const judge = (path, change) => {
|
|
262
|
+
const verdict = judgePath(source.declaration, writer, path, change);
|
|
263
|
+
if (!verdict.ok)
|
|
264
|
+
throw new ListingWriteError(verdict.code, verdict.message);
|
|
265
|
+
};
|
|
266
|
+
if (after !== before)
|
|
267
|
+
judge(declaration.file, { before: () => before, after: () => after });
|
|
268
|
+
if (copy)
|
|
269
|
+
judge(copy.path);
|
|
270
|
+
}
|
|
271
|
+
// Write: the cover first, so the declaration never names a cover that isn't there.
|
|
272
|
+
const paths = [];
|
|
273
|
+
const coverFile = copy ? join(located.rootOnDisk, ...copy.path.split("/")) : null;
|
|
274
|
+
const coverChanged = copy !== null && !(existsSync(coverFile) && sha256(readFileSync(coverFile)) === sha256(copy.bytes));
|
|
275
|
+
if (copy && coverChanged) {
|
|
276
|
+
if (!req.dryRun)
|
|
277
|
+
writeAtomically(coverFile, copy.bytes);
|
|
278
|
+
paths.push(fromRepo(copy.path));
|
|
279
|
+
}
|
|
280
|
+
if (after !== before) {
|
|
281
|
+
if (!req.dryRun)
|
|
282
|
+
writeAtomically(declFile, after);
|
|
283
|
+
paths.push(fromRepo(declaration.file));
|
|
284
|
+
}
|
|
285
|
+
const read = treeBytes(workingTree(located.rootOnDisk));
|
|
286
|
+
const readAfter = (p) => (copy && p === copy.path ? copy.bytes : read(p));
|
|
287
|
+
return {
|
|
288
|
+
...head,
|
|
289
|
+
member: member.name,
|
|
290
|
+
declaration: { path: fromRepo(declaration.file), sha256: sha256(after) },
|
|
291
|
+
paths,
|
|
292
|
+
changed: paths.length > 0,
|
|
293
|
+
dryRun: req.dryRun === true,
|
|
294
|
+
previous: listingView(member.box.listing, read),
|
|
295
|
+
listing: listingView(nextMember.box.listing, readAfter),
|
|
296
|
+
cover: copy ? { path: copy.path, sha256: sha256(copy.bytes), bytes: copy.bytes.length, type: copy.type.type, replaced: copy.replaced } : null,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant workspace box publish <member> <item> | --records` (#3165, ws-088):
|
|
3
|
+
* the one call a surface such as hud makes to publish a box's work.
|
|
4
|
+
*
|
|
5
|
+
* Publishing is the orchestrator's: studio's kit merges a built work item's
|
|
6
|
+
* branch into the box's checkout, pushes it to the box's `factory.publish`
|
|
7
|
+
* repo through its broker, opens the pull request, and sends the records a
|
|
8
|
+
* person kept uncommitted. The box block names the command that does it,
|
|
9
|
+
* `box.publisher`, so nothing is injected into a surface's environment.
|
|
10
|
+
*
|
|
11
|
+
* chant does none of that work. It reads the publisher from the declaration,
|
|
12
|
+
* applies the identity rule to `--by` (ws-080), runs the publisher from the
|
|
13
|
+
* workspace root with no shell and a JSON request on stdin, reads the last
|
|
14
|
+
* JSON object it prints, and checks the commit it names for the apply record
|
|
15
|
+
* of ws-075: `Chant-Applied-By` naming `--by`, `Chant-Applied-At`,
|
|
16
|
+
* `Chant-Applied-Commit` and a `Chant-Record` for the item, or a
|
|
17
|
+
* `Chant-Record` for each record sent. It prints one document,
|
|
18
|
+
* `box-publish.schema.json`, and never commits, pushes or calls a forge.
|
|
19
|
+
*
|
|
20
|
+
* The publisher's protocol, which `box-publish.schema.json` also states:
|
|
21
|
+
*
|
|
22
|
+
* - stdin: one JSON object, `$defs.request`.
|
|
23
|
+
* - exit 0 and a JSON object on the last line of stdout that holds one:
|
|
24
|
+
* `$defs.answer`, with `ok: true`.
|
|
25
|
+
* - exit 2: a refusal, nothing was published, stderr says why.
|
|
26
|
+
* - any other exit: a failure, stderr says why and what was done.
|
|
27
|
+
*/
|
|
28
|
+
import { spawnSync } from "node:child_process";
|
|
29
|
+
import { factoryView } from "./box-factory.js";
|
|
30
|
+
import { readDeclaration, readerVersion, WORKSPACE_ERROR_CODES, WorkspaceReadError } from "./declaration.js";
|
|
31
|
+
import { IDENTITY_CODES, IdentityError, refuseUnidentified } from "./identity.js";
|
|
32
|
+
import { commitDetails, tryGit } from "./intent.js";
|
|
33
|
+
import { readChantTrailers } from "./trailers.js";
|
|
34
|
+
import { locateWorkspace } from "./which-chant.js";
|
|
35
|
+
import { scopeSource } from "./write-scope.js";
|
|
36
|
+
/** The version of the document this command prints, and of the request it gives a publisher. */
|
|
37
|
+
export const BOX_PUBLISH_CONTRACT_VERSION = 1;
|
|
38
|
+
/** `$id` of the JSON Schema for what `box publish` prints, shipped beside this file. */
|
|
39
|
+
export const BOX_PUBLISH_SCHEMA_ID = "https://intentius.io/chant/schemas/workspace/box-publish/v1/box-publish.schema.json";
|
|
40
|
+
/** How long a publisher may run before chant stops it: a push and a pull request through a broker, with room to spare. */
|
|
41
|
+
export const PUBLISH_TIMEOUT_MS = 600000;
|
|
42
|
+
/** Why a publish printed no result. Closed. */
|
|
43
|
+
export const BOX_PUBLISH_ERROR_CODES = [
|
|
44
|
+
...WORKSPACE_ERROR_CODES,
|
|
45
|
+
"write-usage-invalid",
|
|
46
|
+
"publish-member-unknown",
|
|
47
|
+
"publish-none",
|
|
48
|
+
"publish-refused",
|
|
49
|
+
"publish-failed",
|
|
50
|
+
"publish-answer-invalid",
|
|
51
|
+
"publish-unrecorded",
|
|
52
|
+
...IDENTITY_CODES,
|
|
53
|
+
];
|
|
54
|
+
class PublishError extends Error {
|
|
55
|
+
constructor(code, message, answer) {
|
|
56
|
+
super(message);
|
|
57
|
+
this.code = code;
|
|
58
|
+
this.answer = answer;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const RECORD_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
62
|
+
const COMMIT_ID = /^[0-9a-f]{40,64}$/;
|
|
63
|
+
const REPO = /^[A-Za-z0-9][A-Za-z0-9-]{0,38}\/[A-Za-z0-9._-]{1,100}$/;
|
|
64
|
+
const MAX_MESSAGE = 2000;
|
|
65
|
+
const isObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
|
|
66
|
+
/**
|
|
67
|
+
* Split a command into words as a POSIX shell splits plain words: blanks
|
|
68
|
+
* separate words, single quotes keep everything, double quotes keep
|
|
69
|
+
* everything but `\\`, `\"`, `\$` and `` \` ``, and a backslash outside quotes
|
|
70
|
+
* escapes the next character. Nothing else a shell does (variables, `~`,
|
|
71
|
+
* globs, pipes, redirection) happens: those characters are part of a word.
|
|
72
|
+
*/
|
|
73
|
+
export function splitCommand(text) {
|
|
74
|
+
const words = [];
|
|
75
|
+
let word = "";
|
|
76
|
+
let inWord = false;
|
|
77
|
+
let quote = null;
|
|
78
|
+
for (let i = 0; i < text.length; i++) {
|
|
79
|
+
const c = text[i];
|
|
80
|
+
if (quote === "'") {
|
|
81
|
+
if (c === "'")
|
|
82
|
+
quote = null;
|
|
83
|
+
else
|
|
84
|
+
word += c;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (quote === '"') {
|
|
88
|
+
if (c === '"')
|
|
89
|
+
quote = null;
|
|
90
|
+
else if (c === "\\" && i + 1 < text.length && '\\"$`'.includes(text[i + 1]))
|
|
91
|
+
word += text[++i];
|
|
92
|
+
else
|
|
93
|
+
word += c;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (c === " " || c === "\t" || c === "\n") {
|
|
97
|
+
if (inWord)
|
|
98
|
+
words.push(word);
|
|
99
|
+
word = "";
|
|
100
|
+
inWord = false;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
inWord = true;
|
|
104
|
+
if (c === "'" || c === '"')
|
|
105
|
+
quote = c;
|
|
106
|
+
else if (c === "\\") {
|
|
107
|
+
if (i + 1 < text.length)
|
|
108
|
+
word += text[++i];
|
|
109
|
+
}
|
|
110
|
+
else
|
|
111
|
+
word += c;
|
|
112
|
+
}
|
|
113
|
+
if (quote !== null)
|
|
114
|
+
throw new Error(`it has an unclosed ${quote} quote`);
|
|
115
|
+
if (inWord)
|
|
116
|
+
words.push(word);
|
|
117
|
+
if (words.length === 0)
|
|
118
|
+
throw new Error("it is empty");
|
|
119
|
+
return words;
|
|
120
|
+
}
|
|
121
|
+
/** The last line of `stdout` that is a JSON object, or null. */
|
|
122
|
+
function lastJsonObject(stdout) {
|
|
123
|
+
const lines = stdout.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
124
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
125
|
+
try {
|
|
126
|
+
const value = JSON.parse(lines[i]);
|
|
127
|
+
if (isObject(value))
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Not this line.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const clip = (text) => {
|
|
137
|
+
const t = text.trim();
|
|
138
|
+
return t.length > MAX_MESSAGE ? `...${t.slice(-MAX_MESSAGE)}` : t;
|
|
139
|
+
};
|
|
140
|
+
const line = (v) => typeof v === "string" && v.trim() !== "" && !/[\u0000-\u001f\u007f]/.test(v);
|
|
141
|
+
/** The publisher's answer, checked field by field, or a reason it is not one. */
|
|
142
|
+
export function readAnswer(answer) {
|
|
143
|
+
if (answer.ok !== true)
|
|
144
|
+
return "it has no ok: true";
|
|
145
|
+
const out = { commit: null, records: [], pullRequest: null, pushed: null, local: null };
|
|
146
|
+
if (answer.commit !== undefined && answer.commit !== null) {
|
|
147
|
+
if (typeof answer.commit !== "string" || !COMMIT_ID.test(answer.commit))
|
|
148
|
+
return `its commit ${JSON.stringify(answer.commit)} is not a full commit id`;
|
|
149
|
+
out.commit = answer.commit;
|
|
150
|
+
}
|
|
151
|
+
if (answer.records !== undefined) {
|
|
152
|
+
if (!Array.isArray(answer.records))
|
|
153
|
+
return "its records is not a list";
|
|
154
|
+
for (const [i, r] of answer.records.entries()) {
|
|
155
|
+
if (!isObject(r) || !line(r.kind) || !line(r.id) || !line(r.path))
|
|
156
|
+
return `records[${i}] is not { kind, id, path, title }`;
|
|
157
|
+
if (r.title !== undefined && r.title !== null && typeof r.title !== "string")
|
|
158
|
+
return `records[${i}].title is not a string`;
|
|
159
|
+
out.records.push({ kind: r.kind, id: r.id, path: r.path, title: typeof r.title === "string" ? r.title : null });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (answer.pullRequest !== undefined && answer.pullRequest !== null) {
|
|
163
|
+
const pr = answer.pullRequest;
|
|
164
|
+
let https = false;
|
|
165
|
+
try {
|
|
166
|
+
https = isObject(pr) && typeof pr.url === "string" && new URL(pr.url).protocol === "https:";
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
https = false;
|
|
170
|
+
}
|
|
171
|
+
if (!isObject(pr) || !https || typeof pr.number !== "number" || !Number.isSafeInteger(pr.number) || pr.number <= 0 || !line(pr.branch) || !line(pr.base)) {
|
|
172
|
+
return "its pullRequest is not { url (https), number, branch, base, head }";
|
|
173
|
+
}
|
|
174
|
+
if (pr.head !== undefined && pr.head !== null && !(typeof pr.head === "string" && REPO.test(pr.head)))
|
|
175
|
+
return "its pullRequest.head is not owner/name";
|
|
176
|
+
out.pullRequest = { url: pr.url, number: pr.number, branch: pr.branch, base: pr.base, head: typeof pr.head === "string" ? pr.head : null };
|
|
177
|
+
}
|
|
178
|
+
if (answer.pushed !== undefined && answer.pushed !== null) {
|
|
179
|
+
const p = answer.pushed;
|
|
180
|
+
if (!isObject(p) || !line(p.branch) || !line(p.repo))
|
|
181
|
+
return "its pushed is not { branch, repo }";
|
|
182
|
+
out.pushed = { branch: p.branch, repo: p.repo };
|
|
183
|
+
}
|
|
184
|
+
if (answer.local !== undefined && answer.local !== null) {
|
|
185
|
+
if (typeof answer.local !== "string")
|
|
186
|
+
return "its local is not a string";
|
|
187
|
+
out.local = answer.local;
|
|
188
|
+
}
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
/** Run the publish and build the document it prints. Never throws for a refusal. */
|
|
192
|
+
export function boxPublish(req) {
|
|
193
|
+
const head = { $schema: BOX_PUBLISH_SCHEMA_ID, contract: BOX_PUBLISH_CONTRACT_VERSION, chant: readerVersion() };
|
|
194
|
+
const action = req.records ? "records" : "item";
|
|
195
|
+
try {
|
|
196
|
+
return publish(req, action, head);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
const fail = (code, message, answer) => ({
|
|
200
|
+
...head,
|
|
201
|
+
member: req.member || null,
|
|
202
|
+
action,
|
|
203
|
+
item: req.item ?? null,
|
|
204
|
+
error: { code, message },
|
|
205
|
+
...(answer ? { answer } : {}),
|
|
206
|
+
});
|
|
207
|
+
if (err instanceof PublishError)
|
|
208
|
+
return fail(err.code, err.message, err.answer);
|
|
209
|
+
if (err instanceof IdentityError)
|
|
210
|
+
return fail(err.code, err.message);
|
|
211
|
+
if (err instanceof WorkspaceReadError)
|
|
212
|
+
return fail(err.code, err.describe());
|
|
213
|
+
throw err;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function publish(req, action, head) {
|
|
217
|
+
if (!req.member)
|
|
218
|
+
throw new PublishError("write-usage-invalid", "box publish needs the member whose box publishes: box publish <member> <item>, or box publish <member> --records");
|
|
219
|
+
if (action === "item") {
|
|
220
|
+
if (req.item === undefined)
|
|
221
|
+
throw new PublishError("write-usage-invalid", "box publish needs the work item to publish, or --records for the records kept uncommitted");
|
|
222
|
+
if (!RECORD_ID.test(req.item))
|
|
223
|
+
throw new PublishError("write-usage-invalid", `${JSON.stringify(req.item)} is not a work item id`);
|
|
224
|
+
}
|
|
225
|
+
else if (req.item !== undefined) {
|
|
226
|
+
throw new PublishError("write-usage-invalid", `--records publishes the records kept uncommitted and takes no work item, and was given ${req.item}`);
|
|
227
|
+
}
|
|
228
|
+
if (req.head !== undefined && !REPO.test(req.head))
|
|
229
|
+
throw new PublishError("write-usage-invalid", `--head names the fork to push to as owner/name, not ${JSON.stringify(req.head)}`);
|
|
230
|
+
const by = req.by?.trim() || null;
|
|
231
|
+
if (by === null && !req.dryRun)
|
|
232
|
+
throw new PublishError("write-usage-invalid", "box publish needs --by: who publishes, which the apply record names");
|
|
233
|
+
const located = locateWorkspace(req.cwd);
|
|
234
|
+
if (!located.top)
|
|
235
|
+
throw new WorkspaceReadError("not-a-git-repository", "box publish reads the commit a publisher made, and this directory is not in a git repository");
|
|
236
|
+
const declaration = readDeclaration(located.tree);
|
|
237
|
+
const member = declaration.members.find((m) => m.name === req.member);
|
|
238
|
+
if (!member) {
|
|
239
|
+
throw new PublishError("publish-member-unknown", `no member is named ${req.member}; the declaration's members are ${declaration.members.map((m) => m.name).join(", ") || "none"}`);
|
|
240
|
+
}
|
|
241
|
+
const publisher = member.box?.publisher ?? null;
|
|
242
|
+
if (publisher === null) {
|
|
243
|
+
throw new PublishError("publish-none", member.box
|
|
244
|
+
? `member ${member.name}'s box block names no publisher, so nothing publishes its work; an orchestrator such as studio names one (box.publisher, ws-088)`
|
|
245
|
+
: `member ${member.name} declares no box block, so it has no publisher (box.publisher, ws-088)`);
|
|
246
|
+
}
|
|
247
|
+
let argv;
|
|
248
|
+
try {
|
|
249
|
+
argv = splitCommand(publisher);
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
throw new PublishError("publish-failed", `member ${member.name}'s publisher ${JSON.stringify(publisher)} can't be run: ${err.message}`);
|
|
253
|
+
}
|
|
254
|
+
if (by !== null)
|
|
255
|
+
refuseUnidentified(scopeSource(req.cwd), [by], "--by", { agent: req.agent });
|
|
256
|
+
const factory = declaration.members.find((m) => m.box?.factory)?.box?.factory ?? null;
|
|
257
|
+
const request = {
|
|
258
|
+
contract: BOX_PUBLISH_CONTRACT_VERSION,
|
|
259
|
+
action,
|
|
260
|
+
member: member.name,
|
|
261
|
+
item: req.item ?? null,
|
|
262
|
+
by,
|
|
263
|
+
head: req.head ?? null,
|
|
264
|
+
dryRun: req.dryRun === true,
|
|
265
|
+
workspace: { root: located.rootOnDisk },
|
|
266
|
+
factory: factoryView(factory),
|
|
267
|
+
};
|
|
268
|
+
const timeoutMs = req.timeoutMs ?? PUBLISH_TIMEOUT_MS;
|
|
269
|
+
const run = spawnSync(argv[0], argv.slice(1), {
|
|
270
|
+
cwd: located.rootOnDisk,
|
|
271
|
+
input: `${JSON.stringify(request)}\n`,
|
|
272
|
+
env: { ...(req.env ?? process.env), CHANT_PUBLISH_CONTRACT: String(BOX_PUBLISH_CONTRACT_VERSION) },
|
|
273
|
+
encoding: "utf-8",
|
|
274
|
+
timeout: timeoutMs,
|
|
275
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
276
|
+
});
|
|
277
|
+
const stdout = run.stdout ?? "";
|
|
278
|
+
const stderr = run.stderr ?? "";
|
|
279
|
+
const printed = lastJsonObject(stdout);
|
|
280
|
+
if (run.error) {
|
|
281
|
+
const e = run.error;
|
|
282
|
+
if (e.code === "ETIMEDOUT")
|
|
283
|
+
throw new PublishError("publish-failed", `the publisher gave no answer within ${timeoutMs}ms and was stopped; what it had done by then stays done`, printed ?? undefined);
|
|
284
|
+
throw new PublishError("publish-failed", e.code === "ENOENT" ? `the publisher ${argv[0]} was not found` : `the publisher could not be run: ${e.message}`);
|
|
285
|
+
}
|
|
286
|
+
if (run.status !== 0) {
|
|
287
|
+
const said = clip(stderr) || `it exited ${run.status ?? `on ${run.signal}`} and said nothing on stderr`;
|
|
288
|
+
if (run.status === 2)
|
|
289
|
+
throw new PublishError("publish-refused", said, printed ?? undefined);
|
|
290
|
+
throw new PublishError("publish-failed", said, printed ?? undefined);
|
|
291
|
+
}
|
|
292
|
+
if (printed === null)
|
|
293
|
+
throw new PublishError("publish-answer-invalid", "the publisher exited 0 and printed no JSON object on stdout");
|
|
294
|
+
const answer = readAnswer(printed);
|
|
295
|
+
if (typeof answer === "string")
|
|
296
|
+
throw new PublishError("publish-answer-invalid", `the publisher's answer is not one box-publish.schema.json allows: ${answer}`, printed);
|
|
297
|
+
let applied = null;
|
|
298
|
+
if (!req.dryRun) {
|
|
299
|
+
if (answer.commit === null)
|
|
300
|
+
throw new PublishError("publish-unrecorded", `the publisher answered with no commit, so the ${action === "item" ? "apply" : "records"} commit can't be checked for its trailers`, printed);
|
|
301
|
+
if (action === "records" && answer.records.length === 0)
|
|
302
|
+
throw new PublishError("publish-answer-invalid", "the publisher sent records and named none", printed);
|
|
303
|
+
applied = checkRecord(located.top, answer, action, req.item ?? null, by, printed);
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
...head,
|
|
307
|
+
member: member.name,
|
|
308
|
+
action,
|
|
309
|
+
item: req.item ?? null,
|
|
310
|
+
by,
|
|
311
|
+
dryRun: req.dryRun === true,
|
|
312
|
+
publisher,
|
|
313
|
+
...answer,
|
|
314
|
+
applied,
|
|
315
|
+
answer: printed,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* The apply record on the commit the publisher named (ws-075): for an item,
|
|
320
|
+
* Chant-Applied-By naming `by`, Chant-Applied-At, Chant-Applied-Commit and a
|
|
321
|
+
* Chant-Record for the item; for records, a Chant-Record for each one sent.
|
|
322
|
+
*/
|
|
323
|
+
function checkRecord(top, answer, action, item, by, printed) {
|
|
324
|
+
const sha = answer.commit;
|
|
325
|
+
if (tryGit(top, ["cat-file", "-e", `${sha}^{commit}`]) === undefined) {
|
|
326
|
+
throw new PublishError("publish-unrecorded", `the publisher named commit ${sha}, which this repository does not have`, printed);
|
|
327
|
+
}
|
|
328
|
+
const commit = commitDetails(top, [sha]).get(sha);
|
|
329
|
+
const trailers = readChantTrailers(commit?.trailers ?? {});
|
|
330
|
+
const missing = [];
|
|
331
|
+
if (action === "records") {
|
|
332
|
+
for (const r of answer.records)
|
|
333
|
+
if (!trailers.records.some((t) => t.kind === r.kind && t.id === r.id))
|
|
334
|
+
missing.push(`Chant-Record: ${r.kind}:${r.id}`);
|
|
335
|
+
if (missing.length)
|
|
336
|
+
throw new PublishError("publish-unrecorded", `commit ${sha.slice(0, 12)} sends records without naming them: it lacks ${missing.join(", ")} (ws-075)`, printed);
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
if (!trailers.records.some((t) => t.id === item))
|
|
340
|
+
missing.push(`Chant-Record: <kind>:${item}`);
|
|
341
|
+
if (trailers.applied === null)
|
|
342
|
+
missing.push(`Chant-Applied-By: ${by}`);
|
|
343
|
+
else if (trailers.applied.by !== by)
|
|
344
|
+
missing.push(`Chant-Applied-By: ${by} (it names ${trailers.applied.by})`);
|
|
345
|
+
if (trailers.applied?.at === null || trailers.applied?.at === undefined || Number.isNaN(Date.parse(trailers.applied.at)))
|
|
346
|
+
missing.push("Chant-Applied-At: <ISO 8601>");
|
|
347
|
+
if (trailers.applied?.commit === null || trailers.applied?.commit === undefined)
|
|
348
|
+
missing.push("Chant-Applied-Commit: <the applied branch's tip>");
|
|
349
|
+
if (missing.length)
|
|
350
|
+
throw new PublishError("publish-unrecorded", `commit ${sha.slice(0, 12)} applies ${item} without its apply record: it lacks ${missing.join(", ")} (ws-075)`, printed);
|
|
351
|
+
return { by: trailers.applied.by, at: trailers.applied.at, commit: trailers.applied.commit };
|
|
352
|
+
}
|